22  MIT License http://www.opensource.org/licenses/mit-license.php 
33  Author Tobias Koppers @sokra 
44*/ 
5+ 
56const  loaderUtils  =  require ( "loader-utils" ) ; 
67const  postcss  =  require ( "postcss" ) ; 
78const  plugin  =  require ( "./plugin" ) ; 
8- const  getImportPrefix  =  require ( "./getImportPrefix" ) ; 
99const  SyntaxError  =  require ( "./SyntaxError" ) ; 
1010
1111module . exports  =  function ( content ,  map ,  meta )  { 
@@ -42,7 +42,9 @@ module.exports = function(content, map, meta) {
4242  const  plugins  =  [ 
4343    plugin ( { 
4444      url : options . url  !==  false , 
45-       import : options . import  !==  false 
45+       import : options . import  !==  false , 
46+       loaderContext : this , 
47+       importLoaders : options . importLoaders 
4648    } ) 
4749  ] ; 
4850
@@ -71,52 +73,13 @@ module.exports = function(content, map, meta) {
7173  postcss ( plugins ) 
7274    . process ( content ,  postcssOptions ) 
7375    . then ( result  =>  { 
76+       if  ( meta  &&  meta . messages )  { 
77+         result . messages  =  result . messages . concat ( meta . messages ) ; 
78+       } 
79+ 
7480      let  cssAsString  =  JSON . stringify ( result . css ) ; 
75-       let  imports  =  "" ; 
76-       let  exports  =  "" ; 
7781      let  urlEscapeHelperCode  =  "" ; 
7882
79-       if  ( options . import  !==  false )  { 
80-         const  alreadyImported  =  { } ; 
81-         imports  =  result . messages 
82-           . filter ( message  =>  message . type  ===  "at-rule-import" ) 
83-           . filter ( message  =>  { 
84-             if  ( ! message . mediaQuery )  { 
85-               if  ( alreadyImported [ message . url ] )  { 
86-                 return  false ; 
87-               } 
88- 
89-               alreadyImported [ message . url ]  =  true ; 
90-             } 
91- 
92-             return  true ; 
93-           } ) 
94-           . map ( message  =>  { 
95-             if  ( ! loaderUtils . isUrlRequest ( message . url ) )  { 
96-               return  ( 
97-                 "exports.push([module.id, "  + 
98-                 JSON . stringify ( "@import url("  +  message . url  +  ");" )  + 
99-                 ", "  + 
100-                 JSON . stringify ( message . mediaQuery )  + 
101-                 "]);" 
102-               ) ; 
103-             } 
104- 
105-             // for importing CSS 
106-             var  importUrlPrefix  =  getImportPrefix ( this ,  options ) ; 
107-             var  importUrl  =  importUrlPrefix  +  message . url ; 
108- 
109-             return  ( 
110-               "exports.i(require("  + 
111-               loaderUtils . stringifyRequest ( this ,  importUrl )  + 
112-               "), "  + 
113-               JSON . stringify ( message . mediaQuery )  + 
114-               ");" 
115-             ) ; 
116-           } ) 
117-           . join ( "\n" ) ; 
118-       } 
119- 
12083      if  ( options . url  !==  false )  { 
12184        urlEscapeHelperCode  = 
12285          "var runtimeEscape = require("  + 
@@ -142,6 +105,27 @@ module.exports = function(content, map, meta) {
142105          } ) ; 
143106      } 
144107
108+       let  runtime  =  "" ; 
109+ 
110+       if  ( result . messages  &&  result . messages . length  >  0 )  { 
111+         runtime  =  result . messages 
112+           . filter ( message  =>  ( message . type  ===  "runtime"  ? message  : false ) ) 
113+           . reduce ( ( initialValue ,  message )  =>  { 
114+             try  { 
115+               message  = 
116+                 typeof  message . runtimeCode  ===  "function" 
117+                   ? message . runtimeCode ( this ) 
118+                   : message . runtimeCode ; 
119+ 
120+               initialValue  +=  message ; 
121+             }  catch  ( err )  { 
122+               this . emitError ( err ) ; 
123+             } 
124+ 
125+             return  initialValue ; 
126+           } ,  "" ) ; 
127+       } 
128+ 
145129      if  ( sourceMap  &&  result . map )  { 
146130        map  =  result . map . toJSON ( ) ; 
147131
@@ -162,33 +146,31 @@ module.exports = function(content, map, meta) {
162146        map  =  JSON . stringify ( map ) ; 
163147      } 
164148
165-       const  runtimeCode  =  `module.exports = exports = require(${ loaderUtils . stringifyRequest (  
166-         this ,  
167-         require . resolve ( "./runtime.js" )  
168-       ) }  )(${ ! ! sourceMap } ; 
169-       const  moduleCode  =  `// CSS Module\nexports.push([module.id, ${ cssAsString } ${  
170-         map  ? `,${ map }   : ""  
171-       }  ]);\n`; 
172-       const  importsCode  =  imports  ? `// CSS Imports\n${ imports }   : "" ; 
173149      // Todo need save backward compatibility with old `style-loader` and exports.locals 
174-       const  exportsCode  =  exports  ? `// CSS Exports\n${ exports }   : false ; 
175- 
176150      cb ( 
177151        null , 
178152        [ 
179153          urlEscapeHelperCode , 
180-           runtimeCode , 
181-           importsCode , 
182-           moduleCode , 
183-           exportsCode 
154+           `module.exports = exports = require(${ loaderUtils . stringifyRequest (  
155+             this ,  
156+             require . resolve ( "./runtime.js" )  
157+           ) }  )(${ ! ! sourceMap } , 
158+           runtime  ? `// CSS Exports\n${ runtime }   : "" , 
159+           `// CSS Module\nexports.push([module.id, ${ cssAsString } ${  
160+             map  ? `,${ map }   : ""  
161+           }  ]);\n`
184162        ] . join ( "\n" ) 
185163      ) ; 
164+ 
165+       return ; 
186166    } ) 
187167    . catch ( err  =>  { 
188168      if  ( err . file )  { 
189169        this . addDependency ( err . file ) ; 
190170      } 
191171
192172      cb ( err . name  ===  "CssSyntaxError"  ? new  SyntaxError ( err )  : err ) ; 
173+ 
174+       return ; 
193175    } ) ; 
194176} ; 
0 commit comments