@xmachines/play-solid 1.0.0-beta.21 → 1.0.0-beta.23
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 +20 -0
- package/dist/PlayRenderer.js +41 -36
- package/dist/PlayRenderer.js.map +1 -1
- package/package.json +9 -5
package/README.md
CHANGED
|
@@ -27,6 +27,10 @@ npm install @json-render/solid @json-render/core # peer deps
|
|
|
27
27
|
npm install @json-render/xstate @xstate/store # store integration
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
+
In this monorepo, the root install applies a `patch-package` patch to `@json-render/solid`
|
|
31
|
+
so `defineRegistry(..., { onRenderError })` can intercept inner element-boundary errors
|
|
32
|
+
without muting console output.
|
|
33
|
+
|
|
30
34
|
## Current Exports
|
|
31
35
|
|
|
32
36
|
- `PlayRenderer` — main renderer component
|
|
@@ -184,6 +188,9 @@ Main component. Subscribes to `actor.currentView` and renders the spec.
|
|
|
184
188
|
|
|
185
189
|
**`registry`** — Built with `defineRegistry(catalog, { components, actions })` from `@xmachines/play-solid`.
|
|
186
190
|
|
|
191
|
+
`defineRegistry` also accepts `onRenderError(error, elementType)`, which receives errors
|
|
192
|
+
caught by `@json-render/solid`'s inner element boundary before the default logger is used.
|
|
193
|
+
|
|
187
194
|
**`actions`** — Maps json-render action names (from spec `on` bindings) to XState event type strings. Type-checked against `EventFromLogic<TLogic>["type"]` when `TLogic` is specified:
|
|
188
195
|
|
|
189
196
|
```tsx
|
|
@@ -209,6 +216,19 @@ const store: StateStore = xstateStoreStateStore({ atom: createAtom({ username: "
|
|
|
209
216
|
<PlayRenderer actor={actor} registry={registry} store={store} actions={{ login: "auth.login" }} />;
|
|
210
217
|
```
|
|
211
218
|
|
|
219
|
+
**Inner render errors** — You can intercept catalog component render failures without
|
|
220
|
+
overriding the outer Solid error boundary:
|
|
221
|
+
|
|
222
|
+
```tsx
|
|
223
|
+
const { registry } = defineRegistry(catalog, {
|
|
224
|
+
components: { Login, Dashboard },
|
|
225
|
+
actions: { login: async () => {}, logout: async () => {} },
|
|
226
|
+
onRenderError(error, elementType) {
|
|
227
|
+
reportExpectedRenderError(error, elementType);
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
```
|
|
231
|
+
|
|
212
232
|
**`fallback`** — Shown when `actor.currentView.get()` is `null`.
|
|
213
233
|
|
|
214
234
|
---
|
package/dist/PlayRenderer.js
CHANGED
|
@@ -3,54 +3,59 @@ import { createAtom as i } from "./node_modules/@xstate/store/dist/store-69e7e2d
|
|
|
3
3
|
import { xstateStoreStateStore as a } from "./node_modules/@json-render/xstate/dist/index.js";
|
|
4
4
|
import { ActorProvider as o } from "./useActor.js";
|
|
5
5
|
import { createComponent as s } from "solid-js/web";
|
|
6
|
-
import {
|
|
7
|
-
import { watchSignal as
|
|
6
|
+
import { ErrorBoundary as c, createSignal as l, onCleanup as u } from "solid-js";
|
|
7
|
+
import { watchSignal as d } from "@xmachines/play-signals";
|
|
8
8
|
//#region src/PlayRenderer.tsx
|
|
9
|
-
var
|
|
10
|
-
let [
|
|
11
|
-
|
|
9
|
+
var f = (f) => {
|
|
10
|
+
let [p, m] = l(f.actor.currentView.get()), h = null, g = null, _ = d(f.actor.currentView, (e) => {
|
|
11
|
+
m(e);
|
|
12
12
|
});
|
|
13
|
-
return
|
|
14
|
-
|
|
13
|
+
return u(() => {
|
|
14
|
+
_();
|
|
15
15
|
}), s(o, {
|
|
16
16
|
get value() {
|
|
17
|
-
return
|
|
17
|
+
return f.actor;
|
|
18
18
|
},
|
|
19
19
|
get children() {
|
|
20
|
-
return (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return s(
|
|
33
|
-
|
|
20
|
+
return s(c, {
|
|
21
|
+
fallback: (e) => (f.onError?.(e), f.fallback ?? null),
|
|
22
|
+
get children() {
|
|
23
|
+
return (() => {
|
|
24
|
+
let o = p();
|
|
25
|
+
if (!o) return f.fallback ?? null;
|
|
26
|
+
let c;
|
|
27
|
+
f.store ? c = f.store : ((h === null || g !== o) && (h = a({ atom: i(o.spec.state ?? {}) }), g = o), c = h);
|
|
28
|
+
let l = Object.fromEntries(Object.entries(f.actions ?? {}).map(([e, t]) => [e, async (e = {}) => f.actor.send({
|
|
29
|
+
type: t,
|
|
30
|
+
...e
|
|
31
|
+
})]));
|
|
32
|
+
return s(n, {
|
|
33
|
+
store: c,
|
|
34
34
|
get children() {
|
|
35
|
-
return s(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
35
|
+
return s(e, {
|
|
36
|
+
handlers: l,
|
|
37
|
+
get children() {
|
|
38
|
+
return s(r, { get children() {
|
|
39
|
+
return s(t, {
|
|
40
|
+
get spec() {
|
|
41
|
+
return o.spec;
|
|
42
|
+
},
|
|
43
|
+
get registry() {
|
|
44
|
+
return f.registry;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
} });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
45
50
|
}
|
|
46
51
|
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
})
|
|
52
|
+
})();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
50
55
|
}
|
|
51
56
|
});
|
|
52
57
|
};
|
|
53
58
|
//#endregion
|
|
54
|
-
export {
|
|
59
|
+
export { f as PlayRenderer };
|
|
55
60
|
|
|
56
61
|
//# sourceMappingURL=PlayRenderer.js.map
|
package/dist/PlayRenderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlayRenderer.js","names":["createSignal","onCleanup","Component","Renderer","StateProvider","ActionProvider","VisibilityProvider","ActionHandler","StateStore","createAtom","xstateStoreStateStore","watchSignal","PlayRendererProps","ViewMetadata","ActorProvider","PlayActor","PlayRenderer","props","view","setView","actor","currentView","get","internalStore","lastView","unwatch","nextView","_$createComponent","value","children","fallback","store","initialState","spec","state","Record","atom","handlers","Object","fromEntries","entries","actions","map","actionName","eventType","params","send","type","registry"],"sources":["../src/PlayRenderer.tsx"],"sourcesContent":["/**\n * PlayRenderer - Main SolidJS renderer component for XMachines Play architecture\n *\n * @packageDocumentation\n */\n\nimport { createSignal, onCleanup, type Component } from \"solid-js\";\nimport { Renderer, StateProvider, ActionProvider, VisibilityProvider } from \"@json-render/solid\";\nimport type { ActionHandler, StateStore } from \"@json-render/core\";\nimport { createAtom } from \"@xstate/store\";\nimport { xstateStoreStateStore } from \"@json-render/xstate\";\nimport { watchSignal } from \"@xmachines/play-signals\";\nimport type { PlayRendererProps } from \"./types.js\";\nimport type { ViewMetadata } from \"@xmachines/play-actor\";\nimport { ActorProvider, type PlayActor } from \"./useActor.js\";\n\n/**\n * Main renderer component that subscribes to actor signals and renders UI\n *\n * Architecture (per XMachines Play patterns):\n * - Subscribes to actor.currentView signal via TC39 Signal.subtle.Watcher\n * - Renders view.spec via @json-render/solid Renderer backed by the registry\n * - Routes actions to actor.send() via ActionProvider handlers\n * - SolidJS signal only for triggering renders, NOT business logic\n * - State store: uses external `store` prop if provided (controlled mode); otherwise\n * creates a fresh @xstate/store atom per view transition seeded from spec.state.\n *\n * Invariant: Actor Authority - Actor decides all state transitions via guards.\n * Invariant: Passive Infrastructure - Component observes signals and sends events.\n * Invariant: Signal-Only Reactivity - Business logic state lives in actor signals.\n *\n * @example\n * ```typescript\n * import { PlayRenderer } from \"@xmachines/play-solid\";\n * import { defineRegistry } from \"@json-render/solid\";\n *\n * const { registry } = defineRegistry(catalog, { components: { ... } });\n *\n * // Uncontrolled — fresh atom per view, seeded from spec.state:\n * <PlayRenderer actor={actor} registry={registry} actions={{ login: \"auth.login\" }} />\n *\n * // Controlled — caller provides and owns the store:\n * import { createAtom } from \"@xstate/store\";\n * import { xstateStoreStateStore } from \"@json-render/xstate\";\n * const store = xstateStoreStateStore({ atom: createAtom({ username: \"\" }) });\n * <PlayRenderer actor={actor} registry={registry} store={store} actions={{ login: \"auth.login\" }} />\n * ```\n */\nexport const PlayRenderer: Component<PlayRendererProps> = (props) => {\n\t// Create SolidJS signal for view\n\t// Signal is NOT business logic state - it's just SolidJS's render trigger\n\tconst [view, setView] = createSignal<ViewMetadata | null>(\n\t\tprops.actor.currentView.get() as ViewMetadata | null,\n\t);\n\n\t// Internal per-view store — recreated on each view transition when no external store.\n\tlet internalStore: StateStore | null = null;\n\tlet lastView: ViewMetadata | null = null;\n\n\t// Bridge TC39 Signal to SolidJS signal — subscribe synchronously during setup\n\t// (matching React/Vue behavior; onMount would defer until after DOM insertion,\n\t// silently dropping signal changes between createSignal and mount)\n\tconst unwatch = watchSignal(props.actor.currentView, (nextView: ViewMetadata | null) => {\n\t\tsetView(nextView);\n\t});\n\tonCleanup(() => {\n\t\tunwatch();\n\t});\n\n\treturn (\n\t\t<ActorProvider value={props.actor as PlayActor}>\n\t\t\t{(() => {\n\t\t\t\tconst currentView = view();\n\t\t\t\tif (!currentView) return props.fallback ?? null;\n\n\t\t\t\t// Resolve the store: external (controlled) or internal per-view atom\n\t\t\t\tlet store: StateStore;\n\t\t\t\tif (props.store) {\n\t\t\t\t\tstore = props.store;\n\t\t\t\t} else {\n\t\t\t\t\tif (internalStore === null || lastView !== currentView) {\n\t\t\t\t\t\tconst initialState =\n\t\t\t\t\t\t\t(currentView.spec.state as Record<string, unknown>) ?? {};\n\t\t\t\t\t\tinternalStore = xstateStoreStateStore({\n\t\t\t\t\t\t\tatom: createAtom(initialState),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tlastView = currentView;\n\t\t\t\t\t}\n\t\t\t\t\tstore = internalStore;\n\t\t\t\t}\n\n\t\t\t\tconst handlers: Record<string, ActionHandler> = Object.fromEntries(\n\t\t\t\t\tObject.entries(props.actions ?? {}).map(([actionName, eventType]) => [\n\t\t\t\t\t\tactionName,\n\t\t\t\t\t\tasync (params: Record<string, unknown> = {}) =>\n\t\t\t\t\t\t\tprops.actor.send({ type: eventType, ...params }),\n\t\t\t\t\t]),\n\t\t\t\t);\n\n\t\t\t\treturn (\n\t\t\t\t\t<StateProvider store={store}>\n\t\t\t\t\t\t<ActionProvider handlers={handlers}>\n\t\t\t\t\t\t\t<VisibilityProvider>\n\t\t\t\t\t\t\t\t<Renderer spec={currentView.spec} registry={props.registry} />\n\t\t\t\t\t\t\t</VisibilityProvider>\n\t\t\t\t\t\t</ActionProvider>\n\t\t\t\t\t</StateProvider>\n\t\t\t\t);\n\t\t\t})()}\n\t\t</ActorProvider>\n\t);\n};\n"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"PlayRenderer.js","names":["createSignal","onCleanup","ErrorBoundary","Component","Renderer","StateProvider","ActionProvider","VisibilityProvider","ActionHandler","StateStore","createAtom","xstateStoreStateStore","watchSignal","PlayRendererProps","ViewMetadata","ActorProvider","PlayActor","PlayRenderer","props","view","setView","actor","currentView","get","internalStore","lastView","unwatch","nextView","_$createComponent","value","children","fallback","err","onError","store","initialState","spec","state","Record","atom","handlers","Object","fromEntries","entries","actions","map","actionName","eventType","params","send","type","registry"],"sources":["../src/PlayRenderer.tsx"],"sourcesContent":["/**\n * PlayRenderer - Main SolidJS renderer component for XMachines Play architecture\n *\n * @packageDocumentation\n */\n\nimport { createSignal, onCleanup, ErrorBoundary, type Component } from \"solid-js\";\nimport { Renderer, StateProvider, ActionProvider, VisibilityProvider } from \"@json-render/solid\";\nimport type { ActionHandler, StateStore } from \"@json-render/core\";\nimport { createAtom } from \"@xstate/store\";\nimport { xstateStoreStateStore } from \"@json-render/xstate\";\nimport { watchSignal } from \"@xmachines/play-signals\";\nimport type { PlayRendererProps } from \"./types.js\";\nimport type { ViewMetadata } from \"@xmachines/play-actor\";\nimport { ActorProvider, type PlayActor } from \"./useActor.js\";\n\n/**\n * Main renderer component that subscribes to actor signals and renders UI\n *\n * Architecture (per XMachines Play patterns):\n * - Subscribes to actor.currentView signal via TC39 Signal.subtle.Watcher\n * - Renders view.spec via @json-render/solid Renderer backed by the registry\n * - Routes actions to actor.send() via ActionProvider handlers\n * - SolidJS signal only for triggering renders, NOT business logic\n * - State store: uses external `store` prop if provided (controlled mode); otherwise\n * creates a fresh @xstate/store atom per view transition seeded from spec.state.\n * - Wraps the render path in a SolidJS `ErrorBoundary` to contain catalog component\n * render failures. The `fallback` prop is shown on error; `onError` is called for\n * observability forwarding (Sentry, Datadog, etc.).\n *\n * Invariant: Actor Authority - Actor decides all state transitions via guards.\n * Invariant: Passive Infrastructure - Component observes signals and sends events.\n * Invariant: Signal-Only Reactivity - Business logic state lives in actor signals.\n *\n * @example\n * ```typescript\n * import { PlayRenderer } from \"@xmachines/play-solid\";\n * import { defineRegistry } from \"@json-render/solid\";\n *\n * const { registry } = defineRegistry(catalog, { components: { ... } });\n *\n * // Uncontrolled — fresh atom per view, seeded from spec.state:\n * <PlayRenderer actor={actor} registry={registry} actions={{ login: \"auth.login\" }} />\n *\n * // Controlled — caller provides and owns the store:\n * import { createAtom } from \"@xstate/store\";\n * import { xstateStoreStateStore } from \"@json-render/xstate\";\n * const store = xstateStoreStateStore({ atom: createAtom({ username: \"\" }) });\n * <PlayRenderer actor={actor} registry={registry} store={store} actions={{ login: \"auth.login\" }} />\n *\n * // With observability hook:\n * <PlayRenderer actor={actor} registry={registry} onError={(err) => Sentry.captureException(err)} />\n * ```\n */\nexport const PlayRenderer: Component<PlayRendererProps> = (props) => {\n\t// Create SolidJS signal for view\n\t// Signal is NOT business logic state - it's just SolidJS's render trigger\n\tconst [view, setView] = createSignal<ViewMetadata | null>(\n\t\tprops.actor.currentView.get() as ViewMetadata | null,\n\t);\n\n\t// Internal per-view store — recreated on each view transition when no external store.\n\tlet internalStore: StateStore | null = null;\n\tlet lastView: ViewMetadata | null = null;\n\n\t// Bridge TC39 Signal to SolidJS signal — subscribe synchronously during setup\n\t// (matching React/Vue behavior; onMount would defer until after DOM insertion,\n\t// silently dropping signal changes between createSignal and mount)\n\tconst unwatch = watchSignal(props.actor.currentView, (nextView: ViewMetadata | null) => {\n\t\tsetView(nextView);\n\t});\n\tonCleanup(() => {\n\t\tunwatch();\n\t});\n\n\treturn (\n\t\t<ActorProvider value={props.actor as PlayActor}>\n\t\t\t<ErrorBoundary\n\t\t\t\tfallback={(err: unknown) => {\n\t\t\t\t\tprops.onError?.(err);\n\t\t\t\t\treturn props.fallback ?? null;\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{(() => {\n\t\t\t\t\tconst currentView = view();\n\t\t\t\t\tif (!currentView) return props.fallback ?? null;\n\n\t\t\t\t\t// Resolve the store: external (controlled) or internal per-view atom\n\t\t\t\t\tlet store: StateStore;\n\t\t\t\t\tif (props.store) {\n\t\t\t\t\t\tstore = props.store;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (internalStore === null || lastView !== currentView) {\n\t\t\t\t\t\t\tconst initialState =\n\t\t\t\t\t\t\t\t(currentView.spec.state as Record<string, unknown>) ?? {};\n\t\t\t\t\t\t\tinternalStore = xstateStoreStateStore({\n\t\t\t\t\t\t\t\tatom: createAtom(initialState),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tlastView = currentView;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstore = internalStore;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst handlers: Record<string, ActionHandler> = Object.fromEntries(\n\t\t\t\t\t\tObject.entries(props.actions ?? {}).map(([actionName, eventType]) => [\n\t\t\t\t\t\t\tactionName,\n\t\t\t\t\t\t\tasync (params: Record<string, unknown> = {}) =>\n\t\t\t\t\t\t\t\tprops.actor.send({ type: eventType, ...params }),\n\t\t\t\t\t\t]),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<StateProvider store={store}>\n\t\t\t\t\t\t\t<ActionProvider handlers={handlers}>\n\t\t\t\t\t\t\t\t<VisibilityProvider>\n\t\t\t\t\t\t\t\t\t<Renderer spec={currentView.spec} registry={props.registry} />\n\t\t\t\t\t\t\t\t</VisibilityProvider>\n\t\t\t\t\t\t\t</ActionProvider>\n\t\t\t\t\t\t</StateProvider>\n\t\t\t\t\t);\n\t\t\t\t})()}\n\t\t\t</ErrorBoundary>\n\t\t</ActorProvider>\n\t);\n};\n"],"mappings":";;;;;;;;AAsDA,IAAaiB,KAA8CC,MAAU;CAGpE,IAAM,CAACC,GAAMC,KAAWpB,EACvBkB,EAAMG,MAAMC,YAAYC,KAAK,CAC7B,EAGGC,IAAmC,MACnCC,IAAgC,MAK9BC,IAAUd,EAAYM,EAAMG,MAAMC,cAAcK,MAAkC;AACvFP,IAAQO,EAAS;GAChB;AAKF,QAJA1B,QAAgB;AACfyB,KAAS;GACR,EAEFE,EACEb,GAAa;EAAA,IAACc,QAAK;AAAA,UAAEX,EAAMG;;EAAkB,IAAAS,WAAA;AAAA,UAAAF,EAC5C1B,GAAa;IACb6B,WAAWC,OACVd,EAAMe,UAAUD,EAAI,EACbd,EAAMa,YAAY;IACzB,IAAAD,WAAA;AAAA,mBAEO;MACP,IAAMR,IAAcH,GAAM;AAC1B,UAAI,CAACG,EAAa,QAAOJ,EAAMa,YAAY;MAG3C,IAAIG;AACJ,MAAIhB,EAAMgB,QACTA,IAAQhB,EAAMgB,UAEVV,MAAkB,QAAQC,MAAaH,OAG1CE,IAAgBb,EAAsB,EACrC4B,MAAM7B,EAFLY,EAAYc,KAAKC,SAAqC,EAAE,CAE5B,EAC7B,CAAC,EACFZ,IAAWH,IAEZY,IAAQV;MAGT,IAAMgB,IAA0CC,OAAOC,YACtDD,OAAOE,QAAQzB,EAAM0B,WAAW,EAAE,CAAC,CAACC,KAAK,CAACC,GAAYC,OAAe,CACpED,GACA,OAAOE,IAAkC,EAAE,KAC1C9B,EAAMG,MAAM4B,KAAK;OAAEC,MAAMH;OAAW,GAAGC;OAAQ,CAAC,CACjD,CACF,CAAC;AAED,aAAApB,EACEvB,GAAa;OAAQ6B;OAAK,IAAAJ,WAAA;AAAA,eAAAF,EACzBtB,GAAc;SAAWkC;SAAQ,IAAAV,WAAA;AAAA,iBAAAF,EAChCrB,GAAkB,EAAA,IAAAuB,WAAA;AAAA,kBAAAF,EACjBxB,GAAQ;YAAA,IAACgC,OAAI;AAAA,oBAAEd,EAAYc;;YAAI,IAAEe,WAAQ;AAAA,oBAAEjC,EAAMiC;;YAAQ,CAAA;aAAA,CAAA;;SAAA,CAAA;;OAAA,CAAA;SAK3D;;IAAA,CAAA;;EAAA,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xmachines/play-solid",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.23",
|
|
4
4
|
"description": "SolidJS renderer for XMachines Play architecture",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"catalog",
|
|
@@ -30,15 +30,17 @@
|
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "vite build && tsc --build",
|
|
33
|
-
"clean": "rm -rf dist *.tsbuildinfo coverage .vitest-attachments test/browser/__screenshots__",
|
|
33
|
+
"clean": "rm -rf dist *.tsbuildinfo coverage .vitest-attachments test/browser/__screenshots__ node_modules/.vite*",
|
|
34
|
+
"lint": "oxlint .",
|
|
35
|
+
"format": "oxfmt .",
|
|
34
36
|
"test": "vitest",
|
|
35
37
|
"test:watch": "vitest",
|
|
36
38
|
"test:ui": "vitest --ui",
|
|
37
39
|
"prepublishOnly": "npm run build"
|
|
38
40
|
},
|
|
39
41
|
"dependencies": {
|
|
40
|
-
"@xmachines/play-actor": "1.0.0-beta.
|
|
41
|
-
"@xmachines/play-signals": "1.0.0-beta.
|
|
42
|
+
"@xmachines/play-actor": "1.0.0-beta.23",
|
|
43
|
+
"@xmachines/play-signals": "1.0.0-beta.23"
|
|
42
44
|
},
|
|
43
45
|
"devDependencies": {
|
|
44
46
|
"@json-render/core": "^0.16.0",
|
|
@@ -47,9 +49,11 @@
|
|
|
47
49
|
"@solidjs/testing-library": "^0.8.10",
|
|
48
50
|
"@testing-library/jest-dom": "^6.9.1",
|
|
49
51
|
"@types/node": "^25.5.0",
|
|
50
|
-
"@xmachines/shared": "1.0.0-beta.
|
|
52
|
+
"@xmachines/shared": "1.0.0-beta.23",
|
|
51
53
|
"@xstate/store": ">=3.17.0",
|
|
52
54
|
"jsdom": "^29.0.1",
|
|
55
|
+
"oxfmt": "^0.43.0",
|
|
56
|
+
"oxlint": "^1.57.0",
|
|
53
57
|
"solid-js": "^1.9.12",
|
|
54
58
|
"typescript": "^5.9.3 || ^6.0.2",
|
|
55
59
|
"vite": "^8.0.0",
|