@@ -12,6 +12,7 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
12
12
protected $platformsDataService : IPlatformsDataService ,
13
13
protected $packageInstallationManager : IPackageInstallationManager ,
14
14
protected $packageManager : IPackageManager ,
15
+ protected $pacoteService : IPacoteService ,
15
16
private $androidResourcesMigrationService : IAndroidResourcesMigrationService ,
16
17
private $devicePlatformsConstants : Mobile . IDevicePlatformsConstants ,
17
18
private $logger : ILogger ,
@@ -20,9 +21,10 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
20
21
private $pluginsService : IPluginsService ,
21
22
private $projectDataService : IProjectDataService ,
22
23
private $resources : IResourceLoader ) {
23
- super ( $fs , $platformCommandHelper , $platformsDataService , $packageInstallationManager , $packageManager ) ;
24
+ super ( $fs , $platformCommandHelper , $platformsDataService , $packageInstallationManager , $packageManager , $pacoteService ) ;
24
25
}
25
26
27
+ static readonly typescriptPackageName : string = "typescript" ;
26
28
static readonly backupFolder : string = ".migration_backup" ;
27
29
static readonly migrateFailMessage : string = "Could not migrate the project!" ;
28
30
static readonly backupFailMessage : string = "Could not backup project folders!" ;
@@ -38,15 +40,14 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
38
40
] ;
39
41
40
42
private migrationDependencies : IMigrationDependency [ ] = [
41
- { packageName : constants . TNS_CORE_MODULES_NAME , verifiedVersion : "6.0.0-rc-2019-07-08-111131-01 " } ,
43
+ { packageName : constants . TNS_CORE_MODULES_NAME , verifiedVersion : "6.0.0-rc-2019-07-09-183845-06 " } ,
42
44
{ packageName : constants . TNS_CORE_MODULES_WIDGETS_NAME , verifiedVersion : "6.0.0" } ,
43
- { packageName : "tns-platform-declarations" , isDev : true , verifiedVersion : "6.0.0-rc-2019-06-28-175837-02 " } ,
45
+ { packageName : "tns-platform-declarations" , isDev : true , verifiedVersion : "6.0.0-rc-2019-07-09-183845-06 " } ,
44
46
{ packageName : "node-sass" , isDev : true , verifiedVersion : "4.12.0" } ,
45
- { packageName : "typescript" , isDev : true , verifiedVersion : "3.4.1" } ,
46
47
{ packageName : "nativescript-dev-sass" , isDev : true , replaceWith : "node-sass" } ,
47
- { packageName : "nativescript-dev-typescript" , isDev : true , replaceWith : "typescript" } ,
48
+ { packageName : "nativescript-dev-typescript" , isDev : true , replaceWith : MigrateController . typescriptPackageName } ,
48
49
{ packageName : "nativescript-dev-less" , isDev : true , shouldRemove : true , warning : "LESS CSS is not supported out of the box. In order to enable it, follow the steps in this feature request: https://github.com/NativeScript/nativescript-dev-webpack/issues/967" } ,
49
- { packageName : constants . WEBPACK_PLUGIN_NAME , isDev : true , shouldAddIfMissing : true , verifiedVersion : "1.0.0-rc-2019-07-08-135456-03 " } ,
50
+ { packageName : constants . WEBPACK_PLUGIN_NAME , isDev : true , shouldAddIfMissing : true , verifiedVersion : "1.0.0-rc-2019-07-10-002255-01 " } ,
50
51
{ packageName : "nativescript-camera" , verifiedVersion : "4.5.0" } ,
51
52
{ packageName : "nativescript-geolocation" , verifiedVersion : "5.1.0" } ,
52
53
{ packageName : "nativescript-imagepicker" , verifiedVersion : "6.2.0" } ,
@@ -59,19 +60,18 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
59
60
{ packageName : "nativescript-ui-calendar" , verifiedVersion : "5.0.0-androidx-110619-2" } ,
60
61
{ packageName : "nativescript-ui-autocomplete" , verifiedVersion : "5.0.0-androidx-110619" } ,
61
62
{ packageName : "nativescript-datetimepicker" , verifiedVersion : "1.1.0" } ,
62
- //TODO update with compatible with webpack only hooks
63
63
{ packageName : "kinvey-nativescript-sdk" , verifiedVersion : "4.2.1" } ,
64
- //TODO update with compatible with webpack only hooks
65
- { packageName : "nativescript-plugin-firebase" , verifiedVersion : "9.0.1" } ,
66
- //TODO update with no prerelease version compatible with webpack only hooks
67
- { packageName : "nativescript-vue" , verifiedVersion : "2.3.0-rc.1" } ,
64
+ { packageName : "nativescript-plugin-firebase" , verifiedVersion : "9.0.2" } ,
65
+ // TODO: update with no prerelease version compatible with webpack only hooks
66
+ { packageName : "nativescript-vue" , verifiedVersion : "2.3.0-rc.2" } ,
68
67
{ packageName : "nativescript-permissions" , verifiedVersion : "1.3.0" } ,
69
68
{ packageName : "nativescript-cardview" , verifiedVersion : "3.2.0" } ,
70
69
{
71
70
packageName : "nativescript-unit-test-runner" , verifiedVersion : "0.6.4" ,
72
71
shouldMigrateAction : ( projectData : IProjectData ) => this . hasDependency ( { packageName : "nativescript-unit-test-runner" , isDev : false } , projectData ) ,
73
72
migrateAction : this . migrateUnitTestRunner . bind ( this )
74
- }
73
+ } ,
74
+ { packageName : MigrateController . typescriptPackageName , isDev : true , getVerifiedVersion : this . getAngularTypeScriptVersion . bind ( this ) }
75
75
] ;
76
76
77
77
get verifiedPlatformVersions ( ) : IDictionary < string > {
@@ -96,14 +96,14 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
96
96
}
97
97
98
98
try {
99
- this . $logger . info ( "Backup auto-generated files." ) ;
99
+ this . $logger . info ( "Clean auto-generated files." ) ;
100
100
this . handleAutoGeneratedFiles ( backupDir , projectData ) ;
101
- this . $logger . info ( "Backup auto-generated files complete." ) ;
101
+ this . $logger . info ( "Clean auto-generated files complete." ) ;
102
102
} catch ( error ) {
103
103
this . $logger . trace ( `Error during auto-generated files handling. ${ ( error && error . message ) || error } ` ) ;
104
104
}
105
105
106
- await this . migrateOldAndroidAppResources ( projectData ) ;
106
+ await this . migrateOldAndroidAppResources ( projectData , backupDir ) ;
107
107
108
108
try {
109
109
await this . cleanUpProject ( projectData ) ;
@@ -114,14 +114,6 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
114
114
}
115
115
}
116
116
117
- private async migrateOldAndroidAppResources ( projectData : IProjectData ) {
118
- const appResourcesPath = projectData . getAppResourcesDirectoryPath ( ) ;
119
- if ( ! this . $androidResourcesMigrationService . hasMigrated ( appResourcesPath ) ) {
120
- this . $logger . info ( "Migrate old Android App_Resources structure." ) ;
121
- await this . $androidResourcesMigrationService . migrate ( appResourcesPath ) ;
122
- }
123
- }
124
-
125
117
public async shouldMigrate ( { projectDir } : IProjectDir ) : Promise < boolean > {
126
118
const projectData = this . $projectDataService . getProjectData ( projectDir ) ;
127
119
@@ -158,6 +150,43 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
158
150
}
159
151
}
160
152
153
+ private async getAngularTypeScriptVersion ( projectData : IProjectData ) : Promise < string > {
154
+ let verifiedVersion = "3.4.1" ;
155
+ try {
156
+ const ngcPackageName = "@angular/compiler-cli" ;
157
+ // e.g. ~8.0.0
158
+ let ngcVersion = projectData . dependencies [ ngcPackageName ] || projectData . devDependencies [ ngcPackageName ] ;
159
+ if ( ngcVersion ) {
160
+ // e.g. 8.0.3
161
+ ngcVersion = await this . $packageInstallationManager . maxSatisfyingVersion ( ngcPackageName , ngcVersion ) ;
162
+ const ngcManifest = await this . getPackageManifest ( ngcPackageName , ngcVersion ) ;
163
+ // e.g. >=3.4 <3.5
164
+ verifiedVersion = ( ngcManifest && ngcManifest . peerDependencies &&
165
+ ngcManifest . peerDependencies [ MigrateController . typescriptPackageName ] ) || verifiedVersion ;
166
+
167
+ // e.g. 3.4.4
168
+ verifiedVersion = await this . $packageInstallationManager . maxSatisfyingVersion (
169
+ MigrateController . typescriptPackageName , verifiedVersion ) ;
170
+ }
171
+ } catch ( error ) {
172
+ this . $logger . warn ( `Unable to determine the TypeScript version based on the Angular packages. Error is: '${ error } '.` ) ;
173
+ }
174
+
175
+ return verifiedVersion ;
176
+ }
177
+
178
+ private async migrateOldAndroidAppResources ( projectData : IProjectData , backupDir : string ) {
179
+ const appResourcesPath = projectData . getAppResourcesDirectoryPath ( ) ;
180
+ if ( ! this . $androidResourcesMigrationService . hasMigrated ( appResourcesPath ) ) {
181
+ this . $logger . info ( "Migrate old Android App_Resources structure." ) ;
182
+ try {
183
+ await this . $androidResourcesMigrationService . migrate ( appResourcesPath , backupDir ) ;
184
+ } catch ( error ) {
185
+ this . $logger . warn ( "Migrate old Android App_Resources structure failed: " , error . message ) ;
186
+ }
187
+ }
188
+ }
189
+
161
190
private async cleanUpProject ( projectData : IProjectData ) : Promise < void > {
162
191
this . $logger . info ( "Clean old project artefacts." ) ;
163
192
this . $projectDataService . removeNSConfigProperty ( projectData . projectDir , "useLegacyWorkflow" ) ;
@@ -270,23 +299,34 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
270
299
if ( ! replacementDep ) {
271
300
this . $errors . failWithoutHelp ( "Failed to find replacement dependency." ) ;
272
301
}
302
+
303
+ const replacementDepVersion = await this . getDependencyVerifiedVersion ( replacementDep , projectData ) ;
273
304
this . $logger . info ( `Replacing '${ dependency . packageName } ' with '${ replacementDep . packageName } '.` ) ;
274
- this . $pluginsService . addToPackageJson ( replacementDep . packageName , replacementDep . verifiedVersion , replacementDep . isDev , projectData . projectDir ) ;
305
+ this . $pluginsService . addToPackageJson ( replacementDep . packageName , replacementDepVersion , replacementDep . isDev , projectData . projectDir ) ;
275
306
}
276
307
277
308
return ;
278
309
}
279
310
311
+ const dependencyVersion = await this . getDependencyVerifiedVersion ( dependency , projectData ) ;
280
312
if ( hasDependency && await this . shouldMigrateDependencyVersion ( dependency , projectData ) ) {
281
- this . $logger . info ( `Updating '${ dependency . packageName } ' to compatible version '${ dependency . verifiedVersion } '` ) ;
282
- this . $pluginsService . addToPackageJson ( dependency . packageName , dependency . verifiedVersion , dependency . isDev , projectData . projectDir ) ;
313
+ this . $logger . info ( `Updating '${ dependency . packageName } ' to compatible version '${ dependencyVersion } '` ) ;
314
+ this . $pluginsService . addToPackageJson ( dependency . packageName , dependencyVersion , dependency . isDev , projectData . projectDir ) ;
283
315
return ;
284
316
}
285
317
286
318
if ( ! hasDependency && dependency . shouldAddIfMissing ) {
287
- this . $logger . info ( `Adding '${ dependency . packageName } ' with version '${ dependency . verifiedVersion } '` ) ;
288
- this . $pluginsService . addToPackageJson ( dependency . packageName , dependency . verifiedVersion , dependency . isDev , projectData . projectDir ) ;
319
+ this . $logger . info ( `Adding '${ dependency . packageName } ' with version '${ dependencyVersion } '` ) ;
320
+ this . $pluginsService . addToPackageJson ( dependency . packageName , dependencyVersion , dependency . isDev , projectData . projectDir ) ;
321
+ }
322
+ }
323
+
324
+ private async getDependencyVerifiedVersion ( dependency : IMigrationDependency , projectData : IProjectData ) : Promise < string > {
325
+ if ( ! dependency . verifiedVersion && dependency . getVerifiedVersion ) {
326
+ dependency . verifiedVersion = await dependency . getVerifiedVersion ( projectData ) ;
289
327
}
328
+
329
+ return dependency . verifiedVersion ;
290
330
}
291
331
292
332
private async shouldMigrateDependencyVersion ( dependency : IMigrationDependency , projectData : IProjectData ) : Promise < boolean > {
@@ -295,8 +335,9 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
295
335
const packageName = dependency . packageName ;
296
336
const version = dependencies [ packageName ] || devDependencies [ packageName ] ;
297
337
const maxSatisfyingVersion = await this . getMaxDependencyVersion ( dependency . packageName , version ) ;
338
+ const dependencyVersion = await this . getDependencyVerifiedVersion ( dependency , projectData ) ;
298
339
299
- return ! ( maxSatisfyingVersion && semver . gte ( maxSatisfyingVersion , dependency . verifiedVersion ) ) ;
340
+ return ! ( maxSatisfyingVersion && semver . gte ( maxSatisfyingVersion , dependencyVersion ) ) ;
300
341
}
301
342
302
343
protected async shouldUpdateRuntimeVersion ( { targetVersion, platform, projectData } : { targetVersion : string , platform : string , projectData : IProjectData } ) : Promise < boolean > {
0 commit comments