@@ -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!" ;
@@ -42,9 +44,34 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
4244 { packageName : constants . TNS_CORE_MODULES_WIDGETS_NAME , verifiedVersion : "6.0.0" } ,
4345 { 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" } ,
47+ {
48+ packageName : MigrateController . typescriptPackageName , isDev : true , getVerifiedVersion : async ( projectData : IProjectData ) => {
49+ let verifiedVersion = "3.4.1" ;
50+ try {
51+ const ngcPackageName = "@angular/compiler-cli" ;
52+ // e.g. ~8.0.0
53+ let ngcVersion = projectData . dependencies [ ngcPackageName ] || projectData . devDependencies [ ngcPackageName ] ;
54+ if ( ngcVersion ) {
55+ // e.g. ~8.0.3
56+ ngcVersion = await this . $packageInstallationManager . maxSatisfyingVersion ( ngcPackageName , ngcVersion ) ;
57+ const ngcManifest = await this . getTemplateManifest ( ngcPackageName , ngcVersion ) ;
58+ // e.g. >=3.4 <3.5
59+ verifiedVersion = ( ngcManifest && ngcManifest . peerDependencies &&
60+ ngcManifest . peerDependencies [ MigrateController . typescriptPackageName ] ) || verifiedVersion ;
61+
62+ // e.g. 3.4.4
63+ verifiedVersion = await this . $packageInstallationManager . maxSatisfyingVersion (
64+ MigrateController . typescriptPackageName , verifiedVersion ) ;
65+ }
66+ } catch ( error ) {
67+ this . $logger . warn ( `Unable to determine the TypeScript version based on the Angular packages. Error is: '${ error } '.` ) ;
68+ }
69+
70+ return verifiedVersion ;
71+ }
72+ } ,
4673 { packageName : "nativescript-dev-sass" , isDev : true , replaceWith : "node-sass" } ,
47- { packageName : "nativescript-dev-typescript" , isDev : true , replaceWith : "typescript" } ,
74+ { packageName : "nativescript-dev-typescript" , isDev : true , replaceWith : MigrateController . typescriptPackageName } ,
4875 { 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" } ,
4976 { packageName : constants . WEBPACK_PLUGIN_NAME , isDev : true , shouldAddIfMissing : true , verifiedVersion : "1.0.0-rc-2019-07-10-002255-01" } ,
5077 { packageName : "nativescript-camera" , verifiedVersion : "4.5.0" } ,
@@ -112,18 +139,6 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
112139 }
113140 }
114141
115- private async migrateOldAndroidAppResources ( projectData : IProjectData ) {
116- const appResourcesPath = projectData . getAppResourcesDirectoryPath ( ) ;
117- if ( ! this . $androidResourcesMigrationService . hasMigrated ( appResourcesPath ) ) {
118- this . $logger . info ( "Migrate old Android App_Resources structure." ) ;
119- try {
120- await this . $androidResourcesMigrationService . migrate ( appResourcesPath ) ;
121- } catch ( error ) {
122- this . $logger . warn ( "Migrate old Android App_Resources structure failed: " , error . message ) ;
123- }
124- }
125- }
126-
127142 public async shouldMigrate ( { projectDir } : IProjectDir ) : Promise < boolean > {
128143 const projectData = this . $projectDataService . getProjectData ( projectDir ) ;
129144
@@ -160,6 +175,18 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
160175 }
161176 }
162177
178+ private async migrateOldAndroidAppResources ( projectData : IProjectData ) {
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 ) ;
184+ } catch ( error ) {
185+ this . $logger . warn ( "Migrate old Android App_Resources structure failed: " , error . message ) ;
186+ }
187+ }
188+ }
189+
163190 private async cleanUpProject ( projectData : IProjectData ) : Promise < void > {
164191 this . $logger . info ( "Clean old project artefacts." ) ;
165192 this . $projectDataService . removeNSConfigProperty ( projectData . projectDir , "useLegacyWorkflow" ) ;
@@ -261,6 +288,7 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
261288
262289 private async migrateDependency ( dependency : IMigrationDependency , projectData : IProjectData ) : Promise < void > {
263290 const hasDependency = this . hasDependency ( dependency , projectData ) ;
291+ const dependencyVersion = await this . getDependencyVerifiedVersion ( dependency , projectData ) ;
264292 if ( dependency . warning ) {
265293 this . $logger . warn ( dependency . warning ) ;
266294 }
@@ -272,33 +300,43 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
272300 if ( ! replacementDep ) {
273301 this . $errors . failWithoutHelp ( "Failed to find replacement dependency." ) ;
274302 }
303+
304+ const replacementDepVersion = await this . getDependencyVerifiedVersion ( replacementDep , projectData ) ;
275305 this . $logger . info ( `Replacing '${ dependency . packageName } ' with '${ replacementDep . packageName } '.` ) ;
276- this . $pluginsService . addToPackageJson ( replacementDep . packageName , replacementDep . verifiedVersion , replacementDep . isDev , projectData . projectDir ) ;
306+ this . $pluginsService . addToPackageJson ( replacementDep . packageName , replacementDepVersion , replacementDep . isDev , projectData . projectDir ) ;
277307 }
278308
279309 return ;
280310 }
281311
282312 if ( hasDependency && await this . shouldMigrateDependencyVersion ( dependency , projectData ) ) {
283- this . $logger . info ( `Updating '${ dependency . packageName } ' to compatible version '${ dependency . verifiedVersion } '` ) ;
284- 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 ) ;
285315 return ;
286316 }
287317
288318 if ( ! hasDependency && dependency . shouldAddIfMissing ) {
289- this . $logger . info ( `Adding '${ dependency . packageName } ' with version '${ dependency . verifiedVersion } '` ) ;
290- 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 ) ;
291321 }
292322 }
293323
324+ private async getDependencyVerifiedVersion ( dependency : IMigrationDependency , projectData : IProjectData ) : Promise < string > {
325+ const verifiedVersion = dependency . getVerifiedVersion ?
326+ await dependency . getVerifiedVersion ( projectData ) : dependency . verifiedVersion ;
327+
328+ return verifiedVersion ;
329+ }
330+
294331 private async shouldMigrateDependencyVersion ( dependency : IMigrationDependency , projectData : IProjectData ) : Promise < boolean > {
295332 const devDependencies = projectData . devDependencies || { } ;
296333 const dependencies = projectData . dependencies || { } ;
297334 const packageName = dependency . packageName ;
298335 const version = dependencies [ packageName ] || devDependencies [ packageName ] ;
299336 const maxSatisfyingVersion = await this . getMaxDependencyVersion ( dependency . packageName , version ) ;
337+ const dependencyVersion = await this . getDependencyVerifiedVersion ( dependency , projectData ) ;
300338
301- return ! ( maxSatisfyingVersion && semver . gte ( maxSatisfyingVersion , dependency . verifiedVersion ) ) ;
339+ return ! ( maxSatisfyingVersion && semver . gte ( maxSatisfyingVersion , dependencyVersion ) ) ;
302340 }
303341
304342 protected async shouldUpdateRuntimeVersion ( { targetVersion, platform, projectData } : { targetVersion : string , platform : string , projectData : IProjectData } ) : Promise < boolean > {
0 commit comments