@xmachines/docs 1.0.0 → 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/README.md +1 -1
  2. package/api/@xmachines/play/classes/NonNullableError.md +11 -11
  3. package/api/@xmachines/play/classes/PlayError.md +11 -11
  4. package/api/@xmachines/play/functions/assertNonNullable.md +1 -1
  5. package/api/@xmachines/play/type-aliases/PlayEvent.md +4 -4
  6. package/api/@xmachines/play-actor/classes/AbstractActor.md +20 -19
  7. package/api/@xmachines/play-actor/functions/attachRenderErrorHandler.md +1 -1
  8. package/api/@xmachines/play-actor/functions/toAtomState.md +1 -1
  9. package/api/@xmachines/play-actor/functions/typedSpec.md +1 -1
  10. package/api/@xmachines/play-actor/interfaces/BaseActorProviderProps.md +7 -7
  11. package/api/@xmachines/play-actor/interfaces/BaseViewContextValue.md +7 -7
  12. package/api/@xmachines/play-actor/interfaces/PlaySpec.md +7 -7
  13. package/api/@xmachines/play-actor/interfaces/Routable.md +5 -5
  14. package/api/@xmachines/play-actor/interfaces/Viewable.md +4 -4
  15. package/api/@xmachines/play-dom/classes/PlayRenderer.md +4 -4
  16. package/api/@xmachines/play-dom/functions/createPlayUI.md +1 -1
  17. package/api/@xmachines/play-dom/functions/createRenderer.md +1 -1
  18. package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +10 -10
  19. package/api/@xmachines/play-dom/interfaces/MountOptions.md +5 -5
  20. package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +12 -12
  21. package/api/@xmachines/play-dom/type-aliases/MountFn.md +1 -1
  22. package/api/@xmachines/play-dom-router/README.md +1 -1
  23. package/api/@xmachines/play-dom-router/functions/connectRouter.md +1 -1
  24. package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +1 -1
  25. package/api/@xmachines/play-dom-router/functions/createRouteMap.md +2 -2
  26. package/api/@xmachines/play-dom-router/functions/createRouter.md +1 -1
  27. package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +16 -16
  28. package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +16 -16
  29. package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +6 -6
  30. package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +8 -8
  31. package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +6 -6
  32. package/api/@xmachines/play-dom-router/interfaces/RouteLookupContract.md +3 -3
  33. package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +3 -3
  34. package/api/@xmachines/play-dom-router/interfaces/RouteMapOptions.md +4 -4
  35. package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +5 -5
  36. package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +3 -3
  37. package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +6 -6
  38. package/api/@xmachines/play-react/README.md +1 -1
  39. package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +5 -5
  40. package/api/@xmachines/play-react/functions/useActor.md +1 -1
  41. package/api/@xmachines/play-react/functions/usePlayView.md +1 -1
  42. package/api/@xmachines/play-react/functions/useSignalEffect.md +1 -1
  43. package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +10 -10
  44. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +6 -6
  45. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +5 -5
  46. package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +13 -13
  47. package/api/@xmachines/play-react/interfaces/ViewContextValue.md +7 -7
  48. package/api/@xmachines/play-react/type-aliases/AnyPlayActor.md +1 -1
  49. package/api/@xmachines/play-react/variables/ActorProvider.md +1 -1
  50. package/api/@xmachines/play-react/variables/PlayRenderer.md +1 -1
  51. package/api/@xmachines/play-react/variables/PlayUIProvider.md +1 -1
  52. package/api/@xmachines/play-react-router/README.md +1 -1
  53. package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +4 -4
  54. package/api/@xmachines/play-react-router/classes/RouteMap.md +4 -4
  55. package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +1 -1
  56. package/api/@xmachines/play-react-router/functions/createRouteMap.md +2 -2
  57. package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +1 -1
  58. package/api/@xmachines/play-react-router/interfaces/PlayActor.md +7 -7
  59. package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +8 -8
  60. package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
  61. package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +7 -7
  62. package/api/@xmachines/play-react-router/interfaces/RouteMapOptions.md +4 -4
  63. package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +5 -5
  64. package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +3 -3
  65. package/api/@xmachines/play-react-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
  66. package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +1 -1
  67. package/api/@xmachines/play-router/README.md +15 -7
  68. package/api/@xmachines/play-router/classes/RouteMap.md +4 -4
  69. package/api/@xmachines/play-router/classes/RouterBridgeBase.md +4 -4
  70. package/api/@xmachines/play-router/functions/buildPlayRouteEvent.md +1 -1
  71. package/api/@xmachines/play-router/functions/buildRouteTree.md +1 -1
  72. package/api/@xmachines/play-router/functions/createRouteMap.md +2 -2
  73. package/api/@xmachines/play-router/functions/createRouteMapFromTree.md +1 -1
  74. package/api/@xmachines/play-router/functions/detectDuplicateRoutes.md +1 -1
  75. package/api/@xmachines/play-router/functions/extractMachineRoutes.md +2 -2
  76. package/api/@xmachines/play-router/functions/extractQuery.md +1 -1
  77. package/api/@xmachines/play-router/functions/extractRouteParams.md +1 -1
  78. package/api/@xmachines/play-router/functions/findRouteById.md +1 -1
  79. package/api/@xmachines/play-router/functions/findRouteByPath.md +1 -1
  80. package/api/@xmachines/play-router/functions/getNavigableRoutes.md +1 -1
  81. package/api/@xmachines/play-router/functions/getRoutableRoutes.md +1 -1
  82. package/api/@xmachines/play-router/functions/getTransitionReachableRoutes.md +1 -1
  83. package/api/@xmachines/play-router/functions/isRouteReachable.md +1 -1
  84. package/api/@xmachines/play-router/functions/machineToGraph.md +1 -1
  85. package/api/@xmachines/play-router/functions/routeExists.md +1 -1
  86. package/api/@xmachines/play-router/functions/sanitizePathname.md +1 -1
  87. package/api/@xmachines/play-router/functions/validateRouteFormat.md +1 -1
  88. package/api/@xmachines/play-router/functions/validateStateExists.md +1 -1
  89. package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +6 -6
  90. package/api/@xmachines/play-router/interfaces/LocationLike.md +5 -5
  91. package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +7 -5
  92. package/api/@xmachines/play-router/interfaces/MachineNodeData.md +7 -7
  93. package/api/@xmachines/play-router/interfaces/PlayActor.md +7 -7
  94. package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +8 -8
  95. package/api/@xmachines/play-router/interfaces/ResolvedRoutePath.md +5 -5
  96. package/api/@xmachines/play-router/interfaces/RoutableActor.md +6 -6
  97. package/api/@xmachines/play-router/interfaces/RouteInfo.md +10 -10
  98. package/api/@xmachines/play-router/interfaces/RouteMapOptions.md +4 -4
  99. package/api/@xmachines/play-router/interfaces/RouteMapping.md +5 -5
  100. package/api/@xmachines/play-router/interfaces/RouteMatch.md +5 -5
  101. package/api/@xmachines/play-router/interfaces/RouteNode.md +12 -12
  102. package/api/@xmachines/play-router/interfaces/RouteObject.md +4 -4
  103. package/api/@xmachines/play-router/interfaces/RouteTree.md +7 -7
  104. package/api/@xmachines/play-router/interfaces/RouteWatcherHandle.md +3 -3
  105. package/api/@xmachines/play-router/interfaces/RouterBridge.md +3 -3
  106. package/api/@xmachines/play-router/interfaces/WindowLike.md +3 -3
  107. package/api/@xmachines/play-router/type-aliases/MachineGraph.md +1 -1
  108. package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +1 -1
  109. package/api/@xmachines/play-signals/functions/watchSignal.md +1 -1
  110. package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +4 -4
  111. package/api/@xmachines/play-signals/interfaces/SignalComputed.md +2 -2
  112. package/api/@xmachines/play-signals/interfaces/SignalOptions.md +4 -4
  113. package/api/@xmachines/play-signals/interfaces/SignalState.md +3 -3
  114. package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +4 -4
  115. package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +1 -1
  116. package/api/@xmachines/play-solid/functions/useActor.md +1 -1
  117. package/api/@xmachines/play-solid/functions/usePlayView.md +1 -1
  118. package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +10 -10
  119. package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +13 -13
  120. package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +7 -7
  121. package/api/@xmachines/play-solid/type-aliases/AnyPlayActor.md +1 -1
  122. package/api/@xmachines/play-solid/variables/ActorContext.md +1 -1
  123. package/api/@xmachines/play-solid/variables/ActorProvider.md +1 -1
  124. package/api/@xmachines/play-solid/variables/PlayRenderer.md +1 -1
  125. package/api/@xmachines/play-solid/variables/PlayUIProvider.md +1 -1
  126. package/api/@xmachines/play-solid-router/README.md +5 -5
  127. package/api/@xmachines/play-solid-router/classes/RouteMap.md +4 -4
  128. package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +5 -5
  129. package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +1 -1
  130. package/api/@xmachines/play-solid-router/functions/createRouteMap.md +2 -2
  131. package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +20 -19
  132. package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +7 -7
  133. package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +8 -8
  134. package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
  135. package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +7 -7
  136. package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +4 -4
  137. package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +5 -5
  138. package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +3 -3
  139. package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
  140. package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +1 -1
  141. package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
  142. package/api/@xmachines/play-solid-router/variables/PlayRouterProvider.md +1 -1
  143. package/api/@xmachines/play-svelte/README.md +1 -1
  144. package/api/@xmachines/play-svelte/functions/defineRegistry.md +1 -1
  145. package/api/@xmachines/play-svelte/functions/getActorContext.md +1 -1
  146. package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +1 -1
  147. package/api/@xmachines/play-svelte/functions/setActorContext.md +1 -1
  148. package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +10 -10
  149. package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +6 -6
  150. package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +13 -13
  151. package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +7 -7
  152. package/api/@xmachines/play-svelte/type-aliases/AnyPlayActor.md +1 -1
  153. package/api/@xmachines/play-svelte-spa-router/README.md +24 -18
  154. package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +4 -4
  155. package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +1 -1
  156. package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +2 -2
  157. package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +6 -6
  158. package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +8 -8
  159. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapOptions.md +4 -4
  160. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +5 -5
  161. package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +3 -3
  162. package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
  163. package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +1 -1
  164. package/api/@xmachines/play-sveltekit-router/README.md +5 -5
  165. package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +4 -4
  166. package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +1 -1
  167. package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +2 -2
  168. package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +6 -6
  169. package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +5 -5
  170. package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +8 -8
  171. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapOptions.md +4 -4
  172. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +5 -5
  173. package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +3 -3
  174. package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +1 -1
  175. package/api/@xmachines/play-tanstack-react-router/README.md +1 -1
  176. package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +4 -4
  177. package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +4 -4
  178. package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +1 -1
  179. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +2 -2
  180. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +1 -1
  181. package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +2 -2
  182. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayActor.md +7 -7
  183. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +8 -8
  184. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
  185. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +7 -7
  186. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapOptions.md +4 -4
  187. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +5 -5
  188. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +5 -5
  189. package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +3 -3
  190. package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
  191. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +1 -1
  192. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +4 -4
  193. package/api/@xmachines/play-tanstack-react-router/variables/PlayRouterProvider.md +1 -1
  194. package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +2 -2
  195. package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouteMapLike.md +3 -3
  196. package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouterLike.md +4 -4
  197. package/api/@xmachines/play-tanstack-solid-router/README.md +5 -5
  198. package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +4 -4
  199. package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +5 -5
  200. package/api/@xmachines/play-tanstack-solid-router/functions/createPlayRouterProvider.md +1 -1
  201. package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +2 -2
  202. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayActor.md +7 -7
  203. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +8 -8
  204. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
  205. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +7 -7
  206. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapOptions.md +4 -4
  207. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +5 -5
  208. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +3 -3
  209. package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
  210. package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +1 -1
  211. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +1 -1
  212. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +4 -4
  213. package/api/@xmachines/play-tanstack-solid-router/variables/PlayRouterProvider.md +1 -1
  214. package/api/@xmachines/play-vue/README.md +1 -1
  215. package/api/@xmachines/play-vue/functions/defineRegistry.md +1 -1
  216. package/api/@xmachines/play-vue/functions/getPlayViewContext.md +1 -1
  217. package/api/@xmachines/play-vue/functions/useActor.md +1 -1
  218. package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +7 -7
  219. package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +10 -10
  220. package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +7 -7
  221. package/api/@xmachines/play-vue/interfaces/VisibilityProviderProps.md +1 -1
  222. package/api/@xmachines/play-vue/type-aliases/AnyPlayActor.md +1 -1
  223. package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +1 -1
  224. package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +1 -1
  225. package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +4 -4
  226. package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
  227. package/api/@xmachines/play-vue-router/README.md +1 -1
  228. package/api/@xmachines/play-vue-router/classes/RouteMap.md +4 -4
  229. package/api/@xmachines/play-vue-router/classes/VueRouterBridge.md +5 -5
  230. package/api/@xmachines/play-vue-router/functions/createRouteMap.md +2 -2
  231. package/api/@xmachines/play-vue-router/interfaces/PlayActor.md +7 -7
  232. package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +8 -8
  233. package/api/@xmachines/play-vue-router/interfaces/RouteMapOptions.md +4 -4
  234. package/api/@xmachines/play-vue-router/interfaces/RouteMapping.md +5 -5
  235. package/api/@xmachines/play-vue-router/interfaces/RouterBridge.md +3 -3
  236. package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +1 -1
  237. package/api/@xmachines/play-vue-router/variables/PlayRouterProvider.md +1 -1
  238. package/api/@xmachines/play-xstate/README.md +88 -25
  239. package/api/@xmachines/play-xstate/classes/PlayerActor.md +34 -33
  240. package/api/@xmachines/play-xstate/functions/buildRouteUrl.md +1 -1
  241. package/api/@xmachines/play-xstate/functions/composeGuards.md +23 -17
  242. package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +16 -16
  243. package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +1 -1
  244. package/api/@xmachines/play-xstate/functions/createRoutedMachine.md +87 -0
  245. package/api/@xmachines/play-xstate/functions/definePlayer.md +3 -3
  246. package/api/@xmachines/play-xstate/functions/deriveRoute.md +1 -1
  247. package/api/@xmachines/play-xstate/functions/eventMatches.md +1 -1
  248. package/api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md +45 -11
  249. package/api/@xmachines/play-xstate/functions/hasContext.md +1 -1
  250. package/api/@xmachines/play-xstate/functions/isAbsoluteRoute.md +1 -1
  251. package/api/@xmachines/play-xstate/functions/negateGuard.md +15 -15
  252. package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +5 -5
  253. package/api/@xmachines/play-xstate/interfaces/PlayerFactoryResumeOptions.md +4 -4
  254. package/api/@xmachines/play-xstate/interfaces/PlayerOptions.md +8 -8
  255. package/api/@xmachines/play-xstate/interfaces/RouteContext.md +7 -7
  256. package/api/@xmachines/play-xstate/interfaces/RouteObject.md +4 -4
  257. package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +26 -5
  258. package/api/@xmachines/play-xstate/type-aliases/Guard.md +1 -1
  259. package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +1 -1
  260. package/api/@xmachines/play-xstate/type-aliases/PlayRoutePayload.md +30 -0
  261. package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +1 -1
  262. package/api/@xmachines/play-xstate/type-aliases/RouteMachineConfig.md +13 -6
  263. package/api/@xmachines/play-xstate/type-aliases/RouteMetadata.md +1 -1
  264. package/api/@xmachines/play-xstate/type-aliases/RouteStateNode.md +16 -4
  265. package/api/@xmachines/play-xstate/type-aliases/SetupLike.md +33 -0
  266. package/api/@xmachines/play-xstate/type-aliases/WithOptional.md +31 -0
  267. package/api/@xmachines/play-xstate/variables/emptyEventSchema.md +37 -0
  268. package/api/@xmachines/play-xstate/variables/playMetaSchema.md +40 -0
  269. package/api/@xmachines/play-xstate/variables/playRouteEventSchema.md +9 -0
  270. package/api/@xmachines/shared/vite-aliases/functions/xmAliases.md +1 -1
  271. package/api/@xmachines/shared/vite-aliases/functions/xmCacheDir.md +1 -1
  272. package/api/@xmachines/shared/vite-aliases/functions/xmOptimizeDeps.md +1 -1
  273. package/api/@xmachines/shared/vite-aliases/functions/xmResolve.md +1 -1
  274. package/api/@xmachines/shared/vite-aliases/functions/xmSvelteRunes.md +4 -4
  275. package/api/@xmachines/shared/vitest/functions/defineXmBrowserConfig.md +1 -1
  276. package/api/@xmachines/shared/vitest/functions/defineXmVitestConfig.md +1 -1
  277. package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +6 -6
  278. package/contributing/architecture.md +9 -6
  279. package/contributing/development.md +1 -1
  280. package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +1 -1
  281. package/examples/@xmachines/play-dom-demo/functions/initShell.md +1 -1
  282. package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +1 -1
  283. package/examples/@xmachines/play-dom-demo/variables/About.md +1 -1
  284. package/examples/@xmachines/play-dom-demo/variables/Contact.md +1 -1
  285. package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +1 -1
  286. package/examples/@xmachines/play-dom-demo/variables/Home.md +1 -1
  287. package/examples/@xmachines/play-dom-demo/variables/Login.md +1 -1
  288. package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +1 -1
  289. package/examples/@xmachines/play-dom-demo/variables/Navigation.md +1 -1
  290. package/examples/@xmachines/play-dom-demo/variables/Overview.md +1 -1
  291. package/examples/@xmachines/play-dom-demo/variables/Profile.md +1 -1
  292. package/examples/@xmachines/play-dom-demo/variables/Settings.md +1 -1
  293. package/examples/@xmachines/play-dom-demo/variables/Stats.md +1 -1
  294. package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +1 -1
  295. package/examples/@xmachines/play-react-demo/functions/App.md +1 -1
  296. package/examples/@xmachines/play-react-demo/type-aliases/AuthCatalog.md +1 -1
  297. package/examples/@xmachines/play-react-demo/variables/About.md +1 -1
  298. package/examples/@xmachines/play-react-demo/variables/Contact.md +1 -1
  299. package/examples/@xmachines/play-react-demo/variables/Dashboard.md +1 -1
  300. package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +1 -1
  301. package/examples/@xmachines/play-react-demo/variables/Home.md +1 -1
  302. package/examples/@xmachines/play-react-demo/variables/Login.md +1 -1
  303. package/examples/@xmachines/play-react-demo/variables/NavBar.md +1 -1
  304. package/examples/@xmachines/play-react-demo/variables/NavBarView.md +1 -1
  305. package/examples/@xmachines/play-react-demo/variables/Navigation.md +1 -1
  306. package/examples/@xmachines/play-react-demo/variables/Overview.md +1 -1
  307. package/examples/@xmachines/play-react-demo/variables/Profile.md +1 -1
  308. package/examples/@xmachines/play-react-demo/variables/Settings.md +1 -1
  309. package/examples/@xmachines/play-react-demo/variables/Shell.md +1 -1
  310. package/examples/@xmachines/play-react-demo/variables/Stats.md +1 -1
  311. package/examples/@xmachines/play-react-demo/variables/authCatalog.md +1 -1
  312. package/examples/@xmachines/play-solid-demo/functions/App.md +1 -1
  313. package/examples/@xmachines/play-solid-demo/type-aliases/AuthCatalog.md +1 -1
  314. package/examples/@xmachines/play-solid-demo/variables/About.md +1 -1
  315. package/examples/@xmachines/play-solid-demo/variables/Contact.md +1 -1
  316. package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +1 -1
  317. package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +1 -1
  318. package/examples/@xmachines/play-solid-demo/variables/Home.md +1 -1
  319. package/examples/@xmachines/play-solid-demo/variables/Login.md +1 -1
  320. package/examples/@xmachines/play-solid-demo/variables/NavBar.md +1 -1
  321. package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +1 -1
  322. package/examples/@xmachines/play-solid-demo/variables/Navigation.md +1 -1
  323. package/examples/@xmachines/play-solid-demo/variables/Overview.md +1 -1
  324. package/examples/@xmachines/play-solid-demo/variables/Profile.md +1 -1
  325. package/examples/@xmachines/play-solid-demo/variables/Settings.md +1 -1
  326. package/examples/@xmachines/play-solid-demo/variables/Shell.md +1 -1
  327. package/examples/@xmachines/play-solid-demo/variables/Stats.md +1 -1
  328. package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +1 -1
  329. package/examples/@xmachines/play-svelte-demo/type-aliases/AuthCatalog.md +1 -1
  330. package/examples/@xmachines/play-svelte-demo/variables/authCatalog.md +1 -1
  331. package/examples/@xmachines/play-vue-demo/type-aliases/AuthCatalog.md +1 -1
  332. package/examples/@xmachines/play-vue-demo/variables/App.md +1 -1
  333. package/examples/@xmachines/play-vue-demo/variables/authCatalog.md +1 -1
  334. package/examples/README.md +1 -1
  335. package/examples/basic-state-machine.md +22 -24
  336. package/examples/form-validation.md +118 -109
  337. package/examples/routing-patterns.md +92 -60
  338. package/examples/traffic-light.md +46 -57
  339. package/guides/getting-started.md +79 -68
  340. package/guides/state-machines.md +68 -52
  341. package/package.json +2 -2
  342. package/rfc/play.md +4 -4
