Skip to content

Commit 2c200d1

Browse files
authored
Merge pull request #15585 from webpack/refactor/support-context-in-dependency
support context in Dependency
2 parents 129477d + 5605e53 commit 2c200d1

13 files changed

Lines changed: 85 additions & 12 deletions

File tree

lib/Compilation.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1436,7 +1436,7 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
14361436
* @returns {void}
14371437
*/
14381438
_processModuleDependencies(module, callback) {
1439-
/** @type {Array<{factory: ModuleFactory, dependencies: Dependency[], originModule: Module|null}>} */
1439+
/** @type {Array<{factory: ModuleFactory, dependencies: Dependency[], context: string|undefined, originModule: Module|null}>} */
14401440
const sortedDependencies = [];
14411441

14421442
/** @type {DependenciesBlock} */
@@ -1668,6 +1668,7 @@ BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a si
16681668
sortedDependencies.push({
16691669
factory: factoryCacheKey2,
16701670
dependencies: list,
1671+
context: dep.getContext(),
16711672
originModule: module
16721673
});
16731674
}

lib/ContextModuleFactory.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,6 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
292292
} = options;
293293
if (!regExp || !resource) return callback(null, []);
294294

295-
let severalContexts = false;
296295
const addDirectoryChecked = (ctx, directory, visited, callback) => {
297296
fs.realpath(directory, (err, realPath) => {
298297
if (err) return callback(err);
@@ -359,15 +358,13 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
359358
alternatives = alternatives
360359
.filter(obj => regExp.test(obj.request))
361360
.map(obj => {
362-
const request = severalContexts
363-
? join(fs, obj.context, obj.request)
364-
: obj.request;
365361
const dep = new ContextElementDependency(
366-
request + resourceQuery + resourceFragment,
362+
`${obj.request}${resourceQuery}${resourceFragment}`,
367363
obj.request,
368364
typePrefix,
369365
category,
370-
referencedExports
366+
referencedExports,
367+
obj.context
371368
);
372369
dep.optional = true;
373370
return dep;
@@ -414,7 +411,6 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
414411
if (typeof resource === "string") {
415412
visitResource(resource, callback);
416413
} else {
417-
severalContexts = true;
418414
asyncLib.map(resource, visitResource, (err, result) => {
419415
if (err) return callback(err);
420416

lib/Dependency.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,13 @@ class Dependency {
182182
this._loc = undefined;
183183
}
184184

185+
/**
186+
* @returns {string | undefined} a request context
187+
*/
188+
getContext() {
189+
return undefined;
190+
}
191+
185192
/**
186193
* @returns {string | null} an identifier to merge equal requests
187194
*/

lib/dependencies/ContextElementDependency.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,27 @@ const ModuleDependency = require("./ModuleDependency");
1414
/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
1515

1616
class ContextElementDependency extends ModuleDependency {
17-
constructor(request, userRequest, typePrefix, category, referencedExports) {
17+
/**
18+
* @param {string} request request
19+
* @param {string|undefined} userRequest user request
20+
* @param {string} typePrefix type prefix
21+
* @param {string} category category
22+
* @param {string[][]=} referencedExports referenced exports
23+
* @param {string=} context context
24+
*/
25+
constructor(
26+
request,
27+
userRequest,
28+
typePrefix,
29+
category,
30+
referencedExports,
31+
context
32+
) {
1833
super(request);
1934
this.referencedExports = referencedExports;
2035
this._typePrefix = typePrefix;
2136
this._category = category;
37+
this._context = context || undefined;
2238

2339
if (userRequest) {
2440
this.userRequest = userRequest;
@@ -33,6 +49,20 @@ class ContextElementDependency extends ModuleDependency {
3349
return "context element";
3450
}
3551

52+
/**
53+
* @returns {string | undefined} a request context
54+
*/
55+
getContext() {
56+
return this._context;
57+
}
58+
59+
/**
60+
* @returns {string | null} an identifier to merge equal requests
61+
*/
62+
getResourceIdentifier() {
63+
return `context${this._context || ""}|${super.getResourceIdentifier()}`;
64+
}
65+
3666
get category() {
3767
return this._category;
3868
}
@@ -56,6 +86,7 @@ class ContextElementDependency extends ModuleDependency {
5686
const { write } = context;
5787
write(this._typePrefix);
5888
write(this._category);
89+
write(this._context);
5990
write(this.referencedExports);
6091
super.serialize(context);
6192
}
@@ -64,6 +95,7 @@ class ContextElementDependency extends ModuleDependency {
6495
const { read } = context;
6596
this._typePrefix = read();
6697
this._category = read();
98+
this._context = read();
6799
this.referencedExports = read();
68100
super.deserialize(context);
69101
}

test/ContextModuleFactory.unittest.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,10 @@ describe("ContextModuleFactory", () => {
148148
expect(res).not.toStrictEqual([]);
149149
expect(Array.isArray(res)).toBe(true);
150150
expect(res.map(r => r.request)).toEqual([
151-
"/a/B/a?query#hash",
152-
"/b/A/b?query#hash"
151+
"./B/a?query#hash",
152+
"./A/b?query#hash"
153153
]);
154+
expect(res.map(r => r.getContext())).toEqual(["/a", "/b"]);
154155
expect(res.map(r => r.userRequest)).toEqual(["./B/a", "./A/b"]);
155156
done();
156157
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const locales = import.meta.webpackContext('./locales', {
2+
recursive: false,
3+
regExp: /(en|hu)\.json$/i,
4+
});
5+
const vuetify = import.meta.webpackContext('vuetify/lib/locale', {
6+
recursive: false,
7+
regExp: /(en|hu)\.json$/i,
8+
});
9+
10+
it('should resolve "./locales"', () => {
11+
expect(locales("./en.json")).toEqual({});
12+
expect(() => locales("./hu.json")).toThrow();
13+
});
14+
15+
it('should resolve "vuetify"', () => {
16+
expect(vuetify("./en.json")).toEqual({});
17+
expect(vuetify("./hu.json")).toEqual({});
18+
expect(() => vuetify("./ru.json")).toThrow();
19+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/en.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/hu.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/ru.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)