| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #!/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 = "windows"
- 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 binaryName = platform === "windows" ? "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", binaryName)
- if (!fs.existsSync(binaryPath)) {
- throw new Error(`Binary not found at ${binaryPath}`)
- }
- return { binaryPath, binaryName }
- } catch (error) {
- throw new Error(`Could not find package ${packageName}: ${error.message}`)
- }
- }
- function prepareBinDirectory(binaryName) {
- const binDir = path.join(__dirname, "bin")
- const targetPath = path.join(binDir, binaryName)
- // Ensure bin directory exists
- if (!fs.existsSync(binDir)) {
- fs.mkdirSync(binDir, { recursive: true })
- }
- // Remove existing binary/symlink if it exists
- if (fs.existsSync(targetPath)) {
- fs.unlinkSync(targetPath)
- }
- return { binDir, targetPath }
- }
- function symlinkBinary(sourcePath, binaryName) {
- const { targetPath } = prepareBinDirectory(binaryName)
- fs.symlinkSync(sourcePath, targetPath)
- console.log(`opencode binary symlinked: ${targetPath} -> ${sourcePath}`)
- // Verify the file exists after operation
- if (!fs.existsSync(targetPath)) {
- throw new Error(`Failed to symlink binary to ${targetPath}`)
- }
- }
- async function main() {
- try {
- if (os.platform() === "win32") {
- // On Windows, the .exe is already included in the package and bin field points to it
- // No postinstall setup needed
- console.log("Windows detected: binary setup not needed (using packaged .exe)")
- return
- }
- // On non-Windows platforms, just verify the binary package exists
- // Don't replace the wrapper script - it handles binary execution
- const { binaryPath } = findBinary()
- console.log(`Platform binary verified at: ${binaryPath}`)
- console.log("Wrapper script will handle binary execution")
- } catch (error) {
- console.error("Failed to setup opencode binary:", error.message)
- process.exit(1)
- }
- }
- try {
- main()
- } catch (error) {
- console.error("Postinstall script error:", error.message)
- process.exit(0)
- }
|