From 22684fa0d4b71f142091ce2f3a34a5c6a68dc837 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 17 Jun 2021 20:02:53 +0200 Subject: [PATCH] cli: sort dependencies after modifying them with diff Signed-off-by: Patrik Oldsberg --- packages/cli/src/lib/diff/handlers.ts | 28 ++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/lib/diff/handlers.ts b/packages/cli/src/lib/diff/handlers.ts index 37035194ef..04596d98cd 100644 --- a/packages/cli/src/lib/diff/handlers.ts +++ b/packages/cli/src/lib/diff/handlers.ts @@ -18,6 +18,15 @@ import chalk from 'chalk'; import { diffLines } from 'diff'; import { FileDiff, PromptFunc, FileHandler, WriteFileFunc } from './types'; +function sortObjectKeys(obj: Record) { + const sortedKeys = Object.keys(obj).sort(); + for (const key of sortedKeys) { + const value = obj[key]; + delete obj[key]; + obj[key] = value; + } +} + class PackageJsonHandler { static async handler( { path, write, missing, targetContents, templateContents }: FileDiff, @@ -74,6 +83,7 @@ class PackageJsonHandler { obj: any = this.pkg, targetObj: any = this.targetPkg, prefix?: string, + sort?: boolean, ) { const fullFieldName = chalk.cyan( prefix ? `${prefix}[${fieldName}]` : fieldName, @@ -91,6 +101,9 @@ class PackageJsonHandler { const msg = `package.json has mismatched field, ${fullFieldName}, change from ${coloredOldValue} to ${coloredNewValue}?`; if (await this.prompt(msg)) { targetObj[fieldName] = newValue; + if (sort) { + sortObjectKeys(targetObj); + } await this.write(); } } else if (fieldName in obj) { @@ -100,6 +113,9 @@ class PackageJsonHandler { ) ) { targetObj[fieldName] = newValue; + if (sort) { + sortObjectKeys(targetObj); + } await this.write(); } } @@ -169,15 +185,21 @@ class PackageJsonHandler { } // Hardcoded removal of these during migration - await this.syncField('@backstage/core', {}, targetDeps, fieldName); - await this.syncField('@backstage/core-api', {}, targetDeps, fieldName); + await this.syncField('@backstage/core', {}, targetDeps, fieldName, true); + await this.syncField( + '@backstage/core-api', + {}, + targetDeps, + fieldName, + true, + ); for (const key of Object.keys(pkgDeps)) { if (this.variant === 'app' && key.startsWith('plugin-')) { continue; } - await this.syncField(key, pkgDeps, targetDeps, fieldName); + await this.syncField(key, pkgDeps, targetDeps, fieldName, true); } }