schema-components 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/README.md +98 -1
  2. package/dist/SchemaComponent-B__6-5-E.d.mts +277 -0
  3. package/dist/SchemaComponent-BxzzsHsK.mjs +668 -0
  4. package/dist/adapter-ktQaheWB.d.mts +213 -0
  5. package/dist/constructorTypes-BdCiMS6e.d.mts +30 -0
  6. package/dist/core/adapter.d.mts +3 -213
  7. package/dist/core/constraintHint.d.mts +1 -1
  8. package/dist/core/constraints.d.mts +2 -2
  9. package/dist/core/contexts.d.mts +71 -0
  10. package/dist/core/contexts.mjs +1 -0
  11. package/dist/core/diagnostics.d.mts +1 -1
  12. package/dist/core/errors.d.mts +1 -1
  13. package/dist/core/fieldOrder.d.mts +1 -1
  14. package/dist/{react → core}/fieldPath.d.mts +2 -2
  15. package/dist/{react → core}/fieldPath.mjs +3 -3
  16. package/dist/core/formats.d.mts +1 -1
  17. package/dist/core/inferValue.d.mts +1 -1
  18. package/dist/core/limits.d.mts +1 -1
  19. package/dist/core/merge.d.mts +1 -1
  20. package/dist/core/normalise.d.mts +2 -2
  21. package/dist/core/ref.d.mts +1 -1
  22. package/dist/core/renderField.d.mts +147 -0
  23. package/dist/core/renderField.mjs +81 -0
  24. package/dist/core/renderer.d.mts +2 -199
  25. package/dist/core/swagger2.d.mts +1 -1
  26. package/dist/core/typeInference.d.mts +1 -982
  27. package/dist/core/types.d.mts +1 -1
  28. package/dist/core/unionMatch.d.mts +1 -1
  29. package/dist/core/version.d.mts +1 -1
  30. package/dist/core/walkBuilders.d.mts +3 -3
  31. package/dist/core/walker.d.mts +1 -1
  32. package/dist/{errors-Dki7tji4.d.mts → errors-DbaI04x2.d.mts} +1 -1
  33. package/dist/html/a11y.d.mts +2 -2
  34. package/dist/html/renderToHtml.d.mts +5 -5
  35. package/dist/html/renderToHtml.mjs +33 -18
  36. package/dist/html/renderToHtmlStream.d.mts +5 -5
  37. package/dist/html/renderers.d.mts +1 -1
  38. package/dist/html/streamRenderers.d.mts +3 -3
  39. package/dist/{inferValue-Ce-PviSD.d.mts → inferValue-eAnh50EM.d.mts} +3 -3
  40. package/dist/lit/SchemaComponent.d.mts +125 -0
  41. package/dist/lit/SchemaComponent.mjs +2 -0
  42. package/dist/lit/SchemaField.d.mts +65 -0
  43. package/dist/lit/SchemaField.mjs +2 -0
  44. package/dist/lit/SchemaView.d.mts +14 -0
  45. package/dist/lit/SchemaView.mjs +2 -0
  46. package/dist/lit/constructorTypes.d.mts +2 -0
  47. package/dist/lit/constructorTypes.mjs +1 -0
  48. package/dist/lit/contexts.d.mts +78 -0
  49. package/dist/lit/contexts.mjs +238 -0
  50. package/dist/lit/defaultResolver.d.mts +33 -0
  51. package/dist/lit/defaultResolver.mjs +2 -0
  52. package/dist/lit/registry.d.mts +66 -0
  53. package/dist/lit/registry.mjs +2 -0
  54. package/dist/lit/renderers/baseElement.d.mts +131 -0
  55. package/dist/lit/renderers/baseElement.mjs +109 -0
  56. package/dist/lit/renderers/recordHelpers.d.mts +25 -0
  57. package/dist/lit/renderers/recordHelpers.mjs +55 -0
  58. package/dist/lit/renderers/scArray.d.mts +14 -0
  59. package/dist/lit/renderers/scArray.mjs +86 -0
  60. package/dist/lit/renderers/scBoolean.d.mts +15 -0
  61. package/dist/lit/renderers/scBoolean.mjs +47 -0
  62. package/dist/lit/renderers/scConditional.d.mts +23 -0
  63. package/dist/lit/renderers/scConditional.mjs +65 -0
  64. package/dist/lit/renderers/scDiscriminated.d.mts +23 -0
  65. package/dist/lit/renderers/scDiscriminated.mjs +138 -0
  66. package/dist/lit/renderers/scEnum.d.mts +16 -0
  67. package/dist/lit/renderers/scEnum.mjs +66 -0
  68. package/dist/lit/renderers/scFile.d.mts +15 -0
  69. package/dist/lit/renderers/scFile.mjs +53 -0
  70. package/dist/lit/renderers/scLiteralNullNever.d.mts +30 -0
  71. package/dist/lit/renderers/scLiteralNullNever.mjs +57 -0
  72. package/dist/lit/renderers/scNumber.d.mts +15 -0
  73. package/dist/lit/renderers/scNumber.mjs +64 -0
  74. package/dist/lit/renderers/scObject.d.mts +14 -0
  75. package/dist/lit/renderers/scObject.mjs +57 -0
  76. package/dist/lit/renderers/scRecord.d.mts +14 -0
  77. package/dist/lit/renderers/scRecord.mjs +112 -0
  78. package/dist/lit/renderers/scString.d.mts +19 -0
  79. package/dist/lit/renderers/scString.mjs +165 -0
  80. package/dist/lit/renderers/scTuple.d.mts +14 -0
  81. package/dist/lit/renderers/scTuple.mjs +58 -0
  82. package/dist/lit/renderers/scUnion.d.mts +14 -0
  83. package/dist/lit/renderers/scUnion.mjs +44 -0
  84. package/dist/lit/renderers/scUnknown.d.mts +15 -0
  85. package/dist/lit/renderers/scUnknown.mjs +45 -0
  86. package/dist/lit/ssr.d.mts +37 -0
  87. package/dist/lit/ssr.mjs +9565 -0
  88. package/dist/lit/types.d.mts +2 -0
  89. package/dist/lit/types.mjs +1 -0
  90. package/dist/lit/widget.d.mts +71 -0
  91. package/dist/lit/widget.mjs +87 -0
  92. package/dist/openapi/ApiCallbacks.d.mts +1 -1
  93. package/dist/openapi/ApiLinks.d.mts +1 -1
  94. package/dist/openapi/ApiResponseHeaders.d.mts +1 -1
  95. package/dist/openapi/ApiSecurity.d.mts +1 -1
  96. package/dist/openapi/components.d.mts +4 -4
  97. package/dist/openapi/parser.d.mts +2 -2
  98. package/dist/openapi/resolve.d.mts +1 -1
  99. package/dist/preact/SchemaComponent.d.mts +3 -0
  100. package/dist/preact/SchemaComponent.mjs +26 -0
  101. package/dist/preact/SchemaErrorBoundary.d.mts +2 -0
  102. package/dist/preact/SchemaErrorBoundary.mjs +20 -0
  103. package/dist/preact/SchemaView.d.mts +2 -0
  104. package/dist/preact/SchemaView.mjs +22 -0
  105. package/dist/preact/headless.d.mts +2 -0
  106. package/dist/preact/headless.mjs +18 -0
  107. package/dist/react/SchemaComponent.d.mts +3 -270
  108. package/dist/react/SchemaComponent.mjs +41 -32
  109. package/dist/react/SchemaView.d.mts +6 -6
  110. package/dist/react/SchemaView.mjs +32 -29
  111. package/dist/react/a11y.d.mts +2 -2
  112. package/dist/react/fieldShell.d.mts +1 -1
  113. package/dist/react/headless.d.mts +1 -1
  114. package/dist/react/headlessRenderers.d.mts +2 -2
  115. package/dist/{ref-DdsbekXX.d.mts → ref-DWrQG1Er.d.mts} +1 -1
  116. package/dist/renderer-ab9E52Bp.d.mts +245 -0
  117. package/dist/solid/SchemaComponent.d.mts +136 -0
  118. package/dist/solid/SchemaComponent.mjs +391 -0
  119. package/dist/solid/SchemaErrorBoundary.d.mts +38 -0
  120. package/dist/solid/SchemaErrorBoundary.mjs +57 -0
  121. package/dist/solid/SchemaField.d.mts +40 -0
  122. package/dist/solid/SchemaField.mjs +113 -0
  123. package/dist/solid/SchemaView.d.mts +54 -0
  124. package/dist/solid/SchemaView.mjs +168 -0
  125. package/dist/solid/a11y.d.mts +70 -0
  126. package/dist/solid/a11y.mjs +71 -0
  127. package/dist/solid/contexts.d.mts +37 -0
  128. package/dist/solid/contexts.mjs +66 -0
  129. package/dist/solid/headless.d.mts +10 -0
  130. package/dist/solid/headless.mjs +27 -0
  131. package/dist/solid/renderers.d.mts +79 -0
  132. package/dist/solid/renderers.mjs +840 -0
  133. package/dist/solid/types.d.mts +90 -0
  134. package/dist/solid/types.mjs +1 -0
  135. package/dist/solid/widget.d.mts +29 -0
  136. package/dist/solid/widget.mjs +35 -0
  137. package/dist/themes/mantine.d.mts +1 -1
  138. package/dist/themes/mui.d.mts +1 -1
  139. package/dist/themes/radix.d.mts +1 -1
  140. package/dist/themes/shadcn.d.mts +1 -1
  141. package/dist/typeInference-Y8tNEQJk.d.mts +983 -0
  142. package/dist/types-BCy7K3nk.d.mts +125 -0
  143. package/package.json +71 -1
  144. package/src/svelte/SchemaComponent.svelte +427 -0
  145. package/src/svelte/SchemaErrorBoundary.svelte +66 -0
  146. package/src/svelte/SchemaField.svelte +216 -0
  147. package/src/svelte/SchemaProvider.svelte +46 -0
  148. package/src/svelte/SchemaView.svelte +244 -0
  149. package/src/svelte/a11y.ts +112 -0
  150. package/src/svelte/contexts.ts +79 -0
  151. package/src/svelte/dispatch.ts +267 -0
  152. package/src/svelte/headless.ts +73 -0
  153. package/src/svelte/headlessFns.ts +124 -0
  154. package/src/svelte/renderers/Array.svelte +98 -0
  155. package/src/svelte/renderers/Boolean.svelte +43 -0
  156. package/src/svelte/renderers/Conditional.svelte +67 -0
  157. package/src/svelte/renderers/DiscriminatedUnion.svelte +197 -0
  158. package/src/svelte/renderers/Enum.svelte +53 -0
  159. package/src/svelte/renderers/Fallback.svelte +24 -0
  160. package/src/svelte/renderers/File.svelte +46 -0
  161. package/src/svelte/renderers/Literal.svelte +29 -0
  162. package/src/svelte/renderers/Mount.svelte +24 -0
  163. package/src/svelte/renderers/Negation.svelte +35 -0
  164. package/src/svelte/renderers/Never.svelte +24 -0
  165. package/src/svelte/renderers/Null.svelte +19 -0
  166. package/src/svelte/renderers/Number.svelte +68 -0
  167. package/src/svelte/renderers/Object.svelte +74 -0
  168. package/src/svelte/renderers/Record.svelte +134 -0
  169. package/src/svelte/renderers/RecursionSentinel.svelte +27 -0
  170. package/src/svelte/renderers/String.svelte +152 -0
  171. package/src/svelte/renderers/Tuple.svelte +84 -0
  172. package/src/svelte/renderers/Union.svelte +49 -0
  173. package/src/svelte/renderers/Unknown.svelte +42 -0
  174. package/src/svelte/svelte-modules.d.ts +25 -0
  175. package/src/svelte/types.ts +238 -0
  176. package/src/svelte/widget.ts +62 -0
  177. /package/dist/{diagnostics-BTrm3O6J.d.mts → diagnostics-mftUZI7c.d.mts} +0 -0
  178. /package/dist/{limits-x4OiyJxh.d.mts → limits-Vv9hUbI_.d.mts} +0 -0
  179. /package/dist/{types-BrYbjC7_.d.mts → types-BBQaEPfE.d.mts} +0 -0
  180. /package/dist/{version-DL8U5RuA.d.mts → version-BEBx10ND.d.mts} +0 -0
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { isObject, toRecordOrUndefined } from "../core/guards.mjs";
3
- import "../core/limits.mjs";
4
- import { SchemaFieldError, SchemaNormalisationError, SchemaRenderError } from "../core/errors.mjs";
3
+ import { SchemaFieldError, SchemaNormalisationError } from "../core/errors.mjs";
5
4
  import { isCodecSchema, normaliseSchema } from "../core/adapter.mjs";
