import { OpenAPIGenerator, SchemaConvertOptions } from "@orpc/openapi"; import { ZodToJsonSchemaConverter } from "@orpc/zod/zod4"; import { Store, Stores } from "./schema/stores.js"; import { mkdir, writeFile } from "node:fs/promises"; import { apiContract } from "./contract/index.js"; import { Brand, Brands } from "./schema/brands.js"; import { ExtendedProduct, Product, Products } from "./schema/products.js"; import z from "zod/v4"; import { schemaTitle } from "./utils.js"; const generator = new OpenAPIGenerator({ schemaConverters: [new ZodToJsonSchemaConverter()], }); const registerSchemas = ( strategy: SchemaConvertOptions["strategy"], schemas: z.ZodType[], ) => { const commonSchemas: Record< string, { strategy?: SchemaConvertOptions["strategy"]; schema: z.ZodType; } > = {}; for (const [i, schema] of schemas.entries()) { commonSchemas[schemaTitle(schema)] = { strategy, schema, }; } return commonSchemas; }; const spec = await generator.generate(apiContract, { info: { title: "Cherries", version: "1.0.0", }, commonSchemas: { ...registerSchemas("output", [ Brands, Brand, ExtendedProduct, Products, Product, Stores, Store, ]), }, }); const writeSpec = async () => { await mkdir("dist/").catch((err) => { if (err.code != "EEXIST") { throw err; } }); await writeFile("dist/openapi.json", JSON.stringify(spec, null, 2)); }; await writeSpec();