@xmachines/docs 4.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/api/@xmachines/play/README.md +21 -21
- package/api/@xmachines/play/errors/classes/NonNullableError.md +4 -4
- package/api/@xmachines/play/errors/classes/PlayError.md +5 -4
- package/api/@xmachines/play/index/README.md +2 -2
- package/api/@xmachines/play/index/functions/asCleanup.md +4 -5
- package/api/@xmachines/play/index/functions/assertNonNullable.md +1 -1
- package/api/@xmachines/play/index/functions/shallowEqualExcept.md +1 -1
- package/api/@xmachines/play/index/type-aliases/Cleanup.md +3 -3
- package/api/@xmachines/play/index/type-aliases/DisposeKey.md +1 -1
- package/api/@xmachines/play/index/type-aliases/PlayEvent.md +2 -2
- package/api/@xmachines/play/index/variables/DISPOSE.md +1 -1
- package/api/@xmachines/play-actor/README.md +9 -9
- package/api/@xmachines/play-actor/interfaces/ActorEvent.md +2 -2
- package/api/@xmachines/play-actor/interfaces/PlayActor.md +6 -6
- package/api/@xmachines/play-atom/README.md +281 -0
- package/api/@xmachines/play-atom/functions/watchAtom.md +79 -0
- package/api/@xmachines/play-atom/interfaces/AsyncAtomOptions.md +16 -0
- package/api/@xmachines/play-atom/interfaces/Atom.md +149 -0
- package/api/@xmachines/play-atom/interfaces/AtomObserver.md +25 -0
- package/api/@xmachines/play-atom/interfaces/AtomOptions.md +33 -0
- package/api/@xmachines/play-atom/interfaces/AtomSubscription.md +23 -0
- package/api/@xmachines/play-atom/interfaces/BaseAtom.md +97 -0
- package/api/@xmachines/play-atom/interfaces/CreateAtom.md +91 -0
- package/api/@xmachines/play-atom/interfaces/Readable.md +93 -0
- package/api/@xmachines/play-atom/interfaces/ReadonlyAtom.md +108 -0
- package/api/@xmachines/play-atom/type-aliases/AnyAtom.md +13 -0
- package/api/@xmachines/play-atom/type-aliases/AsyncAtomState.md +32 -0
- package/api/@xmachines/{play-signals → play-atom}/type-aliases/Cleanup.md +4 -4
- package/api/@xmachines/play-atom/variables/createAsyncAtom.md +42 -0
- package/api/@xmachines/play-atom/variables/createAtom.md +18 -0
- package/api/@xmachines/play-atom/variables/createWritableAtom.md +70 -0
- package/api/@xmachines/play-dom/README.md +21 -17
- package/api/@xmachines/play-dom/classes/PlayRenderer.md +10 -10
- package/api/@xmachines/play-dom/functions/asCleanup.md +4 -5
- package/api/@xmachines/play-dom/functions/createPlayUI.md +1 -1
- package/api/@xmachines/play-dom/functions/createRenderer.md +1 -1
- package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +3 -3
- package/api/@xmachines/play-dom/interfaces/MountOptions.md +3 -3
- package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +6 -6
- package/api/@xmachines/play-dom/type-aliases/Cleanup.md +3 -3
- package/api/@xmachines/play-dom/type-aliases/MountFn.md +1 -1
- package/api/@xmachines/play-dom-router/README.md +24 -24
- package/api/@xmachines/play-dom-router/classes/DomRouterBridge.md +15 -15
- package/api/@xmachines/play-dom-router/classes/RouteMap.md +11 -11
- package/api/@xmachines/play-dom-router/functions/asCleanup.md +4 -5
- package/api/@xmachines/play-dom-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +1 -1
- package/api/@xmachines/play-dom-router/functions/createRouter.md +1 -1
- package/api/@xmachines/play-dom-router/interfaces/BasePathOptions.md +3 -7
- package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +15 -15
- package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +14 -14
- package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +11 -9
- package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-dom-router/interfaces/RouteLookupContract.md +3 -3
- package/api/@xmachines/play-dom-router/interfaces/RouteMapOptions.md +10 -4
- package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +15 -17
- package/api/@xmachines/play-dom-router/interfaces/RouterConnection.md +7 -7
- package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +5 -5
- package/api/@xmachines/play-dom-router/type-aliases/Cleanup.md +3 -3
- package/api/@xmachines/play-dom-router/variables/DISPOSE.md +1 -1
- package/api/@xmachines/play-pattern/README.md +115 -0
- package/api/@xmachines/play-pattern/functions/buildPath.md +46 -0
- package/api/@xmachines/play-pattern/functions/createPatternCache.md +47 -0
- package/api/@xmachines/play-pattern/functions/getIndexKey.md +30 -0
- package/api/@xmachines/play-pattern/functions/isDotSegment.md +40 -0
- package/api/@xmachines/play-pattern/functions/parsePattern.md +28 -0
- package/api/@xmachines/play-pattern/interfaces/GroupPart.md +15 -0
- package/api/@xmachines/play-pattern/interfaces/LiteralPart.md +14 -0
- package/api/@xmachines/play-pattern/interfaces/ParamPart.md +21 -0
- package/api/@xmachines/play-pattern/interfaces/ParseOptions.md +19 -0
- package/api/@xmachines/play-pattern/interfaces/ParsedPattern.md +23 -0
- package/api/@xmachines/play-pattern/interfaces/PatternCache.md +65 -0
- package/api/@xmachines/play-pattern/interfaces/PatternParam.md +15 -0
- package/api/@xmachines/play-pattern/type-aliases/PathBuildResult.md +74 -0
- package/api/@xmachines/play-pattern/type-aliases/PathParams.md +15 -0
- package/api/@xmachines/play-pattern/type-aliases/PatternModifier.md +11 -0
- package/api/@xmachines/play-pattern/type-aliases/PatternPart.md +9 -0
- package/api/@xmachines/play-react/README.md +31 -21
- package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +6 -6
- package/api/@xmachines/play-react/functions/useActor.md +1 -1
- package/api/@xmachines/play-react/functions/useAtomEffect.md +103 -0
- package/api/@xmachines/play-react/functions/usePlayView.md +1 -1
- package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +8 -8
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +6 -6
- package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +4 -4
- package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +8 -8
- package/api/@xmachines/play-react/interfaces/ViewContextValue.md +5 -5
- package/api/@xmachines/play-react/type-aliases/AnyPlayActor.md +1 -1
- package/api/@xmachines/play-react/variables/ActorProvider.md +2 -2
- package/api/@xmachines/play-react/variables/PlayRenderer.md +1 -1
- package/api/@xmachines/play-react/variables/PlayUIProvider.md +1 -1
- package/api/@xmachines/play-react-router/README.md +3 -3
- package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +15 -15
- package/api/@xmachines/play-react-router/classes/RouteMap.md +11 -11
- package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +5 -5
- package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +11 -9
- package/api/@xmachines/play-react-router/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-react-router/interfaces/RouteMapOptions.md +10 -4
- package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +15 -17
- package/api/@xmachines/play-react-router/type-aliases/PlayRouterBridgeConstructor.md +14 -7
- package/api/@xmachines/play-react-router/type-aliases/PlayRouterProviderBaseProps.md +1 -1
- package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-router/README.md +25 -14
- package/api/@xmachines/play-router/errors/classes/DuplicateBridgeError.md +4 -4
- package/api/@xmachines/play-router/errors/classes/DuplicateRoutePathError.md +5 -5
- package/api/@xmachines/play-router/errors/classes/EmptyRoutePathError.md +5 -5
- package/api/@xmachines/play-router/errors/classes/InvalidBasePathError.md +5 -5
- package/api/@xmachines/play-router/errors/classes/InvalidRoutePatternError.md +5 -5
- package/api/@xmachines/play-router/errors/classes/InvalidStateIdError.md +5 -5
- package/api/@xmachines/play-router/errors/classes/MissingBasePathParamError.md +6 -6
- package/api/@xmachines/play-router/errors/classes/RouterSyncError.md +4 -4
- package/api/@xmachines/play-router/errors/classes/UnknownStateTypeError.md +6 -6
- package/api/@xmachines/play-router/index/README.md +10 -2
- package/api/@xmachines/play-router/index/classes/RouteMap.md +11 -11
- package/api/@xmachines/play-router/index/classes/RouterBridgeBase.md +10 -10
- package/api/@xmachines/play-router/index/functions/buildPlayRouteEvent.md +1 -1
- package/api/@xmachines/play-router/index/functions/buildRouteTree.md +1 -1
- package/api/@xmachines/play-router/index/functions/cleanFrameworkParams.md +1 -1
- package/api/@xmachines/play-router/index/functions/createPatternCache.md +47 -0
- package/api/@xmachines/play-router/index/functions/createRouteMapFromTree.md +5 -5
- package/api/@xmachines/play-router/index/functions/createRouterConnection.md +1 -1
- package/api/@xmachines/play-router/index/functions/detectDuplicateRoutes.md +1 -1
- package/api/@xmachines/play-router/index/functions/extractQuery.md +1 -1
- package/api/@xmachines/play-router/index/functions/extractRouteParams.md +7 -6
- package/api/@xmachines/play-router/index/functions/findRouteById.md +1 -1
- package/api/@xmachines/play-router/index/functions/findRouteByPath.md +13 -6
- package/api/@xmachines/play-router/index/functions/isMountableBridge.md +1 -1
- package/api/@xmachines/play-router/index/functions/joinBasePath.md +2 -1
- package/api/@xmachines/play-router/index/functions/mountKey.md +1 -1
- package/api/@xmachines/play-router/index/functions/normalizeBasePath.md +1 -1
- package/api/@xmachines/play-router/index/functions/openProviderBridge.md +3 -3
- package/api/@xmachines/play-router/index/functions/parsePattern.md +28 -0
- package/api/@xmachines/play-router/index/functions/pickOwnParams.md +1 -1
- package/api/@xmachines/play-router/index/functions/repointProviderBridge.md +1 -1
- package/api/@xmachines/play-router/index/functions/resolveBasePath.md +1 -1
- package/api/@xmachines/play-router/index/functions/resolveFrameworkParams.md +5 -5
- package/api/@xmachines/play-router/index/functions/sanitizePathname.md +9 -24
- package/api/@xmachines/play-router/index/functions/splitLocation.md +37 -0
- package/api/@xmachines/play-router/index/functions/stripBasePath.md +1 -1
- package/api/@xmachines/play-router/index/functions/validateRouteFormat.md +1 -1
- package/api/@xmachines/play-router/index/functions/validateStateExists.md +1 -1
- package/api/@xmachines/play-router/index/interfaces/BasePathOptions.md +4 -4
- package/api/@xmachines/play-router/index/interfaces/BuildPlayRouteEventOptions.md +4 -4
- package/api/@xmachines/play-router/index/interfaces/CompileOptions.md +35 -0
- package/api/@xmachines/play-router/index/interfaces/FrameworkParamsSource.md +13 -8
- package/api/@xmachines/play-router/index/interfaces/LocationLike.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/MountableRouterBridge.md +9 -9
- package/api/@xmachines/play-router/index/interfaces/OpenProviderBridgeArgs.md +11 -9
- package/api/@xmachines/play-router/index/interfaces/ParseOptions.md +24 -0
- package/api/@xmachines/play-router/index/interfaces/ParsedPattern.md +23 -0
- package/api/@xmachines/play-router/index/interfaces/PatternCache.md +65 -0
- package/api/@xmachines/play-router/index/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-router/index/interfaces/PlayRouterProviderBaseProps.md +15 -9
- package/api/@xmachines/play-router/index/interfaces/ResolvedBasePath.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/ResolvedRoutePath.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/Routable.md +5 -5
- package/api/@xmachines/play-router/index/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-router/index/interfaces/RouteInfo.md +8 -8
- package/api/@xmachines/play-router/index/interfaces/RouteMapOptions.md +10 -4
- package/api/@xmachines/play-router/index/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/RouteMatch.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/RouteNode.md +10 -10
- package/api/@xmachines/play-router/index/interfaces/RouteObject.md +5 -5
- package/api/@xmachines/play-router/index/interfaces/RouteTree.md +5 -5
- package/api/@xmachines/play-router/index/interfaces/RouteWatcherHandle.md +11 -11
- package/api/@xmachines/play-router/index/interfaces/RouterBridge.md +15 -17
- package/api/@xmachines/play-router/index/interfaces/RouterBridgeOptions.md +31 -0
- package/api/@xmachines/play-router/index/interfaces/RouterConnection.md +7 -7
- package/api/@xmachines/play-router/index/interfaces/SplitLocation.md +16 -0
- package/api/@xmachines/play-router/index/interfaces/WindowLike.md +3 -3
- package/api/@xmachines/play-router/index/type-aliases/PlayRouterBridgeConstructor.md +14 -7
- package/api/@xmachines/play-router/index/type-aliases/RouteData.md +1 -1
- package/api/@xmachines/play-router/index/type-aliases/RouteDataResolver.md +1 -1
- package/api/@xmachines/play-router/index/type-aliases/RouteMetadata.md +1 -1
- package/api/@xmachines/play-router/index/type-aliases/URLPatternLike.md +68 -0
- package/api/@xmachines/play-router/index/variables/DISPOSE.md +1 -1
- package/api/@xmachines/play-router/index/variables/NO_BASE_PATH.md +1 -1
- package/api/@xmachines/play-router/index/variables/ROOT_NODE_ID.md +1 -1
- package/api/@xmachines/play-router/xstate/functions/createRouteMap.md +5 -5
- package/api/@xmachines/play-router/xstate/functions/extractMachineRoutes.md +6 -5
- package/api/@xmachines/play-router/xstate/functions/getNavigableRoutes.md +1 -1
- package/api/@xmachines/play-router/xstate/functions/getRoutableRoutes.md +1 -1
- package/api/@xmachines/play-router/xstate/functions/getRouteMappings.md +1 -1
- package/api/@xmachines/play-router/xstate/functions/getTransitionReachableRoutes.md +1 -1
- package/api/@xmachines/play-router/xstate/functions/isRouteReachable.md +1 -1
- package/api/@xmachines/play-router/xstate/functions/machineToGraph.md +1 -1
- package/api/@xmachines/play-router/xstate/functions/routeExists.md +1 -1
- package/api/@xmachines/play-router/xstate/interfaces/MachineEdgeData.md +3 -3
- package/api/@xmachines/play-router/xstate/interfaces/MachineNodeData.md +5 -5
- package/api/@xmachines/play-router/xstate/type-aliases/MachineGraph.md +1 -1
- package/api/@xmachines/play-solid/README.md +9 -5
- package/api/@xmachines/play-solid/functions/useActor.md +1 -1
- package/api/@xmachines/play-solid/functions/usePlayView.md +1 -1
- package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +8 -8
- package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +8 -8
- package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +5 -5
- package/api/@xmachines/play-solid/type-aliases/AnyPlayActor.md +1 -1
- package/api/@xmachines/play-solid/variables/ActorContext.md +1 -1
- package/api/@xmachines/play-solid/variables/ActorProvider.md +2 -2
- package/api/@xmachines/play-solid/variables/PlayRenderer.md +1 -1
- package/api/@xmachines/play-solid/variables/PlayUIProvider.md +1 -1
- package/api/@xmachines/play-solid-router/README.md +14 -14
- package/api/@xmachines/play-solid-router/classes/RouteMap.md +11 -11
- package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +18 -18
- package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +6 -6
- package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +11 -9
- package/api/@xmachines/play-solid-router/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +10 -4
- package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +15 -17
- package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +14 -7
- package/api/@xmachines/play-solid-router/type-aliases/PlayRouterProviderBaseProps.md +1 -1
- package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
- package/api/@xmachines/play-solid-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-svelte/README.md +11 -7
- package/api/@xmachines/play-svelte/functions/defineRegistry.md +1 -1
- package/api/@xmachines/play-svelte/functions/getActorContext.md +1 -1
- package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +1 -1
- package/api/@xmachines/play-svelte/functions/setActorContext.md +1 -1
- package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +8 -8
- package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +4 -4
- package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +11 -11
- package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +5 -5
- package/api/@xmachines/play-svelte/type-aliases/AnyPlayActor.md +1 -1
- package/api/@xmachines/play-svelte-spa-router/README.md +14 -14
- package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +11 -11
- package/api/@xmachines/play-svelte-spa-router/classes/SvelteSpaRouterBridge.md +15 -15
- package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-svelte-spa-router/interfaces/BasePathOptions.md +3 -7
- package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +11 -9
- package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-svelte-spa-router/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapOptions.md +10 -4
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +15 -17
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouterConnection.md +7 -7
- package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
- package/api/@xmachines/play-sveltekit-router/README.md +17 -17
- package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +11 -11
- package/api/@xmachines/play-sveltekit-router/classes/SvelteKitRouterBridge.md +15 -15
- package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-sveltekit-router/interfaces/BasePathOptions.md +3 -7
- package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +15 -23
- package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +3 -3
- package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-sveltekit-router/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapOptions.md +10 -4
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +15 -17
- package/api/@xmachines/play-sveltekit-router/interfaces/RouterConnection.md +7 -7
- package/api/@xmachines/play-tanstack-react-router/README.md +7 -7
- package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +11 -11
- package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +11 -11
- package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +5 -5
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +11 -9
- package/api/@xmachines/play-tanstack-react-router/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapOptions.md +10 -4
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +15 -17
- package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterBridgeConstructor.md +14 -7
- package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterProviderBaseProps.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +5 -5
- package/api/@xmachines/play-tanstack-react-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-tanstack-router/README.md +1 -1
- package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +16 -16
- package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouteMapLike.md +3 -3
- package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouterLike.md +5 -5
- package/api/@xmachines/play-tanstack-solid-router/README.md +7 -7
- package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +11 -11
- package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +11 -11
- package/api/@xmachines/play-tanstack-solid-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +11 -9
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapOptions.md +10 -4
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +15 -17
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterBridgeConstructor.md +14 -7
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterProviderBaseProps.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +5 -5
- package/api/@xmachines/play-tanstack-solid-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-url/README.md +21 -15
- package/api/@xmachines/play-url/errors/classes/InvalidBasePathError.md +5 -5
- package/api/@xmachines/play-url/errors/classes/InvalidRoutePatternError.md +5 -5
- package/api/@xmachines/play-url/errors/classes/MissingBasePathParamError.md +6 -6
- package/api/@xmachines/play-url/index/README.md +15 -8
- package/api/@xmachines/play-url/index/functions/buildPath.md +46 -0
- package/api/@xmachines/play-url/index/functions/cleanFrameworkParams.md +1 -1
- package/api/@xmachines/play-url/index/functions/createPatternCache.md +47 -0
- package/api/@xmachines/play-url/index/functions/getCandidates.md +1 -1
- package/api/@xmachines/play-url/index/functions/getCompiledPattern.md +8 -7
- package/api/@xmachines/play-url/index/functions/getIndexKey.md +1 -1
- package/api/@xmachines/play-url/index/functions/holdsUnsubstitutedParam.md +2 -2
- package/api/@xmachines/play-url/index/functions/isDotSegment.md +40 -0
- package/api/@xmachines/play-url/index/functions/joinBasePath.md +2 -1
- package/api/@xmachines/play-url/index/functions/normalizeBasePath.md +1 -1
- package/api/@xmachines/play-url/index/functions/parsePattern.md +6 -5
- package/api/@xmachines/play-url/index/functions/pickOwnParams.md +1 -1
- package/api/@xmachines/play-url/index/functions/resolveBasePath.md +1 -1
- package/api/@xmachines/play-url/index/functions/resolveFrameworkParams.md +5 -5
- package/api/@xmachines/play-url/index/functions/sanitizePathname.md +27 -0
- package/api/@xmachines/play-url/index/functions/splitLocation.md +37 -0
- package/api/@xmachines/play-url/index/functions/stripBasePath.md +1 -1
- package/api/@xmachines/play-url/index/interfaces/BasePathOptions.md +3 -3
- package/api/@xmachines/play-url/index/interfaces/CompileOptions.md +21 -0
- package/api/@xmachines/play-url/index/interfaces/FrameworkParamsSource.md +13 -8
- package/api/@xmachines/play-url/index/interfaces/GroupPart.md +6 -6
- package/api/@xmachines/play-url/index/interfaces/LiteralPart.md +5 -5
- package/api/@xmachines/play-url/index/interfaces/ParamPart.md +9 -9
- package/api/@xmachines/play-url/index/interfaces/ParseOptions.md +24 -0
- package/api/@xmachines/play-url/index/interfaces/ParsedPattern.md +14 -14
- package/api/@xmachines/play-url/index/interfaces/PatternCache.md +65 -0
- package/api/@xmachines/play-url/index/interfaces/PatternParam.md +6 -6
- package/api/@xmachines/play-url/index/interfaces/ResolvedBasePath.md +3 -3
- package/api/@xmachines/play-url/index/interfaces/SplitLocation.md +16 -0
- package/api/@xmachines/play-url/index/type-aliases/PathBuildResult.md +74 -0
- package/api/@xmachines/play-url/index/type-aliases/PathParams.md +15 -0
- package/api/@xmachines/play-url/index/type-aliases/PatternModifier.md +1 -1
- package/api/@xmachines/play-url/index/type-aliases/PatternPart.md +1 -1
- package/api/@xmachines/play-url/index/type-aliases/URLPatternCtor.md +1 -1
- package/api/@xmachines/play-url/index/type-aliases/URLPatternLike.md +3 -3
- package/api/@xmachines/play-url/index/variables/NO_BASE_PATH.md +1 -1
- package/api/@xmachines/play-url/index/variables/URLPattern.md +1 -1
- package/api/@xmachines/play-view/README.md +19 -8
- package/api/@xmachines/play-view/errors/classes/ReadOnlyContextError.md +5 -5
- package/api/@xmachines/play-view/index/functions/attachRenderErrorHandler.md +1 -1
- package/api/@xmachines/play-view/index/functions/composePlayState.md +1 -1
- package/api/@xmachines/play-view/index/functions/createFailureLatch.md +1 -1
- package/api/@xmachines/play-view/index/functions/createReportGuard.md +1 -1
- package/api/@xmachines/play-view/index/functions/createViewStoreLifecycle.md +1 -1
- package/api/@xmachines/play-view/index/functions/guardContextWrites.md +4 -28
- package/api/@xmachines/play-view/index/functions/refreshContextSubtree.md +1 -1
- package/api/@xmachines/play-view/index/functions/reuseComposedState.md +1 -1
- package/api/@xmachines/play-view/index/functions/sameViewInputs.md +1 -1
- package/api/@xmachines/play-view/index/functions/toAtomState.md +1 -1
- package/api/@xmachines/play-view/index/functions/typedSpec.md +1 -1
- package/api/@xmachines/play-view/index/interfaces/BaseActorProviderProps.md +5 -5
- package/api/@xmachines/play-view/index/interfaces/BaseViewContextValue.md +5 -5
- package/api/@xmachines/play-view/index/interfaces/FailureLatch.md +3 -3
- package/api/@xmachines/play-view/index/interfaces/PlaySpec.md +2 -2
- package/api/@xmachines/play-view/index/interfaces/ReportGuard.md +5 -5
- package/api/@xmachines/play-view/index/interfaces/ReportGuardMessages.md +3 -3
- package/api/@xmachines/play-view/index/interfaces/ResolveViewStoreOptions.md +2 -2
- package/api/@xmachines/play-view/index/interfaces/ViewInputs.md +4 -4
- package/api/@xmachines/play-view/index/interfaces/ViewStoreLifecycle.md +3 -3
- package/api/@xmachines/play-view/index/interfaces/ViewStoreResolution.md +4 -4
- package/api/@xmachines/play-view/index/interfaces/Viewable.md +5 -5
- package/api/@xmachines/play-view/index/type-aliases/ViewActor.md +1 -1
- package/api/@xmachines/play-view/index/variables/CONTEXT_STATE_KEY.md +1 -1
- package/api/@xmachines/play-vue/README.md +13 -9
- package/api/@xmachines/play-vue/functions/defineRegistry.md +1 -1
- package/api/@xmachines/play-vue/functions/useActor.md +1 -1
- package/api/@xmachines/play-vue/functions/usePlayView.md +1 -1
- package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +6 -6
- package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +9 -9
- package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +5 -5
- package/api/@xmachines/play-vue/type-aliases/AnyPlayActor.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +1 -1
- package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +2 -2
- package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
- package/api/@xmachines/play-vue-router/README.md +12 -11
- package/api/@xmachines/play-vue-router/errors/classes/VueRouterNavigationError.md +4 -4
- package/api/@xmachines/play-vue-router/errors/classes/VueRouterSendError.md +4 -4
- package/api/@xmachines/play-vue-router/index/classes/RouteMap.md +11 -11
- package/api/@xmachines/play-vue-router/index/classes/VueRouterBridge.md +15 -15
- package/api/@xmachines/play-vue-router/index/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-vue-router/index/interfaces/RoutableActor.md +6 -6
- package/api/@xmachines/play-vue-router/index/interfaces/RouteMapOptions.md +10 -4
- package/api/@xmachines/play-vue-router/index/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-vue-router/index/interfaces/RouterBridge.md +15 -17
- package/api/@xmachines/play-vue-router/index/variables/PlayRouterProvider.md +23 -1
- package/api/@xmachines/play-xstate/README.md +61 -30
- package/api/@xmachines/play-xstate/errors/README.md +1 -0
- package/api/@xmachines/play-xstate/errors/classes/ActorThrewNonErrorError.md +4 -4
- package/api/@xmachines/play-xstate/errors/classes/InvalidEventError.md +5 -5
- package/api/@xmachines/play-xstate/errors/classes/InvalidMachineError.md +4 -4
- package/api/@xmachines/play-xstate/errors/classes/InvalidRouteHandlerError.md +5 -5
- package/api/@xmachines/play-xstate/errors/classes/InvalidRouteMetadataError.md +5 -5
- package/api/@xmachines/play-xstate/errors/classes/InvalidRouteParamError.md +207 -0
- package/api/@xmachines/play-xstate/errors/classes/MissingRouteParamError.md +6 -6
- package/api/@xmachines/play-xstate/errors/classes/MissingStateIdError.md +6 -6
- package/api/@xmachines/play-xstate/index/README.md +2 -2
- package/api/@xmachines/play-xstate/index/classes/PlayerActor.md +41 -42
- package/api/@xmachines/play-xstate/index/functions/compose.md +4 -4
- package/api/@xmachines/play-xstate/index/functions/definePlayer.md +2 -2
- package/api/@xmachines/play-xstate/index/interfaces/PlayerConfig.md +4 -4
- package/api/@xmachines/play-xstate/index/interfaces/PlayerFactoryResumeOptions.md +2 -2
- package/api/@xmachines/play-xstate/index/interfaces/PlayerOptions.md +9 -9
- package/api/@xmachines/play-xstate/index/type-aliases/Capability.md +1 -1
- package/api/@xmachines/play-xstate/index/type-aliases/PlayerConstructor.md +1 -1
- package/api/@xmachines/play-xstate/index/type-aliases/PlayerFactory.md +1 -1
- package/api/@xmachines/play-xstate/index/variables/DISPOSE.md +1 -1
- package/api/@xmachines/play-xstate/with-routing/functions/buildRouteUrl.md +13 -6
- package/api/@xmachines/play-xstate/with-routing/functions/deriveRoute.md +1 -1
- package/api/@xmachines/play-xstate/with-routing/functions/formatPlayRouteTransitions.md +1 -1
- package/api/@xmachines/play-xstate/with-routing/functions/isAbsoluteRoute.md +1 -1
- package/api/@xmachines/play-xstate/with-routing/functions/withRouting.md +1 -1
- package/api/@xmachines/play-xstate/with-routing/interfaces/RouteContext.md +5 -5
- package/api/@xmachines/play-xstate/with-routing/interfaces/RouteObject.md +5 -5
- package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteData.md +1 -1
- package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteDataResolver.md +1 -1
- package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteMachineConfig.md +4 -4
- package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteMetadata.md +1 -1
- package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteStateNode.md +5 -5
- package/api/@xmachines/play-xstate/with-view/functions/withView.md +6 -5
- package/api/@xmachines/shared/vite-aliases/functions/xmAliases.md +1 -1
- package/api/@xmachines/shared/vite-aliases/functions/xmCacheDir.md +1 -1
- package/api/@xmachines/shared/vite-aliases/functions/xmOptimizeDeps.md +1 -1
- package/api/@xmachines/shared/vite-aliases/functions/xmResolve.md +1 -1
- package/api/@xmachines/shared/vite-aliases/functions/xmSvelteRunes.md +2 -2
- package/api/@xmachines/shared/vitest/functions/defineXmBrowserConfig.md +1 -1
- package/api/@xmachines/shared/vitest/functions/defineXmVitestConfig.md +1 -1
- package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +4 -4
- package/api/README.md +2 -1
- package/api/llms.txt +4 -3
- package/contributing/architecture.md +105 -124
- package/contributing/configuration.md +15 -15
- package/contributing/deployment.md +82 -6
- package/contributing/development.md +58 -30
- package/contributing/migrating-to-play-atom.md +209 -0
- package/contributing/testing.md +61 -64
- package/examples/@xmachines/play-dom-demo/README.md +40 -63
- package/examples/@xmachines/play-dom-demo/functions/createAuthActionHandlers.md +35 -0
- package/examples/@xmachines/play-dom-demo/functions/createConfirmDialog.md +27 -0
- package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +2 -2
- package/examples/@xmachines/play-dom-demo/functions/initShell.md +7 -6
- package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/About.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Button.md +12 -0
- package/examples/@xmachines/play-dom-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Field.md +19 -0
- package/examples/@xmachines/play-dom-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Panel.md +14 -0
- package/examples/@xmachines/play-dom-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +190 -165
- package/examples/@xmachines/play-dom-demo/variables/demoComponents.md +30 -0
- package/examples/@xmachines/play-dom-router-demo/README.md +20 -27
- package/examples/@xmachines/play-react-demo/README.md +33 -57
- package/examples/@xmachines/play-react-demo/functions/createAuthActionHandlers.md +35 -0
- package/examples/@xmachines/play-react-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/About.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Button.md +12 -0
- package/examples/@xmachines/play-react-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +4 -3
- package/examples/@xmachines/play-react-demo/variables/Field.md +18 -0
- package/examples/@xmachines/play-react-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/NavBar.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/NavBarView.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Panel.md +15 -0
- package/examples/@xmachines/play-react-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Shell.md +2 -1
- package/examples/@xmachines/play-react-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/authCatalog.md +190 -165
- package/examples/@xmachines/play-react-demo/variables/demoComponents.md +30 -0
- package/examples/@xmachines/play-react-router-demo/README.md +32 -32
- package/examples/@xmachines/play-solid-demo/README.md +33 -57
- package/examples/@xmachines/play-solid-demo/functions/createAuthActionHandlers.md +35 -0
- package/examples/@xmachines/play-solid-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/About.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Button.md +11 -0
- package/examples/@xmachines/play-solid-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +5 -3
- package/examples/@xmachines/play-solid-demo/variables/Field.md +11 -0
- package/examples/@xmachines/play-solid-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/NavBar.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Panel.md +11 -0
- package/examples/@xmachines/play-solid-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Shell.md +2 -1
- package/examples/@xmachines/play-solid-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +114 -2
- package/examples/@xmachines/play-solid-demo/variables/demoComponents.md +30 -0
- package/examples/@xmachines/play-solid-router-demo/README.md +20 -23
- package/examples/@xmachines/play-svelte-demo/README.md +38 -44
- package/examples/@xmachines/play-svelte-demo/functions/createAuthActionHandlers.md +35 -0
- package/examples/@xmachines/play-svelte-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-svelte-demo/variables/authCatalog.md +114 -2
- package/examples/@xmachines/play-svelte-demo/variables/demoComponents.md +30 -0
- package/examples/@xmachines/play-svelte-spa-router-demo/README.md +20 -26
- package/examples/@xmachines/play-sveltekit-router-demo/README.md +20 -26
- package/examples/@xmachines/play-tanstack-react-router-demo/README.md +29 -31
- package/examples/@xmachines/play-tanstack-solid-router-demo/README.md +25 -27
- package/examples/@xmachines/play-vue-demo/README.md +36 -60
- package/examples/@xmachines/play-vue-demo/functions/createAuthActionHandlers.md +35 -0
- package/examples/@xmachines/play-vue-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-vue-demo/variables/App.md +1 -1
- package/examples/@xmachines/play-vue-demo/variables/authCatalog.md +114 -2
- package/examples/@xmachines/play-vue-demo/variables/demoComponents.md +11 -0
- package/examples/@xmachines/play-vue-router-demo/README.md +12 -23
- package/examples/README.md +3 -3
- package/examples/basic-state-machine.md +4 -4
- package/examples/form-validation.md +1 -1
- package/examples/multi-router-integration.md +23 -23
- package/examples/routing-patterns.md +5 -5
- package/examples/traffic-light.md +6 -6
- package/guides/README.md +1 -1
- package/guides/actor-model.md +26 -17
- package/guides/atoms.md +264 -0
- package/guides/getting-started.md +52 -17
- package/guides/inspector.md +3 -3
- package/guides/routing.md +67 -47
- package/guides/state-machines.md +4 -4
- package/package.json +3 -3
- package/rfc/play.md +83 -52
- package/api/@xmachines/play-react/functions/useSignalEffect.md +0 -77
- package/api/@xmachines/play-router/index/functions/getPatternParamNames.md +0 -29
- package/api/@xmachines/play-router/index/functions/getRequiredPatternParamNames.md +0 -39
- package/api/@xmachines/play-signals/README.md +0 -209
- package/api/@xmachines/play-signals/functions/watchSignal.md +0 -65
- package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +0 -36
- package/api/@xmachines/play-signals/interfaces/SignalComputed.md +0 -49
- package/api/@xmachines/play-signals/interfaces/SignalOptions.md +0 -37
- package/api/@xmachines/play-signals/interfaces/SignalState.md +0 -68
- package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +0 -97
- package/api/@xmachines/play-signals/namespaces/Signal/README.md +0 -22
- package/api/@xmachines/play-signals/namespaces/Signal/classes/Computed.md +0 -52
- package/api/@xmachines/play-signals/namespaces/Signal/classes/State.md +0 -72
- package/api/@xmachines/play-signals/namespaces/Signal/interfaces/Options.md +0 -19
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/README.md +0 -21
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/classes/Watcher.md +0 -85
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/currentComputed.md +0 -13
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/hasSinks.md +0 -19
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/hasSources.md +0 -19
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/introspectSinks.md +0 -19
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/introspectSources.md +0 -19
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/functions/untrack.md +0 -25
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/variables/unwatched.md +0 -9
- package/api/@xmachines/play-signals/namespaces/Signal/namespaces/subtle/variables/watched.md +0 -9
- package/api/@xmachines/play-signals/namespaces/Signal/variables/isComputed.md +0 -19
- package/api/@xmachines/play-signals/namespaces/Signal/variables/isState.md +0 -19
- package/api/@xmachines/play-signals/namespaces/Signal/variables/isWatcher.md +0 -19
- package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +0 -33
- package/api/@xmachines/play-url/index/functions/getNormalizedParamNameMap.md +0 -32
- package/api/@xmachines/play-url/index/functions/getPatternParamNames.md +0 -29
- package/api/@xmachines/play-url/index/functions/getRequiredPatternParamNames.md +0 -39
- package/api/@xmachines/play-url/index/functions/isParameterizedPattern.md +0 -36
- package/api/@xmachines/play-url/index/functions/normalizeParamNames.md +0 -36
- package/guides/signals.md +0 -209
package/guides/atoms.md
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# Understanding Atoms in XMachines
|
|
2
|
+
|
|
3
|
+
Atoms are the reactive substrate connecting actors to the outside world in XMachines. This page explains what they are, why XMachines uses them instead of observables or callbacks, and how the atom primitives map to distinct roles in the architecture.
|
|
4
|
+
|
|
5
|
+
After reading this, you will understand why infrastructure never reads state directly from an actor — and what it does instead.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What problem atoms solve
|
|
10
|
+
|
|
11
|
+
When a state machine transitions, several things may need to react: the URL bar might update, a router might navigate, a renderer might swap views. The naive approach is to let each of those consumers call `actor.getSnapshot()` whenever they feel like it — or to have the actor call back into each consumer via callbacks.
|
|
12
|
+
|
|
13
|
+
Both approaches break down:
|
|
14
|
+
|
|
15
|
+
- **Polling** (`getSnapshot()` on a timer or event) is racy: consumers can observe inconsistent intermediate states during a transition sequence.
|
|
16
|
+
- **Callbacks** create direct dependencies between the actor and infrastructure, violating the architectural invariant that business logic must not depend on runtime APIs.
|
|
17
|
+
|
|
18
|
+
Atoms solve this with a **push–pull model**:
|
|
19
|
+
|
|
20
|
+
- The actor **pushes** state changes into atoms synchronously on every transition.
|
|
21
|
+
- Consumers **pull** values from atoms, and a derivation computes only when a dependency changed.
|
|
22
|
+
- Changes propagate **atomically**, so no consumer ever sees a half-updated state.
|
|
23
|
+
|
|
24
|
+
This model is sometimes called _glitch-free reactivity_: intermediate invalid states never escape to the environment.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## The atom primitives
|
|
29
|
+
|
|
30
|
+
XMachines uses the atom of [`@xstate/store`](https://stately.ai/docs/xstate-store), accessed via [`@xmachines/play-atom`](../api/@xmachines/play-atom/README.md). One function builds both kinds, and the argument decides which.
|
|
31
|
+
|
|
32
|
+
### `createAtom(value)` — writable values
|
|
33
|
+
|
|
34
|
+
`Atom<T>` holds a single mutable value. Only the actor (or code it explicitly delegates to) writes to it. Everything else reads from it.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { createAtom } from "@xmachines/play-atom";
|
|
38
|
+
|
|
39
|
+
const count = createAtom(0);
|
|
40
|
+
|
|
41
|
+
count.set(1); // write
|
|
42
|
+
count.set((previous) => previous + 1); // write from the previous value
|
|
43
|
+
count.get(); // read → 2
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
In XMachines, `actor.state` is an `Atom<Snapshot>`. The actor updates it on every XState transition. Infrastructure reads it — never writes it.
|
|
47
|
+
|
|
48
|
+
An atom notifies nobody when the new value compares equal to the old one. The default comparison is `Object.is`, and the `compare` option replaces it:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
const point = createAtom(
|
|
52
|
+
{ x: 0, y: 0 },
|
|
53
|
+
{ compare: (previous, next) => previous.x === next.x && previous.y === next.y },
|
|
54
|
+
);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### `createAtom(fn)` — derived values
|
|
58
|
+
|
|
59
|
+
`ReadonlyAtom<T>` derives a value from one or more other atoms. It recomputes only when its dependencies change, and it memoizes the result. The atom tracks each dependency for you: read another atom inside the function, and the edge exists.
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const route = createAtom(() => {
|
|
63
|
+
const snapshot = actor.state.get();
|
|
64
|
+
return snapshot.getMeta()?.route ?? null;
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
In XMachines, `actor.currentRoute` is a `ReadonlyAtom<string | null>`. Router adapters read it to know which URL to push — they do not compute the route themselves. Route derivation stays in the actor where the business logic lives.
|
|
69
|
+
|
|
70
|
+
> **A computed atom with a subscriber is EAGER.** `@xstate/store` builds a subscription on an effect that READS the atom, so a write to a dependency evaluates the derivation at once, inside that write. A computed atom that nobody subscribes to stays lazy, and it computes on a read. Keep a derivation cheap and free of a side effect.
|
|
71
|
+
|
|
72
|
+
### Write one atom, derive the rest
|
|
73
|
+
|
|
74
|
+
Every `set` flushes by itself, and the library exposes no batching. Two writes therefore give two propagations, and an observer that reads both atoms is evaluated **between** them, on a half-updated pair.
|
|
75
|
+
|
|
76
|
+
The actor writes exactly one atom for each transition — `state` — and `currentRoute` and `currentView` are computed atoms over it. One write reaches both, the engine orders the evaluation, and no observer reads a torn pair. Follow the same rule in your own code: when two values must agree, derive the second from the first rather than writing both.
|
|
77
|
+
|
|
78
|
+
### A derivation contains its own failures
|
|
79
|
+
|
|
80
|
+
A subscriber makes a computed atom eager, so the derivation runs inside the `set` of its dependency — before any observer sees anything. No subscriber can wrap that, so a derivation that something may watch must not throw:
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
const derived = createAtom((previous) => {
|
|
84
|
+
try {
|
|
85
|
+
return expensiveDerivation(source.get());
|
|
86
|
+
} catch (error) {
|
|
87
|
+
report(error);
|
|
88
|
+
return previous ?? null; // keep the last good value
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`actor.currentRoute` and `actor.currentView` both follow this rule. Each reports through the `onError` option of the actor and keeps its last good value, so one unbuildable route template or one malformed `meta.view` never breaks the transition for the other observers.
|
|
94
|
+
|
|
95
|
+
### `createWritableAtom(value)` — the writable atom, with one signature
|
|
96
|
+
|
|
97
|
+
`createAtom` carries two signatures, and TypeScript must prove the argument is not a function before it reaches the writable one. For a concrete type it proves that at once. For a type parameter, or a conditional type over one, it cannot, so it picks the computed signature and returns a `ReadonlyAtom` that carries no `set`.
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
class Holder<T extends { value: unknown }> {
|
|
101
|
+
public readonly state: Atom<T["value"]>;
|
|
102
|
+
|
|
103
|
+
constructor(seed: T["value"]) {
|
|
104
|
+
// createAtom(seed) would give a ReadonlyAtom here.
|
|
105
|
+
this.state = createWritableAtom(seed);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Use `createAtom` everywhere else.
|
|
111
|
+
|
|
112
|
+
### `atom.subscribe(fn)` — reactive observation
|
|
113
|
+
|
|
114
|
+
Every atom carries `subscribe`. The observer runs **synchronously**, inside the `set` of the atom that changed, and it returns a subscription with `unsubscribe()`.
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
const subscription = actor.currentRoute.subscribe((route) => {
|
|
118
|
+
console.log("Route is now:", route);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
subscription.unsubscribe();
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Two consequences follow from the synchronous delivery, and both matter:
|
|
125
|
+
|
|
126
|
+
- Several writes in one tick call the observer several times. Nothing coalesces them.
|
|
127
|
+
- An observer that THROWS throws inside the `set`, and the failure lands in the code that wrote the atom.
|
|
128
|
+
|
|
129
|
+
For both reasons, application code should use [`watchAtom()`](../api/@xmachines/play-atom/functions/watchAtom.md) instead.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## [`watchAtom()`](../api/@xmachines/play-atom/functions/watchAtom.md) — the safe helper
|
|
134
|
+
|
|
135
|
+
[`@xmachines/play-atom`](../api/@xmachines/play-atom/README.md) exports [`watchAtom(atom, onValue)`](../api/@xmachines/play-atom/functions/watchAtom.md) as a lifecycle-safe wrapper around `subscribe`. It returns a cleanup function:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
const stop = watchAtom(actor.currentRoute, (route) => {
|
|
139
|
+
console.log("Route is now:", route);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Later — stops observing and prevents use-after-free
|
|
143
|
+
stop();
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
[`watchAtom()`](../api/@xmachines/play-atom/functions/watchAtom.md) handles three subtle correctness concerns for you:
|
|
147
|
+
|
|
148
|
+
| Concern | What happens without it | How [`watchAtom`](../api/@xmachines/play-atom/functions/watchAtom.md) handles it |
|
|
149
|
+
| ---------------------- | -------------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
150
|
+
| **Use-after-free** | Callback fires after component unmounts | `disposed` flag checked before invoking callback |
|
|
151
|
+
| **Coalescing** | Rapid synchronous changes cause multiple callbacks | `scheduled` guard — only one microtask queued per synchronous burst |
|
|
152
|
+
| **Idempotent cleanup** | Calling the cleanup twice throws | Safe to call multiple times |
|
|
153
|
+
|
|
154
|
+
Use [`watchAtom()`](../api/@xmachines/play-atom/functions/watchAtom.md) in framework adapters and application code. Use the raw `subscribe` only when you need the notification at the exact moment of the write.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## The release, and `using`
|
|
159
|
+
|
|
160
|
+
`watchAtom()` returns a `Cleanup` from [`@xmachines/play`](../api/@xmachines/play/README.md): a
|
|
161
|
+
function, and a `Disposable`. One value therefore serves two forms, and the same holds for
|
|
162
|
+
the mount of [`@xmachines/play-dom`](../api/@xmachines/play-dom/README.md) and for `history.subscribe()` of
|
|
163
|
+
[`@xmachines/play-dom-router`](../api/@xmachines/play-dom-router/README.md).
|
|
164
|
+
|
|
165
|
+
Keep the explicit call where the release outlives the scope that made it — a field that a
|
|
166
|
+
teardown reads, an entry in a `Set` of releases:
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
const stop = watchAtom(actor.currentRoute, render);
|
|
170
|
+
onUnmount(() => stop());
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Write `using` where the release belongs to one scope. The scope releases it, an exception
|
|
174
|
+
releases it too, and the code carries no teardown:
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
{
|
|
178
|
+
using stop = watchAtom(actor.currentRoute, render);
|
|
179
|
+
render(actor.currentRoute.get());
|
|
180
|
+
// stop() runs here, and it runs even when render() throws
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
A scope releases from the last declaration to the first, so a release that depends on an
|
|
185
|
+
earlier one is safe.
|
|
186
|
+
|
|
187
|
+
Every release here is synchronous, so `Cleanup` is a `Disposable` and not an
|
|
188
|
+
`AsyncDisposable`. That is the permissive choice: a `Disposable` serves `using` AND
|
|
189
|
+
`await using`, while an `AsyncDisposable` raises a TypeError under a plain `using` and
|
|
190
|
+
forces every holder into an async function. `asCleanup` therefore refuses a release that
|
|
191
|
+
returns a value, and a promise above all — a promise handed to it would go on the floor,
|
|
192
|
+
released and unawaitable.
|
|
193
|
+
|
|
194
|
+
`using` needs Node 24 or a browser with Explicit Resource Management. The publishable
|
|
195
|
+
packages build at `target: "esnext"` and pass the syntax through untouched, so your bundler
|
|
196
|
+
decides how to emit it. The `Cleanup` VALUE needs neither: a runtime without
|
|
197
|
+
`Symbol.dispose` still calls it as a plain function.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## One instance, and why it matters
|
|
202
|
+
|
|
203
|
+
`@xstate/store` holds the active subscriber in a variable of its own module. Two copies in one application build two separate graphs: a computed atom of the first copy and a subscription of the second copy never meet, the subscriber stays silent, and no error reports the fault. Every propagation of state in this architecture goes through an atom, so the second copy stops the whole reactivity of an application.
|
|
204
|
+
|
|
205
|
+
[`@xmachines/play-atom`](../api/@xmachines/play-atom/README.md) therefore declares `@xstate/store` as a **peer** dependency. A renderer declares it no more, because it reads the atom through [`@xmachines/play-atom`](../api/@xmachines/play-atom/README.md) and names the engine in no import. Install one copy, and install it yourself. `tests/singleton-peers.test.ts` holds the rule true inside this workspace.
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Why not observables (RxJS) or event emitters?
|
|
210
|
+
|
|
211
|
+
The XMachines architecture chose atoms over observable libraries and event emitters for three reasons:
|
|
212
|
+
|
|
213
|
+
**1. One primitive, isolated.** Isolating the library behind [`@xmachines/play-atom`](../api/@xmachines/play-atom/README.md) means one package holds every change of the reactive primitive, and no consuming package changes with it.
|
|
214
|
+
|
|
215
|
+
**2. Synchronous atomic propagation.** RxJS streams are asynchronous by default. Event emitters fire immediately but serially — a listener registered halfway through a sequence can see inconsistent state. Atoms propagate atomically: every computed atom updates before any subscriber runs, and the algorithm resolves the diamond so that no subscriber reads a half-updated graph.
|
|
216
|
+
|
|
217
|
+
**3. Memoized derivation.** An observable pushes a value to every subscriber whatever the value is. An atom compares, and a derivation that produces an equal value notifies nobody and stops the propagation there.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## The invariants in XMachines
|
|
222
|
+
|
|
223
|
+
The [Play RFC](../rfc/play.md) defines five invariants that govern how atoms are used:
|
|
224
|
+
|
|
225
|
+
| Invariant | What it means in practice |
|
|
226
|
+
| ----------------------------- | ----------------------------------------------------------------------------------------------------------- |
|
|
227
|
+
| **1. Actor Authority** | Only actor code writes to `actor.state`. Never write to it from infrastructure. |
|
|
228
|
+
| **2. Strict Separation** | Business logic (`machine` definition) never imports browser APIs, routing libraries, or framework packages. |
|
|
229
|
+
| **3. Atom-Only Reactivity** | Cross-boundary communication uses atoms. Infrastructure does not poll `getSnapshot()`. |
|
|
230
|
+
| **4. Passive Infrastructure** | Routers and renderers read atoms and forward events. They never decide state transitions. |
|
|
231
|
+
| **5. State-Driven Reset** | Invalid external navigation is overwritten by actor-derived state. |
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Cleanup is mandatory
|
|
236
|
+
|
|
237
|
+
Atoms do not clean themselves up when they go out of scope. Every subscription you create must be explicitly disposed when the consuming component or adapter unmounts.
|
|
238
|
+
|
|
239
|
+
- Framework lifecycle hooks (`useEffect` cleanup in React, `onUnmounted` in Vue, `onCleanup` in Solid) must call the cleanup returned by [`watchAtom()`](../api/@xmachines/play-atom/functions/watchAtom.md).
|
|
240
|
+
- Router bridge `disconnect()` methods must release all atom subscriptions.
|
|
241
|
+
- If you use `subscribe` directly, pair every call with `unsubscribe()` in teardown.
|
|
242
|
+
|
|
243
|
+
Failing to clean up subscriptions causes memory leaks and stale callbacks firing after the consumer is gone.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Summary
|
|
248
|
+
|
|
249
|
+
| Primitive | Role in XMachines | Who uses it |
|
|
250
|
+
| ------------------------------------------------------------------- | ---------------------------------------------- | ---------------------------------- |
|
|
251
|
+
| `createAtom(value)` | Actor output: writable snapshot and view state | Actor writes; infrastructure reads |
|
|
252
|
+
| `createAtom(fn)` | Derivations: routes, view specs | Actor defines; adapters read |
|
|
253
|
+
| `createWritableAtom(value)` | The writable atom, for a generic value type | Capability and mixin code |
|
|
254
|
+
| `atom.subscribe(fn)` | Synchronous observation, at the write | Infrastructure that needs no delay |
|
|
255
|
+
| [`watchAtom()`](../api/@xmachines/play-atom/functions/watchAtom.md) | Lifecycle-safe, coalesced subscription | Application code, adapter code |
|
|
256
|
+
|
|
257
|
+
## See also
|
|
258
|
+
|
|
259
|
+
- [Understanding the Actor Model](actor-model.md) — why the actor owns all atom writes
|
|
260
|
+
- [Understanding State Machines](state-machines.md) — how state nodes produce the metadata that atoms derive
|
|
261
|
+
- [Getting Started](getting-started.md) — hands-on walkthrough using atoms to observe an actor
|
|
262
|
+
- [@xmachines/play-atom](../api/@xmachines/play-atom/README.md) — API reference
|
|
263
|
+
- [Play RFC](../rfc/play.md) — architectural specification
|
|
264
|
+
- [XState Store](https://stately.ai/docs/xstate-store) — the library that provides the atom
|
|
@@ -98,7 +98,7 @@ Available variables:
|
|
|
98
98
|
The test suite relies on TypeScript path aliases that resolve to source files. If aliases are not resolving:
|
|
99
99
|
|
|
100
100
|
1. Run `pnpm run build` first — some packages need their `dist/` present even in development.
|
|
101
|
-
2. Confirm your package's `vitest.config.ts` uses `defineXmVitestConfig` from `@xmachines/shared/vitest
|
|
101
|
+
2. Confirm your package's `vitest.config.ts` uses `defineXmVitestConfig` from [`@xmachines/shared/vitest`](../api/@xmachines/shared/README.md), which automatically configures the `@xmachines/*` path aliases.
|
|
102
102
|
|
|
103
103
|
#### TypeScript errors about missing types after adding a dependency
|
|
104
104
|
|
|
@@ -154,16 +154,16 @@ All packages are ES modules (`"type": "module"`). Use `.js` extensions in all Ty
|
|
|
154
154
|
Every XMachines application needs these four packages plus XState:
|
|
155
155
|
|
|
156
156
|
```bash
|
|
157
|
-
pnpm add xstate @xmachines/play-xstate @xmachines/play-actor @xmachines/play-
|
|
157
|
+
pnpm add xstate @xmachines/play-xstate @xmachines/play-actor @xmachines/play-atom @xmachines/json-render-core
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
| Package
|
|
161
|
-
|
|
|
162
|
-
| `xstate`
|
|
163
|
-
| [`@xmachines/play-xstate`](../api/@xmachines/play-xstate/README.md)
|
|
164
|
-
| [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md)
|
|
165
|
-
| [`@xmachines/play-
|
|
166
|
-
| `@xmachines/json-render-core`
|
|
160
|
+
| Package | Role |
|
|
161
|
+
| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
162
|
+
| `xstate` | XState v5 state machine engine (peer dependency) |
|
|
163
|
+
| [`@xmachines/play-xstate`](../api/@xmachines/play-xstate/README.md) | [`definePlayer()`](../api/@xmachines/play-xstate/index/functions/definePlayer.md), [`PlayerActor`](../api/@xmachines/play-xstate/index/classes/PlayerActor.md), routing helpers |
|
|
164
|
+
| [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md) | The actor contract: `PlayActor`, which names no state machine library |
|
|
165
|
+
| [`@xmachines/play-atom`](../api/@xmachines/play-atom/README.md) | The atom primitives (`createAtom`, [`watchAtom`](../api/@xmachines/play-atom/functions/watchAtom.md)) |
|
|
166
|
+
| `@xmachines/json-render-core` | Spec and store types the actor layer builds on — a peer of [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md), and of every renderer package |
|
|
167
167
|
|
|
168
168
|
#### Step 2: Install a router adapter (pick one)
|
|
169
169
|
|
|
@@ -244,7 +244,7 @@ actor.start();
|
|
|
244
244
|
|
|
245
245
|
// 5. Read state
|
|
246
246
|
console.log(actor.getSnapshot().value); // "off"
|
|
247
|
-
console.log(actor.state.get().value); // "off" (
|
|
247
|
+
console.log(actor.state.get().value); // "off" (an atom read)
|
|
248
248
|
|
|
249
249
|
// 6. Send events — the machine's guards decide all transitions
|
|
250
250
|
actor.send({ type: "toggle" });
|
|
@@ -259,7 +259,42 @@ actor.stop();
|
|
|
259
259
|
- Always use `setup({ types })` before `createMachine` — never bare `createMachine` from xstate.
|
|
260
260
|
- Use `setup.assign(...)` for context mutations — not the bare `assign` from xstate.
|
|
261
261
|
- Call `actor.start()` before sending events.
|
|
262
|
-
- Call `actor.stop()` when done to clean up
|
|
262
|
+
- Call `actor.stop()` when done to clean up atom subscriptions.
|
|
263
|
+
|
|
264
|
+
### Observing the actor
|
|
265
|
+
|
|
266
|
+
`actor.state`, `actor.currentRoute` and `actor.currentView` are **atoms**. `.get()` reads
|
|
267
|
+
one time, as above. To react to a change, use
|
|
268
|
+
[`watchAtom`](../api/@xmachines/play-atom/functions/watchAtom.md), which returns the
|
|
269
|
+
release:
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
import { watchAtom } from "@xmachines/play-atom";
|
|
273
|
+
|
|
274
|
+
const stop = watchAtom(actor.state, (snapshot) => {
|
|
275
|
+
console.log("the machine is now:", snapshot.value);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
actor.send({ type: "toggle" }); // the callback runs from a microtask
|
|
279
|
+
|
|
280
|
+
stop(); // release it, or write `using stop = watchAtom(...)`
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Three rules cover every use of them:
|
|
284
|
+
|
|
285
|
+
- **Read, never write.** The actor owns every atom it publishes. `currentRoute` and
|
|
286
|
+
`currentView` are DERIVED from `state`, so they carry no `set` at all.
|
|
287
|
+
- **`watchAtom` coalesces.** Several writes in one tick reach the callback one time, with
|
|
288
|
+
the last value. `atom.subscribe` delivers synchronously instead, inside the write — use
|
|
289
|
+
it only when you need the notification at that exact moment.
|
|
290
|
+
- **Release on teardown.** An atom holds its subscription until you release it. A
|
|
291
|
+
framework renderer does this for you; code that calls `watchAtom` itself does not.
|
|
292
|
+
|
|
293
|
+
A renderer needs none of this: [`@xmachines/play-react`](../api/@xmachines/play-react/README.md)
|
|
294
|
+
and the other renderers observe `currentView` for you. Reach for `watchAtom` when you
|
|
295
|
+
write infrastructure, or a debug panel beside the UI.
|
|
296
|
+
|
|
297
|
+
[Understanding Atoms](atoms.md) states the whole model.
|
|
263
298
|
|
|
264
299
|
---
|
|
265
300
|
|
|
@@ -337,7 +372,7 @@ const createPlayer = definePlayer({
|
|
|
337
372
|
const actor = createPlayer();
|
|
338
373
|
actor.start();
|
|
339
374
|
|
|
340
|
-
// Read the current route
|
|
375
|
+
// Read the current route from the atom
|
|
341
376
|
console.log(actor.currentRoute.get()); // "/"
|
|
342
377
|
|
|
343
378
|
// Navigate — actor guards validate the transition
|
|
@@ -405,7 +440,7 @@ export function App() {
|
|
|
405
440
|
|
|
406
441
|
#### Pattern 2: `connectRouter` pattern (Vanilla DOM, SvelteKit, Svelte)
|
|
407
442
|
|
|
408
|
-
Used with framework-agnostic or server-rendered routers. `connectRouter` handles bidirectional sync: `actor.currentRoute`
|
|
443
|
+
Used with framework-agnostic or server-rendered routers. `connectRouter` handles bidirectional sync: the `actor.currentRoute` atom → browser URL, and browser URL changes → `play.route` events sent to the actor.
|
|
409
444
|
|
|
410
445
|
```typescript
|
|
411
446
|
import { createBrowserHistory, createRouter, connectRouter } from "@xmachines/play-dom-router";
|
|
@@ -676,7 +711,7 @@ const routeMap = useMemo(() => createRouteMapFromTree(routeTree), [routeTree]);
|
|
|
676
711
|
|
|
677
712
|
#### Wrong Node.js version
|
|
678
713
|
|
|
679
|
-
**Error:** `SyntaxError: Cannot use import statement in a module` or
|
|
714
|
+
**Error:** `SyntaxError: Cannot use import statement in a module` or the atom package is not resolved.
|
|
680
715
|
|
|
681
716
|
**Fix:** Use Node.js `>= 24.0.0`. Check with:
|
|
682
717
|
|
|
@@ -695,9 +730,9 @@ node --version
|
|
|
695
730
|
| `actor.start()` | Activates the machine — always call before sending events |
|
|
696
731
|
| `actor.send({ type })` | Sends an event; machine guards decide whether a transition occurs |
|
|
697
732
|
| `actor.getSnapshot()` | Synchronous read of current state and context |
|
|
698
|
-
| `actor.state` | `
|
|
699
|
-
| `actor.currentRoute` | `
|
|
700
|
-
| `actor.currentView` | `
|
|
733
|
+
| `actor.state` | `Atom<Snapshot>` — the atom for reactive state observation |
|
|
734
|
+
| `actor.currentRoute` | `ReadonlyAtom<string \| null>` — resolved URL from active state's `meta.route` |
|
|
735
|
+
| `actor.currentView` | `ReadonlyAtom<PlaySpec \| null>` — view spec from active state's `meta.view` |
|
|
701
736
|
| [`formatPlayRouteTransitions`](../api/@xmachines/play-xstate/with-routing/functions/formatPlayRouteTransitions.md) | Generates `play.route` handlers from `id` + `meta.route` state pairs |
|
|
702
737
|
| `play.route` event | Navigation event — `to: "#stateId"`, optional `params`, `query` |
|
|
703
738
|
| `always` guard | Protects states — fires on entry before any event, even on direct URL access |
|
package/guides/inspector.md
CHANGED
|
@@ -90,17 +90,17 @@ The event types are XState's: `@xstate.actor` when an actor registers, `@xstate.
|
|
|
90
90
|
```typescript
|
|
91
91
|
const inspect = (event: InspectionEvent) => {
|
|
92
92
|
if (event.type === "@xstate.actor") {
|
|
93
|
-
// ❌ throws — the
|
|
93
|
+
// ❌ throws — the atoms are not assigned yet
|
|
94
94
|
console.log(event.actorRef.currentRoute.get());
|
|
95
95
|
}
|
|
96
96
|
if (event.type === "@xstate.snapshot") {
|
|
97
|
-
// ✅ construction has returned;
|
|
97
|
+
// ✅ construction has returned; atoms are live
|
|
98
98
|
console.log(event.actorRef.getSnapshot().value);
|
|
99
99
|
}
|
|
100
100
|
};
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
-
Capture the reference during construction if you need it, and read the
|
|
103
|
+
Capture the reference during construction if you need it, and read the atoms from a later event or from outside the observer entirely.
|
|
104
104
|
|
|
105
105
|
---
|
|
106
106
|
|
package/guides/routing.md
CHANGED
|
@@ -19,11 +19,11 @@ The first direction needs a matcher, and every router writes its own. Express us
|
|
|
19
19
|
|
|
20
20
|
`URLPattern` is the WHATWG standard for this, its syntax comes from `path-to-regexp`, and it is a superset of it. XMachines takes it as the pattern language, and it reads the whole of it.
|
|
21
21
|
|
|
22
|
-
This is the same decision that [`@xmachines/play-
|
|
22
|
+
This is the same decision that [`@xmachines/play-atom`](atoms.md) makes for reactivity: one primitive, isolated behind one module, present on every runtime. There is no `AtomsUnavailableError`, because one package holds the reactive primitive and every consumer reads it from there, and there is no URLPattern availability error for the same reason.
|
|
23
23
|
|
|
24
24
|
### The API is always present
|
|
25
25
|
|
|
26
|
-
`@xmachines/play-router` carries [`urlpattern-polyfill`](https://github.com/kenchris/urlpattern-polyfill) as an ordinary dependency. It uses the native `URLPattern` when the runtime has one, and the polyfill when it does not. **Install nothing, and load nothing.**
|
|
26
|
+
[`@xmachines/play-router`](../api/@xmachines/play-router/README.md) carries [`urlpattern-polyfill`](https://github.com/kenchris/urlpattern-polyfill) as an ordinary dependency. It uses the native `URLPattern` when the runtime has one, and the polyfill when it does not. **Install nothing, and load nothing.**
|
|
27
27
|
|
|
28
28
|
The native API arrived in Chrome 95, in Firefox 142 and in Safari 26. The browser floor of this workspace is Chrome 110, Firefox 115 and Safari 16.4. Chrome carries the API at that floor, and Firefox and Safari carry it far above it, so a Firefox or a Safari at the floor runs the polyfill. `test/url-pattern-parity.test.ts` measures the two implementations against each other, form by form. They agree on every form of the grammar, and they disagree about one shape that no bridge can produce — see the prefix rule below.
|
|
29
29
|
|
|
@@ -67,40 +67,60 @@ const machine = createMachine({
|
|
|
67
67
|
|
|
68
68
|
### Which forms work in which direction
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
|
78
|
-
|
|
|
79
|
-
| `:name
|
|
80
|
-
|
|
|
81
|
-
| `:
|
|
82
|
-
|
|
|
83
|
-
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
`
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
70
|
+
Both directions read ONE parse. `parsePattern` of
|
|
71
|
+
[`@xmachines/play-pattern`](../api/@xmachines/play-pattern/README.md) answers the match,
|
|
72
|
+
and `buildPath` of the same package walks the same parts back into a path.
|
|
73
|
+
[`@xmachines/play-url`](../api/@xmachines/play-url/README.md) re-exports both, so the
|
|
74
|
+
match reads them from there. A form that the route map matches therefore derives a URL,
|
|
75
|
+
with the exceptions that the table names.
|
|
76
|
+
|
|
77
|
+
| Form | URL to state | state to URL |
|
|
78
|
+
| -------------------------------- | ------------ | -------------------------------------------------------------- |
|
|
79
|
+
| a literal, `:name`, `:name?` | yes | yes |
|
|
80
|
+
| `:name*` | yes | yes — the value keeps each `/` that it carries |
|
|
81
|
+
| `:name+` | yes | yes — the context must hold a value |
|
|
82
|
+
| `{…}` | yes | yes — an optional group with no value goes away |
|
|
83
|
+
| `:name(\d+)` | yes | yes — the build drops the constraint, and it tests nothing |
|
|
84
|
+
| `*`, `(\d+)`, an anonymous param | yes | **no** — the param has no name, so no value can fill it |
|
|
85
|
+
| `:cat-id`, a hyphen in a name | yes | yes |
|
|
86
|
+
| an escape, `\+`, `\(`, `\:` | yes | yes for `\+` and `\(` — `\:` derives a path the bridge refuses |
|
|
87
|
+
|
|
88
|
+
`buildRouteUrl` of [`@xmachines/play-xstate`](../api/@xmachines/play-xstate/README.md)
|
|
89
|
+
performs the outbound half. It throws `MissingRouteParamError` when a part needs a value
|
|
90
|
+
that the context has not, and `deriveCurrentRoute` answers `null` for that error — so the
|
|
91
|
+
address bar waits for the next snapshot that carries the value.
|
|
92
|
+
|
|
93
|
+
It throws `InvalidRouteParamError` when a param carries a dot segment: `.`, `..`, or any
|
|
94
|
+
percent-encoding of the two. A URL parser resolves such a segment away BEFORE it decodes
|
|
95
|
+
the escapes, so the derived path is one that the route matches never. `deriveCurrentRoute`
|
|
96
|
+
passes that error on, because the value corrects itself never: the derivation of
|
|
97
|
+
`currentRoute` reports it through `onError` of the actor and keeps the last route, and
|
|
98
|
+
`initialRoute` throws from the constructor. Check a param value that carries a name from a
|
|
99
|
+
user before the machine puts it in the context.
|
|
100
|
+
|
|
101
|
+
**An anonymous param is the one form that derives no URL.** URLPattern numbers such a
|
|
102
|
+
group from `0`, and this library reports that name to no machine, so a machine can put no
|
|
103
|
+
value under it. A route of this shape is correct for a state that only RECEIVES a deep
|
|
104
|
+
link, such as a catch-all. Give the param a name when the machine navigates to it.
|
|
105
|
+
|
|
106
|
+
**A constraint describes a value, and the build tests no value against it.** The derived
|
|
107
|
+
path carries the value alone — `/page/:number(\d+)` with `{ number: "12" }` gives
|
|
108
|
+
`/page/12` — so a value that the constraint refuses derives a path that the route matches
|
|
109
|
+
never. The machine owns the value.
|
|
110
|
+
|
|
111
|
+
A param that carries `*` or `+` matches across a separator, so its value holds a path and
|
|
112
|
+
not one segment. The build encodes each segment of such a value and it keeps the `/`
|
|
113
|
+
between them: `/files/:path*` with `{ path: "a/b" }` gives `/files/a/b`.
|
|
114
|
+
|
|
115
|
+
The build resolves every escape, so the derived path carries the character and not the
|
|
116
|
+
backslash that protects it. `/tags/c\+\+` derives `/tags/c++`, which is the path that the
|
|
117
|
+
route matches.
|
|
118
|
+
|
|
119
|
+
**An escaped `:` is the one escape that stops at the bridge.** The build derives
|
|
120
|
+
`/time/10:30` for `/time/10\:30`, and the route matches that path — but a bridge refuses
|
|
121
|
+
to push a path that holds a `:`, because a `:` in a CONCRETE path marks a param that
|
|
122
|
+
nothing substituted. `resolveNavigationPath` therefore answers `null`, and the address bar
|
|
123
|
+
follows that state never. Write `%3A` instead, as the section below prescribes.
|
|
104
124
|
|
|
105
125
|
### A literal that the grammar would read
|
|
106
126
|
|
|
@@ -120,7 +140,7 @@ and the paragraphs below give the form to write for each.
|
|
|
120
140
|
/a%3Fb matches /a?b
|
|
121
141
|
```
|
|
122
142
|
|
|
123
|
-
**An escaped `:` matches, and it
|
|
143
|
+
**An escaped `:` matches, and it reaches no address bar.** The build resolves the escape, so `/time/10\:30` derives `/time/10:30`, which is the path that the route matches — but a bridge refuses a concrete path that holds a `:`, because that character marks a param that nothing substituted. Write `%3A` instead: `/time/10%3A30` is an ordinary literal path, and both halves read it end to end.
|
|
124
144
|
|
|
125
145
|
A `?` has no literal form, and the escape does not give it one. A URL pathname ends at its first `?`, so `getStateIdByPath` cuts every location there. The route `/a\?b` compiles with no fault, and no location reaches it. Write `%3F` instead: `/a%3Fb` is an ordinary literal path, and it resolves.
|
|
126
146
|
|
|
@@ -198,7 +218,7 @@ A machine can own the whole router, or it can sit under a mount. `basePath` is t
|
|
|
198
218
|
|
|
199
219
|
### 3. `connect()` and `disconnect()` come in a pair, and one actor takes one bridge
|
|
200
220
|
|
|
201
|
-
A bridge installs
|
|
221
|
+
A bridge installs an atom subscription on the actor and a subscription on the router. Neither releases itself.
|
|
202
222
|
|
|
203
223
|
- Call `disconnect()` from the teardown of your component: `useEffect` cleanup in React, `onUnmounted` in Vue, `onCleanup` in Solid.
|
|
204
224
|
- A second `connect()` on an actor that already has a bridge throws `DuplicateBridgeError`. The actor takes one bridge, so that two bridges cannot drive it in opposite directions.
|
|
@@ -226,19 +246,19 @@ Two matchers that disagree is also a worse failure than one dependency. The matc
|
|
|
226
246
|
|
|
227
247
|
## Summary
|
|
228
248
|
|
|
229
|
-
| Question | Answer
|
|
230
|
-
| ----------------------------------------- |
|
|
231
|
-
| What is the pattern language? | The `URLPattern` pathname grammar, plus hyphenated param names
|
|
232
|
-
| Do I install a polyfill? | No. `@xmachines/play-router` carries one
|
|
233
|
-
| Which side turns a URL into a state? | XMachines, in every adapter
|
|
234
|
-
| Which side turns a state into a URL? | XMachines, with no URLPattern at all
|
|
235
|
-
| When does the framework parse the params? | Vue Router and SolidJS Router, when the parse covers every name
|
|
236
|
-
| Who releases the bridge? | You, through `disconnect()` in the teardown of your component
|
|
249
|
+
| Question | Answer |
|
|
250
|
+
| ----------------------------------------- | ----------------------------------------------------------------------------------- |
|
|
251
|
+
| What is the pattern language? | The `URLPattern` pathname grammar, plus hyphenated param names |
|
|
252
|
+
| Do I install a polyfill? | No. [`@xmachines/play-router`](../api/@xmachines/play-router/README.md) carries one |
|
|
253
|
+
| Which side turns a URL into a state? | XMachines, in every adapter |
|
|
254
|
+
| Which side turns a state into a URL? | XMachines, with no URLPattern at all |
|
|
255
|
+
| When does the framework parse the params? | Vue Router and SolidJS Router, when the parse covers every name |
|
|
256
|
+
| Who releases the bridge? | You, through `disconnect()` in the teardown of your component |
|
|
237
257
|
|
|
238
258
|
## See also
|
|
239
259
|
|
|
240
260
|
- [Understanding State Machines](state-machines.md) — how `meta.route` reaches the route map
|
|
241
|
-
- [Understanding
|
|
261
|
+
- [Understanding Atoms](atoms.md) — the same decision, made for reactivity
|
|
242
262
|
- [Multi-router integration](../examples/multi-router-integration.md) — the provider pattern and `basePath`, end to end
|
|
243
263
|
- [Routing patterns](../examples/routing-patterns.md) — worked route maps
|
|
244
264
|
- [@xmachines/play-router](../api/@xmachines/play-router/README.md) — API reference
|
package/guides/state-machines.md
CHANGED
|
@@ -120,7 +120,7 @@ const appMachine = setup({/* ... */}).createMachine({
|
|
|
120
120
|
});
|
|
121
121
|
```
|
|
122
122
|
|
|
123
|
-
`meta.route` is a string path. When the machine enters a state, `actor.currentRoute` (a `
|
|
123
|
+
`meta.route` is a string path. When the machine enters a state, `actor.currentRoute` (a `ReadonlyAtom`) derives this path and emits it. The router bridge reads it and updates the URL.
|
|
124
124
|
|
|
125
125
|
`meta.view` is a [`PlaySpec`](../api/@xmachines/play-view/index/interfaces/PlaySpec.md) — a `@xmachines/json-render-core` spec object describing what to render. Use `typedSpec(...)` from [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md) to type-check the spec literal at the definition site (XState's `meta` is untyped). When the machine enters a state, `actor.currentView` is updated with the derived spec. The renderer reads it and projects it through framework components.
|
|
126
126
|
|
|
@@ -234,7 +234,7 @@ actions: {
|
|
|
234
234
|
},
|
|
235
235
|
```
|
|
236
236
|
|
|
237
|
-
Context is accessed in guards, actions, and when computing routes or views. It is not directly observable from outside the actor via
|
|
237
|
+
Context is accessed in guards, actions, and when computing routes or views. It is not directly observable from outside the actor via atoms — only the derived atoms (`state`, `currentRoute`, `currentView`) are public. If you need to expose a context field reactively, add a computed atom to the actor that derives from `actor.state`.
|
|
238
238
|
|
|
239
239
|
---
|
|
240
240
|
|
|
@@ -270,14 +270,14 @@ actor.start();
|
|
|
270
270
|
| Switch on URL path in component | `meta.route` on state nodes | Routing intent lives with the state that owns it |
|
|
271
271
|
| `if (user.role === "admin")` scattered in components | Guards on transitions | Auth logic is co-located with the transitions it governs |
|
|
272
272
|
| `useEffect` on route changes to decide what to render | `meta.view` on state nodes | View structure is declared alongside the state that owns it |
|
|
273
|
-
| Shared mutable state across components | Context +
|
|
273
|
+
| Shared mutable state across components | Context + atoms | Mutations are explicit, traceable, and test-covered |
|
|
274
274
|
|
|
275
275
|
---
|
|
276
276
|
|
|
277
277
|
## See also
|
|
278
278
|
|
|
279
279
|
- [Understanding the Actor Model](actor-model.md) — how the machine definition becomes a live actor
|
|
280
|
-
- [Understanding
|
|
280
|
+
- [Understanding Atoms](atoms.md) — how the actor's state is observed by infrastructure
|
|
281
281
|
- [Getting Started](getting-started.md) — step-by-step walkthrough building your first machine and actor
|
|
282
282
|
- [Routing Patterns](../examples/routing-patterns.md) — worked examples of `meta.route` and guards
|
|
283
283
|
- [@xmachines/play-xstate](../api/@xmachines/play-xstate/README.md) — full API reference for [`definePlayer`](../api/@xmachines/play-xstate/index/functions/definePlayer.md), [`PlayerActor`](../api/@xmachines/play-xstate/index/classes/PlayerActor.md), and the routing utilities
|