Skip to content

Commit 6b185be

Browse files
authored
Merge pull request #4769 from NativeScript/kddimitrov/migrate-dependency-in-wrong-goup
fix: dependency won't be migrated if in devDependencies
2 parents 5ed3063 + f24e3d3 commit 6b185be

File tree

5 files changed

+46
-17
lines changed

5 files changed

+46
-17
lines changed

lib/controllers/migrate-controller.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
245245
const hasDependency = this.hasDependency(dependency, projectData);
246246

247247
if (hasDependency && dependency.replaceWith) {
248-
this.$pluginsService.removeFromPackageJson(dependency.packageName, dependency.isDev, projectData.projectDir);
248+
this.$pluginsService.removeFromPackageJson(dependency.packageName, projectData.projectDir);
249249
const replacementDep = _.find(this.migrationDependencies, migrationPackage => migrationPackage.packageName === dependency.replaceWith);
250250
if (!replacementDep) {
251251
this.$errors.failWithoutHelp("Failed to find replacement dependency.");
@@ -268,8 +268,11 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
268268
}
269269

270270
private async shouldMigrateDependencyVersion(dependency: IMigrationDependency, projectData: IProjectData): Promise<boolean> {
271-
const collection = dependency.isDev ? projectData.devDependencies : projectData.dependencies;
272-
const maxSatisfyingVersion = await this.getMaxDependencyVersion(dependency.packageName, collection[dependency.packageName]);
271+
const devDependencies = projectData.devDependencies || {};
272+
const dependencies = projectData.dependencies || {};
273+
const packageName = dependency.packageName;
274+
const version = dependencies[packageName] || devDependencies[packageName];
275+
const maxSatisfyingVersion = await this.getMaxDependencyVersion(dependency.packageName, version);
273276

274277
return !(maxSatisfyingVersion && semver.gte(maxSatisfyingVersion, dependency.verifiedVersion));
275278
}

lib/controllers/update-controller-base.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ export class UpdateControllerBase {
3333
}
3434

3535
protected hasDependency(dependency: IDependency, projectData: IProjectData): boolean {
36-
const collection = dependency.isDev ? projectData.devDependencies : projectData.dependencies;
37-
return collection && collection[dependency.packageName];
36+
const devDependencies = projectData.devDependencies;
37+
const dependencies = projectData.dependencies;
38+
39+
return (dependencies && dependencies[dependency.packageName]) || (devDependencies && devDependencies[dependency.packageName]);
3840
}
3941

4042
protected hasRuntimeDependency({platform, projectData}: {platform: string, projectData: IProjectData}): boolean {

lib/controllers/update-controller.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,16 +121,17 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
121121
continue;
122122
}
123123

124-
if (await this.shouldUpdateDependency(dependency, templateVersion, areDev, projectData)) {
124+
if (await this.shouldUpdateDependency(dependency, templateVersion, projectData)) {
125125
this.$logger.info(`Updating '${dependency}' to version '${templateVersion}'.`);
126126
this.$pluginsService.addToPackageJson(dependency, templateVersion, areDev, projectData.projectDir);
127127
}
128128
}
129129
}
130130