5
+ import { resolvePath, resolveValue, setNestedValue } from "../core/fieldPath.mjs";
6
+ import { dispatchRenderField } from "../core/renderField.mjs";
6
7
  import { buildRenderProps, getRenderFunction, mergeResolvers } from "../core/renderer.mjs";
7
8
  import { walk } from "../core/walker.mjs";
8
9
  import { headlessResolver } from "./headless.mjs";
9
- import { resolvePath, resolveValue, setNestedValue } from "./fieldPath.mjs";
10
10
  import { z } from "zod";
11
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
12
  import { createContext, isValidElement, useCallback, useContext, useId, useMemo } from "react";
@@ -199,7 +199,7 @@ function SchemaComponent(props) {
199
199
  *
200
200
  * Bracketed array indices like `[0]` append directly so `tags` + `[0]`
201
201
  * becomes `tags[0]` rather than `tags.[0]` — matching the canonical form
202
- * used by `html/a11y.ts` `joinPath` and `react/fieldPath.ts` `resolvePath`,
202
+ * used by `html/a11y.ts` `joinPath` and `core/fieldPath.ts` `resolvePath`,
203
203
  * which already parses bracket notation when navigating WalkedField trees.
204
204
  */
205
205
  function joinPath(parent, suffix) {
@@ -281,41 +281,50 @@ function runValidation(zodSchema, jsonSchema, value, io, onDiagnostic) {
281
281
  * {@link SchemaComponent} and {@link SchemaField}, exported so other
282
282
  * React-side components (e.g. the OpenAPI renderers) can dispatch
283
283
  * into the same fallback chain.
284
+ *
285
+ * Thin React-flavoured wrapper around the framework-agnostic
286
+ * `dispatchRenderField` (from `core/renderField`): it constructs a
287
+ * React-shaped `DispatchConfig` (widget lookup against the
288
+ * instance → context → global chain, recursion sentinel as a React
289
+ * `<fieldset>`, fallback as a `<span>`-wrapped value) and forwards
290
+ * the call.
284
291
  */
285
292
  function renderField(tree, value, onChange, userResolver, renderChild, path, instanceWidgets, contextWidgets, depth = 0) {
286
293
  if (path.length === 0) throw new Error("renderField requires a non-empty path. Pass the root path (derived from `idPrefix` or `useId()`) for the root field, and use renderChild's pathSuffix to derive child paths.");
287
- if (depth >= 10) return /* @__PURE__ */ jsx("fieldset", { children: /* @__PURE__ */ jsxs("em", { children: [
288
- "↻ ",
289
- typeof tree.meta.description === "string" ? tree.meta.description : "schema",
290
- " (recursive)"
291
- ] }) });
292
- const componentHint = tree.meta.component;
293
- if (typeof componentHint === "string") {
294
- const widget = instanceWidgets?.get(componentHint) ?? contextWidgets?.get(componentHint) ?? globalWidgets.get(componentHint);
295
- if (widget !== void 0) {
296
- const result = widget(buildRenderProps(tree, value, onChange, renderChild, path));
297
- if (result !== void 0 && result !== null) {
294
+ return dispatchRenderField({
295
+ tree,
296
+ value,
297
+ path,
298
+ depth,
299
+ resolver: userResolver !== void 0 ? mergeResolvers(userResolver, headlessResolver) : headlessResolver,
300
+ config: {
301
+ buildProps: (fieldTree, fieldPath) => buildRenderProps(fieldTree, value, onChange, renderChild, fieldPath),
302
+ lookupRenderFn: (type, mergedResolver) => getRenderFunction(type, mergedResolver),
303
+ lookupWidget: (name) => instanceWidgets?.get(name) ?? contextWidgets?.get(name) ?? globalWidgets.get(name),
304
+ recursionSentinel: (fieldTree) => {
305
+ return /* @__PURE__ */ jsx("fieldset", { children: /* @__PURE__ */ jsxs("em", { children: [
306
+ "↻ ",
307
+ typeof fieldTree.meta.description === "string" ? fieldTree.meta.description : "schema",
308
+ " (recursive)"
309
+ ] }) });
310
+ },
311
+ fallback: (_fieldTree, fieldValue) => {
312
+ if (fieldValue === void 0 || fieldValue === null) return /* @__PURE__ */ jsx("span", { children: "—" });
313
+ return /* @__PURE__ */ jsx("span", { children: typeof fieldValue === "string" ? fieldValue : JSON.stringify(fieldValue) });
314
+ },
315
+ coerceResult: (result, step) => {
316
+ if (step === "widget") {
317
+ if (result === void 0 || result === null) return void 0;
318
+ if (isValidElement(result)) return result;
319
+ if (typeof result === "string" || typeof result === "number") return result;
320
+ return null;
321
+ }
322
+ if (result === void 0 || result === null) return null;
298
323
  if (isValidElement(result)) return result;
299
324
  if (typeof result === "string" || typeof result === "number") return result;
300
- return null;
301
325
  }
302
326
  }
303
- }
304
- const resolver = userResolver !== void 0 ? mergeResolvers(userResolver, headlessResolver) : headlessResolver;
305
- const renderFn = getRenderFunction(tree.type, resolver);
306
- if (renderFn !== void 0) {
307
- let result;
308
- try {
309
- result = renderFn(buildRenderProps(tree, value, onChange, renderChild, path));
310
- } catch (err) {
311
- throw new SchemaRenderError(err instanceof Error ? err.message : `Render function threw for type "${tree.type}"`, tree, tree.type, err);
312
- }
313
- if (result === null || result === void 0) return null;
314
- if (isValidElement(result)) return result;
315
- if (typeof result === "string" || typeof result === "number") return result;
316
- }
317
- if (value === void 0 || value === null) return /* @__PURE__ */ jsx("span", { children: "—" });
318
- return /* @__PURE__ */ jsx("span", { children: typeof value === "string" ? value : JSON.stringify(value) });
327
+ });
319
328
  }
320
329
  /**
321
330
  * Render a single field from a schema by dot-separated `path`.
@@ -1,9 +1,9 @@
1
- import { w as SchemaMeta } from "../types-BrYbjC7_.mjs";
2
- import { t as Diagnostic } from "../diagnostics-BTrm3O6J.mjs";
3
- import { SchemaIoSide } from "../core/adapter.mjs";
4
- import { ComponentResolver, WidgetMap } from "../core/renderer.mjs";
5
- import { RejectUnrepresentableZod } from "../core/typeInference.mjs";
6
- import { a as InferredValue, t as InferFields } from "../inferValue-Ce-PviSD.mjs";
1
+ import { w as SchemaMeta } from "../types-BBQaEPfE.mjs";
2
+ import { t as Diagnostic } from "../diagnostics-mftUZI7c.mjs";
3
+ import { r as SchemaIoSide } from "../adapter-ktQaheWB.mjs";
4
+ import { d as WidgetMap, i as ComponentResolver } from "../renderer-ab9E52Bp.mjs";
5
+ import { f as RejectUnrepresentableZod } from "../typeInference-Y8tNEQJk.mjs";
6
+ import { a as InferredValue, t as InferFields } from "../inferValue-eAnh50EM.mjs";
7
7
  import { ReactNode } from "react";
8
8
 
9
9
  //#region src/react/SchemaView.d.ts
@@ -1,13 +1,13 @@
1
1
  import { toRecordOrUndefined } from "../core/guards.mjs";
2
- import "../core/limits.mjs";
3
- import { SchemaNormalisationError, SchemaRenderError } from "../core/errors.mjs";
2
+ import { SchemaNormalisationError } from "../core/errors.mjs";
4
3
  import { normaliseSchema } from "../core/adapter.mjs";
4
+ import { dispatchRenderField } from "../core/renderField.mjs";
5
5
  import { buildRenderProps, getRenderFunction, mergeResolvers } from "../core/renderer.mjs";
6
6
  import { walk } from "../core/walker.mjs";
7
7
  import { headlessResolver } from "./headless.mjs";
8
8
  import { joinPath, sanitisePrefix } from "./SchemaComponent.mjs";
9
9
  import { jsx } from "react/jsx-runtime";
10
- import { createElement, isValidElement, useId } from "react";
10
+ import { isValidElement, useId } from "react";
11
11
  //#region src/react/SchemaView.tsx
12
12
  /**
13
13
  * React Server Component for read-only schema rendering.
@@ -97,41 +97,44 @@ function SchemaView({ schema: schemaInput, ref: refInput, io, value, fields, met
97
97
  const userResolver = resolver !== void 0 ? mergeResolvers(resolver, headlessResolver) : headlessResolver;
98
98
  const makeRenderChild = (currentDepth, parentPath) => (childTree, childValue, pathSuffix) => {
99
99
  const childPath = joinPath(parentPath, pathSuffix);
100
- if (currentDepth >= 10) return createElement("fieldset", null, createElement("em", null, `\u21bb ${typeof childTree.meta.description === "string" ? childTree.meta.description : "schema"} (recursive)`));
101
- return renderFieldServer(childTree, childValue, userResolver, makeRenderChild(currentDepth + 1, childPath), childPath, widgets);
100
+ return renderFieldServer(childTree, childValue, userResolver, makeRenderChild(currentDepth + 1, childPath), childPath, widgets, currentDepth + 1);
102
101
  };
103
102
  const renderChild = makeRenderChild(0, rootPath);
104
- return renderFieldServer(tree, value ?? tree.defaultValue, userResolver, renderChild, rootPath, widgets);
103
+ return renderFieldServer(tree, value ?? tree.defaultValue, userResolver, renderChild, rootPath, widgets, 0);
105
104
  }
106
- function renderFieldServer(tree, value, resolver, renderChild, path, widgets) {
105
+ function renderFieldServer(tree, value, resolver, renderChild, path, widgets, depth = 0) {
107
106
  if (path.length === 0) throw new Error("renderFieldServer requires a non-empty path. Pass ROOT_PATH at the root and join children via joinPath().");
108
107
  const adaptedRenderChild = (childTree, childValue, _childOnChange, pathSuffix) => renderChild(childTree, childValue, pathSuffix);
109
- const componentHint = tree.meta.component;
110
- if (typeof componentHint === "string") {
111
- const widget = widgets?.get(componentHint);
112
- if (widget !== void 0) {
113
- const result = widget(buildRenderProps(tree, value, void 0, adaptedRenderChild, path));
114
- if (result !== void 0 && result !== null) {
108
+ return dispatchRenderField({
109
+ tree,
110
+ value,
111
+ path,
112
+ depth,
113
+ resolver,
114
+ config: {
115
+ buildProps: (fieldTree, fieldPath) => buildRenderProps(fieldTree, value, void 0, adaptedRenderChild, fieldPath),
116
+ lookupRenderFn: (type, mergedResolver) => getRenderFunction(type, mergedResolver),
117
+ ...widgets !== void 0 ? { lookupWidget: (name) => widgets.get(name) } : {},
118
+ recursionSentinel: (fieldTree) => {
119
+ return /* @__PURE__ */ jsx("fieldset", { children: /* @__PURE__ */ jsx("em", { children: `↻ ${typeof fieldTree.meta.description === "string" ? fieldTree.meta.description : "schema"} (recursive)` }) });
120
+ },
121
+ fallback: (_fieldTree, fieldValue) => {
122
+ if (fieldValue === void 0 || fieldValue === null) return /* @__PURE__ */ jsx("span", { children: "—" });
123
+ return /* @__PURE__ */ jsx("span", { children: typeof fieldValue === "string" ? fieldValue : JSON.stringify(fieldValue) });
124
+ },
125
+ coerceResult: (result, step) => {
126
+ if (step === "widget") {
127
+ if (result === void 0 || result === null) return void 0;
128
+ if (isValidElement(result)) return result;
129
+ if (typeof result === "string" || typeof result === "number") return result;
130
+ return;
131
+ }
132
+ if (result === void 0 || result === null) return void 0;
115
133
  if (isValidElement(result)) return result;
116
134
  if (typeof result === "string" || typeof result === "number") return result;
117
135
  }
118
136
  }
119
- }
120
- const renderFn = getRenderFunction(tree.type, resolver);
121
- if (renderFn !== void 0) {
122
- const props = buildRenderProps(tree, value, void 0, adaptedRenderChild, path);
123
- try {
124
- const result = renderFn(props);
125
- if (result !== void 0 && result !== null) {
126
- if (isValidElement(result)) return result;
127
- if (typeof result === "string" || typeof result === "number") return result;
128
- }
129
- } catch (err) {
130
- throw new SchemaRenderError(err instanceof Error ? err.message : `Render function threw for type "${tree.type}"`, tree, tree.type, err);
131
- }
132
- }
133
- if (value === void 0 || value === null) return /* @__PURE__ */ jsx("span", { children: "—" });
134
- return /* @__PURE__ */ jsx("span", { children: typeof value === "string" ? value : JSON.stringify(value) });
137
+ });
135
138
  }
