Skip to content

Commit 3275ef0

Browse files
refactor: improve resolving (webpack-contrib#1327)
1 parent 8d8531c commit 3275ef0

File tree

12 files changed

+1719
-390
lines changed

12 files changed

+1719
-390
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ npm-debug.log*
88
/local
99
/reports
1010
/node_modules
11+
/test/outputs
1112
/test/fixtures/import/import-absolute.css
1213
/test/fixtures/url/url-absolute.css
1314
/test/fixtures/modules/composes/composes-absolute.css

src/index.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,7 @@ export default async function loader(content, map, meta) {
8686
const urlPluginImports = [];
8787

8888
if (shouldUseURLPlugin(options)) {
89-
const urlResolver = this.getResolve({
90-
conditionNames: ["asset"],
91-
mainFields: ["asset"],
92-
mainFiles: [],
93-
extensions: [],
94-
});
89+
const needToResolveURL = !options.esModule;
9590

9691
plugins.push(
9792
urlParser({
@@ -100,7 +95,11 @@ export default async function loader(content, map, meta) {
10095
context: this.context,
10196
rootContext: this.rootContext,
10297
filter: getFilter(options.url.filter, this.resourcePath),
103-
resolver: urlResolver,
98+
needToResolveURL,
99+
resolver: needToResolveURL
100+
? this.getResolve({ mainFiles: [], extensions: [] })
101+
: // eslint-disable-next-line no-undefined
102+
undefined,
104103
urlHandler: (url) => stringifyRequest(this, url),
105104
})
106105
);

src/plugins/postcss-url-parser.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import valueParser from "postcss-value-parser";
22

33
import {
4+
resolveRequests,
45
normalizeUrl,
56
requestify,
6-
resolveRequests,
77
isUrlRequestable,
88
WEBPACK_IGNORE_COMMENT_REGEXP,
99
} from "../utils";
@@ -302,7 +302,17 @@ const plugin = (options = {}) => {
302302
let hash = query ? "?" : "";
303303
hash += hashOrQuery ? `#${hashOrQuery}` : "";
304304

305-
const request = requestify(pathname, options.rootContext);
305+
const { needToResolveURL, rootContext } = options;
306+
const request = requestify(
307+
pathname,
308+
rootContext,
309+
needToResolveURL
310+
);
311+
312+
if (!needToResolveURL) {
313+
// eslint-disable-next-line consistent-return
314+
return { ...parsedDeclaration, url: request, hash };
315+
}
306316

307317
const { resolver, context } = options;
308318
const resolvedUrl = await resolveRequests(resolver, context, [
@@ -359,7 +369,9 @@ const plugin = (options = {}) => {
359369
options.imports.push({
360370
type: "url",
361371
importName,
362-
url: options.urlHandler(newUrl),
372+
url: options.needToResolveURL
373+
? options.urlHandler(newUrl)
374+
: JSON.stringify(newUrl),
363375
index,
364376
});
365377
}

src/utils.js

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,14 @@ function stringifyRequest(loaderContext, request) {
5656
);
5757
}
5858

59-
// we can't use path.win32.isAbsolute because it also matches paths starting with a forward slash
60-
const matchNativeWin32Path = /^[A-Z]:[/\\]|^\\\\/i;
59+
// We can't use path.win32.isAbsolute because it also matches paths starting with a forward slash
60+
const IS_NATIVE_WIN32_PATH = /^[a-z]:[/\\]|^\\\\/i;
61+
const IS_MODULE_REQUEST = /^[^?]*~/;
6162

6263
function urlToRequest(url, root) {
63-
const moduleRequestRegex = /^[^?]*~/;
6464
let request;
6565

66-
if (matchNativeWin32Path.test(url)) {
66+
if (IS_NATIVE_WIN32_PATH.test(url)) {
6767
// absolute windows path, keep it
6868
request = url;
6969
} else if (typeof root !== "undefined" && /^\//.test(url)) {
@@ -77,8 +77,8 @@ function urlToRequest(url, root) {
7777
}
7878

7979
// A `~` makes the url an module
80-
if (moduleRequestRegex.test(request)) {
81-
request = request.replace(moduleRequestRegex, "");
80+
if (IS_MODULE_REQUEST.test(request)) {
81+
request = request.replace(IS_MODULE_REQUEST, "");
8282
}
8383

8484
return request;
@@ -459,14 +459,27 @@ function normalizeUrl(url, isStringValue) {
459459
return normalizedUrl;
460460
}
461461

462-
function requestify(url, rootContext) {
463-
if (/^file:/i.test(url)) {
464-
return fileURLToPath(url);
462+
function requestify(url, rootContext, needToResolveURL = true) {
463+
if (needToResolveURL) {
464+
if (/^file:/i.test(url)) {
465+
return fileURLToPath(url);
466+
}
467+
468+
return url.charAt(0) === "/"
469+
? urlToRequest(url, rootContext)
470+
: urlToRequest(url);
471+
}
472+
473+
if (url.charAt(0) === "/" || /^file:/i.test(url)) {
474+
return url;
465475
}
466476

467-
return url.charAt(0) === "/"
468-
? urlToRequest(url, rootContext)
469-
: urlToRequest(url);
477+
// A `~` makes the url an module
478+
if (IS_MODULE_REQUEST.test(url)) {
479+
return url.replace(IS_MODULE_REQUEST, "");
480+
}
481+
482+
return url;
470483
}
471484

472485
function getFilter(filter, resourcePath) {
@@ -744,7 +757,6 @@ function getModulesPlugins(options, loaderContext) {
744757
return plugins;
745758
}
746759

747-
const IS_NATIVE_WIN32_PATH = /^[a-z]:[/\\]|^\\\\/i;
748760
const ABSOLUTE_SCHEME = /^[a-z0-9+\-.]+:/i;
749761

750762
function getURLType(source) {

0 commit comments

Comments
 (0)