@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.
Files changed (379) hide show
  1. package/README.md +6 -5
  2. package/api/@xmachines/play/README.md +1 -4
  3. package/api/@xmachines/play/classes/NonNullableError.md +11 -11
  4. package/api/@xmachines/play/classes/PlayError.md +11 -11
  5. package/api/@xmachines/play/functions/assertNonNullable.md +1 -1
  6. package/api/@xmachines/play/type-aliases/PlayEvent.md +4 -4
  7. package/api/@xmachines/play-actor/README.md +81 -26
  8. package/api/@xmachines/play-actor/classes/AbstractActor.md +35 -20
  9. package/api/@xmachines/play-actor/functions/attachRenderErrorHandler.md +1 -1
  10. package/api/@xmachines/play-actor/functions/composePlayState.md +26 -0
  11. package/api/@xmachines/play-actor/functions/createViewStoreLifecycle.md +21 -0
  12. package/api/@xmachines/play-actor/functions/guardContextWrites.md +41 -0
  13. package/api/@xmachines/play-actor/functions/refreshContextSubtree.md +27 -0
  14. package/api/@xmachines/play-actor/functions/reuseComposedState.md +41 -0
  15. package/api/@xmachines/play-actor/functions/shallowEqualExcept.md +28 -0
  16. package/api/@xmachines/play-actor/functions/toAtomState.md +1 -1
  17. package/api/@xmachines/play-actor/functions/typedSpec.md +23 -26
  18. package/api/@xmachines/play-actor/interfaces/BaseActorProviderProps.md +7 -7
  19. package/api/@xmachines/play-actor/interfaces/BaseViewContextValue.md +7 -7
  20. package/api/@xmachines/play-actor/interfaces/PlaySpec.md +12 -14
  21. package/api/@xmachines/play-actor/interfaces/ResolveViewStoreOptions.md +11 -0
  22. package/api/@xmachines/play-actor/interfaces/Routable.md +5 -5
  23. package/api/@xmachines/play-actor/interfaces/ViewStoreLifecycle.md +50 -0
  24. package/api/@xmachines/play-actor/interfaces/ViewStoreResolution.md +15 -0
  25. package/api/@xmachines/play-actor/interfaces/Viewable.md +4 -4
  26. package/api/@xmachines/play-actor/variables/CONTEXT_STATE_KEY.md +15 -0
  27. package/api/@xmachines/play-dom/README.md +6 -3
  28. package/api/@xmachines/play-dom/classes/PlayRenderer.md +4 -4
  29. package/api/@xmachines/play-dom/functions/createPlayUI.md +1 -1
  30. package/api/@xmachines/play-dom/functions/createRenderer.md +1 -1
  31. package/api/@xmachines/play-dom/functions/createValidationRegistry.md +22 -0
  32. package/api/@xmachines/play-dom/functions/defineRegistry.md +5 -5
  33. package/api/@xmachines/play-dom/interfaces/ComponentContext.md +9 -8
  34. package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +10 -10
  35. package/api/@xmachines/play-dom/interfaces/DomRenderContext.md +2 -0
  36. package/api/@xmachines/play-dom/interfaces/FieldValidationState.md +16 -0
  37. package/api/@xmachines/play-dom/interfaces/MountOptions.md +5 -5
  38. package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +12 -12
  39. package/api/@xmachines/play-dom/interfaces/RenderSpecOptions.md +2 -0
  40. package/api/@xmachines/play-dom/interfaces/ValidationRegistry.md +21 -0
  41. package/api/@xmachines/play-dom/type-aliases/BaseComponentProps.md +10 -0
  42. package/api/@xmachines/play-dom/type-aliases/MountFn.md +1 -1
  43. package/api/@xmachines/play-dom/variables/schema.md +35 -45
  44. package/api/@xmachines/play-dom-router/README.md +3 -3
  45. package/api/@xmachines/play-dom-router/functions/connectRouter.md +1 -1
  46. package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +1 -1
  47. package/api/@xmachines/play-dom-router/functions/createRouteMap.md +2 -2
  48. package/api/@xmachines/play-dom-router/functions/createRouter.md +1 -1
  49. package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +16 -16
  50. package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +16 -16
  51. package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +6 -6
  52. package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +8 -8
  53. package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +6 -6
  54. package/api/@xmachines/play-dom-router/interfaces/RouteLookupContract.md +3 -3
  55. package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +3 -3
  56. package/api/@xmachines/play-dom-router/interfaces/RouteMapOptions.md +4 -4
  57. package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +5 -5
  58. package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +3 -3
  59. package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +6 -6
  60. package/api/@xmachines/play-react/README.md +4 -3
  61. package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +5 -5
  62. package/api/@xmachines/play-react/functions/defineRegistry.md +5 -5
  63. package/api/@xmachines/play-react/functions/useActor.md +1 -1
  64. package/api/@xmachines/play-react/functions/useFieldValidation.md +31 -0
  65. package/api/@xmachines/play-react/functions/usePlayView.md +1 -1
  66. package/api/@xmachines/play-react/functions/useSignalEffect.md +1 -1
  67. package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +10 -10
  68. package/api/@xmachines/play-react/interfaces/ComponentContext.md +9 -8
  69. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +6 -6
  70. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +5 -5
  71. package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +13 -13
  72. package/api/@xmachines/play-react/interfaces/ViewContextValue.md +7 -7
  73. package/api/@xmachines/play-react/type-aliases/AnyPlayActor.md +1 -1
  74. package/api/@xmachines/play-react/variables/ActorProvider.md +1 -1
  75. package/api/@xmachines/play-react/variables/PlayRenderer.md +1 -1
  76. package/api/@xmachines/play-react/variables/PlayUIProvider.md +1 -1
  77. package/api/@xmachines/play-react-router/README.md +2 -4
  78. package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +4 -4
  79. package/api/@xmachines/play-react-router/classes/RouteMap.md +4 -4
  80. package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +1 -1
  81. package/api/@xmachines/play-react-router/functions/createRouteMap.md +2 -2
  82. package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +1 -1
  83. package/api/@xmachines/play-react-router/interfaces/PlayActor.md +7 -7
  84. package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +8 -8
  85. package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
  86. package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +7 -7
  87. package/api/@xmachines/play-react-router/interfaces/RouteMapOptions.md +4 -4
  88. package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +5 -5
  89. package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +3 -3
  90. package/api/@xmachines/play-react-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
  91. package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +1 -1
  92. package/api/@xmachines/play-router/README.md +9 -17
  93. package/api/@xmachines/play-router/classes/RouteMap.md +4 -4
  94. package/api/@xmachines/play-router/classes/RouterBridgeBase.md +4 -4
  95. package/api/@xmachines/play-router/functions/buildPlayRouteEvent.md +1 -1
  96. package/api/@xmachines/play-router/functions/buildRouteTree.md +1 -1
  97. package/api/@xmachines/play-router/functions/createRouteMap.md +2 -2
  98. package/api/@xmachines/play-router/functions/createRouteMapFromTree.md +1 -1
  99. package/api/@xmachines/play-router/functions/detectDuplicateRoutes.md +1 -1
  100. package/api/@xmachines/play-router/functions/extractMachineRoutes.md +2 -2
  101. package/api/@xmachines/play-router/functions/extractQuery.md +1 -1
  102. package/api/@xmachines/play-router/functions/extractRouteParams.md +1 -1
  103. package/api/@xmachines/play-router/functions/findRouteById.md +1 -1
  104. package/api/@xmachines/play-router/functions/findRouteByPath.md +1 -1
  105. package/api/@xmachines/play-router/functions/getNavigableRoutes.md +1 -1
  106. package/api/@xmachines/play-router/functions/getRoutableRoutes.md +1 -1
  107. package/api/@xmachines/play-router/functions/getTransitionReachableRoutes.md +1 -1
  108. package/api/@xmachines/play-router/functions/isRouteReachable.md +1 -1
  109. package/api/@xmachines/play-router/functions/machineToGraph.md +1 -1
  110. package/api/@xmachines/play-router/functions/routeExists.md +1 -1
  111. package/api/@xmachines/play-router/functions/sanitizePathname.md +1 -1
  112. package/api/@xmachines/play-router/functions/validateRouteFormat.md +1 -1
  113. package/api/@xmachines/play-router/functions/validateStateExists.md +1 -1
  114. package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +6 -6
  115. package/api/@xmachines/play-router/interfaces/LocationLike.md +5 -5
  116. package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +5 -7
  117. package/api/@xmachines/play-router/interfaces/MachineNodeData.md +7 -7
  118. package/api/@xmachines/play-router/interfaces/PlayActor.md +7 -7
  119. package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +8 -8
  120. package/api/@xmachines/play-router/interfaces/ResolvedRoutePath.md +5 -5
  121. package/api/@xmachines/play-router/interfaces/RoutableActor.md +6 -6
  122. package/api/@xmachines/play-router/interfaces/RouteInfo.md +10 -10
  123. package/api/@xmachines/play-router/interfaces/RouteMapOptions.md +4 -4
  124. package/api/@xmachines/play-router/interfaces/RouteMapping.md +5 -5
  125. package/api/@xmachines/play-router/interfaces/RouteMatch.md +5 -5
  126. package/api/@xmachines/play-router/interfaces/RouteNode.md +12 -12
  127. package/api/@xmachines/play-router/interfaces/RouteObject.md +4 -4
  128. package/api/@xmachines/play-router/interfaces/RouteTree.md +7 -7
  129. package/api/@xmachines/play-router/interfaces/RouteWatcherHandle.md +3 -3
  130. package/api/@xmachines/play-router/interfaces/RouterBridge.md +3 -3
  131. package/api/@xmachines/play-router/interfaces/WindowLike.md +3 -3
  132. package/api/@xmachines/play-router/type-aliases/MachineGraph.md +1 -1
  133. package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +1 -1
  134. package/api/@xmachines/play-signals/README.md +2 -2
  135. package/api/@xmachines/play-signals/functions/watchSignal.md +1 -1
  136. package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +4 -4
  137. package/api/@xmachines/play-signals/interfaces/SignalComputed.md +2 -2
  138. package/api/@xmachines/play-signals/interfaces/SignalOptions.md +4 -4
  139. package/api/@xmachines/play-signals/interfaces/SignalState.md +3 -3
  140. package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +4 -4
  141. package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +1 -1
  142. package/api/@xmachines/play-solid/README.md +2 -2
  143. package/api/@xmachines/play-solid/functions/useActor.md +1 -1
  144. package/api/@xmachines/play-solid/functions/usePlayView.md +1 -1
  145. package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +10 -10
  146. package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +13 -13
  147. package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +7 -7
  148. package/api/@xmachines/play-solid/type-aliases/AnyPlayActor.md +1 -1
  149. package/api/@xmachines/play-solid/variables/ActorContext.md +1 -1
  150. package/api/@xmachines/play-solid/variables/ActorProvider.md +1 -1
  151. package/api/@xmachines/play-solid/variables/PlayRenderer.md +1 -1
  152. package/api/@xmachines/play-solid/variables/PlayUIProvider.md +1 -1
  153. package/api/@xmachines/play-solid-router/README.md +7 -7
  154. package/api/@xmachines/play-solid-router/classes/RouteMap.md +4 -4
  155. package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +5 -5
  156. package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +1 -1
  157. package/api/@xmachines/play-solid-router/functions/createRouteMap.md +2 -2
  158. package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +35 -20
  159. package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +7 -7
  160. package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +8 -8
  161. package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
  162. package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +7 -7
  163. package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +4 -4
  164. package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +5 -5
  165. package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +3 -3
  166. package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
  167. package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +1 -1
  168. package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
  169. package/api/@xmachines/play-solid-router/variables/PlayRouterProvider.md +1 -1
  170. package/api/@xmachines/play-svelte/README.md +22 -4
  171. package/api/@xmachines/play-svelte/functions/defineRegistry.md +1 -1
  172. package/api/@xmachines/play-svelte/functions/getActorContext.md +1 -1
  173. package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +1 -1
  174. package/api/@xmachines/play-svelte/functions/setActorContext.md +1 -1
  175. package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +10 -10
  176. package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +6 -6
  177. package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +13 -13
  178. package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +7 -7
  179. package/api/@xmachines/play-svelte/type-aliases/AnyPlayActor.md +1 -1
  180. package/api/@xmachines/play-svelte-spa-router/README.md +19 -28
  181. package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +4 -4
  182. package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +1 -1
  183. package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +2 -2
  184. package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +6 -6
  185. package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +8 -8
  186. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapOptions.md +4 -4
  187. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +5 -5
  188. package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +3 -3
  189. package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
  190. package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +1 -1
  191. package/api/@xmachines/play-sveltekit-router/README.md +7 -7
  192. package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +4 -4
  193. package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +1 -1
  194. package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +2 -2
  195. package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +6 -6
  196. package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +5 -5
  197. package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +8 -8
  198. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapOptions.md +4 -4
  199. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +5 -5
  200. package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +3 -3
  201. package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +1 -1
  202. package/api/@xmachines/play-tanstack-react-router/README.md +3 -3
  203. package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +4 -4
  204. package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +4 -4
  205. package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +1 -1
  206. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +2 -2
  207. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +1 -1
  208. package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +2 -2
  209. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayActor.md +7 -7
  210. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +8 -8
  211. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
  212. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +7 -7
  213. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapOptions.md +4 -4
  214. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +5 -5
  215. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +5 -5
  216. package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +3 -3
  217. package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
  218. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +1 -1
  219. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +4 -4
  220. package/api/@xmachines/play-tanstack-react-router/variables/PlayRouterProvider.md +1 -1
  221. package/api/@xmachines/play-tanstack-router/README.md +2 -0
  222. package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +2 -2
  223. package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouteMapLike.md +3 -3
  224. package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouterLike.md +4 -4
  225. package/api/@xmachines/play-tanstack-solid-router/README.md +7 -7
  226. package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +4 -4
  227. package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +5 -5
  228. package/api/@xmachines/play-tanstack-solid-router/functions/createPlayRouterProvider.md +1 -1
  229. package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +2 -2
  230. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayActor.md +7 -7
  231. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +8 -8
  232. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderBaseProps.md +7 -7
  233. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +7 -7
  234. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapOptions.md +4 -4
  235. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +5 -5
  236. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +3 -3
  237. package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
  238. package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +1 -1
  239. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +1 -1
  240. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +4 -4
  241. package/api/@xmachines/play-tanstack-solid-router/variables/PlayRouterProvider.md +1 -1
  242. package/api/@xmachines/play-vue/README.md +3 -5
  243. package/api/@xmachines/play-vue/functions/defineRegistry.md +1 -1
  244. package/api/@xmachines/play-vue/functions/getPlayViewContext.md +1 -1
  245. package/api/@xmachines/play-vue/functions/useActor.md +1 -1
  246. package/api/@xmachines/play-vue/functions/useFieldValidation.md +31 -0
  247. package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +7 -7
  248. package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +10 -10
  249. package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +7 -7
  250. package/api/@xmachines/play-vue/interfaces/VisibilityProviderProps.md +1 -1
  251. package/api/@xmachines/play-vue/type-aliases/AnyPlayActor.md +1 -1
  252. package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +1 -1
  253. package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +1 -1
  254. package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +4 -4
  255. package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
  256. package/api/@xmachines/play-vue-router/README.md +3 -3
  257. package/api/@xmachines/play-vue-router/classes/RouteMap.md +4 -4
  258. package/api/@xmachines/play-vue-router/classes/VueRouterBridge.md +5 -5
  259. package/api/@xmachines/play-vue-router/functions/createRouteMap.md +2 -2
  260. package/api/@xmachines/play-vue-router/interfaces/PlayActor.md +7 -7
  261. package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +8 -8
  262. package/api/@xmachines/play-vue-router/interfaces/RouteMapOptions.md +4 -4
  263. package/api/@xmachines/play-vue-router/interfaces/RouteMapping.md +5 -5
  264. package/api/@xmachines/play-vue-router/interfaces/RouterBridge.md +3 -3
  265. package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +1 -1
  266. package/api/@xmachines/play-vue-router/variables/PlayRouterProvider.md +1 -1
  267. package/api/@xmachines/play-xstate/README.md +100 -111
  268. package/api/@xmachines/play-xstate/classes/PlayerActor.md +81 -58
  269. package/api/@xmachines/play-xstate/functions/buildRouteUrl.md +5 -12
  270. package/api/@xmachines/play-xstate/functions/composeGuards.md +23 -24
  271. package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +22 -17
  272. package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +7 -2
  273. package/api/@xmachines/play-xstate/functions/definePlayer.md +3 -3
  274. package/api/@xmachines/play-xstate/functions/deriveRoute.md +1 -1
  275. package/api/@xmachines/play-xstate/functions/eventMatches.md +7 -2
  276. package/api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md +11 -45
  277. package/api/@xmachines/play-xstate/functions/hasContext.md +7 -4
  278. package/api/@xmachines/play-xstate/functions/isAbsoluteRoute.md +1 -1
  279. package/api/@xmachines/play-xstate/functions/negateGuard.md +21 -16
  280. package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +5 -5
  281. package/api/@xmachines/play-xstate/interfaces/PlayerFactoryResumeOptions.md +4 -4
  282. package/api/@xmachines/play-xstate/interfaces/PlayerOptions.md +10 -11
  283. package/api/@xmachines/play-xstate/interfaces/RouteContext.md +7 -7
  284. package/api/@xmachines/play-xstate/interfaces/RouteObject.md +4 -4
  285. package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +9 -25
  286. package/api/@xmachines/play-xstate/type-aliases/Guard.md +7 -5
  287. package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +7 -5
  288. package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +11 -15
  289. package/api/@xmachines/play-xstate/type-aliases/RouteMachineConfig.md +6 -13
  290. package/api/@xmachines/play-xstate/type-aliases/RouteMetadata.md +1 -1
  291. package/api/@xmachines/play-xstate/type-aliases/RouteStateNode.md +4 -16
  292. package/api/@xmachines/shared/README.md +2 -2
  293. package/api/@xmachines/shared/vite-aliases/functions/xmAliases.md +1 -1
  294. package/api/@xmachines/shared/vite-aliases/functions/xmCacheDir.md +1 -1
  295. package/api/@xmachines/shared/vite-aliases/functions/xmOptimizeDeps.md +12 -7
  296. package/api/@xmachines/shared/vite-aliases/functions/xmResolve.md +1 -1
  297. package/api/@xmachines/shared/vite-aliases/functions/xmSvelteRunes.md +9 -4
  298. package/api/@xmachines/shared/vitest/functions/defineXmBrowserConfig.md +1 -1
  299. package/api/@xmachines/shared/vitest/functions/defineXmVitestConfig.md +1 -1
  300. package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +6 -6
  301. package/contributing/architecture.md +27 -28
  302. package/contributing/configuration.md +10 -10
  303. package/contributing/deployment.md +51 -30
  304. package/contributing/development.md +62 -21
  305. package/contributing/testing.md +36 -14
  306. package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +1 -1
  307. package/examples/@xmachines/play-dom-demo/functions/initShell.md +1 -1
  308. package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +1 -1
  309. package/examples/@xmachines/play-dom-demo/variables/About.md +1 -1
  310. package/examples/@xmachines/play-dom-demo/variables/Contact.md +1 -1
  311. package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +1 -1
  312. package/examples/@xmachines/play-dom-demo/variables/Home.md +1 -1
  313. package/examples/@xmachines/play-dom-demo/variables/Login.md +1 -1
  314. package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +1 -1
  315. package/examples/@xmachines/play-dom-demo/variables/Navigation.md +1 -1
  316. package/examples/@xmachines/play-dom-demo/variables/Overview.md +1 -1
  317. package/examples/@xmachines/play-dom-demo/variables/Profile.md +1 -1
  318. package/examples/@xmachines/play-dom-demo/variables/Settings.md +1 -1
  319. package/examples/@xmachines/play-dom-demo/variables/Stats.md +1 -1
  320. package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +1 -1
  321. package/examples/@xmachines/play-react-demo/functions/App.md +1 -1
  322. package/examples/@xmachines/play-react-demo/type-aliases/AuthCatalog.md +1 -1
  323. package/examples/@xmachines/play-react-demo/variables/About.md +1 -1
  324. package/examples/@xmachines/play-react-demo/variables/Contact.md +1 -1
  325. package/examples/@xmachines/play-react-demo/variables/Dashboard.md +1 -1
  326. package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +1 -1
  327. package/examples/@xmachines/play-react-demo/variables/Home.md +1 -1
  328. package/examples/@xmachines/play-react-demo/variables/Login.md +1 -1
  329. package/examples/@xmachines/play-react-demo/variables/NavBar.md +1 -1
  330. package/examples/@xmachines/play-react-demo/variables/NavBarView.md +1 -1
  331. package/examples/@xmachines/play-react-demo/variables/Navigation.md +1 -1
  332. package/examples/@xmachines/play-react-demo/variables/Overview.md +1 -1
  333. package/examples/@xmachines/play-react-demo/variables/Profile.md +1 -1
  334. package/examples/@xmachines/play-react-demo/variables/Settings.md +1 -1
  335. package/examples/@xmachines/play-react-demo/variables/Shell.md +1 -1
  336. package/examples/@xmachines/play-react-demo/variables/Stats.md +1 -1
  337. package/examples/@xmachines/play-react-demo/variables/authCatalog.md +1 -1
  338. package/examples/@xmachines/play-solid-demo/functions/App.md +1 -1
  339. package/examples/@xmachines/play-solid-demo/type-aliases/AuthCatalog.md +1 -1
  340. package/examples/@xmachines/play-solid-demo/variables/About.md +1 -1
  341. package/examples/@xmachines/play-solid-demo/variables/Contact.md +1 -1
  342. package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +1 -1
  343. package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +1 -1
  344. package/examples/@xmachines/play-solid-demo/variables/Home.md +1 -1
  345. package/examples/@xmachines/play-solid-demo/variables/Login.md +1 -1
  346. package/examples/@xmachines/play-solid-demo/variables/NavBar.md +1 -1
  347. package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +1 -1
  348. package/examples/@xmachines/play-solid-demo/variables/Navigation.md +1 -1
  349. package/examples/@xmachines/play-solid-demo/variables/Overview.md +1 -1
  350. package/examples/@xmachines/play-solid-demo/variables/Profile.md +1 -1
  351. package/examples/@xmachines/play-solid-demo/variables/Settings.md +1 -1
  352. package/examples/@xmachines/play-solid-demo/variables/Shell.md +1 -1
  353. package/examples/@xmachines/play-solid-demo/variables/Stats.md +1 -1
  354. package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +1 -1
  355. package/examples/@xmachines/play-svelte-demo/type-aliases/AuthCatalog.md +1 -1
  356. package/examples/@xmachines/play-svelte-demo/variables/authCatalog.md +1 -1
  357. package/examples/@xmachines/play-vue-demo/type-aliases/AuthCatalog.md +1 -1
  358. package/examples/@xmachines/play-vue-demo/variables/App.md +1 -1
  359. package/examples/@xmachines/play-vue-demo/variables/authCatalog.md +1 -1
  360. package/examples/README.md +4 -1
  361. package/examples/basic-state-machine.md +24 -24
  362. package/examples/form-validation.md +110 -121
  363. package/examples/multi-router-integration.md +0 -2
  364. package/examples/routing-patterns.md +60 -94
  365. package/examples/traffic-light.md +57 -48
  366. package/guides/README.md +6 -2
  367. package/guides/actor-model.md +1 -1
  368. package/guides/getting-started.md +89 -90
  369. package/guides/inspector.md +197 -0
  370. package/guides/state-machines.md +55 -69
  371. package/package.json +10 -7
  372. package/rfc/play.md +15 -6
  373. package/api/@xmachines/play-xstate/functions/createRoutedMachine.md +0 -87
  374. package/api/@xmachines/play-xstate/type-aliases/PlayRoutePayload.md +0 -30
  375. package/api/@xmachines/play-xstate/type-aliases/SetupLike.md +0 -33
  376. package/api/@xmachines/play-xstate/type-aliases/WithOptional.md +0 -31
  377. package/api/@xmachines/play-xstate/variables/emptyEventSchema.md +0 -37
  378. package/api/@xmachines/play-xstate/variables/playMetaSchema.md +0 -40
  379. package/api/@xmachines/play-xstate/variables/playRouteEventSchema.md +0 -9
