@@ -5,23 +5,27 @@ var loaderUtils = require("loader-utils");
5
5
6
6
module . exports = postcss . plugin ( "css-loader-parser" , function ( options ) {
7
7
return function ( css ) {
8
- var importItems = [ ] ;
9
- var urlItems = [ ] ;
8
+ const importItems = [ ] ;
9
+ const urlItems = [ ] ;
10
10
11
11
if ( options . import ) {
12
12
css . walkAtRules ( / ^ i m p o r t $ / 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
+
15
16
if ( url && url . type === "url" ) {
16
17
url = url . url ;
17
18
} else if ( url && url . type === "string" ) {
18
19
url = url . value ;
19
20
} else throw rule . error ( "Unexpected format " + rule . params ) ;
21
+
20
22
if ( ! url . replace ( / \s / g, "" ) . length ) {
21
23
return ;
22
24
}
25
+
23
26
values . nodes [ 0 ] . nodes . shift ( ) ;
24
- var mediaQuery = Tokenizer . stringifyValues ( values ) ;
27
+
28
+ const mediaQuery = Tokenizer . stringifyValues ( values ) ;
25
29
26
30
if ( loaderUtils . isUrlRequest ( url ) ) {
27
31
url = loaderUtils . urlToRequest ( url ) ;
@@ -35,43 +39,56 @@ module.exports = postcss.plugin("css-loader-parser", function(options) {
35
39
} ) ;
36
40
}
37
41
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
+
53
79
// 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
+
60
83
urlItems . push ( {
61
- url : url
84
+ url : requestedURL
62
85
} ) ;
63
- }
64
- break ;
65
- }
66
- }
86
+ } )
87
+ . toString ( ) ;
67
88
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 ;
72
90
} ) ;
73
- decl . value = Tokenizer . stringifyValues ( values ) ;
74
- } ) ;
91
+ }
75
92
76
93
options . importItems = importItems ;
77
94
options . urlItems = urlItems ;
0 commit comments