Skip to content

Commit 9e61ab7

Browse files
author
Dimitar Tachev
authored
Merge pull request #4829 from NativeScript/tachev/include-dev-webpack-in-update
fix: final Update and Migrate improvements
2 parents ce304f9 + c0d4e47 commit 9e61ab7

File tree

6 files changed

+99
-52
lines changed

6 files changed

+99
-52
lines changed

lib/controllers/migrate-controller.ts

+70-29
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!";
@@ -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> {

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 getPackageManifest: 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.getPackageManifest = _.memoize(this._getManifestManifest, (...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 _getManifestManifest(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

+8-17
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ 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;
8-
static readonly updatableDependencies: string[] = [constants.TNS_CORE_MODULES_NAME, constants.TNS_CORE_MODULES_WIDGETS_NAME];
7+
static readonly updatableDependencies: string[] = [
8+
constants.TNS_CORE_MODULES_NAME,
9+
constants.TNS_CORE_MODULES_WIDGETS_NAME,
10+
constants.WEBPACK_PLUGIN_NAME];
911
static readonly folders: string[] = [
1012
constants.LIB_DIR_NAME,
1113
constants.HOOKS_DIR_NAME,
@@ -28,12 +30,9 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
2830
private $addPlatformService: IAddPlatformService,
2931
private $logger: ILogger,
3032
private $pluginsService: IPluginsService,
31-
private $pacoteService: IPacoteService,
33+
protected $pacoteService: IPacoteService,
3234
private $projectDataService: IProjectDataService) {
33-
super($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager);
34-
this.getTemplateManifest = _.memoize(this._getTemplateManifest, (...args) => {
35-
return args.join("@");
36-
});
35+
super($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager, $pacoteService);
3736
}
3837

3938
public async update(updateOptions: IUpdateOptions): Promise<void> {
@@ -60,7 +59,7 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
6059
public async shouldUpdate({ projectDir, version }: { projectDir: string, version?: string }): Promise<boolean> {
6160
const projectData = this.$projectDataService.getProjectData(projectDir);
6261
const templateName = this.getTemplateName(projectData);
63-
const templateManifest = await this.getTemplateManifest(templateName, version);
62+
const templateManifest = await this.getPackageManifest(templateName, version);
6463
const dependencies = this.getUpdatableDependencies(templateManifest.dependencies);
6564
const devDependencies = this.getUpdatableDependencies(templateManifest.devDependencies);
6665

@@ -94,7 +93,7 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
9493

9594
private async updateProject(projectData: IProjectData, version: string): Promise<void> {
9695
const templateName = this.getTemplateName(projectData);
97-
const templateManifest = await this.getTemplateManifest(templateName, version);
96+
const templateManifest = await this.getPackageManifest(templateName, version);
9897
const dependencies = this.getUpdatableDependencies(templateManifest.dependencies);
9998
const devDependencies = this.getUpdatableDependencies(templateManifest.devDependencies);
10099

@@ -180,14 +179,6 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
180179
return maxTemplateRuntimeVersion && maxRuntimeVersion && semver.gt(maxTemplateRuntimeVersion, maxRuntimeVersion);
181180
}
182181

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

lib/declarations.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ interface IInfoService {
603603
interface IAndroidResourcesMigrationService {
604604
canMigrate(platformString: string): boolean;
605605
hasMigrated(appResourcesDir: string): boolean;
606-
migrate(appResourcesDir: string): Promise<void>;
606+
migrate(appResourcesDir: string, backupLocation?: string): Promise<void>;
607607
}
608608

609609
/**

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[]>;

lib/services/android-resources-migration-service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ export class AndroidResourcesMigrationService implements IAndroidResourcesMigrat
2020
return this.$fs.exists(path.join(appResourcesDir, AndroidResourcesMigrationService.ANDROID_DIR, constants.SRC_DIR, constants.MAIN_DIR));
2121
}
2222

23-
public async migrate(appResourcesDir: string): Promise<void> {
23+
public async migrate(appResourcesDir: string, backupLocation?: string): Promise<void> {
2424
const originalAppResources = path.join(appResourcesDir, AndroidResourcesMigrationService.ANDROID_DIR);
2525
const appResourcesDestination = path.join(appResourcesDir, AndroidResourcesMigrationService.ANDROID_DIR_TEMP);
26-
const appResourcesBackup = path.join(appResourcesDir, AndroidResourcesMigrationService.ANDROID_DIR_OLD);
26+
const appResourcesBackup = path.join(backupLocation || appResourcesDir, AndroidResourcesMigrationService.ANDROID_DIR_OLD);
2727

2828
try {
2929
await this.tryMigrate(originalAppResources, appResourcesDestination, appResourcesBackup);

0 commit comments

Comments
 (0)