@@ -2,22 +2,28 @@
2
2
 
3
3
  # Form Validation with Typed Context
4
4
 
5
- Managing login form state using `setup({ types })`, typed `assign`, guards, and `meta.view` with `$bindState`.
5
+ Managing login form state using `setup({ schemas })`, typed context patches, guard logic in transition functions, and `meta.view` with `$bindState`.
6
6
 
7
7
  ## Use Case
8
8
 
9
9
  This example mirrors the `authMachine` login pattern: a form state with a local state store (`$bindState` two-way binding), a guard on the submit action, and a `meta.view` spec describing the component tree. It covers:
10
10
 
11
- - Typed context mutations with `setup.assign`
12
- - Guards as inline functions checking context
11
+ - Typed context patches returned from transition functions
12
+ - Guard logic as early returns inside transition functions
13
13
  - `meta.view` spec with `$bindState` for two-way form binding
14
14
  - Sending typed domain events from the view layer
15
15
 
16
16
  ## Complete Code
17
17
 
18
18
  ```typescript
19
- import { setup } from "xstate";
20
- import { definePlayer, formatPlayRouteTransitions } from "@xmachines/play-xstate";
19
+ import { setup, types } from "xstate";
20
+ import {
21
+ createRoutedMachine,
22
+ definePlayer,
23
+ emptyEventSchema,
24
+ playMetaSchema,
25
+ playRouteEventSchema,
26
+ } from "@xmachines/play-xstate";
21
27
 
22
28
  // Context shape
23
29
  interface LoginContext {
@@ -28,133 +34,136 @@ interface LoginContext {
28
34
  query: Record<string, string>;
29
35
  }
30
36
 
31
- // Event unionlowercase dot-separated names
32
- type LoginEvent =
33
- | {
34
- type: "play.route";
35
- to: string;
36
- params?: Record<string, string>;
37
- query?: Record<string, string>;
38
- }
39
- | { type: "auth.login"; username: string }
40
- | { type: "auth.logout" };
41
-
42
- // 1. Typed setup — always use setup() before createMachine()
37
+ // 1. Typed setup always use setup() before createMachine().
38
+ // The events schema maps event type -> payload shape (payload excludes `type`);
39
+ // event names are lowercase dot-separated.
43
40
  const loginSetup = setup({
44
- types: {
45
- context: {} as LoginContext,
46
- events: {} as LoginEvent,
47
- input: {} as Partial<LoginContext> | undefined,
41
+ schemas: {
42
+ context: types<LoginContext>(),
43
+ input: types<Partial<LoginContext> | undefined>(),
44
+ events: {
45
+ "play.route": playRouteEventSchema,
46
+ "auth.login": types<{ username: string }>(),
47
+ "auth.logout": emptyEventSchema,
48
+ },
49
+ // State meta carries route templates (meta.route) and typed PlaySpec
50
+ // view specs (meta.view)
51
+ meta: playMetaSchema,
48
52
  },
49
53
  });
50
54
 
51
- // 2. Machine — wraps config in formatPlayRouteTransitions for play.route support
52
- const loginMachine = loginSetup.createMachine(
53
- formatPlayRouteTransitions({
54
- id: "login",
55
- initial: "idle",
56
- context: ({ input }) => ({
57
- isAuthenticated: input?.isAuthenticated ?? false,
58
- username: input?.username ?? null,
59
- errorMessage: null,
60
- params: input?.params ?? {},
61
- query: input?.query ?? {},
62
- }),
63
-
64
- // Root-level event handlers — accessible from any state
65
- on: {
66
- "auth.login": {
55
+ // 2. Machine — createRoutedMachine wires play.route support from id + meta.route
56
+ // pairs, with the same config typing as loginSetup.createMachine itself
57
+ const loginMachine = createRoutedMachine(loginSetup)({
58
+ id: "login",
59
+ initial: "idle",
60
+ context: ({ input }) => ({
61
+ isAuthenticated: input?.isAuthenticated ?? false,
62
+ username: input?.username ?? null,
63
+ errorMessage: null,
64
+ params: input?.params ?? {},
65
+ query: input?.query ?? {},
66
+ }),
67
+
68
+ // Root-level event handlers — accessible from any state.
69
+ // Transitions are plain functions: guard with an early return,
70
+ // update context by returning a shallow patch.
71
+ on: {
72
+ "auth.login": ({ context, event }) => {
73
+ // Guard: allow login only when not already authenticated
74
+ if (context.isAuthenticated) return;
75
+ return {
67
76
  target: ".dashboard",
68
- // Guard: allow login only when not already authenticated
69
- guard: ({ context }) => !context.isAuthenticated,
70
- actions: loginSetup.assign({
77
+ context: {
71
78
  isAuthenticated: true,
72
79
  errorMessage: null,
73
- // Typed by the event unionTypeScript narrows event.username safely
74
- username: ({ event }) => (event.type === "auth.login" ? event.username : null),
75
- }),
76
- },
77
- "auth.logout": {
80
+ // Typed by the event schema — event.username is already narrowed
81
+ username: event.username,
82
+ },
83
+ };
84
+ },
85
+ "auth.logout": ({ context }) => {
86
+ if (!context.isAuthenticated) return;
87
+ return {
78
88
  target: ".idle",
79
- guard: ({ context }) => context.isAuthenticated,
80
- actions: loginSetup.assign({
89
+ context: {
81
90
  isAuthenticated: false,
82
91
  username: null,
83
- }),
84
- },
92
+ },
93
+ };
85
94
  },
95
+ },
86
96
 
87
- states: {
88
- idle: {
89
- id: "idle",
90
- meta: {
91
- route: "/",
92
- view: {
93
- root: "root",
94
- elements: {
95
- root: { type: "Home", props: { title: "Welcome" }, children: [] },
96
- },
97
+ states: {
98
+ idle: {
99
+ id: "idle",
100
+ meta: {
101
+ route: "/",
102
+ view: {
103
+ root: "root",
104
+ elements: {
105
+ root: { type: "Home", props: { title: "Welcome" }, children: [] },
97
106
  },
98
107
  },
99
108
  },
109
+ },
100
110
 
101
- login: {
102
- id: "login",
103
- meta: {
104
- route: "/login",
105
- view: {
106
- root: "root",
107
- // Local state store — initial value shown in the form field
108
- state: { username: "" },
109
- elements: {
110
- root: {
111
- type: "Login",
112
- props: {
113
- title: "Sign In",
114
- // $bindState wires the prop to the local state store (two-way)
115
- username: { $bindState: "/username" },
116
- },
117
- children: [],
118
- on: {
119
- // emit("submit") → resolves username from $state, calls login action
120
- submit: {
121
- action: "login",
122
- params: { username: { $state: "/username" } },
123
- },
111
+ login: {
112
+ id: "login",
113
+ meta: {
114
+ route: "/login",
115
+ view: {
116
+ root: "root",
117
+ // Local state store — initial value shown in the form field
118
+ state: { username: "" },
119
+ elements: {
120
+ root: {
121
+ type: "Login",
122
+ props: {
123
+ title: "Sign In",
124
+ // $bindState wires the prop to the local state store (two-way)
125
+ username: { $bindState: "/username" },
126
+ },
127
+ children: [],
128
+ on: {
129
+ // emit("submit") → resolves username from $state, calls login action
130
+ submit: {
131
+ action: "login",
132
+ params: { username: { $state: "/username" } },
124
133
  },
125
134
  },
126
135
  },
127
136
  },
128
137
  },
129
138
  },
139
+ },
130
140
 
131
- dashboard: {
132
- id: "dashboard",
133
- meta: {
134
- route: "/dashboard",
135
- view: {
136
- root: "root",
137
- elements: {
138
- root: {
139
- type: "Dashboard",
140
- props: { title: "Dashboard" },
141
- children: [],
142
- on: {
143
- logout: { action: "logout" },
144
- },
141
+ dashboard: {
142
+ id: "dashboard",
143
+ meta: {
144
+ route: "/dashboard",
145
+ view: {
146
+ root: "root",
147
+ elements: {
148
+ root: {
149
+ type: "Dashboard",
150
+ props: { title: "Dashboard" },
151
+ children: [],
152
+ on: {
153
+ logout: { action: "logout" },
145
154
  },
146
155
  },
147
156
  },
148
157
  },
149
- // always-guard: redirect to login if not authenticated
150
- always: {
151
- guard: ({ context }) => !context.isAuthenticated,
152
- target: "login",
153
- },
158
+ },
159
+ // always-transition: redirect to login if not authenticated
160
+ always: ({ context }) => {
161
+ if (context.isAuthenticated) return;
162
+ return { target: "login" };
154
163
  },
155
164
  },
156
- }),
157
- );
165
+ },
166
+ });
158
167
 
159
168
  // 3. Factory and actor
160
169
  const createPlayer = definePlayer({ machine: loginMachine });
@@ -171,7 +180,7 @@ console.log(actor.getSnapshot().value); // "dashboard"
171
180
  console.log(actor.getSnapshot().context.username); // "alice"
172
181
 
173
182
  // 6. Guard prevents re-login while authenticated
174
- actor.send({ type: "auth.login", username: "bob" }); // guard fires, transition rejected
183
+ actor.send({ type: "auth.login", username: "bob" }); // early return transition rejected
175
184
  console.log(actor.getSnapshot().context.username); // still "alice"
176
185
 
177
186
  // 7. Logout
@@ -217,10 +226,10 @@ view: {
217
226
 
218
227
  ## Key Concepts
219
228
 
220
- - **`setup({ types })`**: Always declare context, events, and input types before `createMachine`.
221
- - **`setup.assign(...)`**: Use the scoped `assign` from your `setup` instance, not the bare one from `xstate`. This provides full type inference.
222
- - **Guards as inline functions**: `({ context }) => !context.isAuthenticated` guards check state invariants ("can I BE in this state?"), not event details.
223
- - **`always` transitions**: Entry guards on states. Used for protected routes — if the guard fires, the machine redirects before the state is fully entered.
229
+ - **`setup({ schemas })`**: Always declare context, events, input, and meta schemas before `createMachine` — via `types<T>()` for your own shapes, and the shared `playRouteEventSchema` / `playMetaSchema` / `emptyEventSchema` constants from `@xmachines/play-xstate` for the Play-standard ones. `playMetaSchema` types `meta.view` as a `PlaySpec`, so view specs are checked, not `unknown`.
230
+ - **Context patches**: Update context by returning a shallow `context` patch from the transition function. This provides full type inference — no `assign` action.
231
+ - **Guards as early returns**: `if (context.isAuthenticated) return;`the transition function checks state invariants ("can I BE in this state?") and returns `undefined` to reject the transition.
232
+ - **`always` transitions**: Functions evaluated on state entry. Used for protected routes — return `{ target }` to redirect before the state is fully entered, or `undefined` to stay.
224
233
  - **Lowercase dot-separated event types**: `"auth.login"`, `"auth.logout"`, `"play.route"` — not `SCREAMING_SNAKE_CASE`.
225
234
 
226
235
  ## Connecting the Renderer
@@ -305,6 +314,6 @@ window.addEventListener("beforeunload", () => {
305
314
  ## Next Steps
306
315
 
307
316
  - **[Basic State Machine](basic-state-machine.md)** — Foundational concepts without a view layer
308
- - **[Routing Patterns](routing-patterns.md)** — Parameter routes, relative routes, and `always` auth guards
317
+ - **[Routing Patterns](routing-patterns.md)** — Parameter routes, relative routes, and `always` auth redirects
309
318
  - **[`PlaySpec`](../api/@xmachines/play-actor/interfaces/PlaySpec.md)** — Spec type governing `meta.view`, `$bindState`, `$state`, and `contextProps`
310
319
  - **[`@xmachines/play-router`](../api/@xmachines/play-router/README.md)** — Route extraction and tree building
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Routing Patterns
4
4
 
5
- How the `authMachine` uses `meta.route`, `play.route` events, `formatPlayRouteTransitions`, and `always` guards to implement actor-authoritative URL routing.
5
+ How the `authMachine` uses `meta.route`, `play.route` events, `formatPlayRouteTransitions`, and `always` transitions to implement actor-authoritative URL routing.
6
6
 
7
7
  ## Overview
8
8
 
@@ -62,12 +62,17 @@ states: {
62
62
 
63
63
  ### `formatPlayRouteTransitions` — Auto-Generating Route Handlers
64
64
 
65
- Instead of hand-writing `play.route` event handlers for every routable state, wrap your machine config with `formatPlayRouteTransitions`:
65
+ Instead of hand-writing `play.route` event handlers for every routable state, create the machine through `createRoutedMachine` — it has the same signature as the setup's own `createMachine` (full config inference) and applies `formatPlayRouteTransitions` at runtime:
66
66
 
67
67
  ```typescript
