diff options
Diffstat (limited to 'packages/bun-npm/scripts/npm-build.ts')
-rw-r--r-- | packages/bun-npm/scripts/npm-build.ts | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/packages/bun-npm/scripts/npm-build.ts b/packages/bun-npm/scripts/npm-build.ts index 3218e28cc..d01032e2a 100644 --- a/packages/bun-npm/scripts/npm-build.ts +++ b/packages/bun-npm/scripts/npm-build.ts @@ -30,13 +30,7 @@ if (action === "publish") { async function build(version: string): Promise<void> { const release = await getRelease(version); if (release.tag_name === "canary") { - const { tag_name } = await getRelease(); - const sha = await getSha(tag_name); - // Bun.version is the nightly release version, - // but that means this script must be run using canary. - // Also, npm does not accept "+build" in releases, - // so the format is "{nightly}-canary.{sha}". - npmVersion = `${Bun.version}-canary.${sha}`; + npmVersion = await getCanaryVersion(); } else { npmVersion = release.tag_name.replace("bun-v", ""); } @@ -187,6 +181,28 @@ async function fetchGithub(path: string) { return fetch(url.toString()); } +async function getCanaryVersion(): Promise<string> { + const date = new Date().toISOString().split("T")[0].replace(/-/g, ""); + const semver = `${Bun.version}-canary.${date}`; + try { + const sha = await getSha("canary"); + const response = await fetch( + `https://registry.npmjs.org/-/package/${npmPackage}/dist-tags`, + ); + const { canary }: { canary: string } = await response.json(); + if (canary.startsWith(semver)) { + const match = /canary.[0-9]{8}\.([0-9]+)+?/.exec(canary); + if (match && isFinite(parseInt(match[1]))) { + return `${semver}.${match[1]}+${sha}`; + } + } + return `${semver}.1+${sha}`; + } catch (error) { + console.warn("Failed to calculate canary version", error); + } + return `${semver}.1`; +} + function formatTag(version: string): string { if (version.includes("canary") || version.startsWith("bun-v")) { return version; |