|
| 1 | +#!/usr/bin/env node |
| 2 | +import { execFileSync } from "node:child_process"; |
| 3 | +import fs from "node:fs"; |
| 4 | +import path from "node:path"; |
| 5 | +import { fileURLToPath } from "node:url"; |
| 6 | + |
| 7 | +const scriptDir = path.dirname(fileURLToPath(import.meta.url)); |
| 8 | +const rootDir = path.resolve(scriptDir, ".."); |
| 9 | +const pkgPath = path.join(rootDir, "package.json"); |
| 10 | +const versionPath = path.join(rootDir, "src", "version.ts"); |
| 11 | + |
| 12 | +const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8")); |
| 13 | +const bump = (process.argv[2] || process.env.BUMP || "patch").toLowerCase(); |
| 14 | +if (!["major", "minor", "patch"].includes(bump)) { |
| 15 | + console.error("Usage: node scripts/bump-version.mjs [major|minor|patch]"); |
| 16 | + process.exit(1); |
| 17 | +} |
| 18 | + |
| 19 | +const run = (cmd, args, options = {}) => |
| 20 | + execFileSync(cmd, args, { encoding: "utf8", ...options }).trim(); |
| 21 | + |
| 22 | +let registry = process.env.NPM_REGISTRY; |
| 23 | +if (!registry) { |
| 24 | + try { |
| 25 | + registry = run("npm", ["config", "get", "registry"]); |
| 26 | + } catch { |
| 27 | + registry = "https://registry.npmjs.org/"; |
| 28 | + } |
| 29 | +} |
| 30 | +if (!registry || registry === "undefined" || registry === "null") { |
| 31 | + registry = "https://registry.npmjs.org/"; |
| 32 | +} |
| 33 | + |
| 34 | +let latest = "0.0.0"; |
| 35 | +try { |
| 36 | + const out = run("npm", ["view", pkg.name, "version", "--json", "--registry", registry]); |
| 37 | + const parsed = JSON.parse(out); |
| 38 | + if (typeof parsed === "string") { |
| 39 | + latest = parsed; |
| 40 | + } |
| 41 | +} catch { |
| 42 | + console.warn(`No published version found for ${pkg.name}; starting from ${latest}.`); |
| 43 | +} |
| 44 | + |
| 45 | +const parts = latest.split("."); |
| 46 | +if (parts.length !== 3 || parts.some((part) => !/^\d+$/.test(part))) { |
| 47 | + throw new Error(`Unsupported version format from registry: ${latest}`); |
| 48 | +} |
| 49 | + |
| 50 | +let [major, minor, patch] = parts.map((part) => Number(part)); |
| 51 | +if (bump === "major") { |
| 52 | + major += 1; |
| 53 | + minor = 0; |
| 54 | + patch = 0; |
| 55 | +} else if (bump === "minor") { |
| 56 | + minor += 1; |
| 57 | + patch = 0; |
| 58 | +} else { |
| 59 | + patch += 1; |
| 60 | +} |
| 61 | + |
| 62 | +const next = `${major}.${minor}.${patch}`; |
| 63 | +run("npm", ["version", "--no-git-tag-version", next], { cwd: rootDir, stdio: "inherit" }); |
| 64 | +fs.writeFileSync(versionPath, `export const DIFFIO_SDK_VERSION = "${next}";\n`, "utf8"); |
| 65 | + |
| 66 | +console.log(`Bumped ${pkg.name} from ${latest} to ${next} (registry: ${registry}).`); |
0 commit comments