From d557d47cb50eca4135d2f4c39b7e1cc02420f87e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 7 Feb 2024 15:19:00 +0100 Subject: [PATCH] cli: added repository field check to repo fix Signed-off-by: Patrik Oldsberg --- .changeset/fluffy-jeans-eat.md | 5 ++ .changeset/fuzzy-turtles-camp.md | 5 ++ packages/cli-node/api-report.md | 8 +++ .../cli-node/src/monorepo/PackageGraph.ts | 8 +++ packages/cli/src/commands/repo/fix.ts | 58 ++++++++++++++++++- 5 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 .changeset/fluffy-jeans-eat.md create mode 100644 .changeset/fuzzy-turtles-camp.md diff --git a/.changeset/fluffy-jeans-eat.md b/.changeset/fluffy-jeans-eat.md new file mode 100644 index 0000000000..8935c33937 --- /dev/null +++ b/.changeset/fluffy-jeans-eat.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Added check for the `repository` field in the `repo fix` command. diff --git a/.changeset/fuzzy-turtles-camp.md b/.changeset/fuzzy-turtles-camp.md new file mode 100644 index 0000000000..ca1767bd30 --- /dev/null +++ b/.changeset/fuzzy-turtles-camp.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli-node': patch +--- + +Added `repository` field to `BackstagePackageJson` type. diff --git a/packages/cli-node/api-report.md b/packages/cli-node/api-report.md index 71be6c4bd4..4bd152dca8 100644 --- a/packages/cli-node/api-report.md +++ b/packages/cli-node/api-report.md @@ -55,6 +55,14 @@ export interface BackstagePackageJson { registry?: string; }; // (undocumented) + repository?: + | string + | { + type: string; + url: string; + directory: string; + }; + // (undocumented) scripts?: { [key: string]: string; }; diff --git a/packages/cli-node/src/monorepo/PackageGraph.ts b/packages/cli-node/src/monorepo/PackageGraph.ts index fb46dbde26..cd01ec833f 100644 --- a/packages/cli-node/src/monorepo/PackageGraph.ts +++ b/packages/cli-node/src/monorepo/PackageGraph.ts @@ -58,6 +58,14 @@ export interface BackstagePackageJson { registry?: string; }; + repository?: + | string + | { + type: string; + url: string; + directory: string; + }; + dependencies?: { [key: string]: string; }; diff --git a/packages/cli/src/commands/repo/fix.ts b/packages/cli/src/commands/repo/fix.ts index bd5b375ed5..b975203a73 100644 --- a/packages/cli/src/commands/repo/fix.ts +++ b/packages/cli/src/commands/repo/fix.ts @@ -22,7 +22,11 @@ import { } from '@backstage/cli-node'; import { OptionValues } from 'commander'; import fs from 'fs-extra'; -import { resolve as resolvePath } from 'path'; +import { + resolve as resolvePath, + join as joinPath, + relative as relativePath, +} from 'path'; import { paths } from '../../lib/paths'; /** @@ -189,12 +193,64 @@ export function fixSideEffects(pkg: FixablePackage) { pkg.changed = true; } +export function createRepositoryFieldFixer() { + const rootPkg = require(paths.resolveTargetRoot('package.json')); + const rootRepoField = rootPkg.repository; + if (!rootRepoField) { + return () => {}; + } + + const rootType = rootRepoField.type || 'git'; + const rootUrl = rootRepoField.url; + const rootDir = rootRepoField.directory || ''; + + return (pkg: FixablePackage) => { + const expectedPath = joinPath( + rootDir, + relativePath(paths.targetRoot, pkg.dir), + ); + const repoField = pkg.packageJson.repository; + + if (!repoField || typeof repoField === 'string') { + const pkgEntries = Object.entries(pkg.packageJson); + pkgEntries.splice( + // Place it just above the backstage field + pkgEntries.findIndex(([name]) => name === 'backstage'), + 0, + [ + 'repository', + { + type: rootType, + url: rootUrl, + directory: expectedPath, + }, + ], + ); + pkg.packageJson = Object.fromEntries(pkgEntries) as BackstagePackageJson; + pkg.changed = true; + return; + } + + // If there's a type or URL mismatch, leave the field as is + if (repoField.type !== rootType || repoField.url !== rootUrl) { + return; + } + + if (repoField.directory !== expectedPath) { + repoField.directory = expectedPath; + pkg.changed = true; + } + }; +} + export async function command(opts: OptionValues): Promise { const packages = await readFixablePackages(); + const fixRepositoryField = createRepositoryFieldFixer(); for (const pkg of packages) { fixPackageExports(pkg); fixSideEffects(pkg); + fixRepositoryField(pkg); } if (opts.check) {