-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathversion-sync.mjs
More file actions
executable file
·94 lines (79 loc) · 2.77 KB
/
Copy pathversion-sync.mjs
File metadata and controls
executable file
·94 lines (79 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/env node
/**
* version-sync.mjs
*
* Synchronizes version in package.json from a git tag or explicit argument.
*
* Usage:
* node scripts/version-sync.mjs 0.1.0 # set version to 0.1.0
* node scripts/version-sync.mjs --from-tag # read from GITHUB_REF_NAME (e.g. v0.1.0)
* node scripts/version-sync.mjs 0.1.0 --dry-run # preview changes without writing
*/
import { readFileSync, writeFileSync } from "node:fs";
import { spawnSync } from "node:child_process";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const root = join(__dirname, "..");
const SEMVER_RE = /^\d+\.\d+\.\d+(?:-[\w.]+)?(?:\+[\w.]+)?$/;
function parseArgs(argv) {
const args = argv.slice(2);
let version = null;
let fromTag = false;
let dryRun = false;
for (const arg of args) {
if (arg === "--from-tag") {
fromTag = true;
} else if (arg === "--dry-run") {
dryRun = true;
} else if (!version && !arg.startsWith("-")) {
version = arg;
} else {
console.error(`Unknown argument: ${arg}`);
process.exit(1);
}
}
if (fromTag) {
const ref = process.env.GITHUB_REF_NAME;
if (!ref) {
console.error("--from-tag requires GITHUB_REF_NAME environment variable");
process.exit(1);
}
version = ref.replace(/^v/, "");
}
if (!version) {
console.error(
"Usage: version-sync.mjs <version> [--dry-run]\n" +
" version-sync.mjs --from-tag [--dry-run]",
);
process.exit(1);
}
if (!SEMVER_RE.test(version)) {
console.error(`Invalid semver version: '${version}'`);
process.exit(1);
}
return { version, dryRun };
}
const { version, dryRun } = parseArgs(process.argv);
console.log(`${dryRun ? "[DRY RUN] " : ""}Syncing version to ${version}\n`);
const pkgPath = join(root, "package.json");
const content = readFileSync(pkgPath, "utf-8");
const pkg = JSON.parse(content);
if (pkg.version === version) {
console.log("package.json: (already at target version)");
} else {
console.log(`package.json: ${pkg.version} → ${version}`);
pkg.version = version;
if (!dryRun) {
writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
const formatResult = spawnSync("bun", ["x", "biome", "format", "--write", pkgPath], {
cwd: root,
stdio: "inherit",
});
if (formatResult.status !== 0) {
console.error("Failed to format package.json after version sync");
process.exit(formatResult.status ?? 1);
}
}
}
console.log(`\n${dryRun ? "[DRY RUN] " : ""}Done.`);