Skip to content

Commit d679094

Browse files
committed
fix(migrate): get the TypeScript version from the Angular peer dependency when available
1 parent 19ae3ef commit d679094

File tree

4 files changed

+67
-26
lines changed

4 files changed

+67
-26
lines changed

lib/controllers/migrate-controller.ts

+47-9
Original file line numberDiff line numberDiff line change
@@ -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" },
@@ -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> {

lib/controllers/update-controller-base.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@ import * as path from "path";
22
import * as semver from "semver";
33

44
export class UpdateControllerBase {
5+
protected getTemplateManifest: Function;
6+
57
constructor(protected $fs: IFileSystem,
68
protected $platformCommandHelper: IPlatformCommandHelper,
79
protected $platformsDataService: IPlatformsDataService,
810
protected $packageInstallationManager: IPackageInstallationManager,
9-
protected $packageManager: IPackageManager) {
11+
protected $packageManager: IPackageManager,
12+
protected $pacoteService: IPacoteService) {
13+
this.getTemplateManifest = _.memoize(this._getTemplateManifest, (...args) => {
14+
return args.join("@");
15+
});
1016
}
1117

1218
protected restoreBackup(folders: string[], backupDir: string, projectDir: string): void {
@@ -39,13 +45,13 @@ export class UpdateControllerBase {
3945
return (dependencies && dependencies[dependency.packageName]) || (devDependencies && devDependencies[dependency.packageName]);
4046
}
4147

42-
protected hasRuntimeDependency({platform, projectData}: {platform: string, projectData: IProjectData}): boolean {
48+
protected hasRuntimeDependency({ platform, projectData }: { platform: string, projectData: IProjectData }): boolean {
4349
const lowercasePlatform = platform.toLowerCase();
4450
const currentPlatformVersion = this.$platformCommandHelper.getCurrentPlatformVersion(lowercasePlatform, projectData);
4551
return !!currentPlatformVersion;
4652
}
4753

48-
protected async getMaxRuntimeVersion({platform, projectData}: {platform: string, projectData: IProjectData}) {
54+
protected async getMaxRuntimeVersion({ platform, projectData }: { platform: string, projectData: IProjectData }) {
4955
const lowercasePlatform = platform.toLowerCase();
5056
const currentPlatformVersion = this.$platformCommandHelper.getCurrentPlatformVersion(lowercasePlatform, projectData);
5157
const platformData = this.$platformsDataService.getPlatformData(lowercasePlatform, projectData);
@@ -66,4 +72,12 @@ export class UpdateControllerBase {
6672

6773
return maxDependencyVersion;
6874
}
75+
76+
private async _getTemplateManifest(templateName: string, version?: string) {
77+
const packageVersion = semver.valid(version) ||
78+
await this.$packageManager.getTagVersion(templateName, version) ||
79+
await this.$packageInstallationManager.getLatestCompatibleVersionSafe(templateName);
80+
81+
return await this.$pacoteService.manifest(`${templateName}@${packageVersion}`, { fullMetadata: true });
82+
}
6983
}

lib/controllers/update-controller.ts

+2-14
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import * as constants from "../constants";
44
import { UpdateControllerBase } from "./update-controller-base";
55

66
export class UpdateController extends UpdateControllerBase implements IUpdateController {
7-
private getTemplateManifest: Function;
87
static readonly updatableDependencies: string[] = [
98
constants.TNS_CORE_MODULES_NAME,
109
constants.TNS_CORE_MODULES_WIDGETS_NAME,
@@ -31,12 +30,9 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
3130
private $addPlatformService: IAddPlatformService,
3231
private $logger: ILogger,
3332
private $pluginsService: IPluginsService,
34-
private $pacoteService: IPacoteService,
33+
protected $pacoteService: IPacoteService,
3534
private $projectDataService: IProjectDataService) {
36-
super($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager);
37-
this.getTemplateManifest = _.memoize(this._getTemplateManifest, (...args) => {
38-
return args.join("@");
39-
});
35+
super($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager, $pacoteService);
4036
}
4137

4238
public async update(updateOptions: IUpdateOptions): Promise<void> {
@@ -183,14 +179,6 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
183179
return maxTemplateRuntimeVersion && maxRuntimeVersion && semver.gt(maxTemplateRuntimeVersion, maxRuntimeVersion);
184180
}
185181

186-
private async _getTemplateManifest(templateName: string, version?: string) {
187-
const packageVersion = semver.valid(version) ||
188-
await this.$packageManager.getTagVersion(templateName, version) ||
189-
await this.$packageInstallationManager.getLatestCompatibleVersionSafe(templateName);
190-
191-
return await this.$pacoteService.manifest(`${templateName}@${packageVersion}`, { fullMetadata: true });
192-
}
193-
194182
private getUpdatableDependencies(dependencies: IDictionary<string>): IDictionary<string> {
195183
return _.pickBy(dependencies, (value, key) => {
196184
return UpdateController.updatableDependencies.indexOf(key) > -1;

lib/definitions/migrate.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ interface IMigrationDependency extends IDependency {
1313
replaceWith?: string;
1414
warning?: string;
1515
verifiedVersion?: string;
16+
getVerifiedVersion?: (projectData: IProjectData) => Promise<string>;
1617
shouldAddIfMissing?: boolean;
1718
shouldMigrateAction?: (projectData: IProjectData) => boolean;
1819
migrateAction?: (projectData: IProjectData, migrationBackupDirPath: string) => Promise<IMigrationDependency[]>;

0 commit comments

Comments
 (0)