Track and save on groceries
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();