85 lines
1.9 KiB
JavaScript
Executable File
85 lines
1.9 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
const childProcess = require("child_process")
|
|
const fs = require("fs")
|
|
const path = require("path")
|
|
const os = require("os")
|
|
|
|
function run(target) {
|
|
const result = childProcess.spawnSync(target, process.argv.slice(2), {
|
|
stdio: "inherit",
|
|
})
|
|
if (result.error) {
|
|
console.error(result.error.message)
|
|
process.exit(1)
|
|
}
|
|
const code = typeof result.status === "number" ? result.status : 0
|
|
process.exit(code)
|
|
}
|
|
|
|
const envPath = process.env.OPENCODE_BIN_PATH
|
|
if (envPath) {
|
|
run(envPath)
|
|
}
|
|
|
|
const scriptPath = fs.realpathSync(__filename)
|
|
const scriptDir = path.dirname(scriptPath)
|
|
|
|
const platformMap = {
|
|
darwin: "darwin",
|
|
linux: "linux",
|
|
win32: "windows",
|
|
}
|
|
const archMap = {
|
|
x64: "x64",
|
|
arm64: "arm64",
|
|
arm: "arm",
|
|
}
|
|
|
|
let platform = platformMap[os.platform()]
|
|
if (!platform) {
|
|
platform = os.platform()
|
|
}
|
|
let arch = archMap[os.arch()]
|
|
if (!arch) {
|
|
arch = os.arch()
|
|
}
|
|
const base = "opencode-" + platform + "-" + arch
|
|
const binary = platform === "windows" ? "opencode.exe" : "opencode"
|
|
|
|
function findBinary(startDir) {
|
|
let current = startDir
|
|
for (;;) {
|
|
const modules = path.join(current, "node_modules")
|
|
if (fs.existsSync(modules)) {
|
|
const entries = fs.readdirSync(modules)
|
|
for (const entry of entries) {
|
|
if (!entry.startsWith(base)) {
|
|
continue
|
|
}
|
|
const candidate = path.join(modules, entry, "bin", binary)
|
|
if (fs.existsSync(candidate)) {
|
|
return candidate
|
|
}
|
|
}
|
|
}
|
|
const parent = path.dirname(current)
|
|
if (parent === current) {
|
|
return
|
|
}
|
|
current = parent
|
|
}
|
|
}
|
|
|
|
const resolved = findBinary(scriptDir)
|
|
if (!resolved) {
|
|
console.error(
|
|
'It seems that your package manager failed to install the right version of the opencode CLI for your platform. You can try manually installing the "' +
|
|
base +
|
|
'" package',
|
|
)
|
|
process.exit(1)
|
|
}
|
|
|
|
run(resolved)
|