Skip to content

Commit e8c8796

Browse files
refactor: loader (webpack-contrib#950)
1 parent 2fa6389 commit e8c8796

File tree

2 files changed

+245
-207
lines changed

2 files changed

+245
-207
lines changed

src/index.js

+27-61
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@ import {
1111
isUrlRequest,
1212
getRemainingRequest,
1313
getCurrentRequest,
14-
stringifyRequest,
1514
} from 'loader-utils';
1615

1716
import schema from './options.json';
1817
import { importParser, icssParser, urlParser } from './plugins';
1918
import {
2019
normalizeSourceMap,
2120
getModulesPlugins,
22-
placholderRegExps,
2321
getImportPrefix,
24-
getImportItemReplacer,
22+
getIcssItemReplacer,
2523
getFilter,
26-
getExports,
27-
getImports,
24+
getRuntimeCode,
25+
getImportCode,
26+
getModuleCode,
27+
getExportCode,
2828
} from './utils';
2929
import Warning from './Warning';
3030
import CssSyntaxError from './CssSyntaxError';
@@ -103,71 +103,37 @@ export default function loader(content, map, meta) {
103103
.warnings()
104104
.forEach((warning) => this.emitWarning(new Warning(warning)));
105105

106-
const messages = result.messages || [];
107-
const { exportOnlyLocals, importLoaders, exportLocalsStyle } = options;
106+
if (!result.messages) {
107+
// eslint-disable-next-line no-param-reassign
108+
result.messages = [];
109+
}
108110

111+
const {
112+
exportOnlyLocals: onlyLocals,
113+
exportLocalsStyle: localsStyle,
114+
} = options;
109115
// Run other loader (`postcss-loader`, `sass-loader` and etc) for importing CSS
110-
const importPrefix = getImportPrefix(this, importLoaders);
111-
116+
const importPrefix = getImportPrefix(this, options.importLoaders);
112117
// Prepare replacer to change from `___CSS_LOADER_IMPORT___INDEX___` to `require('./file.css').locals`
113-
const importItemReplacer = getImportItemReplacer(
114-
messages,
118+
const replacer = getIcssItemReplacer(
119+
result,
115120
this,
116121
importPrefix,
117-
exportOnlyLocals
118-
);
119-
120-
const exportItems = getExports(
121-
messages,
122-
exportLocalsStyle,
123-
importItemReplacer
124-
);
125-
126-
const exportsCode =
127-
exportItems.length > 0
128-
? exportOnlyLocals
129-
? `module.exports = {\n${exportItems.join(',\n')}\n};`
130-
: `// Exports\nexports.locals = {\n${exportItems.join(',\n')}\n};`
131-
: '';
132-
133-
if (exportOnlyLocals) {
134-
return callback(null, exportsCode);
135-
}
136-
137-
let cssAsString = JSON.stringify(result.css).replace(
138-
placholderRegExps.importItemG,
139-
importItemReplacer
122+
onlyLocals
140123
);
141124

142-
const importItems = getImports(
143-
messages,
125+
// eslint-disable-next-line no-param-reassign
126+
result.cssLoaderBuildInfo = {
127+
onlyLocals,
128+
localsStyle,
144129
importPrefix,
145-
this,
146-
(message) => {
147-
if (message.type !== 'url') {
148-
return;
149-
}
130+
replacer,
131+
};
150132

151-
const { placeholder } = message.item;
152-
153-
cssAsString = cssAsString.replace(
154-
new RegExp(placeholder, 'g'),
155-
() => `" + ${placeholder} + "`
156-
);
157-
}
158-
);
159-
160-
const runtimeCode = `exports = module.exports = require(${stringifyRequest(
161-
this,
162-
require.resolve('./runtime/api')
163-
)})(${!!sourceMap});\n`;
164-
const importCode =
165-
importItems.length > 0
166-
? `// Imports\n${importItems.join('\n')}\n\n`
167-
: '';
168-
const moduleCode = `// Module\nexports.push([module.id, ${cssAsString}, ""${
169-
result.map ? `,${result.map}` : ''
170-
}]);\n\n`;
133+
const runtimeCode = getRuntimeCode(result, this, sourceMap);
134+
const importCode = getImportCode(result, this);
135+
const moduleCode = getModuleCode(result);
136+
const exportsCode = getExportCode(result);
171137

172138
return callback(
173139
null,

0 commit comments

Comments
 (0)