set-package-versions.mjs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { readdir, readFile, writeFile } from "node:fs/promises";
  2. import { join, resolve } from "node:path";
  3. function parseArgs(argv) {
  4. const [version, ...rest] = argv;
  5. if (!version) {
  6. throw new Error("Usage: node scripts/set-package-versions.mjs <version> [--root <path>]");
  7. }
  8. let root = process.cwd();
  9. for (let i = 0; i < rest.length; i++) {
  10. if (rest[i] === "--root") {
  11. root = rest[i + 1];
  12. i += 1;
  13. }
  14. }
  15. return { version, root: resolve(root) };
  16. }
  17. async function loadWorkspacePackages(root) {
  18. const packagesDir = join(root, "packages");
  19. const entries = await readdir(packagesDir);
  20. const packages = [];
  21. for (const entry of entries) {
  22. try {
  23. const dir = join(packagesDir, entry);
  24. const packageJsonPath = join(dir, "package.json");
  25. const pkg = JSON.parse(await readFile(packageJsonPath, "utf-8"));
  26. packages.push({ dir, packageJsonPath, pkg });
  27. } catch {
  28. // ignore non-package directories
  29. }
  30. }
  31. return packages;
  32. }
  33. function rewriteDependencyVersions(pkg, workspacePackageNames, version) {
  34. for (const field of ["dependencies", "optionalDependencies", "peerDependencies", "devDependencies"]) {
  35. const deps = pkg[field];
  36. if (!deps) continue;
  37. for (const name of Object.keys(deps)) {
  38. if (workspacePackageNames.has(name)) {
  39. deps[name] = version;
  40. }
  41. }
  42. }
  43. }
  44. async function main() {
  45. const { version, root } = parseArgs(process.argv.slice(2));
  46. const workspacePackages = await loadWorkspacePackages(root);
  47. const workspacePackageNames = new Set(workspacePackages.map(({ pkg }) => pkg.name));
  48. const rootPackageJsonPath = join(root, "package.json");
  49. const rootPackageJson = JSON.parse(await readFile(rootPackageJsonPath, "utf-8"));
  50. rootPackageJson.version = version;
  51. await writeFile(rootPackageJsonPath, `${JSON.stringify(rootPackageJson, null, 2)}\n`, "utf-8");
  52. for (const workspacePackage of workspacePackages) {
  53. workspacePackage.pkg.version = version;
  54. rewriteDependencyVersions(workspacePackage.pkg, workspacePackageNames, version);
  55. await writeFile(
  56. workspacePackage.packageJsonPath,
  57. `${JSON.stringify(workspacePackage.pkg, null, 2)}\n`,
  58. "utf-8",
  59. );
  60. }
  61. }
  62. await main();