@@ -1,29 +1,21 @@
1
- <!-- generated-by: gsd-doc-writer -->
2
-
3
1
  # Form Validation with Typed Context
4
2
 
5
- Managing login form state using `setup({ schemas })`, typed context patches, guard logic in transition functions, and `meta.view` with `$bindState`.
3
+ Managing login form state using `setup({ types })`, typed `assign`, guards, and `meta.view` with `$bindState`.
6
4
 
7
5
  ## Use Case
8
6
 
9
7
  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
8
 
11
- - Typed context patches returned from transition functions
12
- - Guard logic as early returns inside transition functions
9
+ - Typed context mutations with `setup.assign`
10
+ - Guards as inline functions checking context
13
11
  - `meta.view` spec with `$bindState` for two-way form binding
14
12
  - Sending typed domain events from the view layer
15
13
 
16
14
  ## Complete Code
17
15
 
18
16
  ```typescript
19
- import { setup, types } from "xstate";
20
- import {
21
- createRoutedMachine,
22
- definePlayer,
23
- emptyEventSchema,
24
- playMetaSchema,
25
- playRouteEventSchema,
26
- } from "@xmachines/play-xstate";
17
+ import { setup } from "xstate";
18
+ import { definePlayer, formatPlayRouteTransitions } from "@xmachines/play-xstate";
27
19
 
28
20
  // Context shape
29
21
  interface LoginContext {
@@ -34,136 +26,133 @@ interface LoginContext {
34
26
  query: Record<string, string>;
35
27
  }
36
28
 
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.
29
+ // Event unionlowercase dot-separated names
30
+ type LoginEvent =
31
+ | {
32
+ type: "play.route";
33
+ to: string;
34
+ params?: Record<string, string>;
35
+ query?: Record<string, string>;
36
+ }
37
+ | { type: "auth.login"; username: string }
38
+ | { type: "auth.logout" };
39
+
40
+ // 1. Typed setup — always use setup() before createMachine()
40
41
  const loginSetup = setup({
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,
42
+ types: {
43
+ context: {} as LoginContext,
44
+ events: {} as LoginEvent,
45
+ input: {} as Partial<LoginContext> | undefined,
52
46
  },
53
47
  });
54
48
 
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 {
49
+ // 2. Machine — wraps config in formatPlayRouteTransitions for play.route support
50
+ const loginMachine = loginSetup.createMachine(
51
+ formatPlayRouteTransitions({
52
+ id: "login",
53
+ initial: "idle",
54
+ context: ({ input }) => ({
55
+ isAuthenticated: input?.isAuthenticated ?? false,
56
+ username: input?.username ?? null,
57
+ errorMessage: null,
58
+ params: input?.params ?? {},
59
+ query: input?.query ?? {},
60
+ }),
61
+
62
+ // Root-level event handlers — accessible from any state
63
+ on: {
64
+ "auth.login": {
76
65
  target: ".dashboard",
77
- context: {
66
+ // Guard: allow login only when not already authenticated
67
+ guard: ({ context }) => !context.isAuthenticated,
68
+ actions: loginSetup.assign({
78
69
  isAuthenticated: true,
79
70
  errorMessage: null,
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 {
71
+ // Typed by the event unionTypeScript narrows event.username safely
72
+ username: ({ event }) => (event.type === "auth.login" ? event.username : null),
73
+ }),
74
+ },
75
+ "auth.logout": {
88
76
  target: ".idle",
89
- context: {
77
+ guard: ({ context }) => context.isAuthenticated,
78
+ actions: loginSetup.assign({
90
79
  isAuthenticated: false,
91
80
  username: null,
92
- },
93
- };
81
+ }),
82
+ },
94
83
  },
95
- },
96
84
 
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: [] },
85
+ states: {
86
+ idle: {
87
+ id: "idle",
88
+ meta: {
89
+ route: "/",
90
+ view: {
91
+ root: "root",
92
+ elements: {
93
+ root: { type: "Home", props: { title: "Welcome" }, children: [] },
94
+ },
106
95
  },
107
96
  },
108
97
  },
109
- },
110
98
 
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" } },
99
+ login: {
100
+ id: "login",
101
+ meta: {
102
+ route: "/login",
103
+ view: {
104
+ root: "root",
105
+ // Local state store — initial value shown in the form field
106
+ state: { username: "" },
107
+ elements: {
108
+ root: {
109
+ type: "Login",
110
+ props: {
111
+ title: "Sign In",
112
+ // $bindState wires the prop to the local state store (two-way)
113
+ username: { $bindState: "/username" },
114
+ },
115
+ children: [],
116
+ on: {
117
+ // emit("submit") → resolves username from $state, calls login action
118
+ submit: {
119
+ action: "login",
120
+ params: { username: { $state: "/username" } },
121
+ },
133
122
  },
134
123
  },
135
124
  },
136
125
  },
137
126
  },
138
127
  },
139
- },
140
128
 
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" },
129
+ dashboard: {
130
+ id: "dashboard",
131
+ meta: {
132
+ route: "/dashboard",
133
+ view: {
134
+ root: "root",
135
+ elements: {
136
+ root: {
137
+ type: "Dashboard",
138
+ props: { title: "Dashboard" },
139
+ children: [],
140
+ on: {
141
+ logout: { action: "logout" },
142
+ },
154
143
  },
155
144
  },
156
145
  },
157
146
  },
158
- },
159
- // always-transition: redirect to login if not authenticated
160
- always: ({ context }) => {
161
- if (context.isAuthenticated) return;
162
- return { target: "login" };
147
+ // always-guard: redirect to login if not authenticated
148
+ always: {
149
+ guard: ({ context }) => !context.isAuthenticated,
150
+ target: "login",
151
+ },
163
152
  },
164
153
  },
165
- },
166
- });
154
+ }),
155
+ );
167
156
 
168
157
  // 3. Factory and actor
169
158
  const createPlayer = definePlayer({ machine: loginMachine });
@@ -180,7 +169,7 @@ console.log(actor.getSnapshot().value); // "dashboard"
180
169
  console.log(actor.getSnapshot().context.username); // "alice"
181
170
 
182
171
  // 6. Guard prevents re-login while authenticated
183
- actor.send({ type: "auth.login", username: "bob" }); // early return transition rejected
172
+ actor.send({ type: "auth.login", username: "bob" }); // guard fires, transition rejected
184
173
  console.log(actor.getSnapshot().context.username); // still "alice"
185
174
 
186
175
  // 7. Logout
@@ -226,10 +215,10 @@ view: {
226
215
 
227
216
  ## Key Concepts
228
217
 
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.
218
+ - **`setup({ types })`**: Always declare context, events, and input types before `createMachine`.
219
+ - **`setup.assign(...)`**: Use the scoped `assign` from your `setup` instance, not the bare one from `xstate`. This provides full type inference.
220
+ - **Guards as inline functions**: `({ context }) => !context.isAuthenticated`guards check state invariants ("can I BE in this state?"), not event details.
221
+ - **`always` transitions**: Entry guards on states. Used for protected routes — if the guard fires, the machine redirects before the state is fully entered.
233
222
  - **Lowercase dot-separated event types**: `"auth.login"`, `"auth.logout"`, `"play.route"` — not `SCREAMING_SNAKE_CASE`.
234
223
 
235
224
  ## Connecting the Renderer
@@ -314,6 +303,6 @@ window.addEventListener("beforeunload", () => {
314
303
  ## Next Steps
315
304
 
316
305
  - **[Basic State Machine](basic-state-machine.md)** — Foundational concepts without a view layer
317
- - **[Routing Patterns](routing-patterns.md)** — Parameter routes, relative routes, and `always` auth redirects
318
- - **[`PlaySpec`](../api/@xmachines/play-actor/interfaces/PlaySpec.md)** — Spec type governing `meta.view`, `$bindState`, `$state`, and `contextProps`
306
+ - **[Routing Patterns](routing-patterns.md)** — Parameter routes, relative routes, and `always` auth guards
307
+ - **[`PlaySpec`](../api/@xmachines/play-actor/interfaces/PlaySpec.md)** — Spec type governing `meta.view`, `$bindState`, and `$state`
319
308
  - **[`@xmachines/play-router`](../api/@xmachines/play-router/README.md)** — Route extraction and tree building
@@ -1,5 +1,3 @@
1
- <!-- generated-by: gsd-doc-writer -->
2
-
3
1
  # Multi-Router Integration
4
2
 
5
3
  How to integrate XMachines Play with the 8 router adapters shipped in this monorepo.
@@ -1,8 +1,6 @@
1
- <!-- generated-by: gsd-doc-writer -->
2
-
3
1
  # Routing Patterns
4
2
 
5
- How the `authMachine` uses `meta.route`, `play.route` events, `formatPlayRouteTransitions`, and `always` transitions to implement actor-authoritative URL routing.
3
+ How the `authMachine` uses `meta.route`, `play.route` events, `formatPlayRouteTransitions`, and `always` guards to implement actor-authoritative URL routing.
6
4
 
7
5
  ## Overview
8
6
 
@@ -62,17 +60,12 @@ states: {
62
60
 
63
61
  ### `formatPlayRouteTransitions` — Auto-Generating Route Handlers
64
62
 
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:
63
+ Instead of hand-writing `play.route` event handlers for every routable state, wrap your machine config with `formatPlayRouteTransitions`:
66
64
 
67
65
  ```typescript
