···11+CREATE TABLE `recipes` (
22+ `id` integer PRIMARY KEY NOT NULL,
33+ `rkey` text NOT NULL,
44+ `title` text NOT NULL,
55+ `description` text,
66+ `ingredients` text NOT NULL,
77+ `steps` text NOT NULL,
88+ `created_at` text NOT NULL,
99+ `author_did` text NOT NULL
1010+);
1111+--> statement-breakpoint
1212+CREATE UNIQUE INDEX `recipes_id_unique` ON `recipes` (`id`);--> statement-breakpoint
1313+CREATE UNIQUE INDEX `recipes_rkey_author_did_unique` ON `recipes` (`rkey`,`author_did`);
···11+import { Hono } from 'hono';
22+33+export const xrpcApp = new Hono();
44+55+xrpcApp.use('/:nsid', async c => {
66+ c.status(400);
77+ return c.json({
88+ error: 'not_implemented',
99+ message: 'The XRPC server has not yet been implemented.',
1010+ });
1111+});
···11+/* eslint-disable */
22+// This file is automatically generated, do not edit!
33+44+/**
55+ * @module
66+ * Contains type declarations for Cookware lexicons
77+ */
88+99+import "@atcute/client/lexicons";
1010+1111+declare module "@atcute/client/lexicons" {
1212+ namespace MoeHaydenCookwareDefs {
1313+ interface Ingredient {
1414+ [Brand.Type]?: "moe.hayden.cookware.defs#ingredient";
1515+ /** How much of the ingredient is needed. */
1616+ amount?: number;
1717+ /**
1818+ * The name of the ingredient. \
1919+ * Maximum string length: 3000 \
2020+ * Maximum grapheme length: 300
2121+ */
2222+ name?: string;
2323+ /**
2424+ * The unit the ingredient is measured in. \
2525+ * Maximum string length: 3000 \
2626+ * Maximum grapheme length: 300
2727+ */
2828+ unit?: string;
2929+ }
3030+ interface Step {
3131+ [Brand.Type]?: "moe.hayden.cookware.defs#step";
3232+ /**
3333+ * The instruction to provide to the user. \
3434+ * Maximum string length: 5000 \
3535+ * Maximum grapheme length: 300
3636+ */
3737+ text: string;
3838+ }
3939+ }
4040+4141+ namespace MoeHaydenCookwareRecipe {
4242+ /** Record containing a Cookware recipe. */
4343+ interface Record {
4444+ $type: "moe.hayden.cookware.recipe";
4545+ ingredients: MoeHaydenCookwareDefs.Ingredient[];
4646+ steps: MoeHaydenCookwareDefs.Step[];
4747+ /**
4848+ * The title of the recipe. \
4949+ * Maximum string length: 3000 \
5050+ * Maximum grapheme length: 300
5151+ */
5252+ title: string;
5353+ /**
5454+ * The description of the recipe. \
5555+ * Maximum string length: 3000 \
5656+ * Maximum grapheme length: 300
5757+ */
5858+ description?: string;
5959+ }
6060+ }
6161+6262+ interface Records {
6363+ "moe.hayden.cookware.recipe": MoeHaydenCookwareRecipe.Record;
6464+ }
6565+6666+ interface Queries {}
6767+6868+ interface Procedures {}
6969+}
+3-2
libs/lexicons/src/index.ts
···11-export * from './recipe'
22-export * from './defs'
11+export * from './recipe.js';
22+export * from './defs.js';
33+export * from './atcute.js';
+1-1
libs/lexicons/src/recipe.ts
···5566export const RecipeRecord = z.object({
77 title: z.string().max(3000, 'Recipe titles must be under 3000 characters.'),
88- description: z.string().max(3000, 'Recipe descriptions must be under 3000 characters.'),
88+ description: z.string().max(3000, 'Recipe descriptions must be under 3000 characters.').nullable(),
99 ingredients: z.array(IngredientObject),
1010 steps: z.array(StepObject),
1111});