Skip to content

Commit 03d803f

Browse files
dmealingclaude
andcommitted
fix(codegen-ts-react): declare zod as a form runtime peer; regenerate the example forms
The form now imports zod for its z.preprocess wrapper (9611f67), so the catalog entry declares it and `meta eject form` tells adopters to install it; catalog-declarations-resolved caught the gap. examples/advanced-modeling commits its generated forms, regenerated here so its drift gate is green. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M1mRRB1K2WdYy82kntMQdx
1 parent 351d1dc commit 03d803f

5 files changed

Lines changed: 19 additions & 7 deletions

File tree

‎examples/advanced-modeling/.metaobjects/.gen-state/.hashes.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"src/generated/Author.form.tsx": "ee3a22a7ab2aa25d7b006e8888d1018b0c5de3d8b68b2bb6bbf97d3e347fa624",
2+
"src/generated/Author.form.tsx": "0481f3ab0aa427581cead70d2c44fae1d709e49a0f004fcc070c50c55ede3308",
33
"src/generated/Author.queries.ts": "42cc1ab2fd442559e1e9c5c3f14978f306efcda5472f8b5370d3339753e5a36f",
44
"src/generated/Author.routes.ts": "3b0412b4501d02ba8716dae634522202714d467c5f9d577d8ea583868b1187d5",
55
"src/generated/Author.ts": "36f28e09c3633848bf3bdb45372e03ae8b036792dec05f503a6f0d3abc1bb1cc",
@@ -8,7 +8,7 @@
88
"src/generated/Lesson.queries.ts": "bc8e9bff3cb70c2c47ecfd07619f90d3f26a3981aca8ce6828f75e2a80fb9273",
99
"src/generated/Lesson.routes.ts": "ab910b2a1cfe1d38a49ce5d54de149bdbdfcd5adb077363b913ce6bebd01de13",
1010
"src/generated/Lesson.ts": "8368d2aaa7a4d451083eeb27f1e018938f9f605f5227ce6609c46b22e8f267d4",
11-
"src/generated/Program.form.tsx": "4ed1f868dcf32fe865ab7cb7aad75fcb60a75c67713dd5351a159ed17f9808f5",
11+
"src/generated/Program.form.tsx": "42056db5d322bb03e0fc00a197357061854d5a4fb3a304a2e8e04c8fc3689b6f",
1212
"src/generated/Program.queries.ts": "07bde6eda6ec265f3b9b61b73b379ed2a066a9b852ecbda2c6bf7ee5d5d079cf",
1313
"src/generated/Program.routes.ts": "ac43f1836303aa693e26f346398f47330d18ac4ce6a60e03394dc40dee398cc7",
1414
"src/generated/Program.ts": "6c9c347e4839fb6c5dd12694e4cb100ae6bef10cedad7b5236adcbb16a811cfe",
@@ -19,7 +19,7 @@
1919
"src/generated/ProgramSummary.queries.ts": "743e8ce74eee85bb821cf3d909957fae630085fb1f5a7567dd6bfdcae4364910",
2020
"src/generated/ProgramSummary.routes.ts": "995e893a6b21e65d7bc031761c18bb7bb0c790abb31cb72546bf95573c980099",
2121
"src/generated/ProgramSummary.ts": "181f48ed374dfdf2f5b3213e0064833f071fd7029ed9357a6eef764616c2429c",
22-
"src/generated/Purchase.form.tsx": "4a2f46350d6f529fc66e93b2bcf14fbe3f385d25ffda379facfdc5aa1f2c1c8b",
22+
"src/generated/Purchase.form.tsx": "cd3556f18246b84e661a423186127cd5f87b1ad955a3afe9cd78ba77fa824b2a",
2323
"src/generated/Purchase.queries.ts": "ae7896ebdf3a57332e2c79dc9dd99fef9547054371547d6a469a752a7fc64ad6",
2424
"src/generated/Purchase.routes.ts": "b1d1df2277754b63f137d5059603abc812a36795656099e7b9df4cf67928549c",
2525
"src/generated/Purchase.ts": "e37c57f29eda8d7d4a13e8d58ab1695f0d07b8a804b6f5abadaba75adaa66484",

