mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-26 20:24:21 +01:00
sync
This commit is contained in:
@@ -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>(
|
||||
|
||||
@@ -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),
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@@ -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" });
|
||||
|
||||
Reference in New Issue
Block a user