@xmachines/docs 2.0.0-alpha.1 → 2.0.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 +6 -5
- package/api/@xmachines/play/README.md +1 -4
- package/api/@xmachines/play/classes/NonNullableError.md +11 -11
- package/api/@xmachines/play/classes/PlayError.md +11 -11
- package/api/@xmachines/play/functions/assertNonNullable.md +1 -1
- package/api/@xmachines/play/type-aliases/PlayEvent.md +4 -4
- package/api/@xmachines/play-actor/README.md +81 -26
- package/api/@xmachines/play-actor/classes/AbstractActor.md +35 -20
- package/api/@xmachines/play-actor/functions/attachRenderErrorHandler.md +1 -1
- package/api/@xmachines/play-actor/functions/composePlayState.md +26 -0
- package/api/@xmachines/play-actor/functions/createViewStoreLifecycle.md +21 -0
- package/api/@xmachines/play-actor/functions/guardContextWrites.md +41 -0
- package/api/@xmachines/play-actor/functions/refreshContextSubtree.md +27 -0
- package/api/@xmachines/play-actor/functions/reuseComposedState.md +41 -0
- package/api/@xmachines/play-actor/functions/shallowEqualExcept.md +28 -0
- package/api/@xmachines/play-actor/functions/toAtomState.md +1 -1
- package/api/@xmachines/play-actor/functions/typedSpec.md +23 -26
- package/api/@xmachines/play-actor/interfaces/BaseActorProviderProps.md +7 -7
- package/api/@xmachines/play-actor/interfaces/BaseViewContextValue.md +7 -7
- package/api/@xmachines/play-actor/interfaces/PlaySpec.md +12 -14
- package/api/@xmachines/play-actor/interfaces/ResolveViewStoreOptions.md +11 -0
- package/api/@xmachines/play-actor/interfaces/Routable.md +5 -5
- package/api/@xmachines/play-actor/interfaces/ViewStoreLifecycle.md +50 -0
- package/api/@xmachines/play-actor/interfaces/ViewStoreResolution.md +15 -0
- package/api/@xmachines/play-actor/interfaces/Viewable.md +4 -4
- package/api/@xmachines/play-actor/variables/CONTEXT_STATE_KEY.md +15 -0
- package/api/@xmachines/play-dom/README.md +6 -3
- package/api/@xmachines/play-dom/classes/PlayRenderer.md +4 -4
- package/api/@xmachines/play-dom/functions/createPlayUI.md +1 -1
- package/api/@xmachines/play-dom/functions/createRenderer.md +1 -1
- package/api/@xmachines/play-dom/functions/createValidationRegistry.md +22 -0
- package/api/@xmachines/play-dom/functions/defineRegistry.md +5 -5
- package/api/@xmachines/play-dom/interfaces/ComponentContext.md +9 -8
- package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +10 -10
- package/api/@xmachines/play-dom/interfaces/DomRenderContext.md +2 -0
- package/api/@xmachines/play-dom/interfaces/FieldValidationState.md +16 -0
- package/api/@xmachines/play-dom/interfaces/MountOptions.md +5 -5
- package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +12 -12
- package/api/@xmachines/play-dom/interfaces/RenderSpecOptions.md +2 -0
- package/api/@xmachines/play-dom/interfaces/ValidationRegistry.md +21 -0
- package/api/@xmachines/play-dom/type-aliases/BaseComponentProps.md +10 -0
- package/api/@xmachines/play-dom/type-aliases/MountFn.md +1 -1
- package/api/@xmachines/play-dom/variables/schema.md +35 -45
- package/api/@xmachines/play-dom-router/README.md +3 -3
- package/api/@xmachines/play-dom-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +1 -1
- package/api/@xmachines/play-dom-router/functions/createRouteMap.md +2 -2
- package/api/@xmachines/play-dom-router/functions/createRouter.md +1 -1
- package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +16 -16
- package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +16 -16
- package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +6 -6
- package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +8 -8
- package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-dom-router/interfaces/RouteLookupContract.md +3 -3
- package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +3 -3
- package/api/@xmachines/play-dom-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +6 -6
- package/api/@xmachines/play-react/README.md +4 -3
- package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +5 -5
- package/api/@xmachines/play-react/functions/defineRegistry.md +5 -5
- package/api/@xmachines/play-react/functions/useActor.md +1 -1
- package/api/@xmachines/play-react/functions/useFieldValidation.md +31 -0
- package/api/@xmachines/play-react/functions/usePlayView.md +1 -1
- package/api/@xmachines/play-react/functions/useSignalEffect.md +1 -1
- package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +10 -10
- package/api/@xmachines/play-react/interfaces/ComponentContext.md +9 -8
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +6 -6
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +5 -5
- package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +13 -13
- package/api/@xmachines/play-react/interfaces/ViewContextValue.md +7 -7
- package/api/@xmachines/play-react/type-aliases/AnyPlayActor.md +1 -1
- package/api/@xmachines/play-react/variables/ActorProvider.md +1 -1
- package/api/@xmachines/play-react/variables/PlayRenderer.md +1 -1
- package/api/@xmachines/play-react/variables/PlayUIProvider.md +1 -1
- package/api/@xmachines/play-react-router/README.md +2 -4
- package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +4 -4
- package/api/@xmachines/play-react-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-react-router/functions/createRouteMap.md +2 -2
- package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +1 -1
- package/api/@xmachines/play-react-router/interfaces/PlayActor.md +7 -7
- package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +8 -8
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +7 -7
- package/api/@xmachines/play-react-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-react-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
- package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-router/README.md +9 -17
- package/api/@xmachines/play-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-router/classes/RouterBridgeBase.md +4 -4
- package/api/@xmachines/play-router/functions/buildPlayRouteEvent.md +1 -1
- package/api/@xmachines/play-router/functions/buildRouteTree.md +1 -1
- package/api/@xmachines/play-router/functions/createRouteMap.md +2 -2
- package/api/@xmachines/play-router/functions/createRouteMapFromTree.md +1 -1
- package/api/@xmachines/play-router/functions/detectDuplicateRoutes.md +1 -1
- package/api/@xmachines/play-router/functions/extractMachineRoutes.md +2 -2
- package/api/@xmachines/play-router/functions/extractQuery.md +1 -1
- package/api/@xmachines/play-router/functions/extractRouteParams.md +1 -1
- package/api/@xmachines/play-router/functions/findRouteById.md +1 -1
- package/api/@xmachines/play-router/functions/findRouteByPath.md +1 -1
- package/api/@xmachines/play-router/functions/getNavigableRoutes.md +1 -1
- package/api/@xmachines/play-router/functions/getRoutableRoutes.md +1 -1
- package/api/@xmachines/play-router/functions/getTransitionReachableRoutes.md +1 -1
- package/api/@xmachines/play-router/functions/isRouteReachable.md +1 -1
- package/api/@xmachines/play-router/functions/machineToGraph.md +1 -1
- package/api/@xmachines/play-router/functions/routeExists.md +1 -1
- package/api/@xmachines/play-router/functions/sanitizePathname.md +1 -1
- package/api/@xmachines/play-router/functions/validateRouteFormat.md +1 -1
- package/api/@xmachines/play-router/functions/validateStateExists.md +1 -1
- package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +6 -6
- package/api/@xmachines/play-router/interfaces/LocationLike.md +5 -5
- package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +5 -7
- package/api/@xmachines/play-router/interfaces/MachineNodeData.md +7 -7
- package/api/@xmachines/play-router/interfaces/PlayActor.md +7 -7
- package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +8 -8
- package/api/@xmachines/play-router/interfaces/ResolvedRoutePath.md +5 -5
- package/api/@xmachines/play-router/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-router/interfaces/RouteInfo.md +10 -10
- package/api/@xmachines/play-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-router/interfaces/RouteMatch.md +5 -5
- package/api/@xmachines/play-router/interfaces/RouteNode.md +12 -12
- package/api/@xmachines/play-router/interfaces/RouteObject.md +4 -4
- package/api/@xmachines/play-router/interfaces/RouteTree.md +7 -7
- package/api/@xmachines/play-router/interfaces/RouteWatcherHandle.md +3 -3
- package/api/@xmachines/play-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-router/interfaces/WindowLike.md +3 -3
- package/api/@xmachines/play-router/type-aliases/MachineGraph.md +1 -1
- package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +1 -1
- package/api/@xmachines/play-signals/README.md +2 -2
- package/api/@xmachines/play-signals/functions/watchSignal.md +1 -1
- package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +4 -4
- package/api/@xmachines/play-signals/interfaces/SignalComputed.md +2 -2
- package/api/@xmachines/play-signals/interfaces/SignalOptions.md +4 -4
- package/api/@xmachines/play-signals/interfaces/SignalState.md +3 -3
- package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +4 -4
- package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +1 -1
- package/api/@xmachines/play-solid/README.md +2 -2
- package/api/@xmachines/play-solid/functions/useActor.md +1 -1
- package/api/@xmachines/play-solid/functions/usePlayView.md +1 -1
- package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +10 -10
- package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +13 -13
- package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +7 -7
- package/api/@xmachines/play-solid/type-aliases/AnyPlayActor.md +1 -1
- package/api/@xmachines/play-solid/variables/ActorContext.md +1 -1
- package/api/@xmachines/play-solid/variables/ActorProvider.md +1 -1
- package/api/@xmachines/play-solid/variables/PlayRenderer.md +1 -1
- package/api/@xmachines/play-solid/variables/PlayUIProvider.md +1 -1
- package/api/@xmachines/play-solid-router/README.md +7 -7
- package/api/@xmachines/play-solid-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +5 -5
- package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-solid-router/functions/createRouteMap.md +2 -2
- package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +35 -20
- package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +7 -7
- package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +8 -8
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +7 -7
- package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
- package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
- package/api/@xmachines/play-solid-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-svelte/README.md +22 -4
- package/api/@xmachines/play-svelte/functions/defineRegistry.md +1 -1
- package/api/@xmachines/play-svelte/functions/getActorContext.md +1 -1
- package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +1 -1
- package/api/@xmachines/play-svelte/functions/setActorContext.md +1 -1
- package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +10 -10
- package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +6 -6
- package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +13 -13
- package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +7 -7
- package/api/@xmachines/play-svelte/type-aliases/AnyPlayActor.md +1 -1
- package/api/@xmachines/play-svelte-spa-router/README.md +19 -28
- package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +2 -2
- package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +6 -6
- package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +8 -8
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
- package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-sveltekit-router/README.md +7 -7
- package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +2 -2
- package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +6 -6
- package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +5 -5
- package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +8 -8
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/README.md +3 -3
- package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +4 -4
- package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +2 -2
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +2 -2
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayActor.md +7 -7
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +8 -8
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +7 -7
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +5 -5
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +4 -4
- package/api/@xmachines/play-tanstack-react-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-tanstack-router/README.md +2 -0
- package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +2 -2
- package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouteMapLike.md +3 -3
- package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouterLike.md +4 -4
- package/api/@xmachines/play-tanstack-solid-router/README.md +7 -7
- package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +5 -5
- package/api/@xmachines/play-tanstack-solid-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +2 -2
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayActor.md +7 -7
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +8 -8
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +7 -7
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +4 -4
- package/api/@xmachines/play-tanstack-solid-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-vue/README.md +3 -5
- package/api/@xmachines/play-vue/functions/defineRegistry.md +1 -1
- package/api/@xmachines/play-vue/functions/getPlayViewContext.md +1 -1
- package/api/@xmachines/play-vue/functions/useActor.md +1 -1
- package/api/@xmachines/play-vue/functions/useFieldValidation.md +31 -0
- package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +7 -7
- package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +10 -10
- package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +7 -7
- package/api/@xmachines/play-vue/interfaces/VisibilityProviderProps.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/AnyPlayActor.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +4 -4
- package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
- package/api/@xmachines/play-vue-router/README.md +3 -3
- package/api/@xmachines/play-vue-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-vue-router/classes/VueRouterBridge.md +5 -5
- package/api/@xmachines/play-vue-router/functions/createRouteMap.md +2 -2
- package/api/@xmachines/play-vue-router/interfaces/PlayActor.md +7 -7
- package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +8 -8
- package/api/@xmachines/play-vue-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-vue-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-vue-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +1 -1
- package/api/@xmachines/play-vue-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-xstate/README.md +100 -111
- package/api/@xmachines/play-xstate/classes/PlayerActor.md +81 -58
- package/api/@xmachines/play-xstate/functions/buildRouteUrl.md +5 -12
- package/api/@xmachines/play-xstate/functions/composeGuards.md +23 -24
- package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +22 -17
- package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +7 -2
- package/api/@xmachines/play-xstate/functions/definePlayer.md +3 -3
- package/api/@xmachines/play-xstate/functions/deriveRoute.md +1 -1
- package/api/@xmachines/play-xstate/functions/eventMatches.md +7 -2
- package/api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md +11 -45
- package/api/@xmachines/play-xstate/functions/hasContext.md +7 -4
- package/api/@xmachines/play-xstate/functions/isAbsoluteRoute.md +1 -1
- package/api/@xmachines/play-xstate/functions/negateGuard.md +21 -16
- package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +5 -5
- package/api/@xmachines/play-xstate/interfaces/PlayerFactoryResumeOptions.md +4 -4
- package/api/@xmachines/play-xstate/interfaces/PlayerOptions.md +10 -11
- package/api/@xmachines/play-xstate/interfaces/RouteContext.md +7 -7
- package/api/@xmachines/play-xstate/interfaces/RouteObject.md +4 -4
- package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +9 -25
- package/api/@xmachines/play-xstate/type-aliases/Guard.md +7 -5
- package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +7 -5
- package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +11 -15
- package/api/@xmachines/play-xstate/type-aliases/RouteMachineConfig.md +6 -13
- package/api/@xmachines/play-xstate/type-aliases/RouteMetadata.md +1 -1
- package/api/@xmachines/play-xstate/type-aliases/RouteStateNode.md +4 -16
- package/api/@xmachines/shared/README.md +2 -2
- package/api/@xmachines/shared/vite-aliases/functions/xmAliases.md +1 -1
- package/api/@xmachines/shared/vite-aliases/functions/xmCacheDir.md +1 -1
- package/api/@xmachines/shared/vite-aliases/functions/xmOptimizeDeps.md +12 -7
- package/api/@xmachines/shared/vite-aliases/functions/xmResolve.md +1 -1
- package/api/@xmachines/shared/vite-aliases/functions/xmSvelteRunes.md +9 -4
- package/api/@xmachines/shared/vitest/functions/defineXmBrowserConfig.md +1 -1
- package/api/@xmachines/shared/vitest/functions/defineXmVitestConfig.md +1 -1
- package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +6 -6
- package/contributing/architecture.md +27 -28
- package/contributing/configuration.md +10 -10
- package/contributing/deployment.md +51 -30
- package/contributing/development.md +62 -21
- package/contributing/testing.md +36 -14
- package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +1 -1
- package/examples/@xmachines/play-dom-demo/functions/initShell.md +1 -1
- package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/About.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-react-demo/functions/App.md +1 -1
- package/examples/@xmachines/play-react-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/About.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/NavBar.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/NavBarView.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Shell.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-solid-demo/functions/App.md +1 -1
- package/examples/@xmachines/play-solid-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/About.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/NavBar.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Shell.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-svelte-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-svelte-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-vue-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-vue-demo/variables/App.md +1 -1
- package/examples/@xmachines/play-vue-demo/variables/authCatalog.md +1 -1
- package/examples/README.md +4 -1
- package/examples/basic-state-machine.md +24 -24
- package/examples/form-validation.md +110 -121
- package/examples/multi-router-integration.md +0 -2
- package/examples/routing-patterns.md +60 -94
- package/examples/traffic-light.md +57 -48
- package/guides/README.md +6 -2
- package/guides/actor-model.md +1 -1
- package/guides/getting-started.md +89 -90
- package/guides/inspector.md +197 -0
- package/guides/state-machines.md +55 -69
- package/package.json +10 -7
- package/rfc/play.md +15 -6
- package/api/@xmachines/play-xstate/functions/createRoutedMachine.md +0 -87
- package/api/@xmachines/play-xstate/type-aliases/PlayRoutePayload.md +0 -30
- package/api/@xmachines/play-xstate/type-aliases/SetupLike.md +0 -33
- package/api/@xmachines/play-xstate/type-aliases/WithOptional.md +0 -31
- package/api/@xmachines/play-xstate/variables/emptyEventSchema.md +0 -37
- package/api/@xmachines/play-xstate/variables/playMetaSchema.md +0 -40
- package/api/@xmachines/play-xstate/variables/playRouteEventSchema.md +0 -9
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
<!-- generated-by: gsd-doc-writer -->
|
|
2
|
-
|
|
3
1
|
# Traffic Light State Machine
|
|
4
2
|
|
|
5
3
|
Multi-state machine with `meta.route` on every state, demonstrating cyclic transitions and `formatPlayRouteTransitions`.
|
|
@@ -18,58 +16,58 @@ Applicable patterns:
|
|
|
18
16
|
## Complete Code
|
|
19
17
|
|
|
20
18
|
```typescript
|
|
21
|
-
import { setup
|
|
22
|
-
import {
|
|
23
|
-
createRoutedMachine,
|
|
24
|
-
definePlayer,
|
|
25
|
-
emptyEventSchema,
|
|
26
|
-
playMetaSchema,
|
|
27
|
-
playRouteEventSchema,
|
|
28
|
-
} from "@xmachines/play-xstate";
|
|
19
|
+
import { setup } from "xstate";
|
|
20
|
+
import { definePlayer, formatPlayRouteTransitions } from "@xmachines/play-xstate";
|
|
29
21
|
|
|
30
22
|
// 1. Typed setup
|
|
31
23
|
const trafficSetup = setup({
|
|
32
|
-
|
|
33
|
-
context:
|
|
24
|
+
types: {
|
|
25
|
+
context: {} as {
|
|
34
26
|
params: Record<string, string>;
|
|
35
27
|
query: Record<string, string>;
|
|
36
|
-
}>(),
|
|
37
|
-
events: {
|
|
38
|
-
timer: emptyEventSchema,
|
|
39
|
-
"play.route": playRouteEventSchema,
|
|
40
28
|
},
|
|
41
|
-
|
|
29
|
+
events: {} as
|
|
30
|
+
| { type: "timer" }
|
|
31
|
+
| {
|
|
32
|
+
type: "play.route";
|
|
33
|
+
to: string;
|
|
34
|
+
params?: Record<string, string>;
|
|
35
|
+
query?: Record<string, string>;
|
|
36
|
+
},
|
|
37
|
+
input: {} as undefined,
|
|
42
38
|
},
|
|
43
39
|
});
|
|
44
40
|
|
|
45
|
-
// 2. Machine with meta.route on every state
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
const trafficMachine =
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
states: {
|
|
56
|
-
red: {
|
|
57
|
-
id: "red",
|
|
58
|
-
meta: { route: "/red" },
|
|
59
|
-
on: { timer: { target: "green" } },
|
|
41
|
+
// 2. Machine with meta.route on every state
|
|
42
|
+
// formatPlayRouteTransitions() reads each state's id + meta.route and
|
|
43
|
+
// auto-generates the root-level play.route event handlers.
|
|
44
|
+
const trafficMachine = trafficSetup.createMachine(
|
|
45
|
+
formatPlayRouteTransitions({
|
|
46
|
+
id: "traffic",
|
|
47
|
+
initial: "red",
|
|
48
|
+
context: {
|
|
49
|
+
params: {},
|
|
50
|
+
query: {},
|
|
60
51
|
},
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
52
|
+
states: {
|
|
53
|
+
red: {
|
|
54
|
+
id: "red",
|
|
55
|
+
meta: { route: "/red" },
|
|
56
|
+
on: { timer: "green" },
|
|
57
|
+
},
|
|
58
|
+
green: {
|
|
59
|
+
id: "green",
|
|
60
|
+
meta: { route: "/green" },
|
|
61
|
+
on: { timer: "yellow" },
|
|
62
|
+
},
|
|
63
|
+
yellow: {
|
|
64
|
+
id: "yellow",
|
|
65
|
+
meta: { route: "/yellow" },
|
|
66
|
+
on: { timer: "red" },
|
|
67
|
+
},
|
|
65
68
|
},
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
meta: { route: "/yellow" },
|
|
69
|
-
on: { timer: { target: "red" } },
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
});
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
73
71
|
|
|
74
72
|
// 3. Player factory
|
|
75
73
|
const createPlayer = definePlayer({ machine: trafficMachine });
|
|
@@ -101,12 +99,23 @@ actor.stop();
|
|
|
101
99
|
|
|
102
100
|
## How `formatPlayRouteTransitions` Works
|
|
103
101
|
|
|
104
|
-
`formatPlayRouteTransitions`
|
|
102
|
+
`formatPlayRouteTransitions` crawls every state that has **both** an `id` and a `meta.route`, then generates root-level `play.route` event handlers of the form:
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// Auto-generated by formatPlayRouteTransitions — you don't write this manually:
|
|
106
|
+
on: {
|
|
107
|
+
"play.route": [
|
|
108
|
+
{ target: ".red", guard: ({ event }) => event.to === "#red", reenter: true, actions: assign({ params, query }) },
|
|
109
|
+
{ target: ".green", guard: ({ event }) => event.to === "#green", reenter: true, actions: assign({ params, query }) },
|
|
110
|
+
{ target: ".yellow", guard: ({ event }) => event.to === "#yellow", reenter: true, actions: assign({ params, query }) },
|
|
111
|
+
],
|
|
112
|
+
}
|
|
113
|
+
```
|
|
105
114
|
|
|
106
115
|
**Requirements:**
|
|
107
116
|
|
|
108
117
|
- Every routable state must have both `id` (the `#id` navigation target) and `meta.route` (the URL template).
|
|
109
|
-
- The machine's context must include `params` and `query` fields (both `Record<string, string>`), because `formatPlayRouteTransitions`
|
|
118
|
+
- The machine's context must include `params` and `query` fields (both `Record<string, string>`), because `formatPlayRouteTransitions` assigns them on every `play.route` transition.
|
|
110
119
|
|
|
111
120
|
## `actor.currentRoute` Signal
|
|
112
121
|
|
|
@@ -126,12 +135,12 @@ unwatch();
|
|
|
126
135
|
## Key Concepts
|
|
127
136
|
|
|
128
137
|
- **`meta.route`**: Marks a state as routable. The value is a URL template (e.g. `"/profile/:username"`).
|
|
129
|
-
- **`
|
|
138
|
+
- **`formatPlayRouteTransitions`**: Utility that auto-generates `play.route` handlers from `id` + `meta.route` pairs. Wrap your machine config before passing to `createMachine`.
|
|
130
139
|
- **`actor.currentRoute`**: TC39 `Signal.Computed` containing the resolved URL for the active state.
|
|
131
140
|
- **`play.route` events**: Navigation events with a `to: "#stateId"` target. Use `to: "#red"` (state ID), not `to: "/red"` (URL path).
|
|
132
141
|
|
|
133
142
|
## Next Steps
|
|
134
143
|
|
|
135
|
-
- **[Form Validation Example](form-validation.md)** — Context
|
|
136
|
-
- **[Routing Patterns](routing-patterns.md)** — Parameter routes, relative routes, and `always` auth
|
|
144
|
+
- **[Form Validation Example](form-validation.md)** — Context mutations with `setup.assign` and guards
|
|
145
|
+
- **[Routing Patterns](routing-patterns.md)** — Parameter routes, relative routes, and `always` auth guards
|
|
137
146
|
- **[Play RFC](../rfc/play.md)** — Complete architectural specification
|
package/guides/README.md
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
<!-- generated-by: gsd-doc-writer -->
|
|
2
|
-
|
|
3
1
|
# XMachines Guides
|
|
4
2
|
|
|
5
3
|
User-facing guides for the XMachines Play architecture.
|
|
@@ -15,3 +13,9 @@ Background reading that explains the _why_ behind XMachines design decisions.
|
|
|
15
13
|
- **[Understanding State Machines](state-machines.md)** — What finite state machines are, how `meta.route` and `meta.view` extend them, and why they replace boolean flags and component-level routing logic
|
|
16
14
|
- **[Understanding the Actor Model](actor-model.md)** — The actor/infrastructure split, why the machine has zero framework imports, and how the reset invariant works
|
|
17
15
|
- **[Understanding TC39 Signals](signals.md)** — The three signal primitives (`Signal.State`, `Signal.Computed`, `Signal.subtle.Watcher`), why XMachines uses them instead of observables, and the architectural invariants they enforce
|
|
16
|
+
|
|
17
|
+
## Tooling
|
|
18
|
+
|
|
19
|
+
Working with a running actor.
|
|
20
|
+
|
|
21
|
+
- **[Inspecting a Running Actor](inspector.md)** — Attaching the Stately inspector via `PlayerOptions.inspect`, reading inspection events, enabling an inspector after startup, and inspecting without a browser
|
package/guides/actor-model.md
CHANGED
|
@@ -91,7 +91,7 @@ This is why the invariant is called **State-Driven Reset** in the Play RFC.
|
|
|
91
91
|
|
|
92
92
|
[`AbstractActor`](../api/@xmachines/play-actor/classes/AbstractActor.md) (from [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md)) is the abstract base class that all actor implementations must extend. It extends XState's `Actor`, which means:
|
|
93
93
|
|
|
94
|
-
- XState's inspection API works (`@
|
|
94
|
+
- XState's inspection API works ([`@statelyai/inspect`](https://stately.ai/docs/inspector) — see [Inspecting a Running Actor](inspector.md))
|
|
95
95
|
- XState DevTools attach to actors normally
|
|
96
96
|
- The full XState ecosystem (testing utilities, visualization) is compatible
|
|
97
97
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
<!-- generated-by: gsd-doc-writer -->
|
|
2
|
-
|
|
3
1
|
# Getting Started
|
|
4
2
|
|
|
5
3
|
This guide serves two audiences:
|
|
@@ -145,7 +143,7 @@ This section covers installing XMachines packages into your own application and
|
|
|
145
143
|
- **Node.js** `>= 22.0.0`
|
|
146
144
|
- **pnpm** via corepack (`corepack enable`)
|
|
147
145
|
- **TypeScript** `>= 5.7` (strict mode recommended)
|
|
148
|
-
- **XState** `
|
|
146
|
+
- **XState** `v5` (required peer dependency for [`@xmachines/play-xstate`](../api/@xmachines/play-xstate/README.md))
|
|
149
147
|
|
|
150
148
|
All packages are ES modules (`"type": "module"`). Use `.js` extensions in all TypeScript imports.
|
|
151
149
|
|
|
@@ -153,18 +151,19 @@ All packages are ES modules (`"type": "module"`). Use `.js` extensions in all Ty
|
|
|
153
151
|
|
|
154
152
|
#### Step 1: Install the core packages
|
|
155
153
|
|
|
156
|
-
Every XMachines application needs these
|
|
154
|
+
Every XMachines application needs these four packages plus XState:
|
|
157
155
|
|
|
158
156
|
```bash
|
|
159
|
-
pnpm add xstate @xmachines/play-xstate @xmachines/play-actor @xmachines/play-signals
|
|
157
|
+
pnpm add xstate @xmachines/play-xstate @xmachines/play-actor @xmachines/play-signals @xmachines/json-render-core
|
|
160
158
|
```
|
|
161
159
|
|
|
162
160
|
| Package | Role |
|
|
163
161
|
| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
164
|
-
| `xstate` | XState
|
|
162
|
+
| `xstate` | XState v5 state machine engine (peer dependency) |
|
|
165
163
|
| [`@xmachines/play-xstate`](../api/@xmachines/play-xstate/README.md) | [`definePlayer()`](../api/@xmachines/play-xstate/functions/definePlayer.md), [`PlayerActor`](../api/@xmachines/play-xstate/classes/PlayerActor.md), routing helpers |
|
|
166
164
|
| [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md) | Abstract actor base class and interface types |
|
|
167
165
|
| [`@xmachines/play-signals`](../api/@xmachines/play-signals/README.md) | TC39 Signals polyfill (`Signal.State`, `Signal.Computed`, [`watchSignal`](../api/@xmachines/play-signals/functions/watchSignal.md)) |
|
|
166
|
+
| `@xmachines/json-render-core` | Spec and store types the actor layer builds on — a peer of `@xmachines/play-actor`, and of every renderer package |
|
|
168
167
|
|
|
169
168
|
#### Step 2: Install a router adapter (pick one)
|
|
170
169
|
|
|
@@ -199,16 +198,15 @@ pnpm add @xmachines/play-dom # Vanilla DOM
|
|
|
199
198
|
The minimum viable XMachines actor — no framework dependencies:
|
|
200
199
|
|
|
201
200
|
```typescript
|
|
202
|
-
import { setup
|
|
203
|
-
import { definePlayer
|
|
201
|
+
import { setup } from "xstate";
|
|
202
|
+
import { definePlayer } from "@xmachines/play-xstate";
|
|
204
203
|
|
|
205
|
-
// 1. Declare
|
|
204
|
+
// 1. Declare types with setup() — the XState v5 typed entry point
|
|
206
205
|
const appSetup = setup({
|
|
207
|
-
|
|
208
|
-
context:
|
|
209
|
-
events: {
|
|
210
|
-
|
|
211
|
-
},
|
|
206
|
+
types: {
|
|
207
|
+
context: {} as { count: number },
|
|
208
|
+
events: {} as { type: "toggle" },
|
|
209
|
+
input: {} as undefined,
|
|
212
210
|
},
|
|
213
211
|
});
|
|
214
212
|
|
|
@@ -220,18 +218,18 @@ const machine = appSetup.createMachine({
|
|
|
220
218
|
states: {
|
|
221
219
|
off: {
|
|
222
220
|
on: {
|
|
223
|
-
toggle:
|
|
221
|
+
toggle: {
|
|
224
222
|
target: "on",
|
|
225
|
-
|
|
226
|
-
}
|
|
223
|
+
actions: appSetup.assign({ count: ({ context }) => context.count + 1 }),
|
|
224
|
+
},
|
|
227
225
|
},
|
|
228
226
|
},
|
|
229
227
|
on: {
|
|
230
228
|
on: {
|
|
231
|
-
toggle:
|
|
229
|
+
toggle: {
|
|
232
230
|
target: "off",
|
|
233
|
-
|
|
234
|
-
}
|
|
231
|
+
actions: appSetup.assign({ count: ({ context }) => context.count + 1 }),
|
|
232
|
+
},
|
|
235
233
|
},
|
|
236
234
|
},
|
|
237
235
|
},
|
|
@@ -258,8 +256,8 @@ actor.stop();
|
|
|
258
256
|
|
|
259
257
|
**Key rules:**
|
|
260
258
|
|
|
261
|
-
- Always use `setup({
|
|
262
|
-
-
|
|
259
|
+
- Always use `setup({ types })` before `createMachine` — never bare `createMachine` from xstate.
|
|
260
|
+
- Use `setup.assign(...)` for context mutations — not the bare `assign` from xstate.
|
|
263
261
|
- Call `actor.start()` before sending events.
|
|
264
262
|
- Call `actor.stop()` when done to clean up signal subscriptions.
|
|
265
263
|
|
|
@@ -271,73 +269,64 @@ State machines control navigation through `meta.route` on states and `play.route
|
|
|
271
269
|
|
|
272
270
|
#### Define a routable machine with `formatPlayRouteTransitions`
|
|
273
271
|
|
|
274
|
-
|
|
272
|
+
[`formatPlayRouteTransitions`](../api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md) auto-generates `play.route` handlers from `id` + `meta.route` state pairs:
|
|
275
273
|
|
|
276
274
|
```typescript
|
|
277
|
-
import { setup
|
|
278
|
-
import {
|
|
279
|
-
|
|
280
|
-
definePlayer,
|
|
281
|
-
emptyEventSchema,
|
|
282
|
-
playMetaSchema,
|
|
283
|
-
playRouteEventSchema,
|
|
284
|
-
} from "@xmachines/play-xstate";
|
|
275
|
+
import { setup } from "xstate";
|
|
276
|
+
import { definePlayer, formatPlayRouteTransitions } from "@xmachines/play-xstate";
|
|
277
|
+
import type { PlayRouteEvent } from "@xmachines/play-router";
|
|
285
278
|
|
|
286
279
|
const appSetup = setup({
|
|
287
|
-
|
|
288
|
-
// params and query are REQUIRED for
|
|
289
|
-
context:
|
|
280
|
+
types: {
|
|
281
|
+
// params and query are REQUIRED for formatPlayRouteTransitions
|
|
282
|
+
context: {} as {
|
|
290
283
|
isAuthenticated: boolean;
|
|
291
284
|
params: Record<string, string>;
|
|
292
285
|
query: Record<string, string>;
|
|
293
|
-
}>(),
|
|
294
|
-
events: {
|
|
295
|
-
"play.route": playRouteEventSchema,
|
|
296
|
-
"auth.login": types<{ username: string }>(),
|
|
297
|
-
"auth.logout": emptyEventSchema,
|
|
298
286
|
},
|
|
299
|
-
|
|
300
|
-
|
|
287
|
+
events: {} as
|
|
288
|
+
PlayRouteEvent | { type: "auth.login"; username: string } | { type: "auth.logout" },
|
|
289
|
+
input: {} as undefined,
|
|
301
290
|
},
|
|
302
291
|
});
|
|
303
292
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
293
|
+
const appMachine = appSetup.createMachine(
|
|
294
|
+
// formatPlayRouteTransitions auto-generates play.route handlers from id + meta.route pairs
|
|
295
|
+
formatPlayRouteTransitions({
|
|
296
|
+
id: "app",
|
|
297
|
+
initial: "home",
|
|
298
|
+
context: { isAuthenticated: false, params: {}, query: {} },
|
|
299
|
+
states: {
|
|
300
|
+
home: { id: "home", meta: { route: "/" } },
|
|
301
|
+
about: { id: "about", meta: { route: "/about" } },
|
|
302
|
+
login: { id: "login", meta: { route: "/login" } },
|
|
303
|
+
dashboard: {
|
|
304
|
+
id: "dashboard",
|
|
305
|
+
meta: { route: "/dashboard" },
|
|
306
|
+
// always guard: redirect to /login if not authenticated
|
|
307
|
+
always: {
|
|
308
|
+
guard: ({ context }) => !context.isAuthenticated,
|
|
309
|
+
target: "login",
|
|
310
|
+
},
|
|
320
311
|
},
|
|
312
|
+
profile: { id: "profile", meta: { route: "/profile/:username" } },
|
|
321
313
|
},
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
on: {
|
|
325
|
-
"auth.login": ({ context }) => {
|
|
326
|
-
if (context.isAuthenticated) return;
|
|
327
|
-
return {
|
|
314
|
+
on: {
|
|
315
|
+
"auth.login": {
|
|
328
316
|
target: ".dashboard",
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
317
|
+
guard: ({ context }) => !context.isAuthenticated,
|
|
318
|
+
actions: appSetup.assign({
|
|
319
|
+
isAuthenticated: true,
|
|
320
|
+
}),
|
|
321
|
+
},
|
|
322
|
+
"auth.logout": {
|
|
335
323
|
target: ".home",
|
|
336
|
-
|
|
337
|
-
|
|
324
|
+
guard: ({ context }) => context.isAuthenticated,
|
|
325
|
+
actions: appSetup.assign({ isAuthenticated: false }),
|
|
326
|
+
},
|
|
338
327
|
},
|
|
339
|
-
},
|
|
340
|
-
|
|
328
|
+
}),
|
|
329
|
+
);
|
|
341
330
|
|
|
342
331
|
const createPlayer = definePlayer({ machine: appMachine });
|
|
343
332
|
const actor = createPlayer();
|
|
@@ -350,9 +339,9 @@ console.log(actor.currentRoute.get()); // "/"
|
|
|
350
339
|
actor.send({ type: "play.route", to: "#about" });
|
|
351
340
|
console.log(actor.currentRoute.get()); // "/about"
|
|
352
341
|
|
|
353
|
-
// Attempt a protected route — always
|
|
342
|
+
// Attempt a protected route — always guard redirects to login
|
|
354
343
|
actor.send({ type: "play.route", to: "#dashboard" });
|
|
355
|
-
console.log(actor.getSnapshot().value); // "login" (
|
|
344
|
+
console.log(actor.getSnapshot().value); // "login" (guard fired)
|
|
356
345
|
|
|
357
346
|
// Navigate with params
|
|
358
347
|
actor.send({ type: "auth.login", username: "alice" });
|
|
@@ -367,7 +356,7 @@ actor.stop();
|
|
|
367
356
|
- Every routable state **must** have an `id` — [`formatPlayRouteTransitions`](../api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md) throws `MissingStateIdError` if absent.
|
|
368
357
|
- Send `play.route` events with `to: "#stateId"` — always use the `id` field prefixed with `#`, never raw URL paths.
|
|
369
358
|
- The machine context **must** include `params: Record<string, string>` and `query: Record<string, string>`.
|
|
370
|
-
- Use `always`
|
|
359
|
+
- Use `always` guards to protect states from direct URL access — these fire even on browser back/forward.
|
|
371
360
|
|
|
372
361
|
---
|
|
373
362
|
|
|
@@ -615,22 +604,32 @@ window.addEventListener("beforeunload", () => disconnect());
|
|
|
615
604
|
|
|
616
605
|
### Common Setup Issues (Application Developers)
|
|
617
606
|
|
|
618
|
-
####
|
|
607
|
+
#### Query parameters missing from derived URLs
|
|
619
608
|
|
|
620
|
-
**
|
|
609
|
+
**Symptom:** `currentRoute` renders the path but the `?query=...` string from a
|
|
610
|
+
`play.route` event never appears. No error is raised — a context without a
|
|
611
|
+
`query` field builds a query-less URL, exactly like `query: {}`.
|
|
621
612
|
|
|
622
|
-
**Fix:**
|
|
613
|
+
**Fix:** With [`formatPlayRouteTransitions`](../api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md)
|
|
614
|
+
nothing is needed — the generated transitions assign `event.query` to context
|
|
615
|
+
on every navigation. A machine that handles `play.route` by hand must do that
|
|
616
|
+
assignment itself:
|
|
623
617
|
|
|
624
618
|
```typescript
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
|
|
619
|
+
on: {
|
|
620
|
+
"play.route": {
|
|
621
|
+
actions: assign({
|
|
622
|
+
params: ({ event }) => event.params ?? {},
|
|
623
|
+
query: ({ event }) => event.query ?? {},
|
|
624
|
+
}),
|
|
625
|
+
},
|
|
626
|
+
}
|
|
632
627
|
```
|
|
633
628
|
|
|
629
|
+
(Older releases threw `MissingQueryContextError` at construction for a
|
|
630
|
+
routing-aware context without a `query` field; the error class remains
|
|
631
|
+
exported for `instanceof` compatibility but is never thrown.)
|
|
632
|
+
|
|
634
633
|
#### Missing `id` on routable states
|
|
635
634
|
|
|
636
635
|
**Error:** `MissingStateIdError: State "home" has meta.route "/" but no id`.
|
|
@@ -688,7 +687,7 @@ node --version
|
|
|
688
687
|
|
|
689
688
|
| Term | Description |
|
|
690
689
|
| ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
691
|
-
| `setup({
|
|
690
|
+
| `setup({ types })` | XState v5 entry point — declares TypeScript types for context, events, and input |
|
|
692
691
|
| [`definePlayer({ machine })`](../api/@xmachines/play-xstate/functions/definePlayer.md) | Creates a factory that produces [`PlayerActor`](../api/@xmachines/play-xstate/classes/PlayerActor.md) instances |
|
|
693
692
|
| `actor.start()` | Activates the machine — always call before sending events |
|
|
694
693
|
| `actor.send({ type })` | Sends an event; machine guards decide whether a transition occurs |
|
|
@@ -696,10 +695,9 @@ node --version
|
|
|
696
695
|
| `actor.state` | `Signal.State<Snapshot>` — TC39 Signal for reactive state observation |
|
|
697
696
|
| `actor.currentRoute` | `Signal.Computed<string \| null>` — resolved URL from active state's `meta.route` |
|
|
698
697
|
| `actor.currentView` | `Signal.State<PlaySpec \| null>` — view spec from active state's `meta.view` |
|
|
699
|
-
| `
|
|
700
|
-
| [`formatPlayRouteTransitions`](../api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md) | Underlying transform — native `route: {}` configs plus one root `play.route` forwarder |
|
|
698
|
+
| [`formatPlayRouteTransitions`](../api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md) | Generates `play.route` handlers from `id` + `meta.route` state pairs |
|
|
701
699
|
| `play.route` event | Navigation event — `to: "#stateId"`, optional `params`, `query` |
|
|
702
|
-
| `always`
|
|
700
|
+
| `always` guard | Protects states — fires on entry before any event, even on direct URL access |
|
|
703
701
|
| [`extractMachineRoutes`](../api/@xmachines/play-router/functions/extractMachineRoutes.md) | Extracts a `RouteTree` from a state machine — used by framework-integrated router adapters |
|
|
704
702
|
| [`createRouteMapFromTree`](../api/@xmachines/play-router/functions/createRouteMapFromTree.md) | Builds a `RouteMap` from a `RouteTree` for bidirectional state ID ↔ URL lookups |
|
|
705
703
|
| [`connectRouter`](../api/@xmachines/play-dom-router/functions/connectRouter.md) | Connects a vanilla DOM router to an actor — returns a disconnect cleanup function |
|
|
@@ -709,6 +707,7 @@ node --version
|
|
|
709
707
|
|
|
710
708
|
## Next Steps
|
|
711
709
|
|
|
710
|
+
- **[Inspecting a Running Actor](inspector.md)** — Attaching the Stately inspector to see the machine, its transitions, and its context live
|
|
712
711
|
- **[Architecture](../contributing/architecture.md)** — System design, layers, invariants, and data flow
|
|
713
712
|
- **[Play RFC](../rfc/play.md)** — Complete architectural specification
|
|
714
713
|
- **[API Reference](../api/README.md)** — Auto-generated API docs for all packages
|