7
7
*/
8
8
9
9
import { join , normalize } from '@angular-devkit/core' ;
10
- import { Rule , Tree } from '@angular-devkit/schematics' ;
11
- import { getWorkspacePath } from '../../utility/config' ;
12
- import {
13
- appendPropertyInAstObject ,
14
- findPropertyInAstObject ,
15
- insertPropertyInAstObjectInOrder ,
16
- } from '../../utility/json-utils' ;
10
+ import { Rule , Tree , chain } from '@angular-devkit/schematics' ;
11
+ import { JSONFile } from '../../utility/json-file' ;
12
+ import { updateWorkspace } from '../../utility/workspace' ;
17
13
import { Builders } from '../../utility/workspace-models' ;
18
- import { getTargets , getWorkspace , readJsonFileAsAstObject } from './utils' ;
19
14
20
15
/**
21
16
* Updates a pre version 9 library to version 9 Ivy library.
@@ -25,83 +20,44 @@ import { getTargets, getWorkspace, readJsonFileAsAstObject } from './utils';
25
20
* - Create a prod tsconfig for which disables Ivy and enables VE compilations.
26
21
*/
27
22
export function updateLibraries ( ) : Rule {
28
- return ( tree , context ) => {
29
- const logger = context . logger ;
30
- const workspacePath = getWorkspacePath ( tree ) ;
31
- const workspace = getWorkspace ( tree ) ;
32
-
33
- const recorder = tree . beginUpdate ( workspacePath ) ;
34
- for ( const { target, project } of getTargets ( workspace , 'build' , Builders . DeprecatedNgPackagr ) ) {
35
- const projectRoot = findPropertyInAstObject ( project , 'root' ) ;
36
- if ( ! projectRoot || projectRoot . kind !== 'string' ) {
37
- break ;
38
- }
39
-
40
- const configurations = findPropertyInAstObject ( target , 'configurations' ) ;
41
- const tsConfig = join ( normalize ( projectRoot . value ) , 'tsconfig.lib.prod.json' ) ;
23
+ return updateWorkspace ( workspace => {
24
+ const followupRules : Rule [ ] = [ ] ;
42
25
43
- if ( ! configurations || configurations . kind !== 'object' ) {
44
- // Configurations doesn't exist.
45
- appendPropertyInAstObject ( recorder , target , 'configurations' , { production : { tsConfig } } , 10 ) ;
46
- createTsConfig ( tree , tsConfig ) ;
26
+ for ( const [ , project ] of workspace . projects ) {
27
+ if ( typeof project . root !== 'string' ) {
47
28
continue ;
48
29
}
49
30
50
- const prodConfig = findPropertyInAstObject ( configurations , 'production' ) ;
51
- if ( ! prodConfig || prodConfig . kind !== 'object' ) {
52
- // Production configuration doesn't exist.
53
- insertPropertyInAstObjectInOrder ( recorder , configurations , 'production' , { tsConfig } , 12 ) ;
54
- createTsConfig ( tree , tsConfig ) ;
55
- continue ;
56
- }
57
-
58
- const tsConfigOption = findPropertyInAstObject ( prodConfig , 'tsConfig' ) ;
59
- if ( ! tsConfigOption || tsConfigOption . kind !== 'string' ) {
60
- // No tsconfig for production has been defined.
61
- insertPropertyInAstObjectInOrder ( recorder , prodConfig , 'tsConfig' , tsConfig , 14 ) ;
62
- createTsConfig ( tree , tsConfig ) ;
63
- continue ;
64
- }
31
+ for ( const [ , target ] of project . targets ) {
32
+ if ( target . builder !== Builders . DeprecatedNgPackagr ) {
33
+ continue ;
34
+ }
65
35
66
- // tsConfig for production already exists.
67
- const tsConfigPath = tsConfigOption . value ;
68
- const tsConfigAst = readJsonFileAsAstObject ( tree , tsConfigPath ) ;
69
- if ( ! tsConfigAst ) {
70
- logger . warn ( `Cannot find file: ${ tsConfigPath } ` ) ;
71
- continue ;
72
- }
36
+ const tsConfig = join ( normalize ( project . root ) , 'tsconfig.lib.prod.json' ) ;
73
37
74
- const tsConfigRecorder = tree . beginUpdate ( tsConfigPath ) ;
75
- const ngCompilerOptions = findPropertyInAstObject ( tsConfigAst , 'angularCompilerOptions' ) ;
76
- if ( ! ngCompilerOptions ) {
77
- // Add angularCompilerOptions to the production tsConfig
78
- appendPropertyInAstObject ( tsConfigRecorder , tsConfigAst , 'angularCompilerOptions' , { enableIvy : false } , 2 ) ;
79
- tree . commitUpdate ( tsConfigRecorder ) ;
80
- continue ;
81
- }
38
+ if ( ! target . configurations || ! target . configurations . production ) {
39
+ // Production configuration does not exist
40
+ target . configurations = { ...target . configurations , production : { tsConfig } } ;
82
41
83
- if ( ngCompilerOptions . kind === 'object' ) {
84
- const enableIvy = findPropertyInAstObject ( ngCompilerOptions , 'enableIvy' ) ;
85
- // Add enableIvy false
86
- if ( ! enableIvy ) {
87
- appendPropertyInAstObject ( tsConfigRecorder , ngCompilerOptions , 'enableIvy' , false , 4 ) ;
88
- tree . commitUpdate ( tsConfigRecorder ) ;
42
+ followupRules . push ( ( tree ) => createTsConfig ( tree , tsConfig ) ) ;
89
43
continue ;
90
44
}
91
45
92
- if ( enableIvy . kind !== 'false' ) {
93
- const { start, end } = enableIvy ;
94
- tsConfigRecorder . remove ( start . offset , end . offset - start . offset ) ;
95
- tsConfigRecorder . insertLeft ( start . offset , 'false' ) ;
96
- tree . commitUpdate ( tsConfigRecorder ) ;
46
+ const existingTsconfig = target . configurations . production . tsConfig ;
47
+ if ( ! existingTsconfig || typeof existingTsconfig !== 'string' ) {
48
+ // Production configuration TS configuration does not exist or malformed
49
+ target . configurations . production . tsConfig = tsConfig ;
50
+
51
+ followupRules . push ( ( tree ) => createTsConfig ( tree , tsConfig ) ) ;
52
+ continue ;
97
53
}
54
+
55
+ followupRules . push ( updateTsConfig ( existingTsconfig ) ) ;
98
56
}
99
57
}
100
58
101
- tree . commitUpdate ( recorder ) ;
102
-
103
- return tree ;
104
- } ;
59
+ return chain ( followupRules ) ;
60
+ } ) ;
105
61
}
106
62
107
63
function createTsConfig ( tree : Tree , tsConfigPath : string ) {
@@ -116,3 +72,24 @@ function createTsConfig(tree: Tree, tsConfigPath: string) {
116
72
tree . create ( tsConfigPath , JSON . stringify ( tsConfigContent , undefined , 2 ) ) ;
117
73
}
118
74
}
75
+
76
+ function updateTsConfig ( tsConfigPath : string ) : Rule {
77
+ return ( tree , { logger } ) => {
78
+ let json ;
79
+ try {
80
+ json = new JSONFile ( tree , tsConfigPath ) ;
81
+ } catch {
82
+ logger . warn ( `Cannot find file: ${ tsConfigPath } ` ) ;
83
+
84
+ return ;
85
+ }
86
+
87
+ const enableIvyPath = [ 'angularCompilerOptions' , 'enableIvy' ] ;
88
+
89
+ if ( json . get ( enableIvyPath ) === false ) {
90
+ return ;
91
+ }
92
+
93
+ json . modify ( enableIvyPath , false ) ;
94
+ } ;
95
+ }
0 commit comments