68
- import { setup, types } from "xstate";
69
- import {
70
- createRoutedMachine,
71
- definePlayer,
72
- emptyEventSchema,
73
- playMetaSchema,
74
- playRouteEventSchema,
75
- } from "@xmachines/play-xstate";
66
+ import { setup } from "xstate";
67
+ import { definePlayer, formatPlayRouteTransitions } from "@xmachines/play-xstate";
68
+ import type { PlayRouteEvent } from "@xmachines/play-router";
76
69
 
77
70
  interface AuthContext {
78
71
  isAuthenticated: boolean;
@@ -82,72 +75,47 @@ interface AuthContext {
82
75
  }
83
76
 
84
77
  const authSetup = setup({
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,
78
+ types: {
79
+ context: {} as AuthContext,
80
+ events: {} as
81
+ PlayRouteEvent | { type: "auth.login"; username: string } | { type: "auth.logout" },
82
+ input: {} as Partial<AuthContext> | undefined,
94
83
  },
95
84
  });
96
85
 
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 ?? {},
86
+ const authMachine = authSetup.createMachine(
87
+ formatPlayRouteTransitions({
88
+ id: "auth",
89
+ initial: "home",
90
+ context: ({ input }) => ({
91
+ isAuthenticated: input?.isAuthenticated ?? false,
92
+ username: input?.username ?? null,
93
+ params: input?.params ?? {},
94
+ query: input?.query ?? {},
95
+ }),
96
+ states: {
97
+ home: { id: "home", meta: { route: "/" } },
98
+ about: { id: "about", meta: { route: "/about" } },
99
+ login: { id: "login", meta: { route: "/login" } },
100
+ profile: { id: "profile", meta: { route: "/profile/:username" } },
101
+ },
105
102
  }),
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
- });
103
+ );
113
104
  ```
114
105
 
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**:
106
+ `formatPlayRouteTransitions` generates root-level handlers equivalent to:
116
107
 
117
108
  ```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
