Skip to content

Commit 803a6ac

Browse files
committed
refactor: extract logic to base class
1 parent f45bdea commit 803a6ac

File tree

6 files changed

+112
-63
lines changed

6 files changed

+112
-63
lines changed

lib/controllers/base-update-controller.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import * as path from "path";
2+
import * as semver from "semver";
23

34
export class BaseUpdateController {
4-
constructor(protected $fs: IFileSystem) {
5+
constructor(protected $fs: IFileSystem,
6+
protected $platformCommandHelper: IPlatformCommandHelper,
7+
protected $platformsDataService: IPlatformsDataService,
8+
protected $packageInstallationManager: IPackageInstallationManager,
9+
protected $packageManager: IPackageManager) {
510
}
611

712
protected restoreBackup(folders: string[], tmpDir: string, projectData: IProjectData): void {
@@ -26,4 +31,40 @@ export class BaseUpdateController {
2631
}
2732
}
2833
}
34+
35+
protected shouldSkipDependency(dependency: IDependency, projectData: IProjectData): boolean {
36+
const collection = dependency.isDev ? projectData.devDependencies : projectData.dependencies;
37+
if (!collection[dependency.packageName]) {
38+
return true;
39+
}
40+
}
41+
42+
protected async shouldUpdateRuntimeVersion({targetVersion, platform, projectData, shouldAdd}: {targetVersion: string, platform: string, projectData: IProjectData, shouldAdd: boolean}) {
43+
const lowercasePlatform = platform.toLowerCase();
44+
const currentPlatformVersion = this.$platformCommandHelper.getCurrentPlatformVersion(lowercasePlatform, projectData);
45+
const platformData = this.$platformsDataService.getPlatformData(lowercasePlatform, projectData);
46+
if (currentPlatformVersion) {
47+
const maxPlatformSatisfyingVersion = await this.$packageInstallationManager.maxSatisfyingVersion(platformData.frameworkPackageName, currentPlatformVersion) || currentPlatformVersion;
48+
if (semver.gte(maxPlatformSatisfyingVersion, targetVersion)) {
49+
return false;
50+
}
51+
} else if (!shouldAdd) {
52+
return false;
53+
}
54+
55+
return true;
56+
}
57+
58+
protected async getMaxDependencyVersion(dependency: string, version: string) {
59+
let maxDependencyVersion;
60+
if (semver.valid(version)) {
61+
maxDependencyVersion = version;
62+
} else if (semver.validRange(version)) {
63+
maxDependencyVersion = await this.$packageInstallationManager.maxSatisfyingVersion(dependency, version);
64+
} else {
65+
maxDependencyVersion = await this.$packageManager.getTagVersion(dependency, version);
66+
}
67+
68+
return maxDependencyVersion;
69+
}
2970
}

lib/controllers/migrate-controller.ts

Lines changed: 30 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,18 @@ import * as semver from "semver";
33
import * as constants from "../constants";
44
import { BaseUpdateController } from "./base-update-controller";
55

