Skip to content

Commit 11a8a79

Browse files
refactor: import
1 parent 898eeae commit 11a8a79

11 files changed

+246
-121
lines changed

src/index.js

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
isUrlRequest,
1212
getRemainingRequest,
1313
getCurrentRequest,
14-
stringifyRequest,
1514
} from 'loader-utils';
1615

1716
import schema from './options.json';
@@ -21,8 +20,10 @@ import {
2120
getModulesPlugins,
2221
getImportPrefix,
2322
getFilter,
23+
getApiCode,
2424
getImportCode,
25-
getExportType,
25+
getModuleCode,
26+
getExportCode,
2627
prepareCode,
2728
} from './utils';
2829
import Warning from './Warning';
@@ -61,15 +62,22 @@ export default function loader(content, map, meta) {
6162
plugins.push(...getModulesPlugins(options, this));
6263
}
6364

65+
// Run other loader (`postcss-loader`, `sass-loader` and etc) for importing CSS
66+
const importPrefix = getImportPrefix(this, options.importLoaders);
67+
6468
plugins.push(
6569
icssParser({
70+
loaderContext: this,
71+
importPrefix,
6672
exportLocalsStyle: options.exportLocalsStyle,
6773
})
6874
);
6975

7076
if (options.import !== false) {
7177
plugins.push(
7278
importParser({
79+
loaderContext: this,
80+
importPrefix,
7381
filter: getFilter(options.import, this.resourcePath),
7482
})
7583
);
@@ -78,6 +86,7 @@ export default function loader(content, map, meta) {
7886
if (options.url !== false) {
7987
plugins.push(
8088
urlParser({
89+
loaderContext: this,
8190
filter: getFilter(options.url, this.resourcePath, (value) =>
8291
isUrlRequest(value)
8392
),
@@ -111,23 +120,15 @@ export default function loader(content, map, meta) {
111120
result.messages = [];
112121
}
113122

114-
const {
115-
exportOnlyLocals: onlyLocals,
116-
exportLocalsStyle: localsStyle,
117-
} = options;
118-
// Run other loader (`postcss-loader`, `sass-loader` and etc) for importing CSS
119-
const importPrefix = getImportPrefix(this, options.importLoaders);
123+
const { exportOnlyLocals: onlyLocals } = options;
120124

121-
const buildInfo = {
122-
loaderContext: this,
123-
hasUrlHelper: false,
124-
sourceMap,
125-
result,
126-
onlyLocals,
127-
localsStyle,
128-
importPrefix,
129-
};
125+
const importItems = result.messages
126+
.filter((message) => (message.type === 'import' ? message : false))
127+
.reduce((accumulator, currentValue) => {
128+
accumulator.push(currentValue.import);
130129

130+
return accumulator;
131+
}, []);
131132
const exportItems = result.messages
132133
.filter((message) => (message.type === 'export' ? message : false))
133134
.reduce((accumulator, currentValue) => {
@@ -136,27 +137,20 @@ export default function loader(content, map, meta) {
136137
return accumulator;
137138
}, []);
138139

139-
const importCode = getImportCode(buildInfo);
140-
const moduleCode = !onlyLocals
141-
? `exports.push([module.id, ${JSON.stringify(result.css)}, ""${
142-
sourceMap && result.map ? `,${result.map}` : ''
143-
}]);\n`
144-
: '';
145-
const exportCode =
146-
exportItems.length > 0
147-
? `${getExportType(onlyLocals)} = {\n${exportItems.join(',\n')}\n};`
148-
: false;
149-
const apiCode =
150-
importCode.length > 0 || moduleCode.length > 0
151-
? `exports = module.exports = require(${stringifyRequest(
152-
this,
153-
require.resolve('./runtime/api')
154-
)})(${sourceMap});\n`
155-
: false;
140+
const importCode = getImportCode(importItems, onlyLocals);
141+
const moduleCode = getModuleCode(result, sourceMap, onlyLocals);
142+
const exportCode = getExportCode(exportItems, onlyLocals);
143+
const apiCode = getApiCode(this, sourceMap, importItems, moduleCode);
156144

157145
return callback(
158146
null,
159-
prepareCode({ apiCode, importCode, moduleCode, exportCode }, buildInfo)
147+
prepareCode(
148+
{ apiCode, importCode, moduleCode, exportCode },
149+
result.messages,
150+
this,
151+
importPrefix,
152+
onlyLocals
153+
)
160154
);
161155
})
162156
.catch((error) => {

src/plugins/postcss-icss-parser.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { extractICSS, replaceValueSymbols, replaceSymbols } from 'icss-utils';
33
import loaderUtils from 'loader-utils';
44
import cc from 'camelcase';
55

6+
import { getImportItemCode } from '../utils';
7+
68
const pluginName = 'postcss-icss-parser';
79

810
function hasImportMessage(messages, url) {
@@ -88,10 +90,18 @@ export default postcss.plugin(
8890
});
8991

9092
if (!hasImportMessage(result.messages, url)) {
93+
const media = '';
94+
const { loaderContext, importPrefix } = options;
95+
9196
result.messages.push({
9297
pluginName,
9398
type: 'import',
94-
item: { url, media: '' },
99+
import: getImportItemCode(
100+
{ url, media },
101+
loaderContext,
102+
importPrefix
103+
),
104+
item: { url, media },
95105
});
96106
}
97107
}
@@ -100,14 +110,19 @@ export default postcss.plugin(
100110
replaceSymbols(css, importReplacements);
101111

102112
for (const exportName of Object.keys(icssExports)) {
113+
const name = exportName;
114+
const value = replaceValueSymbols(
115+
icssExports[name],
116+
importReplacements
117+
);
118+
103119
result.messages.push({
104120
pluginName,
105-
export: getExportItem(
106-
exportName,
107-
replaceValueSymbols(icssExports[exportName], importReplacements),
108-
options.exportLocalsStyle
109-
).join(',\n'),
121+
export: getExportItem(name, value, options.exportLocalsStyle).join(
122+
',\n'
123+
),
110124
type: 'export',
125+
item: { name, value },
111126
});
112127
}
113128
}

src/plugins/postcss-import-parser.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import postcss from 'postcss';
22
import valueParser from 'postcss-value-parser';
33

4+
import { getImportItemCode } from '../utils';
5+
46
const pluginName = 'postcss-import-parser';
57

68
function getArg(nodes) {
@@ -102,7 +104,15 @@ export default postcss.plugin(
102104
const paths = uniq(traversed);
103105

104106
paths.forEach((item) => {
105-
result.messages.push({ pluginName, type: 'import', item });
107+
result.messages.push({
108+
pluginName,
109+
type: 'import',
110+
import: getImportItemCode(
111+
item,
112+
options.loaderContext,
113+
options.importPrefix
114+
),
115+
});
106116
});
107117
}
108118
);

src/plugins/postcss-url-parser.js

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import postcss from 'postcss';
22
import valueParser from 'postcss-value-parser';
33

4+
import { getUrlHelperCode, getUrlItemCode } from '../utils';
5+
46
const pluginName = 'postcss-url-parser';
57

68
const isUrlFunc = /url/i;
@@ -133,16 +135,35 @@ export default postcss.plugin(
133135

134136
const placeholders = [];
135137

138+
let hasUrlHelper = false;
139+
136140
paths.forEach((path, index) => {
141+
const { loaderContext } = options;
137142
const placeholder = `___CSS_LOADER_URL___${index}___`;
138143
const { url, needQuotes } = path;
139144

140145
placeholders.push({ placeholder, path });
141146

147+
if (!hasUrlHelper) {
148+
result.messages.push({
149+
pluginName,
150+
type: 'import',
151+
import: getUrlHelperCode(loaderContext),
152+
});
153+
154+
// eslint-disable-next-line no-param-reassign
155+
hasUrlHelper = true;
156+
}
157+
142158
result.messages.push({
143159
pluginName,
144-
type: 'url',
145-
item: { url, placeholder, needQuotes },
160+
type: 'import',
161+
import: getUrlItemCode(
162+
{ url, placeholder, needQuotes },
163+
loaderContext
164+
),
165+
importType: 'url',
166+
placeholder,
146167
});
147168
});
148169

0 commit comments

Comments
 (0)