1
1
import * as path from "path" ;
2
+ import * as constants from "../constants" ;
2
3
import { ProjectData } from "../project-data" ;
4
+ import { parseJson } from "../common/helpers" ;
3
5
import { exported } from "../common/decorators" ;
4
6
import {
5
7
NATIVESCRIPT_PROPS_INTERNAL_DELIMITER ,
@@ -17,14 +19,21 @@ interface IProjectFileData {
17
19
}
18
20
19
21
export class ProjectDataService implements IProjectDataService {
22
+ private defaultProjectDir = "" ;
20
23
private static DEPENDENCIES_KEY_NAME = "dependencies" ;
24
+ private projectDataCache : IDictionary < IProjectData > = { } ;
21
25
22
26
constructor ( private $fs : IFileSystem ,
23
27
private $staticConfig : IStaticConfig ,
24
28
private $logger : ILogger ,
25
29
private $devicePlatformsConstants : Mobile . IDevicePlatformsConstants ,
26
30
private $androidResourcesMigrationService : IAndroidResourcesMigrationService ,
27
- private $injector : IInjector ) {
31
+ private $injector : IInjector ,
32
+ $projectData : IProjectData ) {
33
+ // add the ProjectData of the default projectDir to the projectData cache
34
+ $projectData . initializeProjectData ( ) ;
35
+ this . defaultProjectDir = $projectData . projectDir ;
36
+ this . projectDataCache [ this . defaultProjectDir ] = $projectData ;
28
37
}
29
38
30
39
public getNSValue ( projectDir : string , propertyName : string ) : any {
@@ -49,16 +58,19 @@ export class ProjectDataService implements IProjectDataService {
49
58
// TODO: Remove $projectData and replace it with $projectDataService.getProjectData
50
59
@exported ( "projectDataService" )
51
60
public getProjectData ( projectDir : string ) : IProjectData {
52
- const projectDataInstance = this . $injector . resolve < IProjectData > ( ProjectData ) ;
53
- projectDataInstance . initializeProjectData ( projectDir ) ;
54
- return projectDataInstance ;
61
+ projectDir = projectDir || this . defaultProjectDir ;
62
+ this . projectDataCache [ projectDir ] = this . projectDataCache [ projectDir ] || this . $injector . resolve < IProjectData > ( ProjectData ) ;
63
+ this . projectDataCache [ projectDir ] . initializeProjectData ( projectDir ) ;
64
+
65
+ return this . projectDataCache [ projectDir ] ;
55
66
}
56
67
57
68
@exported ( "projectDataService" )
58
69
public getProjectDataFromContent ( packageJsonContent : string , nsconfigContent : string , projectDir ?: string ) : IProjectData {
59
- const projectDataInstance = this . $injector . resolve < IProjectData > ( ProjectData ) ;
60
- projectDataInstance . initializeProjectDataFromContent ( packageJsonContent , nsconfigContent , projectDir ) ;
61
- return projectDataInstance ;
70
+ projectDir = projectDir || this . defaultProjectDir ;
71
+ this . projectDataCache [ projectDir ] = this . projectDataCache [ projectDir ] || this . $injector . resolve < IProjectData > ( ProjectData ) ;
72
+ this . projectDataCache [ projectDir ] . initializeProjectDataFromContent ( packageJsonContent , nsconfigContent , projectDir ) ;
73
+ return this . projectDataCache [ projectDir ] ;
62
74
}
63
75
64
76
@exported ( "projectDataService" )
@@ -124,6 +136,14 @@ export class ProjectDataService implements IProjectDataService {
124
136
} ;
125
137
}
126
138
139
+ public setUseLegacyWorkflow ( projectDir : string , value : any ) : void {
140
+ // TODO: use trace
141
+ this . $logger . info ( `useLegacyWorkflow will be set to ${ value } ` ) ;
142
+ this . updateNsConfigValue ( projectDir , { useLegacyWorkflow : value } ) ;
143
+ this . refreshProjectData ( projectDir ) ;
144
+ this . $logger . info ( `useLegacyWorkflow was set to ${ value } ` ) ;
145
+ }
146
+
127
147
public getAppExecutableFiles ( projectDir : string ) : string [ ] {
128
148
const projectData = this . getProjectData ( projectDir ) ;
129
149
@@ -157,6 +177,34 @@ export class ProjectDataService implements IProjectDataService {
157
177
return files ;
158
178
}
159
179
180
+ private refreshProjectData ( projectDir : string ) {
181
+ if ( this . projectDataCache [ projectDir ] ) {
182
+ this . projectDataCache [ projectDir ] . initializeProjectData ( projectDir ) ;
183
+ }
184
+ }
185
+
186
+ private updateNsConfigValue ( projectDir : string , updateObject : INsConfig ) : void {
187
+ const nsConfigPath = path . join ( projectDir , constants . CONFIG_NS_FILE_NAME ) ;
188
+ const currentNsConfig = this . getNsConfig ( nsConfigPath ) ;
189
+ const newNsConfig = Object . assign ( currentNsConfig , updateObject ) ;
190
+
191
+ this . $fs . writeJson ( nsConfigPath , newNsConfig ) ;
192
+ }
193
+
194
+ private getNsConfig ( nsConfigPath : string ) : INsConfig {
195
+ let result = this . getNsConfigDefaultObject ( ) ;
196
+ if ( this . $fs . exists ( nsConfigPath ) ) {
197
+ const nsConfigContent = this . $fs . readText ( nsConfigPath ) ;
198
+ try {
199
+ result = < INsConfig > parseJson ( nsConfigContent ) ;
200
+ } catch ( e ) {
201
+ // default
202
+ }
203
+ }
204
+
205
+ return result ;
206
+ }
207
+
160
208
private getImageDefinitions ( ) : IImageDefinitionsStructure {
161
209
const pathToImageDefinitions = path . join ( __dirname , ".." , ".." , CLI_RESOURCES_DIR_NAME , AssetConstants . assets , AssetConstants . imageDefinitionsFileName ) ;
162
210
const imageDefinitions = this . $fs . readJson ( pathToImageDefinitions ) ;
@@ -308,10 +356,16 @@ export class ProjectDataService implements IProjectDataService {
308
356
} ;
309
357
}
310
358
359
+ private getNsConfigDefaultObject ( data ?: Object ) : INsConfig {
360
+ const config : INsConfig = { useLegacyWorkflow : false } ;
361
+ Object . assign ( config , data ) ;
362
+
363
+ return config ;
364
+ }
365
+
311
366
@exported ( "projectDataService" )
312
367
public getNsConfigDefaultContent ( data ?: Object ) : string {
313
- const config : INsConfig = { } ;
314
- Object . assign ( config , data ) ;
368
+ const config = this . getNsConfigDefaultObject ( data ) ;
315
369
316
370
return JSON . stringify ( config ) ;
317
371
}
0 commit comments