1
- var postcss = require ( "postcss" ) ;
2
- var valueParser = require ( "postcss-value-parser" ) ;
3
- var Tokenizer = require ( "css-selector-tokenizer" ) ;
4
- var loaderUtils = require ( "loader-utils" ) ;
1
+ const postcss = require ( "postcss" ) ;
2
+ const valueParser = require ( "postcss-value-parser" ) ;
3
+ const loaderUtils = require ( "loader-utils" ) ;
5
4
6
5
module . exports = postcss . plugin ( "css-loader-parser" , function ( options ) {
7
6
return function ( css ) {
@@ -10,38 +9,53 @@ module.exports = postcss.plugin("css-loader-parser", function(options) {
10
9
11
10
if ( options . import ) {
12
11
css . walkAtRules ( / ^ i m p o r t $ / i, function ( rule ) {
13
- const values = Tokenizer . parseValues ( rule . params ) ;
14
- let url = values . nodes [ 0 ] . nodes [ 0 ] ;
12
+ const parsedValue = valueParser ( rule . params ) ;
15
13
16
- if ( url && url . type === "url" ) {
17
- url = url . url ;
18
- } else if ( url && url . type === "string" ) {
19
- url = url . value ;
20
- } else throw rule . error ( "Unexpected format " + rule . params ) ;
21
-
22
- if ( ! url . replace ( / \s / g, "" ) . length ) {
23
- return ;
14
+ if ( ! parsedValue . nodes || ! parsedValue . nodes [ 0 ] ) {
15
+ throw rule . error ( "Unexpected format " + rule . params ) ;
24
16
}
25
17
26
- values . nodes [ 0 ] . nodes . shift ( ) ;
18
+ const firstNode = parsedValue . nodes [ 0 ] ;
19
+
20
+ let url = null ;
21
+
22
+ if (
23
+ firstNode . type === "function" &&
24
+ firstNode . value . toLowerCase ( ) === "url"
25
+ ) {
26
+ if ( firstNode . nodes [ 0 ] ) {
27
+ firstNode . nodes [ 0 ] . quote = "" ;
28
+ }
29
+
30
+ url = valueParser . stringify ( firstNode . nodes ) ;
31
+ } else if ( firstNode . type === "string" ) {
32
+ url = firstNode . value ;
33
+ }
27
34
28
- const mediaQuery = Tokenizer . stringifyValues ( values ) ;
35
+ if ( url . replace ( / \s / g, "" ) . length === 0 ) {
36
+ return ;
37
+ }
29
38
30
39
if ( loaderUtils . isUrlRequest ( url ) ) {
31
40
url = loaderUtils . urlToRequest ( url ) ;
32
41
}
33
42
43
+ const mediaQuery = valueParser
44
+ . stringify ( parsedValue . nodes . slice ( 1 ) )
45
+ . trim ( ) ;
46
+
34
47
importItems . push ( {
35
48
url : url ,
36
49
mediaQuery : mediaQuery
37
50
} ) ;
51
+
38
52
rule . remove ( ) ;
39
53
} ) ;
40
54
}
41
55
42
56
if ( options . url ) {
43
57
css . walkDecls ( decl => {
44
- if ( ! decl . value . includes ( "url(" ) ) {
58
+ if ( ! / u r l \( / i . test ( decl . value ) ) {
45
59
return decl ;
46
60
}
47
61
@@ -58,7 +72,7 @@ module.exports = postcss.plugin("css-loader-parser", function(options) {
58
72
}
59
73
60
74
const URLNode = node . nodes [ 0 ] ;
61
- const URLValue = URLNode . value . trim ( ) . replace ( / \\ [ \r \n ] / , "" ) ;
75
+ const URLValue = URLNode . value . trim ( ) . replace ( / \\ [ \r \n ] / g , "" ) ;
62
76
63
77
// Skip empty URLs
64
78
// Empty URL function equals request to current stylesheet where it is declared
0 commit comments