From a59fac96dde7fdbdd3b7455357b9bf6c95dc7108 Mon Sep 17 00:00:00 2001 From: Marco Pasqualetti Date: Fri, 7 Jan 2022 05:39:56 +0100 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20Quoted=20=E2=80=93=20clone=20throw?= =?UTF-8?q?=20an=20error=20(#141)=20(#142)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add missing `quoted.test.js` file (fixtures were already present) --- lib/nodes/Quoted.js | 9 +- test/quoted.test.js | 57 ++ test/snapshots/quoted.test.js.md | 1445 ++++++++++++++++++++++++++++ test/snapshots/quoted.test.js.snap | Bin 0 -> 2692 bytes 4 files changed, 1509 insertions(+), 2 deletions(-) create mode 100644 test/quoted.test.js create mode 100644 test/snapshots/quoted.test.js.md create mode 100644 test/snapshots/quoted.test.js.snap diff --git a/lib/nodes/Quoted.js b/lib/nodes/Quoted.js index dbee524..f2a42c2 100644 --- a/lib/nodes/Quoted.js +++ b/lib/nodes/Quoted.js @@ -18,8 +18,13 @@ class Quoted extends Node { constructor(options) { super(options); this.type = 'quoted'; - this.contents = unquote(options.value); - [this.quote] = options.value; + /** + * When cloning the node via {@link Node.clone()} there are no constructor params + */ + if (options && options.value) { + this.contents = unquote(options.value); + [this.quote] = options.value; + } } static fromTokens(tokens, parser) { diff --git a/test/quoted.test.js b/test/quoted.test.js new file mode 100644 index 0000000..1dc810a --- /dev/null +++ b/test/quoted.test.js @@ -0,0 +1,57 @@ +/* + Copyright © 2018 Andrew Powell + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of this Source Code Form. +*/ +const test = require('ava'); + +const { nodeToString, parse } = require('../lib'); + +const { snapshot, throws } = require('./fixtures/quoted'); + +for (const fixture of snapshot) { + test(fixture, (t) => { + const root = parse(fixture); + const nodes = root.nodes.map((node) => { + delete node.parent; // eslint-disable-line no-param-reassign + return node; + }); + const string = nodeToString(root); + + t.is(string, fixture); + t.is(fixture, root.toString()); + t.snapshot(root.first.toString()); + t.snapshot(string); + t.snapshot(nodes); + + root.clone(); + }); + + test(`${fixture} be should cloned`, (t) => { + const root = parse(fixture); + const nodes = root.nodes.map((node) => { + delete node.parent; // eslint-disable-line no-param-reassign + return node; + }); + const string = nodeToString(root); + + const cloned = root.clone(); + + t.is(string, fixture); + t.is(fixture, root.toString()); + t.snapshot(cloned.first.toString()); + t.snapshot(string); + t.snapshot(nodes); + }); +} + +for (const fixture of throws) { + test(fixture, (t) => { + t.throws(() => parse(fixture)); + }); +} diff --git a/test/snapshots/quoted.test.js.md b/test/snapshots/quoted.test.js.md new file mode 100644 index 0000000..4b3f561 --- /dev/null +++ b/test/snapshots/quoted.test.js.md @@ -0,0 +1,1445 @@ +# Snapshot report for `test/quoted.test.js` + +The actual snapshot is saved in `quoted.test.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## "string" + +> Snapshot 1 + + '"string"' + +> Snapshot 2 + + ' "string" ' + +> Snapshot 3 + + [ + Quoted { + contents: 'string', + quote: '"', + raws: { + after: '', + before: ' ', + }, + source: { + end: { + column: 2, + line: 1, + offset: 1, + }, + input: Input { + css: ' "string" ', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 2, + line: 1, + offset: 1, + }, + }, + type: 'quoted', + value: '"string"', + [Symbol(isClean)]: false, + }, + ] + +## "" + +> Snapshot 1 + + '""' + +> Snapshot 2 + + '""' + +> Snapshot 3 + + [ + Quoted { + contents: '', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '""', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '""', + [Symbol(isClean)]: false, + }, + ] + +## "string" + +> Snapshot 1 + + '"string"' + +> Snapshot 2 + + '"string"' + +> Snapshot 3 + + [ + Quoted { + contents: 'string', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '"string"', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '"string"', + [Symbol(isClean)]: false, + }, + ] + +## "word'word" + +> Snapshot 1 + + '"word\'word"' + +> Snapshot 2 + + '"word\'word"' + +> Snapshot 3 + + [ + Quoted { + contents: 'word\'word', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '"word\'word"', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '"word\'word"', + [Symbol(isClean)]: false, + }, + ] + +## "word\"word" + +> Snapshot 1 + + '"word\\"word"' + +> Snapshot 2 + + '"word\\"word"' + +> Snapshot 3 + + [ + Quoted { + contents: 'word"word', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '"word\\"word"', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '"word\\"word"', + [Symbol(isClean)]: false, + }, + ] + +## '' + +> Snapshot 1 + + '\'\'' + +> Snapshot 2 + + '\'\'' + +> Snapshot 3 + + [ + Quoted { + contents: '', + quote: '\'', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '\'\'', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '\'\'', + [Symbol(isClean)]: false, + }, + ] + +## 'word"word' + +> Snapshot 1 + + '\'word"word\'' + +> Snapshot 2 + + '\'word"word\'' + +> Snapshot 3 + + [ + Quoted { + contents: 'word"word', + quote: '\'', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '\'word"word\'', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '\'word"word\'', + [Symbol(isClean)]: false, + }, + ] + +## 'word\'word' + +> Snapshot 1 + + '\'word\\\'word\'' + +> Snapshot 2 + + '\'word\\\'word\'' + +> Snapshot 3 + + [ + Quoted { + contents: 'word\'word', + quote: '\'', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '\'word\\\'word\'', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '\'word\\\'word\'', + [Symbol(isClean)]: false, + }, + ] + +## word1"string"word2 + +> Snapshot 1 + + 'word1' + +> Snapshot 2 + + 'word1"string"word2' + +> Snapshot 3 + + [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: false, + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: 'word1"string"word2', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: 'word1', + [Symbol(isClean)]: false, + }, + Quoted { + contents: 'string', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 6, + line: 1, + offset: 5, + }, + input: Input { + css: 'word1"string"word2', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 6, + line: 1, + offset: 5, + }, + }, + type: 'quoted', + value: '"string"', + [Symbol(isClean)]: false, + }, + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: false, + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 14, + line: 1, + offset: 13, + }, + input: Input { + css: 'word1"string"word2', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 14, + line: 1, + offset: 13, + }, + }, + type: 'word', + value: 'word2', + [Symbol(isClean)]: false, + }, + ] + +## should clone "string" + +> Snapshot 1 + + '"string"' + +> Snapshot 2 + + ' "string" ' + +> Snapshot 3 + + [ + Quoted { + contents: 'string', + quote: '"', + raws: { + after: '', + before: ' ', + }, + source: { + end: { + column: 2, + line: 1, + offset: 1, + }, + input: Input { + css: ' "string" ', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 2, + line: 1, + offset: 1, + }, + }, + type: 'quoted', + value: '"string"', + [Symbol(isClean)]: false, + }, + ] + +## should clone "" + +> Snapshot 1 + + '""' + +> Snapshot 2 + + '""' + +> Snapshot 3 + + [ + Quoted { + contents: '', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '""', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '""', + [Symbol(isClean)]: false, + }, + ] + +## should clone "string" + +> Snapshot 1 + + '"string"' + +> Snapshot 2 + + '"string"' + +> Snapshot 3 + + [ + Quoted { + contents: 'string', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '"string"', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '"string"', + [Symbol(isClean)]: false, + }, + ] + +## should clone "word'word" + +> Snapshot 1 + + '"word\'word"' + +> Snapshot 2 + + '"word\'word"' + +> Snapshot 3 + + [ + Quoted { + contents: 'word\'word', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '"word\'word"', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '"word\'word"', + [Symbol(isClean)]: false, + }, + ] + +## should clone "word\"word" + +> Snapshot 1 + + '"word\\"word"' + +> Snapshot 2 + + '"word\\"word"' + +> Snapshot 3 + + [ + Quoted { + contents: 'word"word', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '"word\\"word"', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '"word\\"word"', + [Symbol(isClean)]: false, + }, + ] + +## should clone '' + +> Snapshot 1 + + '\'\'' + +> Snapshot 2 + + '\'\'' + +> Snapshot 3 + + [ + Quoted { + contents: '', + quote: '\'', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '\'\'', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '\'\'', + [Symbol(isClean)]: false, + }, + ] + +## should clone 'word"word' + +> Snapshot 1 + + '\'word"word\'' + +> Snapshot 2 + + '\'word"word\'' + +> Snapshot 3 + + [ + Quoted { + contents: 'word"word', + quote: '\'', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '\'word"word\'', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '\'word"word\'', + [Symbol(isClean)]: false, + }, + ] + +## should clone 'word\'word' + +> Snapshot 1 + + '\'word\\\'word\'' + +> Snapshot 2 + + '\'word\\\'word\'' + +> Snapshot 3 + + [ + Quoted { + contents: 'word\'word', + quote: '\'', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '\'word\\\'word\'', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '\'word\\\'word\'', + [Symbol(isClean)]: false, + }, + ] + +## should clone word1"string"word2 + +> Snapshot 1 + + 'word1' + +> Snapshot 2 + + 'word1"string"word2' + +> Snapshot 3 + + [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: false, + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: 'word1"string"word2', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: 'word1', + [Symbol(isClean)]: false, + }, + Quoted { + contents: 'string', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 6, + line: 1, + offset: 5, + }, + input: Input { + css: 'word1"string"word2', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 6, + line: 1, + offset: 5, + }, + }, + type: 'quoted', + value: '"string"', + [Symbol(isClean)]: false, + }, + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: false, + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 14, + line: 1, + offset: 13, + }, + input: Input { + css: 'word1"string"word2', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 14, + line: 1, + offset: 13, + }, + }, + type: 'word', + value: 'word2', + [Symbol(isClean)]: false, + }, + ] + +## "string" be should cloned + +> Snapshot 1 + + '"string"' + +> Snapshot 2 + + ' "string" ' + +> Snapshot 3 + + [ + Quoted { + contents: 'string', + quote: '"', + raws: { + after: '', + before: ' ', + }, + source: { + end: { + column: 2, + line: 1, + offset: 1, + }, + input: Input { + css: ' "string" ', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 2, + line: 1, + offset: 1, + }, + }, + type: 'quoted', + value: '"string"', + [Symbol(isClean)]: false, + }, + ] + +## "" be should cloned + +> Snapshot 1 + + '""' + +> Snapshot 2 + + '""' + +> Snapshot 3 + + [ + Quoted { + contents: '', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '""', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '""', + [Symbol(isClean)]: false, + }, + ] + +## "string" be should cloned + +> Snapshot 1 + + '"string"' + +> Snapshot 2 + + '"string"' + +> Snapshot 3 + + [ + Quoted { + contents: 'string', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '"string"', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '"string"', + [Symbol(isClean)]: false, + }, + ] + +## "word'word" be should cloned + +> Snapshot 1 + + '"word\'word"' + +> Snapshot 2 + + '"word\'word"' + +> Snapshot 3 + + [ + Quoted { + contents: 'word\'word', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '"word\'word"', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '"word\'word"', + [Symbol(isClean)]: false, + }, + ] + +## "word\"word" be should cloned + +> Snapshot 1 + + '"word\\"word"' + +> Snapshot 2 + + '"word\\"word"' + +> Snapshot 3 + + [ + Quoted { + contents: 'word"word', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '"word\\"word"', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '"word\\"word"', + [Symbol(isClean)]: false, + }, + ] + +## '' be should cloned + +> Snapshot 1 + + '\'\'' + +> Snapshot 2 + + '\'\'' + +> Snapshot 3 + + [ + Quoted { + contents: '', + quote: '\'', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '\'\'', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '\'\'', + [Symbol(isClean)]: false, + }, + ] + +## 'word"word' be should cloned + +> Snapshot 1 + + '\'word"word\'' + +> Snapshot 2 + + '\'word"word\'' + +> Snapshot 3 + + [ + Quoted { + contents: 'word"word', + quote: '\'', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '\'word"word\'', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '\'word"word\'', + [Symbol(isClean)]: false, + }, + ] + +## 'word\'word' be should cloned + +> Snapshot 1 + + '\'word\\\'word\'' + +> Snapshot 2 + + '\'word\\\'word\'' + +> Snapshot 3 + + [ + Quoted { + contents: 'word\'word', + quote: '\'', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '\'word\\\'word\'', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'quoted', + value: '\'word\\\'word\'', + [Symbol(isClean)]: false, + }, + ] + +## word1"string"word2 be should cloned + +> Snapshot 1 + + 'word1' + +> Snapshot 2 + + 'word1"string"word2' + +> Snapshot 3 + + [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: false, + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: 'word1"string"word2', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: 'word1', + [Symbol(isClean)]: false, + }, + Quoted { + contents: 'string', + quote: '"', + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 6, + line: 1, + offset: 5, + }, + input: Input { + css: 'word1"string"word2', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 6, + line: 1, + offset: 5, + }, + }, + type: 'quoted', + value: '"string"', + [Symbol(isClean)]: false, + }, + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: false, + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 14, + line: 1, + offset: 13, + }, + input: Input { + css: 'word1"string"word2', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 14, + line: 1, + offset: 13, + }, + }, + type: 'word', + value: 'word2', + [Symbol(isClean)]: false, + }, + ] diff --git a/test/snapshots/quoted.test.js.snap b/test/snapshots/quoted.test.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..0fa332483ff2f1ee362e247437eb15f808210c5f GIT binary patch literal 2692 zcmYL}c{~&TAIBZJ7jld+XF2AoIbzODi8RKnnj9UJE0oc9j@(C%Uqd1`hTKOD@pY9P zVa_t--iA4Ilu)6sdVC+>-}|rE=%DV+HIO30zC-=bcrjkqarLrHw9f=pYq;P+M~^?f$YUtsZYy@$SU=m}5l&YH@f{vh))Id-sGS8b!b z+D`uPte>5pmfY@F$ptZEC_3OPWn!DKFEC(}r`8x>li+W8vAZKpv-wM$dd;1TyB?$0 zIbD+q)g}}tdJhO+^x#1wpI>eN?0bEJl`9?^zW<=3Q%VK>S%rycfO)2`S%|NFTckS&s%Iq7kdeJ z?LX-6z#im%TuBpFPV}KS_b#)8UfudN(|`4?G14D5#&C|gxBHEx28~B`;8tO9CL!q2 zkAO-Q->aeHBNWy$Ax232}G2jKUhMivkAR&zY0jKv={H z_k!=f`DL;3soHofFvp1exZ2%l5vrsag@-pXFHH{D1=|<3we9wattuy4FQ_p}s<|<5 z^XJGH#kvFz6hj|>V`zB=p@5$|aG75hz2W@Xb?==nH!T(@DNg_8y~;l=M9J47pa{(o z(V0z%(9-i`Tczp4KLnihcZzbVOVVoaU#F4q=njPb*lOIp?ERl7+?LlXU)loio$Kpm zCx{ksTjrPq?>4~F(RYJNyFiuklQx*z)S4&50fyTjLwkON6*);}to3C6v^)^|Riu{n z?qomiE=11P7ju1=mT2J3HPG)8y1w-Gy)DqFTfe`j`b2dNvn7F2AezC+FYfxvn<9b0 zV2|CEzuN>_f6+8rx)b?S}+U>-xfIq)_Mfg(3Vgn431| zL4~mWG(D5ERAbTg4&apUI3bt7y@fCER6@F=B1tuRAnEM(IVP*T%9x@0 zD0S2Fj8I;(tRctju%KO2pPLVmxFI&uNG#MyMA$u_(7IjrQbWCb9DMM`gUPUS;m2l% zH2`O7Ed?351l!aNwKucthZu7InuVJiIO>xTR#p2J*CzR;YV(-pP;1o?&x$Jk0muRw z;aGlZdBxnQIJJ)INFz5yVzYH;uh6jLZ!}|gl~)T{%Qk`^Pe@$>V)r<70=uYo0(==i zxFIvbVBwcK))^S5Zt;8+gQV5rnhR%~QC4;(ouBz3h8?^Ked}u} z?V$?tB&1utZgX<4YYTxby>Odyi%86868kS=xQr>hjsvMF6&Mv@O=0)5iMBC78=kK# zZ^iUxeCmnVYh>xRL4dtPn#$7RBno%AvcgbN7%Tv`K`!t}NtYNJ7e3ZW*LND-S{tE8 zry@t(6RaCRqQJ{`Y_a^(0FJJRMfsWGD(=Kk}I{G}v9 zPlaJ_B9$xa^AOL?MSCd2z4Qzvmkk|M_DpP1{15x$3WSJ{uWc@rJ=6h_9oyqEtcJT+ zmO556CkXt;V=lM+q5^ReFTaw;k;&IwRf33znGoN*4~kTiKed@7?MgtpBp2_6s?`o>J2`4Qx>;($A7)a`kzRuU2@>1k`N?9Dszs;Gt|TBSW29kQ&Sz$hxTSZ(xd3GtYyVY7&Q0Oy(#Rvu)l$9bs+E1-bS2yBnwS*ZR&Woxc;To(Mkwgt=@25$sj67s;xa-r8R`e0F<%W>9SnJ&KNZj^V9Dj&17$j&{%*M zW`j66mct^Sf^V4knP*8$X7Y!0Hm333`D z*UTmt6ZxZtYPmt2e-G{gg`)YRNR%l4D8Y0t5NC;DJyIGgPHJzp$r!pR$RE?@)Ul|#%Qh<28T>*o6dPX9)fpi-((zoXxQ t8Up^$^E)%D$VKhnJ^thQ1G~QI#`e2odf4DMX#hABcxE%Yk(JKE@(&bX2n7HD literal 0 HcmV?d00001 From b143c3acb44df30629aa6f0e1b83a9f18db63cc6 Mon Sep 17 00:00:00 2001 From: Chen Yangjian <252317+cyjake@users.noreply.github.com> Date: Fri, 7 Jan 2022 12:40:38 +0800 Subject: [PATCH 2/4] fix: support parsing */ expressions without surrounding spaces (#144) fixes #138 --- lib/ValuesParser.js | 2 + lib/nodes/Operator.js | 8 + test/fixtures/func.js | 2 + test/snapshots/func.test.js.md | 1369 ++++++++++++++++++++++++++++++ test/snapshots/func.test.js.snap | Bin 18083 -> 23760 bytes 5 files changed, 1381 insertions(+) diff --git a/lib/ValuesParser.js b/lib/ValuesParser.js index 82d9e5a..1542b00 100644 --- a/lib/ValuesParser.js +++ b/lib/ValuesParser.js @@ -148,6 +148,8 @@ module.exports = class ValuesParser extends Parser { if (Punctuation.chars.includes(type)) { Punctuation.fromTokens(tokens, this); + } else if (type === 'word' && Operator.test(tokens, this)) { + Operator.fromTokens(tokens, this); } else if (Func.test(tokens)) { Func.fromTokens(tokens, this); } else if (this.options.interpolation && Interpolation.test(tokens, this)) { diff --git a/lib/nodes/Operator.js b/lib/nodes/Operator.js index 2fac9af..5034ca6 100644 --- a/lib/nodes/Operator.js +++ b/lib/nodes/Operator.js @@ -14,6 +14,7 @@ const Node = require('./Node'); const operators = ['+', '-', '/', '*', '%', '=', '<=', '>=', '<', '>']; const operRegex = new RegExp(`([/|*}])`); +const compactRegex = /^[*/]\b/; class Operator extends Node { constructor(options) { @@ -33,6 +34,13 @@ class Operator extends Node { return operRegex; } + static test(tokens, parser) { + const [first] = tokens; + const [, value] = first; + const { lastNode } = parser; + return lastNode && lastNode.type === 'func' && compactRegex.test(value); + } + static tokenize(tokens, parser) { const [first, ...rest] = tokens; const [, value, startLine, , endLine, endChar] = first; diff --git a/test/fixtures/func.js b/test/fixtures/func.js index c58e3bf..562b243 100644 --- a/test/fixtures/func.js +++ b/test/fixtures/func.js @@ -29,8 +29,10 @@ module.exports = { 'lCH(40% 68.8 34.5 / 50%)', 'hwb(90deg 0% 0% / 0.5)', 'calc(-0.5 * var(foo))', + 'calc(var(--foo)*var(--bar))', 'calc(1px + -2vw - 4px)', 'calc(((768px - 100vw) / 2) - 15px)', + 'calc(((768px - 100vw)/2) - 15px)', 'bar(baz(black, 10%), 10%)', '-webkit-linear-gradient(0)', 'var(--foo)', diff --git a/test/snapshots/func.test.js.md b/test/snapshots/func.test.js.md index 4591cb5..ec7a017 100644 --- a/test/snapshots/func.test.js.md +++ b/test/snapshots/func.test.js.md @@ -5114,3 +5114,1372 @@ Generated by [AVA](https://avajs.dev). [Symbol(isClean)]: false, }, ] + +## calc(-0.5*var(foo)) + +> Snapshot 1 + + 'calc(-0.5*var(foo))' + +> Snapshot 2 + + 'calc(-0.5*var(foo))' + +> Snapshot 3 + + [ + Func { + isColor: false, + isVar: false, + name: 'calc', + nodes: [ + Numeric { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '-0.5*var(foo)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'numeric', + unit: '', + value: '-0.5', + [Symbol(isClean)]: false, + }, + Operator { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '-0.5*var(foo)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'operator', + value: '*', + [Symbol(isClean)]: false, + }, + Func { + isColor: false, + isVar: false, + name: 'var', + nodes: [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: false, + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: 'foo', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: 'foo', + [Symbol(isClean)]: false, + }, + ], + params: '(foo)', + parent: [Circular], + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 9, + line: 1, + offset: 8, + }, + input: Input { + css: '-0.5*var(foo)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ], + params: '(-0.5*var(foo))', + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 19, + line: 1, + offset: 18, + }, + input: Input { + css: 'calc(-0.5*var(foo))', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ] + +## calc(var(--foo)) + +> Snapshot 1 + + 'calc(var(--foo))' + +> Snapshot 2 + + 'calc(var(--foo))' + +> Snapshot 3 + + [ + Func { + isColor: false, + isVar: false, + name: 'calc', + nodes: [ + Func { + isColor: false, + isVar: true, + name: 'var', + nodes: [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: true, + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '--foo', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: '--foo', + [Symbol(isClean)]: false, + }, + ], + params: '(--foo)', + parent: [Circular], + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 4, + line: 1, + offset: 3, + }, + input: Input { + css: 'var(--foo)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ], + params: '(var(--foo))', + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 16, + line: 1, + offset: 15, + }, + input: Input { + css: 'calc(var(--foo))', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ] + +## calc(var(--foo) * var(--bar)) + +> Snapshot 1 + + 'calc(var(--foo) * var(--bar))' + +> Snapshot 2 + + 'calc(var(--foo) * var(--bar))' + +> Snapshot 3 + + [ + Func { + isColor: false, + isVar: false, + name: 'calc', + nodes: [ + Func { + isColor: false, + isVar: true, + name: 'var', + nodes: [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: true, + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '--foo', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: '--foo', + [Symbol(isClean)]: false, + }, + ], + params: '(--foo)', + parent: [Circular], + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 4, + line: 1, + offset: 3, + }, + input: Input { + css: 'var(--foo) * var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + Operator { + parent: [Circular], + raws: { + after: '', + before: ' ', + }, + source: { + end: { + column: 12, + line: 1, + offset: 11, + }, + input: Input { + css: 'var(--foo) * var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 12, + line: 1, + offset: 11, + }, + }, + type: 'operator', + value: '*', + [Symbol(isClean)]: false, + }, + Func { + isColor: false, + isVar: true, + name: 'var', + nodes: [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: true, + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '--bar', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: '--bar', + [Symbol(isClean)]: false, + }, + ], + params: '(--bar)', + parent: [Circular], + raws: { + after: '', + before: ' ', + semicolon: false, + }, + source: { + end: { + column: 17, + line: 1, + offset: 16, + }, + input: Input { + css: 'var(--foo) * var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 14, + line: 1, + offset: 13, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ], + params: '(var(--foo) * var(--bar))', + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 29, + line: 1, + offset: 28, + }, + input: Input { + css: 'calc(var(--foo) * var(--bar))', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ] + +## calc(var(--foo)* var(--bar)) + +> Snapshot 1 + + 'calc(var(--foo)* var(--bar))' + +> Snapshot 2 + + 'calc(var(--foo)* var(--bar))' + +> Snapshot 3 + + [ + Func { + isColor: false, + isVar: false, + name: 'calc', + nodes: [ + Func { + isColor: false, + isVar: true, + name: 'var', + nodes: [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: true, + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '--foo', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: '--foo', + [Symbol(isClean)]: false, + }, + ], + params: '(--foo)', + parent: [Circular], + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 4, + line: 1, + offset: 3, + }, + input: Input { + css: 'var(--foo)* var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + Operator { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 11, + line: 1, + offset: 10, + }, + input: Input { + css: 'var(--foo)* var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 11, + line: 1, + offset: 10, + }, + }, + type: 'operator', + value: '*', + [Symbol(isClean)]: false, + }, + Func { + isColor: false, + isVar: true, + name: 'var', + nodes: [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: true, + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '--bar', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: '--bar', + [Symbol(isClean)]: false, + }, + ], + params: '(--bar)', + parent: [Circular], + raws: { + after: '', + before: ' ', + semicolon: false, + }, + source: { + end: { + column: 16, + line: 1, + offset: 15, + }, + input: Input { + css: 'var(--foo)* var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 13, + line: 1, + offset: 12, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ], + params: '(var(--foo)* var(--bar))', + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 28, + line: 1, + offset: 27, + }, + input: Input { + css: 'calc(var(--foo)* var(--bar))', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ] + +## calc(var(--foo)*var(--bar)) + +> Snapshot 1 + + 'calc(var(--foo)*var(--bar))' + +> Snapshot 2 + + 'calc(var(--foo)*var(--bar))' + +> Snapshot 3 + + [ + Func { + isColor: false, + isVar: false, + name: 'calc', + nodes: [ + Func { + isColor: false, + isVar: true, + name: 'var', + nodes: [ + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: true, + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '--foo', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: '--foo', + [Symbol(isClean)]: false, + }, + ], + params: '(--foo)', + parent: [Circular], + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 4, + line: 1, + offset: 3, + }, + input: Input { + css: 'var(--foo)*var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + Operator { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 11, + line: 1, + offset: 10, + }, + input: Input { + css: 'var(--foo)*var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 11, + line: 1, + offset: 10, + }, + }, + type: 'operator', + value: '*var', + [Symbol(isClean)]: false, + }, + Punctuation { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 15, + line: 1, + offset: 14, + }, + input: Input { + css: 'var(--foo)*var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 15, + line: 1, + offset: 14, + }, + }, + type: 'punctuation', + value: '(', + [Symbol(isClean)]: false, + }, + Word { + isColor: false, + isHex: false, + isUrl: false, + isVariable: true, + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: 'var(--foo)*var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'word', + value: '--bar', + [Symbol(isClean)]: false, + }, + Punctuation { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 15, + line: 1, + offset: 14, + }, + input: Input { + css: 'var(--foo)*var(--bar)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 15, + line: 1, + offset: 14, + }, + }, + type: 'punctuation', + value: ')', + [Symbol(isClean)]: false, + }, + ], + params: '(var(--foo)*var(--bar))', + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 27, + line: 1, + offset: 26, + }, + input: Input { + css: 'calc(var(--foo)*var(--bar))', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ] + +## calc(((768px - 100vw)/2) - 15px) + +> Snapshot 1 + + 'calc(((768px - 100vw)/2) - 15px)' + +> Snapshot 2 + + 'calc(((768px - 100vw)/2) - 15px)' + +> Snapshot 3 + + [ + Func { + isColor: false, + isVar: false, + name: 'calc', + nodes: [ + Punctuation { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'punctuation', + value: '(', + [Symbol(isClean)]: false, + }, + Punctuation { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 2, + line: 1, + offset: 1, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 2, + line: 1, + offset: 1, + }, + }, + type: 'punctuation', + value: '(', + [Symbol(isClean)]: false, + }, + Numeric { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 1, + line: 1, + offset: 0, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'numeric', + unit: 'px', + value: '768', + [Symbol(isClean)]: false, + }, + Operator { + parent: [Circular], + raws: { + after: '', + before: ' ', + }, + source: { + end: { + column: 7, + line: 1, + offset: 6, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 7, + line: 1, + offset: 6, + }, + }, + type: 'operator', + value: '-', + [Symbol(isClean)]: false, + }, + Numeric { + parent: [Circular], + raws: { + after: '', + before: ' ', + }, + source: { + end: { + column: 9, + line: 1, + offset: 8, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 9, + line: 1, + offset: 8, + }, + }, + type: 'numeric', + unit: 'vw', + value: '100', + [Symbol(isClean)]: false, + }, + Punctuation { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 2, + line: 1, + offset: 1, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 2, + line: 1, + offset: 1, + }, + }, + type: 'punctuation', + value: ')', + [Symbol(isClean)]: false, + }, + Operator { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 17, + line: 1, + offset: 16, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 17, + line: 1, + offset: 16, + }, + }, + type: 'operator', + value: '/', + [Symbol(isClean)]: false, + }, + Numeric { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 17, + line: 1, + offset: 16, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 17, + line: 1, + offset: 16, + }, + }, + type: 'numeric', + unit: '', + value: '2', + [Symbol(isClean)]: false, + }, + Punctuation { + parent: [Circular], + raws: { + after: '', + before: '', + }, + source: { + end: { + column: 19, + line: 1, + offset: 18, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 19, + line: 1, + offset: 18, + }, + }, + type: 'punctuation', + value: ')', + [Symbol(isClean)]: false, + }, + Operator { + parent: [Circular], + raws: { + after: '', + before: ' ', + }, + source: { + end: { + column: 21, + line: 1, + offset: 20, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 21, + line: 1, + offset: 20, + }, + }, + type: 'operator', + value: '-', + [Symbol(isClean)]: false, + }, + Numeric { + parent: [Circular], + raws: { + after: '', + before: ' ', + }, + source: { + end: { + column: 23, + line: 1, + offset: 22, + }, + input: Input { + css: '((768px - 100vw)/2) - 15px', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 23, + line: 1, + offset: 22, + }, + }, + type: 'numeric', + unit: 'px', + value: '15', + [Symbol(isClean)]: false, + }, + ], + params: '(((768px - 100vw)/2) - 15px)', + raws: { + after: '', + before: '', + semicolon: false, + }, + source: { + end: { + column: 32, + line: 1, + offset: 31, + }, + input: Input { + css: 'calc(((768px - 100vw)/2) - 15px)', + hasBOM: false, + id: '', + [Symbol(fromOffset cache)]: [ + 0, + ], + }, + start: { + column: 1, + line: 1, + offset: 0, + }, + }, + type: 'func', + [Symbol(isClean)]: false, + }, + ] diff --git a/test/snapshots/func.test.js.snap b/test/snapshots/func.test.js.snap index 610dc5caf0da5ca739ff06b31cadae48e1e2c22f..774c50bec85106c7c21b714f7dcf713a128e165f 100644 GIT binary patch literal 23760 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 Vg73fSS!~?lB&|;bG;QGG{6C&vy%zug literal 18083 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 J=bHUR0szbN7CZm| From 23993979170d6d0814db8d0a98cb59622e1de195 Mon Sep 17 00:00:00 2001 From: Salim Bensiali Date: Fri, 7 Jan 2022 15:41:14 +1100 Subject: [PATCH 3/4] docs: fix numeric parse result (#139) --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 9bad2c5..9027d0c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -65,7 +65,7 @@ root.walkNumerics((node) => nodes.push(node)); // ... // }, // Numeric { -// value: '3s', +// value: '3', // type: 'numeric', // unit: 'pt', // ... From d95ae33212a5b46e093db03cb4e841b830daceb7 Mon Sep 17 00:00:00 2001 From: shellscape Date: Thu, 6 Jan 2022 23:50:48 -0500 Subject: [PATCH 4/4] chore(release): 6.0.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42eb981..4573062 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "postcss-values-parser", - "version": "6.0.1", + "version": "6.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index af42abf..d4cf7d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "postcss-values-parser", - "version": "6.0.1", + "version": "6.0.2", "description": "A CSS property value parser for use with PostCSS", "license": "MPL-2.0", "repository": "shellscape/postcss-values-parser",