Skip to content

Commit 3ebdcd5

Browse files
fix: handle uppercase URL in import at-rules (#818)
1 parent 6cf8a2b commit 3ebdcd5

File tree

2 files changed

+46
-35
lines changed

2 files changed

+46
-35
lines changed

lib/plugins/postcss-import-parser.js

+44-28
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,46 @@
11
const postcss = require('postcss');
2+
const valueParser = require('postcss-value-parser');
23
const loaderUtils = require('loader-utils');
3-
const Tokenizer = require('css-selector-tokenizer');
44

55
const pluginName = 'postcss-import-parser';
66

7+
function getArg(nodes) {
8+
return nodes.length !== 0 && nodes[0].type === 'string'
9+
? nodes[0].value
10+
: valueParser.stringify(nodes);
11+
}
12+
13+
function getUrl(node) {
14+
if (node.type === 'function' && node.value.toLowerCase() === 'url') {
15+
return getArg(node.nodes);
16+
}
17+
18+
if (node.type === 'string') {
19+
return node.value;
20+
}
21+
22+
return '';
23+
}
24+
25+
function parseImport(params) {
26+
const { nodes } = valueParser(params);
27+
28+
if (nodes.length === 0) {
29+
return null;
30+
}
31+
32+
const url = getUrl(nodes[0]);
33+
34+
if (url.trim().length === 0) {
35+
return null;
36+
}
37+
38+
return {
39+
url,
40+
media: valueParser.stringify(nodes.slice(1)).trim(),
41+
};
42+
}
43+
744
module.exports = postcss.plugin(
845
pluginName,
946
(options) =>
@@ -25,43 +62,22 @@ module.exports = postcss.plugin(
2562
return;
2663
}
2764

28-
const values = Tokenizer.parseValues(atrule.params);
29-
let [url] = values.nodes[0].nodes;
65+
const parsed = parseImport(atrule.params);
3066

31-
if (url && url.type === 'url') {
32-
({ url } = url);
33-
} else if (url && url.type === 'string') {
34-
url = url.value;
35-
} else {
36-
result.warn(`Unable to find uri in '${atrule.toString()}'`, {
67+
if (!parsed) {
68+
// eslint-disable-next-line consistent-return
69+
return result.warn(`Unable to find uri in '${atrule.toString()}'`, {
3770
node: atrule,
3871
});
39-
40-
return;
4172
}
4273

43-
if (!url.replace(/\s/g, '').length) {
44-
result.warn(`Unable to find uri in '${atrule.toString()}'`, {
45-
node: atrule,
46-
});
47-
48-
return;
49-
}
50-
51-
values.nodes[0].nodes.shift();
52-
53-
const mediaQuery = Tokenizer.stringifyValues(values);
54-
55-
url = url.trim();
74+
let { url } = parsed;
5675

5776
if (loaderUtils.isUrlRequest(url)) {
5877
url = loaderUtils.urlToRequest(url);
5978
}
6079

61-
importItems.push({
62-
url,
63-
mediaQuery,
64-
});
80+
importItems.push({ url, mediaQuery: parsed.media });
6581

6682
atrule.remove();
6783
});

test/__snapshots__/import-option.test.js.snap

+2-7
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,7 @@ Array [
184184
],
185185
Array [
186186
1,
187-
"@import URL(test.css);
188-
@import url();
187+
"@import url();
189188
@import url('');
190189
@import url(\\"\\");
191190
@import '';
@@ -234,7 +233,7 @@ exports.i(require(\\"-!../../../index.js??ref--4-0!./query.css?foo=1&bar=1\\"),
234233
exports.i(require(\\"-!../../../index.js??ref--4-0!./other-query.css?foo=1&bar=1#hash\\"), \\"\\");
235234
236235
// module
237-
exports.push([module.id, \\"@import URL(test.css);\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import '';\\\\n@import \\\\\\"\\\\\\";\\\\n@import \\\\\\" \\\\\\";\\\\n@import \\\\\\"\\\\n\\\\\\";\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import ;\\\\n@import foo-bar;\\\\n@import-normalize;\\\\n@import url('http://') :root {}\\\\n\\\\n.class {\\\\n a: b c d;\\\\n}\\\\n\\\\n.foo {\\\\n @import 'path.css';\\\\n}\\\\n\\", \\"\\"]);
236+
exports.push([module.id, \\"@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import '';\\\\n@import \\\\\\"\\\\\\";\\\\n@import \\\\\\" \\\\\\";\\\\n@import \\\\\\"\\\\n\\\\\\";\\\\n@import url();\\\\n@import url('');\\\\n@import url(\\\\\\"\\\\\\");\\\\n@import ;\\\\n@import foo-bar;\\\\n@import-normalize;\\\\n@import url('http://') :root {}\\\\n\\\\n.class {\\\\n a: b c d;\\\\n}\\\\n\\\\n.foo {\\\\n @import 'path.css';\\\\n}\\\\n\\", \\"\\"]);
238237
239238
// exports
240239
"
@@ -295,9 +294,5 @@ Warning
295294
Warning
296295
297296
(40:1) It looks like you didn't end your @import statement correctly. Child nodes are attached to it.",
298-
"ModuleWarning: Module Warning (from \`replaced original path\`):
299-
Warning
300-
301-
(5:1) Unable to find uri in '@import URL(test.css)'",
302297
]
303298
`;

0 commit comments

Comments
 (0)