@@ -26,45 +26,116 @@ module.exports = function(content, map) {
2626
2727 var result = [ ] ;
2828
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+
2936 var stuff = parseSource ( content ) ;
3037
3138 var replacer = new ReplaceMany ( ) ;
39+
40+ // store already imported files
41+ var importedUrls = [ ] ;
42+
43+ // add @imports to result
3244 stuff . imports . forEach ( function ( imp ) {
3345 replacer . replace ( imp . start , imp . length , "" ) ;
3446 if ( ! loaderUtils . isUrlRequest ( imp . url , root ) ) {
3547 result . push ( "exports.push([module.id, " +
3648 JSON . stringify ( "@import url(" + imp . url + ");" ) + ", " +
3749 JSON . stringify ( imp . mediaQuery ) + "]);" ) ;
3850 } 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 ) ;
4652 result . push ( "exports.i(require(" + loaderUtils . stringifyRequest ( this , importUrl ) + "), " + JSON . stringify ( imp . mediaQuery ) + ");" ) ;
53+ if ( ! imp . mediaQuery )
54+ importedUrls . push ( importUrl ) ;
4755 }
4856 } , 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()
5266 var locals = { } ;
67+ var localExtends = { } ;
5368 stuff . locals . forEach ( function ( local ) {
5469 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 , {
5773 regExp : localIdentRegExp
5874 } ) ;
59- locals [ local . name ] = ident ;
75+ locals [ name ] = ident ;
6076 } 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+ } ) ;
6285 }
6386 replacer . replace ( local . start , local . length , local . prefix + ident ) ;
6487 } , this ) ;
6588
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
66136 var cssContent = replacer . run ( content ) ;
67137
138+ // minimize CSS
68139 if ( minimize ) {
69140 var options = Object . create ( query ) ;
70141 if ( query . sourceMap && map ) {
@@ -81,8 +152,8 @@ module.exports = function(content, map) {
81152 return JSON . stringify ( str ) . replace ( / ^ " | " $ / g, "" ) ;
82153 }
83154
155+ // replace url(...) in the generated code
84156 var css = JSON . stringify ( cssContent ) ;
85-
86157 var urlRegExp = / _ _ C S S L O A D E R U R L _ [ 0 - 9 ] + _ _ / g;
87158 css = css . replace ( urlRegExp , function ( str ) {
88159 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) {
106177 return "\"+require(" + loaderUtils . stringifyRequest ( this , loaderUtils . urlToRequest ( url , root ) ) + ")+\"" ;
107178 } . bind ( this ) ) ;
108179
180+ // add a SourceMap
109181 if ( query . sourceMap && ! minimize ) {
110182 var cssRequest = loaderUtils . getRemainingRequest ( this ) ;
111183 var request = loaderUtils . getCurrentRequest ( this ) ;
@@ -131,10 +203,7 @@ module.exports = function(content, map) {
131203 result . push ( "exports.push([module.id, " + css + ", \"\"]);" ) ;
132204 }
133205
134- if ( Object . keys ( locals ) . length > 0 ) {
135- result . push ( "exports.locals = " + JSON . stringify ( locals ) + ";" ) ;
136- }
137-
206+ // embed runtime
138207 return "exports = module.exports = require(" + loaderUtils . stringifyRequest ( this , require . resolve ( "./css-base.js" ) ) + ")();\n" +
139208 result . join ( "\n" ) ;
140209} ;
0 commit comments