import { appendFileSync, readFileSync, writeFileSync } from "node:fs"; import { resolve } from "node:path"; import { fileURLToPath } from "node:url"; export const releasePackageFiles = [ "apps/server/package.json", "apps/desktop/package.json", "apps/web/package.json", "packages/contracts/package.json", ] as const; interface UpdateReleasePackageVersionsOptions { readonly rootDir?: string; } interface MutablePackageJson { version?: string; [key: string]: unknown; } export function updateReleasePackageVersions( version: string, options: UpdateReleasePackageVersionsOptions = {}, ): { changed: boolean } { const rootDir = resolve(options.rootDir ?? process.cwd()); let changed = false; for (const relativePath of releasePackageFiles) { const filePath = resolve(rootDir, relativePath); const packageJson = JSON.parse(readFileSync(filePath, "utf8")) as MutablePackageJson; if (packageJson.version === version) { continue; } packageJson.version = version; writeFileSync(filePath, `${JSON.stringify(packageJson, null, 2)}\n`); changed = true; } return { changed }; } function parseArgs(argv: ReadonlyArray): { version: string; rootDir: string | undefined; writeGithubOutput: boolean; } { let version: string | undefined; let rootDir: string | undefined; let writeGithubOutput = false; for (let index = 0; index < argv.length; index += 1) { const argument = argv[index]; if (argument === undefined) { continue; } if (argument === "--github-output") { writeGithubOutput = true; continue; } if (argument === "--root") { rootDir = argv[index + 1]; if (!rootDir) { throw new Error("Missing value for --root."); } index += 1; continue; } if (argument.startsWith("--")) { throw new Error(`Unknown argument: ${argument}`); } if (version !== undefined) { throw new Error("Only one release version can be provided."); } version = argument; } if (!version) { throw new Error( "Usage: node scripts/update-release-package-versions.ts [--root ] [--github-output]", ); } return { version, rootDir, writeGithubOutput }; } const isMain = process.argv[1] !== undefined && resolve(process.argv[1]) === fileURLToPath(import.meta.url); if (isMain) { const { version, rootDir, writeGithubOutput } = parseArgs(process.argv.slice(2)); const { changed } = updateReleasePackageVersions( version, rootDir === undefined ? {} : { rootDir }, ); if (!changed) { console.log("All package.json versions already match release version."); } if (writeGithubOutput) { const githubOutputPath = process.env.GITHUB_OUTPUT; if (!githubOutputPath) { throw new Error("GITHUB_OUTPUT is required when --github-output is set."); } appendFileSync(githubOutputPath, `changed=${changed}\n`); } }