@xmachines/docs 3.0.0 → 4.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 +8 -16
- package/api/@xmachines/play/README.md +11 -100
- package/api/@xmachines/play/errors/README.md +8 -0
- package/api/@xmachines/play/{classes → errors/classes}/NonNullableError.md +6 -6
- package/api/@xmachines/play/{classes → errors/classes}/PlayError.md +35 -10
- package/api/@xmachines/play/index/README.md +75 -0
- package/api/@xmachines/play/{functions → index/functions}/asCleanup.md +2 -2
- package/api/@xmachines/play/{functions → index/functions}/assertNonNullable.md +2 -2
- package/api/@xmachines/{play-actor → play/index}/functions/shallowEqualExcept.md +3 -3
- package/api/@xmachines/play/{type-aliases → index/type-aliases}/Cleanup.md +3 -3
- package/api/@xmachines/play/{type-aliases → index/type-aliases}/DisposeKey.md +2 -2
- package/api/@xmachines/play/{type-aliases → index/type-aliases}/PlayEvent.md +4 -4
- package/api/@xmachines/play/{variables → index/variables}/DISPOSE.md +2 -2
- package/api/@xmachines/play-actor/README.md +78 -229
- package/api/@xmachines/play-actor/interfaces/ActorEvent.md +18 -0
- package/api/@xmachines/play-actor/interfaces/PlayActor.md +73 -0
- package/api/@xmachines/play-dom/README.md +28 -40
- package/api/@xmachines/play-dom/classes/PlayRenderer.md +12 -11
- package/api/@xmachines/play-dom/functions/asCleanup.md +78 -0
- package/api/@xmachines/play-dom/functions/createPlayUI.md +4 -4
- 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 +2 -2
- package/api/@xmachines/play-dom/type-aliases/MountFn.md +29 -12
- package/api/@xmachines/play-dom-router/README.md +70 -70
- package/api/@xmachines/play-dom-router/classes/DomRouterBridge.md +22 -21
- package/api/@xmachines/{play-vue-router → play-dom-router}/classes/RouteMap.md +12 -6
- package/api/@xmachines/play-dom-router/functions/asCleanup.md +78 -0
- package/api/@xmachines/play-dom-router/functions/connectRouter.md +3 -8
- package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +9 -3
- package/api/@xmachines/play-dom-router/functions/createRouter.md +8 -14
- package/api/@xmachines/play-dom-router/interfaces/BasePathOptions.md +5 -5
- package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +70 -26
- 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 +9 -14
- package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +24 -21
- 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 +8 -8
- package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +36 -23
- package/api/@xmachines/play-dom-router/type-aliases/Cleanup.md +2 -2
- package/api/@xmachines/play-dom-router/variables/DISPOSE.md +2 -2
- package/api/@xmachines/play-react/README.md +17 -39
- package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +14 -10
- package/api/@xmachines/play-react/functions/useActor.md +1 -1
- package/api/@xmachines/play-react/functions/usePlayView.md +1 -1
- package/api/@xmachines/play-react/functions/useSignalEffect.md +1 -1
- package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +11 -11
- 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/ViewContextValue.md +8 -8
- package/api/@xmachines/play-react/type-aliases/AnyPlayActor.md +11 -3
- package/api/@xmachines/play-react/variables/ActorProvider.md +1 -1
- 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/variables/schema.md +52 -0
- package/api/@xmachines/play-react-router/README.md +22 -50
- package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +17 -16
- package/api/@xmachines/play-react-router/classes/RouteMap.md +11 -5
- package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +11 -8
- package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +16 -9
- package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +9 -14
- package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +10 -10
- package/api/@xmachines/play-react-router/interfaces/RoutableActor.md +72 -0
- 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 +17 -7
- package/api/@xmachines/play-react-router/type-aliases/PlayRouterProviderBaseProps.md +5 -5
- package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +4 -4
- package/api/@xmachines/play-router/README.md +104 -196
- package/api/@xmachines/play-router/errors/README.md +15 -0
- package/api/@xmachines/play-router/errors/classes/DuplicateBridgeError.md +191 -0
- package/api/@xmachines/play-router/errors/classes/DuplicateRoutePathError.md +175 -0
- package/api/@xmachines/play-router/errors/classes/EmptyRoutePathError.md +175 -0
- package/api/@xmachines/play-router/errors/classes/InvalidBasePathError.md +200 -0
- package/api/@xmachines/play-router/errors/classes/InvalidRoutePatternError.md +203 -0
- package/api/@xmachines/play-router/errors/classes/InvalidStateIdError.md +175 -0
- package/api/@xmachines/play-router/errors/classes/MissingBasePathParamError.md +199 -0
- package/api/@xmachines/play-router/errors/classes/RouterSyncError.md +192 -0
- package/api/@xmachines/play-router/errors/classes/UnknownStateTypeError.md +182 -0
- package/api/@xmachines/play-router/index/README.md +75 -0
- package/api/@xmachines/play-router/{classes → index/classes}/RouteMap.md +12 -6
- package/api/@xmachines/play-router/{classes → index/classes}/RouterBridgeBase.md +19 -17
- package/api/@xmachines/play-router/{functions → index/functions}/buildPlayRouteEvent.md +2 -2
- package/api/@xmachines/play-router/{functions → index/functions}/buildRouteTree.md +14 -4
- package/api/@xmachines/play-router/{functions → index/functions}/cleanFrameworkParams.md +3 -4
- package/api/@xmachines/play-router/{functions → index/functions}/createRouteMapFromTree.md +13 -6
- package/api/@xmachines/play-router/{functions → index/functions}/createRouterConnection.md +2 -2
- package/api/@xmachines/play-router/{functions → index/functions}/detectDuplicateRoutes.md +2 -2
- package/api/@xmachines/play-router/{functions → index/functions}/extractQuery.md +2 -2
- package/api/@xmachines/play-router/{functions → index/functions}/extractRouteParams.md +3 -3
- package/api/@xmachines/play-router/{functions → index/functions}/findRouteById.md +2 -2
- package/api/@xmachines/play-router/{functions → index/functions}/findRouteByPath.md +2 -2
- package/api/@xmachines/play-router/index/functions/getPatternParamNames.md +29 -0
- package/api/@xmachines/play-router/index/functions/getRequiredPatternParamNames.md +39 -0
- package/api/@xmachines/play-router/{functions → index/functions}/isMountableBridge.md +2 -2
- package/api/@xmachines/play-router/index/functions/joinBasePath.md +37 -0
- package/api/@xmachines/play-router/{functions → index/functions}/mountKey.md +2 -2
- package/api/@xmachines/play-router/index/functions/normalizeBasePath.md +43 -0
- package/api/@xmachines/play-router/{functions → index/functions}/openProviderBridge.md +14 -14
- package/api/@xmachines/play-router/index/functions/pickOwnParams.md +41 -0
- package/api/@xmachines/play-router/{functions → index/functions}/repointProviderBridge.md +2 -2
- package/api/@xmachines/play-router/index/functions/resolveBasePath.md +51 -0
- package/api/@xmachines/play-router/{functions → index/functions}/resolveFrameworkParams.md +11 -13
- package/api/@xmachines/play-router/{functions → index/functions}/sanitizePathname.md +2 -2
- package/api/@xmachines/play-router/index/functions/stripBasePath.md +44 -0
- package/api/@xmachines/play-router/{functions → index/functions}/validateRouteFormat.md +2 -2
- package/api/@xmachines/play-router/{functions → index/functions}/validateStateExists.md +2 -2
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/BasePathOptions.md +6 -6
- package/api/@xmachines/play-router/index/interfaces/BuildPlayRouteEventOptions.md +13 -0
- package/api/@xmachines/play-router/index/interfaces/FrameworkParamsSource.md +47 -0
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/LocationLike.md +6 -6
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/MountableRouterBridge.md +9 -9
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/OpenProviderBridgeArgs.md +13 -13
- package/api/@xmachines/play-router/index/interfaces/PlayRouteEvent.md +130 -0
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/PlayRouterProviderBaseProps.md +15 -15
- package/api/@xmachines/play-router/index/interfaces/ResolvedBasePath.md +14 -0
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/ResolvedRoutePath.md +6 -6
- package/api/@xmachines/play-router/index/interfaces/Routable.md +26 -0
- package/api/@xmachines/play-router/index/interfaces/RoutableActor.md +72 -0
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteInfo.md +11 -11
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteMapOptions.md +5 -5
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteMapping.md +6 -6
- package/api/@xmachines/play-router/index/interfaces/RouteMatch.md +12 -0
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteNode.md +13 -13
- package/api/@xmachines/play-router/index/interfaces/RouteObject.md +34 -0
- package/api/@xmachines/play-router/index/interfaces/RouteTree.md +27 -0
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteWatcherHandle.md +7 -7
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouterBridge.md +5 -5
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouterConnection.md +10 -10
- package/api/@xmachines/play-router/{interfaces → index/interfaces}/WindowLike.md +4 -4
- package/api/@xmachines/play-router/index/type-aliases/PlayRouterBridgeConstructor.md +46 -0
- package/api/@xmachines/play-router/index/type-aliases/RouteData.md +12 -0
- package/api/@xmachines/play-router/index/type-aliases/RouteDataResolver.md +31 -0
- package/api/@xmachines/play-router/index/type-aliases/RouteMetadata.md +11 -0
- package/api/@xmachines/{play-xstate → play-router/index}/variables/DISPOSE.md +3 -3
- package/api/@xmachines/play-router/index/variables/NO_BASE_PATH.md +18 -0
- package/api/@xmachines/play-router/index/variables/ROOT_NODE_ID.md +18 -0
- package/api/@xmachines/play-router/xstate/README.md +53 -0
- package/api/@xmachines/play-router/{functions → xstate/functions}/createRouteMap.md +8 -6
- package/api/@xmachines/play-router/{functions → xstate/functions}/extractMachineRoutes.md +4 -4
- package/api/@xmachines/play-router/xstate/functions/getNavigableRoutes.md +35 -0
- package/api/@xmachines/play-router/{functions → xstate/functions}/getRoutableRoutes.md +6 -6
- package/api/@xmachines/play-router/{functions → xstate/functions}/getRouteMappings.md +7 -7
- package/api/@xmachines/play-router/{functions → xstate/functions}/getTransitionReachableRoutes.md +2 -2
- package/api/@xmachines/play-router/{functions → xstate/functions}/isRouteReachable.md +2 -2
- package/api/@xmachines/play-router/{functions → xstate/functions}/machineToGraph.md +2 -2
- package/api/@xmachines/play-router/xstate/functions/routeExists.md +26 -0
- package/api/@xmachines/play-router/xstate/interfaces/MachineEdgeData.md +15 -0
- package/api/@xmachines/play-router/xstate/interfaces/MachineNodeData.md +17 -0
- package/api/@xmachines/play-router/{type-aliases → xstate/type-aliases}/MachineGraph.md +2 -2
- package/api/@xmachines/play-signals/README.md +2 -24
- package/api/@xmachines/play-signals/functions/watchSignal.md +1 -1
- package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +2 -2
- package/api/@xmachines/play-signals/interfaces/SignalComputed.md +2 -2
- package/api/@xmachines/play-signals/interfaces/SignalOptions.md +2 -2
- package/api/@xmachines/play-signals/interfaces/SignalState.md +3 -3
- package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +4 -4
- package/api/@xmachines/play-signals/type-aliases/Cleanup.md +2 -2
- package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +1 -1
- package/api/@xmachines/play-solid/README.md +14 -31
- 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 +11 -11
- package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +13 -13
- package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +8 -8
- package/api/@xmachines/play-solid/type-aliases/AnyPlayActor.md +11 -3
- package/api/@xmachines/play-solid/variables/ActorContext.md +1 -1
- package/api/@xmachines/play-solid/variables/ActorProvider.md +1 -1
- 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 +71 -0
- package/api/@xmachines/play-solid-router/README.md +31 -52
- package/api/@xmachines/play-solid-router/classes/RouteMap.md +11 -5
- package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +30 -53
- package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +9 -8
- package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +38 -35
- package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +9 -14
- package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +12 -12
- package/api/@xmachines/play-solid-router/interfaces/RoutableActor.md +72 -0
- package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +4 -4
- package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +5 -5
- package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +3 -3
- package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +17 -7
- package/api/@xmachines/play-solid-router/type-aliases/PlayRouterProviderBaseProps.md +5 -5
- package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
- package/api/@xmachines/play-solid-router/variables/PlayRouterProvider.md +4 -4
- package/api/@xmachines/play-svelte/README.md +11 -26
- 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 +12 -12
- package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +4 -4
- package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +14 -14
- package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +8 -8
- package/api/@xmachines/play-svelte/type-aliases/AnyPlayActor.md +11 -3
- package/api/@xmachines/play-svelte/variables/schema.md +16 -0
- package/api/@xmachines/play-svelte-spa-router/README.md +22 -41
- package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +11 -5
- package/api/@xmachines/play-svelte-spa-router/classes/SvelteSpaRouterBridge.md +22 -21
- package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +3 -2
- package/api/@xmachines/play-svelte-spa-router/interfaces/BasePathOptions.md +5 -5
- package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +8 -8
- package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +9 -14
- package/api/@xmachines/play-svelte-spa-router/interfaces/RoutableActor.md +72 -0
- 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 +8 -8
- package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
- package/api/@xmachines/play-sveltekit-router/README.md +17 -35
- package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +11 -5
- package/api/@xmachines/play-sveltekit-router/classes/SvelteKitRouterBridge.md +22 -21
- package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +3 -2
- package/api/@xmachines/play-sveltekit-router/interfaces/BasePathOptions.md +5 -5
- package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +8 -8
- package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +3 -3
- package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +9 -14
- package/api/@xmachines/play-sveltekit-router/interfaces/RoutableActor.md +72 -0
- 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 +8 -8
- package/api/@xmachines/play-tanstack-react-router/README.md +19 -43
- package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +11 -5
- package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +18 -17
- package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +11 -8
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +16 -9
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +9 -14
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +10 -10
- package/api/@xmachines/play-tanstack-react-router/interfaces/RoutableActor.md +72 -0
- 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 +17 -7
- package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterProviderBaseProps.md +5 -5
- 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 +4 -4
- package/api/@xmachines/play-tanstack-router/README.md +6 -4
- package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +17 -20
- 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 +26 -52
- package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +11 -5
- package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +49 -45
- package/api/@xmachines/play-tanstack-solid-router/functions/createPlayRouterProvider.md +9 -8
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +9 -14
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +10 -10
- package/api/@xmachines/play-tanstack-solid-router/interfaces/RoutableActor.md +72 -0
- 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 +17 -7
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterProviderBaseProps.md +5 -5
- 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 +4 -4
- package/api/@xmachines/play-url/README.md +69 -0
- package/api/@xmachines/play-url/errors/README.md +17 -0
- package/api/@xmachines/play-url/errors/classes/InvalidBasePathError.md +200 -0
- package/api/@xmachines/play-url/errors/classes/InvalidRoutePatternError.md +203 -0
- package/api/@xmachines/play-url/errors/classes/MissingBasePathParamError.md +199 -0
- package/api/@xmachines/play-url/index/README.md +65 -0
- package/api/@xmachines/play-url/index/functions/cleanFrameworkParams.md +39 -0
- package/api/@xmachines/play-url/index/functions/getCandidates.md +29 -0
- package/api/@xmachines/play-url/index/functions/getCompiledPattern.md +31 -0
- package/api/@xmachines/play-url/index/functions/getIndexKey.md +30 -0
- package/api/@xmachines/play-url/index/functions/getNormalizedParamNameMap.md +32 -0
- package/api/@xmachines/play-url/index/functions/getPatternParamNames.md +29 -0
- package/api/@xmachines/play-url/index/functions/getRequiredPatternParamNames.md +39 -0
- package/api/@xmachines/play-url/index/functions/holdsUnsubstitutedParam.md +36 -0
- package/api/@xmachines/play-url/index/functions/isParameterizedPattern.md +36 -0
- package/api/@xmachines/{play-router → play-url/index}/functions/joinBasePath.md +2 -2
- package/api/@xmachines/{play-router → play-url/index}/functions/normalizeBasePath.md +2 -2
- package/api/@xmachines/play-url/index/functions/normalizeParamNames.md +36 -0
- package/api/@xmachines/play-url/index/functions/parsePattern.md +27 -0
- package/api/@xmachines/{play-router → play-url/index}/functions/pickOwnParams.md +4 -4
- package/api/@xmachines/{play-router → play-url/index}/functions/resolveBasePath.md +2 -2
- package/api/@xmachines/play-url/index/functions/resolveFrameworkParams.md +49 -0
- package/api/@xmachines/{play-router → play-url/index}/functions/stripBasePath.md +2 -2
- package/api/@xmachines/play-url/index/interfaces/BasePathOptions.md +28 -0
- package/api/@xmachines/{play-router → play-url/index}/interfaces/FrameworkParamsSource.md +9 -9
- package/api/@xmachines/play-url/index/interfaces/GroupPart.md +15 -0
- package/api/@xmachines/play-url/index/interfaces/LiteralPart.md +14 -0
- package/api/@xmachines/play-url/index/interfaces/ParamPart.md +21 -0
- package/api/@xmachines/play-url/index/interfaces/ParsedPattern.md +23 -0
- package/api/@xmachines/play-url/index/interfaces/PatternParam.md +15 -0
- package/api/@xmachines/{play-router → play-url/index}/interfaces/ResolvedBasePath.md +6 -6
- package/api/@xmachines/play-url/index/type-aliases/PatternModifier.md +11 -0
- package/api/@xmachines/play-url/index/type-aliases/PatternPart.md +9 -0
- package/api/@xmachines/play-url/index/type-aliases/URLPatternCtor.md +22 -0
- package/api/@xmachines/play-url/index/type-aliases/URLPatternLike.md +68 -0
- package/api/@xmachines/{play-router → play-url/index}/variables/NO_BASE_PATH.md +2 -2
- package/api/@xmachines/play-url/index/variables/URLPattern.md +21 -0
- package/api/@xmachines/play-view/README.md +165 -0
- package/api/@xmachines/play-view/errors/README.md +17 -0
- package/api/@xmachines/play-view/errors/classes/ReadOnlyContextError.md +192 -0
- package/api/@xmachines/play-view/index/README.md +55 -0
- package/api/@xmachines/{play-actor → play-view/index}/functions/attachRenderErrorHandler.md +6 -6
- package/api/@xmachines/{play-actor → play-view/index}/functions/composePlayState.md +2 -2
- package/api/@xmachines/{play-actor → play-view/index}/functions/createFailureLatch.md +2 -2
- package/api/@xmachines/{play-actor → play-view/index}/functions/createReportGuard.md +2 -2
- package/api/@xmachines/{play-actor → play-view/index}/functions/createViewStoreLifecycle.md +2 -2
- package/api/@xmachines/{play-actor → play-view/index}/functions/guardContextWrites.md +2 -2
- package/api/@xmachines/{play-actor → play-view/index}/functions/refreshContextSubtree.md +2 -2
- package/api/@xmachines/{play-actor → play-view/index}/functions/reuseComposedState.md +3 -3
- package/api/@xmachines/{play-actor → play-view/index}/functions/sameViewInputs.md +2 -2
- package/api/@xmachines/{play-actor → play-view/index}/functions/toAtomState.md +2 -2
- package/api/@xmachines/{play-actor → play-view/index}/functions/typedSpec.md +2 -2
- package/api/@xmachines/play-view/index/interfaces/BaseActorProviderProps.md +49 -0
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/BaseViewContextValue.md +12 -12
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/FailureLatch.md +6 -5
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/PlaySpec.md +8 -8
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/ReportGuard.md +6 -6
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/ReportGuardMessages.md +6 -6
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/ResolveViewStoreOptions.md +5 -5
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/ViewInputs.md +7 -7
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/ViewStoreLifecycle.md +6 -5
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/ViewStoreResolution.md +7 -7
- package/api/@xmachines/{play-actor → play-view/index}/interfaces/Viewable.md +5 -5
- package/api/@xmachines/play-view/index/type-aliases/ViewActor.md +26 -0
- package/api/@xmachines/{play-actor → play-view/index}/variables/CONTEXT_STATE_KEY.md +2 -2
- package/api/@xmachines/play-vue/README.md +15 -33
- 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 +9 -9
- package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +11 -11
- package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +8 -8
- package/api/@xmachines/play-vue/type-aliases/AnyPlayActor.md +11 -3
- 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/variables/schema.md +71 -0
- package/api/@xmachines/play-vue-router/README.md +34 -77
- package/api/@xmachines/play-vue-router/errors/README.md +8 -0
- package/api/@xmachines/play-vue-router/errors/classes/VueRouterNavigationError.md +193 -0
- package/api/@xmachines/play-vue-router/errors/classes/VueRouterSendError.md +177 -0
- package/api/@xmachines/play-vue-router/index/README.md +20 -0
- package/api/@xmachines/play-vue-router/index/classes/RouteMap.md +157 -0
- package/api/@xmachines/play-vue-router/{classes → index/classes}/VueRouterBridge.md +24 -43
- package/api/@xmachines/play-vue-router/index/interfaces/PlayRouteEvent.md +130 -0
- package/api/@xmachines/play-vue-router/index/interfaces/RoutableActor.md +72 -0
- package/api/@xmachines/play-vue-router/{interfaces → index/interfaces}/RouteMapOptions.md +5 -5
- package/api/@xmachines/play-vue-router/{interfaces → index/interfaces}/RouteMapping.md +6 -6
- package/api/@xmachines/play-vue-router/{interfaces → index/interfaces}/RouterBridge.md +5 -5
- package/api/@xmachines/play-vue-router/{variables → index/variables}/PlayRouterProvider.md +4 -4
- package/api/@xmachines/play-xstate/README.md +153 -105
- package/api/@xmachines/play-xstate/errors/README.md +13 -0
- package/api/@xmachines/play-xstate/errors/classes/ActorThrewNonErrorError.md +199 -0
- package/api/@xmachines/play-xstate/errors/classes/InvalidEventError.md +198 -0
- package/api/@xmachines/play-xstate/errors/classes/InvalidMachineError.md +169 -0
- package/api/@xmachines/play-xstate/errors/classes/InvalidRouteHandlerError.md +197 -0
- package/api/@xmachines/play-xstate/errors/classes/InvalidRouteMetadataError.md +176 -0
- package/api/@xmachines/play-xstate/errors/classes/MissingRouteParamError.md +199 -0
- package/api/@xmachines/play-xstate/errors/classes/MissingStateIdError.md +203 -0
- package/api/@xmachines/play-xstate/index/README.md +38 -0
- package/api/@xmachines/play-xstate/index/classes/PlayerActor.md +584 -0
- package/api/@xmachines/play-xstate/index/functions/compose.md +224 -0
- package/api/@xmachines/play-xstate/index/functions/definePlayer.md +158 -0
- package/api/@xmachines/play-xstate/index/interfaces/PlayerConfig.md +22 -0
- package/api/@xmachines/play-xstate/{interfaces → index/interfaces}/PlayerFactoryResumeOptions.md +3 -3
- package/api/@xmachines/play-xstate/{interfaces → index/interfaces}/PlayerOptions.md +8 -8
- package/api/@xmachines/play-xstate/index/type-aliases/Capability.md +33 -0
- package/api/@xmachines/play-xstate/index/type-aliases/PlayerConstructor.md +39 -0
- package/api/@xmachines/play-xstate/index/type-aliases/PlayerFactory.md +27 -0
- package/api/@xmachines/{play-router → play-xstate/index}/variables/DISPOSE.md +3 -3
- package/api/@xmachines/play-xstate/with-routing/README.md +46 -0
- package/api/@xmachines/play-xstate/{functions → with-routing/functions}/buildRouteUrl.md +2 -2
- package/api/@xmachines/play-xstate/{functions → with-routing/functions}/deriveRoute.md +4 -4
- package/api/@xmachines/play-xstate/{functions → with-routing/functions}/formatPlayRouteTransitions.md +2 -2
- package/api/@xmachines/play-xstate/{functions → with-routing/functions}/isAbsoluteRoute.md +3 -3
- package/api/@xmachines/play-xstate/with-routing/functions/withRouting.md +36 -0
- package/api/@xmachines/play-xstate/{interfaces → with-routing/interfaces}/RouteContext.md +6 -6
- package/api/@xmachines/play-xstate/with-routing/interfaces/RouteObject.md +34 -0
- package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteData.md +12 -0
- package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteDataResolver.md +31 -0
- package/api/@xmachines/play-xstate/{type-aliases → with-routing/type-aliases}/RouteMachineConfig.md +5 -5
- package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteMetadata.md +11 -0
- package/api/@xmachines/play-xstate/{type-aliases → with-routing/type-aliases}/RouteStateNode.md +21 -7
- package/api/@xmachines/play-xstate/with-view/README.md +31 -0
- package/api/@xmachines/play-xstate/with-view/functions/withView.md +32 -0
- package/api/@xmachines/shared/README.md +10 -32
- 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 +2 -1
- package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +4 -4
- package/api/README.md +2 -0
- package/api/llms.txt +15 -10
- package/contributing/architecture.md +94 -66
- package/contributing/configuration.md +85 -26
- package/contributing/deployment.md +30 -28
- package/contributing/development.md +51 -10
- package/contributing/testing.md +87 -28
- package/examples/README.md +9 -7
- package/examples/form-validation.md +3 -2
- package/examples/multi-router-integration.md +61 -39
- package/examples/routing-patterns.md +15 -14
- package/examples/traffic-light.md +11 -5
- package/guides/README.md +1 -0
- package/guides/actor-model.md +35 -26
- package/guides/getting-started.md +49 -46
- package/guides/inspector.md +4 -4
- package/guides/routing.md +245 -0
- package/guides/state-machines.md +16 -17
- package/package.json +10 -9
- package/rfc/play.md +35 -22
- package/api/@xmachines/play-actor/classes/AbstractActor.md +0 -505
- package/api/@xmachines/play-actor/interfaces/BaseActorProviderProps.md +0 -48
- package/api/@xmachines/play-actor/interfaces/Routable.md +0 -14
- package/api/@xmachines/play-dom/type-aliases/DisposablePlayUI.md +0 -36
- package/api/@xmachines/play-dom-router/functions/createRouteMap.md +0 -40
- package/api/@xmachines/play-dom-router/interfaces/DisposableBrowserHistory.md +0 -262
- package/api/@xmachines/play-dom-router/interfaces/DisposableVanillaRouter.md +0 -80
- package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +0 -122
- package/api/@xmachines/play-react/type-aliases/PlayRendererProps.md +0 -13
- package/api/@xmachines/play-react-router/functions/createRouteMap.md +0 -40
- package/api/@xmachines/play-react-router/interfaces/PlayActor.md +0 -70
- package/api/@xmachines/play-router/functions/getNavigableRoutes.md +0 -35
- package/api/@xmachines/play-router/functions/getPatternParamNames.md +0 -24
- package/api/@xmachines/play-router/functions/getRequiredPatternParamNames.md +0 -36
- package/api/@xmachines/play-router/functions/routeExists.md +0 -26
- package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +0 -13
- package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +0 -15
- package/api/@xmachines/play-router/interfaces/MachineNodeData.md +0 -17
- package/api/@xmachines/play-router/interfaces/PlayActor.md +0 -70
- package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +0 -135
- package/api/@xmachines/play-router/interfaces/RoutableActor.md +0 -65
- package/api/@xmachines/play-router/interfaces/RouteMatch.md +0 -12
- package/api/@xmachines/play-router/interfaces/RouteObject.md +0 -21
- package/api/@xmachines/play-router/interfaces/RouteTree.md +0 -21
- package/api/@xmachines/play-router/type-aliases/BaseRouteMapping.md +0 -13
- package/api/@xmachines/play-router/type-aliases/PlayRouterBridgeConstructor.md +0 -36
- package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +0 -11
- package/api/@xmachines/play-solid-router/functions/createRouteMap.md +0 -40
- package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +0 -471
- package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +0 -13
- package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +0 -40
- package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +0 -9
- package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +0 -40
- package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +0 -9
- package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +0 -40
- package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +0 -29
- package/api/@xmachines/play-tanstack-react-router/interfaces/PlayActor.md +0 -70
- package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +0 -31
- package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +0 -40
- package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayActor.md +0 -70
- package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +0 -13
- package/api/@xmachines/play-vue/interfaces/VisibilityProviderProps.md +0 -9
- package/api/@xmachines/play-vue/variables/getPlayViewContext.md +0 -39
- package/api/@xmachines/play-vue-router/functions/createRouteMap.md +0 -40
- package/api/@xmachines/play-vue-router/interfaces/PlayActor.md +0 -70
- package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +0 -135
- package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +0 -13
- package/api/@xmachines/play-vue-router/type-aliases/VueRouteMap.md +0 -13
- package/api/@xmachines/play-vue-router/variables/VueRouteMap.md +0 -13
- package/api/@xmachines/play-xstate/classes/PlayerActor.md +0 -568
- package/api/@xmachines/play-xstate/functions/composeGuards.md +0 -86
- package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +0 -72
- package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +0 -43
- package/api/@xmachines/play-xstate/functions/definePlayer.md +0 -78
- package/api/@xmachines/play-xstate/functions/eventMatches.md +0 -45
- package/api/@xmachines/play-xstate/functions/hasContext.md +0 -45
- package/api/@xmachines/play-xstate/functions/negateGuard.md +0 -67
- package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +0 -20
- package/api/@xmachines/play-xstate/interfaces/RouteObject.md +0 -17
- package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +0 -19
- package/api/@xmachines/play-xstate/type-aliases/Guard.md +0 -36
- package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +0 -23
- package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +0 -26
- package/api/@xmachines/play-xstate/type-aliases/RouteMetadata.md +0 -9
|
@@ -22,23 +22,23 @@ The dev container currently defines no workspace-specific environment variables;
|
|
|
22
22
|
|
|
23
23
|
**Examples:**
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
# Skip one package publish
|
|
27
|
-
SEMREL_SKIP_STEPS="@semantic-release/npm:packages/play-xstate"
|
|
25
|
+
A step ID is the name of the plugin, and a name that the entry declares extends it: `@semantic-release/exec:build`.
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
```bash
|
|
28
|
+
# Skip one prepare step
|
|
29
|
+
SEMREL_SKIP_STEPS="@semantic-release/exec:build$"
|
|
31
30
|
|
|
32
|
-
# Skip
|
|
31
|
+
# Skip every prepare step
|
|
33
32
|
SEMREL_SKIP_STEPS="@semantic-release/exec"
|
|
34
33
|
|
|
35
|
-
#
|
|
36
|
-
SEMREL_SKIP_STEPS="@semantic-release/
|
|
37
|
-
|
|
38
|
-
# Skip git commit and GitLab release
|
|
39
|
-
SEMREL_SKIP_STEPS="@semantic-release/git|@semantic-release/gitlab"
|
|
34
|
+
# Leave CHANGELOG.md alone
|
|
35
|
+
SEMREL_SKIP_STEPS="@semantic-release/changelog"
|
|
40
36
|
```
|
|
41
37
|
|
|
38
|
+
A pattern that removes `@semantic-release/git` throws instead of running: semantic-release would still tag and push, and the tag would then name a commit that carries no version bump.
|
|
39
|
+
|
|
40
|
+
The variable reaches the publish never. `scripts/publish-release.mjs` runs on the tag pipeline, outside semantic-release — see [deployment.md](deployment.md).
|
|
41
|
+
|
|
42
42
|
---
|
|
43
43
|
|
|
44
44
|
## Configuration Files
|
|
@@ -185,8 +185,8 @@ export default defineConfig({
|
|
|
185
185
|
| `no-underscore-dangle` | — | `off` |
|
|
186
186
|
|
|
187
187
|
`unicorn/no-array-sort` is an error and not the warning of its category. The workspace
|
|
188
|
-
targets ESNext, and Node
|
|
189
|
-
|
|
188
|
+
targets ESNext, and Node 24 — the floor of every package — has `toSorted()`, so the
|
|
189
|
+
method is always available. As a warning the rule kept
|
|
190
190
|
the lint job green while the Code Quality report showed the degradation, and `sort()` stayed
|
|
191
191
|
behind a suppression for a ceiling that had already gone.
|
|
192
192
|
|
|
@@ -252,6 +252,64 @@ export default defineConfig({
|
|
|
252
252
|
| `useTabs` | `false` |
|
|
253
253
|
| `tabWidth` | `2` |
|
|
254
254
|
|
|
255
|
+
### Developer Tools — Vite DevTools
|
|
256
|
+
|
|
257
|
+
**Tool:** [Vite DevTools](https://devtools.vite.dev/guide/) `^0.7.1`
|
|
258
|
+
**Run:** `Shift+Alt+D` in any demo dev server
|
|
259
|
+
|
|
260
|
+
`@vitejs/devtools` hosts four integrations, and each one reads a tool this repository already
|
|
261
|
+
uses:
|
|
262
|
+
|
|
263
|
+
| Integration | Panel |
|
|
264
|
+
| ------------------------------------------------------------------ | ---------------------------------------------------------------- |
|
|
265
|
+
| [`@vitejs/devtools-oxc`](https://devtools.vite.dev/oxc/) | oxlint diagnostics, the resolved rules, and the oxfmt version |
|
|
266
|
+
| [`@vitejs/devtools-vite`](https://devtools.vite.dev/vite/) | the plugin pipeline of the dev server, and each module transform |
|
|
267
|
+
| [`@vitejs/devtools-rolldown`](https://devtools.vite.dev/rolldown/) | the rolldown build that Vite 8 runs, and the modules it bundles |
|
|
268
|
+
| [`@vitejs/devtools-vitest`](https://devtools.vite.dev/vitest/) | the Vitest UI, inside the dock |
|
|
269
|
+
|
|
270
|
+
`defineXmDemoConfig` adds the dock to every demo dev server, therefore the four panels need no
|
|
271
|
+
script and no separate command:
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
pnpm --filter @xmachines/play-vue-router-demo run dev
|
|
275
|
+
# then press Shift+Alt+D in the browser
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
The dock starts hidden (`embeddedVisibility: "passive"`), and the browser remembers the choice
|
|
279
|
+
after the first `Shift+Alt+D`. The demos are the subjects of the browser suites and of the
|
|
280
|
+
screenshots of the documentation, and a panel above them helps neither.
|
|
281
|
+
|
|
282
|
+
The root manifest declares `@vitest/ui`, because the Vitest panel embeds it. Without it the panel
|
|
283
|
+
shows an "Install @vitest/ui & start" button, and that button writes the dependency into the root
|
|
284
|
+
manifest and installs it while the dev server runs. It installs the newest version, which is 5.x,
|
|
285
|
+
and `vitest` names `@vitest/ui` as a peer at its own exact version. The declared `^4.1.11` keeps
|
|
286
|
+
the whole vitest family on one range, which `tests/vitest-version-lockstep.test.ts` holds true.
|
|
287
|
+
|
|
288
|
+
Only the 13 demo apps declare the five packages, because only they run a dev server. The Oxc panel
|
|
289
|
+
reads the same shared configuration from any of them: all 23 per-package `oxlint.config.ts`
|
|
290
|
+
files hold `extends: [sharedConfig]` and add nothing, and the packages under `examples/` hold no
|
|
291
|
+
config of their own. To read the configuration of a package that has no demo, run the inspector
|
|
292
|
+
without installing it:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
pnpm --filter @xmachines/docs exec npx @vitejs/devtools-oxc
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
`defineXmDemoConfig` hands `DevTools()` the demo directory as `cwd`. Without it the lookup starts
|
|
299
|
+
at `process.cwd()`, and the set of panels then depends on the directory a person typed the command
|
|
300
|
+
in.
|
|
301
|
+
|
|
302
|
+
Every DevTools plugin carries `apply: "serve"`. A demo is a release asset, therefore
|
|
303
|
+
`pnpm --filter <demo> run build` emits the same files as before the dock existed, and no devtools
|
|
304
|
+
code reaches a published demo.
|
|
305
|
+
|
|
306
|
+
A Vitest run gets no dock. `apply: "serve"` does not cover that case, because Vitest browser mode
|
|
307
|
+
serves the app and therefore counts as `serve`. `defineXmDemoConfig` reads the `VITEST` variable
|
|
308
|
+
that the Vitest CLI sets, and it adds no plugin when that variable is present. This gate is a
|
|
309
|
+
guard, and it is not a fix for a failure that reproduces: the browser suite also passes and exits
|
|
310
|
+
with the gate removed. A dock belongs to a dev server that a person opened, therefore the gate
|
|
311
|
+
stays.
|
|
312
|
+
|
|
255
313
|
### Editor — `.editorconfig`
|
|
256
314
|
|
|
257
315
|
**Location:** `/.editorconfig`
|
|
@@ -273,15 +331,15 @@ export default defineConfig({
|
|
|
273
331
|
|
|
274
332
|
Root Vitest config is a **workspace coordinator** that lists all per-package configs under `test.projects`. It sets conservative monorepo-wide defaults:
|
|
275
333
|
|
|
276
|
-
| Setting | Value | Notes
|
|
277
|
-
| ----------------- | ---------- |
|
|
278
|
-
| `pool` | `"forks"` | Process-isolated workers
|
|
279
|
-
| `maxWorkers` | `4` | Root default; per-project configs may override
|
|
280
|
-
| `isolate` | `true` |
|
|
281
|
-
| `fileParallelism` | `false` | Conservative default; safe packages opt in with `true`
|
|
282
|
-
| `teardownTimeout` | `30000` ms |
|
|
283
|
-
| `hookTimeout` | `30000` ms |
|
|
284
|
-
| `testTimeout` | `10000` ms |
|
|
334
|
+
| Setting | Value | Notes |
|
|
335
|
+
| ----------------- | ---------- | ------------------------------------------------------------------------------------ |
|
|
336
|
+
| `pool` | `"forks"` | Process-isolated workers; `defineXmVitestConfig` gives a jsdom project `"vmThreads"` |
|
|
337
|
+
| `maxWorkers` | `4` | Root default; per-project configs may override |
|
|
338
|
+
| `isolate` | `true` | |
|
|
339
|
+
| `fileParallelism` | `false` | Conservative default; safe packages opt in with `true` |
|
|
340
|
+
| `teardownTimeout` | `30000` ms | |
|
|
341
|
+
| `hookTimeout` | `30000` ms | |
|
|
342
|
+
| `testTimeout` | `10000` ms | |
|
|
285
343
|
|
|
286
344
|
**Coverage thresholds** (monorepo aggregate — `vitest run --coverage`):
|
|
287
345
|
|
|
@@ -367,11 +425,12 @@ Only `main` is a protected branch today. That works because `GITLAB_TOKEN` — w
|
|
|
367
425
|
- `build` — `pnpm run build`
|
|
368
426
|
- `typedoc` — `pnpm --filter @xmachines/docs run typedoc`
|
|
369
427
|
- `format-docs` — `pnpm --filter @xmachines/docs run format`
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
428
|
+
- `stage-generated-docs` — `git add -A packages/docs/api`, so a page that TypeDoc deleted leaves git too
|
|
429
|
+
5. `@semantic-release/git` — commits the changelog, the manifests, the READMEs and the generated API docs, then pushes the commit and the tag
|
|
430
|
+
|
|
431
|
+
The list ends there. semantic-release publishes nothing and creates no GitLab release: `scripts/publish-release.mjs` does both, on the pipeline of the tag. [deployment.md](deployment.md) states the whole sequence and the reason.
|
|
373
432
|
|
|
374
|
-
Any step can be skipped
|
|
433
|
+
Any step above can be skipped with the `SEMREL_SKIP_STEPS` CI variable, which the CI / Release Pipeline Variable section at the top of this page states.
|
|
375
434
|
|
|
376
435
|
---
|
|
377
436
|
|
|
@@ -8,11 +8,11 @@ This document describes how `@xmachines/xmachines-js` packages are built, versio
|
|
|
8
8
|
|
|
9
9
|
All `@xmachines/*` packages are published to the **public npm registry** (`registry.npmjs.org`). Every package uses `"publishConfig": { "access": "public" }` so scoped packages are accessible without an npm org subscription. See the [Published Packages](#published-packages) table for the full list.
|
|
10
10
|
|
|
11
|
-
| Target | Config File
|
|
12
|
-
| --------------- |
|
|
13
|
-
| npm registry | `release.
|
|
14
|
-
| GitLab Releases | `release.
|
|
15
|
-
| GitLab CI | `.gitlab-ci.yml`
|
|
11
|
+
| Target | Config File | Purpose |
|
|
12
|
+
| --------------- | -------------------------------------------------- | ------------------------------------------------------ |
|
|
13
|
+
| npm registry | `scripts/publish-release.mjs`, on the tag pipeline | Publish all public packages |
|
|
14
|
+
| GitLab Releases | `scripts/publish-release.mjs`, on the tag pipeline | Attach tarball artifacts to the GitLab release tag |
|
|
15
|
+
| GitLab CI | `.gitlab-ci.yml` | Trigger builds, tests, and releases on push / MR / tag |
|
|
16
16
|
|
|
17
17
|
The root `package.json` is marked `"private": true` and is **never published** to npm.
|
|
18
18
|
|
|
@@ -116,7 +116,7 @@ node scripts/release-pack-smoke.mjs
|
|
|
116
116
|
|
|
117
117
|
`scripts/release-pack-smoke.mjs`:
|
|
118
118
|
|
|
119
|
-
1.
|
|
119
|
+
1. Asks `scripts/lib/release-packages.mjs` which packages a release publishes. `publish-release.mjs` and `release.config.mjs` ask the same module, so the three cannot disagree.
|
|
120
120
|
2. For each publishable package: runs `npm pack --json` in the package directory.
|
|
121
121
|
3. Creates a temporary directory, runs `npm init -y`, and installs the local tarball with `--ignore-scripts`.
|
|
122
122
|
4. Asserts the install succeeds — any missing files, broken exports, or pack-time errors surface here.
|
|
@@ -155,6 +155,7 @@ node scripts/set-workspace-versions.mjs ${nextRelease.version}
|
|
|
155
155
|
pnpm run build
|
|
156
156
|
pnpm --filter @xmachines/docs run typedoc --gitRevision v${nextRelease.version}
|
|
157
157
|
pnpm --filter @xmachines/docs run format
|
|
158
|
+
git add -A packages/docs/api
|
|
158
159
|
```
|
|
159
160
|
|
|
160
161
|
Step by step:
|
|
@@ -165,44 +166,45 @@ Step by step:
|
|
|
165
166
|
4. **Build** — runs `vite build && tsc --build` to produce compiled `dist/` output — JavaScript then declarations — in all packages.
|
|
166
167
|
5. **Generate API docs** — runs TypeDoc to regenerate `packages/docs/api/` at the release git revision.
|
|
167
168
|
6. **Format docs** — runs `oxfmt` on the docs package to ensure consistent formatting.
|
|
169
|
+
7. **Stage the generated docs** — `git add -A packages/docs/api`. The git plugin stages what `git ls-files -m -o` reports, and that never reports a DELETION. A page that TypeDoc removed, because an export was renamed or deleted, therefore stayed in git forever while the docs tarball packed from the working tree was correct. `git add -A` stages the removals, and the git plugin commits the index.
|
|
168
170
|
|
|
169
171
|
### Publish Phase
|
|
170
172
|
|
|
171
|
-
|
|
173
|
+
semantic-release publishes nothing. It stops at the tag, and `scripts/publish-release.mjs` publishes from a pipeline that runs ON that tag:
|
|
172
174
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
+
```bash
|
|
176
|
+
node scripts/publish-release.mjs
|
|
177
|
+
```
|
|
175
178
|
|
|
176
|
-
|
|
177
|
-
hand-written):
|
|
179
|
+
The tag pipeline is what makes the provenance attestation meaningful. npm records the commit of the pipeline in the attestation. On a tag pipeline that commit IS the commit that the tag names, and it is the commit whose manifests declare this version. A publish from the branch pipeline attests the PARENT of the release commit instead: a revision that the tag does not name, and whose manifests still carry the previous version.
|
|
178
180
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
181
|
+
The script pins the internal dependencies, strips the `source` export condition, packs every workspace package into `dist/releases/`, publishes each publishable tarball with `--provenance` under the dist-tag of the version, and verifies that every one reached the registry. It then creates the GitLab release with the tarballs attached, and it restores the working tree.
|
|
182
|
+
|
|
183
|
+
The script is idempotent. It skips every package that the registry already serves at this version, so one retry of the job finishes a run that died partway — which is how the publish of 1.1.0 recovered from a credential that expired mid-run. Nothing to untag, nothing to force-push.
|
|
182
184
|
|
|
183
185
|
### Post-Release Phase
|
|
184
186
|
|
|
185
|
-
|
|
187
|
+
This phase runs on the branch, BEFORE the tag pipeline publishes.
|
|
186
188
|
|
|
187
189
|
1. **`@semantic-release/git`** commits updated files back to the repository:
|
|
188
190
|
- `CHANGELOG.md`
|
|
189
|
-
- `package.json` and `
|
|
190
|
-
- `
|
|
191
|
+
- `package.json`, `pnpm-lock.yaml` and `pnpm-workspace.yaml` (root)
|
|
192
|
+
- The `package.json` of every scanned package, and the `README.md` of every one — the release stamps the version badge of a README at the same moment as the manifest
|
|
191
193
|
- `packages/docs/api/**` (generated API documentation)
|
|
192
194
|
|
|
195
|
+
The manifest list and the README list both come from the workspace scan, and not from a glob written by hand, so a package that a new `pnpm-workspace` pattern adds cannot be published while its manifest stays behind in git. A test asserts that every scanned package appears in both lists.
|
|
196
|
+
|
|
193
197
|
Commit message format:
|
|
194
198
|
|
|
195
199
|
```
|
|
196
200
|
chore(release): <version>
|
|
197
|
-
|
|
198
|
-
<release notes>
|
|
199
|
-
|
|
200
|
-
[skip ci]
|
|
201
201
|
```
|
|
202
202
|
|
|
203
|
-
|
|
203
|
+
The release notes are NOT interpolated into the message. `@semantic-release/git` runs `git commit -m <message>`, and the notes of the first stable release aggregate about 1600 commits — an `-m` value of several megabytes overflows the argument limit of the OS. The notes land in `CHANGELOG.md`, which the same commit carries.
|
|
204
|
+
|
|
205
|
+
The message carries no `[skip ci]`. The release commit needs no pipeline of its own, but the TAG that points at it does: that pipeline is where the publish happens.
|
|
204
206
|
|
|
205
|
-
|
|
207
|
+
2. **The git plugin pushes the commit and the tag.** semantic-release stops there. The GitLab release entry, with every `dist/releases/*.tgz` attached, is created later by `scripts/publish-release.mjs` on the tag pipeline — after the publish succeeded, so a release entry never advertises a tarball that npm refused.
|
|
206
208
|
|
|
207
209
|
---
|
|
208
210
|
|
|
@@ -219,11 +221,11 @@ This means packages always depend on the exact same version of sibling packages
|
|
|
219
221
|
|
|
220
222
|
## Credentials and Protected Variables
|
|
221
223
|
|
|
222
|
-
| Variable | Source | Purpose
|
|
223
|
-
| --------------------------- | --------------------------------------- |
|
|
224
|
-
| `NPM_ID_TOKEN` | GitLab CI OIDC (auto-generated per job) | Authenticates `semantic-release` to npm registry via OIDC token exchange
|
|
225
|
-
| `GL_TOKEN` / `GITLAB_TOKEN` | GitLab CI group variable (unprotected) | Authenticates
|
|
226
|
-
| `CI_JOB_TOKEN` | GitLab CI built-in | Used by the `to-be-continuous` components for GitLab API calls
|
|
224
|
+
| Variable | Source | Purpose |
|
|
225
|
+
| --------------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
226
|
+
| `NPM_ID_TOKEN` | GitLab CI OIDC (auto-generated per job) | Authenticates `semantic-release` to npm registry via OIDC token exchange |
|
|
227
|
+
| `GL_TOKEN` / `GITLAB_TOKEN` | GitLab CI group variable (unprotected) | Authenticates the git push back of semantic-release, and the GitLab release that `publish-release.mjs` creates |
|
|
228
|
+
| `CI_JOB_TOKEN` | GitLab CI built-in | Used by the `to-be-continuous` components for GitLab API calls |
|
|
227
229
|
|
|
228
230
|
**No static npm token is committed to the repository.** The `NPM_ID_TOKEN` is a short-lived OIDC token generated for each CI job with audience `npm:registry.npmjs.org`.
|
|
229
231
|
|
|
@@ -83,13 +83,15 @@ packages/
|
|
|
83
83
|
├── shared/ # Shared configs (tsconfig, oxlint, oxfmt, vitest)
|
|
84
84
|
├── play/ # Core protocol (PlayEvent, PlayError)
|
|
85
85
|
├── play-signals/ # TC39 Signals polyfill wrapper
|
|
86
|
-
├── play-
|
|
86
|
+
├── play-url/ # The URL language: the grammar, a base path, framework params
|
|
87
|
+
├── play-actor/ # The actor contract (PlayActor). It names no engine
|
|
88
|
+
├── play-view/ # The shared view half (Viewable, PlaySpec, the view store lifecycle)
|
|
87
89
|
├── play-xstate/ # XState v5 adapter (definePlayer, PlayerActor)
|
|
88
90
|
├── play-router/ # Route extraction and RouterBridgeBase
|
|
89
91
|
├── play-dom/ # Vanilla DOM renderer
|
|
90
92
|
├── play-dom-router/ # DOM router adapter
|
|
91
93
|
├── play-react/ # React renderer (PlayRenderer)
|
|
92
|
-
├── play-react-router/ # React Router
|
|
94
|
+
├── play-react-router/ # React Router 7/8 adapter
|
|
93
95
|
├── play-vue/ # Vue 3 renderer
|
|
94
96
|
├── play-vue-router/ # Vue Router adapter
|
|
95
97
|
├── play-solid/ # SolidJS renderer
|
|
@@ -181,6 +183,22 @@ What that costs is worth stating plainly: **CI only ever exercises the dev versi
|
|
|
181
183
|
|
|
182
184
|
React 18 and vue-router 4 are supported by intent — nothing known depends on 19-only or 5-only behaviour — but neither is installed by any job, so a regression there would surface as a consumer's bug report rather than a red pipeline. Narrowing either range to what is tested would be a breaking change for consumers and needs a major release; adding a floor-install job would close the gap instead. Until one of those happens, treat the lower major as untested.
|
|
183
185
|
|
|
186
|
+
### The packages that must exist one time
|
|
187
|
+
|
|
188
|
+
`@xmachines/play` and `@xmachines/play-signals` are a peer of every package that reads them, and a dependency of none.
|
|
189
|
+
|
|
190
|
+
`@xmachines/play-signals` wraps `signal-polyfill`, and the polyfill holds its dependency graph in the state of its own module. Two copies build two graphs. A `Signal.Computed` of the first copy and a `Signal.subtle.Watcher` of the second copy therefore never meet: the watcher stays silent, and no error reports the fault. Every propagation of state in this architecture goes through a signal, so the second copy stops the reactivity of a whole application.
|
|
191
|
+
|
|
192
|
+
`@xmachines/play` holds `PlayError`, and the documentation sends a consumer to `err instanceof PlayError`. That check answers `false` for an error of the second copy.
|
|
193
|
+
|
|
194
|
+
A dependency invites that second copy. `scripts/lib/workspace-deps.mjs` pins a `workspace:*` range to an EXACT version, so two packages of two releases name two versions, and an installer resolves both. A peer moves the choice to the consumer, who brings one copy. The `@xmachines/json-render-*` packages carry the same rule for the same reason.
|
|
195
|
+
|
|
196
|
+
Each of the two needs a `devDependency` beside the peer, because the workspace installs no peer. Without that entry a package resolves the specifier through the hoisting of another package, and it compiles until that other package stops declaring it.
|
|
197
|
+
|
|
198
|
+
`tests/singleton-peers.test.ts` holds the three rules true: no dependency, a dev entry beside each peer, and a peer for each one that `src/` imports. A package that reads one of the two in its TESTS alone needs the dev entry alone — `@xmachines/play-tanstack-router` is that case.
|
|
199
|
+
|
|
200
|
+
The rule reads in both directions. A peer that the `src/` directory never imports is a peer that a consumer installs for nothing, and four router adapters carried one. A package declares the peer when it reads the package, and a `devDependency` alone when its tests read it.
|
|
201
|
+
|
|
184
202
|
---
|
|
185
203
|
|
|
186
204
|
## TypeScript Composite Build System
|
|
@@ -201,14 +219,15 @@ Packages are grouped into dependency layers as defined in the root `tsconfig.jso
|
|
|
201
219
|
| Layer | Packages | Depends on |
|
|
202
220
|
| ----- | -------------------------------------------------------------------------------- | ------------------ |
|
|
203
221
|
| 0 | `docs`, `play`, `shared` | External libs only |
|
|
204
|
-
| 1 | `play-signals`
|
|
222
|
+
| 1 | `play-signals`, `play-url` | Layer 0 |
|
|
205
223
|
| 2 | `play-actor` | Layers 0–1 |
|
|
206
|
-
| 3 | `play-
|
|
207
|
-
| 4 | `play-
|
|
208
|
-
| 5 | `play-
|
|
209
|
-
| 6 |
|
|
210
|
-
| 7 |
|
|
211
|
-
| 8 | router
|
|
224
|
+
| 3 | `play-view` | Layers 0–2 |
|
|
225
|
+
| 4 | `play-dom`, `play-react`, `play-router`, `play-solid`, `play-svelte`, `play-vue` | Layers 0–3 |
|
|
226
|
+
| 5 | `play-tanstack-router`, `play-xstate` | Layers 0–4 |
|
|
227
|
+
| 6 | `play-actor/examples/shared` | Layers 0–5 |
|
|
228
|
+
| 7 | renderer demo apps | Layers 0–6 |
|
|
229
|
+
| 8 | the eight router adapters | Layers 0–7 |
|
|
230
|
+
| 9 | router demo apps | Layers 0–8 |
|
|
212
231
|
|
|
213
232
|
The layer of an entry is its longest path to a package with no workspace dependency, and `tests/tsconfig-reference-graph.test.ts` computes it from the manifests.
|
|
214
233
|
|
|
@@ -500,7 +519,29 @@ This project uses **Conventional Commits** — changelogs and version bumps are
|
|
|
500
519
|
| `perf` | No bump (unless breaking) | Performance improvements |
|
|
501
520
|
| `ci` | No bump | CI/CD pipeline changes |
|
|
502
521
|
|
|
503
|
-
Breaking changes: append `!` after the type (`feat!:`)
|
|
522
|
+
Breaking changes: append `!` after the type (`feat!:`) AND write a `BREAKING CHANGE:`
|
|
523
|
+
footer. The two do different work, and neither one replaces the other:
|
|
524
|
+
|
|
525
|
+
- The `!` decides the BUMP. `release.config.mjs` gives both semantic-release plugins a
|
|
526
|
+
`breakingHeaderPattern`, because the angular preset reads `!` not at all: without that
|
|
527
|
+
pattern, `feat!: …` parses with no type, and a release made of nothing but such commits
|
|
528
|
+
is no release.
|
|
529
|
+
- The footer writes the NOTE. The changelog lists a breaking change from the footer alone,
|
|
530
|
+
so a `!` commit with no footer bumps the major and tells a reader nothing about what
|
|
531
|
+
broke. Seven commits shipped that way once, and none of them appears in `CHANGELOG.md`.
|
|
532
|
+
|
|
533
|
+
Write the footer as one paragraph that names the old form and the new one:
|
|
534
|
+
|
|
535
|
+
```
|
|
536
|
+
refactor(play-actor)!: make the actor contract an interface
|
|
537
|
+
|
|
538
|
+
BREAKING CHANGE: `AbstractActor` is removed. Use the `PlayActor` interface, and extend
|
|
539
|
+
the actor class of your engine directly.
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
Keep every other line of the body from starting with a `word: ` prefix. The parser reads
|
|
543
|
+
such a line as a footer token, and a line that opens with "BREAKING CHANGE" inside a
|
|
544
|
+
wrapped paragraph therefore announces a major that nobody intended.
|
|
504
545
|
|
|
505
546
|
Use the package short-name as scope when the change is isolated to one package:
|
|
506
547
|
|
package/contributing/testing.md
CHANGED
|
@@ -4,7 +4,7 @@ This document describes the test framework, conventions, and CI integration for
|
|
|
4
4
|
|
|
5
5
|
## Test Framework and Setup
|
|
6
6
|
|
|
7
|
-
The monorepo uses **[Vitest](https://vitest.dev/) `^
|
|
7
|
+
The monorepo uses **[Vitest](https://vitest.dev/) `^5.0.1`** as its test framework, with **@vitest/coverage-v8** for coverage reporting and **@vitest/browser-playwright** (Playwright/Chromium) for browser-mode tests.
|
|
8
8
|
|
|
9
9
|
All packages extend the shared Vitest configuration helper `defineXmVitestConfig` (from `@xmachines/shared/vitest`) which automatically applies:
|
|
10
10
|
|
|
@@ -19,6 +19,30 @@ All packages extend the shared Vitest configuration helper `defineXmVitestConfig
|
|
|
19
19
|
| `packages/shared/config/vitest.node.setup.ts` | All non-browser projects | Validates Node.js ≥ 24 runtime; throws if wrong runtime |
|
|
20
20
|
| `packages/shared/config/vitest.setup.ts` | All projects | Imports `@testing-library/jest-dom/vitest` matchers |
|
|
21
21
|
|
|
22
|
+
`vitest.setup.ts` is also the one file that `@xmachines/shared/tsconfig-test` names in `files`, so its import puts the matcher TYPES in every test program. Each package overrides `include`, and `files` survives that.
|
|
23
|
+
|
|
24
|
+
### The jest-dom patch
|
|
25
|
+
|
|
26
|
+
`patches/@testing-library__jest-dom@7.0.1.patch` moves the matcher declaration of the library from `Assertion` to `Matchers`. The library declares this:
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
declare module "vitest" {
|
|
30
|
+
interface Assertion<T = any> extends TestingLibraryMatchers<any, T> {}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Vitest 5 declares `interface Assertion<R extends void | Promise<void> = void, T = unknown>`. A module augmentation merges only when the type parameters are IDENTICAL, and TypeScript reports nothing when they differ — it simply does not apply. Every matcher therefore left the type of `expect(...)` while the runtime kept working. `Matchers` is the interface that vitest publishes for an extension, and `Assertion` extends it, so the patched declaration reaches every assertion and restates no interface whose shape vitest owns.
|
|
35
|
+
|
|
36
|
+
Delete the patch, its `patchedDependencies` entry in `pnpm-workspace.yaml`, and `tests/jest-dom-augmentation.test.ts` on the day the library ships a declaration that vitest 5 accepts. See [testing-library/jest-dom#738](https://github.com/testing-library/jest-dom/issues/738).
|
|
37
|
+
|
|
38
|
+
### The vitest mocker patch
|
|
39
|
+
|
|
40
|
+
`patches/@vitest__mocker@5.0.1.patch` takes the `configureServer` hook off `vitest:mocks:interceptor` when the caller passes `registerWebSocketEvents: false`, which is how `@vitest/browser` calls it.
|
|
41
|
+
|
|
42
|
+
Vitest returns that plugin from the `applyToEnvironment` of another plugin, and Vite 8 ignores a `configureServer` that it finds there. Vite reports the fact one time for each environment, so a run of 29 projects wrote 29 lines, in the `test` job and in the `test:browser` job both. The hook returns at once for `registerWebSocketEvents: false`, so the omission changes no behaviour.
|
|
43
|
+
|
|
44
|
+
Delete the patch and its `patchedDependencies` entry when vitest ships the fix. See [vitest-dev/vitest#11276](https://github.com/vitest-dev/vitest/issues/11276).
|
|
45
|
+
|
|
22
46
|
Before running any tests, ensure all dependencies are installed:
|
|
23
47
|
|
|
24
48
|
```bash
|
|
@@ -33,7 +57,7 @@ pnpm install --frozen-lockfile
|
|
|
33
57
|
pnpm test
|
|
34
58
|
```
|
|
35
59
|
|
|
36
|
-
Runs `vitest run` across every project that the root `vitest.config.ts` collects —
|
|
60
|
+
Runs `vitest run` across every project that the root `vitest.config.ts` collects — 38 of them today: one for each package, one for each demo that holds node tests, and `infrastructure` for the repository tests in `tests/`. A node project uses the `forks` pool (up to 4 workers) and reuses a worker across test files — see [Isolation](#isolation). A jsdom project uses the `vmThreads` pool — see [Test environments](#test-environments).
|
|
37
61
|
|
|
38
62
|
The root config finds those projects by glob, so a new package or demo joins the run with no edit. Each test file must belong to **one** project: a package config that reaches into its own `examples/` collects the demo tests that the demo config collects already, and the run then executes them two times, under two different environments. `tests/project-collection-overlap.test.ts` asks Vitest for the whole collection and fails on any file that two projects claim.
|
|
39
63
|
|
|
@@ -82,7 +106,7 @@ Individual packages may enforce higher per-package thresholds in their own `vite
|
|
|
82
106
|
pnpm run test:build
|
|
83
107
|
```
|
|
84
108
|
|
|
85
|
-
Runs `tsc --build tsconfig.test.json --force`. This validates that all test TypeScript files across the monorepo type-check correctly without running the tests themselves. Also compiles `.typecheck.ts` files
|
|
109
|
+
Runs `tsc --build tsconfig.test.json --force`. This validates that all test TypeScript files across the monorepo type-check correctly without running the tests themselves. Also compiles the `.typecheck.ts` files of the `test/` directories.
|
|
86
110
|
|
|
87
111
|
This is the command that answers "does this tree type-check?". Use it rather than `pnpm run build` for that question. `tsc --build` skips a project whose dependencies have unchanged `.d.ts` files, so an error inside the source of a library that changes no exported declaration can leave every consumer of that library up to date and never be reported — and consumers here compile library **source**, through the `source` export condition. `--force` costs about a second and takes that decision away from tsc; `tests/typecheck-staleness.test.ts` holds it, and the two other properties the complete check rests on, in place: no project of the gate is `composite`, and the CI job starts with no build state on disk. The job gets that second property by DELETING every `*.tsbuildinfo` before it runs the gate. It does not inherit it: most of the caching of the pipeline arrives through the included node component, and no test in this repository can read that component's cache paths, so a claim about them would be prose that nothing verifies.
|
|
88
112
|
|
|
@@ -133,11 +157,38 @@ packages/<name>/
|
|
|
133
157
|
| `jsdom` | UI renderers: `@xmachines/play-react`, `play-vue`, `play-solid`, `play-svelte`, `play-dom` |
|
|
134
158
|
| Browser (Playwright/Chromium) | Browser-specific and E2E demo tests |
|
|
135
159
|
|
|
160
|
+
`defineXmVitestConfig` gives a jsdom project the `vmThreads` pool. The `forks` pool builds one jsdom for each test file, and a jsdom costs about 0.4 s. The `vmThreads` pool gives each file its own VM context in a worker that keeps the environment, so a worker builds one jsdom for all the files that it runs. Each file still gets a fresh module registry and fresh globals. The full `pnpm test` run takes 94 s with `vmThreads` and 160 s with `forks`, and the environment share of the tracked time drops from 42% to 14%.
|
|
161
|
+
|
|
162
|
+
A project that declares its own `pool` keeps it.
|
|
163
|
+
|
|
164
|
+
### Isolation
|
|
165
|
+
|
|
166
|
+
`defineXmVitestConfig` gives a node project `isolate: false`, and it keeps isolation for a jsdom project, for a browser project, and for a project that declares `environmentMatchGlobs`.
|
|
167
|
+
|
|
168
|
+
Isolation gives each test FILE its own worker: Vitest spawns a process, builds the environment, and evaluates the module graph one more time. That costs about 110 ms for each file, and the full `pnpm test` run takes 90 s with isolation on every project and 62 s with this rule.
|
|
169
|
+
|
|
170
|
+
A jsdom project keeps isolation and loses no time by it, because `vmThreads` above already gives one worker to many files. It also needs isolation: `isolate: false` shares the globals between the files of one worker, and three `@xmachines/play-react` tests fail under it.
|
|
171
|
+
|
|
172
|
+
A worker that runs without isolation keeps ONE module registry for all the files that it runs, so `vi.mock` applies only while the worker has not yet loaded the real module. The order that the pool picks decides the winner, and the suite then fails on some runs and passes on others. `@xmachines/play-router` showed it: one file mocked `machine-to-graph.js` while twenty-five sibling files called the real module, and the package failed three tests on one run of the whole suite and twenty-five on the next. The file now builds a real machine, the package needs no isolation, and it runs in 1.0 s rather than 5.4 s.
|
|
173
|
+
|
|
174
|
+
**A project whose test files call `vi.mock`, `vi.doMock`, `vi.stubGlobal`, or `vi.stubEnv` declares `isolate: true` in its own `vitest.config.ts`, with the reason.** `tests/isolate-policy.test.ts` holds this rule true: it asks `vitest list` which project collects which file, reads `isolate` from the config module, and names the file and the config when the two disagree. The scan follows the relative imports of each test file and reads the setup files of the project, so a fixture that mocks a module cannot hide, and it reads each `@vitest-environment` docblock, which reaches no config. Two projects declare it today: the `play-sveltekit-router` demo, which mocks `$app/navigation`, and the `play-actor` shared example, which stubs `window`.
|
|
175
|
+
|
|
176
|
+
Prefer the other answer where you can reach it. A test that builds the real collaborator needs no isolation, and it costs the whole project nothing.
|
|
177
|
+
|
|
178
|
+
A project that gives SOME of its files another environment isolates for the same reason. Vitest builds and tears down that environment inside a worker that keeps its module registry, so a module evaluated against the jsdom of one file stays cached for the next one and holds a `window` that no longer exists. `@xmachines/play-react-router` runs three React files that way.
|
|
179
|
+
|
|
180
|
+
A spy needs no isolation, and neither do fake timers. Each patches something that the test itself owns and restores, and neither depends on a fresh module registry.
|
|
181
|
+
|
|
182
|
+
To check a project that you move off isolation, run the suite with a shuffled file order — the same check that `vitest doctor` applies:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
pnpm exec vitest run --sequence.shuffle.files
|
|
186
|
+
```
|
|
187
|
+
|
|
136
188
|
### Test helpers and shared setup
|
|
137
189
|
|
|
138
190
|
- **`@xmachines/shared/vitest-setup`** — Injects `@testing-library/jest-dom` matchers. Applied automatically by `defineXmVitestConfig`.
|
|
139
191
|
- **`@xmachines/shared/vitest-node-setup`** — Enforces Node ≥ 24 at runtime. Auto-injected for non-browser configs.
|
|
140
|
-
- **`@xmachines/shared/vitest-urlpattern-setup`** — Polyfills `URLPattern` for packages that need it (e.g. `@xmachines/play-router`). Must be declared explicitly in `setupFiles`.
|
|
141
192
|
- **`packages/play-react/test/test-utils.ts`** — React-specific test utilities for the `play-react` package.
|
|
142
193
|
- **`packages/play-router/examples/shared/`** and **`packages/play-actor/examples/shared/`** — Shared test fixtures for router and actor integration tests.
|
|
143
194
|
|
|
@@ -211,7 +262,7 @@ describe("ClassName or functionName()", () => {
|
|
|
211
262
|
**Import style:** Always use `.js` extensions in imports (ESM requirement):
|
|
212
263
|
|
|
213
264
|
```typescript
|
|
214
|
-
import {
|
|
265
|
+
import { PlayActor } from "../src/abstract-actor.js";
|
|
215
266
|
import { Signal } from "@xmachines/play-signals";
|
|
216
267
|
```
|
|
217
268
|
|
|
@@ -235,16 +286,13 @@ afterEach(() => {
|
|
|
235
286
|
- **Framework router objects** (TanStack Router, Vue Router, React Router, SolidJS Router) — mock with typed `vi.fn()` interfaces because they are external framework dependencies and carry significant setup complexity:
|
|
236
287
|
|
|
237
288
|
```typescript
|
|
238
|
-
const mocks = vi.hoisted(() => ({
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
}));
|
|
242
|
-
|
|
243
|
-
vi.mock("../src/machine-to-graph.js", () => ({
|
|
244
|
-
machineToGraph: mocks.machineToGraph,
|
|
245
|
-
}));
|
|
289
|
+
const mocks = vi.hoisted(() => ({ goto: vi.fn() }));
|
|
290
|
+
|
|
291
|
+
vi.mock("$app/navigation", () => ({ goto: mocks.goto }));
|
|
246
292
|
```
|
|
247
293
|
|
|
294
|
+
A mock of a module costs the WHOLE project its isolation — see [Isolation](#isolation). Mock the framework module, and not a module of the package under test: a test that builds the real collaborator is both cheaper and stronger.
|
|
295
|
+
|
|
248
296
|
- **`console.warn` / `console.error`** when testing code that legitimately emits warnings — mock to suppress noise and assert call counts:
|
|
249
297
|
|
|
250
298
|
```typescript
|
|
@@ -264,22 +312,20 @@ afterEach(() => {
|
|
|
264
312
|
|
|
265
313
|
### Test actor patterns
|
|
266
314
|
|
|
267
|
-
**Preferred: extend `
|
|
315
|
+
**Preferred: extend `PlayActor` for full type safety:**
|
|
268
316
|
|
|
269
317
|
```typescript
|
|
270
|
-
import {
|
|
271
|
-
import type { Routable } from "@xmachines/play-
|
|
318
|
+
import { PlayActor } from "@xmachines/play-actor";
|
|
319
|
+
import type { Routable } from "@xmachines/play-router";
|
|
272
320
|
import { Signal } from "@xmachines/play-signals";
|
|
273
|
-
import type { AnyActorLogic } from "xstate";
|
|
274
321
|
|
|
275
|
-
class MockActor
|
|
276
|
-
|
|
322
|
+
class MockActor implements PlayActor, Routable {
|
|
323
|
+
readonly state = new Signal.State({} as unknown);
|
|
277
324
|
private _routeState: Signal.State<string | null>;
|
|
278
325
|
readonly currentRoute: Signal.Computed<string | null>;
|
|
279
326
|
readonly initialRoute: string | null;
|
|
280
327
|
|
|
281
328
|
constructor(startRoute: string | null = "/") {
|
|
282
|
-
super({} as AnyActorLogic, {}); // {} as AnyActorLogic is the standard stub
|
|
283
329
|
this._routeState = new Signal.State<string | null>(startRoute);
|
|
284
330
|
this.currentRoute = new Signal.Computed(() => this._routeState.get());
|
|
285
331
|
this.initialRoute = startRoute;
|
|
@@ -297,7 +343,7 @@ class MockActor extends AbstractActor<AnyActorLogic> implements Routable {
|
|
|
297
343
|
import { stubOf } from "@xmachines/shared/test-support";
|
|
298
344
|
|
|
299
345
|
function createMockActor(initialView: PlaySpec | null = null) {
|
|
300
|
-
return stubOf<
|
|
346
|
+
return stubOf<ViewActor>({
|
|
301
347
|
currentView: new Signal.State<PlaySpec | null>(initialView),
|
|
302
348
|
send: vi.fn(),
|
|
303
349
|
start: vi.fn(),
|
|
@@ -365,10 +411,10 @@ const bad: PlaySpec = typedSpec({
|
|
|
365
411
|
expect(bad.root).toBe("root");
|
|
366
412
|
```
|
|
367
413
|
|
|
368
|
-
For purely structural type assertions with no runtime test needed, use `.typecheck.ts` files in `
|
|
414
|
+
For purely structural type assertions with no runtime test needed, use `.typecheck.ts` files in `test/`:
|
|
369
415
|
|
|
370
416
|
```typescript
|
|
371
|
-
// packages/play-xstate/
|
|
417
|
+
// packages/play-xstate/test/define-player.typecheck.ts
|
|
372
418
|
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
373
419
|
type AssertFalse<T extends false> = T;
|
|
374
420
|
|
|
@@ -400,6 +446,17 @@ try {
|
|
|
400
446
|
}
|
|
401
447
|
```
|
|
402
448
|
|
|
449
|
+
### An expected report in the log
|
|
450
|
+
|
|
451
|
+
A test that makes a component fail gets a report of the framework for free. React writes the error and a component stack to `console.error` when the root declares no `onCaughtError`, and `@xmachines/play-solid` writes a line of its own when the caller gives no `onError`. Both reports are correct, and both reach the log of the pipeline, where 29 of them once filled more than half of the `test` job.
|
|
452
|
+
|
|
453
|
+
Claim the report in the test that expects it, and assert it:
|
|
454
|
+
|
|
455
|
+
- **React.** Take `render` from `test/test-utils.js` of `@xmachines/play-react`, and not from `@testing-library/react`. It gives an `onCaughtError` to the root, which stops the print, and the result carries `caughtErrors` for an assertion. Keep the `render` of the library for a test that holds the DEFAULT report: the print of React IS the report of play-react for a caller that gives no `onError`.
|
|
456
|
+
- **Any framework.** Call `vi.spyOn(console, "error").mockImplementation(() => {})` before the render, and `expect(spy).toHaveBeenCalled()` after it. An `afterEach` with `vi.restoreAllMocks()` returns the console to the next test.
|
|
457
|
+
|
|
458
|
+
A report that a spy swallows and no assertion reads is worse than the noise, because it hides the day that the renderer stops to report.
|
|
459
|
+
|
|
403
460
|
## Contract Tests
|
|
404
461
|
|
|
405
462
|
The `@xmachines/play-router-shared` package exports a shared behavioral contract suite that all router bridge adapters must satisfy. It lives here (rather than in `@xmachines/play-router`) because the suite drives a real actor via `@xmachines/play-xstate` and uses the shared `authMachine` fixture from `@xmachines/play-actor-shared`, so it sits one layer above the router package and keeps `@xmachines/play-router` free of any dependency on the actor runtime:
|
|
@@ -448,11 +505,13 @@ Coverage is collected using the **v8** provider. The root `vitest.config.ts` def
|
|
|
448
505
|
|
|
449
506
|
Individual packages enforce their own (typically stricter) thresholds inside their `vitest.config.ts`:
|
|
450
507
|
|
|
451
|
-
| Package tier
|
|
452
|
-
|
|
|
453
|
-
| Core packages (`@xmachines/play`, `@xmachines/play-actor`)
|
|
454
|
-
| Complex logic (`@xmachines/play-xstate`, `@xmachines/play-router`)
|
|
455
|
-
| Integration packages (e.g. `@xmachines/play-react`, `@xmachines/play-dom`)
|
|
508
|
+
| Package tier | Lines | Functions | Branches | Statements |
|
|
509
|
+
| ---------------------------------------------------------------------------------- | ----- | --------- | -------- | ---------- |
|
|
510
|
+
| Core packages (`@xmachines/play`, `@xmachines/play-actor`, `@xmachines/play-view`) | 90% | 90% | 85% | 90% |
|
|
511
|
+
| Complex logic (`@xmachines/play-xstate`, `@xmachines/play-router`) | 85% | 85% | 80% | 85% |
|
|
512
|
+
| Integration packages (e.g. `@xmachines/play-react`, `@xmachines/play-dom`) | 80% | 80% | 80% | 80% |
|
|
513
|
+
|
|
514
|
+
`@xmachines/play-router` carries the lower numbers for a reason that its `vitest.config.ts` states: the bridge and the provider lifecycle are the mass of that package, and neither is measured by its own project. `@xmachines/play-router-shared` drives them through 3032 lines of contract suite, and each of the nine router adapters drives them again from its own project. The root `pnpm run test:coverage` is what measures the package whole.
|
|
456
515
|
|
|
457
516
|
Coverage includes: `src/**/*.ts`, `src/**/*.tsx`, `src/**/*.vue`, `src/**/*.svelte`
|
|
458
517
|
|
package/examples/README.md
CHANGED
|
@@ -76,12 +76,14 @@ pnpm --filter @xmachines/play-dom-router-demo run dev
|
|
|
76
76
|
|
|
77
77
|
### Core
|
|
78
78
|
|
|
79
|
-
| Package
|
|
80
|
-
|
|
|
81
|
-
| [`@xmachines/play-xstate`](../api/@xmachines/play-xstate/README.md)
|
|
82
|
-
| [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md)
|
|
83
|
-
| [`@xmachines/play-
|
|
84
|
-
| [`@xmachines/play-
|
|
79
|
+
| Package | Role |
|
|
80
|
+
| -------------------------------------------------------------------------- | ----------------------------------------------------------- |
|
|
81
|
+
| [`@xmachines/play-xstate`](../api/@xmachines/play-xstate/README.md) | `definePlayer`, `formatPlayRouteTransitions`, `PlayerActor` |
|
|
82
|
+
| [`@xmachines/play-actor`](../api/@xmachines/play-actor/README.md) | `PlayActor` |
|
|
83
|
+
| [`@xmachines/play-view`](../api/@xmachines/play-view/README.md) | `Viewable`, `PlaySpec`, `typedSpec` |
|
|
84
|
+
| [`@xmachines/play-signals`](../api/@xmachines/play-signals/README.md) | TC39 Signals polyfill, `watchSignal` |
|
|
85
|
+
| [`@xmachines/play-router`](../api/@xmachines/play-router/README.md) | `RouterBridgeBase`, `RouteMap`, `Routable` |
|
|
86
|
+
| [`@xmachines/play-router/xstate`](../api/@xmachines/play-router/README.md) | `extractMachineRoutes`, `getRoutableRoutes` |
|
|
85
87
|
|
|
86
88
|
### Renderers
|
|
87
89
|
|
|
@@ -98,7 +100,7 @@ pnpm --filter @xmachines/play-dom-router-demo run dev
|
|
|
98
100
|
| Package | Router |
|
|
99
101
|
| ------------------------------------------------------------------------------------------------- | ----------------------- |
|
|
100
102
|
| [`@xmachines/play-dom-router`](../api/@xmachines/play-dom-router/README.md) | Vanilla browser history |
|
|
101
|
-
| [`@xmachines/play-react-router`](../api/@xmachines/play-react-router/README.md) | React Router
|
|
103
|
+
| [`@xmachines/play-react-router`](../api/@xmachines/play-react-router/README.md) | React Router 7/8 |
|
|
102
104
|
| [`@xmachines/play-tanstack-react-router`](../api/@xmachines/play-tanstack-react-router/README.md) | TanStack Router (React) |
|
|
103
105
|
| [`@xmachines/play-solid-router`](../api/@xmachines/play-solid-router/README.md) | SolidJS Router |
|
|
104
106
|
| [`@xmachines/play-tanstack-solid-router`](../api/@xmachines/play-tanstack-solid-router/README.md) | TanStack Router (Solid) |
|