@@ -19,12 +19,12 @@ import {
19
19
normalizeSourceMap ,
20
20
getModulesPlugins ,
21
21
getImportPrefix ,
22
- getIcssItemReplacer ,
23
22
getFilter ,
24
- getRuntimeCode ,
23
+ getApiCode ,
25
24
getImportCode ,
26
25
getModuleCode ,
27
26
getExportCode ,
27
+ prepareCode ,
28
28
} from './utils' ;
29
29
import Warning from './Warning' ;
30
30
import CssSyntaxError from './CssSyntaxError' ;
@@ -37,14 +37,9 @@ export default function loader(content, map, meta) {
37
37
const callback = this . async ( ) ;
38
38
const sourceMap = options . sourceMap || false ;
39
39
40
- if ( sourceMap && map ) {
41
- // eslint-disable-next-line no-param-reassign
42
- map = normalizeSourceMap ( map ) ;
43
- } else {
44
- // Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it
45
- // eslint-disable-next-line no-param-reassign
46
- map = null ;
47
- }
40
+ // Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it
41
+ // eslint-disable-next-line no-param-reassign
42
+ map = sourceMap && map ? normalizeSourceMap ( map ) : null ;
48
43
49
44
// Reuse CSS AST (PostCSS AST e.g 'postcss-loader') to avoid reparsing
50
45
if ( meta ) {
@@ -62,11 +57,22 @@ export default function loader(content, map, meta) {
62
57
plugins . push ( ...getModulesPlugins ( options , this ) ) ;
63
58
}
64
59
65
- plugins . push ( icssParser ( ) ) ;
60
+ // Run other loader (`postcss-loader`, `sass-loader` and etc) for importing CSS
61
+ const importPrefix = getImportPrefix ( this , options . importLoaders ) ;
62
+
63
+ plugins . push (
64
+ icssParser ( {
65
+ loaderContext : this ,
66
+ importPrefix,
67
+ exportLocalsStyle : options . exportLocalsStyle ,
68
+ } )
69
+ ) ;
66
70
67
71
if ( options . import !== false ) {
68
72
plugins . push (
69
73
importParser ( {
74
+ loaderContext : this ,
75
+ importPrefix,
70
76
filter : getFilter ( options . import , this . resourcePath ) ,
71
77
} )
72
78
) ;
@@ -75,6 +81,7 @@ export default function loader(content, map, meta) {
75
81
if ( options . url !== false ) {
76
82
plugins . push (
77
83
urlParser ( {
84
+ loaderContext : this ,
78
85
filter : getFilter ( options . url , this . resourcePath , ( value ) =>
79
86
isUrlRequest ( value )
80
87
) ,
@@ -108,36 +115,37 @@ export default function loader(content, map, meta) {
108
115
result . messages = [ ] ;
109
116
}
110
117
111
- const {
112
- exportOnlyLocals : onlyLocals ,
113
- exportLocalsStyle : localsStyle ,
114
- } = options ;
115
- // Run other loader (`postcss-loader`, `sass-loader` and etc) for importing CSS
116
- const importPrefix = getImportPrefix ( this , options . importLoaders ) ;
117
- // Prepare replacer to change from `___CSS_LOADER_IMPORT___INDEX___` to `require('./file.css').locals`
118
- const replacer = getIcssItemReplacer (
119
- result ,
120
- this ,
121
- importPrefix ,
122
- onlyLocals
123
- ) ;
118
+ const { exportOnlyLocals : onlyLocals } = options ;
124
119
125
- // eslint-disable-next-line no-param-reassign
126
- result . cssLoaderBuildInfo = {
127
- onlyLocals,
128
- localsStyle,
129
- importPrefix,
130
- replacer,
131
- } ;
120
+ const importItems = result . messages
121
+ . filter ( ( message ) => ( message . type === 'import' ? message : false ) )
122
+ . reduce ( ( accumulator , currentValue ) => {
123
+ accumulator . push ( currentValue . import ) ;
124
+
125
+ return accumulator ;
126
+ } , [ ] ) ;
127
+ const exportItems = result . messages
128
+ . filter ( ( message ) => ( message . type === 'export' ? message : false ) )
129
+ . reduce ( ( accumulator , currentValue ) => {
130
+ accumulator . push ( currentValue . export ) ;
131
+
132
+ return accumulator ;
133
+ } , [ ] ) ;
132
134
133
- const runtimeCode = getRuntimeCode ( result , this , sourceMap ) ;
134
- const importCode = getImportCode ( result , this ) ;
135
- const moduleCode = getModuleCode ( result ) ;
136
- const exportsCode = getExportCode ( result ) ;
135
+ const importCode = getImportCode ( importItems , onlyLocals ) ;
136
+ const moduleCode = getModuleCode ( result , sourceMap , onlyLocals ) ;
137
+ const exportCode = getExportCode ( exportItems , onlyLocals ) ;
138
+ const apiCode = getApiCode ( this , sourceMap , onlyLocals ) ;
137
139
138
140
return callback (
139
141
null ,
140
- runtimeCode + importCode + moduleCode + exportsCode
142
+ prepareCode (
143
+ { apiCode, importCode, moduleCode, exportCode } ,
144
+ result . messages ,
145
+ this ,
146
+ importPrefix ,
147
+ onlyLocals
148
+ )
141
149
) ;
142
150
} )
143
151
. catch ( ( error ) => {
0 commit comments