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 } );\n`;
169- const moduleCode = `// CSS Module\nexports.push([module.id, ${ cssAsString } , ""${
170- map ? `,${ map } ` : ""
171- } ]);\n`;
172- const importsCode = imports ? `// CSS Imports\n${ imports } \n` : "" ;
173149 // Todo need save backward compatibility with old `style-loader` and exports.locals
174- const exportsCode = exports ? `// CSS Exports\n${ exports } \n` : 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 } );\n`,
158+ runtime ? `// CSS Exports\n${ runtime } \n` : "" ,
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