@@ -385,13 +385,44 @@ export class AngularCompilerPlugin {
385
385
}
386
386
387
387
const newTsProgram = this . _getTsProgram ( ) ;
388
- if ( oldTsProgram && newTsProgram ) {
388
+ const newProgramSourceFiles = newTsProgram ?. getSourceFiles ( ) ;
389
+ const localDtsFiles = new Set (
390
+ newProgramSourceFiles ?. filter (
391
+ f => f . isDeclarationFile && ! this . _nodeModulesRegExp . test ( f . fileName ) ,
392
+ )
393
+ . map ( f => this . _compilerHost . denormalizePath ( f . fileName ) ) ,
394
+ ) ;
395
+
396
+ if ( ! oldTsProgram ) {
397
+ // Add all non node package dts files as depedencies when not having an old program
398
+ for ( const dts of localDtsFiles ) {
399
+ this . _typeDeps . add ( dts ) ;
400
+ }
401
+ } else if ( oldTsProgram && newProgramSourceFiles ) {
389
402
// The invalidation should only happen if we have an old program
390
403
// as otherwise we will invalidate all the sourcefiles.
391
404
const oldFiles = new Set ( oldTsProgram . getSourceFiles ( ) . map ( sf => sf . fileName ) ) ;
392
- const newFiles = newTsProgram . getSourceFiles ( ) . filter ( sf => ! oldFiles . has ( sf . fileName ) ) ;
393
- for ( const newFile of newFiles ) {
394
- this . _compilerHost . invalidate ( newFile . fileName ) ;
405
+ const newProgramFiles = new Set ( newProgramSourceFiles . map ( sf => sf . fileName ) ) ;
406
+
407
+ for ( const dependency of this . _typeDeps ) {
408
+ // Remove type dependencies of no longer existing files
409
+ if ( ! newProgramFiles . has ( forwardSlashPath ( dependency ) ) ) {
410
+ this . _typeDeps . delete ( dependency ) ;
411
+ }
412
+ }
413
+
414
+ for ( const fileName of newProgramFiles ) {
415
+ if ( oldFiles . has ( fileName ) ) {
416
+ continue ;
417
+ }
418
+
419
+ this . _compilerHost . invalidate ( fileName ) ;
420
+
421
+ const denormalizedFileName = this . _compilerHost . denormalizePath ( fileName ) ;
422
+ if ( localDtsFiles . has ( denormalizedFileName ) ) {
423
+ // Add new dts file as a type depedency
424
+ this . _typeDeps . add ( denormalizedFileName ) ;
425
+ }
395
426
}
396
427
}
397
428
@@ -630,8 +661,7 @@ export class AngularCompilerPlugin {
630
661
631
662
// This function removes a source file name and all its dependencies from the set.
632
663
const removeSourceFile = ( fileName : string , originalModule = false ) => {
633
- if ( unusedSourceFileNames . has ( fileName )
634
- || ( originalModule && typeDepFileNames . has ( fileName ) ) ) {
664
+ if ( unusedSourceFileNames . has ( fileName ) || ( originalModule && typeDepFileNames . has ( fileName ) ) ) {
635
665
unusedSourceFileNames . delete ( fileName ) ;
636
666
if ( originalModule ) {
637
667
typeDepFileNames . delete ( fileName ) ;
@@ -649,7 +679,7 @@ export class AngularCompilerPlugin {
649
679
compilation . warnings . push (
650
680
`${ fileName } is part of the TypeScript compilation but it's unused.\n` +
651
681
`Add only entry points to the 'files' or 'include' properties in your tsconfig.` ,
652
- ) ;
682
+ ) ;
653
683
this . _unusedFiles . add ( fileName ) ;
654
684
// Remove the truly unused from the type dep list.
655
685
typeDepFileNames . delete ( fileName ) ;
@@ -659,7 +689,9 @@ export class AngularCompilerPlugin {
659
689
// These are the TS files that weren't part of the compilation modules, aren't unused, but were
660
690
// part of the TS original source list.
661
691
// Next build we add them to the TS entry points so that they trigger rebuilds.
662
- this . _typeDeps = typeDepFileNames ;
692
+ for ( const fileName of typeDepFileNames ) {
693
+ this . _typeDeps . add ( fileName ) ;
694
+ }
663
695
}
664
696
665
697
// Registration hook for webpack plugin.
@@ -1233,7 +1265,7 @@ export class AngularCompilerPlugin {
1233
1265
1234
1266
for ( const resource of resourceImports ) {
1235
1267
for ( const dep of this . getResourceDependencies (
1236
- this . _compilerHost . denormalizePath ( resource ) ) ) {
1268
+ this . _compilerHost . denormalizePath ( resource ) ) ) {
1237
1269
resourceDependencies . push ( dep ) ;
1238
1270
}
1239
1271
}
0 commit comments