131-
private async shouldUpdateDependency(dependency: string, targetVersion: string, isDev: boolean, projectData: IProjectData) {
132-
const collection = isDev ? projectData.devDependencies : projectData.dependencies;
133-
const projectVersion = collection[dependency];
131+
private async shouldUpdateDependency(dependency: string, targetVersion: string, projectData: IProjectData) {
132+
const devDependencies = projectData.devDependencies || {};
133+
const dependencies = projectData.dependencies || {};
134+
const projectVersion = dependencies[dependency] || devDependencies[dependency];
134135
const maxSatisfyingTargetVersion = await this.getMaxDependencyVersion(dependency, targetVersion);
135136
const maxSatisfyingProjectVersion = await this.getMaxDependencyVersion(dependency, projectVersion);
136137

@@ -144,7 +145,7 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
144145
continue;
145146
}
146147

147-
if (await this.shouldUpdateDependency(dependency, templateVersion, areDev, projectData)) {
148+
if (await this.shouldUpdateDependency(dependency, templateVersion, projectData)) {
148149
return true;
149150
}
150151
}

lib/definitions/plugins.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ interface IPluginsService {
22
add(plugin: string, projectData: IProjectData): Promise<void>; // adds plugin by name, github url, local path and et.
33
remove(pluginName: string, projectData: IProjectData): Promise<void>; // removes plugin only by name
44
addToPackageJson(plugin: string, version: string, isDev: boolean, projectDir: string): void;
5-
removeFromPackageJson(plugin: string, isDev: boolean, projectDir: string): void;
5+
removeFromPackageJson(plugin: string, projectDir: string): void;
66
getAllInstalledPlugins(projectData: IProjectData): Promise<IPluginData[]>;
77
ensureAllDependenciesAreInstalled(projectData: IProjectData): Promise<void>;
88

lib/services/plugins-service.ts

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,23 +90,27 @@ export class PluginsService implements IPluginsService {
9090

9191
public addToPackageJson(plugin: string, version: string, isDev: boolean, projectDir: string) {
9292
const packageJsonPath = this.getPackageJsonFilePath(projectDir);
93-
const packageJsonContent = this.$fs.readJson(packageJsonPath);
93+
let packageJsonContent = this.$fs.readJson(packageJsonPath);
9494
const collectionKey = isDev ? "devDependencies" : "dependencies";
95+
const oppositeCollectionKey = isDev ? "dependencies" : "devDependencies";
96+
if (packageJsonContent[oppositeCollectionKey] && packageJsonContent[oppositeCollectionKey][plugin]) {
97+
const result = this.removeDependencyFromPackageJsonContent(plugin, packageJsonContent);
98+
packageJsonContent = result.packageJsonContent;
99+
}
95100

96101
packageJsonContent[collectionKey] = packageJsonContent[collectionKey] || {};
97102
packageJsonContent[collectionKey][plugin] = version;
98103

99104
this.$fs.writeJson(packageJsonPath, packageJsonContent);
100105
}
101106

102-
public removeFromPackageJson(plugin: string, isDev: boolean, projectDir: string) {
107+
public removeFromPackageJson(plugin: string, projectDir: string) {
103108
const packageJsonPath = this.getPackageJsonFilePath(projectDir);
104109
const packageJsonContent = this.$fs.readJson(packageJsonPath);
105-
const collection = isDev ? packageJsonContent.devDependencies : packageJsonContent.dependencies;
110+
const result = this.removeDependencyFromPackageJsonContent(plugin, packageJsonContent);
106111

107-
if (collection && collection[plugin]) {
108-
delete collection[plugin];
109-
this.$fs.writeJson(packageJsonPath, packageJsonContent);
112+
if (result.hasModifiedPackageJson) {
113+
this.$fs.writeJson(packageJsonPath, result.packageJsonContent);
110114
}
111115
}
112116

@@ -199,6 +203,25 @@ export class PluginsService implements IPluginsService {
199203
return pluginData;
200204
}
201205

206+
private removeDependencyFromPackageJsonContent(dependency: string, packageJsonContent: Object): {hasModifiedPackageJson: boolean, packageJsonContent: Object} {
207+
let hasModifiedPackageJson = false;
208+
209+
if (packageJsonContent.devDependencies && packageJsonContent.devDependencies[dependency]) {
210+
delete packageJsonContent.devDependencies[dependency];
211+
hasModifiedPackageJson = true;
212+
}
213+
214+
if (packageJsonContent.dependencies && packageJsonContent.dependencies[dependency]) {
215+
delete packageJsonContent.dependencies[dependency];
216+
hasModifiedPackageJson = true;
217+
}
218+
219+
return {
220+
hasModifiedPackageJson,
221+
packageJsonContent
222+
};
223+
}
224+
202225
private getBasicPluginInformation(dependencies: any): IBasePluginData[] {
203226
return _.map(dependencies, (version: string, key: string) => ({
204227
name: key,

0 commit comments

Comments
 (0)