@xmachines/docs 6.0.0 → 7.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 +9 -8
- package/api/@xmachines/core/README.md +7 -2
- package/api/@xmachines/core/cache/functions/createLruCache.md +1 -1
- package/api/@xmachines/core/cache/interfaces/KeyValueCache.md +3 -3
- package/api/@xmachines/core/errors/classes/BaseError.md +4 -4
- package/api/@xmachines/core/errors/classes/DisposeConflictError.md +4 -4
- package/api/@xmachines/core/utils/functions/asDisposable.md +2 -2
- package/api/@xmachines/core/utils/functions/createNullRecord.md +1 -1
- package/api/@xmachines/core/utils/functions/createWarnOnce.md +1 -1
- package/api/@xmachines/core/utils/functions/describeValue.md +1 -1
- package/api/@xmachines/core/utils/functions/isError.md +1 -1
- package/api/@xmachines/core/utils/functions/isThenable.md +1 -1
- package/api/@xmachines/core/utils/functions/releaseQuietly.md +1 -1
- package/api/@xmachines/core/utils/functions/rethrowLater.md +1 -1
- package/api/@xmachines/core/utils/functions/safeString.md +1 -1
- package/api/@xmachines/core/utils/functions/shallowEqualExcept.md +1 -1
- package/api/@xmachines/core/utils/type-aliases/DisposeKey.md +1 -1
- package/api/@xmachines/core/utils/type-aliases/DisposeMember.md +1 -1
- package/api/@xmachines/core/utils/variables/DISPOSE.md +1 -1
- package/api/@xmachines/play/README.md +10 -5
- package/api/@xmachines/play/errors/classes/NonNullableError.md +4 -4
- package/api/@xmachines/play/errors/classes/PlayError.md +6 -4
- package/api/@xmachines/play/index/functions/assertNonNullable.md +1 -1
- package/api/@xmachines/play/index/type-aliases/PlayEvent.md +2 -2
- package/api/@xmachines/play-actor/README.md +9 -1
- package/api/@xmachines/play-actor/interfaces/ActorEvent.md +2 -2
- package/api/@xmachines/play-actor/interfaces/PlayActor.md +3 -3
- package/api/@xmachines/play-atom/README.md +17 -5
- package/api/@xmachines/play-atom/functions/watchAtom.md +1 -1
- package/api/@xmachines/play-atom/interfaces/AsyncAtomOptions.md +2 -2
- package/api/@xmachines/play-atom/interfaces/Atom.md +6 -6
- package/api/@xmachines/play-atom/interfaces/AtomObserver.md +4 -4
- package/api/@xmachines/play-atom/interfaces/AtomOptions.md +2 -2
- package/api/@xmachines/play-atom/interfaces/AtomSubscription.md +2 -2
- package/api/@xmachines/play-atom/interfaces/BaseAtom.md +4 -4
- package/api/@xmachines/play-atom/interfaces/CreateAtom.md +3 -3
- package/api/@xmachines/play-atom/interfaces/Readable.md +4 -4
- package/api/@xmachines/play-atom/interfaces/ReadonlyAtom.md +4 -4
- package/api/@xmachines/play-atom/type-aliases/AnyAtom.md +1 -1
- package/api/@xmachines/play-atom/type-aliases/AsyncAtomState.md +1 -1
- package/api/@xmachines/play-atom/variables/createAsyncAtom.md +1 -1
- package/api/@xmachines/play-atom/variables/createAtom.md +1 -1
- package/api/@xmachines/play-atom/variables/createWritableAtom.md +1 -1
- package/api/@xmachines/play-dom/README.md +138 -60
- package/api/@xmachines/play-dom/classes/PlayRenderer.md +12 -12
- package/api/@xmachines/play-dom/functions/createPlayUI.md +5 -5
- package/api/@xmachines/play-dom/functions/createRenderer.md +1 -1
- package/api/@xmachines/play-dom/functions/renderSpec.md +3 -2
- package/api/@xmachines/play-dom/interfaces/ComponentContext.md +9 -9
- package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +15 -14
- package/api/@xmachines/play-dom/interfaces/DomRenderContext.md +26 -20
- package/api/@xmachines/play-dom/interfaces/MountOptions.md +3 -3
- package/api/@xmachines/play-dom/interfaces/PassOptions.md +14 -0
- package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +18 -17
- package/api/@xmachines/play-dom/interfaces/RenderErrorInfo.md +16 -0
- package/api/@xmachines/play-dom/interfaces/RenderSpecOptions.md +17 -15
- package/api/@xmachines/play-dom/interfaces/UIProviderOptions.md +9 -8
- package/api/@xmachines/play-dom/interfaces/ValidationRegistry.md +14 -11
- package/api/@xmachines/play-dom/type-aliases/ConfirmHandler.md +9 -10
- package/api/@xmachines/play-dom/type-aliases/DefineRegistryOptions.md +4 -3
- package/api/@xmachines/play-dom/type-aliases/MountFn.md +1 -1
- package/api/@xmachines/play-dom/type-aliases/OnRenderError.md +27 -0
- package/api/@xmachines/play-dom/type-aliases/RenderErrorKind.md +21 -0
- package/api/@xmachines/play-dom-router/README.md +41 -5
- package/api/@xmachines/play-dom-router/classes/DomRouterBridge.md +7 -7
- package/api/@xmachines/play-dom-router/classes/RouteMap.md +4 -4
- 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 -3
- package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +14 -14
- package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +14 -14
- package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +8 -8
- package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +4 -4
- package/api/@xmachines/play-dom-router/interfaces/RouteLookupContract.md +3 -3
- package/api/@xmachines/play-dom-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-dom-router/interfaces/RouterConnection.md +6 -6
- package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +4 -4
- package/api/@xmachines/play-pattern/README.md +1 -1
- package/api/@xmachines/play-pattern/functions/buildPath.md +1 -1
- package/api/@xmachines/play-pattern/functions/createLruCache.md +1 -1
- package/api/@xmachines/play-pattern/functions/getIndexKey.md +1 -1
- package/api/@xmachines/play-pattern/functions/isDotSegment.md +1 -1
- package/api/@xmachines/play-pattern/functions/parsePattern.md +1 -1
- package/api/@xmachines/play-pattern/interfaces/GroupPart.md +4 -4
- package/api/@xmachines/play-pattern/interfaces/KeyValueCache.md +3 -3
- package/api/@xmachines/play-pattern/interfaces/LiteralPart.md +3 -3
- package/api/@xmachines/play-pattern/interfaces/ParamPart.md +7 -7
- package/api/@xmachines/play-pattern/interfaces/ParseOptions.md +2 -2
- package/api/@xmachines/play-pattern/interfaces/ParsedPattern.md +12 -12
- package/api/@xmachines/play-pattern/interfaces/PatternParam.md +4 -4
- package/api/@xmachines/play-pattern/type-aliases/PathBuildResult.md +1 -1
- package/api/@xmachines/play-pattern/type-aliases/PathParams.md +1 -1
- package/api/@xmachines/play-pattern/type-aliases/PatternModifier.md +1 -1
- package/api/@xmachines/play-pattern/type-aliases/PatternPart.md +1 -1
- package/api/@xmachines/play-react/README.md +57 -18
- package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +6 -6
- package/api/@xmachines/play-react/functions/defineRegistry.md +1 -1
- package/api/@xmachines/play-react/functions/useActor.md +1 -1
- package/api/@xmachines/play-react/functions/useAtomEffect.md +1 -1
- package/api/@xmachines/play-react/functions/usePlayView.md +1 -1
- package/api/@xmachines/play-react/interfaces/ActionProviderProps.md +5 -5
- package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +11 -11
- package/api/@xmachines/play-react/interfaces/DefineRegistryResult.md +15 -0
- 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 +13 -13
- package/api/@xmachines/play-react/interfaces/RenderErrorInfo.md +16 -0
- package/api/@xmachines/play-react/interfaces/RendererProps.md +7 -7
- 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/type-aliases/OnRenderError.md +27 -0
- package/api/@xmachines/play-react/type-aliases/RenderErrorKind.md +21 -0
- package/api/@xmachines/play-react/variables/ActorProvider.md +14 -4
- 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 +26 -5
- package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +7 -7
- package/api/@xmachines/play-react-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +1 -1
- package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +9 -9
- package/api/@xmachines/play-react-router/interfaces/RoutableActor.md +4 -4
- package/api/@xmachines/play-react-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-react-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
- package/api/@xmachines/play-react-router/type-aliases/PlayRouterProviderBaseProps.md +1 -1
- package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-router/README.md +79 -23
- 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/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-router/index/classes/RouterBridgeBase.md +7 -7
- 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/createLruCache.md +1 -1
- package/api/@xmachines/play-router/index/functions/createRouteMapFromTree.md +1 -1
- 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 +1 -1
- package/api/@xmachines/play-router/index/functions/findRouteById.md +1 -1
- package/api/@xmachines/play-router/index/functions/findRouteByPath.md +1 -1
- package/api/@xmachines/play-router/index/functions/isMountableBridge.md +1 -1
- package/api/@xmachines/play-router/index/functions/joinBasePath.md +1 -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 +1 -1
- 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 +1 -1
- package/api/@xmachines/play-router/index/functions/sanitizePathname.md +1 -1
- package/api/@xmachines/play-router/index/functions/splitLocation.md +1 -1
- 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 +3 -3
- package/api/@xmachines/play-router/index/interfaces/BuildPlayRouteEventOptions.md +4 -4
- package/api/@xmachines/play-router/index/interfaces/CompileOptions.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/FrameworkParamsSource.md +7 -7
- package/api/@xmachines/play-router/index/interfaces/KeyValueCache.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/LocationLike.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/MountableRouterBridge.md +6 -6
- package/api/@xmachines/play-router/index/interfaces/OpenProviderBridgeArgs.md +8 -8
- package/api/@xmachines/play-router/index/interfaces/ParseOptions.md +2 -2
- package/api/@xmachines/play-router/index/interfaces/ParsedPattern.md +12 -12
- package/api/@xmachines/play-router/index/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-router/index/interfaces/PlayRouterProviderBaseProps.md +9 -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 +3 -3
- package/api/@xmachines/play-router/index/interfaces/RoutableActor.md +4 -4
- package/api/@xmachines/play-router/index/interfaces/RouteInfo.md +8 -8
- package/api/@xmachines/play-router/index/interfaces/RouteMapOptions.md +4 -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 +12 -15
- package/api/@xmachines/play-router/index/interfaces/RouteTree.md +5 -5
- package/api/@xmachines/play-router/index/interfaces/RouteWatcherHandle.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-router/index/interfaces/RouterBridgeOptions.md +6 -6
- package/api/@xmachines/play-router/index/interfaces/RouterConnection.md +6 -6
- package/api/@xmachines/play-router/index/interfaces/SplitLocation.md +5 -5
- package/api/@xmachines/play-router/index/interfaces/WindowLike.md +3 -3
- package/api/@xmachines/play-router/index/type-aliases/PlayRouterBridgeConstructor.md +1 -1
- 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 +3 -3
- 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 +1 -1
- package/api/@xmachines/play-router/xstate/functions/extractMachineRoutes.md +1 -1
- 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 +35 -14
- package/api/@xmachines/play-solid/functions/defineRegistry.md +5 -5
- package/api/@xmachines/play-solid/functions/useActor.md +1 -1
- package/api/@xmachines/play-solid/functions/useBoundProp.md +8 -5
- package/api/@xmachines/play-solid/functions/useFieldValidation.md +6 -4
- package/api/@xmachines/play-solid/functions/usePlayView.md +1 -1
- package/api/@xmachines/play-solid/functions/useStateBinding.md +5 -3
- package/api/@xmachines/play-solid/functions/useStateValue.md +5 -3
- package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +10 -10
- package/api/@xmachines/play-solid/interfaces/ComponentContext.md +9 -8
- package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +13 -13
- package/api/@xmachines/play-solid/interfaces/RenderErrorInfo.md +16 -0
- package/api/@xmachines/play-solid/interfaces/RendererProps.md +7 -7
- 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/type-aliases/OnRenderError.md +27 -0
- package/api/@xmachines/play-solid/type-aliases/RenderErrorKind.md +21 -0
- package/api/@xmachines/play-solid/variables/ActorContext.md +1 -1
- package/api/@xmachines/play-solid/variables/ActorProvider.md +17 -3
- 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/variables/schema.md +35 -54
- package/api/@xmachines/play-solid-router/README.md +22 -6
- package/api/@xmachines/play-solid-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +8 -8
- package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +3 -3
- package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +9 -9
- package/api/@xmachines/play-solid-router/interfaces/RoutableActor.md +4 -4
- package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
- package/api/@xmachines/play-solid-router/type-aliases/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 +18 -10
- package/api/@xmachines/play-svelte/functions/defineRegistry.md +3 -4
- 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 +12 -12
- package/api/@xmachines/play-svelte/interfaces/BaseComponentProps.md +10 -8
- package/api/@xmachines/play-svelte/interfaces/ComponentContext.md +10 -8
- package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +8 -8
- package/api/@xmachines/play-svelte/interfaces/DefineRegistryResult.md +15 -0
- package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +14 -14
- package/api/@xmachines/play-svelte/interfaces/RenderErrorInfo.md +16 -0
- 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/type-aliases/OnRenderError.md +27 -0
- package/api/@xmachines/play-svelte/type-aliases/RenderErrorKind.md +21 -0
- package/api/@xmachines/play-svelte-spa-router/README.md +9 -5
- package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-svelte-spa-router/classes/SvelteSpaRouterBridge.md +7 -7
- package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-svelte-spa-router/interfaces/BasePathOptions.md +3 -3
- package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +8 -8
- package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-svelte-spa-router/interfaces/RoutableActor.md +4 -4
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-svelte-spa-router/interfaces/RouterConnection.md +6 -6
- package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
- package/api/@xmachines/play-sveltekit-router/README.md +65 -13
- package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-sveltekit-router/classes/SvelteKitRouterBridge.md +29 -19
- package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +1 -1
- package/api/@xmachines/play-sveltekit-router/interfaces/BasePathOptions.md +3 -3
- package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +13 -16
- 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 +4 -4
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-sveltekit-router/interfaces/RouterConnection.md +6 -6
- package/api/@xmachines/play-sveltekit-router/interfaces/SvelteKitRouterBridgeOptions.md +25 -0
- package/api/@xmachines/play-sveltekit-router/type-aliases/ShallowNavigation.md +21 -0
- package/api/@xmachines/play-tanstack-react-router/README.md +34 -16
- package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +7 -7
- package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +9 -9
- package/api/@xmachines/play-tanstack-react-router/interfaces/RoutableActor.md +4 -4
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
- package/api/@xmachines/play-tanstack-react-router/type-aliases/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 +5 -3
- package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +7 -7
- 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 +45 -11
- package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +4 -4
- package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +7 -7
- 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 +9 -9
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RoutableActor.md +4 -4
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterBridgeConstructor.md +1 -1
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/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 +1 -1
- 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/functions/buildPath.md +1 -1
- package/api/@xmachines/play-url/index/functions/cleanFrameworkParams.md +1 -1
- package/api/@xmachines/play-url/index/functions/createLruCache.md +1 -1
- package/api/@xmachines/play-url/index/functions/getCandidates.md +1 -1
- package/api/@xmachines/play-url/index/functions/getCompiledPattern.md +1 -1
- package/api/@xmachines/play-url/index/functions/getIndexKey.md +1 -1
- package/api/@xmachines/play-url/index/functions/holdsUnsubstitutedParam.md +1 -1
- package/api/@xmachines/play-url/index/functions/isDotSegment.md +1 -1
- package/api/@xmachines/play-url/index/functions/joinBasePath.md +1 -1
- package/api/@xmachines/play-url/index/functions/normalizeBasePath.md +1 -1
- package/api/@xmachines/play-url/index/functions/parsePattern.md +1 -1
- 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 +1 -1
- package/api/@xmachines/play-url/index/functions/sanitizePathname.md +1 -1
- package/api/@xmachines/play-url/index/functions/splitLocation.md +1 -1
- 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 +3 -3
- package/api/@xmachines/play-url/index/interfaces/FrameworkParamsSource.md +7 -7
- package/api/@xmachines/play-url/index/interfaces/GroupPart.md +4 -4
- package/api/@xmachines/play-url/index/interfaces/KeyValueCache.md +3 -3
- package/api/@xmachines/play-url/index/interfaces/LiteralPart.md +3 -3
- package/api/@xmachines/play-url/index/interfaces/ParamPart.md +7 -7
- package/api/@xmachines/play-url/index/interfaces/ParseOptions.md +2 -2
- package/api/@xmachines/play-url/index/interfaces/ParsedPattern.md +12 -12
- package/api/@xmachines/play-url/index/interfaces/PatternParam.md +4 -4
- package/api/@xmachines/play-url/index/interfaces/ResolvedBasePath.md +3 -3
- package/api/@xmachines/play-url/index/interfaces/SplitLocation.md +5 -5
- package/api/@xmachines/play-url/index/type-aliases/PathBuildResult.md +1 -1
- package/api/@xmachines/play-url/index/type-aliases/PathParams.md +1 -1
- 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 +92 -35
- package/api/@xmachines/play-view/errors/README.md +2 -0
- package/api/@xmachines/play-view/errors/classes/InvalidViewOutletError.md +204 -0
- package/api/@xmachines/play-view/errors/classes/ReadOnlyContextError.md +5 -5
- package/api/@xmachines/play-view/errors/classes/ViewElementKeyCollisionError.md +181 -0
- package/api/@xmachines/play-view/index/README.md +16 -4
- package/api/@xmachines/play-view/index/functions/attachRenderErrorHandler.md +10 -9
- package/api/@xmachines/play-view/index/functions/bindStoreHandlers.md +34 -0
- package/api/@xmachines/play-view/index/functions/composePlayState.md +1 -1
- package/api/@xmachines/play-view/index/functions/composeViews.md +41 -0
- package/api/@xmachines/play-view/index/functions/createActorProxy.md +39 -0
- package/api/@xmachines/play-view/index/functions/createRenderErrorBinding.md +35 -0
- package/api/@xmachines/play-view/index/functions/createReportGuard.md +1 -1
- package/api/@xmachines/play-view/index/functions/createViewSession.md +29 -0
- package/api/@xmachines/play-view/index/functions/createViewStoreLifecycle.md +1 -1
- package/api/@xmachines/play-view/index/functions/forwardRenderError.md +45 -0
- package/api/@xmachines/play-view/index/functions/guardContextWrites.md +1 -1
- 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/toAtomState.md +1 -1
- package/api/@xmachines/play-view/index/functions/typedSpec.md +11 -11
- package/api/@xmachines/play-view/index/interfaces/BaseActorProviderProps.md +8 -8
- package/api/@xmachines/play-view/index/interfaces/BaseViewContextValue.md +5 -5
- package/api/@xmachines/play-view/index/interfaces/ComposedView.md +16 -0
- package/api/@xmachines/play-view/index/interfaces/HandlerFactory.md +19 -0
- package/api/@xmachines/play-view/index/interfaces/PlaySpec.md +12 -8
- package/api/@xmachines/play-view/index/interfaces/ReportGuard.md +5 -5
- package/api/@xmachines/play-view/index/interfaces/ReportGuardMessages.md +5 -5
- package/api/@xmachines/play-view/index/interfaces/ResolveViewStoreOptions.md +2 -2
- package/api/@xmachines/play-view/index/interfaces/ViewMeta.md +25 -0
- package/api/@xmachines/play-view/index/interfaces/ViewOutlet.md +23 -0
- package/api/@xmachines/play-view/index/interfaces/ViewSession.md +155 -0
- package/api/@xmachines/play-view/index/interfaces/ViewSessionOptions.md +12 -0
- package/api/@xmachines/play-view/index/interfaces/ViewSessionSnapshot.md +23 -0
- package/api/@xmachines/play-view/index/interfaces/ViewStoreLifecycle.md +22 -3
- package/api/@xmachines/play-view/index/interfaces/ViewStoreResolution.md +7 -6
- package/api/@xmachines/play-view/index/interfaces/ViewTree.md +15 -0
- package/api/@xmachines/play-view/index/interfaces/ViewTreeChild.md +14 -0
- package/api/@xmachines/play-view/index/interfaces/Viewable.md +4 -4
- package/api/@xmachines/play-view/index/type-aliases/StateUpdater.md +21 -0
- 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 +21 -18
- 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/useBoundProp.md +10 -4
- package/api/@xmachines/play-vue/functions/useFieldValidation.md +12 -5
- package/api/@xmachines/play-vue/functions/usePlayView.md +1 -1
- package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +8 -8
- package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +11 -11
- package/api/@xmachines/play-vue/interfaces/RenderErrorInfo.md +16 -0
- package/api/@xmachines/play-vue/interfaces/RendererProps.md +7 -7
- 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/type-aliases/OnRenderError.md +27 -0
- package/api/@xmachines/play-vue/type-aliases/RenderErrorKind.md +21 -0
- package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
- package/api/@xmachines/play-vue/variables/Renderer.md +3 -3
- package/api/@xmachines/play-vue-router/README.md +18 -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 +4 -4
- package/api/@xmachines/play-vue-router/index/classes/VueRouterBridge.md +7 -7
- package/api/@xmachines/play-vue-router/index/interfaces/PlayRouteEvent.md +7 -7
- package/api/@xmachines/play-vue-router/index/interfaces/RoutableActor.md +4 -4
- package/api/@xmachines/play-vue-router/index/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-vue-router/index/interfaces/RouteMapping.md +3 -3
- package/api/@xmachines/play-vue-router/index/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-vue-router/index/variables/PlayRouterProvider.md +1 -1
- package/api/@xmachines/play-xstate/README.md +87 -28
- 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 +7 -7
- 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/classes/PlayerActor.md +10 -10
- 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 +7 -7
- 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/with-routing/functions/buildRouteUrl.md +1 -1
- 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 +12 -15
- 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 +2 -4
- package/api/@xmachines/shared/README.md +1 -0
- package/api/@xmachines/shared/vite-aliases/README.md +7 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmAliases.md +11 -5
- package/api/@xmachines/shared/vite-aliases/functions/xmBuildOutput.md +37 -0
- package/api/@xmachines/shared/vite-aliases/functions/xmBuildOutputFile.md +28 -0
- 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/vite-aliases/functions/xmTestTarget.md +26 -0
- package/api/@xmachines/shared/vite-aliases/type-aliases/XmTestTarget.md +15 -0
- package/api/@xmachines/shared/vitest/functions/defineXmBrowserConfig.md +1 -1
- package/api/@xmachines/shared/vitest/functions/defineXmVitestConfig.md +5 -1
- package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +4 -4
- package/api/llms.txt +8 -4
- package/contributing/architecture.md +96 -51
- package/contributing/configuration.md +55 -14
- package/contributing/deployment.md +3 -3
- package/contributing/development.md +31 -4
- package/contributing/migrating-to-play-atom.md +11 -5
- package/contributing/testing.md +93 -33
- package/examples/@xmachines/play-dom-demo/README.md +2 -2
- package/examples/@xmachines/play-dom-demo/functions/createAuthActionHandlers.md +9 -9
- package/examples/@xmachines/play-dom-demo/functions/createConfirmDialog.md +1 -1
- package/examples/@xmachines/play-dom-demo/functions/createNavBar.md +1 -1
- package/examples/@xmachines/play-dom-demo/functions/initShell.md +1 -1
- package/examples/@xmachines/play-dom-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/About.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Button.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Field.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/NavBarView.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Panel.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-dom-demo/variables/demoComponents.md +15 -15
- package/examples/@xmachines/play-dom-router-demo/README.md +4 -3
- package/examples/@xmachines/play-react-demo/README.md +2 -2
- package/examples/@xmachines/play-react-demo/functions/createAuthActionHandlers.md +9 -9
- 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 +1 -1
- package/examples/@xmachines/play-react-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/DebugPanel.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Field.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/NavBar.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/NavBarView.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Panel.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Shell.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-react-demo/variables/demoComponents.md +15 -15
- package/examples/@xmachines/play-react-router-demo/README.md +4 -3
- package/examples/@xmachines/play-solid-demo/README.md +3 -3
- package/examples/@xmachines/play-solid-demo/functions/createAuthActionHandlers.md +9 -9
- 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 +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Contact.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Dashboard.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/DebugPanel.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Field.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Home.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Login.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/NavBar.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/NavBarView.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Navigation.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Overview.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Panel.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Profile.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Settings.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Shell.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/Stats.md +1 -1
- package/examples/@xmachines/play-solid-demo/variables/authCatalog.md +190 -277
- package/examples/@xmachines/play-solid-demo/variables/demoComponents.md +17 -17
- package/examples/@xmachines/play-solid-router-demo/README.md +9 -3
- package/examples/@xmachines/play-svelte-demo/README.md +1 -1
- package/examples/@xmachines/play-svelte-demo/functions/createAuthActionHandlers.md +9 -9
- package/examples/@xmachines/play-svelte-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-svelte-demo/variables/authCatalog.md +190 -277
- package/examples/@xmachines/play-svelte-demo/variables/demoComponents.md +15 -15
- package/examples/@xmachines/play-svelte-spa-router-demo/README.md +1 -1
- package/examples/@xmachines/play-sveltekit-router-demo/README.md +1 -1
- package/examples/@xmachines/play-tanstack-react-router-demo/README.md +3 -2
- package/examples/@xmachines/play-tanstack-solid-router-demo/README.md +9 -8
- package/examples/@xmachines/play-vue-demo/README.md +2 -2
- package/examples/@xmachines/play-vue-demo/functions/createAuthActionHandlers.md +9 -9
- package/examples/@xmachines/play-vue-demo/type-aliases/AuthCatalog.md +1 -1
- package/examples/@xmachines/play-vue-demo/variables/App.md +1 -1
- package/examples/@xmachines/play-vue-demo/variables/authCatalog.md +1 -1
- package/examples/@xmachines/play-vue-demo/variables/demoComponents.md +1 -1
- package/examples/@xmachines/play-vue-router-demo/README.md +3 -3
- package/examples/README.md +1 -1
- package/examples/form-validation.md +17 -13
- package/examples/multi-router-integration.md +269 -148
- package/examples/routing-patterns.md +44 -9
- package/examples/traffic-light.md +7 -3
- package/guides/README.md +5 -4
- package/guides/actor-model.md +41 -23
- package/guides/atoms.md +52 -12
- package/guides/getting-started.md +65 -19
- package/guides/inspector.md +72 -12
- package/guides/routing.md +44 -45
- package/guides/state-machines.md +102 -15
- package/guides/views.md +367 -0
- package/package.json +6 -6
- package/rfc/play.md +55 -21
- package/api/@xmachines/play-view/index/functions/createFailureLatch.md +0 -20
- package/api/@xmachines/play-view/index/functions/sameViewInputs.md +0 -25
- package/api/@xmachines/play-view/index/interfaces/FailureLatch.md +0 -60
- package/api/@xmachines/play-view/index/interfaces/ViewInputs.md +0 -19
|
@@ -102,13 +102,13 @@ The test suite relies on TypeScript path aliases that resolve to source files. I
|
|
|
102
102
|
|
|
103
103
|
#### TypeScript errors about missing types after adding a dependency
|
|
104
104
|
|
|
105
|
-
Run `pnpm install --frozen-lockfile` again to ensure all types are installed. If you added a workspace-local dependency,
|
|
105
|
+
Run `pnpm install --frozen-lockfile` again to ensure all types are installed. If you added a workspace-local dependency, declare it in the `package.json` of the package with a `workspace:*` range. The root `tsconfig.json` holds the build order, and `tests/tsconfig-reference-graph.test.ts` fails when that order misses the new edge.
|
|
106
106
|
|
|
107
107
|
#### Lint errors about import extensions
|
|
108
108
|
|
|
109
109
|
All TypeScript imports must end with `.js`, even for `.ts` source files:
|
|
110
110
|
|
|
111
|
-
```typescript
|
|
111
|
+
```typescript fragment
|
|
112
112
|
// ✅ Correct
|
|
113
113
|
import { PlayError } from "./errors.js";
|
|
114
114
|
|
|
@@ -154,9 +154,11 @@ All packages are ES modules (`"type": "module"`). Use `.js` extensions in all Ty
|
|
|
154
154
|
Every XMachines application needs these six packages plus XState:
|
|
155
155
|
|
|
156
156
|
```bash
|
|
157
|
-
pnpm add xstate @xmachines/play-xstate @xmachines/play-actor @xmachines/play-atom @xmachines/play @xmachines/core @xmachines/json-render-core
|
|
157
|
+
pnpm add xstate @xmachines/play-xstate @xmachines/play-actor @xmachines/play-atom @xmachines/play @xmachines/core @xmachines/json-render-core@0.21.0-xm.6
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
+
The json-render packages are exact peers: install the version that this release names, `0.21.0-xm.6`.
|
|
161
|
+
|
|
160
162
|
| Package | Role |
|
|
161
163
|
| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
162
164
|
| `xstate` | XState v5 state machine engine (peer dependency) |
|
|
@@ -208,7 +210,6 @@ const appSetup = setup({
|
|
|
208
210
|
types: {
|
|
209
211
|
context: {} as { count: number },
|
|
210
212
|
events: {} as { type: "toggle" },
|
|
211
|
-
input: {} as undefined,
|
|
212
213
|
},
|
|
213
214
|
});
|
|
214
215
|
|
|
@@ -272,6 +273,10 @@ release:
|
|
|
272
273
|
|
|
273
274
|
```typescript
|
|
274
275
|
import { watchAtom } from "@xmachines/play-atom";
|
|
276
|
+
import type { PlayerActor } from "@xmachines/play-xstate";
|
|
277
|
+
import type { AnyStateMachine } from "xstate";
|
|
278
|
+
|
|
279
|
+
declare const actor: PlayerActor<AnyStateMachine>; // the actor of the example above
|
|
275
280
|
|
|
276
281
|
const stop = watchAtom(actor.state, (snapshot) => {
|
|
277
282
|
console.log("the machine is now:", snapshot.value);
|
|
@@ -296,7 +301,7 @@ A renderer needs none of this: [`@xmachines/play-react`](../api/@xmachines/play-
|
|
|
296
301
|
and the other renderers observe `currentView` for you. Reach for `watchAtom` when you
|
|
297
302
|
write infrastructure, or a debug panel beside the UI.
|
|
298
303
|
|
|
299
|
-
[
|
|
304
|
+
[Atoms](atoms.md) states the whole model.
|
|
300
305
|
|
|
301
306
|
---
|
|
302
307
|
|
|
@@ -325,7 +330,6 @@ const appSetup = setup({
|
|
|
325
330
|
},
|
|
326
331
|
events: {} as
|
|
327
332
|
PlayRouteEvent | { type: "auth.login"; username: string } | { type: "auth.logout" },
|
|
328
|
-
input: {} as undefined,
|
|
329
333
|
},
|
|
330
334
|
});
|
|
331
335
|
|
|
@@ -412,16 +416,27 @@ Used with framework-integrated routers like TanStack Router. All three props (`a
|
|
|
412
416
|
|
|
413
417
|
```tsx
|
|
414
418
|
// React + TanStack Router example
|
|
415
|
-
import { useMemo, useEffect } from "react";
|
|
419
|
+
import { useMemo, useEffect, type ReactNode } from "react";
|
|
416
420
|
import { createRouter, createRootRoute } from "@tanstack/react-router";
|
|
417
421
|
import { PlayRouterProvider, createRouteMapFromTree } from "@xmachines/play-tanstack-react-router";
|
|
418
422
|
import { extractMachineRoutes } from "@xmachines/play-router/xstate";
|
|
423
|
+
import { compose, definePlayer, PlayerActor } from "@xmachines/play-xstate";
|
|
424
|
+
import { withRouting } from "@xmachines/play-xstate/routing";
|
|
425
|
+
import type { AnyStateMachine } from "xstate";
|
|
426
|
+
|
|
427
|
+
declare const appMachine: AnyStateMachine; // the machine of "Adding Routing"
|
|
428
|
+
declare function Shell(props: { actor: typeof actor }): ReactNode; // your layout
|
|
429
|
+
|
|
419
430
|
// Build OUTSIDE of JSX — must be stable references
|
|
420
431
|
const routeTree = extractMachineRoutes(appMachine);
|
|
421
432
|
const routeMap = createRouteMapFromTree(routeTree);
|
|
422
433
|
const router = createRouter({ routeTree: createRootRoute() });
|
|
423
434
|
|
|
424
435
|
// Actor also created outside the component (or memoized inside)
|
|
436
|
+
const createPlayer = definePlayer({
|
|
437
|
+
machine: appMachine,
|
|
438
|
+
actor: compose(PlayerActor, withRouting),
|
|
439
|
+
});
|
|
425
440
|
const actor = createPlayer();
|
|
426
441
|
actor.start();
|
|
427
442
|
|
|
@@ -448,12 +463,21 @@ Used with framework-agnostic or server-rendered routers. `connectRouter` handles
|
|
|
448
463
|
import { createBrowserHistory, createRouter, connectRouter } from "@xmachines/play-dom-router";
|
|
449
464
|
import { createRouteMapFromTree } from "@xmachines/play-router";
|
|
450
465
|
import { extractMachineRoutes } from "@xmachines/play-router/xstate";
|
|
466
|
+
import { compose, definePlayer, PlayerActor } from "@xmachines/play-xstate";
|
|
467
|
+
import { withRouting } from "@xmachines/play-xstate/routing";
|
|
468
|
+
import type { AnyStateMachine } from "xstate";
|
|
469
|
+
|
|
470
|
+
declare const appMachine: AnyStateMachine; // the machine of "Adding Routing"
|
|
451
471
|
|
|
452
472
|
const routeTree = extractMachineRoutes(appMachine);
|
|
453
473
|
const routeMap = createRouteMapFromTree(routeTree);
|
|
454
474
|
const history = createBrowserHistory({ window });
|
|
455
475
|
const router = createRouter({ routeTree, history });
|
|
456
476
|
|
|
477
|
+
const createPlayer = definePlayer({
|
|
478
|
+
machine: appMachine,
|
|
479
|
+
actor: compose(PlayerActor, withRouting),
|
|
480
|
+
});
|
|
457
481
|
const actor = createPlayer();
|
|
458
482
|
actor.start();
|
|
459
483
|
|
|
@@ -483,6 +507,10 @@ import { PlayUIProvider, PlayRenderer, defineRegistry } from "@xmachines/play-re
|
|
|
483
507
|
import { defineCatalog } from "@xmachines/json-render-core";
|
|
484
508
|
import { schema } from "@xmachines/play-react";
|
|
485
509
|
import { z } from "zod";
|
|
510
|
+
import type { ViewActor } from "@xmachines/play-view";
|
|
511
|
+
|
|
512
|
+
type AuthEvent = { type: "auth.login"; username: string } | { type: "auth.logout" };
|
|
513
|
+
declare const actor: ViewActor<unknown, AuthEvent>; // your actor, composed with `withView`
|
|
486
514
|
|
|
487
515
|
const catalog = defineCatalog(schema, {
|
|
488
516
|
components: {
|
|
@@ -501,7 +529,9 @@ const registryResult = defineRegistry(catalog, {
|
|
|
501
529
|
Login: ({ on }) => <button onClick={() => on("submit").emit()}>Log in</button>,
|
|
502
530
|
},
|
|
503
531
|
actions: {
|
|
504
|
-
login: async (
|
|
532
|
+
login: async (params) => {
|
|
533
|
+
if (params) actor.send({ type: "auth.login", username: params.username });
|
|
534
|
+
},
|
|
505
535
|
logout: async () => actor.send({ type: "auth.logout" }),
|
|
506
536
|
},
|
|
507
537
|
});
|
|
@@ -548,7 +578,9 @@ function App() {
|
|
|
548
578
|
Login: { template: `<button @click="on('submit').emit()">Log in</button>` },
|
|
549
579
|
},
|
|
550
580
|
actions: {
|
|
551
|
-
login: async (
|
|
581
|
+
login: async (params) => {
|
|
582
|
+
if (params) actor.send({ type: "auth.login", username: params.username });
|
|
583
|
+
},
|
|
552
584
|
logout: async () => actor.send({ type: "auth.logout" }),
|
|
553
585
|
},
|
|
554
586
|
});
|
|
@@ -562,6 +594,10 @@ import { PlayUIProvider, PlayRenderer, defineRegistry } from "@xmachines/play-so
|
|
|
562
594
|
import { defineCatalog } from "@xmachines/json-render-core";
|
|
563
595
|
import { schema } from "@xmachines/play-solid";
|
|
564
596
|
import { z } from "zod";
|
|
597
|
+
import type { ViewActor } from "@xmachines/play-view";
|
|
598
|
+
|
|
599
|
+
type AuthEvent = { type: "auth.login"; username: string } | { type: "auth.logout" };
|
|
600
|
+
declare const actor: ViewActor<unknown, AuthEvent>; // your actor, composed with `withView`
|
|
565
601
|
|
|
566
602
|
const catalog = defineCatalog(schema, {
|
|
567
603
|
components: {
|
|
@@ -580,7 +616,9 @@ const registryResult = defineRegistry(catalog, {
|
|
|
580
616
|
Login: ({ on }) => <button onClick={() => on("submit").emit()}>Log in</button>,
|
|
581
617
|
},
|
|
582
618
|
actions: {
|
|
583
|
-
login: async (
|
|
619
|
+
login: async (params) => {
|
|
620
|
+
if (params) actor.send({ type: "auth.login", username: params.username });
|
|
621
|
+
},
|
|
584
622
|
logout: async () => actor.send({ type: "auth.logout" }),
|
|
585
623
|
},
|
|
586
624
|
});
|
|
@@ -601,6 +639,10 @@ import { createPlayUI, defineRegistry, schema } from "@xmachines/play-dom";
|
|
|
601
639
|
import { defineCatalog } from "@xmachines/json-render-core";
|
|
602
640
|
import { z } from "zod";
|
|
603
641
|
import type { ComponentFn } from "@xmachines/play-dom";
|
|
642
|
+
import type { ViewActor } from "@xmachines/play-view";
|
|
643
|
+
|
|
644
|
+
type AuthEvent = { type: "auth.login"; username: string } | { type: "auth.logout" };
|
|
645
|
+
declare const actor: ViewActor<unknown, AuthEvent>; // your actor, composed with `withView`
|
|
604
646
|
|
|
605
647
|
const catalog = defineCatalog(schema, {
|
|
606
648
|
components: {
|
|
@@ -631,7 +673,9 @@ const Login: ComponentFn<typeof catalog, "Login"> = ({ on }) => {
|
|
|
631
673
|
const registryResult = defineRegistry(catalog, {
|
|
632
674
|
components: { Home, Login },
|
|
633
675
|
actions: {
|
|
634
|
-
login: async (
|
|
676
|
+
login: async (params) => {
|
|
677
|
+
if (params) actor.send({ type: "auth.login", username: params.username });
|
|
678
|
+
},
|
|
635
679
|
logout: async () => actor.send({ type: "auth.logout" }),
|
|
636
680
|
},
|
|
637
681
|
});
|
|
@@ -658,7 +702,7 @@ nothing is needed — the generated transitions assign `event.query` to context
|
|
|
658
702
|
on every navigation. A machine that handles `play.route` by hand must do that
|
|
659
703
|
assignment itself:
|
|
660
704
|
|
|
661
|
-
```typescript
|
|
705
|
+
```typescript fragment
|
|
662
706
|
on: {
|
|
663
707
|
"play.route": {
|
|
664
708
|
actions: assign({
|
|
@@ -669,18 +713,13 @@ on: {
|
|
|
669
713
|
}
|
|
670
714
|
```
|
|
671
715
|
|
|
672
|
-
(Older releases threw `MissingQueryContextError` at construction for a
|
|
673
|
-
routing-aware context without a `query` field. That class is gone: the generated
|
|
674
|
-
`play.route` transitions assign `query` on every navigation, so the loss it
|
|
675
|
-
guarded against cannot happen.)
|
|
676
|
-
|
|
677
716
|
#### Missing `id` on routable states
|
|
678
717
|
|
|
679
718
|
**Error:** `MissingStateIdError: State "home" has meta.route "/" but no id`.
|
|
680
719
|
|
|
681
720
|
**Fix:** Every state with `meta.route` must declare an explicit `id`:
|
|
682
721
|
|
|
683
|
-
```typescript
|
|
722
|
+
```typescript fragment
|
|
684
723
|
// ❌ Missing id
|
|
685
724
|
home: { meta: { route: "/" } }
|
|
686
725
|
|
|
@@ -695,6 +734,12 @@ home: { id: "home", meta: { route: "/" } }
|
|
|
695
734
|
**Fix:** Always call `actor.start()` before `actor.send()`:
|
|
696
735
|
|
|
697
736
|
```typescript
|
|
737
|
+
import { definePlayer } from "@xmachines/play-xstate";
|
|
738
|
+
import type { AnyStateMachine } from "xstate";
|
|
739
|
+
|
|
740
|
+
declare const machine: AnyStateMachine; // your machine
|
|
741
|
+
|
|
742
|
+
const createPlayer = definePlayer({ machine });
|
|
698
743
|
const actor = createPlayer();
|
|
699
744
|
actor.start(); // required before any send()
|
|
700
745
|
actor.send({ type: "toggle" });
|
|
@@ -706,7 +751,7 @@ actor.send({ type: "toggle" });
|
|
|
706
751
|
|
|
707
752
|
**Fix:** Construct stable references outside JSX or memoize them:
|
|
708
753
|
|
|
709
|
-
```typescript
|
|
754
|
+
```typescript fragment
|
|
710
755
|
// ✅ Built outside the component
|
|
711
756
|
const routeTree = extractMachineRoutes(appMachine);
|
|
712
757
|
const routeMap = createRouteMapFromTree(routeTree);
|
|
@@ -751,6 +796,7 @@ node --version
|
|
|
751
796
|
|
|
752
797
|
## Next Steps
|
|
753
798
|
|
|
799
|
+
- **[Views](views.md)** — Which state supplies the view, the `/context` projection, and when a renderer keeps the UI
|
|
754
800
|
- **[Inspecting a Running Actor](inspector.md)** — Attaching the Stately inspector to see the machine, its transitions, and its context live
|
|
755
801
|
- **[Architecture](../contributing/architecture.md)** — System design, layers, invariants, and data flow
|
|
756
802
|
- **[Play RFC](../rfc/play.md)** — Complete architectural specification
|
package/guides/inspector.md
CHANGED
|
@@ -27,7 +27,9 @@ Create an inspector and hand its `inspect` observer to [`definePlayer`](../api/@
|
|
|
27
27
|
```typescript
|
|
28
28
|
import { createBrowserInspector } from "@statelyai/inspect";
|
|
29
29
|
import { definePlayer } from "@xmachines/play-xstate";
|
|
30
|
-
import {
|
|
30
|
+
import type { AnyStateMachine } from "xstate";
|
|
31
|
+
|
|
32
|
+
declare const appMachine: AnyStateMachine; // your machine
|
|
31
33
|
|
|
32
34
|
const { inspect } = createBrowserInspector();
|
|
33
35
|
|
|
@@ -45,6 +47,12 @@ actor.start();
|
|
|
45
47
|
That is the whole integration. [`PlayerOptions.inspect`](../api/@xmachines/play-xstate/index/interfaces/PlayerOptions.md) is forwarded verbatim to XState's `createActor`, so anything XState accepts there is accepted here — a function, or an observer object with a `next` method:
|
|
46
48
|
|
|
47
49
|
```typescript
|
|
50
|
+
import { definePlayer } from "@xmachines/play-xstate";
|
|
51
|
+
import type { AnyStateMachine, InspectionEvent } from "xstate";
|
|
52
|
+
|
|
53
|
+
declare const machine: AnyStateMachine; // your machine
|
|
54
|
+
declare const sink: { write(event: InspectionEvent): void }; // your log
|
|
55
|
+
|
|
48
56
|
// Function form — the common case
|
|
49
57
|
definePlayer({ machine, options: { inspect: (event) => console.log(event.type) } });
|
|
50
58
|
|
|
@@ -61,6 +69,13 @@ Two properties of the attachment point matter in practice.
|
|
|
61
69
|
**It is configured on the factory, not on the instance.** `definePlayer({ machine, options })` returns a factory; `options.inspect` belongs to that configuration, and every actor the factory creates reports to the same observer. The factory's per-call options bag carries `snapshot` for restoring persisted state and nothing else — there is no per-instance `inspect` override. When one factory produces several live actors (multi-user scenarios, SSR, tests), demultiplex the stream by root instead:
|
|
62
70
|
|
|
63
71
|
```typescript
|
|
72
|
+
import { definePlayer } from "@xmachines/play-xstate";
|
|
73
|
+
import type { AnyStateMachine, InspectionEvent } from "xstate";
|
|
74
|
+
|
|
75
|
+
declare const machine: AnyStateMachine; // your machine
|
|
76
|
+
|
|
77
|
+
const inspect = (event: InspectionEvent) => console.log(event.type);
|
|
78
|
+
|
|
64
79
|
const createPlayer = definePlayer({ machine, options: { inspect } });
|
|
65
80
|
|
|
66
81
|
const alice = createPlayer({ userId: "alice" });
|
|
@@ -87,7 +102,7 @@ The event types are XState's: `@xstate.actor` when an actor registers, `@xstate.
|
|
|
87
102
|
|
|
88
103
|
`@xstate.actor` fires from _inside_ the actor's constructor. The `actorRef` it carries is a real `PlayerActor`, but a mid-construction one: `state`, `currentRoute`, `currentView` and `initialRoute` do not exist yet, and reading them there throws — XState itself refuses to read a snapshot in that window.
|
|
89
104
|
|
|
90
|
-
```typescript
|
|
105
|
+
```typescript fragment
|
|
91
106
|
const inspect = (event: InspectionEvent) => {
|
|
92
107
|
if (event.type === "@xstate.actor") {
|
|
93
108
|
// ❌ throws — the atoms are not assigned yet
|
|
@@ -109,11 +124,17 @@ Capture the reference during construction if you need it, and read the atoms fro
|
|
|
109
124
|
An inspector that is only created when the user asks for it — a dev-tools toggle, a keyboard shortcut, a debug panel button — cannot be passed to `definePlayer`, which ran at module scope long before the click. Pass a forwarding function instead, so the attachment point is fixed at factory time while the destination stays swappable:
|
|
110
125
|
|
|
111
126
|
```typescript
|
|
112
|
-
|
|
127
|
+
import { createBrowserInspector } from "@statelyai/inspect";
|
|
128
|
+
import { definePlayer } from "@xmachines/play-xstate";
|
|
129
|
+
import type { AnyStateMachine, InspectionEvent, Observer } from "xstate";
|
|
130
|
+
|
|
131
|
+
declare const appMachine: AnyStateMachine; // your machine
|
|
132
|
+
|
|
133
|
+
let current: Observer<InspectionEvent> | undefined;
|
|
113
134
|
|
|
114
135
|
const createPlayer = definePlayer({
|
|
115
136
|
machine: appMachine,
|
|
116
|
-
options: { inspect: (event) => current?.(event) },
|
|
137
|
+
options: { inspect: (event) => current?.next?.(event) },
|
|
117
138
|
});
|
|
118
139
|
|
|
119
140
|
// Later, from a click handler
|
|
@@ -135,6 +156,10 @@ There is a catch worth knowing before you ship it: events that arrive while `cur
|
|
|
135
156
|
|
|
136
157
|
```typescript
|
|
137
158
|
import { createWebSocketInspector } from "@statelyai/inspect";
|
|
159
|
+
import { definePlayer } from "@xmachines/play-xstate";
|
|
160
|
+
import type { AnyStateMachine } from "xstate";
|
|
161
|
+
|
|
162
|
+
declare const appMachine: AnyStateMachine; // your machine
|
|
138
163
|
|
|
139
164
|
const { inspect } = createWebSocketInspector({ url: "ws://localhost:8080" });
|
|
140
165
|
|
|
@@ -155,22 +180,49 @@ pnpm --filter @xmachines/play-react-demo run dev
|
|
|
155
180
|
|
|
156
181
|
Click **Show Inspector** in the debug panel at the bottom of the page. The inspector opens in its own window with the machine already drawn and the session's history replayed, and it keeps updating as you log in, navigate, and log out.
|
|
157
182
|
|
|
158
|
-
The demos share one controller, `createDemoInspector()
|
|
183
|
+
The demos share one controller, `createDemoInspector()`, which each demo passes straight through to `definePlayer`. The controller lives in a private package of this repository, so you cannot install it. The block below shows the same wiring with the public API. It keeps each event from the creation of the actor, and it replays the events when the user opens the inspector:
|
|
159
184
|
|
|
160
185
|
```typescript
|
|
161
|
-
|
|
186
|
+
import { createBrowserInspector } from "@statelyai/inspect";
|
|
187
|
+
import { definePlayer } from "@xmachines/play-xstate";
|
|
188
|
+
import type { AnyStateMachine, InspectionEvent, Observer } from "xstate";
|
|
189
|
+
|
|
190
|
+
declare const appMachine: AnyStateMachine; // your machine
|
|
191
|
+
|
|
192
|
+
const buffer: InspectionEvent[] = [];
|
|
193
|
+
let current: Observer<InspectionEvent> | undefined;
|
|
162
194
|
|
|
163
195
|
const actor = definePlayer({
|
|
164
|
-
machine:
|
|
165
|
-
options: {
|
|
196
|
+
machine: appMachine,
|
|
197
|
+
options: {
|
|
198
|
+
inspect: (event) => {
|
|
199
|
+
if (current) {
|
|
200
|
+
current.next?.(event);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
// Keep the last 500 events while nobody opens the inspector. A long session drops
|
|
204
|
+
// its oldest events, also the registration of the root actor, and the inspector
|
|
205
|
+
// then has no machine to draw. The demo controller pins each registration for
|
|
206
|
+
// that reason, and it costs more code.
|
|
207
|
+
buffer.push(event);
|
|
208
|
+
if (buffer.length > 500) buffer.shift();
|
|
209
|
+
},
|
|
210
|
+
},
|
|
166
211
|
})();
|
|
167
212
|
actor.start();
|
|
168
213
|
|
|
169
|
-
// The debug panel
|
|
170
|
-
|
|
214
|
+
// The click handler of the "Show Inspector" button of the debug panel
|
|
215
|
+
export function showInspector() {
|
|
216
|
+
if (current) return;
|
|
217
|
+
// The inspector holds these events until its window connects, and it drops the oldest
|
|
218
|
+
// past `maxDeferredEvents`. The limit leaves room for the events of the handshake, so
|
|
219
|
+
// the inspector keeps every event of the replay.
|
|
220
|
+
current = createBrowserInspector({ maxDeferredEvents: 1000 }).inspect;
|
|
221
|
+
for (const event of buffer.splice(0)) current.next?.(event);
|
|
222
|
+
}
|
|
171
223
|
```
|
|
172
224
|
|
|
173
|
-
The controller answers the late-opening problem from the previous section: it buffers serialized events from actor creation, pins the registration of every live root so it can never roll out of the bounded buffer, and flushes those buffers when the inspector window completes its handshake. Several machines can be alive together — one for each document a host has open — and the handshake replays each of them. That is a demo trade-off rather than a general recommendation — every transition pays serialization whether or not anyone ever opens the inspector — but it is what makes the button work at any point in a session. The shared package's own README, at `packages/play-actor/examples/shared/README.md` in this repository, documents the design in full.
|
|
225
|
+
The demo controller answers the late-opening problem from the previous section: it buffers serialized events from actor creation, pins the registration of every live root so it can never roll out of the bounded buffer, and flushes those buffers when the inspector window completes its handshake. Several machines can be alive together — one for each document a host has open — and the handshake replays each of them. That is a demo trade-off rather than a general recommendation — every transition pays serialization whether or not anyone ever opens the inspector — but it is what makes the button work at any point in a session. The shared package's own README, at `packages/play-actor/examples/shared/README.md` in this repository, documents the design in full.
|
|
174
226
|
|
|
175
227
|
---
|
|
176
228
|
|
|
@@ -179,6 +231,14 @@ The controller answers the late-opening problem from the previous section: it bu
|
|
|
179
231
|
**Cost.** Inspection serializes events. A `console.log` observer is cheap; a browser inspector posting every transition, and any buffering scheme layered on top, is not. Gate the inspector behind a development-only branch, and prefer letting the bundler drop it entirely:
|
|
180
232
|
|
|
181
233
|
```typescript
|
|
234
|
+
/// <reference types="vite/client" />
|
|
235
|
+
import { createBrowserInspector } from "@statelyai/inspect";
|
|
236
|
+
import { definePlayer } from "@xmachines/play-xstate";
|
|
237
|
+
import type { AnyStateMachine } from "xstate";
|
|
238
|
+
|
|
239
|
+
declare const appMachine: AnyStateMachine; // your machine
|
|
240
|
+
|
|
241
|
+
// `import.meta.env.DEV` is the development flag of Vite
|
|
182
242
|
const options = import.meta.env.DEV ? { inspect: createBrowserInspector().inspect } : {};
|
|
183
243
|
|
|
184
244
|
const createPlayer = definePlayer({ machine: appMachine, options });
|
|
@@ -192,6 +252,6 @@ const createPlayer = definePlayer({ machine: appMachine, options });
|
|
|
192
252
|
|
|
193
253
|
- **[`PlayerOptions`](../api/@xmachines/play-xstate/index/interfaces/PlayerOptions.md)** — the full options bag, `inspect` included
|
|
194
254
|
- **[`PlayerActor`](../api/@xmachines/play-xstate/index/classes/PlayerActor.md)** — the actor an inspector observes
|
|
195
|
-
- **[
|
|
255
|
+
- **[The Actor Model](actor-model.md)** — why the actor is the actor, and what that buys
|
|
196
256
|
- **[Getting Started](getting-started.md)** — installing packages and creating your first actor
|
|
197
257
|
- **[Stately inspect docs](https://stately.ai/docs/inspector)** — the inspector itself, its transports and options
|
package/guides/routing.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Routing in XMachines
|
|
2
2
|
|
|
3
3
|
A route of XMachines is a fact about a STATE, and not a fact about a component tree. A state node declares `meta.route`, and the library carries that declaration in both directions: a URL becomes a state, and a state becomes a URL.
|
|
4
4
|
|
|
5
|
-
This guide states the pattern language one time, and it names the three rules that every one of the nine router adapters follows.
|
|
5
|
+
This guide states the pattern language one time, it tells when a navigation re-enters a state, and it names the three rules that every one of the nine router adapters follows.
|
|
6
6
|
|
|
7
7
|
After you read it, you know which patterns a route can declare, which side resolves a location, and why a bridge comes in a `connect()` and `disconnect()` pair.
|
|
8
8
|
|
|
@@ -19,13 +19,13 @@ 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
|
-
|
|
22
|
+
[`@xmachines/play-atom`](../api/@xmachines/play-atom/README.md) makes the same decision for reactivity: one primitive, isolated behind one module, present on every runtime. The [Atoms](atoms.md) guide describes it.
|
|
23
23
|
|
|
24
24
|
### The API is always present
|
|
25
25
|
|
|
26
|
-
[`@xmachines/play-
|
|
26
|
+
[`@xmachines/play-url`](../api/@xmachines/play-url/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
|
-
The native API arrived in Chrome 95, in Firefox 142 and in Safari 26. The browser floor of
|
|
28
|
+
The native API arrived in Chrome 95, in Firefox 142 and in Safari 26. The browser floor of XMachines 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. The test suite of [`@xmachines/play-url`](../api/@xmachines/play-url/README.md) 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
|
|
|
30
30
|
The cost is 18 kB, minified and with no dependency of its own, and a consumer whose runtime has the native API pays it too. A conditional load would save those bytes and it would make the module asynchronous: `RouteMap` compiles in its constructor, and a navigation matches inside an event handler. Neither can await.
|
|
31
31
|
|
|
@@ -55,8 +55,11 @@ A **modifier** follows a param, a wildcard or a group:
|
|
|
55
55
|
| `*` | zero or more | matches |
|
|
56
56
|
|
|
57
57
|
```ts
|
|
58
|
+
import { createMachine } from "xstate";
|
|
59
|
+
|
|
58
60
|
const machine = createMachine({
|
|
59
61
|
id: "app",
|
|
62
|
+
initial: "home",
|
|
60
63
|
states: {
|
|
61
64
|
home: { meta: { route: "/" } },
|
|
62
65
|
profile: { meta: { route: "/profile/:userId" } },
|
|
@@ -116,12 +119,6 @@ The build resolves every escape, so the derived path carries the character and n
|
|
|
116
119
|
backslash that protects it. `/tags/c\+\+` derives `/tags/c++`, which is the path that the
|
|
117
120
|
route matches.
|
|
118
121
|
|
|
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.
|
|
124
|
-
|
|
125
122
|
### A literal that the grammar would read
|
|
126
123
|
|
|
127
124
|
`:`, `+`, `?`, `(` and `{` are characters of the grammar, so a route that writes one of them raw does not mean the literal. The two halves fail differently.
|
|
@@ -148,25 +145,7 @@ This rule is about the PATTERN that a state declares. A param VALUE needs no esc
|
|
|
148
145
|
|
|
149
146
|
`encodeURIComponent` leaves `*` as it stands, and that is the one exception. A bridge refuses a path that still holds a `:` or a `*`, because such a character marks a param that nothing substituted. A value of `a*b` therefore stops the push, and the URL stays where it is.
|
|
150
147
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
A route that carries a QUERY STRING is the same case, and it is the form a machine writes most often. `meta: { route: "/dates?trip=one-way" }` reached the exact-match map before, and the bridge pushed it to the address bar with its query. The grammar reads that `?` as a modifier that follows no part, so `RouteMap` throws `InvalidRoutePatternError` in its constructor now and the application starts never. A route declares a PATHNAME: put the default in `context.query`, which the generated `play.route` transition assigns and `buildRouteUrl` writes to the URL.
|
|
154
|
-
|
|
155
|
-
### Upgrading from 3.x: the `reenter` default changed
|
|
156
|
-
|
|
157
|
-
An earlier release wrote `reenter: true` on every transition that `formatPlayRouteTransitions` generated, so every routed state re-entered its own domain on each navigation and ran its `entry` actions again. The flag now comes from `meta.route`, and the default is `false`, which is the default of XState.
|
|
158
|
-
|
|
159
|
-
**Nothing throws, and the `entry` action simply stops running.** A state that needs it declares the flag for itself:
|
|
160
|
-
|
|
161
|
-
```ts
|
|
162
|
-
states: {
|
|
163
|
-
dashboard: { meta: { route: { path: "/dashboard", reenter: true } } },
|
|
164
|
-
},
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
`reenter` spares the DOMAIN of the transition and not every ancestor that stays active. Under the default `handler: "root"` the domain is the root of the machine, so `false` spares the root alone and each ancestor between the root and the target still runs its `exit` and `entry` actions. `handler: "local"` and `handler: "both"` move the domain down to the parent, which is the field that spares those intermediate ancestors.
|
|
168
|
-
|
|
169
|
-
CAUTION: `"local"` also SCOPES the route. The generated transition then sits on the parent alone, so a `play.route` event that arrives while the parent is inactive matches nothing and the actor does not move — a deep link or a press on BACK therefore leaves the URL and the actor divergent. Choose `"local"` where that scope is the intent, such as a step that a person reaches only inside its wizard. Choose `"both"` where the state must stay reachable from everywhere.
|
|
148
|
+
A route that carries a QUERY STRING is the same case as a raw `?`, and it is the form a machine writes most often. The grammar reads the `?` of `meta: { route: "/dates?trip=one-way" }` as a modifier that follows no part, so `RouteMap` throws `InvalidRoutePatternError` in its constructor and the application starts never. A route declares a PATHNAME: put the default in `context.query`, which the generated `play.route` transition assigns and `buildRouteUrl` writes to the URL.
|
|
170
149
|
|
|
171
150
|
### The prefix rule
|
|
172
151
|
|
|
@@ -196,6 +175,28 @@ The cost is that you cannot write URLPattern's own reading of `:cat-id`. Use `:c
|
|
|
196
175
|
|
|
197
176
|
---
|
|
198
177
|
|
|
178
|
+
## Re-entry on a navigation
|
|
179
|
+
|
|
180
|
+
`formatPlayRouteTransitions` reads the `reenter` flag of each transition from `meta.route`. The default is `false`, which is the default of XState.
|
|
181
|
+
|
|
182
|
+
The flag decides one thing: whether the DOMAIN of the transition runs its `exit` and `entry` actions again. Under the default `handler: "root"` the domain is the root of the machine. `"local"` and `"both"` put a transition on the parent, and while the parent is active that transition answers the event, so the domain is the parent.
|
|
183
|
+
|
|
184
|
+
Each state below the domain on the path to the target runs its `exit` and `entry` actions on each navigation, whatever the flag says. The target itself is one of them, unless the route targets the root of the machine: the root is then the domain, and the flag decides. Under `"root"`, `false` therefore spares the root alone, and each ancestor between the root and the target runs its actions again. `handler` is the field that spares those intermediate ancestors.
|
|
185
|
+
|
|
186
|
+
CAUTION: a parallel state loses the position of its other regions when it is the domain or a state below the domain. XState exits each active state below the domain, and not only the states on the path to the target. Each other region therefore enters its `initial` state again. A parallel root under `handler: "root"` is such a domain. With `reenter: true`, a `"local"` or `"both"` transition also exits the parent. Where the parent is a region of a parallel state, the other regions of that state enter their `initial` state again too.
|
|
187
|
+
|
|
188
|
+
A state whose navigation must re-enter the domain too declares the flag for itself. Here the root runs its `exit` and `entry` actions on each navigation to `dashboard`:
|
|
189
|
+
|
|
190
|
+
```ts fragment
|
|
191
|
+
states: {
|
|
192
|
+
dashboard: { meta: { route: { path: "/dashboard", reenter: true } } },
|
|
193
|
+
},
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
CAUTION: `"local"` also SCOPES the route. The generated transition then sits on the parent alone, so a `play.route` event that arrives while the parent is inactive matches nothing and the actor does not move — a deep link or a press on BACK therefore leaves the URL and the actor divergent. Choose `"local"` where that scope is the intent, such as a step that a person reaches only inside its wizard. Choose `"both"` where the state must stay reachable from everywhere.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
199
200
|
## The routing invariants
|
|
200
201
|
|
|
201
202
|
### 1. XMachines resolves the state id. The router never does
|
|
@@ -234,31 +235,29 @@ A bridge installs an atom subscription on the actor and a subscription on the ro
|
|
|
234
235
|
|
|
235
236
|
---
|
|
236
237
|
|
|
237
|
-
## Why not a matcher
|
|
238
|
-
|
|
239
|
-
The 2.2.0 review asked whether a hand-written segment matcher could drop the `URLPattern` requirement. The answer is no, and the reason is not the size of the code.
|
|
238
|
+
## Why not a smaller matcher
|
|
240
239
|
|
|
241
|
-
A
|
|
240
|
+
A matcher that reads only a literal and `:name` covers most routes. It carries fewer features than the routers that XMachines supports, which is the problem that [the first section](#what-problem-urlpattern-solves) describes.
|
|
242
241
|
|
|
243
|
-
|
|
242
|
+
One engine also keeps the match and the params in agreement. With two matchers, a route could resolve while its params came back empty.
|
|
244
243
|
|
|
245
244
|
---
|
|
246
245
|
|
|
247
246
|
## Summary
|
|
248
247
|
|
|
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-
|
|
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
|
|
248
|
+
| Question | Answer |
|
|
249
|
+
| ----------------------------------------- | ----------------------------------------------------------------------------- |
|
|
250
|
+
| What is the pattern language? | The `URLPattern` pathname grammar, plus hyphenated param names |
|
|
251
|
+
| Do I install a polyfill? | No. [`@xmachines/play-url`](../api/@xmachines/play-url/README.md) carries one |
|
|
252
|
+
| Which side turns a URL into a state? | XMachines, in every adapter |
|
|
253
|
+
| Which side turns a state into a URL? | XMachines, with no URLPattern at all |
|
|
254
|
+
| When does the framework parse the params? | Vue Router and SolidJS Router, when the parse covers every name |
|
|
255
|
+
| Who releases the bridge? | You, through `disconnect()` in the teardown of your component |
|
|
257
256
|
|
|
258
257
|
## See also
|
|
259
258
|
|
|
260
|
-
- [
|
|
261
|
-
- [
|
|
259
|
+
- [State Machines](state-machines.md) — how `meta.route` reaches the route map
|
|
260
|
+
- [Atoms](atoms.md) — the same decision, made for reactivity
|
|
262
261
|
- [Multi-router integration](../examples/multi-router-integration.md) — the provider pattern and `basePath`, end to end
|
|
263
262
|
- [Routing patterns](../examples/routing-patterns.md) — worked route maps
|
|
264
263
|
- [@xmachines/play-router](../api/@xmachines/play-router/README.md) — API reference
|