@xmachines/docs 1.0.0-beta.9 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -7
- package/api/@xmachines/play/README.md +160 -38
- package/api/@xmachines/play/classes/NonNullableError.md +189 -0
- package/api/@xmachines/play/classes/PlayError.md +251 -0
- package/api/@xmachines/play/functions/assertNonNullable.md +56 -0
- package/api/@xmachines/play/type-aliases/PlayEvent.md +6 -6
- package/api/@xmachines/play-actor/README.md +141 -160
- package/api/@xmachines/play-actor/classes/AbstractActor.md +91 -122
- package/api/@xmachines/play-actor/functions/attachRenderErrorHandler.md +40 -0
- package/api/@xmachines/play-actor/functions/toAtomState.md +33 -0
- package/api/@xmachines/play-actor/functions/typedSpec.md +54 -0
- package/api/@xmachines/play-actor/interfaces/BaseActorProviderProps.md +46 -0
- package/api/@xmachines/play-actor/interfaces/BaseViewContextValue.md +33 -0
- package/api/@xmachines/play-actor/interfaces/PlaySpec.md +28 -0
- package/api/@xmachines/play-actor/interfaces/Routable.md +6 -21
- package/api/@xmachines/play-actor/interfaces/Viewable.md +12 -6
- package/api/@xmachines/play-dom/README.md +384 -0
- package/api/@xmachines/play-dom/classes/PlayRenderer.md +115 -0
- package/api/@xmachines/play-dom/functions/createPlayUI.md +28 -0
- package/api/@xmachines/play-dom/functions/createRenderer.md +44 -0
- package/api/@xmachines/play-dom/functions/defineRegistry.md +26 -0
- package/api/@xmachines/play-dom/functions/renderSpec.md +67 -0
- package/api/@xmachines/play-dom/interfaces/ComponentContext.md +23 -0
- package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +34 -0
- package/api/@xmachines/play-dom/interfaces/DefineRegistryResult.md +17 -0
- package/api/@xmachines/play-dom/interfaces/DomRenderContext.md +28 -0
- package/api/@xmachines/play-dom/interfaces/EventHandle.md +15 -0
- package/api/@xmachines/play-dom/interfaces/MountOptions.md +18 -0
- package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +30 -0
- package/api/@xmachines/play-dom/interfaces/RenderSpecOptions.md +26 -0
- package/api/@xmachines/play-dom/interfaces/UIProviderOptions.md +32 -0
- package/api/@xmachines/play-dom/type-aliases/ActionFn.md +46 -0
- package/api/@xmachines/play-dom/type-aliases/Actions.md +18 -0
- package/api/@xmachines/play-dom/type-aliases/BaseComponentProps.md +114 -0
- package/api/@xmachines/play-dom/type-aliases/CatalogHasActions.md +25 -0
- package/api/@xmachines/play-dom/type-aliases/ComponentFn.md +26 -0
- package/api/@xmachines/play-dom/type-aliases/ComponentRegistry.md +15 -0
- package/api/@xmachines/play-dom/type-aliases/ConfirmHandler.md +44 -0
- package/api/@xmachines/play-dom/type-aliases/DefineRegistryOptions.md +39 -0
- package/api/@xmachines/play-dom/type-aliases/DomComponentRenderer.md +20 -0
- package/api/@xmachines/play-dom/type-aliases/DomRegistry.md +9 -0
- package/api/@xmachines/play-dom/type-aliases/DomSchema.md +9 -0
- package/api/@xmachines/play-dom/type-aliases/MountFn.md +27 -0
- package/api/@xmachines/play-dom/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-dom/type-aliases/SetState.md +30 -0
- package/api/@xmachines/play-dom/variables/schema.md +62 -0
- package/api/@xmachines/play-dom-router/README.md +271 -0
- package/api/@xmachines/play-dom-router/functions/connectRouter.md +43 -0
- package/api/@xmachines/{play-router → play-dom-router}/functions/createBrowserHistory.md +10 -2
- package/api/@xmachines/play-dom-router/functions/createRouteMap.md +39 -0
- package/api/@xmachines/play-dom-router/functions/createRouter.md +54 -0
- package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +176 -0
- package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +69 -0
- package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +15 -0
- package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +129 -0
- package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +68 -0
- package/api/@xmachines/play-dom-router/interfaces/RouteLookupContract.md +54 -0
- package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +121 -0
- package/api/@xmachines/play-dom-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +27 -0
- package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +104 -0
- package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +28 -0
- package/api/@xmachines/play-react/README.md +185 -334
- package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +46 -42
- package/api/@xmachines/play-react/functions/ActionProvider.md +21 -0
- package/api/@xmachines/play-react/functions/JSONUIProvider.md +21 -0
- package/api/@xmachines/play-react/functions/Renderer.md +21 -0
- package/api/@xmachines/play-react/functions/StateProvider.md +27 -0
- package/api/@xmachines/play-react/functions/ValidationProvider.md +21 -0
- package/api/@xmachines/play-react/functions/VisibilityProvider.md +21 -0
- package/api/@xmachines/play-react/functions/defineRegistry.md +49 -0
- package/api/@xmachines/play-react/functions/useActor.md +13 -0
- package/api/@xmachines/play-react/functions/useBoundProp.md +45 -0
- package/api/@xmachines/play-react/functions/usePlayView.md +32 -0
- package/api/@xmachines/play-react/functions/useSignalEffect.md +29 -20
- package/api/@xmachines/play-react/interfaces/ActionProviderProps.md +15 -0
- package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +27 -0
- package/api/@xmachines/play-react/interfaces/ComponentContext.md +37 -0
- package/api/@xmachines/play-react/interfaces/JSONUIProviderProps.md +22 -0
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +7 -7
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +6 -6
- package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +26 -0
- package/api/@xmachines/play-react/interfaces/RendererProps.md +17 -0
- package/api/@xmachines/play-react/interfaces/StateProviderProps.md +16 -0
- package/api/@xmachines/play-react/interfaces/ValidationProviderProps.md +14 -0
- package/api/@xmachines/play-react/interfaces/ViewContextValue.md +20 -0
- package/api/@xmachines/play-react/interfaces/VisibilityProviderProps.md +13 -0
- package/api/@xmachines/play-react/type-aliases/AnyPlayActor.md +11 -0
- package/api/@xmachines/play-react/type-aliases/ComponentFn.md +36 -0
- package/api/@xmachines/play-react/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-react/variables/ActorProvider.md +33 -0
- package/api/@xmachines/play-react/variables/PlayRenderer.md +6 -56
- package/api/@xmachines/play-react/variables/PlayUIProvider.md +43 -0
- package/api/@xmachines/play-react-router/README.md +130 -114
- package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +19 -242
- package/api/@xmachines/play-react-router/classes/RouteMap.md +48 -36
- package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +45 -0
- package/api/@xmachines/play-react-router/functions/createRouteMap.md +39 -0
- package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +23 -12
- package/api/@xmachines/play-react-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderBaseProps.md +32 -0
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +25 -9
- package/api/@xmachines/play-react-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +19 -9
- package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-react-router/type-aliases/PlayRouterBridgeConstructor.md +30 -0
- package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +32 -0
- package/api/@xmachines/play-router/README.md +275 -353
- package/api/@xmachines/play-router/classes/RouteMap.md +149 -0
- package/api/@xmachines/play-router/classes/RouterBridgeBase.md +21 -221
- package/api/@xmachines/play-router/functions/buildPlayRouteEvent.md +32 -0
- package/api/@xmachines/play-router/functions/buildRouteTree.md +12 -2
- package/api/@xmachines/play-router/functions/createRouteMap.md +22 -36
- package/api/@xmachines/play-router/functions/createRouteMapFromTree.md +46 -0
- package/api/@xmachines/play-router/functions/detectDuplicateRoutes.md +14 -7
- package/api/@xmachines/play-router/functions/extractMachineRoutes.md +10 -46
- package/api/@xmachines/play-router/functions/extractQuery.md +22 -0
- package/api/@xmachines/play-router/functions/extractRouteParams.md +54 -0
- package/api/@xmachines/play-router/functions/findRouteById.md +2 -2
- package/api/@xmachines/play-router/functions/findRouteByPath.md +2 -2
- package/api/@xmachines/play-router/functions/getNavigableRoutes.md +2 -2
- package/api/@xmachines/play-router/functions/getRoutableRoutes.md +2 -2
- package/api/@xmachines/play-router/functions/getTransitionReachableRoutes.md +43 -0
- package/api/@xmachines/play-router/functions/isRouteReachable.md +38 -0
- package/api/@xmachines/play-router/functions/machineToGraph.md +19 -0
- package/api/@xmachines/play-router/functions/routeExists.md +2 -2
- package/api/@xmachines/play-router/functions/sanitizePathname.md +40 -0
- package/api/@xmachines/play-router/functions/validateRouteFormat.md +10 -9
- package/api/@xmachines/play-router/functions/validateStateExists.md +9 -9
- package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +13 -0
- package/api/@xmachines/play-router/interfaces/LocationLike.md +27 -0
- package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +15 -0
- package/api/@xmachines/play-router/interfaces/MachineNodeData.md +17 -0
- package/api/@xmachines/play-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-router/interfaces/ResolvedRoutePath.md +17 -0
- package/api/@xmachines/play-router/interfaces/RoutableActor.md +64 -0
- package/api/@xmachines/play-router/interfaces/RouteInfo.md +11 -11
- package/api/@xmachines/play-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-router/interfaces/RouteMapping.md +27 -0
- package/api/@xmachines/play-router/interfaces/RouteMatch.md +12 -0
- package/api/@xmachines/play-router/interfaces/RouteNode.md +13 -13
- package/api/@xmachines/play-router/interfaces/RouteObject.md +5 -5
- package/api/@xmachines/play-router/interfaces/RouteTree.md +8 -7
- package/api/@xmachines/play-router/interfaces/RouteWatcherHandle.md +55 -0
- package/api/@xmachines/play-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-router/interfaces/WindowLike.md +65 -0
- package/api/@xmachines/play-router/type-aliases/MachineGraph.md +20 -0
- package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +2 -2
- package/api/@xmachines/play-signals/README.md +116 -65
- package/api/@xmachines/play-signals/functions/watchSignal.md +42 -0
- package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +7 -5
- package/api/@xmachines/play-signals/interfaces/SignalComputed.md +3 -3
- package/api/@xmachines/play-signals/interfaces/SignalOptions.md +7 -5
- package/api/@xmachines/play-signals/interfaces/SignalState.md +4 -4
- package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +5 -5
- package/api/@xmachines/play-signals/namespaces/Signal/README.md +1 -1
- package/api/@xmachines/play-signals/namespaces/Signal/classes/Computed.md +7 -7
- package/api/@xmachines/play-signals/namespaces/Signal/classes/State.md +8 -8
- package/api/@xmachines/play-signals/namespaces/Signal/interfaces/Options.md +7 -7
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/README.md +1 -1
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/classes/Watcher.md +9 -9
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/currentComputed.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/hasSinks.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/hasSources.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/introspectSinks.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/introspectSources.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/untrack.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/variables/unwatched.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/variables/watched.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/variables/isComputed.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/variables/isState.md +2 -2
- package/api/@xmachines/play-signals/namespaces/Signal/variables/isWatcher.md +2 -2
- package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +2 -2
- package/api/@xmachines/play-solid/README.md +196 -234
- package/api/@xmachines/play-solid/functions/ActionProvider.md +19 -0
- package/api/@xmachines/play-solid/functions/JSONUIProvider.md +21 -0
- package/api/@xmachines/play-solid/functions/Renderer.md +21 -0
- package/api/@xmachines/play-solid/functions/StateProvider.md +19 -0
- package/api/@xmachines/play-solid/functions/ValidationProvider.md +19 -0
- package/api/@xmachines/play-solid/functions/VisibilityProvider.md +20 -0
- package/api/@xmachines/play-solid/functions/defineRegistry.md +49 -0
- package/api/@xmachines/play-solid/functions/useAction.md +24 -0
- package/api/@xmachines/play-solid/functions/useActions.md +13 -0
- package/api/@xmachines/play-solid/functions/useActor.md +13 -0
- package/api/@xmachines/play-solid/functions/useBoundProp.md +45 -0
- package/api/@xmachines/play-solid/functions/useFieldValidation.md +29 -0
- package/api/@xmachines/play-solid/functions/useIsVisible.md +19 -0
- package/api/@xmachines/play-solid/functions/useOptionalValidation.md +13 -0
- package/api/@xmachines/play-solid/functions/usePlayView.md +30 -0
- package/api/@xmachines/play-solid/functions/useStateBinding.md +25 -0
- package/api/@xmachines/play-solid/functions/useStateStore.md +13 -0
- package/api/@xmachines/play-solid/functions/useStateValue.md +25 -0
- package/api/@xmachines/play-solid/functions/useVisibility.md +13 -0
- package/api/@xmachines/play-solid/interfaces/ActionProviderProps.md +12 -0
- package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +30 -0
- package/api/@xmachines/play-solid/interfaces/ComponentContext.md +37 -0
- package/api/@xmachines/play-solid/interfaces/DefineRegistryResult.md +15 -0
- package/api/@xmachines/play-solid/interfaces/JSONUIProviderProps.md +22 -0
- package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +26 -0
- package/api/@xmachines/play-solid/interfaces/RendererProps.md +17 -0
- package/api/@xmachines/play-solid/interfaces/StateProviderProps.md +13 -0
- package/api/@xmachines/play-solid/interfaces/ValidationProviderProps.md +11 -0
- package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +21 -0
- package/api/@xmachines/play-solid/type-aliases/AnyPlayActor.md +11 -0
- package/api/@xmachines/play-solid/type-aliases/ComponentFn.md +36 -0
- package/api/@xmachines/play-solid/type-aliases/ComponentRegistry.md +11 -0
- package/api/@xmachines/play-solid/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-solid/type-aliases/SetState.md +21 -0
- package/api/@xmachines/play-solid/type-aliases/VisibilityProviderProps.md +9 -0
- package/api/@xmachines/play-solid/variables/ActorContext.md +13 -0
- package/api/@xmachines/play-solid/variables/ActorProvider.md +27 -0
- package/api/@xmachines/play-solid/variables/PlayRenderer.md +6 -62
- package/api/@xmachines/play-solid/variables/PlayUIProvider.md +26 -0
- package/api/@xmachines/play-solid-router/README.md +151 -560
- package/api/@xmachines/play-solid-router/classes/RouteMap.md +31 -32
- package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +27 -242
- package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +44 -0
- package/api/@xmachines/play-solid-router/functions/createRouteMap.md +18 -11
- package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +84 -115
- package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderBaseProps.md +30 -0
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +25 -9
- package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +20 -7
- package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +34 -0
- package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +8 -4
- package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +22 -19
- package/api/@xmachines/play-solid-router/variables/PlayRouterProvider.md +52 -0
- package/api/@xmachines/play-svelte/README.md +269 -0
- package/api/@xmachines/play-svelte/functions/defineRegistry.md +31 -0
- package/api/@xmachines/play-svelte/functions/getActorContext.md +21 -0
- package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +19 -0
- package/api/@xmachines/play-svelte/functions/setActorContext.md +19 -0
- package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +44 -0
- package/api/@xmachines/play-svelte/interfaces/BaseComponentProps.md +29 -0
- package/api/@xmachines/play-svelte/interfaces/ComponentContext.md +29 -0
- package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +24 -0
- package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +43 -0
- package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +24 -0
- package/api/@xmachines/play-svelte/type-aliases/ActionFn.md +30 -0
- package/api/@xmachines/play-svelte/type-aliases/Actions.md +17 -0
- package/api/@xmachines/play-svelte/type-aliases/AnyPlayActor.md +11 -0
- package/api/@xmachines/play-svelte/type-aliases/ComponentFn.md +18 -0
- package/api/@xmachines/play-svelte/type-aliases/JSONUIProviderProps.md +7 -0
- package/api/@xmachines/play-svelte/type-aliases/PlayRenderer.md +9 -0
- package/api/@xmachines/play-svelte/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-svelte/type-aliases/SetState.md +21 -0
- package/api/@xmachines/play-svelte/variables/PlayRenderer.md +9 -0
- package/api/@xmachines/play-svelte-spa-router/README.md +199 -0
- package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +149 -0
- package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +32 -0
- package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +39 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +17 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +129 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +27 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +104 -0
- package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +65 -0
- package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +9 -0
- package/api/@xmachines/play-sveltekit-router/README.md +211 -0
- package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +149 -0
- package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +32 -0
- package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +39 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +13 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +27 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +129 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +27 -0
- package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +104 -0
- package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +9 -0
- package/api/@xmachines/play-tanstack-react-router/README.md +155 -126
- package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +48 -36
- package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +31 -252
- package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +45 -0
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +22 -36
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +23 -12
- package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +28 -0
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderBaseProps.md +32 -0
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +25 -9
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +19 -9
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +6 -6
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterBridgeConstructor.md +30 -0
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +2 -2
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +40 -18
- package/api/@xmachines/play-tanstack-react-router/variables/PlayRouterProvider.md +34 -0
- package/api/@xmachines/play-tanstack-router/README.md +58 -0
- package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +131 -0
- package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouteMapLike.md +57 -0
- package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouterLike.md +100 -0
- package/api/@xmachines/play-tanstack-solid-router/README.md +215 -175
- package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +31 -32
- package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +121 -0
- package/api/@xmachines/play-tanstack-solid-router/functions/createPlayRouterProvider.md +44 -0
- package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +18 -11
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderBaseProps.md +31 -0
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +23 -9
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +14 -10
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterBridgeConstructor.md +30 -0
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +8 -4
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +3 -3
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +40 -18
- package/api/@xmachines/play-tanstack-solid-router/variables/PlayRouterProvider.md +33 -0
- package/api/@xmachines/play-vue/README.md +192 -210
- package/api/@xmachines/play-vue/functions/defineRegistry.md +32 -0
- package/api/@xmachines/play-vue/functions/getPlayViewContext.md +28 -0
- package/api/@xmachines/play-vue/functions/useActor.md +13 -0
- package/api/@xmachines/play-vue/functions/useBoundProp.md +45 -0
- package/api/@xmachines/play-vue/interfaces/ActionProviderProps.md +12 -0
- package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +25 -0
- package/api/@xmachines/play-vue/interfaces/ComponentContext.md +37 -0
- package/api/@xmachines/play-vue/interfaces/DefineRegistryResult.md +15 -0
- package/api/@xmachines/play-vue/interfaces/JSONUIProviderProps.md +21 -0
- package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +24 -0
- package/api/@xmachines/play-vue/interfaces/RendererProps.md +17 -0
- package/api/@xmachines/play-vue/interfaces/StateProviderProps.md +15 -0
- package/api/@xmachines/play-vue/interfaces/ValidationProviderProps.md +11 -0
- package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +21 -0
- package/api/@xmachines/play-vue/interfaces/VisibilityProviderProps.md +5 -0
- package/api/@xmachines/play-vue/type-aliases/AnyPlayActor.md +11 -0
- package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +16 -0
- package/api/@xmachines/play-vue/type-aliases/ComponentFn.md +35 -0
- package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +15 -0
- package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +22 -0
- package/api/@xmachines/play-vue/type-aliases/RenderErrorHandler.md +23 -0
- package/api/@xmachines/play-vue/variables/ActionProvider.md +64 -0
- package/api/@xmachines/play-vue/variables/JSONUIProvider.md +105 -0
- package/api/@xmachines/play-vue/variables/PlayRenderer.md +2 -2
- package/api/@xmachines/play-vue/variables/Renderer.md +88 -0
- package/api/@xmachines/play-vue/variables/StateProvider.md +79 -0
- package/api/@xmachines/play-vue/variables/ValidationProvider.md +55 -0
- package/api/@xmachines/play-vue/variables/VisibilityProvider.md +40 -0
- package/api/@xmachines/play-vue-router/README.md +173 -487
- package/api/@xmachines/play-vue-router/classes/RouteMap.md +56 -116
- package/api/@xmachines/play-vue-router/classes/VueRouterBridge.md +23 -271
- package/api/@xmachines/play-vue-router/functions/createRouteMap.md +26 -6
- package/api/@xmachines/play-vue-router/interfaces/PlayActor.md +68 -0
- package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +22 -12
- package/api/@xmachines/play-vue-router/interfaces/RouteMapOptions.md +13 -0
- package/api/@xmachines/play-vue-router/interfaces/RouteMapping.md +20 -8
- package/api/@xmachines/play-vue-router/interfaces/RouterBridge.md +8 -8
- package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +8 -4
- package/api/@xmachines/play-vue-router/variables/PlayRouterProvider.md +12 -6
- package/api/@xmachines/play-xstate/README.md +178 -347
- package/api/@xmachines/play-xstate/classes/PlayerActor.md +161 -191
- package/api/@xmachines/play-xstate/functions/buildRouteUrl.md +31 -20
- package/api/@xmachines/play-xstate/functions/composeGuards.md +2 -2
- package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +2 -2
- package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +38 -0
- package/api/@xmachines/play-xstate/functions/definePlayer.md +14 -63
- package/api/@xmachines/play-xstate/functions/deriveRoute.md +3 -3
- package/api/@xmachines/play-xstate/functions/eventMatches.md +2 -2
- package/api/@xmachines/play-xstate/functions/formatPlayRouteTransitions.md +3 -3
- package/api/@xmachines/play-xstate/functions/hasContext.md +2 -2
- package/api/@xmachines/play-xstate/functions/isAbsoluteRoute.md +2 -2
- package/api/@xmachines/play-xstate/functions/negateGuard.md +2 -2
- package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +10 -14
- package/api/@xmachines/play-xstate/interfaces/PlayerFactoryResumeOptions.md +22 -0
- package/api/@xmachines/play-xstate/interfaces/PlayerOptions.md +12 -13
- package/api/@xmachines/play-xstate/interfaces/RouteContext.md +15 -13
- package/api/@xmachines/play-xstate/interfaces/RouteObject.md +17 -0
- package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +2 -2
- package/api/@xmachines/play-xstate/type-aliases/Guard.md +2 -2
- package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +3 -3
- package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +10 -9
- package/api/@xmachines/play-xstate/type-aliases/RouteMachineConfig.md +15 -5
- package/api/@xmachines/play-xstate/type-aliases/RouteMetadata.md +9 -0
- package/api/@xmachines/play-xstate/type-aliases/RouteStateNode.md +22 -6
- package/api/@xmachines/shared/README.md +95 -295
- package/api/@xmachines/shared/vite-aliases/README.md +11 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmAliases.md +38 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmCacheDir.md +27 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmOptimizeDeps.md +30 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmResolve.md +42 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmSvelteRunes.md +33 -0
- package/api/@xmachines/shared/vitest/README.md +12 -0
- package/api/@xmachines/shared/vitest/functions/defineXmBrowserConfig.md +42 -0
- package/api/@xmachines/shared/vitest/functions/defineXmVitestConfig.md +34 -0
- package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +16 -0
- package/api/README.md +6 -7
- package/api/llms.txt +72 -23
- package/contributing/README.md +10 -0
- package/contributing/architecture.md +599 -0
- package/contributing/configuration.md +368 -0
- package/contributing/deployment.md +312 -0
- package/contributing/development.md +464 -0
- package/contributing/testing.md +453 -0
- package/examples/@xmachines/play-dom-demo/README.md +181 -0
- package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +24 -0
- package/examples/@xmachines/play-dom-demo/functions/initShell.md +24 -0
- package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-dom-demo/variables/About.md +12 -0
- package/examples/@xmachines/play-dom-demo/variables/Contact.md +12 -0
- package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Home.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Login.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +16 -0
- package/examples/@xmachines/play-dom-demo/variables/Navigation.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Overview.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Profile.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Settings.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/Stats.md +13 -0
- package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-dom-router-demo/README.md +145 -0
- package/examples/@xmachines/play-react-demo/README.md +187 -0
- package/examples/@xmachines/play-react-demo/functions/App.md +13 -0
- package/examples/@xmachines/play-react-demo/functions/DebugPanel.md +20 -0
- package/examples/@xmachines/play-react-demo/functions/HeaderNav.md +20 -0
- package/examples/@xmachines/play-react-demo/functions/Shell.md +22 -0
- package/examples/@xmachines/play-react-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-react-demo/variables/About.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Contact.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Dashboard.md +15 -0
- package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +15 -0
- package/examples/@xmachines/play-react-demo/variables/Home.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Login.md +16 -0
- package/examples/@xmachines/play-react-demo/variables/NavBar.md +16 -0
- package/examples/@xmachines/play-react-demo/variables/NavBarView.md +15 -0
- package/examples/@xmachines/play-react-demo/variables/Navigation.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Overview.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Profile.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Settings.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/Shell.md +18 -0
- package/examples/@xmachines/play-react-demo/variables/Stats.md +14 -0
- package/examples/@xmachines/play-react-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-react-router-demo/README.md +151 -0
- package/examples/@xmachines/play-solid-demo/README.md +187 -0
- package/examples/@xmachines/play-solid-demo/functions/App.md +13 -0
- package/examples/@xmachines/play-solid-demo/functions/DebugPanel.md +20 -0
- package/examples/@xmachines/play-solid-demo/functions/HeaderNav.md +20 -0
- package/examples/@xmachines/play-solid-demo/functions/Shell.md +22 -0
- package/examples/@xmachines/play-solid-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/About.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Contact.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +15 -0
- package/examples/@xmachines/play-solid-demo/variables/Home.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Login.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/NavBar.md +11 -0
- package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +15 -0
- package/examples/@xmachines/play-solid-demo/variables/Navigation.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Overview.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Profile.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Settings.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/Shell.md +17 -0
- package/examples/@xmachines/play-solid-demo/variables/Stats.md +9 -0
- package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-solid-router-demo/README.md +137 -0
- package/examples/@xmachines/play-svelte-demo/README.md +143 -0
- package/examples/@xmachines/play-svelte-demo/type-aliases/App.md +9 -0
- package/examples/@xmachines/play-svelte-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-svelte-demo/variables/App.md +9 -0
- package/examples/@xmachines/play-svelte-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-svelte-spa-router-demo/README.md +129 -0
- package/examples/@xmachines/play-sveltekit-router-demo/README.md +133 -0
- package/examples/@xmachines/play-tanstack-react-router-demo/README.md +156 -0
- package/examples/@xmachines/play-tanstack-solid-router-demo/README.md +139 -0
- package/examples/@xmachines/play-vue-demo/README.md +183 -0
- package/examples/@xmachines/play-vue-demo/type-aliases/AuthCatalog.md +9 -0
- package/examples/@xmachines/play-vue-demo/variables/App.md +9 -0
- package/examples/@xmachines/play-vue-demo/variables/authCatalog.md +172 -0
- package/examples/@xmachines/play-vue-router-demo/README.md +139 -0
- package/examples/README.md +78 -30
- package/examples/basic-state-machine.md +75 -31
- package/examples/form-validation.md +261 -118
- package/examples/multi-router-integration.md +314 -194
- package/examples/routing-patterns.md +230 -189
- package/examples/traffic-light.md +114 -65
- package/guides/README.md +9 -21
- package/guides/actor-model.md +180 -0
- package/guides/getting-started.md +619 -137
- package/guides/signals.md +166 -0
- package/guides/state-machines.md +284 -0
- package/package.json +18 -7
- package/rfc/broker.md +100 -0
- package/rfc/browser.md +44 -0
- package/rfc/cli.md +118 -0
- package/rfc/git.md +61 -0
- package/rfc/mcp.md +43 -0
- package/rfc/node.md +36 -0
- package/rfc/play.md +472 -0
- package/rfc/rest.md +102 -0
- package/rfc/run.md +159 -0
- package/rfc/streams.md +168 -0
- package/api/@xmachines/play-actor/interfaces/ViewMetadata.md +0 -17
- package/api/@xmachines/play-catalog/README.md +0 -331
- package/api/@xmachines/play-catalog/functions/defineCatalog.md +0 -98
- package/api/@xmachines/play-catalog/functions/defineComponents.md +0 -134
- package/api/@xmachines/play-catalog/type-aliases/Catalog.md +0 -48
- package/api/@xmachines/play-catalog/type-aliases/ComponentsFor.md +0 -20
- package/api/@xmachines/play-catalog/type-aliases/InferComponentProps.md +0 -65
- package/api/@xmachines/play-catalog/type-aliases/NoExtraKeys.md +0 -17
- package/api/@xmachines/play-react/interfaces/PlayRendererProps.md +0 -15
- package/api/@xmachines/play-react-router/functions/PlayRouterProvider.md +0 -19
- package/api/@xmachines/play-react-router-demo/README.md +0 -137
- package/api/@xmachines/play-router/classes/BaseRouteMap.md +0 -142
- package/api/@xmachines/play-router/functions/connectRouter.md +0 -67
- package/api/@xmachines/play-router/functions/crawlMachine.md +0 -92
- package/api/@xmachines/play-router/functions/createRouter.md +0 -76
- package/api/@xmachines/play-router/functions/extractRoute.md +0 -45
- package/api/@xmachines/play-router/interfaces/BaseRouteMapping.md +0 -27
- package/api/@xmachines/play-router/interfaces/BrowserHistory.md +0 -172
- package/api/@xmachines/play-router/interfaces/BrowserWindow.md +0 -69
- package/api/@xmachines/play-router/interfaces/ConnectRouterOptions.md +0 -13
- package/api/@xmachines/play-router/interfaces/RouteMap.md +0 -56
- package/api/@xmachines/play-router/interfaces/StateVisit.md +0 -15
- package/api/@xmachines/play-router/interfaces/VanillaRouter.md +0 -28
- package/api/@xmachines/play-router-demo/README.md +0 -137
- package/api/@xmachines/play-solid/interfaces/PlayRendererProps.md +0 -15
- package/api/@xmachines/play-solid-router/functions/PlayRouterProvider.md +0 -19
- package/api/@xmachines/play-solid-router-demo/README.md +0 -127
- package/api/@xmachines/play-tanstack-react-router/functions/PlayRouterProvider.md +0 -19
- package/api/@xmachines/play-tanstack-react-router/functions/extractParams.md +0 -38
- package/api/@xmachines/play-tanstack-react-router/functions/extractQueryParams.md +0 -33
- package/api/@xmachines/play-tanstack-react-router/variables/extractMachineRoutes.md +0 -64
- package/api/@xmachines/play-tanstack-react-router-demo/README.md +0 -126
- package/api/@xmachines/play-tanstack-solid-router/classes/SolidRouterBridge.md +0 -343
- package/api/@xmachines/play-tanstack-solid-router/functions/PlayRouterProvider.md +0 -19
- package/api/@xmachines/play-tanstack-solid-router-demo/README.md +0 -126
- package/api/@xmachines/play-vue/interfaces/PlayRendererProps.md +0 -14
- package/api/@xmachines/play-vue-router/classes/VueBaseRouteMap.md +0 -201
- package/api/@xmachines/play-vue-router-demo/README.md +0 -133
- package/api/@xmachines/play-xstate/functions/mergeViewProps.md +0 -26
- package/api/@xmachines/play-xstate/functions/stateMatches.md +0 -25
- package/api/@xmachines/play-xstate/functions/validateComponentBinding.md +0 -39
- package/api/@xmachines/play-xstate/functions/validateViewProps.md +0 -80
- package/api/@xmachines/play-xstate/interfaces/CatalogEntry.md +0 -16
- package/api/@xmachines/play-xstate/type-aliases/Catalog.md +0 -21
- package/api/@xmachines/play-xstate/type-aliases/ValidationResult.md +0 -17
- package/api/@xmachines/play-xstate/type-aliases/ViewMergeContext.md +0 -35
- package/api/@xmachines/shared/functions/defineXmVitestConfig.md +0 -29
- package/api/@xmachines/shared/functions/xmAliases.md +0 -24
- package/guides/installation.md +0 -323
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
<!-- generated-by: gsd-doc-writer -->
|
|
2
|
+
|
|
3
|
+
# Testing
|
|
4
|
+
|
|
5
|
+
This document describes the test framework, conventions, and CI integration for the XMachines JS monorepo.
|
|
6
|
+
|
|
7
|
+
## Test Framework and Setup
|
|
8
|
+
|
|
9
|
+
The monorepo uses **[Vitest](https://vitest.dev/) `^4.1.5`** as its test framework, with **@vitest/coverage-v8** for coverage reporting and **@vitest/browser-playwright** (Playwright/Chromium) for browser-mode tests.
|
|
10
|
+
|
|
11
|
+
All packages extend the shared Vitest configuration helper `defineXmVitestConfig` (from `@xmachines/shared/vitest`) which automatically applies:
|
|
12
|
+
|
|
13
|
+
- `@xmachines/*` source aliases so imports resolve to source during test runs
|
|
14
|
+
- `@xmachines/shared/vitest-setup` — extends Vitest matchers with `@testing-library/jest-dom`
|
|
15
|
+
- `@xmachines/shared/vitest-node-setup` — enforces Node.js ≥ 22 on non-browser projects
|
|
16
|
+
|
|
17
|
+
**Auto-injected setup files:**
|
|
18
|
+
|
|
19
|
+
| File | When injected | Purpose |
|
|
20
|
+
| --------------------------------------------- | ------------------------ | ------------------------------------------------------- |
|
|
21
|
+
| `packages/shared/config/vitest.node.setup.ts` | All non-browser projects | Validates Node.js ≥ 22 runtime; throws if wrong runtime |
|
|
22
|
+
| `packages/shared/config/vitest.setup.ts` | All projects | Imports `@testing-library/jest-dom/vitest` matchers |
|
|
23
|
+
|
|
24
|
+
Before running any tests, ensure all dependencies are installed:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
pnpm install --frozen-lockfile
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Running Tests
|
|
31
|
+
|
|
32
|
+
### Full test suite (Node environments)
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pnpm test
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Runs `vitest run` across all 30 package-level projects defined in the root `vitest.config.ts`. Uses the `forks` pool (up to 4 workers) with process-level isolation between test files.
|
|
39
|
+
|
|
40
|
+
### Watch mode (development)
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pnpm run test:watch
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Runs `vitest` in interactive watch mode. Re-runs affected tests on file change.
|
|
47
|
+
|
|
48
|
+
### Browser tests (Playwright / Chromium)
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
pnpm run test:browser
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Runs `vitest run --config vitest.browser.config.ts`. Launches all browser-mode projects using headless Chromium via Playwright. Includes both package-level browser unit tests and full demo-app integration flows. The browser global setup (`vitest.browser.global-setup.ts`) raises `process.setMaxListeners` to 32 before workers spawn to prevent false-positive `MaxListenersExceededWarning` with multiple parallel browser projects.
|
|
55
|
+
|
|
56
|
+
### With coverage
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pnpm run test:coverage
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Produces coverage output in `text`, `html`, and `json-summary` formats.
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pnpm run coverage:report # HTML report
|
|
66
|
+
pnpm run coverage:summary # JSON summary only
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Verify TypeScript test graph compiles
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
pnpm run test:build
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Runs `tsc --build tsconfig.test.json`. This validates that all test TypeScript files across the monorepo type-check correctly without running the tests themselves. Also compiles `.typecheck.ts` files in `src/` directories.
|
|
76
|
+
|
|
77
|
+
### Running tests for a single package
|
|
78
|
+
|
|
79
|
+
From the monorepo root:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pnpm --filter @xmachines/play test
|
|
83
|
+
pnpm --filter @xmachines/play-react run test:coverage
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Or from within a package directory, run `pnpm exec vitest run` directly after building the workspace.
|
|
87
|
+
|
|
88
|
+
## Test File Organization
|
|
89
|
+
|
|
90
|
+
Tests live in a separate `test/` directory within each package — never co-located with source files.
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
packages/<name>/
|
|
94
|
+
├── src/
|
|
95
|
+
│ ├── *.ts
|
|
96
|
+
│ └── *.typecheck.ts # Compile-time-only type assertions (not Vitest tests)
|
|
97
|
+
└── test/
|
|
98
|
+
├── *.spec.ts # Protocol enforcement and type-safety tests
|
|
99
|
+
├── *.test.ts # Unit, integration, and behavioral tests
|
|
100
|
+
├── browser/
|
|
101
|
+
│ └── *.browser.test.ts(x) # Playwright browser environment tests
|
|
102
|
+
├── fixtures/ # Shared test actors, helpers, mock data
|
|
103
|
+
└── tsconfig.json # Test-specific tsconfig (extends shared/tsconfig-test)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### File naming conventions
|
|
107
|
+
|
|
108
|
+
| Extension | Purpose |
|
|
109
|
+
| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
110
|
+
| `.spec.ts` | Protocol enforcement tests; compile-time type safety tests; used in core packages (`play`, `play-actor`, `play-signals`, `play-xstate`) |
|
|
111
|
+
| `.test.ts` | Unit, integration, and behavioral tests; used across all packages |
|
|
112
|
+
| `.browser.test.ts` / `.browser.test.tsx` | Playwright browser environment tests; excluded from standard `vitest.config.ts`, only run via `vitest.browser.config.ts` |
|
|
113
|
+
| `.typecheck.ts` (in `src/`) | Compile-time-only type assertion files; not Vitest test files; validated by `pnpm run test:build` |
|
|
114
|
+
| `router-bridge-contract.ts` | Shared contract test runner; not a test file itself; imported by adapter test files |
|
|
115
|
+
|
|
116
|
+
### Test environments
|
|
117
|
+
|
|
118
|
+
| Environment | Packages |
|
|
119
|
+
| ----------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
120
|
+
| `node` | Core logic: `@xmachines/play`, `play-actor`, `play-signals`, `play-xstate`, `play-router`, router adapters |
|
|
121
|
+
| `jsdom` | UI renderers: `@xmachines/play-react`, `play-vue`, `play-solid`, `play-svelte`, `play-dom` |
|
|
122
|
+
| Browser (Playwright/Chromium) | Browser-specific and E2E demo tests |
|
|
123
|
+
|
|
124
|
+
### Test helpers and shared setup
|
|
125
|
+
|
|
126
|
+
- **`@xmachines/shared/vitest-setup`** — Injects `@testing-library/jest-dom` matchers. Applied automatically by `defineXmVitestConfig`.
|
|
127
|
+
- **`@xmachines/shared/vitest-node-setup`** — Enforces Node ≥ 22 at runtime. Auto-injected for non-browser configs.
|
|
128
|
+
- **`@xmachines/shared/vitest-urlpattern-setup`** — Polyfills `URLPattern` for packages that need it (e.g. `@xmachines/play-router`). Must be declared explicitly in `setupFiles`.
|
|
129
|
+
- **`packages/play-react/test/test-utils.ts`** — React-specific test utilities for the `play-react` package.
|
|
130
|
+
- **`packages/play-router/examples/shared/`** and **`packages/play-actor/examples/shared/`** — Shared test fixtures for router and actor integration tests.
|
|
131
|
+
|
|
132
|
+
## Writing New Tests
|
|
133
|
+
|
|
134
|
+
### Adding a new package test config
|
|
135
|
+
|
|
136
|
+
1. Place test files under `packages/<pkg>/test/`.
|
|
137
|
+
2. Name them following the convention above.
|
|
138
|
+
3. Import `defineXmVitestConfig` in the package's `vitest.config.ts`:
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
import { defineXmVitestConfig } from "@xmachines/shared/vitest";
|
|
142
|
+
|
|
143
|
+
export default defineXmVitestConfig(import.meta.url, {
|
|
144
|
+
test: {
|
|
145
|
+
environment: "node",
|
|
146
|
+
include: ["test/**/*.test.ts"],
|
|
147
|
+
exclude: ["node_modules/**"],
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
4. Register the new config in the root `vitest.config.ts` `projects` array.
|
|
153
|
+
5. Add the package's `tsconfig.test.json` to `tsconfig.test.json` references in the root.
|
|
154
|
+
|
|
155
|
+
### Basic test structure
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { describe, it, test, expect, vi, beforeEach, afterEach } from "vitest";
|
|
159
|
+
|
|
160
|
+
describe("ClassName or functionName()", () => {
|
|
161
|
+
describe("feature group or scenario", () => {
|
|
162
|
+
test("specific behavior being verified", () => {
|
|
163
|
+
// arrange
|
|
164
|
+
const actor = createMockActor("/");
|
|
165
|
+
|
|
166
|
+
// act
|
|
167
|
+
actor.send({ type: "play.route", to: "#about" });
|
|
168
|
+
|
|
169
|
+
// assert
|
|
170
|
+
expect(actor.currentRoute.get()).toBe("/about");
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Import style:** Always use `.js` extensions in imports (ESM requirement):
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import { AbstractActor } from "../src/abstract-actor.js";
|
|
180
|
+
import { Signal } from "@xmachines/play-signals";
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Lifecycle hooks
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
beforeEach(() => {
|
|
187
|
+
vi.spyOn(console, "error").mockImplementation(() => {});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
afterEach(() => {
|
|
191
|
+
vi.restoreAllMocks(); // Always restore spies
|
|
192
|
+
cleanup(); // For @testing-library/react or equivalent
|
|
193
|
+
});
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### What to mock / what not to mock
|
|
197
|
+
|
|
198
|
+
**Mock these:**
|
|
199
|
+
|
|
200
|
+
- **Framework router objects** (TanStack Router, Vue Router, React Router, SolidJS Router) — mock with typed `vi.fn()` interfaces because they are external framework dependencies and carry significant setup complexity:
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
const mocks = vi.hoisted(() => ({
|
|
204
|
+
machineToGraph: vi.fn(),
|
|
205
|
+
buildRouteTree: vi.fn(),
|
|
206
|
+
}));
|
|
207
|
+
|
|
208
|
+
vi.mock("../src/machine-to-graph.js", () => ({
|
|
209
|
+
machineToGraph: mocks.machineToGraph,
|
|
210
|
+
}));
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
- **`console.warn` / `console.error`** when testing code that legitimately emits warnings — mock to suppress noise and assert call counts:
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
217
|
+
// ... test ...
|
|
218
|
+
expect(warnSpy).toHaveBeenCalled();
|
|
219
|
+
vi.restoreAllMocks(); // in afterEach
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
- **External module collaborators** when testing a unit in isolation.
|
|
223
|
+
|
|
224
|
+
**Never mock these:**
|
|
225
|
+
|
|
226
|
+
- **TC39 Signals** (`Signal.State`, `Signal.Computed`, `Signal.subtle.Watcher`) — always use real implementations from `@xmachines/play-signals`. Signals have precise reactive semantics (synchronous propagation, lazy computation) that mocks cannot replicate accurately.
|
|
227
|
+
- **Internal `@xmachines/*` packages** — these are resolved directly to source via the `xmAliases` Vite plugin in the Vitest config. Mocking them would hide integration bugs and defeat the purpose of cross-package testing.
|
|
228
|
+
- **XState** — always use real `setup()` / `createMachine()` / `createActor()`. XState's actor lifecycle (start, stop, snapshot, subscription) is a behavioral contract that mocks cannot reliably emulate.
|
|
229
|
+
|
|
230
|
+
### Test actor patterns
|
|
231
|
+
|
|
232
|
+
**Preferred: extend `AbstractActor` for full type safety:**
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
import { AbstractActor } from "@xmachines/play-actor";
|
|
236
|
+
import type { Routable } from "@xmachines/play-actor";
|
|
237
|
+
import { Signal } from "@xmachines/play-signals";
|
|
238
|
+
import type { AnyActorLogic } from "xstate";
|
|
239
|
+
|
|
240
|
+
class MockActor extends AbstractActor<AnyActorLogic> implements Routable {
|
|
241
|
+
override state = new Signal.State({} as unknown);
|
|
242
|
+
private _routeState: Signal.State<string | null>;
|
|
243
|
+
readonly currentRoute: Signal.Computed<string | null>;
|
|
244
|
+
readonly initialRoute: string | null;
|
|
245
|
+
|
|
246
|
+
constructor(startRoute: string | null = "/") {
|
|
247
|
+
super({} as AnyActorLogic, {}); // {} as AnyActorLogic is the standard stub
|
|
248
|
+
this._routeState = new Signal.State<string | null>(startRoute);
|
|
249
|
+
this.currentRoute = new Signal.Computed(() => this._routeState.get());
|
|
250
|
+
this.initialRoute = startRoute;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
override send(_event: { readonly type: string } & Record<string, unknown>): void {
|
|
254
|
+
// no-op or capture events for assertion
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**Factory functions for lightweight inline mocks:**
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
function createMockActor(initialView: PlaySpec | null = null) {
|
|
263
|
+
return {
|
|
264
|
+
currentView: new Signal.State<PlaySpec | null>(initialView),
|
|
265
|
+
send: vi.fn(),
|
|
266
|
+
start: vi.fn(),
|
|
267
|
+
stop: vi.fn(),
|
|
268
|
+
getSnapshot: vi.fn(),
|
|
269
|
+
subscribe: vi.fn(),
|
|
270
|
+
state: new Signal.State({} as unknown),
|
|
271
|
+
currentRoute: new Signal.Computed(() => null),
|
|
272
|
+
} as unknown as AbstractActor<AnyActorLogic> & Viewable;
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Async and signal patterns
|
|
277
|
+
|
|
278
|
+
**Flushing the microtask queue (required for Signal propagation):**
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
function waitForMicrotask(): Promise<void> {
|
|
282
|
+
return new Promise<void>((resolve) => queueMicrotask(resolve));
|
|
283
|
+
}
|
|
284
|
+
await waitForMicrotask();
|
|
285
|
+
|
|
286
|
+
// Or use Vitest's helper:
|
|
287
|
+
await vi.waitFor(() => expect(result).toBe(expected), { timeout: 100 });
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Signal watcher pattern:**
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
let notified = false;
|
|
294
|
+
const watcher = new Signal.subtle.Watcher(() => {
|
|
295
|
+
notified = true;
|
|
296
|
+
});
|
|
297
|
+
watcher.watch(actor.currentRoute);
|
|
298
|
+
actor.currentRoute.get(); // Initial read required to prime computed signals
|
|
299
|
+
|
|
300
|
+
actor.state.set({ path: "/dashboard" });
|
|
301
|
+
watcher.getPending(); // Process notifications synchronously
|
|
302
|
+
|
|
303
|
+
expect(notified).toBe(true);
|
|
304
|
+
watcher.unwatch(actor.currentRoute); // Always clean up
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Compile-time type tests
|
|
308
|
+
|
|
309
|
+
For type-only assertions, use `@ts-expect-error` in `.spec.ts` files:
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
const bad: PlaySpec = typedSpec<MyCtx>({
|
|
313
|
+
root: "root",
|
|
314
|
+
// @ts-expect-error "typo" is not a key of MyCtx — typedSpec enforces this
|
|
315
|
+
contextProps: ["typo"],
|
|
316
|
+
elements: {},
|
|
317
|
+
});
|
|
318
|
+
// At runtime the object exists; only the compile-time error is being tested
|
|
319
|
+
expect(bad.contextProps).toEqual(["typo"]);
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
For purely structural type assertions with no runtime test needed, use `.typecheck.ts` files in `src/`:
|
|
323
|
+
|
|
324
|
+
```typescript
|
|
325
|
+
// packages/play-xstate/src/define-player.typecheck.ts
|
|
326
|
+
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
327
|
+
type AssertFalse<T extends false> = T;
|
|
328
|
+
|
|
329
|
+
const actorNotAny: AssertFalse<IsAny<typeof actor>> = false;
|
|
330
|
+
void actorNotAny;
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
These files are validated by `pnpm run test:build` (`tsc --build tsconfig.test.json`) — never executed by Vitest.
|
|
334
|
+
|
|
335
|
+
### Error testing
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
// Synchronous throws
|
|
339
|
+
expect(() => actor.send(null as unknown as PlayEvent)).toThrow(InvalidEventError);
|
|
340
|
+
|
|
341
|
+
// Error with message pattern
|
|
342
|
+
expect(() => extractMachineRoutes(dupMachine)).toThrow(/Duplicate route paths detected/);
|
|
343
|
+
|
|
344
|
+
// Inspect error properties
|
|
345
|
+
try {
|
|
346
|
+
extractMachineRoutes(dupMachine);
|
|
347
|
+
expect.fail("Should have thrown");
|
|
348
|
+
} catch (error: unknown) {
|
|
349
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
350
|
+
expect(message.toLowerCase()).toContain("duplicate");
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
## Contract Tests
|
|
355
|
+
|
|
356
|
+
The `@xmachines/play-router-shared` package exports a shared behavioral contract suite that all router bridge adapters must satisfy. It lives here (rather than in `@xmachines/play-router`) because the suite drives a real actor via `@xmachines/play-xstate` and uses the shared `authMachine` fixture from `@xmachines/play-actor-shared`, so it sits one layer above the router package and keeps `@xmachines/play-router` free of any dependency on the actor runtime:
|
|
357
|
+
|
|
358
|
+
```typescript
|
|
359
|
+
// packages/play-router/examples/shared/test/router-bridge-contract.ts
|
|
360
|
+
export function runBridgeContractTests(opts: ContractSuiteOptions): void;
|
|
361
|
+
|
|
362
|
+
// Each adapter's test file calls it:
|
|
363
|
+
import { runBridgeContractTests } from "@xmachines/play-router-shared/test/router-bridge-contract.js";
|
|
364
|
+
|
|
365
|
+
runBridgeContractTests({
|
|
366
|
+
name: "TanStackReactRouterBridge",
|
|
367
|
+
createHarness(initialPath) {
|
|
368
|
+
/* ... */
|
|
369
|
+
},
|
|
370
|
+
createRestoredHarness(routedPath) {
|
|
371
|
+
/* ... */
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
The contract covers: deep-link sync on connect, router→actor navigation sync, actor→router sync, guard redirect flows, duplicate event deduplication, and restore-from-snapshot behavior.
|
|
377
|
+
|
|
378
|
+
**Used by:** `@xmachines/play-router`, `play-tanstack-react-router`, `play-vue-router`, `play-solid-router`, `play-react-router`, and other adapter packages.
|
|
379
|
+
|
|
380
|
+
**Compile-time bridge contract verification:**
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
import { assertImplementsRouterBridge } from "@xmachines/play-router-shared/test/router-bridge-contract.js";
|
|
384
|
+
import { MyRouterBridge } from "../src/my-router-bridge.js";
|
|
385
|
+
|
|
386
|
+
assertImplementsRouterBridge<MyRouterBridge>(); // Zero runtime cost
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## Coverage Requirements
|
|
390
|
+
|
|
391
|
+
Coverage is collected using the **v8** provider. The root `vitest.config.ts` defines monorepo-wide regression thresholds:
|
|
392
|
+
|
|
393
|
+
| Type | Monorepo threshold |
|
|
394
|
+
| ---------- | ------------------ |
|
|
395
|
+
| Lines | 80% |
|
|
396
|
+
| Functions | 80% |
|
|
397
|
+
| Branches | 75% |
|
|
398
|
+
| Statements | 80% |
|
|
399
|
+
|
|
400
|
+
Individual packages enforce their own (typically stricter) thresholds inside their `vitest.config.ts`:
|
|
401
|
+
|
|
402
|
+
| Package tier | Lines | Functions | Branches | Statements |
|
|
403
|
+
| -------------------------------------------------------------------------- | ----- | --------- | -------- | ---------- |
|
|
404
|
+
| Core packages (`@xmachines/play`, `@xmachines/play-actor`) | 90% | 90% | 85% | 90% |
|
|
405
|
+
| Complex logic (`@xmachines/play-xstate`, `@xmachines/play-router`) | 85% | 85% | 80% | 85% |
|
|
406
|
+
| Integration packages (e.g. `@xmachines/play-react`, `@xmachines/play-dom`) | 80% | 80% | 80% | 80% |
|
|
407
|
+
|
|
408
|
+
Coverage includes: `src/**/*.ts`, `src/**/*.tsx`, `src/**/*.vue`, `src/**/*.svelte`
|
|
409
|
+
|
|
410
|
+
Coverage is excluded for: `test/**/*`, `**/*.test.ts`, `**/*.test.tsx`, `**/*.d.ts`, `dist/**/*`.
|
|
411
|
+
|
|
412
|
+
## CI Integration
|
|
413
|
+
|
|
414
|
+
Tests run in GitLab CI using the `to-be-continuous/node` pipeline component (version `5.1.2`).
|
|
415
|
+
|
|
416
|
+
**Workflow:** The pipeline runs on:
|
|
417
|
+
|
|
418
|
+
- Tag pushes (`$CI_COMMIT_TAG`)
|
|
419
|
+
- Pushes to the default branch (`$CI_DEFAULT_BRANCH`)
|
|
420
|
+
- Merge requests (`$CI_MERGE_REQUEST_IID`)
|
|
421
|
+
|
|
422
|
+
**CI test command** (from `.gitlab-ci.yml`):
|
|
423
|
+
|
|
424
|
+
```bash
|
|
425
|
+
pnpm run test:coverage -- \
|
|
426
|
+
--coverage.reporter=text \
|
|
427
|
+
--coverage.reporter=cobertura \
|
|
428
|
+
--coverage.reportsDirectory=reports/coverage \
|
|
429
|
+
--reporter=default \
|
|
430
|
+
--reporter=junit \
|
|
431
|
+
--outputFile.junit=reports/junit.xml
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
**Artifacts:** The CI job (`node-build`) publishes:
|
|
435
|
+
|
|
436
|
+
- JUnit XML report at `reports/junit.xml` (surfaced in GitLab's test results panel)
|
|
437
|
+
- Cobertura coverage XML at `reports/coverage/cobertura-coverage.xml` (used for GitLab's coverage percentage badge — extracted from the `All files` line)
|
|
438
|
+
|
|
439
|
+
Coverage and test results are always uploaded (`when: always`) so failures are visible even when the job itself fails.
|
|
440
|
+
|
|
441
|
+
The `pnpm run format:check` and `pnpm run lint` commands enforce code style and are run separately from tests (via the `lint-enabled: true` input to the pipeline component).
|
|
442
|
+
|
|
443
|
+
## Test Types Reference
|
|
444
|
+
|
|
445
|
+
| Test type | Extension | Environment | Scope |
|
|
446
|
+
| ---------------------- | --------------------------- | --------------------- | ---------------------------------------------- |
|
|
447
|
+
| Unit | `.test.ts` | `node` or `jsdom` | Single module in isolation |
|
|
448
|
+
| Protocol/type safety | `.spec.ts` | `node` | Compile-time type correctness + RFC invariants |
|
|
449
|
+
| Integration | `.test.ts` | `node` | Multiple modules working together |
|
|
450
|
+
| Performance/regression | `.spec.ts` | `node` | Timing budgets for critical paths |
|
|
451
|
+
| Browser unit | `.browser.test.ts(x)` | Chromium (Playwright) | Browser-specific APIs, real microtask timing |
|
|
452
|
+
| E2E demo | `.browser.test.tsx` | Chromium (Playwright) | Full application flows in demo packages |
|
|
453
|
+
| Type-only | `.typecheck.ts` (in `src/`) | `tsc` only | Structural type assertions; no Vitest runner |
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
[Examples](../../README.md) / @xmachines/play-dom-demo
|
|
2
|
+
|
|
3
|
+
<!-- generated-by: gsd-doc-writer -->
|
|
4
|
+
|
|
5
|
+
# @xmachines/play-dom-demo
|
|
6
|
+
|
|
7
|
+
Vanilla DOM renderer demo for [`@xmachines/play-dom`](../../../api/@xmachines/play-dom/README.md) — actor + `createPlayUI` without a router.
|
|
8
|
+
|
|
9
|
+
## What This Demonstrates
|
|
10
|
+
|
|
11
|
+
- Shared auth machine reused without framework-specific business logic
|
|
12
|
+
- `createPlayUI` wiring `PlayRenderer`-equivalent DOM rendering without a framework
|
|
13
|
+
- Auth machine states (home → login → dashboard) drive DOM updates via TC39 Signal watchers
|
|
14
|
+
- `watchSignal` for reactive nav visibility and debug panel updates
|
|
15
|
+
- Non-browser invariant tests plus browser renderer coverage
|
|
16
|
+
|
|
17
|
+
## Running the Demo
|
|
18
|
+
|
|
19
|
+
From the repository root:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm install
|
|
23
|
+
pnpm --filter @xmachines/play-dom-demo run dev
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Then open `http://localhost:3000`.
|
|
27
|
+
|
|
28
|
+
## Step-by-Step Code Flow
|
|
29
|
+
|
|
30
|
+
Use this order to understand the implementation:
|
|
31
|
+
|
|
32
|
+
1. `src/main.ts` calls `definePlayer({ machine: authMachine })` and starts the actor.
|
|
33
|
+
2. `initShell(actor, app)` from `src/components/Shell.ts` builds the HTML scaffold, mounts a reactive `NavBar`, wires the debug panel, and returns a disconnect function.
|
|
34
|
+
3. `defineRegistry(authCatalog, { components, actions })` builds the typed `registryResult` — real async action handlers dispatching to `actor.send()`.
|
|
35
|
+
4. `createPlayUI(registryResult)` produces a `mount` function; `mount(actor, container)` wires the registry to the actor — view switches happen automatically when `actor.currentView` changes.
|
|
36
|
+
5. `createNavBar(actor, headerEl)` in `src/components/NavBar.ts` uses `watchSignal(actor.state, ...)` to update nav button visibility based on auth state.
|
|
37
|
+
6. `createDebugPanel(actor, shell)` in `src/components/DebugPanel.ts` uses `watchSignal(actor.state, ...)` and `watchSignal(actor.currentRoute, ...)` to drive live debug panel updates.
|
|
38
|
+
7. Browser tests in `test/browser/` validate startup rendering and auth interactions.
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
// src/main.ts (shape)
|
|
42
|
+
const createPlayer = definePlayer({ machine: authMachine });
|
|
43
|
+
const actor = createPlayer();
|
|
44
|
+
actor.start();
|
|
45
|
+
|
|
46
|
+
const app = document.getElementById("app");
|
|
47
|
+
if (!app) throw new Error("Root element not found");
|
|
48
|
+
|
|
49
|
+
initShell(actor, app);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
// src/components/Shell.ts (shape)
|
|
54
|
+
const registryResult = defineRegistry(authCatalog, {
|
|
55
|
+
components: {
|
|
56
|
+
Home,
|
|
57
|
+
About,
|
|
58
|
+
Contact,
|
|
59
|
+
Login,
|
|
60
|
+
Dashboard,
|
|
61
|
+
Overview,
|
|
62
|
+
Stats,
|
|
63
|
+
Profile,
|
|
64
|
+
Settings,
|
|
65
|
+
Navigation,
|
|
66
|
+
NavBar: NavBarView,
|
|
67
|
+
},
|
|
68
|
+
actions: {
|
|
69
|
+
login: async (args) =>
|
|
70
|
+
actor.send({
|
|
71
|
+
type: "auth.login",
|
|
72
|
+
username: assertNonNullable(args, "args").username,
|
|
73
|
+
}),
|
|
74
|
+
logout: async () => actor.send({ type: "auth.logout" }),
|
|
75
|
+
route: async (args) => {
|
|
76
|
+
const { to, params } = assertNonNullable(args, "args");
|
|
77
|
+
actor.send({
|
|
78
|
+
type: "play.route",
|
|
79
|
+
to,
|
|
80
|
+
...(params != null && { params }),
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const disconnectNavBar = createNavBar(actor, headerEl);
|
|
87
|
+
const mount = createPlayUI(registryResult);
|
|
88
|
+
const disconnectRenderer = mount(actor, viewContent);
|
|
89
|
+
const disconnectDebugPanel = createDebugPanel(actor, shell);
|
|
90
|
+
|
|
91
|
+
return () => {
|
|
92
|
+
disconnectNavBar();
|
|
93
|
+
disconnectRenderer();
|
|
94
|
+
disconnectDebugPanel();
|
|
95
|
+
};
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Key Files
|
|
99
|
+
|
|
100
|
+
- `src/main.ts` - actor creation and shell bootstrap
|
|
101
|
+
- `src/components/Shell.ts` - DOM scaffold, `DomRegistry` construction, `createPlayUI` wiring, `createNavBar`, and `createDebugPanel`
|
|
102
|
+
- `src/components/NavBar.ts` - reactive nav bar using `watchSignal(actor.state, ...)` for auth-driven button visibility
|
|
103
|
+
- `src/components/DebugPanel.ts` - live debug footer using `watchSignal` on both `actor.state` and `actor.currentRoute`
|
|
104
|
+
- `test/library-pattern.test.ts` - architecture boundary and invariant assertions
|
|
105
|
+
- `test/browser/renderer-demo.browser.test.ts` - browser-mode renderer coverage
|
|
106
|
+
|
|
107
|
+
## State Machine & Architecture Details
|
|
108
|
+
|
|
109
|
+
The demo utilizes XMachines architectural invariants:
|
|
110
|
+
|
|
111
|
+
1. **Actor Authority:** Navigation buttons dispatch `play.route` events to the actor. The actor evaluates guards and transitions to the correct state — the DOM never decides which view to show.
|
|
112
|
+
2. **Passive Infrastructure:** `createPlayUI` and `watchSignal` only react to actor signals. They do not hold business state or make routing decisions.
|
|
113
|
+
3. **Signal-Only Reactivity:** `watchSignal` (from [`@xmachines/play-signals`](../../../api/@xmachines/play-signals/README.md)) wraps the canonical TC39 Signals watcher lifecycle, keeping all reactivity in the actor signal layer rather than in ad-hoc DOM event listeners.
|
|
114
|
+
|
|
115
|
+
## Watcher Lifecycle and Cleanup Contract
|
|
116
|
+
|
|
117
|
+
This demo follows the canonical watcher lifecycle:
|
|
118
|
+
|
|
119
|
+
1. `notify`
|
|
120
|
+
2. `queueMicrotask`
|
|
121
|
+
3. `getPending()`
|
|
122
|
+
4. Read actor signals and project DOM state
|
|
123
|
+
5. Re-arm with `watch()`/`watch(...signals)`
|
|
124
|
+
|
|
125
|
+
Watcher notifications are one-shot. Cleanup is explicit: `disconnectNavBar()`, `disconnectRenderer()`, and `disconnectDebugPanel()` are all called from the disconnect function returned by `initShell`. In this demo, cleanup is called on `beforeunload` via `actor.stop()`.
|
|
126
|
+
|
|
127
|
+
## Adapter Boundaries
|
|
128
|
+
|
|
129
|
+
`createPlayUI` (from [`@xmachines/play-dom`](../../../api/@xmachines/play-dom/README.md)) is passive infrastructure. It translates actor view signals into DOM mutations but holds no business logic. The `DomRegistry` maps catalog component keys to factory functions — the actor owns which key is active.
|
|
130
|
+
|
|
131
|
+
## Available Scripts
|
|
132
|
+
|
|
133
|
+
These commands are defined in `package.json`:
|
|
134
|
+
|
|
135
|
+
| Command | Description |
|
|
136
|
+
| --------------------------------------------------------- | ---------------------------------------------- |
|
|
137
|
+
| `pnpm --filter @xmachines/play-dom-demo run dev` | Start Vite dev server (http://localhost:3000/) |
|
|
138
|
+
| `pnpm --filter @xmachines/play-dom-demo run build` | Build production bundle |
|
|
139
|
+
| `pnpm --filter @xmachines/play-dom-demo run preview` | Preview built bundle |
|
|
140
|
+
| `pnpm --filter @xmachines/play-dom-demo run test` | Run Vitest test suite |
|
|
141
|
+
| `pnpm --filter @xmachines/play-dom-demo run test:browser` | Run browser-focused Vitest suite |
|
|
142
|
+
|
|
143
|
+
## Verification
|
|
144
|
+
|
|
145
|
+
Use these checks to validate README claims against the current demo implementation:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
pnpm --filter @xmachines/play-dom-demo run test
|
|
149
|
+
pnpm --filter @xmachines/play-dom-demo run test:browser
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Expected result: library-pattern invariant tests pass and the browser renderer suite completes.
|
|
153
|
+
|
|
154
|
+
## Learn More
|
|
155
|
+
|
|
156
|
+
- [Play DOM](../../../api/@xmachines/play-dom/README.md)
|
|
157
|
+
- [Play DOM Router](../play-dom-router-demo/README.md)
|
|
158
|
+
|
|
159
|
+
## Type Aliases
|
|
160
|
+
|
|
161
|
+
- [AuthCatalog](type-aliases/AuthCatalog.md)
|
|
162
|
+
|
|
163
|
+
## Variables
|
|
164
|
+
|
|
165
|
+
- [About](variables/About.md)
|
|
166
|
+
- [authCatalog](variables/authCatalog.md)
|
|
167
|
+
- [Contact](variables/Contact.md)
|
|
168
|
+
- [Dashboard](variables/Dashboard.md)
|
|
169
|
+
- [Home](variables/Home.md)
|
|
170
|
+
- [Login](variables/Login.md)
|
|
171
|
+
- [NavBarView](variables/NavBarView.md)
|
|
172
|
+
- [Navigation](variables/Navigation.md)
|
|
173
|
+
- [Overview](variables/Overview.md)
|
|
174
|
+
- [Profile](variables/Profile.md)
|
|
175
|
+
- [Settings](variables/Settings.md)
|
|
176
|
+
- [Stats](variables/Stats.md)
|
|
177
|
+
|
|
178
|
+
## Functions
|
|
179
|
+
|
|
180
|
+
- [createNavBar](functions/createNavBar.md)
|
|
181
|
+
- [initShell](functions/initShell.md)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
[Examples](../../../README.md) / [@xmachines/play-dom-demo](../README.md) / createNavBar
|
|
2
|
+
|
|
3
|
+
# Function: createNavBar()
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
function createNavBar(actor, container): () => void;
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Defined in: [packages/play-dom/examples/demo/src/components/NavBar.ts:9](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0/packages/play-dom/examples/demo/src/components/NavBar.ts#L9)
|
|
10
|
+
|
|
11
|
+
NavBar — App-shell navigation factory. Mounts a reactive nav into
|
|
12
|
+
`container`, observes actor.state via watchSignal, and updates button
|
|
13
|
+
visibility based on auth state. Returns a disconnect function.
|
|
14
|
+
|
|
15
|
+
## Parameters
|
|
16
|
+
|
|
17
|
+
| Parameter | Type |
|
|
18
|
+
| ----------- | ------------- |
|
|
19
|
+
| `actor` | `AuthActor` |
|
|
20
|
+
| `container` | `HTMLElement` |
|
|
21
|
+
|
|
22
|
+
## Returns
|
|
23
|
+
|
|
24
|
+
() => `void`
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
[Examples](../../../README.md) / [@xmachines/play-dom-demo](../README.md) / initShell
|
|
2
|
+
|
|
3
|
+
# Function: initShell()
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
function initShell(actor, appElement): () => void;
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Defined in: [packages/play-dom/examples/demo/src/components/Shell.ts:24](https://gitlab.com/xmachin-es/xmachines-js/-/blob/v1.0.0/packages/play-dom/examples/demo/src/components/Shell.ts#L24)
|
|
10
|
+
|
|
11
|
+
Shell — DOM shell layout factory. Renders demo chrome (header + main +
|
|
12
|
+
debug panel), mounts NavBar, connects DOM renderer, and wires DebugPanel.
|
|
13
|
+
Returns a disconnect function.
|
|
14
|
+
|
|
15
|
+
## Parameters
|
|
16
|
+
|
|
17
|
+
| Parameter | Type |
|
|
18
|
+
| ------------ | ------------- |
|
|
19
|
+
| `actor` | `AuthActor` |
|
|
20
|
+
| `appElement` | `HTMLElement` |
|
|
21
|
+
|
|
22
|
+
## Returns
|
|
23
|
+
|
|
24
|
+
() => `void`
|