@@ -26,45 +26,116 @@ module.exports = function(content, map) {
26
26
27
27
var result = [ ] ;
28
28
29
+ // for importing CSS
30
+ var loadersRequest = this . loaders . slice (
31
+ this . loaderIndex ,
32
+ this . loaderIndex + 1 + importLoaders
33
+ ) . map ( function ( x ) { return x . request ; } ) . join ( "!" ) ;
34
+ var importUrlPrefix = "-!" + loadersRequest + "!" ;
35
+
29
36
var stuff = parseSource ( content ) ;
30
37
31
38
var replacer = new ReplaceMany ( ) ;
39
+
40
+ // store already imported files
41
+ var importedUrls = [ ] ;
42
+
43
+ // add @imports to result
32
44
stuff . imports . forEach ( function ( imp ) {
33
45
replacer . replace ( imp . start , imp . length , "" ) ;
34
46
if ( ! loaderUtils . isUrlRequest ( imp . url , root ) ) {
35
47
result . push ( "exports.push([module.id, " +
36
48
JSON . stringify ( "@import url(" + imp . url + ");" ) + ", " +
37
49
JSON . stringify ( imp . mediaQuery ) + "]);" ) ;
38
50
} else {
39
- var loadersRequest = this . loaders . slice (
40
- this . loaderIndex ,
41
- this . loaderIndex + 1 + importLoaders
42
- ) . map ( function ( x ) { return x . request ; } ) . join ( "!" ) ;
43
- var importUrl = "-!" +
44
- loadersRequest + "!" +
45
- loaderUtils . urlToRequest ( imp . url ) ;
51
+ var importUrl = importUrlPrefix + loaderUtils . urlToRequest ( imp . url ) ;
46
52
result . push ( "exports.i(require(" + loaderUtils . stringifyRequest ( this , importUrl ) + "), " + JSON . stringify ( imp . mediaQuery ) + ");" ) ;
53
+ if ( ! imp . mediaQuery )
54
+ importedUrls . push ( importUrl ) ;
47
55
}
48
56
} , this ) ;
49
- stuff . urls . forEach ( function ( url , idx ) {
50
- replacer . replace ( url . start , url . length , "__CSSLOADERURL_" + idx + "__" ) ;
51
- } ) ;
57
+
58
+ // replace url(...)
59
+ if ( query . url !== false ) {
60
+ stuff . urls . forEach ( function ( url , idx ) {
61
+ replacer . replace ( url . start , url . length , "__CSSLOADERURL_" + idx + "__" ) ;
62
+ } ) ;
63
+ }
64
+
65
+ // replace :local()
52
66
var locals = { } ;
67
+ var localExtends = { } ;
53
68
stuff . locals . forEach ( function ( local ) {
54
69
var ident ;
55
- if ( ! locals [ local . name ] ) {
56
- ident = getLocalIdent ( this , localIdentName , local . name , {
70
+ var name = local . name ;
71
+ if ( ! locals [ name ] ) {
72
+ ident = getLocalIdent ( this , localIdentName , name , {
57
73
regExp : localIdentRegExp
58
74
} ) ;
59
- locals [ local . name ] = ident ;
75
+ locals [ name ] = ident ;
60
76
} else {
61
- ident = locals [ local . name ] ;
77
+ ident = locals [ name ] ;
78
+ }
79
+ if ( local . extends ) {
80
+ local . extends . forEach ( function ( extend ) {
81
+ if ( ! localExtends [ name ] )
82
+ localExtends [ name ] = [ ] ;
83
+ localExtends [ name ] . push ( extend ) ;
84
+ } ) ;
62
85
}
63
86
replacer . replace ( local . start , local . length , local . prefix + ident ) ;
64
87
} , this ) ;
65
88
89
+ // remove stuff
90
+ stuff . remove . forEach ( function ( rem ) {
91
+ replacer . replace ( rem . start , rem . length , "" ) ;
92
+ } ) ;
93
+
94
+ // pass errors from parser
95
+ if ( this . emitError ) {
96
+ stuff . errors . forEach ( function ( err ) {
97
+ this . emitError ( err ) ;
98
+ } , this ) ;
99
+ }
100
+
101
+ // generate the locals
102
+ var localKeys = Object . keys ( locals ) ;
103
+ if ( localKeys . length > 0 ) {
104
+ var localLines = localKeys . map ( function ( key , idx ) {
105
+ var line = " " + JSON . stringify ( key ) + ": " ;
106
+ function addExtend ( extend ) {
107
+ if ( extend . from ) {
108
+ var importUrl = importUrlPrefix + extend . from ;
109
+ if ( importedUrls . indexOf ( importUrl ) < 0 ) {
110
+ result . push ( "exports.i(require(" + loaderUtils . stringifyRequest ( this , importUrl ) + "), \"\");" ) ;
111
+ importedUrls . push ( importUrl ) ;
112
+ }
113
+ line += " + \" \" + require(" + loaderUtils . stringifyRequest ( this , importUrl ) + ").locals[" + JSON . stringify ( extend . name ) + "]" ;
114
+ } else if ( locals [ extend . name ] ) {
115
+ line += " + \" \" + " + JSON . stringify ( locals [ extend . name ] ) ;
116
+ if ( localExtends [ extend . name ] ) {
117
+ localExtends [ extend . name ] . forEach ( addExtend , this ) ;
118
+ }
119
+ } else if ( this . emitError ) {
120
+ this . emitError ( "Cannot extend from unknown class '" + extend . name + "'" ) ;
121
+ }
122
+ }
123
+ line += JSON . stringify ( locals [ key ] ) ;
124
+ if ( localExtends [ key ] ) {
125
+ localExtends [ key ] . forEach ( addExtend , this ) ;
126
+ }
127
+ if ( idx !== localKeys . length - 1 ) line += "," ;
128
+ return line ;
129
+ } , this ) ;
130
+ result . push ( "exports.locals = {" ) ;
131
+ result . push ( localLines . join ( "\n" ) ) ;
132
+ result . push ( "};" ) ;
133
+ }
134
+
135
+ // transform the CSS
66
136
var cssContent = replacer . run ( content ) ;
67
137
138
+ // minimize CSS
68
139
if ( minimize ) {
69
140
var options = Object . create ( query ) ;
70
141
if ( query . sourceMap && map ) {
@@ -81,8 +152,8 @@ module.exports = function(content, map) {
81
152
return JSON . stringify ( str ) . replace ( / ^ " | " $ / g, "" ) ;
82
153
}
83
154
155
+ // replace url(...) in the generated code
84
156
var css = JSON . stringify ( cssContent ) ;
85
-
86
157
var urlRegExp = / _ _ C S S L O A D E R U R L _ [ 0 - 9 ] + _ _ / g;
87
158
css = css . replace ( urlRegExp , function ( str ) {
88
159
var match = / ^ _ _ C S S L O A D E R U R L _ ( [ 0 - 9 ] + ) _ _ $ / . exec ( str ) ;
@@ -106,6 +177,7 @@ module.exports = function(content, map) {
106
177
return "\"+require(" + loaderUtils . stringifyRequest ( this , loaderUtils . urlToRequest ( url , root ) ) + ")+\"" ;
107
178
} . bind ( this ) ) ;
108
179
180
+ // add a SourceMap
109
181
if ( query . sourceMap && ! minimize ) {
110
182
var cssRequest = loaderUtils . getRemainingRequest ( this ) ;
111
183
var request = loaderUtils . getCurrentRequest ( this ) ;
@@ -131,10 +203,7 @@ module.exports = function(content, map) {
131
203
result . push ( "exports.push([module.id, " + css + ", \"\"]);" ) ;
132
204
}
133
205
134
- if ( Object . keys ( locals ) . length > 0 ) {
135
- result . push ( "exports.locals = " + JSON . stringify ( locals ) + ";" ) ;
136
- }
137
-
206
+ // embed runtime
138
207
return "exports = module.exports = require(" + loaderUtils . stringifyRequest ( this , require . resolve ( "./css-base.js" ) ) + ")();\n" +
139
208
result . join ( "\n" ) ;
140
209
} ;
0 commit comments