Skip to content

fix: dependency won't be migrated if in devDependencies #4769

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions lib/controllers/migrate-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ export class MigrateController extends UpdateControllerBase implements IMigrateC
const hasDependency = this.hasDependency(dependency, projectData);

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

private async shouldMigrateDependencyVersion(dependency: IMigrationDependency, projectData: IProjectData): Promise<boolean> {
const collection = dependency.isDev ? projectData.devDependencies : projectData.dependencies;
const maxSatisfyingVersion = await this.getMaxDependencyVersion(dependency.packageName, collection[dependency.packageName]);
const devDependencies = projectData.devDependencies || {};
const dependencies = projectData.dependencies || {};
const packageName = dependency.packageName;
const version = dependencies[packageName] || devDependencies[packageName];
const maxSatisfyingVersion = await this.getMaxDependencyVersion(dependency.packageName, version);

return !(maxSatisfyingVersion && semver.gte(maxSatisfyingVersion, dependency.verifiedVersion));
}
Expand Down
6 changes: 4 additions & 2 deletions lib/controllers/update-controller-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@ export class UpdateControllerBase {
}

protected hasDependency(dependency: IDependency, projectData: IProjectData): boolean {
const collection = dependency.isDev ? projectData.devDependencies : projectData.dependencies;
return collection && collection[dependency.packageName];
const devDependencies = projectData.devDependencies;
const dependencies = projectData.dependencies;

return (dependencies && dependencies[dependency.packageName]) || (devDependencies && devDependencies[dependency.packageName]);
}

protected hasRuntimeDependency({platform, projectData}: {platform: string, projectData: IProjectData}): boolean {
Expand Down
11 changes: 6 additions & 5 deletions lib/controllers/update-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,16 +121,17 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
continue;
}

if (await this.shouldUpdateDependency(dependency, templateVersion, areDev, projectData)) {
if (await this.shouldUpdateDependency(dependency, templateVersion, projectData)) {
this.$logger.info(`Updating '${dependency}' to version '${templateVersion}'.`);
this.$pluginsService.addToPackageJson(dependency, templateVersion, areDev, projectData.projectDir);
}
}
}

private async shouldUpdateDependency(dependency: string, targetVersion: string, isDev: boolean, projectData: IProjectData) {
const collection = isDev ? projectData.devDependencies : projectData.dependencies;
const projectVersion = collection[dependency];
private async shouldUpdateDependency(dependency: string, targetVersion: string, projectData: IProjectData) {
const devDependencies = projectData.devDependencies || {};
const dependencies = projectData.dependencies || {};
const projectVersion = dependencies[dependency] || devDependencies[dependency];
const maxSatisfyingTargetVersion = await this.getMaxDependencyVersion(dependency, targetVersion);
const maxSatisfyingProjectVersion = await this.getMaxDependencyVersion(dependency, projectVersion);

Expand All @@ -144,7 +145,7 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
continue;
}

if (await this.shouldUpdateDependency(dependency, templateVersion, areDev, projectData)) {
if (await this.shouldUpdateDependency(dependency, templateVersion, projectData)) {
return true;
}
}
Expand Down
2 changes: 1 addition & 1 deletion lib/definitions/plugins.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ interface IPluginsService {
add(plugin: string, projectData: IProjectData): Promise<void>; // adds plugin by name, github url, local path and et.
remove(pluginName: string, projectData: IProjectData): Promise<void>; // removes plugin only by name
addToPackageJson(plugin: string, version: string, isDev: boolean, projectDir: string): void;
removeFromPackageJson(plugin: string, isDev: boolean, projectDir: string): void;
removeFromPackageJson(plugin: string, projectDir: string): void;
getAllInstalledPlugins(projectData: IProjectData): Promise<IPluginData[]>;
ensureAllDependenciesAreInstalled(projectData: IProjectData): Promise<void>;

Expand Down
35 changes: 29 additions & 6 deletions lib/services/plugins-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,23 +90,27 @@ export class PluginsService implements IPluginsService {

public addToPackageJson(plugin: string, version: string, isDev: boolean, projectDir: string) {
const packageJsonPath = this.getPackageJsonFilePath(projectDir);
const packageJsonContent = this.$fs.readJson(packageJsonPath);
let packageJsonContent = this.$fs.readJson(packageJsonPath);
const collectionKey = isDev ? "devDependencies" : "dependencies";
const oppositeCollectionKey = isDev ? "dependencies" : "devDependencies";
if (packageJsonContent[oppositeCollectionKey] && packageJsonContent[oppositeCollectionKey][plugin]) {
const result = this.removeDependencyFromPackageJsonContent(plugin, packageJsonContent);
packageJsonContent = result.packageJsonContent;
}

packageJsonContent[collectionKey] = packageJsonContent[collectionKey] || {};
packageJsonContent[collectionKey][plugin] = version;

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

public removeFromPackageJson(plugin: string, isDev: boolean, projectDir: string) {
public removeFromPackageJson(plugin: string, projectDir: string) {
const packageJsonPath = this.getPackageJsonFilePath(projectDir);
const packageJsonContent = this.$fs.readJson(packageJsonPath);
const collection = isDev ? packageJsonContent.devDependencies : packageJsonContent.dependencies;
const result = this.removeDependencyFromPackageJsonContent(plugin, packageJsonContent);

if (collection && collection[plugin]) {
delete collection[plugin];
this.$fs.writeJson(packageJsonPath, packageJsonContent);
if (result.hasModifiedPackageJson) {
this.$fs.writeJson(packageJsonPath, result.packageJsonContent);
}
}

Expand Down Expand Up @@ -199,6 +203,25 @@ export class PluginsService implements IPluginsService {
return pluginData;
}

private removeDependencyFromPackageJsonContent(dependency: string, packageJsonContent: Object): {hasModifiedPackageJson: boolean, packageJsonContent: Object} {
let hasModifiedPackageJson = false;

if (packageJsonContent.devDependencies && packageJsonContent.devDependencies[dependency]) {
delete packageJsonContent.devDependencies[dependency];
hasModifiedPackageJson = true;
}

if (packageJsonContent.dependencies && packageJsonContent.dependencies[dependency]) {
delete packageJsonContent.dependencies[dependency];
hasModifiedPackageJson = true;
}

return {
hasModifiedPackageJson,
packageJsonContent
};
}

private getBasicPluginInformation(dependencies: any): IBasePluginData[] {
return _.map(dependencies, (version: string, key: string) => ({
name: key,
Expand Down