- },
125
109
  on: {
126
110
  "play.route": [
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
111
+ { target: ".home", guard: ({ event }) => event.to === "#home", reenter: true, actions: assign({ params, query }) },
112
+ { target: ".about", guard: ({ event }) => event.to === "#about", reenter: true, actions: assign({ params, query }) },
113
+ { target: ".login", guard: ({ event }) => event.to === "#login", reenter: true, actions: assign({ params, query }) },
114
+ { target: ".profile", guard: ({ event }) => event.to === "#profile", reenter: true, actions: assign({ params, query }) },
145
115
  ],
146
116
  }
147
117
  ```
148
118
 
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
-
151
119
  ### `play.route` Events — Navigation
152
120
 
153
121
  To navigate, send a `play.route` event with `to: "#stateId"`:
@@ -176,63 +144,61 @@ actor.send({
176
144
 
177
145
  **`to` always uses `"#stateId"` format** — the state's `id` field prefixed with `#`. Do not pass URL paths here.
178
146
 
179
- ### `always` Transitions — Protected Routes
147
+ ### `always` Guards — Protected Routes
180
148
 
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:
149
+ Use XState `always` transitions to protect states. If the guard fires, the machine redirects _before_ the state is fully entered:
182
150
 
183
151
  ```typescript
184
152
  dashboard: {
185
153
  id: "dashboard",
186
154
  meta: { route: "/dashboard" },
187
- always: ({ context }) => {
155
+ always: {
188
156
  // If not authenticated, redirect to login immediately
189
- if (context.isAuthenticated) return;
190
- return { target: "login" };
157
+ guard: ({ context }) => !context.isAuthenticated,
158
+ target: "login",
191
159
  },
192
160
  },
193
161
  profile: {
194
162
  id: "profile",
195
163
  meta: { route: "/profile/:username" },
196
- always: ({ context }) => {
197
- if (context.isAuthenticated) return;
198
- return { target: "login" };
164
+ always: {
165
+ guard: ({ context }) => !context.isAuthenticated,
166
+ target: "login",
199
167
  },
200
168
  },
201
169
  ```