136
139
  //#endregion
137
140
  export { SchemaView };
@@ -1,5 +1,5 @@
1
- import { j as WalkedField } from "../types-BrYbjC7_.mjs";
2
- import { AllConstraints } from "../core/renderer.mjs";
1
+ import { j as WalkedField } from "../types-BBQaEPfE.mjs";
2
+ import { t as AllConstraints } from "../renderer-ab9E52Bp.mjs";
3
3
 
4
4
  //#region src/react/a11y.d.ts
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { RenderProps } from "../core/renderer.mjs";
1
+ import { u as RenderProps } from "../renderer-ab9E52Bp.mjs";
2
2
  import { ReactNode } from "react";
3
3
 
4
4
  //#region src/react/fieldShell.d.ts
@@ -1,4 +1,4 @@
1
- import { ComponentResolver } from "../core/renderer.mjs";
1
+ import { i as ComponentResolver } from "../renderer-ab9E52Bp.mjs";
2
2
 
3
3
  //#region src/react/headless.d.ts
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { j as WalkedField } from "../types-BrYbjC7_.mjs";
2
- import { RenderProps } from "../core/renderer.mjs";
1
+ import { j as WalkedField } from "../types-BBQaEPfE.mjs";
2
+ import { u as RenderProps } from "../renderer-ab9E52Bp.mjs";
3
3
  import { ReactNode } from "react";
