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-
98import { Compiler } from 'webpack' ;
109import { 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
2918export 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