Skip to content

Commit ac5f413

Browse files
authoredJul 21, 2020
refactor: code
BREAKING CHANGE: inline syntax was changed
1 parent a5c1b5f commit ac5f413

19 files changed

+754
-885
lines changed
 

‎.gitignore

-2
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,3 @@ Thumbs.db
1616
.vscode
1717
*.sublime-project
1818
*.sublime-workspace
19-
/test/fixtures/import/import-absolute.css
20-
/test/fixtures/url/url-absolute.css

‎src/index.js

+89-131
Original file line numberDiff line numberDiff line change
@@ -13,69 +13,55 @@ import Warning from './Warning';
1313
import schema from './options.json';
1414
import { icssParser, importParser, urlParser } from './plugins';
1515
import {
16-
getModulesOptions,
16+
normalizeOptions,
17+
shouldUseModulesPlugins,
18+
shouldUseImportPlugin,
19+
shouldUseURLPlugin,
1720
getPreRequester,
1821
getExportCode,
1922
getFilter,
2023
getImportCode,
2124
getModuleCode,
2225
getModulesPlugins,
2326
normalizeSourceMap,
24-
shouldUseModulesPlugins,
25-
isUrlRequestable,
27+
sortImports,
2628
} from './utils';
2729

28-
export default function loader(content, map, meta) {
29-
const options = getOptions(this);
30+
export default async function loader(content, map, meta) {
31+
const rawOptions = getOptions(this);
3032

31-
validateOptions(schema, options, {
33+
validateOptions(schema, rawOptions, {
3234
name: 'CSS Loader',
3335
baseDataPath: 'options',
3436
});
3537

36-
const sourceMap =
37-
typeof options.sourceMap === 'boolean' ? options.sourceMap : this.sourceMap;
3838
const plugins = [];
39+
const options = normalizeOptions(rawOptions, this);
3940

40-
const exportType = options.onlyLocals ? 'locals' : 'full';
41-
const preRequester = getPreRequester(this);
42-
const urlHandler = (url) =>
43-
stringifyRequest(this, preRequester(options.importLoaders) + url);
44-
45-
const esModule =
46-
typeof options.esModule !== 'undefined' ? options.esModule : true;
47-
48-
let modulesOptions;
49-
50-
if (shouldUseModulesPlugins(options.modules, this.resourcePath)) {
51-
modulesOptions = getModulesOptions(options, this);
52-
53-
if (modulesOptions.namedExport === true && esModule === false) {
54-
this.emitError(
55-
new Error(
56-
'`Options.module.namedExport` cannot be used without `options.esModule`'
57-
)
58-
);
59-
}
60-
61-
plugins.push(...getModulesPlugins(modulesOptions, this));
62-
41+
if (shouldUseModulesPlugins(options)) {
6342
const icssResolver = this.getResolve({
6443
mainFields: ['css', 'style', 'main', '...'],
6544
mainFiles: ['index', '...'],
45+
extensions: [],
46+
conditionNames: ['style'],
6647
});
6748

6849
plugins.push(
50+
...getModulesPlugins(options, this),
6951
icssParser({
7052
context: this.context,
7153
rootContext: this.rootContext,
7254
resolver: icssResolver,
73-
urlHandler,
55+
urlHandler: (url) =>
56+
stringifyRequest(
57+
this,
58+
getPreRequester(this)(options.importLoaders) + url
59+
),
7460
})
7561
);
7662
}
7763

78-
if (options.import !== false && exportType === 'full') {
64+
if (shouldUseImportPlugin(options)) {
7965
const resolver = this.getResolve({
8066
mainFields: ['css', 'style', 'main', '...'],
8167
mainFiles: ['index', '...'],
@@ -90,24 +76,27 @@ export default function loader(content, map, meta) {
9076
rootContext: this.rootContext,
9177
filter: getFilter(options.import, this.resourcePath),
9278
resolver,
93-
urlHandler,
79+
urlHandler: (url) =>
80+
stringifyRequest(
81+
this,
82+
getPreRequester(this)(options.importLoaders) + url
83+
),
9484
})
9585
);
9686
}
9787

98-
if (options.url !== false && exportType === 'full') {
88+
if (shouldUseURLPlugin(options)) {
9989
const urlResolver = this.getResolve({
10090
mainFields: ['asset'],
10191
conditionNames: ['asset'],
92+
extensions: [],
10293
});
10394

10495
plugins.push(
10596
urlParser({
10697
context: this.context,
10798
rootContext: this.rootContext,
108-
filter: getFilter(options.url, this.resourcePath, (value) =>
109-
isUrlRequestable(value)
110-
),
99+
filter: getFilter(options.url, this.resourcePath),
111100
resolver: urlResolver,
112101
urlHandler: (url) => stringifyRequest(this, url),
113102
})
@@ -130,107 +119,76 @@ export default function loader(content, map, meta) {
130119

131120
const callback = this.async();
132121

133-
postcss(plugins)
134-
.process(content, {
122+
let result;
123+
124+
try {
125+
result = await postcss(plugins).process(content, {
135126
from: this.resourcePath,
136127
to: this.resourcePath,
137128
map: options.sourceMap
138129
? {
139130
// Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it
140-
prev: sourceMap && map ? normalizeSourceMap(map) : null,
131+
prev: map ? normalizeSourceMap(map) : null,
141132
inline: false,
142133
annotation: false,
143134
}
144135
: false,
145-
})
146-
.then((result) => {
147-
for (const warning of result.warnings()) {
148-
this.emitWarning(new Warning(warning));
149-
}
150-
151-
const imports = [];
152-
const apiImports = [];
153-
const urlReplacements = [];
154-
const icssReplacements = [];
155-
const exports = [];
156-
157-
for (const message of result.messages) {
158-
// eslint-disable-next-line default-case
159-
switch (message.type) {
160-
case 'import':
161-
imports.push(message.value);
162-
break;
163-
case 'api-import':
164-
apiImports.push(message.value);
165-
break;
166-
case 'url-replacement':
167-
urlReplacements.push(message.value);
168-
break;
169-
case 'icss-replacement':
170-
icssReplacements.push(message.value);
171-
break;
172-
case 'export':
173-
exports.push(message.value);
174-
break;
175-
}
176-
}
177-
178-
/*
179-
* Order
180-
* CSS_LOADER_ICSS_IMPORT: [],
181-
* CSS_LOADER_AT_RULE_IMPORT: [],
182-
* CSS_LOADER_GET_URL_IMPORT: [],
183-
* CSS_LOADER_URL_IMPORT: [],
184-
* CSS_LOADER_URL_REPLACEMENT: [],
185-
* */
186-
187-
imports.sort((a, b) => {
188-
return (
189-
(b.order < a.order) - (a.order < b.order) ||
190-
(b.index < a.index) - (a.index < b.index)
191-
);
192-
});
193-
apiImports.sort((a, b) => {
194-
return (
195-
(b.order < a.order) - (a.order < b.order) ||
196-
(b.index < a.index) - (a.index < b.index)
197-
);
198-
});
199-
200-
const importCode = getImportCode(
201-
this,
202-
exportType,
203-
imports,
204-
esModule,
205-
modulesOptions
206-
);
207-
const moduleCode = getModuleCode(
208-
result,
209-
exportType,
210-
sourceMap,
211-
apiImports,
212-
urlReplacements,
213-
icssReplacements,
214-
esModule,
215-
modulesOptions
216-
);
217-
const exportCode = getExportCode(
218-
exports,
219-
exportType,
220-
icssReplacements,
221-
esModule,
222-
modulesOptions
223-
);
224-
225-
return callback(null, `${importCode}${moduleCode}${exportCode}`);
226-
})
227-
.catch((error) => {
228-
if (error.file) {
229-
this.addDependency(error.file);
230-
}
231-
232-
callback(
233-
error.name === 'CssSyntaxError' ? new CssSyntaxError(error) : error
234-
);
235136
});
137+
} catch (error) {
138+
if (error.file) {
139+
this.addDependency(error.file);
140+
}
141+
142+
callback(
143+
error.name === 'CssSyntaxError' ? new CssSyntaxError(error) : error
144+
);
145+
146+
return;
147+
}
148+
149+
for (const warning of result.warnings()) {
150+
this.emitWarning(new Warning(warning));
151+
}
152+
153+
const imports = [];
154+
const apiImports = [];
155+
const urlReplacements = [];
156+
const icssReplacements = [];
157+
const exports = [];
158+
159+
for (const message of result.messages) {
160+
// eslint-disable-next-line default-case
161+
switch (message.type) {
162+
case 'import':
163+
imports.push(message.value);
164+
break;
165+
case 'api-import':
166+
apiImports.push(message.value);
167+
break;
168+
case 'url-replacement':
169+
urlReplacements.push(message.value);
170+
break;
171+
case 'icss-replacement':
172+
icssReplacements.push(message.value);
173+
break;
174+
case 'export':
175+
exports.push(message.value);
176+
break;
177+
}
178+
}
179+
180+
imports.sort(sortImports);
181+
apiImports.sort(sortImports);
182+
183+
const importCode = getImportCode(this, imports, options);
184+
const moduleCode = getModuleCode(
185+
result,
186+
apiImports,
187+
urlReplacements,
188+
icssReplacements,
189+
options
190+
);
191+
const exportCode = getExportCode(exports, icssReplacements, options);
192+
193+
callback(null, `${importCode}${moduleCode}${exportCode}`);
236194
}

0 commit comments

Comments
 (0)
Please sign in to comment.