Skip to content

Commit c81edd4

Browse files
refactor: url part of plugin
1 parent f95be98 commit c81edd4

File tree

1 file changed

+54
-37
lines changed

1 file changed

+54
-37
lines changed

lib/plugin.js

Lines changed: 54 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,27 @@ var loaderUtils = require("loader-utils");
55

66
module.exports = postcss.plugin("css-loader-parser", function(options) {
77
return function(css) {
8-
var importItems = [];
9-
var urlItems = [];
8+
const importItems = [];
9+
const urlItems = [];
1010

1111
if (options.import) {
1212
css.walkAtRules(/^import$/i, function(rule) {
13-
var values = Tokenizer.parseValues(rule.params);
14-
var url = values.nodes[0].nodes[0];
13+
const values = Tokenizer.parseValues(rule.params);
14+
let url = values.nodes[0].nodes[0];
15+
1516
if (url && url.type === "url") {
1617
url = url.url;
1718
} else if (url && url.type === "string") {
1819
url = url.value;
1920
} else throw rule.error("Unexpected format " + rule.params);
21+
2022
if (!url.replace(/\s/g, "").length) {
2123
return;
2224
}
25+
2326
values.nodes[0].nodes.shift();
24-
var mediaQuery = Tokenizer.stringifyValues(values);
27+
28+
const mediaQuery = Tokenizer.stringifyValues(values);
2529

2630
if (loaderUtils.isUrlRequest(url)) {
2731
url = loaderUtils.urlToRequest(url);
@@ -35,43 +39,56 @@ module.exports = postcss.plugin("css-loader-parser", function(options) {
3539
});
3640
}
3741

38-
function processNode(item) {
39-
switch (item.type) {
40-
case "value":
41-
item.nodes.forEach(processNode);
42-
break;
43-
case "nested-item":
44-
item.nodes.forEach(processNode);
45-
break;
46-
case "url":
47-
if (
48-
options.url &&
49-
item.url.replace(/\s/g, "").length &&
50-
!/^#/.test(item.url) &&
51-
loaderUtils.isUrlRequest(item.url)
52-
) {
42+
if (options.url) {
43+
css.walkDecls(decl => {
44+
if (!decl.value.includes("url(")) {
45+
return decl;
46+
}
47+
48+
const parsedValue = valueParser(decl.value);
49+
50+
decl.value = parsedValue
51+
.walk(node => {
52+
if (
53+
node.type !== "function" ||
54+
node.value.toLowerCase() !== "url" ||
55+
node.nodes.length === 0
56+
) {
57+
return;
58+
}
59+
60+
const URLNode = node.nodes[0];
61+
const URLValue = URLNode.value.trim().replace(/\\[\r\n]/, "");
62+
63+
// Skip empty URLs
64+
// Empty URL function equals request to current stylesheet where it is declared
65+
if (URLValue.length === 0) {
66+
return;
67+
}
68+
69+
if (!loaderUtils.isUrlRequest(URLValue)) {
70+
return;
71+
}
72+
73+
// Remove spaces before and after
74+
node.before = "";
75+
node.after = "";
76+
77+
const requestedURL = loaderUtils.urlToRequest(URLValue);
78+
5379
// Strip quotes, they will be re-added if the module needs them
54-
item.stringType = "";
55-
delete item.innerSpacingBefore;
56-
delete item.innerSpacingAfter;
57-
// For backward-compat after dropping css modules
58-
var url = loaderUtils.urlToRequest(item.url.trim());
59-
item.url = "___CSS_LOADER_URL___" + urlItems.length + "___";
80+
URLNode.quote = "";
81+
URLNode.value = "___CSS_LOADER_URL___" + urlItems.length + "___";
82+
6083
urlItems.push({
61-
url: url
84+
url: requestedURL
6285
});
63-
}
64-
break;
65-
}
66-
}
86+
})
87+
.toString();
6788

68-
css.walkDecls(function(decl) {
69-
var values = Tokenizer.parseValues(decl.value);
70-
values.nodes.forEach(function(value) {
71-
value.nodes.forEach(processNode);
89+
return decl;
7290
});
73-
decl.value = Tokenizer.stringifyValues(values);
74-
});
91+
}
7592

7693
options.importItems = importItems;
7794
options.urlItems = urlItems;

0 commit comments

Comments
 (0)