@@ -12,6 +12,7 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
1212 protected $platformsDataService : IPlatformsDataService ,
1313 protected $packageInstallationManager : IPackageInstallationManager ,
1414 protected $packageManager : IPackageManager ,
15+ protected $pacoteService : IPacoteService ,
1516 private $androidResourcesMigrationService : IAndroidResourcesMigrationService ,
1617 private $devicePlatformsConstants : Mobile . IDevicePlatformsConstants ,
1718 private $logger : ILogger ,
@@ -20,9 +21,10 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
2021 private $pluginsService : IPluginsService ,
2122 private $projectDataService : IProjectDataService ,
2223 private $resources : IResourceLoader ) {
23- super ( $fs , $platformCommandHelper , $platformsDataService , $packageInstallationManager , $packageManager ) ;
24+ super ( $fs , $platformCommandHelper , $platformsDataService , $packageInstallationManager , $packageManager , $pacoteService ) ;
2425 }
2526
27+ static readonly typescriptPackageName : string = "typescript" ;
2628 static readonly backupFolder : string = ".migration_backup" ;
2729 static readonly migrateFailMessage : string = "Could not migrate the project!" ;
2830 static readonly backupFailMessage : string = "Could not backup project folders!" ;
@@ -38,15 +40,14 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
3840 ] ;
3941
4042 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 " } ,
4244 { 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 " } ,
4446 { packageName : "node-sass" , isDev : true , verifiedVersion : "4.12.0" } ,
45- { packageName : "typescript" , isDev : true , verifiedVersion : "3.4.1" } ,
4647 { 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 } ,
4849 { 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 " } ,
5051 { packageName : "nativescript-camera" , verifiedVersion : "4.5.0" } ,
5152 { packageName : "nativescript-geolocation" , verifiedVersion : "5.1.0" } ,
5253 { packageName : "nativescript-imagepicker" , verifiedVersion : "6.2.0" } ,
@@ -59,19 +60,18 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
5960 { packageName : "nativescript-ui-calendar" , verifiedVersion : "5.0.0-androidx-110619-2" } ,
6061 { packageName : "nativescript-ui-autocomplete" , verifiedVersion : "5.0.0-androidx-110619" } ,
6162 { packageName : "nativescript-datetimepicker" , verifiedVersion : "1.1.0" } ,
62- //TODO update with compatible with webpack only hooks
6363 { 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" } ,
6867 { packageName : "nativescript-permissions" , verifiedVersion : "1.3.0" } ,
6968 { packageName : "nativescript-cardview" , verifiedVersion : "3.2.0" } ,
7069 {
7170 packageName : "nativescript-unit-test-runner" , verifiedVersion : "0.6.4" ,
7271 shouldMigrateAction : ( projectData : IProjectData ) => this . hasDependency ( { packageName : "nativescript-unit-test-runner" , isDev : false } , projectData ) ,
7372 migrateAction : this . migrateUnitTestRunner . bind ( this )
74- }
73+ } ,
74+ { packageName : MigrateController . typescriptPackageName , isDev : true , getVerifiedVersion : this . getAngularTypeScriptVersion . bind ( this ) }
7575 ] ;
7676
7777 get verifiedPlatformVersions ( ) : IDictionary < string > {
@@ -96,14 +96,14 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
9696 }
9797
9898 try {
99- this . $logger . info ( "Backup auto-generated files." ) ;
99+ this . $logger . info ( "Clean auto-generated files." ) ;
100100 this . handleAutoGeneratedFiles ( backupDir , projectData ) ;
101- this . $logger . info ( "Backup auto-generated files complete." ) ;
101+ this . $logger . info ( "Clean auto-generated files complete." ) ;
102102 } catch ( error ) {
103103 this . $logger . trace ( `Error during auto-generated files handling. ${ ( error && error . message ) || error } ` ) ;
104104 }
105105
106- await this . migrateOldAndroidAppResources ( projectData ) ;
106+ await this . migrateOldAndroidAppResources ( projectData , backupDir ) ;
107107
108108 try {
109109 await this . cleanUpProject ( projectData ) ;
@@ -114,14 +114,6 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
114114 }
115115 }
116116
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-
125117 public async shouldMigrate ( { projectDir } : IProjectDir ) : Promise < boolean > {
126118 const projectData = this . $projectDataService . getProjectData ( projectDir ) ;
127119
@@ -158,6 +150,43 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
158150 }
159151 }
160152
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+
161190 private async cleanUpProject ( projectData : IProjectData ) : Promise < void > {
162191 this . $logger . info ( "Clean old project artefacts." ) ;
163192 this . $projectDataService . removeNSConfigProperty ( projectData . projectDir , "useLegacyWorkflow" ) ;
@@ -270,23 +299,34 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
270299 if ( ! replacementDep ) {
271300 this . $errors . failWithoutHelp ( "Failed to find replacement dependency." ) ;
272301 }
302+
303+ const replacementDepVersion = await this . getDependencyVerifiedVersion ( replacementDep , projectData ) ;
273304 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 ) ;
275306 }
276307
277308 return ;
278309 }
279310
311+ const dependencyVersion = await this . getDependencyVerifiedVersion ( dependency , projectData ) ;
280312 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 ) ;
283315 return ;
284316 }
285317
286318 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 ) ;
289327 }
328+
329+ return dependency . verifiedVersion ;
290330 }
291331
292332 private async shouldMigrateDependencyVersion ( dependency : IMigrationDependency , projectData : IProjectData ) : Promise < boolean > {
@@ -295,8 +335,9 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
295335 const packageName = dependency . packageName ;
296336 const version = dependencies [ packageName ] || devDependencies [ packageName ] ;
297337 const maxSatisfyingVersion = await this . getMaxDependencyVersion ( dependency . packageName , version ) ;
338+ const dependencyVersion = await this . getDependencyVerifiedVersion ( dependency , projectData ) ;
298339
299- return ! ( maxSatisfyingVersion && semver . gte ( maxSatisfyingVersion , dependency . verifiedVersion ) ) ;
340+ return ! ( maxSatisfyingVersion && semver . gte ( maxSatisfyingVersion , dependencyVersion ) ) ;
300341 }
301342
302343 protected async shouldUpdateRuntimeVersion ( { targetVersion, platform, projectData } : { targetVersion : string , platform : string , projectData : IProjectData } ) : Promise < boolean > {
0 commit comments