Track and save on groceries
at main 63 lines 1.5 kB view raw
1import { OpenAPIGenerator, SchemaConvertOptions } from "@orpc/openapi"; 2import { ZodToJsonSchemaConverter } from "@orpc/zod/zod4"; 3import { Store, Stores } from "./schema/stores.js"; 4import { mkdir, writeFile } from "node:fs/promises"; 5import { apiContract } from "./contract/index.js"; 6import { Brand, Brands } from "./schema/brands.js"; 7import { ExtendedProduct, Product, Products } from "./schema/products.js"; 8import z from "zod/v4"; 9import { schemaTitle } from "./utils.js"; 10 11const generator = new OpenAPIGenerator({ 12 schemaConverters: [new ZodToJsonSchemaConverter()], 13}); 14 15const registerSchemas = ( 16 strategy: SchemaConvertOptions["strategy"], 17 schemas: z.ZodType[], 18) => { 19 const commonSchemas: Record< 20 string, 21 { 22 strategy?: SchemaConvertOptions["strategy"]; 23 schema: z.ZodType; 24 } 25 > = {}; 26 27 for (const [i, schema] of schemas.entries()) { 28 commonSchemas[schemaTitle(schema)] = { 29 strategy, 30 schema, 31 }; 32 } 33 return commonSchemas; 34}; 35 36const spec = await generator.generate(apiContract, { 37 info: { 38 title: "Cherries", 39 version: "1.0.0", 40 }, 41 commonSchemas: { 42 ...registerSchemas("output", [ 43 Brands, 44 Brand, 45 ExtendedProduct, 46 Products, 47 Product, 48 Stores, 49 Store, 50 ]), 51 }, 52}); 53 54const writeSpec = async () => { 55 await mkdir("dist/").catch((err) => { 56 if (err.code != "EEXIST") { 57 throw err; 58 } 59 }); 60 await writeFile("dist/openapi.json", JSON.stringify(spec, null, 2)); 61}; 62 63await writeSpec();