6-
interface IDependency {
7-
packageName: string;
8-
isDev?: boolean;
9-
}
10-
11-
interface IMigrationDependency extends IDependency {
12-
mustRemove?: boolean;
13-
replaceWith?: string;
14-
verifiedVersion?: string;
15-
shouldAdd?: boolean;
16-
}
17-
186
export class MigrateController extends BaseUpdateController implements IMigrateController {
197
constructor(
208
protected $fs: IFileSystem,
9+
protected $platformCommandHelper: IPlatformCommandHelper,
10+
protected $platformsDataService: IPlatformsDataService,
11+
protected $packageInstallationManager: IPackageInstallationManager,
12+
protected $packageManager: IPackageManager,
2113
private $logger: ILogger,
22-
private $platformCommandHelper: IPlatformCommandHelper,
23-
private $platformsDataService: IPlatformsDataService,
2414
private $addPlatformService: IAddPlatformService,
2515
private $pluginsService: IPluginsService,
26-
private $projectDataService: IProjectDataService,
27-
private $packageManager: INodePackageManager,
28-
private $packageInstallationManager: IPackageInstallationManager) {
29-
super($fs);
16+
private $projectDataService: IProjectDataService) {
17+
super($fs, $platformCommandHelper, $platformsDataService, $packageInstallationManager, $packageManager);
3018
}
3119

3220
static readonly folders: string[] = [
@@ -111,12 +99,12 @@ export class MigrateController extends BaseUpdateController implements IMigrateC
11199
return true;
112100
}
113101

114-
if (!this.shouldSkipDependency(dependency, projectData) && await this.shouldMigrateDependencyVersion(dependency, projectData)) {
102+
if (!this.shouldSkipMigrationDependency(dependency, projectData) && await this.shouldMigrateDependencyVersion(dependency, projectData)) {
115103
return true;
116104
}
117105
}
118106
for (const platform in constants.DEVICE_PLATFORMS) {
119-
if (await this.shouldMigrateRuntimeVersion(platform, projectData)) {
107+
if (await this.shouldUpdateRuntimeVersion({ targetVersion: MigrateController.verifiedPlatformVersions[platform.toLowerCase()], platform, projectData, shouldAdd: true})) {
120108
return true;
121109
}
122110
}
@@ -137,7 +125,7 @@ export class MigrateController extends BaseUpdateController implements IMigrateC
137125
this.$logger.info("Start migrating dependencies.");
138126
for (let i = 0; i < MigrateController.migrationDependencies.length; i++) {
139127
const dependency = MigrateController.migrationDependencies[i];
140-
if (this.shouldSkipDependency(dependency, projectData)) {
128+
if (this.shouldSkipMigrationDependency(dependency, projectData)) {
141129
continue;
142130
}
143131

@@ -153,8 +141,8 @@ export class MigrateController extends BaseUpdateController implements IMigrateC
153141
}
154142

155143
for (const platform in constants.DEVICE_PLATFORMS) {
156-
if (await this.shouldMigrateRuntimeVersion(platform, projectData)) {
157-
const lowercasePlatform = platform.toLowerCase();
144+
const lowercasePlatform = platform.toLowerCase();
145+
if (await this.shouldUpdateRuntimeVersion({targetVersion: MigrateController.verifiedPlatformVersions[lowercasePlatform], platform, projectData, shouldAdd: true})) {
158146
const verifiedPlatformVersion = MigrateController.verifiedPlatformVersions[lowercasePlatform];
159147
const platformData = this.$platformsDataService.getPlatformData(lowercasePlatform, projectData);
160148
this.$logger.info(`Updating ${platform} platform to version '${verifiedPlatformVersion}'.`);
@@ -177,52 +165,35 @@ export class MigrateController extends BaseUpdateController implements IMigrateC
177165
const collection = dependency.isDev ? projectData.devDependencies : projectData.dependencies;
178166
if (
179167
collection &&
180-
collection[dependency.packageName] &&
181-
(semver.valid(collection[dependency.packageName]) || semver.validRange(collection[dependency.packageName]))
168+
collection[dependency.packageName]
182169
) {
183-
const maxSatisfyingVersion = await this.$packageInstallationManager.maxSatisfyingVersion(dependency.packageName, collection[dependency.packageName]) || collection[dependency.packageName];
184-
const isPrereleaseVersion = semver.prerelease(maxSatisfyingVersion);
185-
const coerceMaxSatisfying = semver.coerce(maxSatisfyingVersion).version;
186-
const coerceVerifiedVersion = semver.coerce(dependency.verifiedVersion).version;
187-
//This makes sure that if the user has a prerelease 6.0.0-next-2019-06-10-092158-01 version we will update it to 6.0.0
188-
if (isPrereleaseVersion) {
189-
if (semver.gt(coerceMaxSatisfying, coerceVerifiedVersion)) {
170+
const maxSatisfyingVersion = await this.getMaxDependencyVersion(dependency.packageName, collection[dependency.packageName]);
171+
if (maxSatisfyingVersion) {
172+
const isPrereleaseVersion = semver.prerelease(maxSatisfyingVersion);
173+
const coerceMaxSatisfying = semver.coerce(maxSatisfyingVersion).version;
174+
const coerceVerifiedVersion = semver.coerce(dependency.verifiedVersion).version;
175+
//This makes sure that if the user has a prerelease 6.0.0-next-2019-06-10-092158-01 version we will update it to 6.0.0
176+
if (isPrereleaseVersion) {
177+
if (semver.gt(coerceMaxSatisfying, coerceVerifiedVersion)) {
178+
return false;
179+
}
180+
181+
//TODO This should be removed once we update the verified versions to no prerelease versions
182+
if (semver.eq(maxSatisfyingVersion, dependency.verifiedVersion)) {
183+
return false;
184+
}
185+
} else if (semver.gte(coerceMaxSatisfying, coerceVerifiedVersion)) {
190186
return false;
191187
}
192-
193-
//TODO This should be removed once we update the verified versions to no prerelease versions
194-
if (isPrereleaseVersion && semver.eq(maxSatisfyingVersion, dependency.verifiedVersion)) {
195-
return false;
196-
}
197-
} else if (semver.gte(coerceMaxSatisfying, coerceVerifiedVersion)) {
198-
return false;
199-
}
200-
}
201-
202-
return true;
203-
}
204-
205-
private async shouldMigrateRuntimeVersion(platform: string, projectData: IProjectData) {
206-
const lowercasePlatform = platform.toLowerCase();
207-
const currentPlatformVersion = this.$platformCommandHelper.getCurrentPlatformVersion(lowercasePlatform, projectData);
208-
const verifiedPlatformVersion = MigrateController.verifiedPlatformVersions[lowercasePlatform];
209-
const platformData = this.$platformsDataService.getPlatformData(lowercasePlatform, projectData);
210-
if (currentPlatformVersion) {
211-
const maxPlatformSatisfyingVersion = await this.$packageInstallationManager.maxSatisfyingVersion(platformData.frameworkPackageName, currentPlatformVersion) || currentPlatformVersion;
212-
if (semver.gte(maxPlatformSatisfyingVersion, verifiedPlatformVersion)) {
213-
return false;
214188
}
215189
}
216190

217191
return true;
218192
}
219193

220-
private shouldSkipDependency(dependency: IMigrationDependency, projectData: IProjectData): boolean {
194+
private shouldSkipMigrationDependency(dependency: IMigrationDependency, projectData: IProjectData) {
221195
if (!dependency.shouldAdd) {
222-
const collection = dependency.isDev ? projectData.devDependencies : projectData.dependencies;
223-
if (!collection[dependency.packageName]) {
224-
return true;
225-
}
196+
return this.shouldSkipDependency(dependency, projectData);
226197
}
227198
}
228199
}

lib/declarations.d.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,16 @@ interface INodePackageManager {
7575
getCachePath(): Promise<string>;
7676
}
7777

78+
interface IPackageManager extends INodePackageManager {
79+
/**
80+
* Gets the version corresponding to the tag for the package
81+
* @param {string} packageName The name of the package.
82+
* @param {string} tag The tag which we need the version of.
83+
* @returns {string} The version corresponding to the tag
84+
*/
85+
getTagVersion(packageName: string, tag: string): Promise<string>
86+
}
87+
7888
interface IPerformanceService {
7989
// Will process the data based on the command opitons (--performance flag and user-reporting setting)
8090
processExecutionData(methodInfo: string, startTime: number, endTime: number, args: any[]): void;

lib/definitions/migrate.d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
interface IMigrateController {
22
migrate(migrateData: IProjectDir): Promise<void>;
33
shouldMigrate(data: IProjectDir): Promise<boolean>;
4+
}
5+
6+
interface IDependency {
7+
packageName: string;
8+
isDev?: boolean;
9+
}
10+
11+
interface IMigrationDependency extends IDependency {
12+
mustRemove?: boolean;
13+
replaceWith?: string;
14+
verifiedVersion?: string;
15+
shouldAdd?: boolean;
416
}

lib/package-installation-manager.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ export class PackageInstallationManager implements IPackageInstallationManager {
3939
public async maxSatisfyingVersion(packageName: string, versionRange: string): Promise<string> {
4040
const data = await this.$packageManager.view(packageName, { "versions": true });
4141

42-
const maxSatisfying = semver.maxSatisfying(data, versionRange);
43-
return maxSatisfying ;
42+
return semver.maxSatisfying(data, versionRange);
4443
}
4544

4645
public async getLatestCompatibleVersionSafe(packageName: string, referenceVersion?: string): Promise<string> {

lib/package-manager.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11

22
import { cache, exported, invokeInit } from './common/decorators';
33
import { performanceLog } from "./common/decorators";
4-
export class PackageManager implements INodePackageManager {
4+
export class PackageManager implements IPackageManager {
55
private packageManager: INodePackageManager;
66

77
constructor(
88
private $errors: IErrors,
99
private $npm: INodePackageManager,
1010
private $options: IOptions,
1111
private $yarn: INodePackageManager,
12+
private $logger: ILogger,
1213
private $userSettingsService: IUserSettingsService
1314
) { }
1415

@@ -69,6 +70,21 @@ export class PackageManager implements INodePackageManager {
6970
return this.packageManager.getCachePath();
7071
}
7172

73+
public async getTagVersion(packageName: string, tag: string): Promise<string> {
74+
let version: string = null;
75+
76+
try {
77+
const result = await this.view(packageName, { "dist-tags": true });
78+
version = result[tag];
79+
} catch (err) {
80+
this.$logger.trace(`Error while getting tag version from view command: ${err}`);
81+
const registryData = await this.getRegistryPackageData(packageName);
82+
version = registryData["dist-tags"][tag];
83+
}
84+
85+
return version;
86+
}
87+
7288
private async _determinePackageManager(): Promise<INodePackageManager> {
7389
let pm = null;
7490
try {

0 commit comments

Comments
 (0)