202
170
 
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.
171
+ **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.
204
172
 
205
173
  ### Root-Level Event Handlers
206
174
 
207
175
  Domain events placed at the root `on:` level are handled from any state:
208
176
 
209
177
  ```typescript
210
- const authMachine = createRoutedMachine(authSetup)({
211
- // ...
212
- on: {
213
- "auth.login": ({ context, event }) => {
214
- if (context.isAuthenticated) return;
215
- return {
178
+ const authMachine = authSetup.createMachine(
179
+ formatPlayRouteTransitions({
180
+ // ...
181
+ on: {
182
+ "auth.login": {
216
183
  target: ".dashboard",
217
- context: {
184
+ guard: ({ context }) => !context.isAuthenticated,
185
+ actions: authSetup.assign({
218
186
  isAuthenticated: true,
219
- username: event.username,
220
- },
221
- };
222
- },
223
- "auth.logout": ({ context }) => {
224
- if (!context.isAuthenticated) return;
225
- return {
187
+ username: ({ event }) => (event.type === "auth.login" ? event.username : null),
188
+ }),
189
+ },
190
+ "auth.logout": {
226
191
  target: ".home",
227
- context: {
192
+ guard: ({ context }) => context.isAuthenticated,
193
+ actions: authSetup.assign({
228
194
  isAuthenticated: false,
229
195
  username: null,
230
- },
231
- };
196
+ }),
197
+ },
232
198
  },
233
- },
234
- states: {/* ... */},
235
- });
199
+ states: {/* ... */},
200
+ }),
201
+ );
236
202
  ```
237
203
 
238
204
  ## Complete Actor Usage
@@ -319,7 +285,7 @@ function App() {
319
285
  | **Actor Authority (INV-01)** | Guards on the machine validate every navigation. The router cannot change state directly. |
320
286
  | **Passive Infrastructure (INV-04)** | The router observes `actor.currentRoute` — it never decides where to go. |
321
287
  | **State-Driven Reset (INV-03)** | Browser back/forward sends `play.route` events to the actor. History is driven by actor state. |
322
- | **Strict Separation (INV-02)** | The machine has zero framework imports. Guards, transitions, and context are pure TypeScript. |
288
+ | **Strict Separation (INV-02)** | The machine has zero framework imports. Guards, actions, and context are pure TypeScript. |
323
289
 
324
290
  ## Next Steps
325
291