11/*
2- MIT License http://www.opensource.org/licenses/mit-license.php
3- Author Tobias Koppers @sokra
2+ MIT License http://www.opensource.org/licenses/mit-license.php
3+ Author Tobias Koppers @sokra
44*/
55var loaderUtils = require ( "loader-utils" ) ;
66var processCss = require ( "./processCss" ) ;
@@ -10,153 +10,153 @@ var createResolver = require("./createResolver");
1010
1111
1212module . exports = function ( content , map ) {
13- if ( this . cacheable ) this . cacheable ( ) ;
14- var callback = this . async ( ) ;
15- var query = loaderUtils . getOptions ( this ) || { } ;
16- var root = query . root ;
17- var moduleMode = query . modules || query . module ;
18- var camelCaseKeys = query . camelCase || query . camelcase ;
19- var resolve = createResolver ( query . alias ) ;
20-
21- var givenExternals = query . externals || { } ;
22- var externals = { } ;
23- if ( Array . isArray ( givenExternals ) ) {
24- givenExternals . forEach ( function ( external ) {
25- if ( typeof external === 'object' ) {
26- externals = Object . assign ( { } , externals , external ) ;
27- }
28- } ) ;
29- } else {
30- externals = givenExternals ;
31- }
32-
33- var externalsKeys = Object . keys ( externals ) ;
34-
35- function findExternalFromImportUrl ( importUrl ) {
36- var key = externalsKeys . find ( function ( externalsKey ) {
37- return importUrl . endsWith ( externalsKey ) ;
38- } ) ;
39-
40- if ( key ) {
41- return externals [ key ] ;
42- }
43-
44- return false ;
45- }
46-
47- if ( map !== null && typeof map !== "string" ) {
48- map = JSON . stringify ( map ) ;
49- }
50-
51- processCss ( content , map , {
52- mode : moduleMode ? "local" : "global" ,
53- from : loaderUtils . getRemainingRequest ( this ) ,
54- to : loaderUtils . getCurrentRequest ( this ) ,
55- query : query ,
56- minimize : this . minimize ,
57- loaderContext : this
58- } , function ( err , result ) {
59- if ( err ) return callback ( err ) ;
60-
61- var cssAsString = JSON . stringify ( result . source ) ;
62-
63- // for importing CSS
64- var importUrlPrefix = getImportPrefix ( this , query ) ;
65-
66- var alreadyImported = { } ;
67- var importJs = result . importItems . filter ( function ( imp ) {
68- if ( ! imp . mediaQuery ) {
69- if ( alreadyImported [ imp . url ] )
70- return false ;
71- alreadyImported [ imp . url ] = true ;
72- }
73- return true ;
74- } ) . map ( function ( imp ) {
75- if ( ! loaderUtils . isUrlRequest ( imp . url , root ) ) {
76- return "exports.push([module.id, " +
77- JSON . stringify ( "@import url(" + imp . url + ");" ) + ", " +
78- JSON . stringify ( imp . mediaQuery ) + "]);" ;
79- } else {
80- var importUrl = importUrlPrefix + imp . url ;
81-
82- var external = findExternalFromImportUrl ( importUrl ) ;
83- if ( external === false ) {
84- return "exports.i(require(" + loaderUtils . stringifyRequest ( this , importUrl ) + "), " + JSON . stringify ( imp . mediaQuery ) + ");" ;
85- }
86-
87- return "exports.i(" + external + ", " + JSON . stringify ( imp . mediaQuery ) + ");" ;
88- }
89- } , this ) . join ( "\n" ) ;
90-
91- function importItemMatcher ( item ) {
92- var match = result . importItemRegExp . exec ( item ) ;
93- var idx = + match [ 1 ] ;
94- var importItem = result . importItems [ idx ] ;
95- var importUrl = importUrlPrefix + importItem . url ;
96-
97- var external = findExternalFromImportUrl ( importUrl ) ;
98- if ( external === false ) {
99- return "\" + require(" + loaderUtils . stringifyRequest ( this , importUrl ) + ").locals" +
100- "[" + JSON . stringify ( importItem . export ) + "] + \"" ;
101- }
102-
103- return "\" + " + external + "" +
104- "[" + JSON . stringify ( importItem . export ) + "] + \"" ;
105- }
106-
107- cssAsString = cssAsString . replace ( result . importItemRegExpG , importItemMatcher . bind ( this ) ) ;
108- if ( query . url !== false ) {
109- cssAsString = cssAsString . replace ( result . urlItemRegExpG , function ( item ) {
110- var match = result . urlItemRegExp . exec ( item ) ;
111- var idx = + match [ 1 ] ;
112- var urlItem = result . urlItems [ idx ] ;
113- var url = resolve ( urlItem . url ) ;
114- idx = url . indexOf ( "?#" ) ;
115- if ( idx < 0 ) idx = url . indexOf ( "#" ) ;
116- var urlRequest ;
117- if ( idx > 0 ) { // idx === 0 is catched by isUrlRequest
118- // in cases like url('webfont.eot?#iefix')
119- urlRequest = url . substr ( 0 , idx ) ;
120- return "\" + require(" + loaderUtils . stringifyRequest ( this , urlRequest ) + ") + \"" +
121- url . substr ( idx ) ;
122- }
123- urlRequest = url ;
124- return "\" + require(" + loaderUtils . stringifyRequest ( this , urlRequest ) + ") + \"" ;
125- } . bind ( this ) ) ;
126- }
127-
128-
129- var exportJs = compileExports ( result , importItemMatcher . bind ( this ) , camelCaseKeys ) ;
130- if ( exportJs ) {
131- exportJs = "exports.locals = " + exportJs + ";" ;
132- }
133-
134- var moduleJs ;
135- if ( query . sourceMap && result . map ) {
136- // add a SourceMap
137- map = result . map ;
138- if ( map . sources ) {
139- map . sources = map . sources . map ( function ( source ) {
140- return source . split ( "!" ) . pop ( ) ;
141- } , this ) ;
142- map . sourceRoot = "" ;
143- }
144- map . file = map . file . split ( "!" ) . pop ( ) ;
145- map = JSON . stringify ( map ) ;
146- moduleJs = "exports.push([module.id, " + cssAsString + ", \"\", " + map + "]);" ;
147- } else {
148- moduleJs = "exports.push([module.id, " + cssAsString + ", \"\"]);" ;
149- }
150-
151- // embed runtime
152- callback ( null , "exports = module.exports = require(" +
153- loaderUtils . stringifyRequest ( this , require . resolve ( "./css-base.js" ) ) +
154- ")(" + query . sourceMap + ");\n" +
155- "// imports\n" +
156- importJs + "\n\n" +
157- "// module\n" +
158- moduleJs + "\n\n" +
159- "// exports\n" +
160- exportJs ) ;
161- } . bind ( this ) ) ;
13+ if ( this . cacheable ) this . cacheable ( ) ;
14+ var callback = this . async ( ) ;
15+ var query = loaderUtils . getOptions ( this ) || { } ;
16+ var root = query . root ;
17+ var moduleMode = query . modules || query . module ;
18+ var camelCaseKeys = query . camelCase || query . camelcase ;
19+ var resolve = createResolver ( query . alias ) ;
20+
21+ var givenExternals = query . externals || { } ;
22+ var externals = { } ;
23+ if ( Array . isArray ( givenExternals ) ) {
24+ givenExternals . forEach ( function ( external ) {
25+ if ( typeof external === 'object' ) {
26+ externals = Object . assign ( { } , externals , external ) ;
27+ }
28+ } ) ;
29+ } else {
30+ externals = givenExternals ;
31+ }
32+
33+ var externalsKeys = Object . keys ( externals ) ;
34+
35+ function findExternalFromImportUrl ( importUrl ) {
36+ var key = externalsKeys . find ( function ( externalsKey ) {
37+ return importUrl . endsWith ( externalsKey ) ;
38+ } ) ;
39+
40+ if ( key ) {
41+ return externals [ key ] ;
42+ }
43+
44+ return false ;
45+ }
46+
47+ if ( map !== null && typeof map !== "string" ) {
48+ map = JSON . stringify ( map ) ;
49+ }
50+
51+ processCss ( content , map , {
52+ mode : moduleMode ? "local" : "global" ,
53+ from : loaderUtils . getRemainingRequest ( this ) ,
54+ to : loaderUtils . getCurrentRequest ( this ) ,
55+ query : query ,
56+ minimize : this . minimize ,
57+ loaderContext : this
58+ } , function ( err , result ) {
59+ if ( err ) return callback ( err ) ;
60+
61+ var cssAsString = JSON . stringify ( result . source ) ;
62+
63+ // for importing CSS
64+ var importUrlPrefix = getImportPrefix ( this , query ) ;
65+
66+ var alreadyImported = { } ;
67+ var importJs = result . importItems . filter ( function ( imp ) {
68+ if ( ! imp . mediaQuery ) {
69+ if ( alreadyImported [ imp . url ] )
70+ return false ;
71+ alreadyImported [ imp . url ] = true ;
72+ }
73+ return true ;
74+ } ) . map ( function ( imp ) {
75+ if ( ! loaderUtils . isUrlRequest ( imp . url , root ) ) {
76+ return "exports.push([module.id, " +
77+ JSON . stringify ( "@import url(" + imp . url + ");" ) + ", " +
78+ JSON . stringify ( imp . mediaQuery ) + "]);" ;
79+ } else {
80+ var importUrl = importUrlPrefix + imp . url ;
81+
82+ var external = findExternalFromImportUrl ( importUrl ) ;
83+ if ( external === false ) {
84+ return "exports.i(require(" + loaderUtils . stringifyRequest ( this , importUrl ) + "), " + JSON . stringify ( imp . mediaQuery ) + ");" ;
85+ }
86+
87+ return "exports.i(" + external + ", " + JSON . stringify ( imp . mediaQuery ) + ");" ;
88+ }
89+ } , this ) . join ( "\n" ) ;
90+
91+ function importItemMatcher ( item ) {
92+ var match = result . importItemRegExp . exec ( item ) ;
93+ var idx = + match [ 1 ] ;
94+ var importItem = result . importItems [ idx ] ;
95+ var importUrl = importUrlPrefix + importItem . url ;
96+
97+ var external = findExternalFromImportUrl ( importUrl ) ;
98+ if ( external === false ) {
99+ return "\" + require(" + loaderUtils . stringifyRequest ( this , importUrl ) + ").locals" +
100+ "[" + JSON . stringify ( importItem . export ) + "] + \"" ;
101+ }
102+
103+ return "\" + " + external + "" +
104+ "[" + JSON . stringify ( importItem . export ) + "] + \"" ;
105+ }
106+
107+ cssAsString = cssAsString . replace ( result . importItemRegExpG , importItemMatcher . bind ( this ) ) ;
108+ if ( query . url !== false ) {
109+ cssAsString = cssAsString . replace ( result . urlItemRegExpG , function ( item ) {
110+ var match = result . urlItemRegExp . exec ( item ) ;
111+ var idx = + match [ 1 ] ;
112+ var urlItem = result . urlItems [ idx ] ;
113+ var url = resolve ( urlItem . url ) ;
114+ idx = url . indexOf ( "?#" ) ;
115+ if ( idx < 0 ) idx = url . indexOf ( "#" ) ;
116+ var urlRequest ;
117+ if ( idx > 0 ) { // idx === 0 is catched by isUrlRequest
118+ // in cases like url('webfont.eot?#iefix')
119+ urlRequest = url . substr ( 0 , idx ) ;
120+ return "\" + require(" + loaderUtils . stringifyRequest ( this , urlRequest ) + ") + \"" +
121+ url . substr ( idx ) ;
122+ }
123+ urlRequest = url ;
124+ return "\" + require(" + loaderUtils . stringifyRequest ( this , urlRequest ) + ") + \"" ;
125+ } . bind ( this ) ) ;
126+ }
127+
128+
129+ var exportJs = compileExports ( result , importItemMatcher . bind ( this ) , camelCaseKeys ) ;
130+ if ( exportJs ) {
131+ exportJs = "exports.locals = " + exportJs + ";" ;
132+ }
133+
134+ var moduleJs ;
135+ if ( query . sourceMap && result . map ) {
136+ // add a SourceMap
137+ map = result . map ;
138+ if ( map . sources ) {
139+ map . sources = map . sources . map ( function ( source ) {
140+ return source . split ( "!" ) . pop ( ) ;
141+ } , this ) ;
142+ map . sourceRoot = "" ;
143+ }
144+ map . file = map . file . split ( "!" ) . pop ( ) ;
145+ map = JSON . stringify ( map ) ;
146+ moduleJs = "exports.push([module.id, " + cssAsString + ", \"\", " + map + "]);" ;
147+ } else {
148+ moduleJs = "exports.push([module.id, " + cssAsString + ", \"\"]);" ;
149+ }
150+
151+ // embed runtime
152+ callback ( null , "exports = module.exports = require(" +
153+ loaderUtils . stringifyRequest ( this , require . resolve ( "./css-base.js" ) ) +
154+ ")(" + query . sourceMap + ");\n" +
155+ "// imports\n" +
156+ importJs + "\n\n" +
157+ "// module\n" +
158+ moduleJs + "\n\n" +
159+ "// exports\n" +
160+ exportJs ) ;
161+ } . bind ( this ) ) ;
162162} ;
0 commit comments