schema-components 2.0.2 → 2.1.1

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 (197) hide show
  1. package/README.md +133 -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 +115 -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 +15 -6
  39. package/dist/html/streamRenderers.mjs +56 -10
  40. package/dist/{inferValue-Ce-PviSD.d.mts → inferValue-eAnh50EM.d.mts} +3 -3
  41. package/dist/lit/SchemaComponent.d.mts +125 -0
  42. package/dist/lit/SchemaComponent.mjs +2 -0
  43. package/dist/lit/SchemaField.d.mts +65 -0
  44. package/dist/lit/SchemaField.mjs +2 -0
  45. package/dist/lit/SchemaView.d.mts +14 -0
  46. package/dist/lit/SchemaView.mjs +2 -0
  47. package/dist/lit/constructorTypes.d.mts +2 -0
  48. package/dist/lit/constructorTypes.mjs +1 -0
  49. package/dist/lit/contexts.d.mts +78 -0
  50. package/dist/lit/contexts.mjs +238 -0
  51. package/dist/lit/defaultResolver.d.mts +33 -0
  52. package/dist/lit/defaultResolver.mjs +2 -0
  53. package/dist/lit/registry.d.mts +66 -0
  54. package/dist/lit/registry.mjs +2 -0
  55. package/dist/lit/renderers/baseElement.d.mts +131 -0
  56. package/dist/lit/renderers/baseElement.mjs +109 -0
  57. package/dist/lit/renderers/recordHelpers.d.mts +25 -0
  58. package/dist/lit/renderers/recordHelpers.mjs +55 -0
  59. package/dist/lit/renderers/scArray.d.mts +14 -0
  60. package/dist/lit/renderers/scArray.mjs +86 -0
  61. package/dist/lit/renderers/scBoolean.d.mts +15 -0
  62. package/dist/lit/renderers/scBoolean.mjs +47 -0
  63. package/dist/lit/renderers/scConditional.d.mts +23 -0
  64. package/dist/lit/renderers/scConditional.mjs +65 -0
  65. package/dist/lit/renderers/scDiscriminated.d.mts +23 -0
  66. package/dist/lit/renderers/scDiscriminated.mjs +138 -0
  67. package/dist/lit/renderers/scEnum.d.mts +16 -0
  68. package/dist/lit/renderers/scEnum.mjs +66 -0
  69. package/dist/lit/renderers/scFile.d.mts +15 -0
  70. package/dist/lit/renderers/scFile.mjs +53 -0
  71. package/dist/lit/renderers/scLiteralNullNever.d.mts +30 -0
  72. package/dist/lit/renderers/scLiteralNullNever.mjs +57 -0
  73. package/dist/lit/renderers/scNumber.d.mts +15 -0
  74. package/dist/lit/renderers/scNumber.mjs +64 -0
  75. package/dist/lit/renderers/scObject.d.mts +14 -0
  76. package/dist/lit/renderers/scObject.mjs +57 -0
  77. package/dist/lit/renderers/scRecord.d.mts +14 -0
  78. package/dist/lit/renderers/scRecord.mjs +112 -0
  79. package/dist/lit/renderers/scString.d.mts +19 -0
  80. package/dist/lit/renderers/scString.mjs +165 -0
  81. package/dist/lit/renderers/scTuple.d.mts +14 -0
  82. package/dist/lit/renderers/scTuple.mjs +58 -0
  83. package/dist/lit/renderers/scUnion.d.mts +14 -0
  84. package/dist/lit/renderers/scUnion.mjs +44 -0
  85. package/dist/lit/renderers/scUnknown.d.mts +15 -0
  86. package/dist/lit/renderers/scUnknown.mjs +45 -0
  87. package/dist/lit/ssr.d.mts +37 -0
  88. package/dist/lit/ssr.mjs +9565 -0
  89. package/dist/lit/types.d.mts +2 -0
  90. package/dist/lit/types.mjs +1 -0
  91. package/dist/lit/widget.d.mts +71 -0
  92. package/dist/lit/widget.mjs +87 -0
  93. package/dist/openapi/ApiCallbacks.d.mts +1 -1
  94. package/dist/openapi/ApiLinks.d.mts +1 -1
  95. package/dist/openapi/ApiResponseHeaders.d.mts +1 -1
  96. package/dist/openapi/ApiSecurity.d.mts +1 -1
  97. package/dist/openapi/components.d.mts +4 -4
  98. package/dist/openapi/parser.d.mts +2 -2
  99. package/dist/openapi/resolve.d.mts +1 -1
  100. package/dist/preact/SchemaComponent.d.mts +3 -0
  101. package/dist/preact/SchemaComponent.mjs +26 -0
  102. package/dist/preact/SchemaErrorBoundary.d.mts +2 -0
  103. package/dist/preact/SchemaErrorBoundary.mjs +20 -0
  104. package/dist/preact/SchemaView.d.mts +2 -0
  105. package/dist/preact/SchemaView.mjs +22 -0
  106. package/dist/preact/headless.d.mts +2 -0
  107. package/dist/preact/headless.mjs +18 -0
  108. package/dist/react/SchemaComponent.d.mts +3 -270
  109. package/dist/react/SchemaComponent.mjs +41 -32
  110. package/dist/react/SchemaView.d.mts +6 -6
  111. package/dist/react/SchemaView.mjs +32 -29
  112. package/dist/react/a11y.d.mts +2 -2
  113. package/dist/react/fieldShell.d.mts +1 -1
  114. package/dist/react/headless.d.mts +1 -1
  115. package/dist/react/headlessRenderers.d.mts +2 -2
  116. package/dist/{ref-DdsbekXX.d.mts → ref-DWrQG1Er.d.mts} +1 -1
  117. package/dist/renderer-ab9E52Bp.d.mts +245 -0
  118. package/dist/solid/SchemaComponent.d.mts +136 -0
  119. package/dist/solid/SchemaComponent.mjs +391 -0
  120. package/dist/solid/SchemaErrorBoundary.d.mts +38 -0
  121. package/dist/solid/SchemaErrorBoundary.mjs +57 -0
  122. package/dist/solid/SchemaField.d.mts +40 -0
  123. package/dist/solid/SchemaField.mjs +113 -0
  124. package/dist/solid/SchemaView.d.mts +54 -0
  125. package/dist/solid/SchemaView.mjs +168 -0
  126. package/dist/solid/a11y.d.mts +70 -0
  127. package/dist/solid/a11y.mjs +71 -0
  128. package/dist/solid/contexts.d.mts +37 -0
  129. package/dist/solid/contexts.mjs +66 -0
  130. package/dist/solid/headless.d.mts +10 -0
  131. package/dist/solid/headless.mjs +27 -0
  132. package/dist/solid/renderers.d.mts +79 -0
  133. package/dist/solid/renderers.mjs +840 -0
  134. package/dist/solid/types.d.mts +90 -0
  135. package/dist/solid/types.mjs +1 -0
  136. package/dist/solid/widget.d.mts +29 -0
  137. package/dist/solid/widget.mjs +35 -0
  138. package/dist/themes/mantine.d.mts +1 -1
  139. package/dist/themes/mui.d.mts +1 -1
  140. package/dist/themes/radix.d.mts +1 -1
  141. package/dist/themes/shadcn.d.mts +1 -1
  142. package/dist/typeInference-Y8tNEQJk.d.mts +983 -0
  143. package/dist/types-BCy7K3nk.d.mts +125 -0
  144. package/package.json +73 -1
  145. package/src/svelte/SchemaComponent.svelte +427 -0
  146. package/src/svelte/SchemaErrorBoundary.svelte +66 -0
  147. package/src/svelte/SchemaField.svelte +216 -0
  148. package/src/svelte/SchemaProvider.svelte +46 -0
  149. package/src/svelte/SchemaView.svelte +244 -0
  150. package/src/svelte/a11y.ts +112 -0
  151. package/src/svelte/contexts.ts +79 -0
  152. package/src/svelte/dispatch.ts +267 -0
  153. package/src/svelte/headless.ts +73 -0
  154. package/src/svelte/headlessFns.ts +124 -0
  155. package/src/svelte/renderers/Array.svelte +98 -0
  156. package/src/svelte/renderers/Boolean.svelte +43 -0
  157. package/src/svelte/renderers/Conditional.svelte +67 -0
  158. package/src/svelte/renderers/DiscriminatedUnion.svelte +197 -0
  159. package/src/svelte/renderers/Enum.svelte +53 -0
  160. package/src/svelte/renderers/Fallback.svelte +24 -0
  161. package/src/svelte/renderers/File.svelte +46 -0
  162. package/src/svelte/renderers/Literal.svelte +29 -0
  163. package/src/svelte/renderers/Mount.svelte +24 -0
  164. package/src/svelte/renderers/Negation.svelte +35 -0
  165. package/src/svelte/renderers/Never.svelte +24 -0
  166. package/src/svelte/renderers/Null.svelte +19 -0
  167. package/src/svelte/renderers/Number.svelte +68 -0
  168. package/src/svelte/renderers/Object.svelte +74 -0
  169. package/src/svelte/renderers/Record.svelte +134 -0
  170. package/src/svelte/renderers/RecursionSentinel.svelte +27 -0
  171. package/src/svelte/renderers/String.svelte +152 -0
  172. package/src/svelte/renderers/Tuple.svelte +84 -0
  173. package/src/svelte/renderers/Union.svelte +49 -0
  174. package/src/svelte/renderers/Unknown.svelte +42 -0
  175. package/src/svelte/svelte-modules.d.ts +25 -0
  176. package/src/svelte/types.ts +238 -0
  177. package/src/svelte/widget.ts +62 -0
  178. package/src/vue/SchemaComponent.vue +274 -0
  179. package/src/vue/SchemaErrorBoundary.vue +60 -0
  180. package/src/vue/SchemaField.vue +178 -0
  181. package/src/vue/SchemaProvider.vue +39 -0
  182. package/src/vue/SchemaView.vue +198 -0
  183. package/src/vue/VNodeHost.ts +32 -0
  184. package/src/vue/contexts.ts +116 -0
  185. package/src/vue/eventTargets.ts +35 -0
  186. package/src/vue/headless.ts +61 -0
  187. package/src/vue/idPrefix.ts +79 -0
  188. package/src/vue/renderField.ts +182 -0
  189. package/src/vue/renderers.ts +1297 -0
  190. package/src/vue/resolver.ts +45 -0
  191. package/src/vue/types.ts +140 -0
  192. package/src/vue/vue-shim.d.ts +25 -0
  193. package/src/vue/widget.ts +51 -0
  194. /package/dist/{diagnostics-BTrm3O6J.d.mts → diagnostics-mftUZI7c.d.mts} +0 -0
  195. /package/dist/{limits-x4OiyJxh.d.mts → limits-Vv9hUbI_.d.mts} +0 -0
  196. /package/dist/{types-BrYbjC7_.d.mts → types-BBQaEPfE.d.mts} +0 -0
  197. /package/dist/{version-DL8U5RuA.d.mts → version-BEBx10ND.d.mts} +0 -0
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Vue resolver helpers — resolver-key lookup and resolver merging.
3
+ *
4
+ * Mirrors the React adapter's `getRenderFunction` / `mergeResolvers`
5
+ * pair, parameterised over {@link VueComponentResolver} and
6
+ * {@link VueRenderFunction}. Reuses {@link RESOLVER_KEYS} and
7
+ * {@link typeToKey} from `core/renderer.ts` so the per-type → key
8
+ * mapping has one canonical definition shared by every adapter.
9
+ */
10
+
11
+ import { RESOLVER_KEYS, typeToKey } from "../core/renderer.ts";
12
+ import type { WalkedField } from "../core/types.ts";
13
+ import type { VueComponentResolver, VueRenderFunction } from "./types.ts";
14
+
15
+ /**
16
+ * Look up the {@link VueRenderFunction} for a schema type in a
17
+ * {@link VueComponentResolver}. Returns `undefined` when the resolver
18
+ * has no entry for the type — the caller (typically the dispatcher in
19
+ * `core/renderField.ts`) then falls through to the headless resolver.
20
+ */
21
+ export function getVueRenderFunction(
22
+ type: WalkedField["type"],
23
+ resolver: VueComponentResolver
24
+ ): VueRenderFunction | undefined {
25
+ return resolver[typeToKey(type)];
26
+ }
27
+
28
+ /**
29
+ * Merge two {@link VueComponentResolver}s — user values take priority,
30
+ * fallback fills gaps. Iterates {@link RESOLVER_KEYS} so every field
31
+ * variant the walker can emit has a deterministic resolution path.
32
+ */
33
+ export function mergeVueResolvers(
34
+ user: VueComponentResolver,
35
+ fallback: VueComponentResolver
36
+ ): VueComponentResolver {
37
+ const merged: VueComponentResolver = {};
38
+ for (const key of RESOLVER_KEYS) {
39
+ const fn = user[key] ?? fallback[key];
40
+ if (fn !== undefined) {
41
+ merged[key] = fn;
42
+ }
43
+ }
44
+ return merged;
45
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Vue-flavoured render-prop and resolver shapes.
3
+ *
4
+ * Mirrors the React adapter's `RenderProps` / `RenderFunction` /
5
+ * `ComponentResolver` trio, parameterised over Vue's {@link VNode}
6
+ * output type. Built on top of the framework-agnostic generic
7
+ * `BaseRenderProps` and `RenderFunction` from `core/renderer.ts` so the
8
+ * Vue adapter shares a single source of truth for the per-field props
9
+ * shape with React, HTML, and any future framework adapter.
10
+ *
11
+ * The `onChange` callback semantics are deliberately kept identical to
12
+ * the React adapter — see the design note in `vue/SchemaComponent.vue`.
13
+ * Vue authors who prefer `v-model` / emit-based wiring use the
14
+ * top-level `<SchemaComponent>` and `<SchemaView>` SFCs (which translate
15
+ * the Vue-idiomatic surface back to the imperative `onChange`); the
16
+ * inner render functions consume the imperative shape directly so the
17
+ * dispatcher contract is uniform across adapters.
18
+ */
19
+
20
+ import type { VNode } from "vue";
21
+ import type { BaseRenderProps, RenderFunction } from "../core/renderer.ts";
22
+ import type { WalkedField } from "../core/types.ts";
23
+
24
+ // ---------------------------------------------------------------------------
25
+ // VueRenderProps — per-field props passed to every Vue render function
26
+ // ---------------------------------------------------------------------------
27
+
28
+ /**
29
+ * Props for Vue render functions. Extends {@link BaseRenderProps} with:
30
+ *
31
+ * - `onChange` — imperative callback to propagate value changes back to
32
+ * the host component. The top-level `<SchemaComponent>` SFC bridges
33
+ * this to a `change` emit / `v-model` update, so consumers writing
34
+ * pure render functions still operate against the same imperative
35
+ * contract as the React adapter.
36
+ * - `renderChild` — recursively renders a child field, threading
37
+ * `onChange` through the four-argument signature inherited from
38
+ * `RenderProps` so theme adapters (or future widget code) can share
39
+ * helpers between React and Vue with minimal adaptation.
40
+ */
41
+ export interface VueRenderProps extends BaseRenderProps<VNode> {
42
+ /**
43
+ * Callback to update the field value. Wired to the Vue
44
+ * `@change` / `v-model` surface by the `<SchemaComponent>` SFC.
45
+ */
46
+ onChange: (value: unknown) => void;
47
+ /**
48
+ * Render a child field. Theme adapters call this to recursively
49
+ * render nested structures (object fields, array elements, union
50
+ * options).
51
+ *
52
+ * @param tree - The walked field tree for the child.
53
+ * @param value - The child's current value.
54
+ * @param onChange - Callback receiving the child's next value.
55
+ * @param pathSuffix - Path segment from the parent (e.g. `"city"`,
56
+ * `"[0]"`). Joined to the parent's path with a dot, or
57
+ * substituted when the parent acts as a transparent wrapper
58
+ * (union options). Required for every container — without it
59
+ * children inherit no path and `fieldDomId()` will throw.
60
+ */
61
+ renderChild: (
62
+ tree: WalkedField,
63
+ value: unknown,
64
+ onChange: (v: unknown) => void,
65
+ pathSuffix?: string
66
+ ) => VNode;
67
+ }
68
+
69
+ // ---------------------------------------------------------------------------
70
+ // VueRenderFunction — render function signature
71
+ // ---------------------------------------------------------------------------
72
+
73
+ /**
74
+ * Signature for a Vue render function. Specialisation of the generic
75
+ * {@link RenderFunction} with `Output = VNode` and
76
+ * `Props = VueRenderProps`.
77
+ *
78
+ * Composes cleanly with the generic dispatch in `core/renderField.ts`:
79
+ *
80
+ * ```ts
81
+ * const r: VueRenderFunction = (props) => h("input", { value: props.value });
82
+ * const generic: RenderFunction<VNode, VueRenderProps> = r; // assignable
83
+ * ```
84
+ */
85
+ export type VueRenderFunction = RenderFunction<VNode, VueRenderProps>;
86
+
87
+ // ---------------------------------------------------------------------------
88
+ // VueComponentResolver — theme adapter interface for Vue
89
+ // ---------------------------------------------------------------------------
90
+
91
+ /**
92
+ * Vue theme adapter — maps every schema field type to its Vue
93
+ * {@link VueRenderFunction}. Structurally mirrors the React
94
+ * `ComponentResolver` but produces `VNode`s.
95
+ *
96
+ * Unset keys fall back to the headless resolver. Pass to the
97
+ * `<SchemaProvider>` SFC or directly to a `<SchemaComponent>`'s
98
+ * `resolver` prop to drive every schema-driven render with a specific
99
+ * theme.
100
+ */
101
+ export interface VueComponentResolver {
102
+ string?: VueRenderFunction;
103
+ number?: VueRenderFunction;
104
+ boolean?: VueRenderFunction;
105
+ null?: VueRenderFunction;
106
+ enum?: VueRenderFunction;
107
+ object?: VueRenderFunction;
108
+ array?: VueRenderFunction;
109
+ tuple?: VueRenderFunction;
110
+ record?: VueRenderFunction;
111
+ union?: VueRenderFunction;
112
+ discriminatedUnion?: VueRenderFunction;
113
+ conditional?: VueRenderFunction;
114
+ negation?: VueRenderFunction;
115
+ literal?: VueRenderFunction;
116
+ file?: VueRenderFunction;
117
+ never?: VueRenderFunction;
118
+ unknown?: VueRenderFunction;
119
+ }
120
+
121
+ // ---------------------------------------------------------------------------
122
+ // VueWidgetMap — scoped widget registry
123
+ // ---------------------------------------------------------------------------
124
+
125
+ /**
126
+ * Widget map — maps component hints (from `.meta({ component })`) to
127
+ * {@link VueRenderFunction}s. Parallels the React `WidgetMap` but
128
+ * produces `VNode`s.
129
+ *
130
+ * Scoped at three levels:
131
+ *
132
+ * 1. **Per-instance** — `widgets` prop on `<SchemaComponent>`
133
+ * 2. **Context-scoped** — provided via {@link VueWidgetsContext}
134
+ * 3. **Global** — `registerWidget()` (app-wide defaults)
135
+ *
136
+ * Resolution order: instance → context → global → resolver → headless,
137
+ * mirroring the React resolution chain so dual-target consumers see
138
+ * identical fallback behaviour.
139
+ */
140
+ export type VueWidgetMap = ReadonlyMap<string, VueRenderFunction>;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Ambient module declaration for `.vue` Single-File Component imports.
3
+ *
4
+ * TypeScript cannot natively parse `.vue` files, so we shim every
5
+ * `*.vue` import as a `DefineComponent`. Vue's official tooling
6
+ * (`vue-tsc`, Volar in editor mode) reads the actual SFC and produces
7
+ * a fully-typed component definition; this shim provides a sound
8
+ * fallback for plain `tsc --noEmit` so the existing typecheck step
9
+ * (`packages/core/_typecheck`) continues to pass without depending on
10
+ * `vue-tsc` being added to the toolchain.
11
+ *
12
+ * The catch-all generics deliberately accept any prop shape — Vitest's
13
+ * `mount()` and the consuming SFCs supply concrete props at the call
14
+ * site, and the runtime Vue compiler validates them.
15
+ */
16
+
17
+ declare module "*.vue" {
18
+ import type { DefineComponent } from "vue";
19
+ const component: DefineComponent<
20
+ Record<string, unknown>,
21
+ Record<string, unknown>,
22
+ unknown
23
+ >;
24
+ export default component;
25
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Vue widget registry — custom renderers keyed by `.meta({ component })`
3
+ * hint.
4
+ *
5
+ * Mirrors `react/SchemaComponent.tsx`'s widget surface: a module-level
6
+ * map storing app-wide widget defaults plus a clear hook used by tests
7
+ * to isolate state between cases. Scoped registration (per-instance,
8
+ * per-provider) lives on the corresponding props of the
9
+ * `<SchemaComponent>` / `<SchemaProvider>` SFCs.
10
+ *
11
+ * Resolution order, matching the React adapter: instance → context →
12
+ * global → resolver → headless.
13
+ */
14
+
15
+ import type { VueRenderFunction } from "./types.ts";
16
+
17
+ /** Global widget registry — app-wide defaults. */
18
+ const globalWidgets = new Map<string, VueRenderFunction>();
19
+
20
+ /**
21
+ * Register a widget globally. The widget is resolved when a schema field
22
+ * has `.meta({ component: name })`.
23
+ *
24
+ * For scoped registration, use the `widgets` prop on `<SchemaComponent>`
25
+ * or `<SchemaProvider>` instead.
26
+ */
27
+ export function registerWidget(name: string, render: VueRenderFunction): void {
28
+ globalWidgets.set(name, render);
29
+ }
30
+
31
+ /**
32
+ * Look up a widget in the global registry. Used by the Vue dispatcher
33
+ * after the per-instance and context maps have been checked.
34
+ */
35
+ export function lookupGlobalWidget(
36
+ name: string
37
+ ): VueRenderFunction | undefined {
38
+ return globalWidgets.get(name);
39
+ }
40
+
41
+ /**
42
+ * Clear every globally registered widget. Intended for test isolation
43
+ * — `registerWidget` writes to module-level state and that state
44
+ * otherwise leaks across test cases, making the test suite
45
+ * order-dependent. Tests should call this from an `afterEach` hook.
46
+ *
47
+ * @internal
48
+ */
49
+ export function __clearGlobalWidgets(): void {
50
+ globalWidgets.clear();
51
+ }