2
2
MIT License http://www.opensource.org/licenses/mit-license.php
3
3
Author Tobias Koppers @sokra
4
4
*/
5
+
5
6
const loaderUtils = require ( "loader-utils" ) ;
6
7
const postcss = require ( "postcss" ) ;
7
8
const plugin = require ( "./plugin" ) ;
8
- const getImportPrefix = require ( "./getImportPrefix" ) ;
9
9
const SyntaxError = require ( "./SyntaxError" ) ;
10
10
11
11
module . exports = function ( content , map , meta ) {
@@ -42,7 +42,9 @@ module.exports = function(content, map, meta) {
42
42
const plugins = [
43
43
plugin ( {
44
44
url : options . url !== false ,
45
- import : options . import !== false
45
+ import : options . import !== false ,
46
+ loaderContext : this ,
47
+ importLoaders : options . importLoaders
46
48
} )
47
49
] ;
48
50
@@ -71,52 +73,13 @@ module.exports = function(content, map, meta) {
71
73
postcss ( plugins )
72
74
. process ( content , postcssOptions )
73
75
. then ( result => {
76
+ if ( meta && meta . messages ) {
77
+ result . messages = result . messages . concat ( meta . messages ) ;
78
+ }
79
+
74
80
let cssAsString = JSON . stringify ( result . css ) ;
75
- let imports = "" ;
76
- let exports = "" ;
77
81
let urlEscapeHelperCode = "" ;
78
82
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
-
120
83
if ( options . url !== false ) {
121
84
urlEscapeHelperCode =
122
85
"var runtimeEscape = require(" +
@@ -142,6 +105,27 @@ module.exports = function(content, map, meta) {
142
105
} ) ;
143
106
}
144
107
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
+
145
129
if ( sourceMap && result . map ) {
146
130
map = result . map . toJSON ( ) ;
147
131
@@ -162,33 +146,31 @@ module.exports = function(content, map, meta) {
162
146
map = JSON . stringify ( map ) ;
163
147
}
164
148
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` : "" ;
173
149
// Todo need save backward compatibility with old `style-loader` and exports.locals
174
- const exportsCode = exports ? `// CSS Exports\n${ exports } \n` : false ;
175
-
176
150
cb (
177
151
null ,
178
152
[
179
153
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`
184
162
] . join ( "\n" )
185
163
) ;
164
+
165
+ return ;
186
166
} )
187
167
. catch ( err => {
188
168
if ( err . file ) {
189
169
this . addDependency ( err . file ) ;
190
170
}
191
171
192
172
cb ( err . name === "CssSyntaxError" ? new SyntaxError ( err ) : err ) ;
173
+
174
+ return ;
193
175
} ) ;
194
176
} ;
0 commit comments