| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- import path from "path";
- import { Log } from "../util/log";
- import { z } from "zod";
- import { App } from "../app/app";
- import { Provider } from "../provider/provider";
- export namespace Config {
- const log = Log.create({ service: "config" });
- export const state = App.state("config", async (app) => {
- const result = await load(app.root);
- return result;
- });
- export const Info = z
- .object({
- providers: z.record(z.string(), Provider.Info).optional(),
- })
- .strict();
- export type Info = z.output<typeof Info>;
- export function get() {
- return state();
- }
- async function load(directory: string) {
- let result: Info = {};
- for (const file of ["opencode.jsonc", "opencode.json"]) {
- const resolved = path.join(directory, file);
- log.info("searching", { path: resolved });
- try {
- result = await import(path.join(directory, file)).then((mod) =>
- Info.parse(mod.default),
- );
- log.info("found", { path: resolved });
- break;
- } catch (e) {
- if (e instanceof z.ZodError) {
- for (const issue of e.issues) {
- log.info(issue.message);
- }
- throw e;
- }
- continue;
- }
- }
- log.info("loaded", result);
- return result;
- }
- }
|