Skip to content

Commit 61633aa

Browse files
committed
remove prepend in favor of replaces improve code style in ContextDependencyHelpers
1 parent 73dff6c commit 61633aa

File tree

6 files changed

+136
-52
lines changed

6 files changed

+136
-52
lines changed

lib/dependencies/ContextDependencyHelpers.js

Lines changed: 78 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,32 @@ const quotemeta = str => {
1515
return str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&");
1616
};
1717

18+
const splitContextFromPrefix = prefix => {
19+
const idx = prefix.lastIndexOf("/");
20+
let context = ".";
21+
if (idx >= 0) {
22+
context = prefix.substr(0, idx);
23+
prefix = `.${prefix.substr(idx)}`;
24+
}
25+
return {
26+
context,
27+
prefix
28+
};
29+
};
30+
31+
const splitQueryFromPostfix = postfix => {
32+
const idx = postfix.indexOf("?");
33+
let query = "";
34+
if (idx >= 0) {
35+
query = postfix.substr(idx);
36+
postfix = postfix.substr(0, idx);
37+
}
38+
return {
39+
postfix,
40+
query
41+
};
42+
};
43+
1844
ContextDependencyHelpers.create = (
1945
Dep,
2046
range,
@@ -23,38 +49,30 @@ ContextDependencyHelpers.create = (
2349
options,
2450
contextOptions
2551
) => {
26-
let dep;
27-
let prefix;
28-
let postfix;
29-
let prefixRange;
30-
let valueRange;
31-
let idx;
32-
let context;
33-
let regExp;
3452
if (param.isTemplateString()) {
35-
prefix = param.quasis[0].string;
36-
postfix =
53+
let prefixRaw = param.quasis[0].string;
54+
let postfixRaw =
3755
param.quasis.length > 1
3856
? param.quasis[param.quasis.length - 1].string
3957
: "";
40-
prefixRange = [param.quasis[0].range[0], param.quasis[0].range[1]];
41-
valueRange = param.range;
42-
idx = prefix.lastIndexOf("/");
43-
context = ".";
44-
if (idx >= 0) {
45-
context = prefix.substr(0, idx);
46-
prefix = `.${prefix.substr(idx)}`;
47-
}
58+
const prefixRange = [param.quasis[0].range[0], param.quasis[0].range[1]];
59+
const postfixRange =
60+
param.quasis.length > 1
61+
? param.quasis[param.quasis.length - 1].range
62+
: "";
63+
const valueRange = param.range;
64+
const { context, prefix } = splitContextFromPrefix(prefixRaw);
65+
const { postfix, query } = splitQueryFromPostfix(postfixRaw);
4866
// If there are more than two quasis, maybe the generated RegExp can be more precise?
49-
regExp = new RegExp(
67+
const regExp = new RegExp(
5068
`^${quotemeta(prefix)}${options.wrappedContextRegExp.source}${quotemeta(
5169
postfix
5270
)}$`
5371
);
54-
dep = new Dep(
72+
const dep = new Dep(
5573
Object.assign(
5674
{
57-
request: context,
75+
request: context + query,
5876
recursive: options.wrappedContextRecursive,
5977
regExp,
6078
mode: "sync"
@@ -65,12 +83,20 @@ ContextDependencyHelpers.create = (
6583
valueRange
6684
);
6785
dep.loc = expr.loc;
68-
dep.replaces = [
69-
{
86+
const replaces = [];
87+
if (prefixRange && prefix !== prefixRaw) {
88+
replaces.push({
7089
range: prefixRange,
7190
value: prefix
72-
}
73-
];
91+
});
92+
}
93+
if (postfixRange && postfix !== postfixRaw) {
94+
replaces.push({
95+
range: postfixRange,
96+
value: postfix
97+
});
98+
}
99+
dep.replaces = replaces;
74100
dep.critical =
75101
options.wrappedContextCritical &&
76102
"a part of the request of a dependency is an expression";
@@ -80,30 +106,26 @@ ContextDependencyHelpers.create = (
80106
((param.prefix && param.prefix.isString()) ||
81107
(param.postfix && param.postfix.isString()))
82108
) {
83-
prefix = param.prefix && param.prefix.isString() ? param.prefix.string : "";
84-
postfix =
109+
let prefixRaw =
110+
param.prefix && param.prefix.isString() ? param.prefix.string : "";
111+
let postfixRaw =
85112
param.postfix && param.postfix.isString() ? param.postfix.string : "";
86-
prefixRange =
113+
const prefixRange =
87114
param.prefix && param.prefix.isString() ? param.prefix.range : null;
88-
valueRange = [
89-
prefixRange ? prefixRange[1] : param.range[0],
90-
param.range[1]
91-
];
92-
idx = prefix.lastIndexOf("/");
93-
context = ".";
94-
if (idx >= 0) {
95-
context = prefix.substr(0, idx);
96-
prefix = `.${prefix.substr(idx)}`;
97-
}
98-
regExp = new RegExp(
115+
const postfixRange =
116+
param.postfix && param.postfix.isString() ? param.postfix.range : null;
117+
const valueRange = param.range;
118+
const { context, prefix } = splitContextFromPrefix(prefixRaw);
119+
const { postfix, query } = splitQueryFromPostfix(postfixRaw);
120+
const regExp = new RegExp(
99121
`^${quotemeta(prefix)}${options.wrappedContextRegExp.source}${quotemeta(
100122
postfix
101123
)}$`
102124
);
103-
dep = new Dep(
125+
const dep = new Dep(
104126
Object.assign(
105127
{
106-
request: context,
128+
request: context + query,
107129
recursive: options.wrappedContextRecursive,
108130
regExp,
109131
mode: "sync"
@@ -114,13 +136,26 @@ ContextDependencyHelpers.create = (
114136
valueRange
115137
);
116138
dep.loc = expr.loc;
117-
dep.prepend = param.prefix && param.prefix.isString() ? prefix : null;
139+
const replaces = [];
140+
if (prefixRange && prefix !== prefixRaw) {
141+
replaces.push({
142+
range: prefixRange,
143+
value: JSON.stringify(prefix)
144+
});
145+
}
146+
if (postfixRange && postfix !== postfixRaw) {
147+
replaces.push({
148+
range: postfixRange,
149+
value: JSON.stringify(postfix)
150+
});
151+
}
152+
dep.replaces = replaces;
118153
dep.critical =
119154
options.wrappedContextCritical &&
120155
"a part of the request of a dependency is an expression";
121156
return dep;
122157
} else {
123-
dep = new Dep(
158+
const dep = new Dep(
124159
Object.assign(
125160
{
126161
request: options.exprContextRequest,

lib/dependencies/ContextDependencyTemplateAsId.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class ContextDependencyTemplateAsId {
2020
}
2121
}
2222
source.replace(dep.valueRange[1], dep.range[1] - 1, ")");
23+
// TODO webpack 5 remove `prepend` it's no longer used
2324
source.replace(
2425
dep.range[0],
2526
dep.valueRange[0] - 1,

lib/dependencies/ContextDependencyTemplateAsRequireCall.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class ContextDependencyTemplateAsRequireCall {
2020
}
2121
}
2222
source.replace(dep.valueRange[1], dep.range[1] - 1, ")");
23+
// TODO webpack 5 remove `prepend` it's no longer used
2324
source.replace(
2425
dep.range[0],
2526
dep.valueRange[0] - 1,

test/cases/parsing/issue-7778/a.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export default function a() {
2-
return 'a'
2+
return 'a' + __resourceQuery
33
}

test/cases/parsing/issue-7778/abc.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function abc() {
2+
return 'abc' + __resourceQuery
3+
}
Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,57 @@
11
it("should detect query strings in dynamic import as a static value 1 ", function() {
2-
import("./a?queryString").then(({ default: a }) => {
3-
expect(a()).toBe("a");
4-
});
2+
return Promise.all([
3+
import("./a").then(({ default: a }) => {
4+
expect(a()).toBe("a");
5+
}),
6+
import("./abc").then(({ default: a }) => {
7+
expect(a()).toBe("abc");
8+
}),
9+
import("./a?queryString").then(({ default: a }) => {
10+
expect(a()).toBe("a?queryString");
11+
}),
12+
import("./abc?query?String").then(({ default: a }) => {
13+
expect(a()).toBe("abc?query?String");
14+
}),
15+
]);
516
});
617

718
it("should detect query strings in dynamic import as a static value 2", function() {
8-
var testFileName = "a";
9-
10-
import(`./${testFileName}?queryString`).then(({ default: a }) => {
11-
expect(a()).toBe("a");
12-
});
19+
var testFileName = "a";
20+
21+
return Promise.all([
22+
import(`./${testFileName}`).then(({ default: a }) => {
23+
expect(a()).toBe("a");
24+
}),
25+
import(`./${testFileName}bc`).then(({ default: a }) => {
26+
expect(a()).toBe("abc");
27+
}),
28+
import(`./${testFileName}?queryString`).then(({ default: a }) => {
29+
expect(a()).toBe("a?queryString");
30+
}),
31+
import(`./${testFileName}bc?query?String`).then(({ default: a }) => {
32+
expect(a()).toBe("abc?query?String");
33+
})
34+
]);
35+
});
36+
37+
it("should detect query strings in dynamic import as a static value 2", function() {
38+
var testFileName = "a";
39+
40+
return Promise.all([
41+
import("./" + testFileName).then(({ default: a }) => {
42+
expect(a()).toBe("a");
43+
}),
44+
import("./" + testFileName + "").then(({ default: a }) => {
45+
expect(a()).toBe("a");
46+
}),
47+
import("./" + testFileName + "bc").then(({ default: a }) => {
48+
expect(a()).toBe("abc");
49+
}),
50+
import("./" + testFileName + "?queryString").then(({ default: a }) => {
51+
expect(a()).toBe("a?queryString");
52+
}),
53+
import("./" + testFileName + "bc?query?String").then(({ default: a }) => {
54+
expect(a()).toBe("abc?query?String");
55+
})
56+
]);
1357
});

0 commit comments

Comments
 (0)