You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(spec): keep lazySchema proxies identity-compatible with z.toJSONSchema (objectui#2561)
zod's toJSONSchema keys its seen-map on the traversed node (the lazySchema
Proxy at z.lazy recursion getters and conversion roots), while its
wrapper-type processors (pipe/lazy/optional/default/...) resolve
ctx.seen.get(inst) via the REAL instance captured at construction — the
identity mismatch crashes with "Cannot set properties of undefined
(setting 'ref')". Latent while lazy-referenced schemas were plain objects;
ADR-0089 D3a made PageComponentSchema/FormFieldSchema .strict().transform()
pipes, breaking ObjectUI Studio's spec-derived Page/View inspector
JSONSchema derivation under spec 15.
The proxy now serves a memoised _zod facade that prototype-delegates to the
real internals and wraps only processJSONSchema to alias the proxy's seen
entry onto the real instance before delegating. Parse behavior unchanged;
OS_EAGER_SCHEMAS=1 remains the bypass. Regression tests: the D3a pipe shape,
recursion through z.lazy(() => proxy), mixed proxy+real traversal, and the
PageSchema/ViewSchema Studio derivation paths.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix(spec): keep `lazySchema` proxies identity-compatible with `z.toJSONSchema` (objectui#2561)
6
+
7
+
zod's `toJSONSchema` keys its `seen` map on the node object it traverses — the `lazySchema` Proxy wherever a schema is referenced lazily (`z.lazy(() => X)` recursion getters, direct conversion roots) — while its wrapper-type processors (pipe/lazy/optional/default/…) look themselves up via the REAL instance captured at construction (`inst._zod.processJSONSchema = (ctx, …) => pipeProcessor(inst, …)`). The identity mismatch crashed conversion with `Cannot set properties of undefined (setting 'ref')`.
8
+
9
+
This stayed latent while lazy-referenced schemas were plain objects (the object processor never looks itself up); ADR-0089 D3a turned `PageComponentSchema` / `FormFieldSchema` into `.strict().transform(…)`**pipes**, which broke ObjectUI Studio's spec-derived Page/View inspector JSONSchema derivation under spec 15.
10
+
11
+
Fix: the proxy now serves a memoised `_zod` facade that prototype-delegates to the real internals and wraps only `processJSONSchema` to alias the proxy's `seen` entry onto the real instance before delegating. Parse behavior is unchanged; `OS_EAGER_SCHEMAS=1` remains the bypass. Regression tests cover the D3a pipe shape, recursion through `z.lazy(() => proxy)`, mixed proxy+real traversal, and the full `PageSchema` / `ViewSchema` Studio derivation paths.
0 commit comments