5
5
* Use of this source code is governed by an MIT-style license that can be
6
6
* found in the LICENSE file at https://angular.io/license
7
7
*/
8
-
9
8
import { Compiler } from 'webpack' ;
10
9
import { addWarning } from '../../utils/webpack-diagnostics' ;
11
10
12
- interface AfterResolveResult {
13
- request : string ;
11
+ interface ResourceData {
12
+ relativePath : string ;
14
13
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 ;
27
16
}
28
17
29
18
export interface DedupeModuleResolvePluginOptions {
30
19
verbose ?: boolean ;
31
20
}
32
21
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
+
33
51
/**
34
52
* DedupeModuleResolvePlugin is a webpack plugin which dedupes modules with the same name and versions
35
53
* that are laid out in different parts of the node_modules tree.
@@ -46,41 +64,40 @@ export class DedupeModuleResolvePlugin {
46
64
47
65
apply ( compiler : Compiler ) {
48
66
compiler . hooks . compilation . tap ( 'DedupeModuleResolvePlugin' , ( compilation , { normalModuleFactory } ) => {
49
- normalModuleFactory . hooks . afterResolve . tap ( 'DedupeModuleResolvePlugin' , ( result : AfterResolveResult | undefined ) => {
67
+ normalModuleFactory . hooks . afterResolve . tap ( 'DedupeModuleResolvePlugin' , ( result ) => {
50
68
if ( ! result ) {
51
69
return ;
52
70
}
53
71
54
- const { resource, request, resourceResolveData } = result ;
55
- const { descriptionFileData, relativePath } = resourceResolveData ;
72
+ const { packageName, packageVersion, relativePath, resource } = getResourceData ( result ) ;
56
73
57
74
// Empty name or versions are no valid primary entrypoints of a library
58
- if ( ! descriptionFileData . name || ! descriptionFileData . version ) {
75
+ if ( ! packageName || ! packageVersion ) {
59
76
return ;
60
77
}
61
78
62
- const moduleId = descriptionFileData . name + '@' + descriptionFileData . version + ':' + relativePath ;
79
+ const moduleId = packageName + '@' + packageVersion + ':' + relativePath ;
63
80
const prevResolvedModule = this . modules . get ( moduleId ) ;
64
81
65
82
if ( ! prevResolvedModule ) {
66
83
// This is the first time we visit this module.
67
84
this . modules . set ( moduleId , {
68
85
resource,
69
- request,
86
+ request : result . request ,
70
87
} ) ;
71
88
72
89
return ;
73
90
}
74
91
75
92
const { resource : prevResource , request : prevRequest } = prevResolvedModule ;
76
- if ( result . resource === prevResource ) {
93
+ if ( resource === prevResource ) {
77
94
// No deduping needed.
78
95
// Current path and previously resolved path are the same.
79
96
return ;
80
97
}
81
98
82
99
if ( this . options ?. verbose ) {
83
- addWarning ( compilation , `[DedupeModuleResolvePlugin]: ${ result . resource } -> ${ prevResource } ` ) ;
100
+ addWarning ( compilation , `[DedupeModuleResolvePlugin]: ${ resource } -> ${ prevResource } ` ) ;
84
101
}
85
102
86
103
// Alter current request with previously resolved module.
0 commit comments