From 230d0a15109f82abf1ea2f60665ca753f4fd7bd5 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Sun, 15 Jun 2025 13:10:58 -0400 Subject: fix postinstall script for node --- packages/opencode/script/postinstall.js | 90 -------------------------------- packages/opencode/script/postinstall.mjs | 90 ++++++++++++++++++++++++++++++++ packages/opencode/script/publish.ts | 4 +- packages/opencode/src/cli/cmd/upgrade.ts | 48 ++++++++++------- 4 files changed, 120 insertions(+), 112 deletions(-) delete mode 100644 packages/opencode/script/postinstall.js create mode 100644 packages/opencode/script/postinstall.mjs diff --git a/packages/opencode/script/postinstall.js b/packages/opencode/script/postinstall.js deleted file mode 100644 index 7bf119269..000000000 --- a/packages/opencode/script/postinstall.js +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env node - -import fs from "fs" -import path from "path" -import os from "os" -import { fileURLToPath } from "url" -import { createRequire } from "module" - -const __dirname = path.dirname(fileURLToPath(import.meta.url)) -const require = createRequire(import.meta.url) - -function detectPlatformAndArch() { - // Map platform names - let platform - switch (os.platform()) { - case "darwin": - platform = "darwin" - break - case "linux": - platform = "linux" - break - case "win32": - platform = "win32" - break - default: - platform = os.platform() - break - } - - // Map architecture names - let arch - switch (os.arch()) { - case "x64": - arch = "x64" - break - case "arm64": - arch = "arm64" - break - case "arm": - arch = "arm" - break - default: - arch = os.arch() - break - } - - return { platform, arch } -} - -function findBinary() { - const { platform, arch } = detectPlatformAndArch() - const packageName = `opencode-${platform}-${arch}` - const binary = platform === "win32" ? "opencode.exe" : "opencode" - - try { - // Use require.resolve to find the package - const packageJsonPath = require.resolve(`${packageName}/package.json`) - const packageDir = path.dirname(packageJsonPath) - const binaryPath = path.join(packageDir, "bin", binary) - - if (!fs.existsSync(binaryPath)) { - throw new Error(`Binary not found at ${binaryPath}`) - } - - return binaryPath - } catch (error) { - throw new Error(`Could not find package ${packageName}: ${error.message}`) - } -} - -function main() { - try { - const binaryPath = findBinary() - const binScript = path.join(__dirname, "bin", "opencode") - - // Remove existing bin script if it exists - if (fs.existsSync(binScript)) { - fs.unlinkSync(binScript) - } - - // Create symlink to the actual binary - fs.symlinkSync(binaryPath, binScript) - console.log(`OpenCode binary symlinked: ${binScript} -> ${binaryPath}`) - } catch (error) { - console.error("Failed to create OpenCode binary symlink:", error.message) - process.exit(1) - } -} - -main() diff --git a/packages/opencode/script/postinstall.mjs b/packages/opencode/script/postinstall.mjs new file mode 100644 index 000000000..7bf119269 --- /dev/null +++ b/packages/opencode/script/postinstall.mjs @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +import fs from "fs" +import path from "path" +import os from "os" +import { fileURLToPath } from "url" +import { createRequire } from "module" + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const require = createRequire(import.meta.url) + +function detectPlatformAndArch() { + // Map platform names + let platform + switch (os.platform()) { + case "darwin": + platform = "darwin" + break + case "linux": + platform = "linux" + break + case "win32": + platform = "win32" + break + default: + platform = os.platform() + break + } + + // Map architecture names + let arch + switch (os.arch()) { + case "x64": + arch = "x64" + break + case "arm64": + arch = "arm64" + break + case "arm": + arch = "arm" + break + default: + arch = os.arch() + break + } + + return { platform, arch } +} + +function findBinary() { + const { platform, arch } = detectPlatformAndArch() + const packageName = `opencode-${platform}-${arch}` + const binary = platform === "win32" ? "opencode.exe" : "opencode" + + try { + // Use require.resolve to find the package + const packageJsonPath = require.resolve(`${packageName}/package.json`) + const packageDir = path.dirname(packageJsonPath) + const binaryPath = path.join(packageDir, "bin", binary) + + if (!fs.existsSync(binaryPath)) { + throw new Error(`Binary not found at ${binaryPath}`) + } + + return binaryPath + } catch (error) { + throw new Error(`Could not find package ${packageName}: ${error.message}`) + } +} + +function main() { + try { + const binaryPath = findBinary() + const binScript = path.join(__dirname, "bin", "opencode") + + // Remove existing bin script if it exists + if (fs.existsSync(binScript)) { + fs.unlinkSync(binScript) + } + + // Create symlink to the actual binary + fs.symlinkSync(binaryPath, binScript) + console.log(`OpenCode binary symlinked: ${binScript} -> ${binaryPath}`) + } catch (error) { + console.error("Failed to create OpenCode binary symlink:", error.message) + process.exit(1) + } +} + +main() diff --git a/packages/opencode/script/publish.ts b/packages/opencode/script/publish.ts index 705247b0f..2b301080c 100755 --- a/packages/opencode/script/publish.ts +++ b/packages/opencode/script/publish.ts @@ -64,7 +64,7 @@ for (const [os, arch] of targets) { await $`mkdir -p ./dist/${pkg.name}` await $`cp -r ./bin ./dist/${pkg.name}/bin` -await $`cp ./script/postinstall.js ./dist/${pkg.name}/postinstall.js` +await $`cp ./script/postinstall.mjs ./dist/${pkg.name}/postinstall.mjs` await Bun.file(`./dist/${pkg.name}/package.json`).write( JSON.stringify( { @@ -73,7 +73,7 @@ await Bun.file(`./dist/${pkg.name}/package.json`).write( [pkg.name]: `./bin/${pkg.name}`, }, scripts: { - postinstall: "node ./postinstall.js", + postinstall: "node ./postinstall.mjs", }, version, optionalDependencies, diff --git a/packages/opencode/src/cli/cmd/upgrade.ts b/packages/opencode/src/cli/cmd/upgrade.ts index 95159ce73..c5e60f3a5 100644 --- a/packages/opencode/src/cli/cmd/upgrade.ts +++ b/packages/opencode/src/cli/cmd/upgrade.ts @@ -122,7 +122,7 @@ export const UpgradeCommand = { UI.empty() UI.println(UI.logo(" ")) UI.empty() - prompts.intro("upgrade") + prompts.intro("Upgrade") if (!process.execPath.includes(path.join(".opencode", "bin")) && false) { prompts.log.error( @@ -132,10 +132,16 @@ export const UpgradeCommand = { return } - const release = args.target ? await specific(args.target) : await latest() - const target = release.tag_name + const release = args.target + ? await specific(args.target).catch(() => {}) + : await latest().catch(() => {}) + if (!release) { + prompts.log.error("Failed to fetch release information") + prompts.outro("Done") + return + } - prompts.log.info(`Upgrade ${VERSION} → ${target}`) + const target = release.tag_name if (VERSION !== "dev" && compare(VERSION, target) >= 0) { prompts.log.success(`Already up to date`) @@ -143,6 +149,8 @@ export const UpgradeCommand = { return } + prompts.log.info(`From ${VERSION} → ${target}`) + const name = asset() const found = release.assets.find((a) => a.name === name) @@ -155,30 +163,30 @@ export const UpgradeCommand = { const spinner = prompts.spinner() spinner.start("Downloading update...") - let downloadPath: string - try { - downloadPath = await download(found.browser_download_url) - spinner.stop("Download complete") - } catch (downloadError) { + const downloadPath = await download(found.browser_download_url).catch( + () => {}, + ) + if (!downloadPath) { spinner.stop("Download failed") - prompts.log.error( - `Download failed: ${downloadError instanceof Error ? downloadError.message : String(downloadError)}`, - ) + prompts.log.error("Download failed") prompts.outro("Done") return } - try { - await fs.rename(downloadPath, process.execPath) - prompts.log.success(`Successfully upgraded to ${target}`) - } catch (installError) { - prompts.log.error( - `Install failed: ${installError instanceof Error ? installError.message : String(installError)}`, - ) - // Clean up downloaded file + spinner.stop("Download complete") + + const renamed = await fs + .rename(downloadPath, process.execPath) + .catch(() => {}) + + if (renamed === undefined) { + prompts.log.error("Install failed") await fs.unlink(downloadPath).catch(() => {}) + prompts.outro("Done") + return } + prompts.log.success(`Successfully upgraded to ${target}`) prompts.outro("Done") }, } -- cgit v1.2.3