config.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import path from "path";
  2. import { Log } from "../util/log";
  3. import { z } from "zod";
  4. import { App } from "../app/app";
  5. import { Provider } from "../provider/provider";
  6. export namespace Config {
  7. const log = Log.create({ service: "config" });
  8. export const state = App.state("config", async (app) => {
  9. const result = await load(app.root);
  10. return result;
  11. });
  12. export const Info = z
  13. .object({
  14. providers: z.record(z.string(), Provider.Info).optional(),
  15. })
  16. .strict();
  17. export type Info = z.output<typeof Info>;
  18. export function get() {
  19. return state();
  20. }
  21. async function load(directory: string) {
  22. let result: Info = {};
  23. for (const file of ["opencode.jsonc", "opencode.json"]) {
  24. const resolved = path.join(directory, file);
  25. log.info("searching", { path: resolved });
  26. try {
  27. result = await import(path.join(directory, file)).then((mod) =>
  28. Info.parse(mod.default),
  29. );
  30. log.info("found", { path: resolved });
  31. break;
  32. } catch (e) {
  33. if (e instanceof z.ZodError) {
  34. for (const issue of e.issues) {
  35. log.info(issue.message);
  36. }
  37. throw e;
  38. }
  39. continue;
  40. }
  41. }
  42. log.info("loaded", result);
  43. return result;
  44. }
  45. }