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,45 @@ module.exports = function(content, map, meta) {
142105 } ) ;
143106 }
144107
108+ let imports = "" ;
109+ let exports = "" ;
110+
111+ if ( result . messages && result . messages . length > 0 ) {
112+ imports = result . messages
113+ . filter ( message => ( message . type === "import" ? message : false ) )
114+ . reduce ( ( initialValue , message ) => {
115+ try {
116+ message =
117+ typeof message . importCode === "function"
118+ ? message . importCode ( this )
119+ : message . importCode ;
120+
121+ initialValue += message ;
122+ } catch ( err ) {
123+ this . emitError ( err ) ;
124+ }
125+
126+ return initialValue ;
127+ } , "" ) ;
128+
129+ exports = result . messages
130+ . filter ( message => ( message . type === "export" ? message : false ) )
131+ . reduce ( ( initialValue , message ) => {
132+ try {
133+ message =
134+ typeof message . exportCode === "function"
135+ ? message . exportCode ( this )
136+ : message . exportCode ;
137+
138+ initialValue += message ;
139+ } catch ( err ) {
140+ this . emitError ( err ) ;
141+ }
142+
143+ return initialValue ;
144+ } , "" ) ;
145+ }
146+
145147 if ( sourceMap && result . map ) {
146148 map = result . map . toJSON ( ) ;
147149
@@ -162,33 +164,32 @@ module.exports = function(content, map, meta) {
162164 map = JSON . stringify ( map ) ;
163165 }
164166
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` : "" ;
173167 // Todo need save backward compatibility with old `style-loader` and exports.locals
174- const exportsCode = exports ? `// CSS Exports\n${ exports } \n` : false ;
175-
176168 cb (
177169 null ,
178170 [
179171 urlEscapeHelperCode ,
180- runtimeCode ,
181- importsCode ,
182- moduleCode ,
183- exportsCode
172+ `module.exports = exports = require(${ loaderUtils . stringifyRequest (
173+ this ,
174+ require . resolve ( "./runtime.js" )
175+ ) } )(${ ! ! sourceMap } );\n`,
176+ imports ? `// CSS Imports\n${ imports } \n` : "" ,
177+ exports ? `// CSS Exports\n${ exports } \n` : false ,
178+ `// CSS Module\nexports.push([module.id, ${ cssAsString } , ""${
179+ map ? `,${ map } ` : ""
180+ } ]);\n`
184181 ] . join ( "\n" )
185182 ) ;
183+
184+ return ;
186185 } )
187186 . catch ( err => {
188187 if ( err . file ) {
189188 this . addDependency ( err . file ) ;
190189 }
191190
192191 cb ( err . name === "CssSyntaxError" ? new SyntaxError ( err ) : err ) ;
192+
193+ return ;
193194 } ) ;
194195} ;
0 commit comments