|
|
@@ -255,19 +255,20 @@ export namespace Config {
|
|
|
const pkg = path.join(dir, "package.json")
|
|
|
const targetVersion = Installation.isLocal() ? "*" : Installation.VERSION
|
|
|
|
|
|
- const json = await Bun.file(pkg)
|
|
|
- .json()
|
|
|
- .catch(() => ({}))
|
|
|
+ const json = await Filesystem.readJson<{ dependencies?: Record<string, string> }>(pkg).catch(() => ({
|
|
|
+ dependencies: {},
|
|
|
+ }))
|
|
|
json.dependencies = {
|
|
|
...json.dependencies,
|
|
|
"@opencode-ai/plugin": targetVersion,
|
|
|
}
|
|
|
- await Bun.write(pkg, JSON.stringify(json, null, 2))
|
|
|
+ await Filesystem.writeJson(pkg, json)
|
|
|
await new Promise((resolve) => setTimeout(resolve, 3000))
|
|
|
|
|
|
const gitignore = path.join(dir, ".gitignore")
|
|
|
- const hasGitIgnore = await Bun.file(gitignore).exists()
|
|
|
- if (!hasGitIgnore) await Bun.write(gitignore, ["node_modules", "package.json", "bun.lock", ".gitignore"].join("\n"))
|
|
|
+ const hasGitIgnore = await Filesystem.exists(gitignore)
|
|
|
+ if (!hasGitIgnore)
|
|
|
+ await Filesystem.write(gitignore, ["node_modules", "package.json", "bun.lock", ".gitignore"].join("\n"))
|
|
|
|
|
|
// Install any additional dependencies defined in the package.json
|
|
|
// This allows local plugins and custom tools to use external packages
|
|
|
@@ -303,11 +304,10 @@ export namespace Config {
|
|
|
if (!existsSync(nodeModules)) return true
|
|
|
|
|
|
const pkg = path.join(dir, "package.json")
|
|
|
- const pkgFile = Bun.file(pkg)
|
|
|
- const pkgExists = await pkgFile.exists()
|
|
|
+ const pkgExists = await Filesystem.exists(pkg)
|
|
|
if (!pkgExists) return true
|
|
|
|
|
|
- const parsed = await pkgFile.json().catch(() => null)
|
|
|
+ const parsed = await Filesystem.readJson<{ dependencies?: Record<string, string> }>(pkg).catch(() => null)
|
|
|
const dependencies = parsed?.dependencies ?? {}
|
|
|
const depVersion = dependencies["@opencode-ai/plugin"]
|
|
|
if (!depVersion) return true
|
|
|
@@ -1220,7 +1220,7 @@ export namespace Config {
|
|
|
if (provider && model) result.model = `${provider}/${model}`
|
|
|
result["$schema"] = "https://opencode.ai/config.json"
|
|
|
result = mergeDeep(result, rest)
|
|
|
- await Bun.write(path.join(Global.Path.config, "config.json"), JSON.stringify(result, null, 2))
|
|
|
+ await Filesystem.writeJson(path.join(Global.Path.config, "config.json"), result)
|
|
|
await fs.unlink(legacy)
|
|
|
})
|
|
|
.catch(() => {})
|
|
|
@@ -1231,12 +1231,10 @@ export namespace Config {
|
|
|
|
|
|
async function loadFile(filepath: string): Promise<Info> {
|
|
|
log.info("loading", { path: filepath })
|
|
|
- let text = await Bun.file(filepath)
|
|
|
- .text()
|
|
|
- .catch((err) => {
|
|
|
- if (err.code === "ENOENT") return
|
|
|
- throw new JsonError({ path: filepath }, { cause: err })
|
|
|
- })
|
|
|
+ let text = await Filesystem.readText(filepath).catch((err: any) => {
|
|
|
+ if (err.code === "ENOENT") return
|
|
|
+ throw new JsonError({ path: filepath }, { cause: err })
|
|
|
+ })
|
|
|
if (!text) return {}
|
|
|
return load(text, filepath)
|
|
|
}
|
|
|
@@ -1263,21 +1261,19 @@ export namespace Config {
|
|
|
}
|
|
|
const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(configDir, filePath)
|
|
|
const fileContent = (
|
|
|
- await Bun.file(resolvedPath)
|
|
|
- .text()
|
|
|
- .catch((error) => {
|
|
|
- const errMsg = `bad file reference: "${match}"`
|
|
|
- if (error.code === "ENOENT") {
|
|
|
- throw new InvalidError(
|
|
|
- {
|
|
|
- path: configFilepath,
|
|
|
- message: errMsg + ` ${resolvedPath} does not exist`,
|
|
|
- },
|
|
|
- { cause: error },
|
|
|
- )
|
|
|
- }
|
|
|
- throw new InvalidError({ path: configFilepath, message: errMsg }, { cause: error })
|
|
|
- })
|
|
|
+ await Filesystem.readText(resolvedPath).catch((error: any) => {
|
|
|
+ const errMsg = `bad file reference: "${match}"`
|
|
|
+ if (error.code === "ENOENT") {
|
|
|
+ throw new InvalidError(
|
|
|
+ {
|
|
|
+ path: configFilepath,
|
|
|
+ message: errMsg + ` ${resolvedPath} does not exist`,
|
|
|
+ },
|
|
|
+ { cause: error },
|
|
|
+ )
|
|
|
+ }
|
|
|
+ throw new InvalidError({ path: configFilepath, message: errMsg }, { cause: error })
|
|
|
+ })
|
|
|
).trim()
|
|
|
// escape newlines/quotes, strip outer quotes
|
|
|
text = text.replace(match, () => JSON.stringify(fileContent).slice(1, -1))
|
|
|
@@ -1314,7 +1310,7 @@ export namespace Config {
|
|
|
parsed.data.$schema = "https://opencode.ai/config.json"
|
|
|
// Write the $schema to the original text to preserve variables like {env:VAR}
|
|
|
const updated = original.replace(/^\s*\{/, '{\n "$schema": "https://opencode.ai/config.json",')
|
|
|
- await Bun.write(configFilepath, updated).catch(() => {})
|
|
|
+ await Filesystem.write(configFilepath, updated).catch(() => {})
|
|
|
}
|
|
|
const data = parsed.data
|
|
|
if (data.plugin) {
|
|
|
@@ -1370,7 +1366,7 @@ export namespace Config {
|
|
|
export async function update(config: Info) {
|
|
|
const filepath = path.join(Instance.directory, "config.json")
|
|
|
const existing = await loadFile(filepath)
|
|
|
- await Bun.write(filepath, JSON.stringify(mergeDeep(existing, config), null, 2))
|
|
|
+ await Filesystem.writeJson(filepath, mergeDeep(existing, config))
|
|
|
await Instance.dispose()
|
|
|
}
|
|
|
|
|
|
@@ -1441,24 +1437,22 @@ export namespace Config {
|
|
|
|
|
|
export async function updateGlobal(config: Info) {
|
|
|
const filepath = globalConfigFile()
|
|
|
- const before = await Bun.file(filepath)
|
|
|
- .text()
|
|
|
- .catch((err) => {
|
|
|
- if (err.code === "ENOENT") return "{}"
|
|
|
- throw new JsonError({ path: filepath }, { cause: err })
|
|
|
- })
|
|
|
+ const before = await Filesystem.readText(filepath).catch((err: any) => {
|
|
|
+ if (err.code === "ENOENT") return "{}"
|
|
|
+ throw new JsonError({ path: filepath }, { cause: err })
|
|
|
+ })
|
|
|
|
|
|
const next = await (async () => {
|
|
|
if (!filepath.endsWith(".jsonc")) {
|
|
|
const existing = parseConfig(before, filepath)
|
|
|
const merged = mergeDeep(existing, config)
|
|
|
- await Bun.write(filepath, JSON.stringify(merged, null, 2))
|
|
|
+ await Filesystem.writeJson(filepath, merged)
|
|
|
return merged
|
|
|
}
|
|
|
|
|
|
const updated = patchJsonc(before, config)
|
|
|
const merged = parseConfig(updated, filepath)
|
|
|
- await Bun.write(filepath, updated)
|
|
|
+ await Filesystem.write(filepath, updated)
|
|
|
return merged
|
|
|
})()
|
|
|
|