mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-19 16:54:22 +01:00
116 lines
3.0 KiB
TypeScript
116 lines
3.0 KiB
TypeScript
import solidPlugin from "./packages/opencode/node_modules/@opentui/solid/scripts/solid-plugin"
|
|
import path from "path"
|
|
import fs from "fs"
|
|
|
|
const version = "@VERSION@"
|
|
const pkg = path.join(process.cwd(), "packages/opencode")
|
|
const parser = fs.realpathSync(path.join(pkg, "./node_modules/@opentui/core/parser.worker.js"))
|
|
const worker = "./src/cli/cmd/tui/worker.ts"
|
|
const target = process.env["BUN_COMPILE_TARGET"]
|
|
|
|
if (!target) {
|
|
throw new Error("BUN_COMPILE_TARGET not set")
|
|
}
|
|
|
|
process.chdir(pkg)
|
|
|
|
const manifestName = "opencode-assets.manifest"
|
|
const manifestPath = path.join(pkg, manifestName)
|
|
|
|
const readTrackedAssets = () => {
|
|
if (!fs.existsSync(manifestPath)) return []
|
|
return fs
|
|
.readFileSync(manifestPath, "utf8")
|
|
.split("\n")
|
|
.map((line) => line.trim())
|
|
.filter((line) => line.length > 0)
|
|
}
|
|
|
|
const removeTrackedAssets = () => {
|
|
for (const file of readTrackedAssets()) {
|
|
const filePath = path.join(pkg, file)
|
|
if (fs.existsSync(filePath)) {
|
|
fs.rmSync(filePath, { force: true })
|
|
}
|
|
}
|
|
}
|
|
|
|
const assets = new Set<string>()
|
|
|
|
const addAsset = async (p: string) => {
|
|
const file = path.basename(p)
|
|
const dest = path.join(pkg, file)
|
|
await Bun.write(dest, Bun.file(p))
|
|
assets.add(file)
|
|
}
|
|
|
|
removeTrackedAssets()
|
|
|
|
const result = await Bun.build({
|
|
conditions: ["browser"],
|
|
tsconfig: "./tsconfig.json",
|
|
plugins: [solidPlugin],
|
|
sourcemap: "external",
|
|
entrypoints: ["./src/index.ts", parser, worker],
|
|
define: {
|
|
OPENCODE_VERSION: `'@VERSION@'`,
|
|
OTUI_TREE_SITTER_WORKER_PATH: "/$bunfs/root/" + path.relative(pkg, parser).replace(/\\/g, "/"),
|
|
OPENCODE_CHANNEL: "'latest'",
|
|
},
|
|
compile: {
|
|
target,
|
|
outfile: "opencode",
|
|
execArgv: ["--user-agent=opencode/" + version, '--env-file=""', "--"],
|
|
windows: {},
|
|
},
|
|
})
|
|
|
|
if (!result.success) {
|
|
console.error("Build failed!")
|
|
for (const log of result.logs) {
|
|
console.error(log)
|
|
}
|
|
throw new Error("Compilation failed")
|
|
}
|
|
|
|
const assetOutputs = result.outputs?.filter((x) => x.kind === "asset") ?? []
|
|
for (const x of assetOutputs) {
|
|
await addAsset(x.path)
|
|
}
|
|
|
|
const bundle = await Bun.build({
|
|
entrypoints: [worker],
|
|
tsconfig: "./tsconfig.json",
|
|
plugins: [solidPlugin],
|
|
target: "bun",
|
|
outdir: "./.opencode-worker",
|
|
sourcemap: "none",
|
|
})
|
|
|
|
if (!bundle.success) {
|
|
console.error("Worker build failed!")
|
|
for (const log of bundle.logs) {
|
|
console.error(log)
|
|
}
|
|
throw new Error("Worker compilation failed")
|
|
}
|
|
|
|
const workerAssets = bundle.outputs?.filter((x) => x.kind === "asset") ?? []
|
|
for (const x of workerAssets) {
|
|
await addAsset(x.path)
|
|
}
|
|
|
|
const output = bundle.outputs.find((x) => x.kind === "entry-point")
|
|
if (!output) {
|
|
throw new Error("Worker build produced no entry-point output")
|
|
}
|
|
|
|
const dest = path.join(pkg, "opencode-worker.js")
|
|
await Bun.write(dest, Bun.file(output.path))
|
|
fs.rmSync(path.dirname(output.path), { recursive: true, force: true })
|
|
|
|
const list = Array.from(assets)
|
|
await Bun.write(manifestPath, list.length > 0 ? list.join("\n") + "\n" : "")
|
|
|
|
console.log("Build successful!")
|