postcss-normalize-string 4.0.0-rc.0 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +68 -52
- package/package.json +7 -7
- package/CHANGELOG.md +0 -4
package/README.md
CHANGED
|
@@ -50,7 +50,7 @@ console.log(postcss(normalize({preferredQuote: 'single'})).process(css).css);
|
|
|
50
50
|
|
|
51
51
|
## Contributors
|
|
52
52
|
|
|
53
|
-
See [CONTRIBUTORS.md](https://github.com/
|
|
53
|
+
See [CONTRIBUTORS.md](https://github.com/cssnano/cssnano/blob/master/CONTRIBUTORS.md).
|
|
54
54
|
|
|
55
55
|
## License
|
|
56
56
|
|
package/dist/index.js
CHANGED
|
@@ -18,73 +18,68 @@ var _has2 = _interopRequireDefault(_has);
|
|
|
18
18
|
|
|
19
19
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
20
|
|
|
21
|
-
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
22
|
-
|
|
23
21
|
/*
|
|
24
22
|
* Constants (parser usage)
|
|
25
23
|
*/
|
|
26
24
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
const SINGLE_QUOTE = '\''.charCodeAt(0);
|
|
26
|
+
const DOUBLE_QUOTE = '"'.charCodeAt(0);
|
|
27
|
+
const BACKSLASH = '\\'.charCodeAt(0);
|
|
28
|
+
const NEWLINE = '\n'.charCodeAt(0);
|
|
29
|
+
const SPACE = ' '.charCodeAt(0);
|
|
30
|
+
const FEED = '\f'.charCodeAt(0);
|
|
31
|
+
const TAB = '\t'.charCodeAt(0);
|
|
32
|
+
const CR = '\r'.charCodeAt(0);
|
|
35
33
|
|
|
36
|
-
|
|
34
|
+
const WORD_END = /[ \n\t\r\f'"\\]/g;
|
|
37
35
|
|
|
38
36
|
/*
|
|
39
37
|
* Constants (node type strings)
|
|
40
38
|
*/
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
const C_STRING = 'string';
|
|
41
|
+
const C_ESCAPED_SINGLE_QUOTE = 'escapedSingleQuote';
|
|
42
|
+
const C_ESCAPED_DOUBLE_QUOTE = 'escapedDoubleQuote';
|
|
43
|
+
const C_SINGLE_QUOTE = 'singleQuote';
|
|
44
|
+
const C_DOUBLE_QUOTE = 'doubleQuote';
|
|
45
|
+
const C_NEWLINE = 'newline';
|
|
46
|
+
const C_SINGLE = 'single';
|
|
49
47
|
|
|
50
48
|
/*
|
|
51
49
|
* Literals
|
|
52
50
|
*/
|
|
53
51
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
52
|
+
const L_SINGLE_QUOTE = `'`;
|
|
53
|
+
const L_DOUBLE_QUOTE = `"`;
|
|
54
|
+
const L_NEWLINE = `\\\n`;
|
|
57
55
|
|
|
58
56
|
/*
|
|
59
57
|
* Parser nodes
|
|
60
58
|
*/
|
|
61
59
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
60
|
+
const T_ESCAPED_SINGLE_QUOTE = { type: C_ESCAPED_SINGLE_QUOTE, value: `\\'` };
|
|
61
|
+
const T_ESCAPED_DOUBLE_QUOTE = { type: C_ESCAPED_DOUBLE_QUOTE, value: `\\"` };
|
|
62
|
+
const T_SINGLE_QUOTE = { type: C_SINGLE_QUOTE, value: L_SINGLE_QUOTE };
|
|
63
|
+
const T_DOUBLE_QUOTE = { type: C_DOUBLE_QUOTE, value: L_DOUBLE_QUOTE };
|
|
64
|
+
const T_NEWLINE = { type: C_NEWLINE, value: L_NEWLINE };
|
|
67
65
|
|
|
68
66
|
function stringify(ast) {
|
|
69
|
-
return ast.nodes.reduce(
|
|
70
|
-
var value = _ref.value;
|
|
71
|
-
|
|
67
|
+
return ast.nodes.reduce((str, { value }) => {
|
|
72
68
|
// Collapse multiple line strings automatically
|
|
73
69
|
if (value === L_NEWLINE) {
|
|
74
70
|
return str;
|
|
75
71
|
}
|
|
72
|
+
|
|
76
73
|
return str + value;
|
|
77
74
|
}, '');
|
|
78
75
|
}
|
|
79
76
|
|
|
80
77
|
function parse(str) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
var pos = 0;
|
|
85
|
-
var len = str.length;
|
|
78
|
+
let code, next, value;
|
|
79
|
+
let pos = 0;
|
|
80
|
+
let len = str.length;
|
|
86
81
|
|
|
87
|
-
|
|
82
|
+
const ast = {
|
|
88
83
|
nodes: [],
|
|
89
84
|
types: {
|
|
90
85
|
escapedSingleQuote: 0,
|
|
@@ -97,12 +92,14 @@ function parse(str) {
|
|
|
97
92
|
|
|
98
93
|
while (pos < len) {
|
|
99
94
|
code = str.charCodeAt(pos);
|
|
95
|
+
|
|
100
96
|
switch (code) {
|
|
101
97
|
case SPACE:
|
|
102
98
|
case TAB:
|
|
103
99
|
case CR:
|
|
104
100
|
case FEED:
|
|
105
101
|
next = pos;
|
|
102
|
+
|
|
106
103
|
do {
|
|
107
104
|
next += 1;
|
|
108
105
|
code = str.charCodeAt(next);
|
|
@@ -126,6 +123,7 @@ function parse(str) {
|
|
|
126
123
|
break;
|
|
127
124
|
case BACKSLASH:
|
|
128
125
|
next = pos + 1;
|
|
126
|
+
|
|
129
127
|
if (str.charCodeAt(next) === SINGLE_QUOTE) {
|
|
130
128
|
ast.nodes.push(T_ESCAPED_SINGLE_QUOTE);
|
|
131
129
|
ast.types[C_ESCAPED_SINGLE_QUOTE]++;
|
|
@@ -173,7 +171,7 @@ function parse(str) {
|
|
|
173
171
|
}
|
|
174
172
|
|
|
175
173
|
function changeWrappingQuotes(node, ast) {
|
|
176
|
-
|
|
174
|
+
const { types } = ast;
|
|
177
175
|
|
|
178
176
|
if (types[C_SINGLE_QUOTE] || types[C_DOUBLE_QUOTE]) {
|
|
179
177
|
return;
|
|
@@ -187,14 +185,16 @@ function changeWrappingQuotes(node, ast) {
|
|
|
187
185
|
node.quote = L_SINGLE_QUOTE;
|
|
188
186
|
}
|
|
189
187
|
|
|
190
|
-
ast.nodes = ast.nodes.reduce(
|
|
188
|
+
ast.nodes = ast.nodes.reduce((newAst, child) => {
|
|
191
189
|
if (child.type === C_ESCAPED_DOUBLE_QUOTE && node.quote === L_SINGLE_QUOTE) {
|
|
192
|
-
return [
|
|
190
|
+
return [...newAst, T_DOUBLE_QUOTE];
|
|
193
191
|
}
|
|
192
|
+
|
|
194
193
|
if (child.type === C_ESCAPED_SINGLE_QUOTE && node.quote === L_DOUBLE_QUOTE) {
|
|
195
|
-
return [
|
|
194
|
+
return [...newAst, T_SINGLE_QUOTE];
|
|
196
195
|
}
|
|
197
|
-
|
|
196
|
+
|
|
197
|
+
return [...newAst, child];
|
|
198
198
|
}, []);
|
|
199
199
|
}
|
|
200
200
|
|
|
@@ -202,11 +202,14 @@ function normalize(value, preferredQuote) {
|
|
|
202
202
|
if (!value || !value.length) {
|
|
203
203
|
return value;
|
|
204
204
|
}
|
|
205
|
-
|
|
205
|
+
|
|
206
|
+
return (0, _postcssValueParser2.default)(value).walk(child => {
|
|
206
207
|
if (child.type !== C_STRING) {
|
|
207
208
|
return;
|
|
208
209
|
}
|
|
209
|
-
|
|
210
|
+
|
|
211
|
+
const ast = parse(child.value);
|
|
212
|
+
|
|
210
213
|
if (ast.quotes) {
|
|
211
214
|
changeWrappingQuotes(child, ast);
|
|
212
215
|
} else if (preferredQuote === C_SINGLE) {
|
|
@@ -214,29 +217,42 @@ function normalize(value, preferredQuote) {
|
|
|
214
217
|
} else {
|
|
215
218
|
child.quote = L_DOUBLE_QUOTE;
|
|
216
219
|
}
|
|
220
|
+
|
|
217
221
|
child.value = stringify(ast);
|
|
218
222
|
}).toString();
|
|
219
223
|
}
|
|
220
224
|
|
|
221
|
-
|
|
225
|
+
const params = {
|
|
222
226
|
rule: 'selector',
|
|
223
227
|
decl: 'value',
|
|
224
228
|
atrule: 'params'
|
|
225
229
|
};
|
|
226
230
|
|
|
227
|
-
exports.default = _postcss2.default.plugin('postcss-normalize-string',
|
|
228
|
-
|
|
231
|
+
exports.default = _postcss2.default.plugin('postcss-normalize-string', opts => {
|
|
232
|
+
const { preferredQuote } = Object.assign({}, {
|
|
229
233
|
preferredQuote: 'double'
|
|
230
|
-
}, opts)
|
|
231
|
-
preferredQuote = _Object$assign.preferredQuote;
|
|
234
|
+
}, opts);
|
|
232
235
|
|
|
233
|
-
return
|
|
234
|
-
|
|
235
|
-
|
|
236
|
+
return css => {
|
|
237
|
+
const cache = {};
|
|
238
|
+
|
|
239
|
+
css.walk(node => {
|
|
240
|
+
const { type } = node;
|
|
236
241
|
|
|
237
242
|
if ((0, _has2.default)(params, type)) {
|
|
238
|
-
|
|
239
|
-
|
|
243
|
+
const param = params[type];
|
|
244
|
+
const key = node[param] + '|' + preferredQuote;
|
|
245
|
+
|
|
246
|
+
if (cache[key]) {
|
|
247
|
+
node[param] = cache[key];
|
|
248
|
+
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const result = normalize(node[param], preferredQuote);
|
|
253
|
+
|
|
254
|
+
node[param] = result;
|
|
255
|
+
cache[key] = result;
|
|
240
256
|
}
|
|
241
257
|
});
|
|
242
258
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "postcss-normalize-string",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.2",
|
|
4
4
|
"description": "Normalize wrapping quotes for CSS string literals.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"files": [
|
|
@@ -18,24 +18,24 @@
|
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"babel-cli": "^6.0.0",
|
|
21
|
-
"cross-env": "^
|
|
21
|
+
"cross-env": "^5.0.0"
|
|
22
22
|
},
|
|
23
|
-
"homepage": "https://github.com/
|
|
23
|
+
"homepage": "https://github.com/cssnano/cssnano",
|
|
24
24
|
"author": {
|
|
25
25
|
"name": "Ben Briggs",
|
|
26
26
|
"email": "beneb.info@gmail.com",
|
|
27
27
|
"url": "http://beneb.info"
|
|
28
28
|
},
|
|
29
|
-
"repository": "
|
|
29
|
+
"repository": "cssnano/cssnano",
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"has": "^1.0.0",
|
|
32
|
-
"postcss": "^
|
|
32
|
+
"postcss": "^7.0.0",
|
|
33
33
|
"postcss-value-parser": "^3.0.0"
|
|
34
34
|
},
|
|
35
35
|
"bugs": {
|
|
36
|
-
"url": "https://github.com/
|
|
36
|
+
"url": "https://github.com/cssnano/cssnano/issues"
|
|
37
37
|
},
|
|
38
38
|
"engines": {
|
|
39
|
-
"node": ">=
|
|
39
|
+
"node": ">=6.9.0"
|
|
40
40
|
}
|
|
41
41
|
}
|
package/CHANGELOG.md
DELETED