68
- import { setup } from "xstate";
69
- import { definePlayer, formatPlayRouteTransitions } from "@xmachines/play-xstate";
70
- import type { PlayRouteEvent } from "@xmachines/play-router";
68
+ import { setup, types } from "xstate";
69
+ import {
70
+ createRoutedMachine,
71
+ definePlayer,
72
+ emptyEventSchema,
73
+ playMetaSchema,
74
+ playRouteEventSchema,
75
+ } from "@xmachines/play-xstate";
71
76
 
72
77
  interface AuthContext {
73
78
  isAuthenticated: boolean;
@@ -77,47 +82,72 @@ interface AuthContext {
77
82
  }
78
83
 
79
84
  const authSetup = setup({
80
- types: {
81
- context: {} as AuthContext,
82
- events: {} as
83
- PlayRouteEvent | { type: "auth.login"; username: string } | { type: "auth.logout" },
84
- input: {} as Partial<AuthContext> | undefined,
85
+ schemas: {
86
+ context: types<AuthContext>(),
87
+ input: types<Partial<AuthContext> | undefined>(),
88
+ events: {
89
+ "play.route": playRouteEventSchema,
90
+ "auth.login": types<{ username: string }>(),
91
+ "auth.logout": emptyEventSchema,
92
+ },
93
+ meta: playMetaSchema,
85
94
  },
86
95
  });
87
96
 
88
- const authMachine = authSetup.createMachine(
89
- formatPlayRouteTransitions({
90
- id: "auth",
91
- initial: "home",
92
- context: ({ input }) => ({
93
- isAuthenticated: input?.isAuthenticated ?? false,
94
- username: input?.username ?? null,
95
- params: input?.params ?? {},
96
- query: input?.query ?? {},
97
- }),
98
- states: {
99
- home: { id: "home", meta: { route: "/" } },
100
- about: { id: "about", meta: { route: "/about" } },
101
- login: { id: "login", meta: { route: "/login" } },
102
- profile: { id: "profile", meta: { route: "/profile/:username" } },
103
- },
97
+ const authMachine = createRoutedMachine(authSetup)({
98
+ id: "auth",
99
+ initial: "home",
100
+ context: ({ input }) => ({
101
+ isAuthenticated: input?.isAuthenticated ?? false,
102
+ username: input?.username ?? null,
103
+ params: input?.params ?? {},
104
+ query: input?.query ?? {},
104
105
  }),
105
- );
106
+ states: {
107
+ home: { id: "home", meta: { route: "/" } },
108
+ about: { id: "about", meta: { route: "/about" } },
109
+ login: { id: "login", meta: { route: "/login" } },
110
+ profile: { id: "profile", meta: { route: "/profile/:username" } },
111
+ },
112
+ });
106
113
  ```
107
114
 
108
- `formatPlayRouteTransitions` generates root-level handlers equivalent to:
115
+ Under the hood, `formatPlayRouteTransitions` wires the routed states to XState v6's **native routing**: each routed state receives a static `route: {}` config (making it targetable via the built-in `xstate.route` event and visible to graph tooling), and one root-level `play.route` forwarder handles the public API by navigating those targets **directly, in one atomic transition**:
109
116
 
110
117
  ```typescript
118
+ // Equivalent of what formatPlayRouteTransitions produces:
119
+ states: {
120
+ home: { id: "home", meta: { route: "/" }, route: {} },
121
+ about: { id: "about", meta: { route: "/about" }, route: {} },
122
+ login: { id: "login", meta: { route: "/login" }, route: {} },
123
+ profile: { id: "profile", meta: { route: "/profile/:username" }, route: {} },
124
+ },
111
125
  on: {
112
126
  "play.route": [
113
- { target: ".home", guard: ({ event }) => event.to === "#home", reenter: true, actions: assign({ params, query }) },
114
- { target: ".about", guard: ({ event }) => event.to === "#about", reenter: true, actions: assign({ params, query }) },
115
- { target: ".login", guard: ({ event }) => event.to === "#login", reenter: true, actions: assign({ params, query }) },
116
- { target: ".profile", guard: ({ event }) => event.to === "#profile", reenter: true, actions: assign({ params, query }) },
127
+ // routeTargets maps each routed #id to its state path, collected during
128
+ // the crawl (or to null when the state declares its OWN route config).
129
+ ({ event }, enq) => {
130
+ const target = routeTargets.get(event.to);
131
+ if (target === undefined) return undefined; // fall through to your fallbacks
132
+ if (target === null) {
133
+ // user-declared route config: its resolver decides (and owns any patch)
134
+ enq.raise({ ...event, type: "xstate.route" });
135
+ return {};
136
+ }
137
+ // one atomic transition: navigation + params/query patch together
138
+ return {
139
+ target,
140
+ reenter: true,
141
+ context: { params: event.params ?? {}, query: event.query ?? {} },
142
+ };
143
+ },
144
+ // ...your own play.route fallbacks (e.g. a 404 route) run for unknown targets
117
145
  ],
118
146
  }
119
147
  ```
120
148
 
149
+ For injected routes the forwarder navigates directly — navigation and the `params`/`query` patch are one atomic transition, so exit actions see the old params and no `always` transition can observe a half-navigated state. The injected `route: {}` configs keep statically-targeted `xstate.route` edges in the graph for tooling. States that declare their **own** `route` config are re-raised as `xstate.route` instead, so the user's resolver decides (including blocking — in which case context stays untouched). Unknown targets return `undefined`, falling through to any `play.route` fallbacks you define yourself.
150
+
121
151
  ### `play.route` Events — Navigation
122
152
 
123
153
  To navigate, send a `play.route` event with `to: "#stateId"`:
@@ -146,61 +176,63 @@ actor.send({
146
176
 
147
177
  **`to` always uses `"#stateId"` format** — the state's `id` field prefixed with `#`. Do not pass URL paths here.
148
178
 
149
- ### `always` Guards — Protected Routes
179
+ ### `always` Transitions — Protected Routes
150
180
 
151
- Use XState `always` transitions to protect states. If the guard fires, the machine redirects _before_ the state is fully entered:
181
+ Use XState `always` transitions to protect states. An `always` transition is a function evaluated on state entry: return `{ target }` to redirect _before_ the state is fully entered, or `undefined` to stay:
152
182
 
153
183
  ```typescript
154
184
  dashboard: {
155
185
  id: "dashboard",
156
186
  meta: { route: "/dashboard" },
157
- always: {
187
+ always: ({ context }) => {
158
188
  // If not authenticated, redirect to login immediately
159
- guard: ({ context }) => !context.isAuthenticated,
160
- target: "login",
189
+ if (context.isAuthenticated) return;
190
+ return { target: "login" };
161
191
  },
162
192
  },
163
193
  profile: {
164
194
  id: "profile",
165
195
  meta: { route: "/profile/:username" },
166
- always: {
167
- guard: ({ context }) => !context.isAuthenticated,
168
- target: "login",
196
+ always: ({ context }) => {
197
+ if (context.isAuthenticated) return;
198
+ return { target: "login" };
169
199
  },
170
200
  },
171
201
  ```
172
202
 
173
- **Why `always` and not event guards?** Guards on events check "can I TAKE this transition?". `always` guards check "can I BE in this state?" — the correct invariant for authentication. The actor enforces the guard even on direct URL access (browser back/forward or deep link), because the router sends a `play.route` event which triggers the `always` guard.
203
+ **Why `always` and not guards on events?** Guard checks inside event transitions answer "can I TAKE this transition?". `always` transitions check "can I BE in this state?" — the correct invariant for authentication. The actor enforces the check even on direct URL access (browser back/forward or deep link), because the router sends a `play.route` event which triggers the `always` transition.
174
204
 
175
205
  ### Root-Level Event Handlers
176
206
 
177
207
  Domain events placed at the root `on:` level are handled from any state:
178
208
 
179
209
  ```typescript
180
- const authMachine = authSetup.createMachine(
181
- formatPlayRouteTransitions({
182
- // ...
183
- on: {
184
- "auth.login": {
210
+ const authMachine = createRoutedMachine(authSetup)({
211
+ // ...
212
+ on: {
213
+ "auth.login": ({ context, event }) => {
214
+ if (context.isAuthenticated) return;
215
+ return {
185
216
  target: ".dashboard",
186
- guard: ({ context }) => !context.isAuthenticated,
187
- actions: authSetup.assign({
217
+ context: {
188
218
  isAuthenticated: true,
189
- username: ({ event }) => (event.type === "auth.login" ? event.username : null),
190
- }),
191
- },
192
- "auth.logout": {
219
+ username: event.username,
220
+ },
221
+ };
222
+ },
223
+ "auth.logout": ({ context }) => {
224
+ if (!context.isAuthenticated) return;
225
+ return {
193
226
  target: ".home",
194
- guard: ({ context }) => context.isAuthenticated,
195
- actions: authSetup.assign({
227
+ context: {
196
228
  isAuthenticated: false,
197
229
  username: null,
198
- }),
199
- },
230
+ },
231
+ };
200
232
  },
201
- states: {/* ... */},
202
- }),
203
- );
233
+ },
234
+ states: {/* ... */},
235
+ });
204
236
  ```
205
237
 
206
238
  ## Complete Actor Usage
@@ -287,7 +319,7 @@ function App() {
287
319
  | **Actor Authority (INV-01)** | Guards on the machine validate every navigation. The router cannot change state directly. |
288
320
  | **Passive Infrastructure (INV-04)** | The router observes `actor.currentRoute` — it never decides where to go. |
289
321
  | **State-Driven Reset (INV-03)** | Browser back/forward sends `play.route` events to the actor. History is driven by actor state. |
290
- | **Strict Separation (INV-02)** | The machine has zero framework imports. Guards, actions, and context are pure TypeScript. |
322
+ | **Strict Separation (INV-02)** | The machine has zero framework imports. Guards, transitions, and context are pure TypeScript. |
291
323
 
292
324
  ## Next Steps
293
325