‎examples/advanced-modeling/src/generated/Author.form.tsx‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { Author as AuthorRow } from "./Author";
66
import { useEntityForm } from "@metaobjectsdev/react";
77
import type { ReactElement } from "react";
88
import type { SubmitHandler } from "react-hook-form";
9+
import { z } from "zod";
910

1011
const BLANK_OPTIONAL_FIELDS = ["bio"] as const;
1112

@@ -49,7 +50,10 @@ export interface AuthorFormProps {
4950
export function AuthorForm(props: AuthorFormProps): ReactElement {
5051
const form = useEntityForm(
5152
Author,
52-
props.defaultValues !== undefined ? AuthorUpdateSchema : AuthorInsertSchema,
53+
z.preprocess(
54+
(v) => normalizeBlankOptionals(v as Record<string, unknown>, props.defaultValues !== undefined),
55+
props.defaultValues !== undefined ? AuthorUpdateSchema : AuthorInsertSchema,
56+
),
5357
props.defaultValues !== undefined ? { defaultValues: props.defaultValues } : {},
5458
);
5559
return (

‎examples/advanced-modeling/src/generated/Program.form.tsx‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import type { Program as ProgramRow } from "./Program";
99
import { useEntityForm } from "@metaobjectsdev/react";
1010
import type { ReactElement } from "react";
1111
import type { SubmitHandler } from "react-hook-form";
12+
import { z } from "zod";
1213

1314
const BLANK_OPTIONAL_FIELDS = ["status", "summary", "priceCents"] as const;
1415

@@ -52,7 +53,10 @@ export interface ProgramFormProps {
5253
export function ProgramForm(props: ProgramFormProps): ReactElement {
5354
const form = useEntityForm(
5455
Program,
55-
props.defaultValues !== undefined ? ProgramUpdateSchema : ProgramInsertSchema,
56+
z.preprocess(
57+
(v) => normalizeBlankOptionals(v as Record<string, unknown>, props.defaultValues !== undefined),
58+
props.defaultValues !== undefined ? ProgramUpdateSchema : ProgramInsertSchema,
59+
),
5660
props.defaultValues !== undefined ? { defaultValues: props.defaultValues } : {},
5761
);
5862
const syllabusArray = useFieldArray({ control: form.control, name: "syllabus" as never });

‎examples/advanced-modeling/src/generated/Purchase.form.tsx‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { Purchase as PurchaseRow } from "./Purchase";
66
import { useEntityForm } from "@metaobjectsdev/react";
77
import type { ReactElement } from "react";
88
import type { SubmitHandler } from "react-hook-form";
9+
import { z } from "zod";
910

1011
const BLANK_OPTIONAL_FIELDS = ["amountCents", "status", "purchasedAt"] as const;
1112

@@ -49,7 +50,10 @@ export interface PurchaseFormProps {
4950
export function PurchaseForm(props: PurchaseFormProps): ReactElement {
5051
const form = useEntityForm(
5152
Purchase,
52-
props.defaultValues !== undefined ? PurchaseUpdateSchema : PurchaseInsertSchema,
53+
z.preprocess(
54+
(v) => normalizeBlankOptionals(v as Record<string, unknown>, props.defaultValues !== undefined),
55+
props.defaultValues !== undefined ? PurchaseUpdateSchema : PurchaseInsertSchema,
56+
),
5357
props.defaultValues !== undefined ? { defaultValues: props.defaultValues } : {},
5458
);
5559
return (

‎server/typescript/packages/codegen-ts-react/src/generator-registry.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const reactGeneratorRegistry: Record<string, GeneratorRegistryEntry> = {
3131
framework: "react",
3232
requires: ["entity"],
3333
runtimePackages: ["@metaobjectsdev/react"],
34-
runtimePeers: ["react", "react-hook-form"],
34+
runtimePeers: ["react", "react-hook-form", "zod"],
3535
configKeys: ["extStyle", "clientDirective"],
3636
ejectable: ejectable("form"),
3737
},

0 commit comments

Comments
 (0)