This commit is contained in:
Dax Raad
2025-05-19 15:43:14 -04:00
parent 99af6146d5
commit 652429377b
18 changed files with 188 additions and 498 deletions

View File

@@ -1,4 +1,4 @@
import type { z, ZodSchema } from "zod";
import { z, type ZodType } from "zod/v4";
import { App } from "../app";
import { Log } from "../util/log";
@@ -16,14 +16,30 @@ export namespace Bus {
export type EventDefinition = ReturnType<typeof event>;
export function event<Type extends string, Properties extends ZodSchema>(
const registry = new Map<string, EventDefinition>();
export function event<Type extends string, Properties extends ZodType>(
type: Type,
properties: Properties,
) {
return {
const result = {
type,
properties,
};
registry.set(type, result);
return result;
}
export function specs() {
const children = {} as any;
for (const [type, def] of registry.entries()) {
children[def.type] = def.properties;
}
const result = z.toJSONSchema(z.object(children)) as any;
result.definitions = result.properties;
delete result.properties;
delete result.required;
return result;
}
export function publish<Definition extends EventDefinition>(

View File

@@ -1,6 +1,9 @@
import { App } from "./app";
import { Server } from "./server/server";
import { Cli, Command, runExit } from "clipanion";
import fs from "fs/promises";
import path from "path";
import { Bus } from "./bus";
const cli = new Cli({
binaryLabel: `opencode`,
@@ -22,11 +25,21 @@ cli.register(
},
);
cli.register(
class OpenApi extends Command {
static paths = [["openapi"]];
class Generate extends Command {
static paths = [["generate"]];
async execute() {
const specs = await Server.openapi();
this.context.stdout.write(JSON.stringify(specs, null, 2));
const dir = "gen";
await fs.rmdir(dir, { recursive: true }).catch(() => {});
await fs.mkdir(dir, { recursive: true });
await Bun.write(
path.join(dir, "openapi.json"),
JSON.stringify(specs, null, 2),
);
await Bun.write(
path.join(dir, "event.json"),
JSON.stringify(Bus.specs(), null, 2),
);
}
},
);

View File

@@ -5,7 +5,7 @@ import { Log } from "../util/log";
import { App } from "../app";
import { AppPath } from "../app/path";
import { Bus } from "../bus";
import z from "zod";
import z from "zod/v4";
export namespace Storage {
const log = Log.create({ service: "storage" });