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- import { readFile , replaceInFile , writeFile } from '../../utils/fs' ;
8+ import { getGlobalVariable } from '../../utils/env' ;
9+ import { prependToFile , readFile , replaceInFile , writeFile } from '../../utils/fs' ;
910import { ng } from '../../utils/process' ;
10- import { createProject , updateJsonFile } from '../../utils/project' ;
11+ import { updateJsonFile } from '../../utils/project' ;
1112import { expectToFail } from '../../utils/utils' ;
1213
1314export default async function ( ) {
14- const projectName = 'ivy-lazy-loading' ;
15+ const argv = getGlobalVariable ( 'argv' ) ;
16+ const ivyProject = argv [ 'ivy' ] ;
17+ const projectName = 'test-project' ;
1518 const appRoutingModulePath = 'src/app/app-routing.module.ts' ;
1619
17- // Make Ivy project.
18- await createProject ( projectName , '--enable-ivy' , '--routing' ) ;
20+ // Add app routing.
21+ // This is done automatically on a new app with --routing.
22+ await writeFile ( appRoutingModulePath , `
23+ import { NgModule } from '@angular/core';
24+ import { Routes, RouterModule } from '@angular/router';
25+
26+ const routes: Routes = [];
27+
28+ @NgModule({
29+ imports: [RouterModule.forRoot(routes)],
30+ exports: [RouterModule]
31+ })
32+ export class AppRoutingModule { }
33+ ` ) ;
34+ await prependToFile ( 'src/app/app.module.ts' ,
35+ `import { AppRoutingModule } from './app-routing.module';` ) ;
36+ await replaceInFile ( 'src/app/app.module.ts' , `imports: [` , `imports: [ AppRoutingModule,` ) ;
1937
2038 const originalAppRoutingModule = await readFile ( appRoutingModulePath ) ;
2139 // helper to replace loadChildren
@@ -57,8 +75,10 @@ export default async function () {
5775
5876 // Set factory shims to false.
5977 await updateJsonFile ( 'tsconfig.app.json' , json => {
60- const angularCompilerOptions = json [ 'angularCompilerOptions' ] ;
61- angularCompilerOptions [ 'allowEmptyCodegenFiles' ] = false ;
78+ if ( json [ 'angularCompilerOptions' ] === undefined ) {
79+ json [ 'angularCompilerOptions' ] = { } ;
80+ }
81+ json [ 'angularCompilerOptions' ] [ 'allowEmptyCodegenFiles' ] = false ;
6282 } ) ;
6383
6484 // Convert the default config to use JIT and prod to just do AOT.
@@ -69,22 +89,42 @@ export default async function () {
6989 buildTarget [ 'configurations' ] [ 'production' ] = { aot : true } ;
7090 } ) ;
7191
72- // Test `import()` style lazy load.
73- await replaceLoadChildren ( `() => import('./lazy/lazy.module').then(m => m.LazyModule)` ) ;
74- await ng ( 'e2e' ) ;
75- await ng ( 'e2e' , '--prod' ) ;
76-
7792 // Test string import with factory shims.
7893 await replaceLoadChildren ( `'./lazy/lazy.module#LazyModule'` ) ;
7994 await replaceInFile ( 'tsconfig.app.json' , `"allowEmptyCodegenFiles": false` ,
8095 `"allowEmptyCodegenFiles": true` ) ;
81- await expectToFail ( ( ) => ng ( 'e2e' ) ) ; // Currently broken.
82- await ng ( 'e2e' , '--prod' ) ;
96+ if ( ivyProject ) {
97+ // Ivy should not support the string syntax.
98+ await expectToFail ( ( ) => ng ( 'e2e' ) ) ;
99+ await expectToFail ( ( ) => ng ( 'e2e' , '--prod' ) ) ;
100+ } else {
101+ // View engine should support the string syntax.
102+ await ng ( 'e2e' ) ;
103+ await ng ( 'e2e' , '--prod' ) ;
104+ }
83105
84106 // Test string import without factory shims.
85107 await replaceLoadChildren ( `'./lazy/lazy.module#LazyModule'` ) ;
86108 await replaceInFile ( 'tsconfig.app.json' , `"allowEmptyCodegenFiles": true` ,
87- `"allowEmptyCodegenFiles": false` ) ;
88- await expectToFail ( ( ) => ng ( 'e2e' ) ) ; // Not supported.
89- await expectToFail ( ( ) => ng ( 'e2e' , '--prod' ) ) ; // Not supported.
109+ `"allowEmptyCodegenFiles": false` ) ;
110+ if ( ivyProject ) {
111+ // Ivy should not support the string syntax.
112+ await expectToFail ( ( ) => ng ( 'e2e' ) ) ;
113+ await expectToFail ( ( ) => ng ( 'e2e' , '--prod' ) ) ;
114+ } else {
115+ // View engine should support the string syntax.
116+ await ng ( 'e2e' ) ;
117+ await ng ( 'e2e' , '--prod' ) ;
118+ }
119+
120+ // Test `import()` style lazy load.
121+ await updateJsonFile ( 'angular.json' , json => {
122+ // Add the experimental flag to import factories in View Engine.
123+ const buildTarget = json [ 'projects' ] [ projectName ] [ 'architect' ] [ 'build' ] ;
124+ buildTarget [ 'options' ] [ 'experimentalImportFactories' ] = true ;
125+ } ) ;
126+ // Both Ivy and View Engine should support it.
127+ await replaceLoadChildren ( `() => import('./lazy/lazy.module').then(m => m.LazyModule)` ) ;
128+ await ng ( 'e2e' ) ;
129+ await ng ( 'e2e' , '--prod' ) ;
90130}
0 commit comments