@xmachines/docs 1.0.0-beta.9 → 1.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 +135 -7
- package/api/@xmachines/play/README.md +159 -39
- package/api/@xmachines/play/classes/NonNullableError.md +189 -0
- package/api/@xmachines/play/classes/PlayError.md +251 -0
- package/api/@xmachines/play/functions/assertNonNullable.md +56 -0
- package/api/@xmachines/play/type-aliases/PlayEvent.md +6 -6
- package/api/@xmachines/play-actor/README.md +153 -160
- package/api/@xmachines/play-actor/classes/AbstractActor.md +106 -121
- package/api/@xmachines/play-actor/functions/attachRenderErrorHandler.md +40 -0
- package/api/@xmachines/play-actor/functions/toAtomState.md +33 -0
- package/api/@xmachines/play-actor/functions/typedSpec.md +54 -0
- package/api/@xmachines/play-actor/interfaces/BaseActorProviderProps.md +46 -0
- package/api/@xmachines/play-actor/interfaces/BaseViewContextValue.md +33 -0
- package/api/@xmachines/play-actor/interfaces/PlaySpec.md +28 -0
- package/api/@xmachines/play-actor/interfaces/Routable.md +6 -21
- package/api/@xmachines/play-actor/interfaces/Viewable.md +12 -6
- package/api/@xmachines/play-dom/README.md +385 -0
- package/api/@xmachines/play-dom/classes/PlayRenderer.md +115 -0
- package/api/@xmachines/play-dom/functions/createPlayUI.md +28 -0
- package/api/@xmachines/play-dom/functions/createRenderer.md +44 -0
- package/api/@xmachines/play-dom/functions/defineRegistry.md +26 -0
- package/api/@xmachines/play-dom/functions/renderSpec.md +67 -0
- package/api/@xmachines/play-dom/interfaces/ComponentContext.md +23 -0
- package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +34 -0
- package/api/@xmachines/play-dom/interfaces/DefineRegistryResult.md +17 -0
- package/api/@xmachines/play-dom/interfaces/DomRenderContext.md +28 -0
- package/api/@xmachines/play-dom/interfaces/EventHandle.md +15 -0
- package/api/@xmachines/play-dom/interfaces/MountOptions.md +18 -0
- package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +30 -0
- package/api/@xmachines/play-dom/interfaces/RenderSpecOptions.md +26 -0
- package/api/@xmachines/play-dom/interfaces/UIProviderOptions.md +32 -0
- package/api/@xmachines/play-dom/type-aliases/ActionFn.md +46 -0
- package/api/@xmachines/play-dom/type-aliases/Actions.md +18 -0
- package/api/@xmachines/play-dom/type-aliases/BaseComponentProps.md +114 -0
- package/api/@xmachines/play-dom/type-aliases/CatalogHasActions.md +25 -0
- package/api/@xmachines/play-dom/type-aliases/ComponentFn.md +26 -0
- package/api/@xmachines/play-dom/type-aliases/ComponentRegistry.md +15 -0
- package/api/@xmachines/play-dom/type-aliases/ConfirmHandler.md +44 -0
- package/api/@xmachines/play-dom/type-aliases/DefineRegistryOptions.md +39 -0
- package/api/@xmachines/play-dom/type-aliases/DomComponentRenderer.md +20 -0
- package/api/@xmachines/play-dom/type-aliases/DomRegistry.md +9 -0
- package/api/@xmachines/play-dom/type-aliases/DomSchema.md +9 -0
- package/api/@xmachines/play-dom/type-aliases/MountFn.md +27 -0
- package/api/@xmachines/play-dom/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-dom/type-aliases/SetState.md +30 -0
- package/api/@xmachines/play-dom/variables/schema.md +62 -0
- package/api/@xmachines/play-dom-router/README.md +272 -0
- package/api/@xmachines/play-dom-router/functions/connectRouter.md +43 -0
- package/api/@xmachines/{play-router → play-dom-router}/functions/createBrowserHistory.md +10 -2
- package/api/@xmachines/play-dom-router/functions/createRouteMap.md +39 -0
- package/api/@xmachines/play-dom-router/functions/createRouter.md +54 -0
- package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +176 -0
- package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +69 -0
- package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +15 -0
- package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +129 -0
- package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +68 -0
- package/api/@xmachines/play-dom-router/interfaces/RouteLookupContract.md +54 -0
- package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +121 -0
- package/api/@xmachines/play-dom-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +27 -0
- package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +104 -0
- package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +28 -0
- package/api/@xmachines/play-react/README.md +185 -333
- package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +46 -42
- package/api/@xmachines/play-react/functions/ActionProvider.md +21 -0
- package/api/@xmachines/play-react/functions/JSONUIProvider.md +21 -0
- package/api/@xmachines/play-react/functions/Renderer.md +21 -0
- package/api/@xmachines/play-react/functions/StateProvider.md +27 -0
- package/api/@xmachines/play-react/functions/ValidationProvider.md +21 -0
- package/api/@xmachines/play-react/functions/VisibilityProvider.md +21 -0
- package/api/@xmachines/play-react/functions/defineRegistry.md +49 -0
- package/api/@xmachines/play-react/functions/useActor.md +13 -0
- package/api/@xmachines/play-react/functions/useBoundProp.md +45 -0
- package/api/@xmachines/play-react/functions/usePlayView.md +32 -0
- package/api/@xmachines/play-react/functions/useSignalEffect.md +29 -20
- package/api/@xmachines/play-react/interfaces/ActionProviderProps.md +15 -0
- package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +27 -0
- package/api/@xmachines/play-react/interfaces/ComponentContext.md +37 -0
- package/api/@xmachines/play-react/interfaces/JSONUIProviderProps.md +22 -0
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +7 -7
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +6 -6
- package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +26 -0
- package/api/@xmachines/play-react/interfaces/RendererProps.md +17 -0
- package/api/@xmachines/play-react/interfaces/StateProviderProps.md +16 -0
- package/api/@xmachines/play-react/interfaces/ValidationProviderProps.md +14 -0
- package/api/@xmachines/play-react/interfaces/ViewContextValue.md +20 -0
- package/api/@xmachines/play-react/interfaces/VisibilityProviderProps.md +13 -0
- package/api/@xmachines/play-react/type-aliases/AnyPlayActor.md +11 -0
- package/api/@xmachines/play-react/type-aliases/ComponentFn.md +36 -0
- package/api/@xmachines/play-react/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-react/variables/ActorProvider.md +33 -0
- package/api/@xmachines/play-react/variables/PlayRenderer.md +6 -56
- package/api/@xmachines/play-react/variables/PlayUIProvider.md +43 -0
- package/api/@xmachines/play-react-router/README.md +130 -115
- package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +19 -242
- package/api/@xmachines/play-react-router/classes/RouteMap.md +48 -36
- package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +45 -0
- package/api/@xmachines/play-react-router/functions/createRouteMap.md +39 -0
- package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +23 -12
- package/api/@xmachines/play-react-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderBaseProps.md +32 -0
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +25 -9
- package/api/@xmachines/play-react-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +19 -9
- package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-react-router/type-aliases/PlayRouterBridgeConstructor.md +30 -0
- package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +32 -0
- package/api/@xmachines/play-router/README.md +275 -352
- package/api/@xmachines/play-router/classes/RouteMap.md +149 -0
- package/api/@xmachines/play-router/classes/RouterBridgeBase.md +21 -221
- package/api/@xmachines/play-router/functions/buildPlayRouteEvent.md +32 -0
- package/api/@xmachines/play-router/functions/buildRouteTree.md +12 -2
- package/api/@xmachines/play-router/functions/createRouteMap.md +22 -36
- package/api/@xmachines/play-router/functions/createRouteMapFromTree.md +46 -0
- package/api/@xmachines/play-router/functions/detectDuplicateRoutes.md +14 -7
- package/api/@xmachines/play-router/functions/extractMachineRoutes.md +10 -46
- package/api/@xmachines/play-router/functions/extractQuery.md +22 -0
- package/api/@xmachines/play-router/functions/extractRouteParams.md +54 -0
- package/api/@xmachines/play-router/functions/findRouteById.md +2 -2
- package/api/@xmachines/play-router/functions/findRouteByPath.md +2 -2
- package/api/@xmachines/play-router/functions/getNavigableRoutes.md +2 -2
- package/api/@xmachines/play-router/functions/getRoutableRoutes.md +2 -2
- package/api/@xmachines/play-router/functions/getTransitionReachableRoutes.md +43 -0
- package/api/@xmachines/play-router/functions/isRouteReachable.md +38 -0
- package/api/@xmachines/play-router/functions/machineToGraph.md +19 -0
- package/api/@xmachines/play-router/functions/routeExists.md +2 -2
- package/api/@xmachines/play-router/functions/sanitizePathname.md +40 -0
- package/api/@xmachines/play-router/functions/validateRouteFormat.md +10 -9
- package/api/@xmachines/play-router/functions/validateStateExists.md +9 -9
- package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +13 -0
- package/api/@xmachines/play-router/interfaces/LocationLike.md +27 -0
- package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +15 -0
- package/api/@xmachines/play-router/interfaces/MachineNodeData.md +17 -0
- package/api/@xmachines/play-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-router/interfaces/ResolvedRoutePath.md +17 -0
- package/api/@xmachines/play-router/interfaces/RoutableActor.md +64 -0
- package/api/@xmachines/play-router/interfaces/RouteInfo.md +11 -11
- package/api/@xmachines/play-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-router/interfaces/RouteMapping.md +27 -0
- package/api/@xmachines/play-router/interfaces/RouteMatch.md +12 -0
- package/api/@xmachines/play-router/interfaces/RouteNode.md +13 -13
- package/api/@xmachines/play-router/interfaces/RouteObject.md +5 -5
- package/api/@xmachines/play-router/interfaces/RouteTree.md +8 -7
- package/api/@xmachines/play-router/interfaces/RouteWatcherHandle.md +55 -0
- package/api/@xmachines/play-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-router/interfaces/WindowLike.md +65 -0
- package/api/@xmachines/play-router/type-aliases/MachineGraph.md +20 -0
- package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +2 -2
- package/api/@xmachines/play-signals/README.md +117 -65
- package/api/@xmachines/play-signals/functions/watchSignal.md +42 -0
- package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +7 -5
- package/api/@xmachines/play-signals/interfaces/SignalComputed.md +3 -3
- package/api/@xmachines/play-signals/interfaces/SignalOptions.md +7 -5
- package/api/@xmachines/play-signals/interfaces/SignalState.md +4 -4
- package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +5 -5
- package/api/@xmachines/play-signals/namespaces/Signal/README.md +1 -1
- package/api/@xmachines/play-signals/namespaces/Signal/classes/Computed.md +7 -7
- package/api/@xmachines/play-signals/namespaces/Signal/classes/State.md +8 -8
- package/api/@xmachines/play-signals/namespaces/Signal/interfaces/Options.md +7 -7
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/README.md +1 -1
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/classes/Watcher.md +9 -9
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/currentComputed.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/hasSinks.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/hasSources.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/introspectSinks.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/introspectSources.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/untrack.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/variables/unwatched.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/variables/watched.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/variables/isComputed.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/variables/isState.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/variables/isWatcher.md +2 -2
- package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +2 -2
- package/api/@xmachines/play-solid/README.md +196 -233
- package/api/@xmachines/play-solid/functions/ActionProvider.md +19 -0
- package/api/@xmachines/play-solid/functions/JSONUIProvider.md +21 -0
- package/api/@xmachines/play-solid/functions/Renderer.md +21 -0
- package/api/@xmachines/play-solid/functions/StateProvider.md +19 -0
- package/api/@xmachines/play-solid/functions/ValidationProvider.md +19 -0
- package/api/@xmachines/play-solid/functions/VisibilityProvider.md +20 -0
- package/api/@xmachines/play-solid/functions/defineRegistry.md +49 -0
- package/api/@xmachines/play-solid/functions/useAction.md +24 -0
- package/api/@xmachines/play-solid/functions/useActions.md +13 -0
- package/api/@xmachines/play-solid/functions/useActor.md +13 -0
- package/api/@xmachines/play-solid/functions/useBoundProp.md +45 -0
- package/api/@xmachines/play-solid/functions/useFieldValidation.md +29 -0
- package/api/@xmachines/play-solid/functions/useIsVisible.md +19 -0
- package/api/@xmachines/play-solid/functions/useOptionalValidation.md +13 -0
- package/api/@xmachines/play-solid/functions/usePlayView.md +30 -0
- package/api/@xmachines/play-solid/functions/useStateBinding.md +25 -0
- package/api/@xmachines/play-solid/functions/useStateStore.md +13 -0
- package/api/@xmachines/play-solid/functions/useStateValue.md +25 -0
- package/api/@xmachines/play-solid/functions/useVisibility.md +13 -0
- package/api/@xmachines/play-solid/interfaces/ActionProviderProps.md +12 -0
- package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +30 -0
- package/api/@xmachines/play-solid/interfaces/ComponentContext.md +37 -0
- package/api/@xmachines/play-solid/interfaces/DefineRegistryResult.md +15 -0
- package/api/@xmachines/play-solid/interfaces/JSONUIProviderProps.md +22 -0
- package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +26 -0
- package/api/@xmachines/play-solid/interfaces/RendererProps.md +17 -0
- package/api/@xmachines/play-solid/interfaces/StateProviderProps.md +13 -0
- package/api/@xmachines/play-solid/interfaces/ValidationProviderProps.md +11 -0
- package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +21 -0
- package/api/@xmachines/play-solid/type-aliases/AnyPlayActor.md +11 -0
- package/api/@xmachines/play-solid/type-aliases/ComponentFn.md +36 -0
- package/api/@xmachines/play-solid/type-aliases/ComponentRegistry.md +11 -0
- package/api/@xmachines/play-solid/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-solid/type-aliases/SetState.md +21 -0
- package/api/@xmachines/play-solid/type-aliases/VisibilityProviderProps.md +9 -0
- package/api/@xmachines/play-solid/variables/ActorContext.md +13 -0
- package/api/@xmachines/play-solid/variables/ActorProvider.md +27 -0
- package/api/@xmachines/play-solid/variables/PlayRenderer.md +6 -62
- package/api/@xmachines/play-solid/variables/PlayUIProvider.md +26 -0
- package/api/@xmachines/play-solid-router/README.md +151 -559
- package/api/@xmachines/play-solid-router/classes/RouteMap.md +31 -32
- package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +27 -242
- package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +44 -0
- package/api/@xmachines/play-solid-router/functions/createRouteMap.md +18 -11
- package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +99 -114
- package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderBaseProps.md +30 -0
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +25 -9
- package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +20 -7
- package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +34 -0
- package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +8 -4
- package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +22 -19
- package/api/@xmachines/play-solid-router/variables/PlayRouterProvider.md +52 -0
- package/api/@xmachines/play-svelte/README.md +270 -0
- package/api/@xmachines/play-svelte/functions/defineRegistry.md +31 -0
- package/api/@xmachines/play-svelte/functions/getActorContext.md +21 -0
- package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +19 -0
- package/api/@xmachines/play-svelte/functions/setActorContext.md +19 -0
- package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +44 -0
- package/api/@xmachines/play-svelte/interfaces/BaseComponentProps.md +29 -0
- package/api/@xmachines/play-svelte/interfaces/ComponentContext.md +29 -0
- package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +24 -0
- package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +43 -0
- package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +24 -0
- package/api/@xmachines/play-svelte/type-aliases/ActionFn.md +30 -0
- package/api/@xmachines/play-svelte/type-aliases/Actions.md +17 -0
- package/api/@xmachines/play-svelte/type-aliases/AnyPlayActor.md +11 -0
- package/api/@xmachines/play-svelte/type-aliases/ComponentFn.md +18 -0
- package/api/@xmachines/play-svelte/type-aliases/JSONUIProviderProps.md +7 -0
- package/api/@xmachines/play-svelte/type-aliases/PlayRenderer.md +9 -0
- package/api/@xmachines/play-svelte/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-svelte/type-aliases/SetState.md +21 -0
- package/api/@xmachines/play-svelte/variables/PlayRenderer.md +9 -0
- package/api/@xmachines/play-svelte-spa-router/README.md +197 -0
- package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +149 -0
- package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +32 -0
- package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +39 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +17 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +129 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +27 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +104 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +65 -0
- package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +9 -0
- package/api/@xmachines/play-sveltekit-router/README.md +212 -0
- package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +149 -0
- package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +32 -0
- package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +39 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +13 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +27 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +129 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +27 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +104 -0
- package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +9 -0
- package/api/@xmachines/play-tanstack-react-router/README.md +155 -125
- package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +48 -36
- package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +31 -252
- package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +45 -0
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +22 -36
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +23 -12
- package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +28 -0
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderBaseProps.md +32 -0
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +25 -9
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +19 -9
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +6 -6
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterBridgeConstructor.md +30 -0
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +2 -2
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +40 -18
- package/api/@xmachines/play-tanstack-react-router/variables/PlayRouterProvider.md +34 -0
- package/api/@xmachines/play-tanstack-router/README.md +61 -0
- package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +131 -0
- package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouteMapLike.md +57 -0
- package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouterLike.md +100 -0
- package/api/@xmachines/play-tanstack-solid-router/README.md +216 -175
- package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +31 -32
- package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +121 -0
- package/api/@xmachines/play-tanstack-solid-router/functions/createPlayRouterProvider.md +44 -0
- package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +18 -11
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderBaseProps.md +31 -0
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +23 -9
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +14 -10
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterBridgeConstructor.md +30 -0
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +8 -4
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +3 -3
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +40 -18
- package/api/@xmachines/play-tanstack-solid-router/variables/PlayRouterProvider.md +33 -0
- package/api/@xmachines/play-vue/README.md +190 -210
- package/api/@xmachines/play-vue/functions/defineRegistry.md +32 -0
- package/api/@xmachines/play-vue/functions/getPlayViewContext.md +28 -0
- package/api/@xmachines/play-vue/functions/useActor.md +13 -0
- package/api/@xmachines/play-vue/functions/useBoundProp.md +45 -0
- package/api/@xmachines/play-vue/interfaces/ActionProviderProps.md +12 -0
- package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +25 -0
- package/api/@xmachines/play-vue/interfaces/ComponentContext.md +37 -0
- package/api/@xmachines/play-vue/interfaces/DefineRegistryResult.md +15 -0
- package/api/@xmachines/play-vue/interfaces/JSONUIProviderProps.md +21 -0
- package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +24 -0
- package/api/@xmachines/play-vue/interfaces/RendererProps.md +17 -0
- package/api/@xmachines/play-vue/interfaces/StateProviderProps.md +15 -0
- package/api/@xmachines/play-vue/interfaces/ValidationProviderProps.md +11 -0
- package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +21 -0
- package/api/@xmachines/play-vue/interfaces/VisibilityProviderProps.md +5 -0
- package/api/@xmachines/play-vue/type-aliases/AnyPlayActor.md +11 -0
- package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +16 -0
- package/api/@xmachines/play-vue/type-aliases/ComponentFn.md +35 -0
- package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +15 -0
- package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +22 -0
- package/api/@xmachines/play-vue/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-vue/variables/ActionProvider.md +64 -0
- package/api/@xmachines/play-vue/variables/JSONUIProvider.md +105 -0
- package/api/@xmachines/play-vue/variables/PlayRenderer.md +2 -2
- package/api/@xmachines/play-vue/variables/Renderer.md +88 -0
- package/api/@xmachines/play-vue/variables/StateProvider.md +79 -0
- package/api/@xmachines/play-vue/variables/ValidationProvider.md +55 -0
- package/api/@xmachines/play-vue/variables/VisibilityProvider.md +40 -0
- package/api/@xmachines/play-vue-router/README.md +173 -486
- package/api/@xmachines/play-vue-router/classes/RouteMap.md +56 -116
- package/api/@xmachines/play-vue-router/classes/VueRouterBridge.md +23 -271
- package/api/@xmachines/play-vue-router/functions/createRouteMap.md +26 -6
- package/api/@xmachines/play-vue-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-vue-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-vue-router/interfaces/RouteMapping.md +20 -8
- package/api/@xmachines/play-vue-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +8 -4
- package/api/@xmachines/play-vue-router/variables/PlayRouterProvider.md +12 -6
- package/api/@xmachines/play-xstate/README.md +203 -354
- package/api/@xmachines/play-xstate/classes/PlayerActor.md +195 -201
- package/api/@xmachines/play-xstate/functions/buildRouteUrl.md +24 -20
- package/api/@xmachines/play-xstate/functions/composeGuards.md +8 -3
- package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +8 -3
- package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +43 -0
- package/api/@xmachines/play-xstate/functions/definePlayer.md +14 -63
- package/api/@xmachines/play-xstate/functions/deriveRoute.md +3 -3
- package/api/@xmachines/play-xstate/functions/eventMatches.md +8 -3
- package/api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md +3 -3
- package/api/@xmachines/play-xstate/functions/hasContext.md +8 -5
- package/api/@xmachines/play-xstate/functions/isAbsoluteRoute.md +2 -2
- package/api/@xmachines/play-xstate/functions/negateGuard.md +8 -3
- package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +10 -14
- package/api/@xmachines/play-xstate/interfaces/PlayerFactoryResumeOptions.md +22 -0
- package/api/@xmachines/play-xstate/interfaces/PlayerOptions.md +14 -16
- package/api/@xmachines/play-xstate/interfaces/RouteContext.md +15 -13
- package/api/@xmachines/play-xstate/interfaces/RouteObject.md +17 -0
- package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +8 -3
- package/api/@xmachines/play-xstate/type-aliases/Guard.md +8 -6
- package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +9 -7
- package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +15 -18
- package/api/@xmachines/play-xstate/type-aliases/RouteMachineConfig.md +15 -5
- package/api/@xmachines/play-xstate/type-aliases/RouteMetadata.md +9 -0
- package/api/@xmachines/play-xstate/type-aliases/RouteStateNode.md +22 -6
- package/api/@xmachines/shared/README.md +95 -295
- package/api/@xmachines/shared/vite-aliases/README.md +11 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmAliases.md +38 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmCacheDir.md +27 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmOptimizeDeps.md +35 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmResolve.md +42 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmSvelteRunes.md +33 -0
- package/api/@xmachines/shared/vitest/README.md +12 -0
- package/api/@xmachines/shared/vitest/functions/defineXmBrowserConfig.md +42 -0
- package/api/@xmachines/shared/vitest/functions/defineXmVitestConfig.md +34 -0
- package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +16 -0
- package/api/README.md +6 -7
- package/api/llms.txt +72 -23
- package/contributing/README.md +10 -0
- package/contributing/architecture.md +601 -0
- package/contributing/configuration.md +368 -0
- package/contributing/deployment.md +333 -0
- package/contributing/development.md +503 -0
- package/contributing/testing.md +461 -0
- package/examples/@xmachines/play-dom-demo/README.md +181 -0
- package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +24 -0
- package/examples/@xmachines/play-dom-demo/functions/initShell.md +25 -0
- package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-dom-demo/variables/About.md +12 -0
- package/examples/@xmachines/play-dom-demo/variables/Contact.md +12 -0
- package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Home.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Login.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +16 -0
- package/examples/@xmachines/play-dom-demo/variables/Navigation.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Overview.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Profile.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Settings.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Stats.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-dom-router-demo/README.md +145 -0
- package/examples/@xmachines/play-react-demo/README.md +187 -0
- package/examples/@xmachines/play-react-demo/functions/App.md +13 -0
- package/examples/@xmachines/play-react-demo/functions/DebugPanel.md +20 -0
- package/examples/@xmachines/play-react-demo/functions/HeaderNav.md +20 -0
- package/examples/@xmachines/play-react-demo/functions/Shell.md +22 -0
- package/examples/@xmachines/play-react-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-react-demo/variables/About.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Contact.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Dashboard.md +15 -0
- package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +16 -0
- package/examples/@xmachines/play-react-demo/variables/Home.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Login.md +16 -0
- package/examples/@xmachines/play-react-demo/variables/NavBar.md +16 -0
- package/examples/@xmachines/play-react-demo/variables/NavBarView.md +15 -0
- package/examples/@xmachines/play-react-demo/variables/Navigation.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Overview.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Profile.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Settings.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Shell.md +19 -0
- package/examples/@xmachines/play-react-demo/variables/Stats.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-react-router-demo/README.md +151 -0
- package/examples/@xmachines/play-solid-demo/README.md +187 -0
- package/examples/@xmachines/play-solid-demo/functions/App.md +13 -0
- package/examples/@xmachines/play-solid-demo/functions/DebugPanel.md +20 -0
- package/examples/@xmachines/play-solid-demo/functions/HeaderNav.md +20 -0
- package/examples/@xmachines/play-solid-demo/functions/Shell.md +22 -0
- package/examples/@xmachines/play-solid-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/About.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Contact.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +17 -0
- package/examples/@xmachines/play-solid-demo/variables/Home.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Login.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/NavBar.md +11 -0
- package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +15 -0
- package/examples/@xmachines/play-solid-demo/variables/Navigation.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Overview.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Profile.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Settings.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Shell.md +18 -0
- package/examples/@xmachines/play-solid-demo/variables/Stats.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-solid-router-demo/README.md +137 -0
- package/examples/@xmachines/play-svelte-demo/README.md +143 -0
- package/examples/@xmachines/play-svelte-demo/type-aliases/App.md +9 -0
- package/examples/@xmachines/play-svelte-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-svelte-demo/variables/App.md +9 -0
- package/examples/@xmachines/play-svelte-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-svelte-spa-router-demo/README.md +129 -0
- package/examples/@xmachines/play-sveltekit-router-demo/README.md +133 -0
- package/examples/@xmachines/play-tanstack-react-router-demo/README.md +156 -0
- package/examples/@xmachines/play-tanstack-solid-router-demo/README.md +139 -0
- package/examples/@xmachines/play-vue-demo/README.md +183 -0
- package/examples/@xmachines/play-vue-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-vue-demo/variables/App.md +9 -0
- package/examples/@xmachines/play-vue-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-vue-router-demo/README.md +139 -0
- package/examples/README.md +78 -30
- package/examples/basic-state-machine.md +73 -31
- package/examples/form-validation.md +259 -118
- package/examples/multi-router-integration.md +312 -194
- package/examples/routing-patterns.md +228 -189
- package/examples/traffic-light.md +112 -65
- package/guides/README.md +7 -21
- package/guides/actor-model.md +180 -0
- package/guides/getting-started.md +627 -137
- package/guides/signals.md +166 -0
- package/guides/state-machines.md +284 -0
- package/package.json +21 -7
- package/rfc/broker.md +100 -0
- package/rfc/browser.md +44 -0
- package/rfc/cli.md +118 -0
- package/rfc/git.md +61 -0
- package/rfc/mcp.md +43 -0
- package/rfc/node.md +36 -0
- package/rfc/play.md +472 -0
- package/rfc/rest.md +102 -0
- package/rfc/run.md +159 -0
- package/rfc/streams.md +168 -0
- package/api/@xmachines/play-actor/interfaces/ViewMetadata.md +0 -17
- package/api/@xmachines/play-catalog/README.md +0 -331
- package/api/@xmachines/play-catalog/functions/defineCatalog.md +0 -98
- package/api/@xmachines/play-catalog/functions/defineComponents.md +0 -134
- package/api/@xmachines/play-catalog/type-aliases/Catalog.md +0 -48
- package/api/@xmachines/play-catalog/type-aliases/ComponentsFor.md +0 -20
- package/api/@xmachines/play-catalog/type-aliases/InferComponentProps.md +0 -65
- package/api/@xmachines/play-catalog/type-aliases/NoExtraKeys.md +0 -17
- package/api/@xmachines/play-react/interfaces/PlayRendererProps.md +0 -15
- package/api/@xmachines/play-react-router/functions/PlayRouterProvider.md +0 -19
- package/api/@xmachines/play-react-router-demo/README.md +0 -137
- package/api/@xmachines/play-router/classes/BaseRouteMap.md +0 -142
- package/api/@xmachines/play-router/functions/connectRouter.md +0 -67
- package/api/@xmachines/play-router/functions/crawlMachine.md +0 -92
- package/api/@xmachines/play-router/functions/createRouter.md +0 -76
- package/api/@xmachines/play-router/functions/extractRoute.md +0 -45
- package/api/@xmachines/play-router/interfaces/BaseRouteMapping.md +0 -27
- package/api/@xmachines/play-router/interfaces/BrowserHistory.md +0 -172
- package/api/@xmachines/play-router/interfaces/BrowserWindow.md +0 -69
- package/api/@xmachines/play-router/interfaces/ConnectRouterOptions.md +0 -13
- package/api/@xmachines/play-router/interfaces/RouteMap.md +0 -56
- package/api/@xmachines/play-router/interfaces/StateVisit.md +0 -15
- package/api/@xmachines/play-router/interfaces/VanillaRouter.md +0 -28
- package/api/@xmachines/play-router-demo/README.md +0 -137
- package/api/@xmachines/play-solid/interfaces/PlayRendererProps.md +0 -15
- package/api/@xmachines/play-solid-router/functions/PlayRouterProvider.md +0 -19
- package/api/@xmachines/play-solid-router-demo/README.md +0 -127
- package/api/@xmachines/play-tanstack-react-router/functions/PlayRouterProvider.md +0 -19
- package/api/@xmachines/play-tanstack-react-router/functions/extractParams.md +0 -38
- package/api/@xmachines/play-tanstack-react-router/functions/extractQueryParams.md +0 -33
- package/api/@xmachines/play-tanstack-react-router/variables/extractMachineRoutes.md +0 -64
- package/api/@xmachines/play-tanstack-react-router-demo/README.md +0 -126
- package/api/@xmachines/play-tanstack-solid-router/classes/SolidRouterBridge.md +0 -343
- package/api/@xmachines/play-tanstack-solid-router/functions/PlayRouterProvider.md +0 -19
- package/api/@xmachines/play-tanstack-solid-router-demo/README.md +0 -126
- package/api/@xmachines/play-vue/interfaces/PlayRendererProps.md +0 -14
- package/api/@xmachines/play-vue-router/classes/VueBaseRouteMap.md +0 -201
- package/api/@xmachines/play-vue-router-demo/README.md +0 -133
- package/api/@xmachines/play-xstate/functions/mergeViewProps.md +0 -26
- package/api/@xmachines/play-xstate/functions/stateMatches.md +0 -25
- package/api/@xmachines/play-xstate/functions/validateComponentBinding.md +0 -39
- package/api/@xmachines/play-xstate/functions/validateViewProps.md +0 -80
- package/api/@xmachines/play-xstate/interfaces/CatalogEntry.md +0 -16
- package/api/@xmachines/play-xstate/type-aliases/Catalog.md +0 -21
- package/api/@xmachines/play-xstate/type-aliases/ValidationResult.md +0 -17
- package/api/@xmachines/play-xstate/type-aliases/ViewMergeContext.md +0 -35
- package/api/@xmachines/shared/functions/defineXmVitestConfig.md +0 -29
- package/api/@xmachines/shared/functions/xmAliases.md +0 -24
- package/guides/installation.md +0 -323
|
@@ -1,646 +1,230 @@
|
|
|
1
|
-
[
|
|
1
|
+
[API](../../README.md) / @xmachines/play-solid-router
|
|
2
2
|
|
|
3
3
|
# @xmachines/play-solid-router
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
SolidJS Router adapter for the XMachines Universal Player Architecture. Provides bidirectional synchronisation between a `PlayerActor`'s state machine routes and the browser URL via `@solidjs/router`.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
[](https://www.npmjs.com/package/@xmachines/play-solid-router)
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
`@xmachines/play-solid-router` provides seamless integration between SolidJS Router and XMachines state machines. Built on Solid's reactive primitives, it enables zero-adaptation signals synchronization.
|
|
12
|
-
|
|
13
|
-
Per [RFC Play v1](https://gitlab.com/xmachin-es/rfc/-/blob/main/src/play-v1.md), this package implements:
|
|
14
|
-
|
|
15
|
-
- **Actor Authority (INV-01):** State machine controls navigation, router reflects decisions
|
|
16
|
-
- **Passive Infrastructure (INV-04):** Router observes `actor.currentRoute` signal
|
|
17
|
-
- **Signal-Only Reactivity (INV-05):** TC39 watcher lifecycle + Solid reactive owner integration
|
|
18
|
-
|
|
19
|
-
**Key Benefits:**
|
|
20
|
-
|
|
21
|
-
- **Bridge-first:** Extends shared `RouterBridgeBase` policy used by other adapters
|
|
22
|
-
- **Automatic tracking:** Uses Solid reactivity for router→actor while base class handles actor→router watcher lifecycle
|
|
23
|
-
- **Fine-grained reactivity:** Updates only affected components
|
|
24
|
-
- **Logic-driven navigation:** Business logic in state machines, not components
|
|
25
|
-
- **Type-safe parameters:** Route params flow through state machine context
|
|
26
|
-
|
|
27
|
-
**Framework Compatibility:**
|
|
28
|
-
|
|
29
|
-
- SolidJS 1.8.4+ (signals-native architecture)
|
|
30
|
-
- @solidjs/router 0.13.0+ (modern routing primitives)
|
|
31
|
-
- TC39 Signals polyfill integration
|
|
10
|
+
Part of the [xmachines-js monorepo](../../README.md).
|
|
32
11
|
|
|
33
12
|
## Installation
|
|
34
13
|
|
|
35
14
|
```bash
|
|
36
|
-
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Peer dependencies:**
|
|
40
|
-
|
|
41
|
-
- `@solidjs/router` ^0.13.0 — SolidJS Router library
|
|
42
|
-
- `solid-js` ^1.8.0 — SolidJS runtime
|
|
43
|
-
- `@xmachines/play-solid` — Solid renderer (`PlayRenderer`)
|
|
44
|
-
- `@xmachines/play-actor` — Actor base
|
|
45
|
-
- `@xmachines/play-router` — Route extraction
|
|
46
|
-
- `@xmachines/play-signals` — TC39 Signals primitives
|
|
47
|
-
|
|
48
|
-
## Quick Start
|
|
49
|
-
|
|
50
|
-
```typescript
|
|
51
|
-
import { Router, Route, useNavigate, useLocation, useParams } from '@solidjs/router';
|
|
52
|
-
import { onCleanup } from 'solid-js';
|
|
53
|
-
import { SolidRouterBridge, createRouteMap } from '@xmachines/play-solid-router';
|
|
54
|
-
import { definePlayer } from '@xmachines/play-xstate';
|
|
55
|
-
|
|
56
|
-
function App() {
|
|
57
|
-
// 1. Get SolidJS Router hooks (MUST be inside component)
|
|
58
|
-
const navigate = useNavigate();
|
|
59
|
-
const location = useLocation();
|
|
60
|
-
const params = useParams();
|
|
61
|
-
|
|
62
|
-
// 2. Create route mapping from machine routes
|
|
63
|
-
const routeMap = createRouteMap(authMachine);
|
|
64
|
-
|
|
65
|
-
// 3. Create player with state machine
|
|
66
|
-
const createPlayer = definePlayer({
|
|
67
|
-
machine: authMachine,
|
|
68
|
-
catalog: componentCatalog
|
|
69
|
-
});
|
|
70
|
-
const actor = createPlayer();
|
|
71
|
-
actor.start();
|
|
72
|
-
|
|
73
|
-
// 4. Create bridge to sync actor and router
|
|
74
|
-
const bridge = new SolidRouterBridge(
|
|
75
|
-
navigate,
|
|
76
|
-
location,
|
|
77
|
-
params,
|
|
78
|
-
actor,
|
|
79
|
-
routeMap
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
// 5. Start synchronization
|
|
83
|
-
bridge.connect();
|
|
84
|
-
|
|
85
|
-
// 6. Cleanup on component disposal
|
|
86
|
-
onCleanup(() => {
|
|
87
|
-
bridge.disconnect();
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
return (
|
|
91
|
-
<Router>
|
|
92
|
-
<Route path="/" component={HomeView} />
|
|
93
|
-
<Route path="/profile/:userId" component={ProfileView} />
|
|
94
|
-
<Route path="/settings/:section?" component={SettingsView} />
|
|
95
|
-
</Router>
|
|
96
|
-
);
|
|
97
|
-
}
|
|
15
|
+
pnpm add @xmachines/play-solid-router
|
|
98
16
|
```
|
|
99
17
|
|
|
100
|
-
|
|
18
|
+
**Peer dependencies** (must be installed separately):
|
|
101
19
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
Router adapter implementing the `RouterBridge` protocol for SolidJS Router.
|
|
105
|
-
|
|
106
|
-
**Type Signature:**
|
|
107
|
-
|
|
108
|
-
```typescript
|
|
109
|
-
class SolidRouterBridge {
|
|
110
|
-
constructor(
|
|
111
|
-
navigate: ReturnType<typeof useNavigate>,
|
|
112
|
-
location: ReturnType<typeof useLocation>,
|
|
113
|
-
params: ReturnType<typeof useParams>,
|
|
114
|
-
actor: AbstractActor<any>,
|
|
115
|
-
routeMap: RouteMap,
|
|
116
|
-
);
|
|
117
|
-
dispose(): void;
|
|
118
|
-
}
|
|
20
|
+
```bash
|
|
21
|
+
pnpm add solid-js @solidjs/router xstate
|
|
119
22
|
```
|
|
120
23
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
- `
|
|
124
|
-
- `location` - Object from `useLocation()` hook (reactive pathname, search, hash)
|
|
125
|
-
- `params` - Object from `useParams()` hook (reactive route parameters)
|
|
126
|
-
- `actor` - XMachines actor instance (from `definePlayer().actor`)
|
|
127
|
-
- `routeMap` - Bidirectional state ID ↔ path mapping
|
|
24
|
+
- `solid-js` `^1.8.0`
|
|
25
|
+
- `@solidjs/router` `^0.16.1`
|
|
26
|
+
- `xstate` `^5.31.0`
|
|
128
27
|
|
|
129
|
-
|
|
28
|
+
## Quick Start
|
|
130
29
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
30
|
+
```tsx
|
|
31
|
+
import { Router, Route, useNavigate, useLocation, useParams } from "@solidjs/router";
|
|
32
|
+
import { onCleanup, type ParentComponent } from "solid-js";
|
|
33
|
+
import { PlayRouterProvider, createRouteMap } from "@xmachines/play-solid-router";
|
|
34
|
+
import { definePlayer } from "@xmachines/play-xstate";
|
|
35
|
+
import { myMachine } from "./machine.js";
|
|
134
36
|
|
|
135
|
-
|
|
37
|
+
const actor = definePlayer({ machine: myMachine })();
|
|
38
|
+
actor.start();
|
|
136
39
|
|
|
137
|
-
|
|
138
|
-
- Updates SolidJS Router via `navigate(path)` when actor state changes
|
|
139
|
-
- Uses `createEffect(on(...))` to watch `location.pathname` signal
|
|
140
|
-
- Sends `play.route` events to actor when user navigates
|
|
141
|
-
- Prevents circular updates with path tracking and processing flags
|
|
40
|
+
const routeMap = createRouteMap(myMachine);
|
|
142
41
|
|
|
143
|
-
|
|
42
|
+
const Layout: ParentComponent = () => {
|
|
43
|
+
const navigate = useNavigate();
|
|
44
|
+
const location = useLocation();
|
|
45
|
+
const params = useParams();
|
|
144
46
|
|
|
145
|
-
|
|
47
|
+
onCleanup(() => actor.stop());
|
|
146
48
|
|
|
147
|
-
|
|
148
|
-
|
|
49
|
+
return (
|
|
50
|
+
<PlayRouterProvider
|
|
51
|
+
actor={actor}
|
|
52
|
+
routeMap={routeMap}
|
|
53
|
+
router={{ navigate, location, params }}
|
|
54
|
+
renderer={(a, router) => <MyApp actor={a} />}
|
|
55
|
+
/>
|
|
56
|
+
);
|
|
57
|
+
};
|
|
149
58
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
readonly stateId: string;
|
|
153
|
-
readonly path: string;
|
|
59
|
+
export default function App() {
|
|
60
|
+
return <Router root={Layout}>{/* one <Route> per routable state */}</Router>;
|
|
154
61
|
}
|
|
155
|
-
|
|
156
|
-
// RouteMap is a thin subclass of BaseRouteMap — no extra methods
|
|
157
|
-
class RouteMap extends BaseRouteMap {}
|
|
158
|
-
|
|
159
|
-
// Inherited API:
|
|
160
|
-
routeMap.getStateIdByPath(path: string): string | null
|
|
161
|
-
routeMap.getPathByStateId(stateId: string): string | null
|
|
162
62
|
```
|
|
163
63
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
**Constructor Parameters:**
|
|
167
|
-
|
|
168
|
-
- `mappings` - Array of `{ stateId, path }` entries:
|
|
169
|
-
- `stateId` — State machine state ID (e.g., `'#profile'`)
|
|
170
|
-
- `path` — SolidJS Router path pattern (e.g., `'/profile/:userId'`)
|
|
171
|
-
|
|
172
|
-
**Methods:**
|
|
173
|
-
|
|
174
|
-
- `getPathByStateId(stateId)` — Find path pattern from state ID
|
|
175
|
-
- `getStateIdByPath(path)` — Find state ID from path with pattern matching (supports `:param` and `:param?` syntax)
|
|
176
|
-
|
|
177
|
-
**Pattern Matching:**
|
|
178
|
-
|
|
179
|
-
Uses bucket-indexed RegExp matching for dynamic routes:
|
|
64
|
+
## API Summary
|
|
180
65
|
|
|
181
|
-
|
|
182
|
-
const routeMap = new RouteMap([{ stateId: "#settings", path: "/settings/:section?" }]);
|
|
66
|
+
### `PlayRouterProvider`
|
|
183
67
|
|
|
184
|
-
|
|
185
|
-
routeMap.getStateIdByPath("/settings/account"); // '#settings'
|
|
186
|
-
routeMap.getStateIdByPath("/settings/privacy"); // '#settings'
|
|
187
|
-
routeMap.getStateIdByPath("/other"); // null
|
|
188
|
-
```
|
|
68
|
+
A SolidJS component that wires a `PlayerActor` to Solid Router. It creates and connects a `SolidRouterBridge` on mount and disconnects it via `onCleanup` on unmount.
|
|
189
69
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
}).createMachine({
|
|
205
|
-
id: 'app',
|
|
206
|
-
initial: 'home',
|
|
207
|
-
states: {
|
|
208
|
-
home: {
|
|
209
|
-
meta: { route: '/', view: { component: 'Home' } }
|
|
210
|
-
},
|
|
211
|
-
about: {
|
|
212
|
-
meta: { route: '/about', view: { component: 'About' } }
|
|
213
|
-
},
|
|
214
|
-
contact: {
|
|
215
|
-
meta: { route: '/contact', view: { component: 'Contact' } }
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
const catalog = defineCatalog({
|
|
221
|
-
Home,
|
|
222
|
-
About,
|
|
223
|
-
Contact,
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
// Component setup
|
|
227
|
-
function App() {
|
|
228
|
-
const navigate = useNavigate();
|
|
229
|
-
const location = useLocation();
|
|
230
|
-
const params = useParams();
|
|
231
|
-
|
|
232
|
-
const routeMap = createRouteMap(appMachine);
|
|
233
|
-
|
|
234
|
-
const createPlayer = definePlayer({ machine: appMachine, catalog });
|
|
235
|
-
const actor = createPlayer();
|
|
236
|
-
actor.start();
|
|
237
|
-
const bridge = new SolidRouterBridge(navigate, location, params, actor, routeMap);
|
|
238
|
-
|
|
239
|
-
onCleanup(() => bridge.dispose());
|
|
240
|
-
|
|
241
|
-
return (
|
|
242
|
-
<Router>
|
|
243
|
-
<Route path="/" component={Home} />
|
|
244
|
-
<Route path="/about" component={About} />
|
|
245
|
-
<Route path="/contact" component={Contact} />
|
|
246
|
-
</Router>
|
|
247
|
-
);
|
|
70
|
+
```tsx
|
|
71
|
+
interface PlayRouterProviderProps<TActor extends PlayActor> {
|
|
72
|
+
/** The actor to sync with Solid Router. */
|
|
73
|
+
actor: TActor;
|
|
74
|
+
/** Bidirectional route map for state ID ↔ URL path lookups. */
|
|
75
|
+
routeMap: RouteMap;
|
|
76
|
+
/**
|
|
77
|
+
* The three Solid Router hook results that drive bidirectional sync.
|
|
78
|
+
* Must be obtained via useNavigate(), useLocation(), and useParams()
|
|
79
|
+
* inside a router context.
|
|
80
|
+
*/
|
|
81
|
+
router: SolidRouterHooks;
|
|
82
|
+
/** Render callback — receives the concrete actor type and router hooks. */
|
|
83
|
+
renderer: (actor: TActor, router: SolidRouterHooks) => JSX.Element;
|
|
248
84
|
}
|
|
249
85
|
```
|
|
250
86
|
|
|
251
|
-
###
|
|
252
|
-
|
|
253
|
-
```typescript
|
|
254
|
-
// State machine with parameter routes
|
|
255
|
-
import { formatPlayRouteTransitions } from "@xmachines/play-xstate";
|
|
256
|
-
import { defineCatalog } from "@xmachines/play-catalog";
|
|
87
|
+
### `SolidRouterBridge`
|
|
257
88
|
|
|
258
|
-
|
|
259
|
-
id: 'app',
|
|
260
|
-
context: {},
|
|
261
|
-
states: {
|
|
262
|
-
profile: {
|
|
263
|
-
meta: {
|
|
264
|
-
route: '/profile/:userId',
|
|
265
|
-
view: { component: 'Profile' },
|
|
266
|
-
},
|
|
267
|
-
},
|
|
268
|
-
settings: {
|
|
269
|
-
meta: {
|
|
270
|
-
route: '/settings/:section?',
|
|
271
|
-
view: { component: 'Settings' },
|
|
272
|
-
},
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
};
|
|
89
|
+
Low-level class for manual integration. Extends `RouterBridgeBase` from `@xmachines/play-router` and uses Solid's `createEffect` for reactive router→actor sync.
|
|
276
90
|
|
|
277
|
-
|
|
278
|
-
types: {
|
|
279
|
-
context: {} as { userId?: string; section?: string },
|
|
280
|
-
events: {} as PlayRouteEvent
|
|
281
|
-
}
|
|
282
|
-
}).createMachine(formatPlayRouteTransitions(machineConfig));
|
|
91
|
+
> **Important:** `connect()` must be called inside a Solid reactive owner (component or `createRoot`). Cleanup is not automatic — call `disconnect()` (or `dispose()`) explicitly, typically in `onCleanup()`.
|
|
283
92
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
});
|
|
93
|
+
```tsx
|
|
94
|
+
import { useNavigate, useLocation, useParams, onCleanup } from "@solidjs/router";
|
|
95
|
+
import { SolidRouterBridge, RouteMap } from "@xmachines/play-solid-router";
|
|
288
96
|
|
|
289
|
-
// Router with dynamic routes
|
|
290
97
|
function App() {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
const routeMap = createRouteMap(appMachine);
|
|
98
|
+
const navigate = useNavigate();
|
|
99
|
+
const location = useLocation();
|
|
100
|
+
const params = useParams();
|
|
296
101
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
102
|
+
const routeMap = new RouteMap([
|
|
103
|
+
{ stateId: "#home", path: "/" },
|
|
104
|
+
{ stateId: "#profile", path: "/profile/:userId" },
|
|
105
|
+
]);
|
|
301
106
|
|
|
302
|
-
|
|
107
|
+
const bridge = new SolidRouterBridge(navigate, location, params, actor, routeMap);
|
|
108
|
+
bridge.connect();
|
|
109
|
+
onCleanup(() => bridge.disconnect());
|
|
303
110
|
|
|
304
|
-
|
|
305
|
-
<Router>
|
|
306
|
-
<Route path="/profile/:userId" component={Profile} />
|
|
307
|
-
<Route path="/settings/:section?" component={Settings} />
|
|
308
|
-
</Router>
|
|
309
|
-
);
|
|
111
|
+
return <div>...</div>;
|
|
310
112
|
}
|
|
311
113
|
```
|
|
312
114
|
|
|
313
|
-
|
|
115
|
+
### `createRouteMap(machine)`
|
|
314
116
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
type: "play.route",
|
|
322
|
-
to: "#profile",
|
|
323
|
-
params: { userId: props.userId },
|
|
324
|
-
})
|
|
325
|
-
}
|
|
326
|
-
>
|
|
327
|
-
View Profile
|
|
328
|
-
</button>
|
|
329
|
-
);
|
|
330
|
-
}
|
|
117
|
+
Factory that builds a `RouteMap` directly from an XState machine definition. Re-exported from `@xmachines/play-router`.
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { createRouteMap } from "@xmachines/play-solid-router";
|
|
121
|
+
|
|
122
|
+
const routeMap = createRouteMap(myMachine);
|
|
331
123
|
```
|
|
332
124
|
|
|
333
|
-
###
|
|
125
|
+
### `RouteMap` / `RouteMapping`
|
|
334
126
|
|
|
335
|
-
|
|
336
|
-
// State machine with query param handling
|
|
337
|
-
import { formatPlayRouteTransitions } from "@xmachines/play-xstate";
|
|
338
|
-
import { defineCatalog } from "@xmachines/play-catalog";
|
|
127
|
+
Bidirectional state ID ↔ URL path mapping. Re-exported from `@xmachines/play-router`.
|
|
339
128
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
states: {
|
|
343
|
-
search: {
|
|
344
|
-
meta: {
|
|
345
|
-
route: '/search',
|
|
346
|
-
view: { component: 'Search' },
|
|
347
|
-
},
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
};
|
|
129
|
+
```ts
|
|
130
|
+
import { RouteMap } from "@xmachines/play-solid-router";
|
|
351
131
|
|
|
352
|
-
const
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
}).createMachine(formatPlayRouteTransitions(machineConfig));
|
|
358
|
-
|
|
359
|
-
const catalog = defineCatalog({
|
|
360
|
-
Search,
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
const player = definePlayer({ machine: searchMachine, catalog });
|
|
364
|
-
|
|
365
|
-
// Component sends query params
|
|
366
|
-
function SearchBar(props) {
|
|
367
|
-
const [searchTerm, setSearchTerm] = createSignal('');
|
|
368
|
-
|
|
369
|
-
function handleSearch() {
|
|
370
|
-
props.actor.send({
|
|
371
|
-
type: 'play.route',
|
|
372
|
-
to: '#search',
|
|
373
|
-
query: { q: searchTerm(), tag: 'typescript' }
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
return (
|
|
378
|
-
<div>
|
|
379
|
-
<input
|
|
380
|
-
value={searchTerm()}
|
|
381
|
-
onInput={(e) => setSearchTerm(e.target.value)}
|
|
382
|
-
/>
|
|
383
|
-
<button onClick={handleSearch}>Search</button>
|
|
384
|
-
</div>
|
|
385
|
-
);
|
|
386
|
-
}
|
|
132
|
+
const routeMap = new RouteMap([
|
|
133
|
+
{ stateId: "#home", path: "/" },
|
|
134
|
+
{ stateId: "#profile", path: "/profile/:userId" },
|
|
135
|
+
{ stateId: "#settings", path: "/settings/:section?" },
|
|
136
|
+
]);
|
|
387
137
|
```
|
|
388
138
|
|
|
389
|
-
|
|
139
|
+
### Types
|
|
390
140
|
|
|
391
|
-
|
|
141
|
+
| Export | Description |
|
|
142
|
+
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
143
|
+
| `PlayActor` | `AbstractActor & Routable & Viewable` — canonical actor shape from `@xmachines/play-router`. Required by `PlayRouterProvider`, which renders the current view spec in addition to synchronizing routes. |
|
|
144
|
+
| `RoutableActor` | Deprecated alias for `PlayActor`. Use `PlayActor` from `@xmachines/play-router` in new code. |
|
|
145
|
+
| `AbstractActor` | Re-exported from `@xmachines/play-actor` for convenience when typing renderer callbacks. |
|
|
146
|
+
| `SolidRouterHooks` | Shape of the `router` prop: `{ navigate, location, params }` |
|
|
147
|
+
| `PlayRouterProviderProps` | Full props interface for `PlayRouterProvider` |
|
|
148
|
+
| `PlayRouteEvent` | Event type sent to the actor on URL change (`play.route`) |
|
|
149
|
+
| `RouterBridge` | Interface implemented by `SolidRouterBridge` |
|
|
150
|
+
| `RouteMapOptions` | Options bag for `RouteMap` construction. Re-exported from `@xmachines/play-router`. |
|
|
392
151
|
|
|
393
|
-
|
|
152
|
+
## Usage Patterns
|
|
394
153
|
|
|
395
|
-
|
|
396
|
-
// State machine with auth guards
|
|
397
|
-
import { defineCatalog } from "@xmachines/play-catalog";
|
|
154
|
+
### Protected Routes and Guards
|
|
398
155
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
},
|
|
404
|
-
}).createMachine({
|
|
405
|
-
context: { isAuthenticated: false },
|
|
406
|
-
initial: "home",
|
|
156
|
+
Auth guards live entirely inside the state machine, preventing flashes of unauthorized content:
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
const machineConfig = {
|
|
407
160
|
states: {
|
|
408
|
-
home: {
|
|
409
|
-
meta: { route: "/", view: { component: "Home" } },
|
|
410
|
-
},
|
|
411
|
-
login: {
|
|
412
|
-
meta: { route: "/login", view: { component: "Login" } },
|
|
413
|
-
on: {
|
|
414
|
-
login: {
|
|
415
|
-
target: "dashboard",
|
|
416
|
-
actions: assign({ isAuthenticated: true }),
|
|
417
|
-
},
|
|
418
|
-
},
|
|
419
|
-
},
|
|
420
161
|
dashboard: {
|
|
421
|
-
meta: { route: "/dashboard"
|
|
162
|
+
meta: { route: "/dashboard" },
|
|
422
163
|
always: {
|
|
423
164
|
guard: ({ context }) => !context.isAuthenticated,
|
|
424
165
|
target: "login",
|
|
425
166
|
},
|
|
426
167
|
},
|
|
427
168
|
},
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
const catalog = defineCatalog({
|
|
431
|
-
Home,
|
|
432
|
-
Login,
|
|
433
|
-
Dashboard,
|
|
434
|
-
});
|
|
435
|
-
|
|
436
|
-
const player = definePlayer({ machine: authMachine, catalog });
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
**Guard behavior:**
|
|
440
|
-
|
|
441
|
-
- User navigates to `/dashboard`
|
|
442
|
-
- Bridge sends `play.route` event to actor
|
|
443
|
-
- Actor's `always` guard checks `isAuthenticated`
|
|
444
|
-
- If `false`, actor transitions to `login` state
|
|
445
|
-
- Bridge detects state change via `createEffect`, redirects to `/login`
|
|
446
|
-
- Actor Authority principle enforced
|
|
447
|
-
|
|
448
|
-
### Cleanup: Proper Disposal on Component Unmount
|
|
449
|
-
|
|
450
|
-
```tsx
|
|
451
|
-
import { onCleanup } from "solid-js";
|
|
452
|
-
import { SolidRouterBridge } from "@xmachines/play-solid-router";
|
|
453
|
-
|
|
454
|
-
function App() {
|
|
455
|
-
const navigate = useNavigate();
|
|
456
|
-
const location = useLocation();
|
|
457
|
-
const params = useParams();
|
|
458
|
-
const actor = useContext(ActorContext);
|
|
459
|
-
const routeMap = useContext(RouteMapContext);
|
|
460
|
-
|
|
461
|
-
const bridge = new SolidRouterBridge(navigate, location, params, actor, routeMap);
|
|
462
|
-
|
|
463
|
-
// CRITICAL: Cleanup effects
|
|
464
|
-
onCleanup(() => {
|
|
465
|
-
bridge.dispose();
|
|
466
|
-
});
|
|
467
|
-
|
|
468
|
-
return <Router>...</Router>;
|
|
469
|
-
}
|
|
169
|
+
};
|
|
470
170
|
```
|
|
471
171
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
- `createEffect` subscriptions continue after disposal (memory leak)
|
|
475
|
-
- Multiple bridge instances send duplicate events
|
|
476
|
-
- Tests fail with "Cannot send to stopped actor" errors
|
|
477
|
-
- Solid's fine-grained reactivity tracks disposed components
|
|
478
|
-
|
|
479
|
-
## Architecture
|
|
480
|
-
|
|
481
|
-
### Bidirectional Sync (Actor ↔ Router)
|
|
482
|
-
|
|
483
|
-
**Actor → Router (Signal-driven via createEffect):**
|
|
484
|
-
|
|
485
|
-
1. Actor transitions to new state with `meta.route`
|
|
486
|
-
2. `actor.currentRoute` signal updates
|
|
487
|
-
3. `createEffect(on(...))` fires with new route value
|
|
488
|
-
4. Bridge extracts state ID from signal
|
|
489
|
-
5. Bridge looks up path via `routeMap.getPathByStateId(stateId)`
|
|
490
|
-
6. Bridge calls `navigate(path)`
|
|
491
|
-
7. SolidJS Router updates URL and renders component
|
|
172
|
+
When a user navigates to `/dashboard` while unauthenticated:
|
|
492
173
|
|
|
493
|
-
|
|
174
|
+
1. Solid Router updates the URL.
|
|
175
|
+
2. Bridge intercepts and sends `play.route` to the actor.
|
|
176
|
+
3. Actor evaluates the guard — denies transition, moves to `login` instead.
|
|
177
|
+
4. Bridge observes new actor route (`/login`) via TC39 Signal.
|
|
178
|
+
5. Bridge calls `navigate("/login")`.
|
|
494
179
|
|
|
495
|
-
|
|
496
|
-
2. `location.pathname` signal updates
|
|
497
|
-
3. `createEffect(on(...))` fires with new pathname
|
|
498
|
-
4. Bridge looks up state ID via `routeMap.getStateIdByPath(pathname)`
|
|
499
|
-
5. Bridge extracts params from `useParams()` reactive object
|
|
500
|
-
6. Bridge sends `play.route` event to actor
|
|
501
|
-
7. Actor validates navigation (guards, transitions)
|
|
502
|
-
8. If accepted: Actor transitions, signal updates, URL stays
|
|
503
|
-
9. If rejected: Actor redirects, bridge corrects URL via `navigate()`
|
|
180
|
+
### Dynamic Routes with Parameters
|
|
504
181
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
2. **`isProcessingNavigation` flag:** Set during navigation processing, prevents concurrent syncs
|
|
511
|
-
3. **Effect timing:** Solid's batched updates and `defer: true` option prevent rapid cycles
|
|
512
|
-
|
|
513
|
-
**Signals-native pattern:**
|
|
182
|
+
```ts
|
|
183
|
+
const routeMap = new RouteMap([
|
|
184
|
+
{ stateId: "#post", path: "/users/:userId/posts/:postId" },
|
|
185
|
+
{ stateId: "#settings", path: "/settings/:section?" },
|
|
186
|
+
]);
|
|
514
187
|
|
|
515
|
-
|
|
516
|
-
//
|
|
517
|
-
createEffect(
|
|
518
|
-
on(
|
|
519
|
-
() => this.actor.currentRoute.get(),
|
|
520
|
-
(route) => {
|
|
521
|
-
if (!route || route === this.lastSyncedPath || this.isProcessingNavigation) {
|
|
522
|
-
return;
|
|
523
|
-
}
|
|
524
|
-
this.lastSyncedPath = route;
|
|
525
|
-
this.navigate(route);
|
|
526
|
-
},
|
|
527
|
-
{ defer: true },
|
|
528
|
-
),
|
|
529
|
-
);
|
|
530
|
-
|
|
531
|
-
// Router → Actor
|
|
532
|
-
createEffect(
|
|
533
|
-
on(
|
|
534
|
-
() => this.location.pathname,
|
|
535
|
-
(pathname) => {
|
|
536
|
-
if (pathname === this.lastSyncedPath || this.isProcessingNavigation) {
|
|
537
|
-
return;
|
|
538
|
-
}
|
|
539
|
-
this.isProcessingNavigation = true;
|
|
540
|
-
this.actor.send({ type: "play.route", to: stateId, params });
|
|
541
|
-
this.isProcessingNavigation = false;
|
|
542
|
-
},
|
|
543
|
-
{ defer: true },
|
|
544
|
-
),
|
|
545
|
-
);
|
|
188
|
+
// Params are extracted from Solid's useParams() and forwarded in the play.route event:
|
|
189
|
+
// { type: "play.route", to: "#post", params: { userId: "123", postId: "456" }, query: {} }
|
|
546
190
|
```
|
|
547
191
|
|
|
548
|
-
|
|
192
|
+
Path parameters are extracted from Solid's reactive `useParams()` proxy — no URLPattern polyfill is needed for parameterized routes.
|
|
549
193
|
|
|
550
|
-
|
|
194
|
+
## Testing
|
|
551
195
|
|
|
552
|
-
|
|
553
|
-
- `@xmachines/play-actor` - Actor base class with signal protocol
|
|
554
|
-
- `@xmachines/play-router` - Route extraction and pattern matching
|
|
555
|
-
- `@xmachines/play-signals` - TC39 Signals polyfill for reactivity
|
|
556
|
-
- `@xmachines/play-xstate` - XState integration via `definePlayer()`
|
|
196
|
+
Run tests for this package in isolation:
|
|
557
197
|
|
|
558
|
-
|
|
198
|
+
```bash
|
|
199
|
+
# From the monorepo root
|
|
200
|
+
pnpm --filter @xmachines/play-solid-router test
|
|
559
201
|
|
|
202
|
+
# Or from this package directory
|
|
203
|
+
pnpm test
|
|
560
204
|
```
|
|
561
|
-
┌─────────────────────────────────────┐
|
|
562
|
-
│ Solid Components (View Layer) │
|
|
563
|
-
│ - Props include actor reference │
|
|
564
|
-
│ - Sends play.route events │
|
|
565
|
-
└─────────────────────────────────────┘
|
|
566
|
-
↕
|
|
567
|
-
┌─────────────────────────────────────┐
|
|
568
|
-
│ SolidRouterBridge (Adapter) │
|
|
569
|
-
│ - createEffect(actor.currentRoute) │
|
|
570
|
-
│ - createEffect(location.pathname) │
|
|
571
|
-
└─────────────────────────────────────┘
|
|
572
|
-
↕ ↕
|
|
573
|
-
┌─────────────┐ ┌──────────────────┐
|
|
574
|
-
│ SolidJS │ │ XMachines Actor │
|
|
575
|
-
│ Router │ │ (Business Logic) │
|
|
576
|
-
│ (Infra) │ │ │
|
|
577
|
-
└─────────────┘ └──────────────────┘
|
|
578
|
-
```
|
|
579
|
-
|
|
580
|
-
### Signals Integration (SolidJS-Specific)
|
|
581
|
-
|
|
582
|
-
**Why signals-native matters:**
|
|
583
205
|
|
|
584
|
-
|
|
585
|
-
- **Automatic tracking:** `createEffect(on(...))` tracks dependencies without manual Watcher setup
|
|
586
|
-
- **Fine-grained updates:** Only affected components re-render (not full tree)
|
|
587
|
-
- **Batched updates:** Solid batches multiple signal changes in single render cycle
|
|
588
|
-
|
|
589
|
-
**Hook context requirement (Pitfall 2):**
|
|
590
|
-
|
|
591
|
-
SolidJS hooks (`useNavigate`, `useLocation`, `useParams`) **MUST** be called inside component tree:
|
|
592
|
-
|
|
593
|
-
```tsx
|
|
594
|
-
// ❌ WRONG: Bridge created outside component
|
|
595
|
-
const navigate = useNavigate(); // ERROR: No reactive context
|
|
596
|
-
const bridge = new SolidRouterBridge(navigate, ...);
|
|
206
|
+
**Browser tests** (`test/browser/**/*.browser.test.ts`) run against real Chromium via Playwright, covering async sequencing that jsdom cannot faithfully reproduce:
|
|
597
207
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
const navigate = useNavigate();
|
|
601
|
-
const location = useLocation();
|
|
602
|
-
const params = useParams();
|
|
603
|
-
const bridge = new SolidRouterBridge(navigate, location, params, actor, routeMap);
|
|
604
|
-
onCleanup(() => bridge.dispose());
|
|
605
|
-
return <Router>...</Router>;
|
|
606
|
-
}
|
|
208
|
+
```bash
|
|
209
|
+
pnpm exec vitest --config vitest.browser.config.ts --project play-solid-router-browser
|
|
607
210
|
```
|
|
608
211
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
### Pattern Matching for Dynamic Routes
|
|
212
|
+
Coverage thresholds: **80%** lines, functions, branches, and statements.
|
|
612
213
|
|
|
613
|
-
|
|
214
|
+
## Related Packages
|
|
614
215
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
216
|
+
- [@xmachines/play-router](../play-router/README.md) — core router primitives and `RouterBridgeBase`
|
|
217
|
+
- [@xmachines/play-tanstack-solid-router](../play-tanstack-solid-router/README.md) — TanStack Solid Router adapter
|
|
218
|
+
- [@xmachines/play-solid](../play-solid/README.md) — SolidJS view renderer
|
|
219
|
+
- [@xmachines/play-xstate](../play-xstate/README.md) — XState v5 player factory
|
|
618
220
|
|
|
619
|
-
|
|
221
|
+
## Learn More
|
|
620
222
|
|
|
621
|
-
-
|
|
622
|
-
- `:param?` - Optional parameter (e.g., `/settings/:section?` matches `/settings` and `/settings/account`)
|
|
623
|
-
- Wildcards via `*` (future enhancement)
|
|
624
|
-
|
|
625
|
-
**Example:**
|
|
626
|
-
|
|
627
|
-
```typescript
|
|
628
|
-
const routeMap = new RouteMap([
|
|
629
|
-
{ stateId: "#profile", path: "/profile/:userId" },
|
|
630
|
-
{ stateId: "#settings", path: "/settings/:section?" },
|
|
631
|
-
]);
|
|
632
|
-
|
|
633
|
-
routeMap.getStateIdByPath("/profile/123"); // '#profile'
|
|
634
|
-
routeMap.getStateIdByPath("/settings"); // '#settings'
|
|
635
|
-
routeMap.getStateIdByPath("/settings/privacy"); // '#settings'
|
|
636
|
-
```
|
|
223
|
+
- [Demo](../../../examples/@xmachines/play-solid-router-demo/README.md)
|
|
637
224
|
|
|
638
225
|
## License
|
|
639
226
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
This work is licensed under the terms of the MIT license.
|
|
643
|
-
For a copy, see <https://opensource.org/licenses/MIT>.
|
|
227
|
+
MIT — see [LICENSE](LICENSE).
|
|
644
228
|
|
|
645
229
|
## Classes
|
|
646
230
|
|
|
@@ -650,17 +234,25 @@ For a copy, see <https://opensource.org/licenses/MIT>.
|
|
|
650
234
|
## Interfaces
|
|
651
235
|
|
|
652
236
|
- [AbstractActor](interfaces/AbstractActor.md)
|
|
237
|
+
- [PlayActor](interfaces/PlayActor.md)
|
|
653
238
|
- [PlayRouteEvent](interfaces/PlayRouteEvent.md)
|
|
239
|
+
- [PlayRouterProviderBaseProps](interfaces/PlayRouterProviderBaseProps.md)
|
|
654
240
|
- [PlayRouterProviderProps](interfaces/PlayRouterProviderProps.md)
|
|
241
|
+
- [RouteMapOptions](interfaces/RouteMapOptions.md)
|
|
655
242
|
- [RouteMapping](interfaces/RouteMapping.md)
|
|
656
243
|
- [RouterBridge](interfaces/RouterBridge.md)
|
|
657
244
|
|
|
658
245
|
## Type Aliases
|
|
659
246
|
|
|
660
|
-
- [
|
|
247
|
+
- [PlayRouterBridgeConstructor](type-aliases/PlayRouterBridgeConstructor.md)
|
|
248
|
+
- [~~RoutableActor~~](type-aliases/RoutableActor.md)
|
|
661
249
|
- [SolidRouterHooks](type-aliases/SolidRouterHooks.md)
|
|
662
250
|
|
|
251
|
+
## Variables
|
|
252
|
+
|
|
253
|
+
- [PlayRouterProvider](variables/PlayRouterProvider.md)
|
|
254
|
+
|
|
663
255
|
## Functions
|
|
664
256
|
|
|
257
|
+
- [createPlayRouterProvider](functions/createPlayRouterProvider.md)
|
|
665
258
|
- [createRouteMap](functions/createRouteMap.md)
|
|
666
|
-
- [PlayRouterProvider](functions/PlayRouterProvider.md)
|