Skip to content

Commit 16fabdd

Browse files
clydinalan-agius4
authored andcommitted
refactor(@angular-devkit/build-angular): support dedupe plugin with Webpack 5
The structure of the data from the `afterResolve` hook has changed in Webpack 5. This change provides compatibility for both the Webpack 5+ and Webpack 4 variants.
1 parent ee4e1b2 commit 16fabdd

File tree

1 file changed

+40
-23
lines changed

1 file changed

+40
-23
lines changed

packages/angular_devkit/build_angular/src/angular-cli-files/plugins/dedupe-module-resolve-plugin.ts

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,49 @@
55
* Use of this source code is governed by an MIT-style license that can be
66
* found in the LICENSE file at https://angular.io/license
77
*/
8-
98
import { Compiler } from 'webpack';
109
import { addWarning } from '../../utils/webpack-diagnostics';
1110

12-
interface AfterResolveResult {
13-
request: string;
11+
interface ResourceData {
12+
relativePath: string;
1413
resource: string;
15-
context: {
16-
issuer: string;
17-
};
18-
resourceResolveData: {
19-
relativePath: string;
20-
descriptionFileRoot: string;
21-
descriptionFilePath: string;
22-
descriptionFileData: {
23-
name?: string;
24-
version?: string;
25-
};
26-
};
14+
packageName?: string;
15+
packageVersion?: string;
2716
}
2817

2918
export interface DedupeModuleResolvePluginOptions {
3019
verbose?: boolean;
3120
}
3221

22+
// tslint:disable-next-line: no-any
23+
function getResourceData(resolveData: any): ResourceData {
24+
if (resolveData.createData) {
25+
// Webpack 5+
26+
const {
27+
descriptionFileData,
28+
relativePath,
29+
resource,
30+
} = resolveData.createData.resourceResolveData;
31+
32+
return {
33+
packageName: descriptionFileData.name,
34+
packageVersion: descriptionFileData.version,
35+
relativePath,
36+
resource,
37+
};
38+
} else {
39+
// Webpack 4
40+
const { resource, resourceResolveData } = resolveData;
41+
42+
return {
43+
packageName: resourceResolveData.descriptionFileData.name,
44+
packageVersion: resourceResolveData.descriptionFileData.version,
45+
relativePath: resourceResolveData.relativePath,
46+
resource: resource,
47+
};
48+
}
49+
}
50+
3351
/**
3452
* DedupeModuleResolvePlugin is a webpack plugin which dedupes modules with the same name and versions
3553
* that are laid out in different parts of the node_modules tree.
@@ -46,41 +64,40 @@ export class DedupeModuleResolvePlugin {
4664

4765
apply(compiler: Compiler) {
4866
compiler.hooks.compilation.tap('DedupeModuleResolvePlugin', (compilation, { normalModuleFactory }) => {
49-
normalModuleFactory.hooks.afterResolve.tap('DedupeModuleResolvePlugin', (result: AfterResolveResult | undefined) => {
67+
normalModuleFactory.hooks.afterResolve.tap('DedupeModuleResolvePlugin', (result) => {
5068
if (!result) {
5169
return;
5270
}
5371

54-
const { resource, request, resourceResolveData } = result;
55-
const { descriptionFileData, relativePath } = resourceResolveData;
72+
const { packageName, packageVersion, relativePath, resource } = getResourceData(result);
5673

5774
// Empty name or versions are no valid primary entrypoints of a library
58-
if (!descriptionFileData.name || !descriptionFileData.version) {
75+
if (!packageName || !packageVersion) {
5976
return;
6077
}
6178

62-
const moduleId = descriptionFileData.name + '@' + descriptionFileData.version + ':' + relativePath;
79+
const moduleId = packageName + '@' + packageVersion + ':' + relativePath;
6380
const prevResolvedModule = this.modules.get(moduleId);
6481

6582
if (!prevResolvedModule) {
6683
// This is the first time we visit this module.
6784
this.modules.set(moduleId, {
6885
resource,
69-
request,
86+
request: result.request,
7087
});
7188

7289
return;
7390
}
7491

7592
const { resource: prevResource, request: prevRequest } = prevResolvedModule;
76-
if (result.resource === prevResource) {
93+
if (resource === prevResource) {
7794
// No deduping needed.
7895
// Current path and previously resolved path are the same.
7996
return;
8097
}
8198

8299
if (this.options?.verbose) {
83-
addWarning(compilation, `[DedupeModuleResolvePlugin]: ${result.resource} -> ${prevResource}`);
100+
addWarning(compilation, `[DedupeModuleResolvePlugin]: ${resource} -> ${prevResource}`);
84101
}
85102

86103
// Alter current request with previously resolved module.

0 commit comments

Comments
 (0)