schema-components 2.0.1 → 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.
- package/README.md +98 -1
- package/dist/SchemaComponent-B__6-5-E.d.mts +277 -0
- package/dist/SchemaComponent-BxzzsHsK.mjs +668 -0
- package/dist/adapter-ktQaheWB.d.mts +213 -0
- package/dist/constructorTypes-BdCiMS6e.d.mts +30 -0
- package/dist/core/adapter.d.mts +3 -213
- package/dist/core/adapter.mjs +33 -25
- package/dist/core/constraintHint.d.mts +1 -1
- package/dist/core/constraints.d.mts +2 -2
- package/dist/core/contexts.d.mts +71 -0
- package/dist/core/contexts.mjs +1 -0
- package/dist/core/diagnostics.d.mts +1 -1
- package/dist/core/errors.d.mts +1 -1
- package/dist/core/fieldOrder.d.mts +1 -1
- package/dist/{react → core}/fieldPath.d.mts +2 -2
- package/dist/{react → core}/fieldPath.mjs +3 -3
- package/dist/core/formats.d.mts +1 -1
- package/dist/core/guards.d.mts +2 -2
- package/dist/core/guards.mjs +2 -2
- package/dist/core/inferValue.d.mts +1 -1
- package/dist/core/limits.d.mts +1 -1
- package/dist/core/merge.d.mts +1 -1
- package/dist/core/normalise.d.mts +6 -6
- package/dist/core/normalise.mjs +1 -1
- package/dist/core/openapi30.d.mts +1 -1
- package/dist/core/openapi30.mjs +1 -1
- package/dist/core/ref.d.mts +1 -1
- package/dist/core/renderField.d.mts +147 -0
- package/dist/core/renderField.mjs +81 -0
- package/dist/core/renderer.d.mts +2 -199
- package/dist/core/swagger2.d.mts +1 -1
- package/dist/core/swagger2.mjs +1 -1
- package/dist/core/typeInference.d.mts +1 -981
- package/dist/core/types.d.mts +1 -1
- package/dist/core/unionMatch.d.mts +1 -1
- package/dist/core/uri.d.mts +2 -2
- package/dist/core/uri.mjs +2 -2
- package/dist/core/version.d.mts +1 -1
- package/dist/core/walkBuilders.d.mts +4 -4
- package/dist/core/walkBuilders.mjs +1 -1
- package/dist/core/walker.d.mts +1 -1
- package/dist/core/walker.mjs +3 -3
- package/dist/{errors-Dki7tji4.d.mts → errors-DbaI04x2.d.mts} +1 -1
- package/dist/html/a11y.d.mts +2 -2
- package/dist/html/html.d.mts +10 -8
- package/dist/html/renderToHtml.d.mts +5 -5
- package/dist/html/renderToHtml.mjs +45 -24
- package/dist/html/renderToHtmlStream.d.mts +5 -5
- package/dist/html/renderers.d.mts +1 -1
- package/dist/html/streamRenderers.d.mts +3 -3
- package/dist/{inferValue-PPXWJpbN.d.mts → inferValue-eAnh50EM.d.mts} +6 -6
- package/dist/lit/SchemaComponent.d.mts +125 -0
- package/dist/lit/SchemaComponent.mjs +2 -0
- package/dist/lit/SchemaField.d.mts +65 -0
- package/dist/lit/SchemaField.mjs +2 -0
- package/dist/lit/SchemaView.d.mts +14 -0
- package/dist/lit/SchemaView.mjs +2 -0
- package/dist/lit/constructorTypes.d.mts +2 -0
- package/dist/lit/constructorTypes.mjs +1 -0
- package/dist/lit/contexts.d.mts +78 -0
- package/dist/lit/contexts.mjs +238 -0
- package/dist/lit/defaultResolver.d.mts +33 -0
- package/dist/lit/defaultResolver.mjs +2 -0
- package/dist/lit/registry.d.mts +66 -0
- package/dist/lit/registry.mjs +2 -0
- package/dist/lit/renderers/baseElement.d.mts +131 -0
- package/dist/lit/renderers/baseElement.mjs +109 -0
- package/dist/lit/renderers/recordHelpers.d.mts +25 -0
- package/dist/lit/renderers/recordHelpers.mjs +55 -0
- package/dist/lit/renderers/scArray.d.mts +14 -0
- package/dist/lit/renderers/scArray.mjs +86 -0
- package/dist/lit/renderers/scBoolean.d.mts +15 -0
- package/dist/lit/renderers/scBoolean.mjs +47 -0
- package/dist/lit/renderers/scConditional.d.mts +23 -0
- package/dist/lit/renderers/scConditional.mjs +65 -0
- package/dist/lit/renderers/scDiscriminated.d.mts +23 -0
- package/dist/lit/renderers/scDiscriminated.mjs +138 -0
- package/dist/lit/renderers/scEnum.d.mts +16 -0
- package/dist/lit/renderers/scEnum.mjs +66 -0
- package/dist/lit/renderers/scFile.d.mts +15 -0
- package/dist/lit/renderers/scFile.mjs +53 -0
- package/dist/lit/renderers/scLiteralNullNever.d.mts +30 -0
- package/dist/lit/renderers/scLiteralNullNever.mjs +57 -0
- package/dist/lit/renderers/scNumber.d.mts +15 -0
- package/dist/lit/renderers/scNumber.mjs +64 -0
- package/dist/lit/renderers/scObject.d.mts +14 -0
- package/dist/lit/renderers/scObject.mjs +57 -0
- package/dist/lit/renderers/scRecord.d.mts +14 -0
- package/dist/lit/renderers/scRecord.mjs +112 -0
- package/dist/lit/renderers/scString.d.mts +19 -0
- package/dist/lit/renderers/scString.mjs +165 -0
- package/dist/lit/renderers/scTuple.d.mts +14 -0
- package/dist/lit/renderers/scTuple.mjs +58 -0
- package/dist/lit/renderers/scUnion.d.mts +14 -0
- package/dist/lit/renderers/scUnion.mjs +44 -0
- package/dist/lit/renderers/scUnknown.d.mts +15 -0
- package/dist/lit/renderers/scUnknown.mjs +45 -0
- package/dist/lit/ssr.d.mts +37 -0
- package/dist/lit/ssr.mjs +9565 -0
- package/dist/lit/types.d.mts +2 -0
- package/dist/lit/types.mjs +1 -0
- package/dist/lit/widget.d.mts +71 -0
- package/dist/lit/widget.mjs +87 -0
- package/dist/{normalise-DB-Xtjmn.mjs → normalise-BkePrJ4v.mjs} +6 -6
- package/dist/openapi/ApiCallbacks.d.mts +1 -1
- package/dist/openapi/ApiLinks.d.mts +1 -1
- package/dist/openapi/ApiResponseHeaders.d.mts +1 -1
- package/dist/openapi/ApiSecurity.d.mts +1 -1
- package/dist/openapi/components.d.mts +5 -5
- package/dist/openapi/components.mjs +1 -1
- package/dist/openapi/parser.d.mts +2 -2
- package/dist/openapi/resolve.d.mts +1 -1
- package/dist/openapi/resolve.mjs +1 -1
- package/dist/preact/SchemaComponent.d.mts +3 -0
- package/dist/preact/SchemaComponent.mjs +26 -0
- package/dist/preact/SchemaErrorBoundary.d.mts +2 -0
- package/dist/preact/SchemaErrorBoundary.mjs +20 -0
- package/dist/preact/SchemaView.d.mts +2 -0
- package/dist/preact/SchemaView.mjs +22 -0
- package/dist/preact/headless.d.mts +2 -0
- package/dist/preact/headless.mjs +18 -0
- package/dist/react/SchemaComponent.d.mts +3 -270
- package/dist/react/SchemaComponent.mjs +48 -39
- package/dist/react/SchemaErrorBoundary.mjs +7 -4
- package/dist/react/SchemaView.d.mts +11 -10
- package/dist/react/SchemaView.mjs +32 -29
- package/dist/react/a11y.d.mts +2 -2
- package/dist/react/fieldShell.d.mts +1 -1
- package/dist/react/headless.d.mts +1 -1
- package/dist/react/headlessRenderers.d.mts +2 -2
- package/dist/{ref-DdsbekXX.d.mts → ref-DWrQG1Er.d.mts} +1 -1
- package/dist/renderer-ab9E52Bp.d.mts +245 -0
- package/dist/solid/SchemaComponent.d.mts +136 -0
- package/dist/solid/SchemaComponent.mjs +391 -0
- package/dist/solid/SchemaErrorBoundary.d.mts +38 -0
- package/dist/solid/SchemaErrorBoundary.mjs +57 -0
- package/dist/solid/SchemaField.d.mts +40 -0
- package/dist/solid/SchemaField.mjs +113 -0
- package/dist/solid/SchemaView.d.mts +54 -0
- package/dist/solid/SchemaView.mjs +168 -0
- package/dist/solid/a11y.d.mts +70 -0
- package/dist/solid/a11y.mjs +71 -0
- package/dist/solid/contexts.d.mts +37 -0
- package/dist/solid/contexts.mjs +66 -0
- package/dist/solid/headless.d.mts +10 -0
- package/dist/solid/headless.mjs +27 -0
- package/dist/solid/renderers.d.mts +79 -0
- package/dist/solid/renderers.mjs +840 -0
- package/dist/solid/types.d.mts +90 -0
- package/dist/solid/types.mjs +1 -0
- package/dist/solid/widget.d.mts +29 -0
- package/dist/solid/widget.mjs +35 -0
- package/dist/themes/mantine.d.mts +1 -1
- package/dist/themes/mui.d.mts +1 -1
- package/dist/themes/radix.d.mts +1 -1
- package/dist/themes/shadcn.d.mts +1 -1
- package/dist/typeInference-Y8tNEQJk.d.mts +983 -0
- package/dist/types-BCy7K3nk.d.mts +125 -0
- package/package.json +71 -1
- package/src/svelte/SchemaComponent.svelte +427 -0
- package/src/svelte/SchemaErrorBoundary.svelte +66 -0
- package/src/svelte/SchemaField.svelte +216 -0
- package/src/svelte/SchemaProvider.svelte +46 -0
- package/src/svelte/SchemaView.svelte +244 -0
- package/src/svelte/a11y.ts +112 -0
- package/src/svelte/contexts.ts +79 -0
- package/src/svelte/dispatch.ts +267 -0
- package/src/svelte/headless.ts +73 -0
- package/src/svelte/headlessFns.ts +124 -0
- package/src/svelte/renderers/Array.svelte +98 -0
- package/src/svelte/renderers/Boolean.svelte +43 -0
- package/src/svelte/renderers/Conditional.svelte +67 -0
- package/src/svelte/renderers/DiscriminatedUnion.svelte +197 -0
- package/src/svelte/renderers/Enum.svelte +53 -0
- package/src/svelte/renderers/Fallback.svelte +24 -0
- package/src/svelte/renderers/File.svelte +46 -0
- package/src/svelte/renderers/Literal.svelte +29 -0
- package/src/svelte/renderers/Mount.svelte +24 -0
- package/src/svelte/renderers/Negation.svelte +35 -0
- package/src/svelte/renderers/Never.svelte +24 -0
- package/src/svelte/renderers/Null.svelte +19 -0
- package/src/svelte/renderers/Number.svelte +68 -0
- package/src/svelte/renderers/Object.svelte +74 -0
- package/src/svelte/renderers/Record.svelte +134 -0
- package/src/svelte/renderers/RecursionSentinel.svelte +27 -0
- package/src/svelte/renderers/String.svelte +152 -0
- package/src/svelte/renderers/Tuple.svelte +84 -0
- package/src/svelte/renderers/Union.svelte +49 -0
- package/src/svelte/renderers/Unknown.svelte +42 -0
- package/src/svelte/svelte-modules.d.ts +25 -0
- package/src/svelte/types.ts +238 -0
- package/src/svelte/widget.ts +62 -0
- /package/dist/{diagnostics-BTrm3O6J.d.mts → diagnostics-mftUZI7c.d.mts} +0 -0
- /package/dist/{limits-x4OiyJxh.d.mts → limits-Vv9hUbI_.d.mts} +0 -0
- /package/dist/{types-BrYbjC7_.d.mts → types-BBQaEPfE.d.mts} +0 -0
- /package/dist/{version-DL8U5RuA.d.mts → version-BEBx10ND.d.mts} +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte 5 adapter type surface for schema-components.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the shape of `core/renderer.ts`'s React-flavoured
|
|
5
|
+
* {@link "../core/renderer.ts".RenderProps} but adapts it for Svelte's
|
|
6
|
+
* compile-time component model: renderers are not plain functions
|
|
7
|
+
* returning VNodes — they are component constructors. The dispatcher
|
|
8
|
+
* therefore packages each "render this field" call as a
|
|
9
|
+
* {@link SvelteRenderDescriptor} pairing the component with the props
|
|
10
|
+
* it should be instantiated against; downstream the active container
|
|
11
|
+
* component (e.g. `Object.svelte`) materialises the descriptor via
|
|
12
|
+
* `<svelte:component this={component} {...props} />`.
|
|
13
|
+
*
|
|
14
|
+
* The shapes intentionally diverge from the React adapter on two axes:
|
|
15
|
+
*
|
|
16
|
+
* 1. `renderChild` returns a {@link SvelteRenderDescriptor} rather
|
|
17
|
+
* than a `ReactNode`. Svelte cannot directly embed an object
|
|
18
|
+
* synthesised at render time the way React embeds a JSX node — but
|
|
19
|
+
* it can `<svelte:component>` a `{ component, props }` pair.
|
|
20
|
+
* 2. There is no synthetic event system, so `onChange` is plumbed
|
|
21
|
+
* directly into the per-field props and invoked from raw DOM
|
|
22
|
+
* handlers (`onchange`, `oninput`) inside each `.svelte` file.
|
|
23
|
+
*
|
|
24
|
+
* The public consumer pattern is `<SchemaComponent schema value onChange?\>` —
|
|
25
|
+
* Svelte's `bind:value` ergonomics are deliberately not forced.
|
|
26
|
+
* The function-style `onChange` callback was chosen so the
|
|
27
|
+
* adapter behaves identically across server-rendered (`SchemaView`),
|
|
28
|
+
* controlled-input, and uncontrolled-input call sites; consumers that
|
|
29
|
+
* prefer `bind:value` can wire it externally:
|
|
30
|
+
*
|
|
31
|
+
* ```svelte
|
|
32
|
+
* <SchemaComponent {schema} bind:value />
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* which Svelte transparently translates into an `onChange` that mutates
|
|
36
|
+
* the bound rune-backed reference.
|
|
37
|
+
*
|
|
38
|
+
* @group Framework Adapters
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import type { Component } from "svelte";
|
|
42
|
+
import type {
|
|
43
|
+
BaseFieldProps,
|
|
44
|
+
BaseRenderProps,
|
|
45
|
+
RenderFunction,
|
|
46
|
+
} from "../core/renderer.ts";
|
|
47
|
+
import type { WalkedField } from "../core/types.ts";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Descriptor produced by {@link SvelteRenderProps.renderChild} and by
|
|
51
|
+
* the dispatcher when materialising a single field. Pairs the Svelte
|
|
52
|
+
* component constructor with the props it should be instantiated
|
|
53
|
+
* against so a parent renderer can mount it via
|
|
54
|
+
* `<svelte:component this={component} {...props} />`.
|
|
55
|
+
*
|
|
56
|
+
* Returning a descriptor (rather than a rendered DOM node) keeps the
|
|
57
|
+
* adapter compatible with Svelte's compile-time component model — the
|
|
58
|
+
* dispatcher does not own a DOM mount point and cannot fabricate
|
|
59
|
+
* rendered output the way React's `renderField` returns a `ReactNode`.
|
|
60
|
+
*
|
|
61
|
+
* `null` indicates "render nothing" — used for empty arrays in
|
|
62
|
+
* read-only mode and for the recursion-cap sentinel placeholder when
|
|
63
|
+
* the caller opts to suppress it.
|
|
64
|
+
*/
|
|
65
|
+
export interface SvelteRenderDescriptor {
|
|
66
|
+
/** Svelte component constructor to mount. */
|
|
67
|
+
readonly component: SvelteComponentConstructor;
|
|
68
|
+
/** Props to pass to the component instance. */
|
|
69
|
+
readonly props: SvelteRenderProps;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The raw Svelte 5 component constructor type. Aliased so consumers
|
|
74
|
+
* have a single name to import — `Component<SvelteRenderProps>` is
|
|
75
|
+
* exact, but reading {@link SvelteComponentConstructor} at call sites
|
|
76
|
+
* keeps the framework dependency localised to this module.
|
|
77
|
+
*/
|
|
78
|
+
export type SvelteComponentConstructor = Component<SvelteRenderProps>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Props passed to every Svelte 5 renderer component.
|
|
82
|
+
*
|
|
83
|
+
* Specialisation of {@link BaseRenderProps} with
|
|
84
|
+
* `Output = SvelteRenderDescriptor | null`. Each renderer receives
|
|
85
|
+
* these as `$props()` — the per-field data, the editability flags,
|
|
86
|
+
* the constraint bundle, and the `renderChild` factory it should
|
|
87
|
+
* invoke for nested structures (object fields, array elements, union
|
|
88
|
+
* options, …).
|
|
89
|
+
*
|
|
90
|
+
* Mirrors the React {@link "../core/renderer.ts".RenderProps} shape
|
|
91
|
+
* — `onChange` for value propagation, four-argument `renderChild`
|
|
92
|
+
* for recursive descent.
|
|
93
|
+
*/
|
|
94
|
+
export interface SvelteRenderProps extends BaseRenderProps<SvelteRenderDescriptor | null> {
|
|
95
|
+
/** Callback to update the field value. */
|
|
96
|
+
onChange: (value: unknown) => void;
|
|
97
|
+
/**
|
|
98
|
+
* Render a child field. Container renderers (object, array,
|
|
99
|
+
* tuple, record, union, discriminated union, conditional,
|
|
100
|
+
* negation) call this and mount the returned descriptor via
|
|
101
|
+
* `<svelte:component this={component} {...props} />`.
|
|
102
|
+
*
|
|
103
|
+
* @param tree - The walked field tree for the child.
|
|
104
|
+
* @param value - The child's current value.
|
|
105
|
+
* @param onChange - Callback receiving the child's next value.
|
|
106
|
+
* @param pathSuffix - Path segment from the parent (e.g. "city",
|
|
107
|
+
* "[0]"). Joined to the parent's path with a dot, or
|
|
108
|
+
* substituted when the parent acts as a transparent wrapper
|
|
109
|
+
* (union options). Required for every container — without it
|
|
110
|
+
* children inherit no path and `fieldDomId()` will throw.
|
|
111
|
+
*/
|
|
112
|
+
renderChild: (
|
|
113
|
+
tree: WalkedField,
|
|
114
|
+
value: unknown,
|
|
115
|
+
onChange: (v: unknown) => void,
|
|
116
|
+
pathSuffix?: string
|
|
117
|
+
) => SvelteRenderDescriptor | null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Signature for a render function attached to a
|
|
122
|
+
* {@link SvelteComponentResolver}.
|
|
123
|
+
*
|
|
124
|
+
* Unlike React — where `RenderFunction` directly produces a
|
|
125
|
+
* `ReactNode` — the Svelte equivalent produces a
|
|
126
|
+
* {@link SvelteRenderDescriptor}. The descriptor pairs a component
|
|
127
|
+
* constructor with the per-field props and is mounted by the parent
|
|
128
|
+
* renderer via `<svelte:component>`. This indirection is the price
|
|
129
|
+
* of Svelte's compile-time component model: the dispatcher cannot
|
|
130
|
+
* fabricate rendered DOM at runtime, so it returns a recipe for the
|
|
131
|
+
* parent to mount.
|
|
132
|
+
*
|
|
133
|
+
* Specialisation of the generic
|
|
134
|
+
* {@link "../core/renderer.ts".RenderFunction | RenderFunction} from
|
|
135
|
+
* `core/renderer.ts` with
|
|
136
|
+
* `Output = SvelteRenderDescriptor | null` and
|
|
137
|
+
* `Props = SvelteRenderProps`.
|
|
138
|
+
*/
|
|
139
|
+
export type SvelteRenderFunction = RenderFunction<
|
|
140
|
+
SvelteRenderDescriptor | null,
|
|
141
|
+
SvelteRenderProps
|
|
142
|
+
>;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Helper: wrap a Svelte component constructor into the
|
|
146
|
+
* "render function" shape consumed by the dispatcher. Pairs the
|
|
147
|
+
* supplied component with the per-field props.
|
|
148
|
+
*
|
|
149
|
+
* Used by {@link "./headless.ts".headlessSvelteResolver} to register
|
|
150
|
+
* one constructor per schema type, and exposed publicly so theme
|
|
151
|
+
* adapter authors can compose their own resolver from `.svelte`
|
|
152
|
+
* files without re-implementing the wrapper.
|
|
153
|
+
*
|
|
154
|
+
* @param component - A Svelte 5 component constructor accepting
|
|
155
|
+
* {@link SvelteRenderProps}.
|
|
156
|
+
* @returns A {@link SvelteRenderFunction} that, given props, returns
|
|
157
|
+
* the descriptor `{ component, props }`.
|
|
158
|
+
*/
|
|
159
|
+
export function makeSvelteRenderer(
|
|
160
|
+
component: SvelteComponentConstructor
|
|
161
|
+
): SvelteRenderFunction {
|
|
162
|
+
return (props) => ({ component, props });
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Theme adapter — maps every schema field type to a Svelte
|
|
167
|
+
* {@link SvelteRenderFunction}. Unset keys fall back to the headless
|
|
168
|
+
* resolver.
|
|
169
|
+
*
|
|
170
|
+
* Pass to {@link "./contexts.ts".resolverContext} (via the
|
|
171
|
+
* `SchemaProvider` Svelte component) so a single theme drives every
|
|
172
|
+
* schema render in a subtree.
|
|
173
|
+
*
|
|
174
|
+
* Structurally parallel to
|
|
175
|
+
* {@link "../core/renderer.ts".ComponentResolver} for React, but
|
|
176
|
+
* each value is a {@link SvelteRenderFunction} returning a
|
|
177
|
+
* {@link SvelteRenderDescriptor} rather than a render function
|
|
178
|
+
* returning a `ReactNode`.
|
|
179
|
+
*/
|
|
180
|
+
export interface SvelteComponentResolver {
|
|
181
|
+
string?: SvelteRenderFunction;
|
|
182
|
+
number?: SvelteRenderFunction;
|
|
183
|
+
boolean?: SvelteRenderFunction;
|
|
184
|
+
null?: SvelteRenderFunction;
|
|
185
|
+
enum?: SvelteRenderFunction;
|
|
186
|
+
object?: SvelteRenderFunction;
|
|
187
|
+
array?: SvelteRenderFunction;
|
|
188
|
+
tuple?: SvelteRenderFunction;
|
|
189
|
+
record?: SvelteRenderFunction;
|
|
190
|
+
union?: SvelteRenderFunction;
|
|
191
|
+
discriminatedUnion?: SvelteRenderFunction;
|
|
192
|
+
conditional?: SvelteRenderFunction;
|
|
193
|
+
negation?: SvelteRenderFunction;
|
|
194
|
+
literal?: SvelteRenderFunction;
|
|
195
|
+
file?: SvelteRenderFunction;
|
|
196
|
+
never?: SvelteRenderFunction;
|
|
197
|
+
unknown?: SvelteRenderFunction;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Widget map — maps component hints (from `.meta({ component })`) to
|
|
202
|
+
* Svelte {@link SvelteRenderFunction}s. Mirrors the React
|
|
203
|
+
* {@link "../core/renderer.ts".WidgetMap} but each value is a
|
|
204
|
+
* Svelte-flavoured render function (typically produced via
|
|
205
|
+
* {@link makeSvelteRenderer}).
|
|
206
|
+
*
|
|
207
|
+
* Scoped at three levels in the Svelte adapter:
|
|
208
|
+
*
|
|
209
|
+
* 1. **Per-instance** — `widgets` prop on `<SchemaComponent>`
|
|
210
|
+
* 2. **Context-scoped** — `widgets` prop on `<SchemaProvider>`
|
|
211
|
+
* 3. **Global** — `registerWidget()` (app-wide defaults)
|
|
212
|
+
*/
|
|
213
|
+
export type SvelteWidgetMap = ReadonlyMap<string, SvelteRenderFunction>;
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Compile-time assertion that {@link SvelteRenderFunction} is a
|
|
217
|
+
* specialisation of the generic {@link RenderFunction} contract from
|
|
218
|
+
* `core/renderer.ts`. Exercised by the type-level test in
|
|
219
|
+
* `tests/svelte/typeTest.svelte.unit.test.ts` — a regression on the
|
|
220
|
+
* alignment fails compilation rather than silently producing
|
|
221
|
+
* incompatible adapters.
|
|
222
|
+
*
|
|
223
|
+
* @internal
|
|
224
|
+
*/
|
|
225
|
+
export type __SvelteRenderFunctionMatchesGenericRenderFunction =
|
|
226
|
+
SvelteRenderFunction extends RenderFunction<
|
|
227
|
+
SvelteRenderDescriptor | null,
|
|
228
|
+
SvelteRenderProps
|
|
229
|
+
>
|
|
230
|
+
? true
|
|
231
|
+
: false;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Re-export of {@link BaseFieldProps} so consumers writing custom
|
|
235
|
+
* Svelte renderers can import a single type covering the schema-data
|
|
236
|
+
* shape without crossing the framework adapter boundary.
|
|
237
|
+
*/
|
|
238
|
+
export type { BaseFieldProps };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global widget registry for the Svelte adapter.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the React adapter's `registerWidget()` / `globalWidgets`
|
|
5
|
+
* pair in `react/SchemaComponent.tsx`. Each registered entry is a
|
|
6
|
+
* Svelte component constructor (`Component<SvelteRenderProps>`)
|
|
7
|
+
* matched against `.meta({ component })` hints on a walked field.
|
|
8
|
+
*
|
|
9
|
+
* Resolution order (from {@link "./SchemaComponent.svelte" |
|
|
10
|
+
* SchemaComponent}'s dispatch wiring): instance widgets → context
|
|
11
|
+
* widgets → global widgets → resolver render fn → headless fallback.
|
|
12
|
+
*
|
|
13
|
+
* The global registry is module-level mutable state; tests should
|
|
14
|
+
* clear it with {@link __clearGlobalWidgets} to avoid leaking
|
|
15
|
+
* registrations across cases.
|
|
16
|
+
*
|
|
17
|
+
* @group Framework Adapters
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { SvelteRenderFunction } from "./types.ts";
|
|
21
|
+
|
|
22
|
+
const globalWidgets = new Map<string, SvelteRenderFunction>();
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Register a Svelte widget globally. The widget is resolved when a
|
|
26
|
+
* schema field has `.meta({ component: name })` and no per-instance
|
|
27
|
+
* or context-scoped widget map provides a matching entry.
|
|
28
|
+
*
|
|
29
|
+
* For scoped registration, supply the `widgets` prop on
|
|
30
|
+
* `<SchemaComponent>` or `<SchemaProvider>` instead.
|
|
31
|
+
*/
|
|
32
|
+
export function registerWidget(
|
|
33
|
+
name: string,
|
|
34
|
+
component: SvelteRenderFunction
|
|
35
|
+
): void {
|
|
36
|
+
globalWidgets.set(name, component);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Look up a globally registered Svelte widget by hint name. Returns
|
|
41
|
+
* `undefined` when nothing matches — callers fall back to the
|
|
42
|
+
* resolver chain.
|
|
43
|
+
*
|
|
44
|
+
* @internal Used by the Svelte dispatcher wiring inside
|
|
45
|
+
* `SchemaComponent.svelte`; not part of the public surface.
|
|
46
|
+
*/
|
|
47
|
+
export function lookupGlobalWidget(
|
|
48
|
+
name: string
|
|
49
|
+
): SvelteRenderFunction | undefined {
|
|
50
|
+
return globalWidgets.get(name);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Clear every globally registered Svelte widget. Intended for test
|
|
55
|
+
* isolation — `registerWidget` writes to module-level state and that
|
|
56
|
+
* state otherwise leaks across test cases.
|
|
57
|
+
*
|
|
58
|
+
* @internal
|
|
59
|
+
*/
|
|
60
|
+
export function __clearGlobalWidgets(): void {
|
|
61
|
+
globalWidgets.clear();
|
|
62
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|