@@ -41,15 +41,12 @@ import { DiagnosticMode, gatherDiagnostics, hasErrors, reportDiagnostics } from
41
41
import { resolveEntryModuleFromMain } from './entry_resolver' ;
42
42
import {
43
43
AngularCompilerPluginOptions ,
44
- ContextElementDependencyConstructor ,
45
44
PLATFORM ,
46
45
} from './interfaces' ;
47
- import { LazyRouteMap , findLazyRoutes } from './lazy_routes' ;
48
46
import { NgccProcessor } from './ngcc_processor' ;
49
47
import { TypeScriptPathsPlugin } from './paths-plugin' ;
50
48
import { WebpackResourceLoader } from './resource_loader' ;
51
49
import {
52
- exportLazyModuleMap ,
53
50
exportNgFactory ,
54
51
findResources ,
55
52
importFactory ,
@@ -90,10 +87,7 @@ export class AngularCompilerPlugin {
90
87
private _compilerHost ! : WebpackCompilerHost & CompilerHost ;
91
88
private _moduleResolutionCache ! : ts . ModuleResolutionCache ;
92
89
private _resourceLoader ?: WebpackResourceLoader ;
93
- private _discoverLazyRoutes = true ;
94
90
private _useFactories = false ;
95
- // Contains `moduleImportPath#exportName` => `fullModulePath`.
96
- private _lazyRoutes : LazyRouteMap = { } ;
97
91
private _tsConfigPath ! : string ;
98
92
private _entryModule : string | null = null ;
99
93
private _mainPath : string | undefined ;
@@ -117,7 +111,6 @@ export class AngularCompilerPlugin {
117
111
private _normalizedLocale : string | null = null ;
118
112
private _warnings : string [ ] = [ ] ;
119
113
private _errors : string [ ] = [ ] ;
120
- private _contextElementDependencyConstructor ! : ContextElementDependencyConstructor ;
121
114
122
115
// TypeChecker process.
123
116
private _forkTypeChecker = true ;
@@ -259,12 +252,6 @@ export class AngularCompilerPlugin {
259
252
this . _platformTransformers = options . platformTransformers ;
260
253
}
261
254
262
- // Determine if lazy route discovery via Compiler CLI private API should be attempted.
263
- // The default is to discover routes, but it can be overriden.
264
- if ( options . discoverLazyRoutes !== undefined ) {
265
- this . _discoverLazyRoutes = options . discoverLazyRoutes ;
266
- }
267
-
268
255
if (
269
256
! this . options . suppressZoneJsIncompatibilityWarning &&
270
257
this . _compilerOptions . target !== undefined &&
@@ -277,42 +264,17 @@ export class AngularCompilerPlugin {
277
264
) ;
278
265
}
279
266
280
- if ( this . _discoverLazyRoutes === false && this . options . additionalLazyModuleResources
281
- && this . options . additionalLazyModuleResources . length > 0 ) {
282
- this . _warnings . push (
283
- `Lazy route discovery is disabled but additional Lazy Module Resources were` +
284
- ` provided. These will be ignored.` ,
285
- ) ;
286
- }
287
-
288
267
if ( this . _compilerOptions . strictMetadataEmit ) {
289
268
this . _warnings . push (
290
269
`Using Angular compiler option 'strictMetadataEmit' for applications might cause undefined behavior.` ,
291
270
) ;
292
271
}
293
272
294
- if ( this . _discoverLazyRoutes === false && this . options . additionalLazyModules
295
- && Object . keys ( this . options . additionalLazyModules ) . length > 0 ) {
296
- this . _warnings . push (
297
- `Lazy route discovery is disabled but additional lazy modules were provided.` +
298
- `These will be ignored.` ,
299
- ) ;
300
- }
301
-
302
273
if ( ! this . _JitMode && ! this . _compilerOptions . enableIvy ) {
303
274
// Only attempt to use factories when AOT and not Ivy.
304
275
this . _useFactories = true ;
305
276
}
306
277
307
- // Default ContextElementDependency to the one we can import from here.
308
- // Failing to use the right ContextElementDependency will throw the error below:
309
- // "No module factory available for dependency type: ContextElementDependency"
310
- // Hoisting together with peer dependencies can make it so the imported
311
- // ContextElementDependency does not come from the same Webpack instance that is used
312
- // in the compilation. In that case, we can pass the right one as an option to the plugin.
313
- this . _contextElementDependencyConstructor = options . contextElementDependencyConstructor
314
- || require ( 'webpack/lib/dependencies/ContextElementDependency' ) ;
315
-
316
278
// Use entryModule if available in options, otherwise resolve it from mainPath after program
317
279
// creation.
318
280
if ( this . _options . entryModule ) {
@@ -446,124 +408,10 @@ export class AngularCompilerPlugin {
446
408
time ( 'AngularCompilerPlugin._make.resolveEntryModuleFromMain' ) ;
447
409
this . _entryModule = resolveEntryModuleFromMain (
448
410
this . _mainPath , this . _compilerHost , this . _getTsProgram ( ) as ts . Program ) ;
449
-
450
- if ( this . _discoverLazyRoutes && ! this . entryModule && ! this . _compilerOptions . enableIvy ) {
451
- this . _warnings . push ( 'Lazy routes discovery is not enabled. '
452
- + 'Because there is neither an entryModule nor a '
453
- + 'statically analyzable bootstrap code in the main file.' ,
454
- ) ;
455
- }
456
411
timeEnd ( 'AngularCompilerPlugin._make.resolveEntryModuleFromMain' ) ;
457
412
}
458
413
}
459
414
460
- private _findLazyRoutesInAst ( changedFilePaths : string [ ] ) : LazyRouteMap {
461
- time ( 'AngularCompilerPlugin._findLazyRoutesInAst' ) ;
462
- const result : LazyRouteMap = { } ;
463
- for ( const filePath of changedFilePaths ) {
464
- const fileLazyRoutes = findLazyRoutes ( filePath , this . _compilerHost , undefined ,
465
- this . _compilerOptions ) ;
466
- for ( const routeKey of Object . keys ( fileLazyRoutes ) ) {
467
- const route = fileLazyRoutes [ routeKey ] ;
468
- result [ routeKey ] = route ;
469
- }
470
- }
471
- timeEnd ( 'AngularCompilerPlugin._findLazyRoutesInAst' ) ;
472
-
473
- return result ;
474
- }
475
-
476
- private _listLazyRoutesFromProgram ( ) : LazyRouteMap {
477
- let entryRoute : string | undefined ;
478
- let ngProgram : Program ;
479
-
480
- if ( this . _JitMode ) {
481
- if ( ! this . entryModule ) {
482
- return { } ;
483
- }
484
-
485
- time ( 'AngularCompilerPlugin._listLazyRoutesFromProgram.createProgram' ) ;
486
- ngProgram = createProgram ( {
487
- rootNames : this . _rootNames ,
488
- options : { ...this . _compilerOptions , genDir : '' , collectAllErrors : true , enableIvy : false } ,
489
- host : this . _compilerHost ,
490
- } ) ;
491
- timeEnd ( 'AngularCompilerPlugin._listLazyRoutesFromProgram.createProgram' ) ;
492
-
493
- entryRoute = workaroundResolve ( this . entryModule . path ) + '#' + this . entryModule . className ;
494
- } else {
495
- ngProgram = this . _program as Program ;
496
- }
497
-
498
- time ( 'AngularCompilerPlugin._listLazyRoutesFromProgram.listLazyRoutes' ) ;
499
- // entryRoute will only be defined in JIT.
500
- // In AOT all routes within the program are returned.
501
- const lazyRoutes = ngProgram . listLazyRoutes ( entryRoute ) ;
502
- timeEnd ( 'AngularCompilerPlugin._listLazyRoutesFromProgram.listLazyRoutes' ) ;
503
-
504
- return lazyRoutes . reduce (
505
- ( acc , curr ) => {
506
- const ref = curr . route ;
507
- if ( ref in acc && acc [ ref ] !== curr . referencedModule . filePath ) {
508
- throw new Error (
509
- + `Duplicated path in loadChildren detected: "${ ref } " is used in 2 loadChildren, `
510
- + `but they point to different modules "(${ acc [ ref ] } and `
511
- + `"${ curr . referencedModule . filePath } "). Webpack cannot distinguish on context and `
512
- + 'would fail to load the proper one.' ,
513
- ) ;
514
- }
515
- acc [ ref ] = curr . referencedModule . filePath ;
516
-
517
- return acc ;
518
- } ,
519
- { } as LazyRouteMap ,
520
- ) ;
521
- }
522
-
523
- // Process the lazy routes discovered, adding then to _lazyRoutes.
524
- // TODO: find a way to remove lazy routes that don't exist anymore.
525
- // This will require a registry of known references to a lazy route, removing it when no
526
- // module references it anymore.
527
- private _processLazyRoutes ( discoveredLazyRoutes : LazyRouteMap ) {
528
- Object . keys ( discoveredLazyRoutes )
529
- . forEach ( lazyRouteKey => {
530
- const [ lazyRouteModule , moduleName ] = lazyRouteKey . split ( '#' ) ;
531
-
532
- if ( ! lazyRouteModule ) {
533
- return ;
534
- }
535
-
536
- const lazyRouteTSFile = forwardSlashPath ( discoveredLazyRoutes [ lazyRouteKey ] ) ;
537
- let modulePath : string , moduleKey : string ;
538
-
539
- if ( this . _useFactories ) {
540
- modulePath = lazyRouteTSFile . replace ( / ( \. d ) ? \. t s x ? $ / , '' ) ;
541
- modulePath += '.ngfactory.js' ;
542
- const factoryModuleName = moduleName ? `#${ moduleName } NgFactory` : '' ;
543
- moduleKey = `${ lazyRouteModule } .ngfactory${ factoryModuleName } ` ;
544
- } else {
545
- modulePath = lazyRouteTSFile ;
546
- moduleKey = `${ lazyRouteModule } ${ moduleName ? '#' + moduleName : '' } ` ;
547
- }
548
-
549
- modulePath = workaroundResolve ( modulePath ) ;
550
-
551
- if ( moduleKey in this . _lazyRoutes ) {
552
- if ( this . _lazyRoutes [ moduleKey ] !== modulePath ) {
553
- // Found a duplicate, this is an error.
554
- this . _warnings . push (
555
- `Duplicated path in loadChildren detected during a rebuild. ` +
556
- `We will take the latest version detected and override it to save rebuild time. ` +
557
- `You should perform a full build to validate that your routes don't overlap.` ,
558
- ) ;
559
- }
560
- } else {
561
- // Found a new route, add it to the map.
562
- this . _lazyRoutes [ moduleKey ] = modulePath ;
563
- }
564
- } ) ;
565
- }
566
-
567
415
private _createForkedTypeChecker ( ) {
568
416
const typeCheckerFile = './type_checker_worker.js' ;
569
417
@@ -839,66 +687,6 @@ export class AngularCompilerPlugin {
839
687
) ;
840
688
} ) ;
841
689
842
- if ( this . _discoverLazyRoutes ) {
843
- // Add lazy modules to the context module for @angular /core
844
- compiler . hooks . contextModuleFactory . tap ( 'angular-compiler' , cmf => {
845
- const angularCorePackagePath = require . resolve ( '@angular/core/package.json' , {
846
- paths : [ this . _basePath ] ,
847
- } ) ;
848
-
849
- // APFv6 does not have single FESM anymore. Instead of verifying if we're pointing to
850
- // FESMs, we resolve the `@angular/core` path and verify that the path for the
851
- // module starts with it.
852
- // This may be slower but it will be compatible with both APF5, 6 and potential future
853
- // versions (until the dynamic import appears outside of core I suppose).
854
- // We resolve symbolic links in order to get the real path that would be used in webpack.
855
- const angularCoreResourceRoot = fs . realpathSync ( path . dirname ( angularCorePackagePath ) ) ;
856
-
857
- cmf . hooks . afterResolve . tapPromise ( 'angular-compiler' , async result => {
858
- // Alter only existing request from Angular or the additional lazy module resources.
859
- const isLazyModuleResource = ( resource : string ) =>
860
- resource . startsWith ( angularCoreResourceRoot ) ||
861
- ( this . options . additionalLazyModuleResources &&
862
- this . options . additionalLazyModuleResources . includes ( resource ) ) ;
863
-
864
- if ( ! result || ! this . done || ! isLazyModuleResource ( result . resource ) ) {
865
- return result ;
866
- }
867
-
868
- await this . done ;
869
-
870
- // This folder does not exist, but we need to give webpack a resource.
871
- // TODO: check if we can't just leave it as is (angularCoreModuleDir).
872
- result . resource = path . join ( this . _basePath , '$$_lazy_route_resource' ) ;
873
- // tslint:disable-next-line:no-any
874
- result . dependencies . forEach ( ( d : any ) => d . critical = false ) ;
875
- // tslint:disable-next-line:no-any
876
- result . resolveDependencies = ( _fs : any , options : any , callback : any ) => {
877
- const dependencies = Object . keys ( this . _lazyRoutes )
878
- . map ( ( key ) => {
879
- const modulePath = this . _lazyRoutes [ key ] ;
880
- if ( modulePath !== null ) {
881
- const name = key . split ( '#' ) [ 0 ] ;
882
-
883
- return new this . _contextElementDependencyConstructor ( modulePath , name ) ;
884
- } else {
885
- return null ;
886
- }
887
- } )
888
- . filter ( x => ! ! x ) ;
889
-
890
- if ( this . _options . nameLazyFiles ) {
891
- options . chunkName = '[request]' ;
892
- }
893
-
894
- callback ( null , dependencies ) ;
895
- } ;
896
-
897
- return result ;
898
- } ) ;
899
- } ) ;
900
- }
901
-
902
690
// Create and destroy forked type checker on watch mode.
903
691
compiler . hooks . watchRun . tap ( 'angular-compiler' , ( ) => {
904
692
if ( this . _forkTypeChecker && ! this . _typeCheckerProcess ) {
@@ -1041,7 +829,6 @@ export class AngularCompilerPlugin {
1041
829
const getEntryModule = ( ) => this . entryModule
1042
830
? { path : workaroundResolve ( this . entryModule . path ) , className : this . entryModule . className }
1043
831
: this . entryModule ;
1044
- const getLazyRoutes = ( ) => this . _lazyRoutes ;
1045
832
const getTypeChecker = ( ) => ( this . _getTsProgram ( ) as ts . Program ) . getTypeChecker ( ) ;
1046
833
1047
834
if ( this . _JitMode ) {
@@ -1100,28 +887,14 @@ export class AngularCompilerPlugin {
1100
887
this . _useFactories ,
1101
888
) ) ;
1102
889
}
1103
- } else if ( this . _platform === PLATFORM . Server ) {
1104
- // The export lazy module map is required only for string based lazy loading
1105
- // which is not supported in Ivy
1106
- if ( ! this . _compilerOptions . enableIvy ) {
1107
- this . _transformers . push ( exportLazyModuleMap ( isMainPath , getLazyRoutes ) ) ;
1108
- }
1109
-
1110
- if ( this . _useFactories ) {
1111
- this . _transformers . push (
1112
- exportNgFactory ( isMainPath , getEntryModule ) ,
1113
- replaceServerBootstrap ( isMainPath , getEntryModule , getTypeChecker ) ) ;
1114
- }
890
+ } else if ( this . _platform === PLATFORM . Server && this . _useFactories ) {
891
+ this . _transformers . push (
892
+ exportNgFactory ( isMainPath , getEntryModule ) ,
893
+ replaceServerBootstrap ( isMainPath , getEntryModule , getTypeChecker ) ) ;
1115
894
}
1116
895
}
1117
896
}
1118
897
1119
- private _getChangedTsFiles ( ) {
1120
- return this . _getChangedCompilationFiles ( )
1121
- . filter ( k => ( k . endsWith ( '.ts' ) || k . endsWith ( '.tsx' ) ) && ! k . endsWith ( '.d.ts' ) )
1122
- . filter ( k => this . _compilerHost . fileExists ( k ) ) ;
1123
- }
1124
-
1125
898
private async _update ( ) {
1126
899
time ( 'AngularCompilerPlugin._update' ) ;
1127
900
// We only want to update on TS and template changes, but all kinds of files are on this
@@ -1136,30 +909,6 @@ export class AngularCompilerPlugin {
1136
909
// Make a new program and load the Angular structure.
1137
910
await this . _createOrUpdateProgram ( ) ;
1138
911
1139
- if ( this . _discoverLazyRoutes ) {
1140
- // Try to find lazy routes if we have an entry module.
1141
- // We need to run the `listLazyRoutes` the first time because it also navigates libraries
1142
- // and other things that we might miss using the (faster) findLazyRoutesInAst.
1143
- // Lazy routes modules will be read with compilerHost and added to the changed files.
1144
- let lazyRouteMap : LazyRouteMap = { } ;
1145
- if ( ! this . _JitMode || this . _firstRun ) {
1146
- lazyRouteMap = this . _listLazyRoutesFromProgram ( ) ;
1147
- } else {
1148
- const changedTsFiles = this . _getChangedTsFiles ( ) ;
1149
- if ( changedTsFiles . length > 0 ) {
1150
- lazyRouteMap = this . _findLazyRoutesInAst ( changedTsFiles ) ;
1151
- }
1152
- }
1153
-
1154
- // Find lazy routes
1155
- lazyRouteMap = {
1156
- ...lazyRouteMap ,
1157
- ...this . _options . additionalLazyModules ,
1158
- } ;
1159
-
1160
- this . _processLazyRoutes ( lazyRouteMap ) ;
1161
- }
1162
-
1163
912
// Emit files.
1164
913
time ( 'AngularCompilerPlugin._update._emit' ) ;
1165
914
const { emitResult, diagnostics } = this . _emit ( ) ;
0 commit comments