@@ -51,11 +51,6 @@ export interface AngularWebpackPluginOptions {
51
51
inlineStyleFileExtension ?: string ;
52
52
}
53
53
54
- // Add support for missing properties in Webpack types as well as the loader's file emitter
55
- interface WebpackCompilation extends Compilation {
56
- [ AngularPluginSymbol ] : FileEmitterCollection ;
57
- }
58
-
59
54
function initializeNgccProcessor (
60
55
compiler : Compiler ,
61
56
tsconfig : string ,
@@ -89,6 +84,7 @@ function hashContent(content: string): Uint8Array {
89
84
}
90
85
91
86
const PLUGIN_NAME = 'angular-compiler' ;
87
+ const compilationFileEmitters = new WeakMap < Compilation , FileEmitterCollection > ( ) ;
92
88
93
89
export class AngularWebpackPlugin {
94
90
private readonly pluginOptions : AngularWebpackPluginOptions ;
@@ -153,14 +149,9 @@ export class AngularWebpackPlugin {
153
149
let ngccProcessor : NgccProcessor | undefined ;
154
150
let resourceLoader : WebpackResourceLoader | undefined ;
155
151
let previousUnused : Set < string > | undefined ;
156
- compiler . hooks . thisCompilation . tap ( PLUGIN_NAME , ( thisCompilation ) => {
157
- const compilation = thisCompilation as WebpackCompilation ;
158
-
152
+ compiler . hooks . thisCompilation . tap ( PLUGIN_NAME , ( compilation ) => {
159
153
// Register plugin to ensure deterministic emit order in multi-plugin usage
160
- if ( ! compilation [ AngularPluginSymbol ] ) {
161
- compilation [ AngularPluginSymbol ] = new FileEmitterCollection ( ) ;
162
- }
163
- const emitRegistration = compilation [ AngularPluginSymbol ] . register ( ) ;
154
+ const emitRegistration = this . registerWithCompilation ( compilation ) ;
164
155
165
156
this . watchMode = compiler . watchMode ;
166
157
@@ -184,7 +175,7 @@ export class AngularWebpackPlugin {
184
175
}
185
176
186
177
// Setup and read TypeScript and Angular compiler configuration
187
- const { compilerOptions, rootNames, errors } = this . loadConfiguration ( compilation ) ;
178
+ const { compilerOptions, rootNames, errors } = this . loadConfiguration ( ) ;
188
179
189
180
// Create diagnostics reporter and report configuration file errors
190
181
const diagnosticsReporter = createDiagnosticsReporter ( compilation ) ;
@@ -316,6 +307,23 @@ export class AngularWebpackPlugin {
316
307
} ) ;
317
308
}
318
309
310
+ private registerWithCompilation ( compilation : Compilation ) {
311
+ let fileEmitters = compilationFileEmitters . get ( compilation ) ;
312
+ if ( ! fileEmitters ) {
313
+ fileEmitters = new FileEmitterCollection ( ) ;
314
+ compilationFileEmitters . set ( compilation , fileEmitters ) ;
315
+ compilation . compiler . webpack . NormalModule . getCompilationHooks ( compilation ) . loader . tap (
316
+ PLUGIN_NAME ,
317
+ ( loaderContext : { [ AngularPluginSymbol ] ?: FileEmitterCollection } ) => {
318
+ loaderContext [ AngularPluginSymbol ] = fileEmitters ;
319
+ } ,
320
+ ) ;
321
+ }
322
+ const emitRegistration = fileEmitters . register ( ) ;
323
+
324
+ return emitRegistration ;
325
+ }
326
+
319
327
private markResourceUsed ( normalizedResourcePath : string , currentUnused : Set < string > ) : void {
320
328
if ( ! currentUnused . has ( normalizedResourcePath ) ) {
321
329
return ;
@@ -333,7 +341,7 @@ export class AngularWebpackPlugin {
333
341
334
342
private async rebuildRequiredFiles (
335
343
modules : Iterable < Module > ,
336
- compilation : WebpackCompilation ,
344
+ compilation : Compilation ,
337
345
fileEmitter : FileEmitter ,
338
346
) : Promise < void > {
339
347
if ( this . requiredFilesToEmit . size === 0 ) {
@@ -379,7 +387,7 @@ export class AngularWebpackPlugin {
379
387
this . requiredFilesToEmitCache . clear ( ) ;
380
388
}
381
389
382
- private loadConfiguration ( compilation : WebpackCompilation ) {
390
+ private loadConfiguration ( ) {
383
391
const {
384
392
options : compilerOptions ,
385
393
rootNames,
0 commit comments