5
5
* Use of this source code is governed by an MIT-style license that can be
6
6
* found in the LICENSE file at https://angular.io/license
7
7
*/
8
- import { readFile , replaceInFile , writeFile } from '../../utils/fs' ;
8
+ import { getGlobalVariable } from '../../utils/env' ;
9
+ import { prependToFile , readFile , replaceInFile , writeFile } from '../../utils/fs' ;
9
10
import { ng } from '../../utils/process' ;
10
- import { createProject , updateJsonFile } from '../../utils/project' ;
11
+ import { updateJsonFile } from '../../utils/project' ;
11
12
import { expectToFail } from '../../utils/utils' ;
12
13
13
14
export default async function ( ) {
14
- const projectName = 'ivy-lazy-loading' ;
15
+ const argv = getGlobalVariable ( 'argv' ) ;
16
+ const ivyProject = argv [ 'ivy' ] ;
17
+ const projectName = 'test-project' ;
15
18
const appRoutingModulePath = 'src/app/app-routing.module.ts' ;
16
19
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,` ) ;
19
37
20
38
const originalAppRoutingModule = await readFile ( appRoutingModulePath ) ;
21
39
// helper to replace loadChildren
@@ -57,8 +75,10 @@ export default async function () {
57
75
58
76
// Set factory shims to false.
59
77
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 ;
62
82
} ) ;
63
83
64
84
// Convert the default config to use JIT and prod to just do AOT.
@@ -69,22 +89,42 @@ export default async function () {
69
89
buildTarget [ 'configurations' ] [ 'production' ] = { aot : true } ;
70
90
} ) ;
71
91
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
-
77
92
// Test string import with factory shims.
78
93
await replaceLoadChildren ( `'./lazy/lazy.module#LazyModule'` ) ;
79
94
await replaceInFile ( 'tsconfig.app.json' , `"allowEmptyCodegenFiles": false` ,
80
95
`"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
+ }
83
105
84
106
// Test string import without factory shims.
85
107
await replaceLoadChildren ( `'./lazy/lazy.module#LazyModule'` ) ;
86
108
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' ) ;
90
130
}
0 commit comments