import { existsSync, readFileSync, statSync, writeFileSync } from "node:fs" import { parseJsonc } from "../../shared" import type { ConfigMergeResult, InstallConfig } from "../types" import { getConfigDir, getOmoConfigPath } from "./config-context" import { deepMergeRecord } from "./deep-merge-record" import { ensureConfigDirectoryExists } from "./ensure-config-directory-exists" import { formatErrorWithSuggestion } from "./format-error-with-suggestion" import { generateOmoConfig } from "./generate-omo-config" function isEmptyOrWhitespace(content: string): boolean { return content.trim().length === 0 } export function writeOmoConfig(installConfig: InstallConfig): ConfigMergeResult { try { ensureConfigDirectoryExists() } catch (err) { return { success: false, configPath: getConfigDir(), error: formatErrorWithSuggestion(err, "create config directory"), } } const omoConfigPath = getOmoConfigPath() try { const newConfig = generateOmoConfig(installConfig) if (existsSync(omoConfigPath)) { try { const stat = statSync(omoConfigPath) const content = readFileSync(omoConfigPath, "utf-8") if (stat.size === 0 || isEmptyOrWhitespace(content)) { writeFileSync(omoConfigPath, JSON.stringify(newConfig, null, 2) + "\n") return { success: true, configPath: omoConfigPath } } const existing = parseJsonc>(content) if (!existing || typeof existing !== "object" || Array.isArray(existing)) { writeFileSync(omoConfigPath, JSON.stringify(newConfig, null, 2) + "\n") return { success: true, configPath: omoConfigPath } } const merged = deepMergeRecord(existing, newConfig) writeFileSync(omoConfigPath, JSON.stringify(merged, null, 2) + "\n") } catch (parseErr) { if (parseErr instanceof SyntaxError) { writeFileSync(omoConfigPath, JSON.stringify(newConfig, null, 2) + "\n") return { success: true, configPath: omoConfigPath } } throw parseErr } } else { writeFileSync(omoConfigPath, JSON.stringify(newConfig, null, 2) + "\n") } return { success: true, configPath: omoConfigPath } } catch (err) { return { success: false, configPath: omoConfigPath, error: formatErrorWithSuggestion(err, "write oh-my-opencode config"), } } }