4
4
 
5
5
  //#region src/react/headlessRenderers.d.ts
@@ -1,4 +1,4 @@
1
- import { i as DiagnosticsOptions } from "./diagnostics-BTrm3O6J.mjs";
1
+ import { i as DiagnosticsOptions } from "./diagnostics-mftUZI7c.mjs";
2
2
 
3
3
  //#region src/core/ref.d.ts
4
4
  /**
@@ -0,0 +1,245 @@
1
+ import { E as StringConstraints, f as FileConstraints, j as WalkedField, t as ArrayConstraints, w as SchemaMeta, x as ObjectConstraints, y as NumberConstraints } from "./types-BBQaEPfE.mjs";
2
+
3
+ //#region src/core/renderer.d.ts
4
+ /**
5
+ * Flat intersection of all constraint types.
6
+ * Used in renderer props where the render function receives the union
7
+ * but knows (by resolver key) which subset applies.
8
+ *
9
+ * The walker's discriminated WalkedField enforces type-correct constraints
10
+ * at construction time; the renderer consumes them as this flat type.
11
+ */
12
+ type AllConstraints = StringConstraints & NumberConstraints & ArrayConstraints & ObjectConstraints & FileConstraints;
13
+ /**
14
+ * Properties available on every schema field, regardless of rendering target.
15
+ * Both React and HTML renderers receive these.
16
+ *
17
+ * Per-type schema data — enum values, object fields, array element schema,
18
+ * union options, record key/value types, tuple `prefixItems`, conditional
19
+ * if/then/else clauses, negation `negated`, recursive `refTarget`, literal
20
+ * values — lives on the discriminated `tree`. Renderers narrow on
21
+ * `tree.type` and read from the matching variant; there are no duplicate
22
+ * sibling fields on these props.
23
+ */
24
+ interface BaseFieldProps {
25
+ /** Current field value. */
26
+ value: unknown;
27
+ /** Whether to render as read-only display. */
28
+ readOnly: boolean;
29
+ /** Whether to render as an empty input. */
30
+ writeOnly: boolean;
31
+ /** Schema metadata for this field. */
32
+ meta: SchemaMeta;
33
+ /** Constraints from schema checks. */
34
+ constraints: AllConstraints;
35
+ /** Dot-separated path from root (e.g. "address.city"). */
36
+ path: string;
37
+ /** Example values from the schema's `examples` keyword. */
38
+ examples?: unknown[];
39
+ /** Walked field tree for recursive rendering. */
40
+ tree: WalkedField;
41
+ }
42
+ /**
43
+ * Framework-agnostic base for the props passed to every render
44
+ * function. Extends {@link BaseFieldProps} with a `renderChild`
45
+ * callable whose return type is parameterised over `Output` — the type
46
+ * the framework adapter emits per field (typically `unknown` /
47
+ * `ReactNode` for React, `string` for HTML, framework-specific for
48
+ * future Vue / Solid / Svelte / Lit adapters).
49
+ *
50
+ * The base `renderChild` is declared with a `...args: never[]` rest
51
+ * parameter so derived adapter interfaces can override it with a
52
+ * richer signature carrying extra required arguments (React's
53
+ * `onChange`, HTML's `pathSuffix`, etc.). The `never[]` rest makes the
54
+ * base callable signature the bottom of the function-subtype lattice:
55
+ * every adapter's concrete `renderChild` is assignable to it because
56
+ * `never` accepts any parameter type contravariantly. The base
57
+ * therefore documents the shared shape — "given a `WalkedField` and a
58
+ * value, produce an `Output`" — without preventing adapters from
59
+ * adding required parameters.
60
+ *
61
+ * @typeParam Output - The type the framework adapter emits per field
62
+ * (e.g. `ReactNode` / `unknown` for React, `string` for HTML).
63
+ */
64
+ interface BaseRenderProps<Output = unknown> extends BaseFieldProps {
65
+ /**
66
+ * Render a child field. Theme adapters call this to recursively
67
+ * render nested structures (object fields, array elements, union
68
+ * options). Each adapter narrows the signature in its specialised
69
+ * variant ({@link RenderProps}, {@link HtmlRenderProps}, …) to
70
+ * match its native rendering primitives.
71
+ */
72
+ renderChild: (...args: never[]) => Output;
73
+ }
74
+ /**
75
+ * Props for React render functions. Extends {@link BaseRenderProps} with:
76
+ * - `onChange` — callback to propagate value changes back to state
77
+ * - `renderChild` — recursively renders a child field, threading
78
+ * `onChange` through the four-argument React signature
79
+ */
80
+ interface RenderProps extends BaseRenderProps {
81
+ /** Callback to update the field value. */
82
+ onChange: (value: unknown) => void;
83
+ /**
84
+ * Render a child field. Theme adapters call this to recursively render
85
+ * nested structures (object fields, array elements, union options).
86
+ * The resolver and rendering context are already wired in.
87
+ *
88
+ * @param tree - The walked field tree for the child
89
+ * @param value - The child's current value
90
+ * @param onChange - Callback receiving the child's next value
91
+ * @param pathSuffix - Path segment from the parent (e.g. "city",
92
+ * "[0]"). Joined to the parent's path with a dot, or substituted
93
+ * when the parent acts as a transparent wrapper (union options).
94
+ * Required for every container — without it children inherit no
95
+ * path and `inputId()` will throw.
96
+ */
97
+ renderChild: (tree: WalkedField, value: unknown, onChange: (v: unknown) => void, pathSuffix?: string) => unknown;
98
+ }
99
+ /**
100
+ * Props for HTML render functions. Extends {@link BaseRenderProps} with
101
+ * a narrower three-argument `renderChild` and no `onChange` — HTML
102
+ * rendering is pure output with no event handling.
103
+ */
104
+ interface HtmlRenderProps extends BaseRenderProps<string> {
105
+ /**
106
+ * Render a child field to an HTML string. Theme adapters call this
107
+ * to recursively render nested structures.
108
+ *
109
+ * @param tree - The walked field tree for the child
110
+ * @param value - The child's current value
111
+ * @param pathSuffix - Path segment from the parent (e.g. "city",
112
+ * "[0]"). When omitted, the child's description is used as fallback.
113
+ */
114
+ renderChild: (tree: WalkedField, value: unknown, pathSuffix?: string) => string;
115
+ }
116
+ /**
117
+ * Build the `RenderProps` object handed to a resolver render function or a
118
+ * widget. Used by both the server-side `<SchemaView>` (which has no
119
+ * `onChange`) and the client-side `<SchemaComponent>` (which threads an
120
+ * `onChange` callback).
121
+ *
122
+ * When `onChange` is `undefined` the caller is rendering in read-only mode:
123
+ * a noop `onChange` is wired up, `readOnly` is forced to `true`, and
124
+ * `writeOnly` is forced to `false`. Otherwise the editability is taken
125
+ * from `tree.editability`.
126
+ */
127
+ declare function buildRenderProps(tree: WalkedField, value: unknown, onChange: ((next: unknown) => void) | undefined, renderChild: RenderProps["renderChild"], path: string): RenderProps;
128
+ /**
129
+ * Generic render-function signature parameterised over the output type
130
+ * (`Output`) and the per-framework props shape (`Props`).
131
+ *
132
+ * The React adapter uses {@link RenderProps} with `unknown` output — see
133
+ * the default specialisation below — and the HTML adapter uses
134
+ * {@link HtmlRenderFunction} (an alias for
135
+ * `RenderFunction\<string, HtmlRenderProps\>`). Future framework
136
+ * adapters (Vue, Solid, Svelte, Lit) pick their own pairing.
137
+ *
138
+ * The default `Output = unknown, Props = RenderProps` keeps the historic
139
+ * React-flavoured signature compatible — any caller writing
140
+ * `RenderFunction` without type arguments gets exactly the previous
141
+ * `(props: RenderProps) =\> unknown` shape.
142
+ */
143
+ type RenderFunction<Output = unknown, Props = RenderProps> = (props: Props) => Output;
144
+ /**
145
+ * Widget map — maps component hints (from `.meta({ component })`) to render
146
+ * functions. A per-render bag consumed by every renderer surface that
147
+ * dispatches widget overrides; conceptually parallel to
148
+ * {@link ComponentResolver} but keyed by user-supplied hint names rather
149
+ * than schema types.
150
+ *
151
+ * Scoped at three levels in the React renderer:
152
+ *
153
+ * 1. **Per-instance** — `widgets` prop on `<SchemaComponent>`
154
+ * 2. **Context-scoped** — `widgets` prop on `<SchemaProvider>`
155
+ * 3. **Global** — `registerWidget()` (app-wide defaults)
156
+ *
157
+ * Resolution order: instance → context → global → resolver → headless.
158
+ */
159
+ type WidgetMap = ReadonlyMap<string, RenderFunction>;
160
+ /**
161
+ * Theme adapter — maps every schema field type to its React renderer.
162
+ * Unset keys fall back to the headless resolver. Pass to
163
+ * `SchemaProvider` (or `SchemaView.resolver`) to drive every
164
+ * schema-driven render with a specific theme.
165
+ */
166
+ interface ComponentResolver {
167
+ string?: RenderFunction;
168
+ number?: RenderFunction;
169
+ boolean?: RenderFunction;
170
+ null?: RenderFunction;
171
+ enum?: RenderFunction;
172
+ object?: RenderFunction;
173
+ array?: RenderFunction;
174
+ tuple?: RenderFunction;
175
+ record?: RenderFunction;
176
+ union?: RenderFunction;
177
+ discriminatedUnion?: RenderFunction;
178
+ conditional?: RenderFunction;
179
+ negation?: RenderFunction;
180
+ literal?: RenderFunction;
181
+ file?: RenderFunction;
182
+ never?: RenderFunction;
183
+ unknown?: RenderFunction;
184
+ }
185
+ /**
186
+ * An HTML render function returns a string. Specialisation of the
187
+ * generic {@link RenderFunction} signature with `Output = string` and
188
+ * `Props = HtmlRenderProps`.
189
+ */
190
+ type HtmlRenderFunction = RenderFunction<string, HtmlRenderProps>;
191
+ /**
192
+ * HTML resolver — maps schema types to HTML string renderers.
193
+ * Structurally mirrors ComponentResolver but produces strings.
194
+ */
195
+ interface HtmlResolver {
196
+ string?: HtmlRenderFunction;
197
+ number?: HtmlRenderFunction;
198
+ boolean?: HtmlRenderFunction;
199
+ null?: HtmlRenderFunction;
200
+ enum?: HtmlRenderFunction;
201
+ object?: HtmlRenderFunction;
202
+ array?: HtmlRenderFunction;
203
+ tuple?: HtmlRenderFunction;
204
+ record?: HtmlRenderFunction;
205
+ union?: HtmlRenderFunction;
206
+ discriminatedUnion?: HtmlRenderFunction;
207
+ conditional?: HtmlRenderFunction;
208
+ negation?: HtmlRenderFunction;
209
+ literal?: HtmlRenderFunction;
210
+ file?: HtmlRenderFunction;
211
+ never?: HtmlRenderFunction;
212
+ unknown?: HtmlRenderFunction;
213
+ }
214
+ /**
215
+ * Canonical list of resolver keys, one per {@link WalkedField} variant.
216
+ * Iterated by the resolver merge helpers so adding a new key here is the
217
+ * single point of change when a new field variant is introduced.
218
+ */
219
+ declare const RESOLVER_KEYS: readonly ["string", "number", "boolean", "null", "enum", "object", "array", "tuple", "record", "union", "discriminatedUnion", "conditional", "negation", "literal", "file", "never", "unknown"];
220
+ type ResolverKey = (typeof RESOLVER_KEYS)[number];
221
+ /**
222
+ * Map a schema type to the resolver key that handles it.
223
+ * Every WalkedField variant has a direct resolver key — exhaustive switch
224
+ * ensures new variants surface as a type error rather than silently
225
+ * falling through to "unknown".
226
+ */
227
+ declare function typeToKey(type: WalkedField["type"]): ResolverKey;
228
+ /**
229
+ * Look up the render function for a schema type in a ComponentResolver.
230
+ */
231
+ declare function getRenderFunction(type: WalkedField["type"], resolver: ComponentResolver): RenderFunction | undefined;
232
+ /**
233
+ * Look up the render function for a schema type in an HtmlResolver.
234
+ */
235
+ declare function getHtmlRenderFn(type: WalkedField["type"], resolver: HtmlResolver): HtmlRenderFunction | undefined;
236
+ /**
237
+ * Merge two ComponentResolvers — user values take priority, fallback fills gaps.
238
+ */
239
+ declare function mergeResolvers(user: ComponentResolver, fallback: ComponentResolver): ComponentResolver;
240
+ /**
241
+ * Merge two HtmlResolvers — user values take priority, fallback fills gaps.
242
+ */
243
+ declare function mergeHtmlResolvers(user: HtmlResolver, fallback: HtmlResolver): HtmlResolver;
244
+ //#endregion
245
+ export { typeToKey as _, HtmlRenderFunction as a, RESOLVER_KEYS as c, WidgetMap as d, buildRenderProps as f, mergeResolvers as g, mergeHtmlResolvers as h, ComponentResolver as i, RenderFunction as l, getRenderFunction as m, BaseFieldProps as n, HtmlRenderProps as o, getHtmlRenderFn as p, BaseRenderProps as r, HtmlResolver as s, AllConstraints as t, RenderProps as u };
@@ -0,0 +1,136 @@
1
+ import { j as WalkedField, w as SchemaMeta } from "../types-BBQaEPfE.mjs";
2
+ import { t as Diagnostic } from "../diagnostics-mftUZI7c.mjs";
3
+ import { r as SchemaIoSide } from "../adapter-ktQaheWB.mjs";
4
+ import { t as SchemaError } from "../errors-DbaI04x2.mjs";
5
+ import { f as RejectUnrepresentableZod } from "../typeInference-Y8tNEQJk.mjs";
6
+ import { a as InferredValue, i as InferredOutputValue, n as InferSchemaValue, r as InferredInputValue, t as InferFields } from "../inferValue-eAnh50EM.mjs";
7
+ import { SolidComponentResolver, SolidWidgetMap } from "./types.mjs";
8
+ import { JSX } from "solid-js";
9
+
10
+ //#region src/solid/SchemaComponent.d.ts
11
+ /**
12
+ * Provide a theme resolver and scoped widgets to every
13
+ * `<SchemaComponent>` rendered inside the subtree.
14
+ *
15
+ * Wrap an application (or a region of it) with `<SchemaProvider>` so a
16
+ * single resolver — typically a custom Solid `SolidComponentResolver`
17
+ * — drives every schema render. Without a provider the headless
18
+ * resolver is used.
19
+ *
20
+ * @group Components
21
+ * @example
22
+ * ```tsx
23
+ * import { SchemaProvider, SchemaComponent } from "schema-components/solid/SchemaComponent";
24
+ *
25
+ * <SchemaProvider resolver={customResolver}>
26
+ * <SchemaComponent schema={userSchema} value={user} onChange={setUser} />
27
+ * </SchemaProvider>
28
+ * ```
29
+ */
30
+ declare function SchemaProvider(props: {
31
+ resolver: SolidComponentResolver;
32
+ widgets?: SolidWidgetMap;
33
+ children: JSX.Element;
34
+ }): JSX.Element;
35
+ /**
36
+ * Props accepted by {@link SchemaComponent}.
37
+ *
38
+ * Mirrors `react/SchemaComponent`'s `SchemaComponentProps` shape — the
39
+ * generic parameters carry the inferred schema shape through to
40
+ * `value`, `onChange`, and `fields` so a typed `schema` prop drives
41
+ * typed props on the rest of the component.
42
+ *
43
+ * @group Components
44
+ */
45
+ interface SchemaComponentProps<T = unknown, Ref extends string | undefined = undefined, Mode extends SchemaIoSide = "output"> {
46
+ /** Zod schema, JSON Schema object, or OpenAPI document. */
47
+ schema: RejectUnrepresentableZod<T>;
48
+ /** For OpenAPI: a ref string like `"#/components/schemas/User"`. */
49
+ ref?: Ref;
50
+ /** Which side of every transform / pipe / codec to render. */
51
+ io?: Mode;
52
+ /** Current value to render — typed against the schema's inferred shape. */
53
+ value?: InferSchemaValue<T, Ref, Mode>;
54
+ /** Called when the value changes; receives the next value. */
55
+ onChange?: (value: InferSchemaValue<T, Ref, Mode>) => void;
56
+ /** Run `safeParse` / `safeEncode` on change and route errors. */
57
+ validate?: boolean;
58
+ /** Called with the validation error when validation fails. */
59
+ onValidationError?: (error: unknown) => void;
60
+ /** Called when schema normalisation or rendering fails. */
61
+ onError?: (error: SchemaError) => void;
62
+ /** Called with each diagnostic emitted during schema processing. */
63
+ onDiagnostic?: (diagnostic: Diagnostic) => void;
64
+ /** When true, any diagnostic becomes a thrown error. */
65
+ strict?: boolean;
66
+ /** Per-field meta overrides — nested object mirroring schema shape. */
67
+ fields?: InferFields<T, Ref>;
68
+ /** Meta overrides applied to the root schema. */
69
+ meta?: SchemaMeta;
70
+ /** Convenience: sets readOnly on all fields. */
71
+ readOnly?: boolean;
72
+ /** Convenience: sets writeOnly on all fields. */
73
+ writeOnly?: boolean;
74
+ /** Convenience: sets description on the root. */
75
+ description?: string;
76
+ /** Instance-scoped widgets — override context and global widgets. */
77
+ widgets?: SolidWidgetMap;
78
+ /**
79
+ * Prefix used for every input `id` / label `for` in this component
80
+ * subtree. Defaults to a per-instance value from `createUniqueId()`
81
+ * so multiple `<SchemaComponent>` instances on the same page never
82
+ * collide. Override for deterministic ids in screenshot tests.
83
+ */
84
+ idPrefix?: string;
85
+ }
86
+ /**
87
+ * Append a child path suffix to a parent path. When the suffix is
88
+ * omitted (e.g. transparent wrappers like union options) the parent
89
+ * path is returned unchanged so the child inherits the parent's id.
90
+ *
91
+ * Bracketed array indices like `"[0]"` append directly so `tags` +
92
+ * `"[0]"` becomes `tags[0]` rather than `tags.[0]` — matching the
93
+ * canonical form used by every shared id helper in `core/idPath.ts`.
94
+ */
95
+ declare function joinPath(parent: string, suffix: string | undefined): string;
96
+ /**
97
+ * Normalise a `createUniqueId()` value into a DOM-id-safe prefix.
98
+ * Solid's `createUniqueId()` already returns a usable id, but consumers
99
+ * may also pass a label-derived string. Replace any run of
100
+ * non-alphanumeric characters with a single hyphen and trim leading
101
+ * and trailing hyphens.
102
+ */
103
+ declare function sanitisePrefix(value: string): string;
104
+ /**
105
+ * Render a single walked field through the resolved widget / resolver /
106
+ * headless pipeline. Used internally by {@link SchemaComponent} and
107
+ * exported so other Solid-side components (e.g. theme adapters) can
108
+ * dispatch into the same fallback chain.
109
+ */
110
+ declare function renderField(tree: WalkedField, value: unknown, onChange: (v: unknown) => void, userResolver: SolidComponentResolver | undefined, renderChild: (tree: WalkedField, value: unknown, onChange: (v: unknown) => void, pathSuffix?: string) => JSX.Element, path: string, instanceWidgets?: SolidWidgetMap, contextWidgets?: SolidWidgetMap, depth?: number): JSX.Element;
111
+ /**
112
+ * Render an editable (or read-only) UI from a Zod schema, JSON Schema,
113
+ * or OpenAPI document.
114
+ *
115
+ * Auto-detects the input format, normalises to JSON Schema via the
116
+ * shared adapter, walks the JSON Schema tree, and delegates per-field
117
+ * rendering to the {@link SolidComponentResolver} supplied via
118
+ * {@link SchemaProvider} — falling back to the headless renderer when
119
+ * no provider is present.
120
+ *
121
+ * Pass `readOnly` to render a presentational view instead of inputs.
122
+ *
123
+ * @group Components
124
+ * @example
125
+ * ```tsx
126
+ * import { z } from "zod";
127
+ * import { SchemaComponent } from "schema-components/solid/SchemaComponent";
128
+ *
129
+ * const userSchema = z.object({ name: z.string(), email: z.email() });
130
+ *
131
+ * <SchemaComponent schema={userSchema} value={user} onChange={setUser} />
132
+ * ```
133
+ */
134
+ declare function SchemaComponent<T = unknown, Ref extends string | undefined = undefined, Mode extends SchemaIoSide = "output">(props: SchemaComponentProps<T, Ref, Mode>): JSX.Element;
135
+ //#endregion
136
+ export { type InferFields, type InferredInputValue, type InferredOutputValue, type InferredValue, SchemaComponent, SchemaComponentProps, SchemaProvider, joinPath, renderField, sanitisePrefix };