@xmachines/docs 2.2.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.
Files changed (483) hide show
  1. package/README.md +8 -16
  2. package/api/@xmachines/play/README.md +75 -97
  3. package/api/@xmachines/play/errors/README.md +8 -0
  4. package/api/@xmachines/play/{classes → errors/classes}/NonNullableError.md +6 -6
  5. package/api/@xmachines/play/{classes → errors/classes}/PlayError.md +35 -10
  6. package/api/@xmachines/play/index/README.md +75 -0
  7. package/api/@xmachines/play/index/functions/asCleanup.md +78 -0
  8. package/api/@xmachines/play/{functions → index/functions}/assertNonNullable.md +2 -2
  9. package/api/@xmachines/{play-actor → play/index}/functions/shallowEqualExcept.md +3 -3
  10. package/api/@xmachines/play/index/type-aliases/Cleanup.md +38 -0
  11. package/api/@xmachines/play/index/type-aliases/DisposeKey.md +32 -0
  12. package/api/@xmachines/play/{type-aliases → index/type-aliases}/PlayEvent.md +4 -4
  13. package/api/@xmachines/play/index/variables/DISPOSE.md +34 -0
  14. package/api/@xmachines/play-actor/README.md +78 -222
  15. package/api/@xmachines/play-actor/interfaces/ActorEvent.md +18 -0
  16. package/api/@xmachines/play-actor/interfaces/PlayActor.md +73 -0
  17. package/api/@xmachines/play-dom/README.md +99 -43
  18. package/api/@xmachines/play-dom/classes/PlayRenderer.md +12 -11
  19. package/api/@xmachines/play-dom/functions/asCleanup.md +78 -0
  20. package/api/@xmachines/play-dom/functions/createPlayUI.md +6 -6
  21. package/api/@xmachines/play-dom/functions/createRenderer.md +3 -3
  22. package/api/@xmachines/play-dom/interfaces/CreatePlayUIOptions.md +17 -11
  23. package/api/@xmachines/play-dom/interfaces/MountOptions.md +5 -4
  24. package/api/@xmachines/play-dom/interfaces/PlayDomOptions.md +14 -12
  25. package/api/@xmachines/play-dom/type-aliases/Cleanup.md +38 -0
  26. package/api/@xmachines/play-dom/type-aliases/MountFn.md +30 -8
  27. package/api/@xmachines/play-dom-router/README.md +99 -73
  28. package/api/@xmachines/play-dom-router/classes/DomRouterBridge.md +22 -21
  29. package/api/@xmachines/{play-vue-router → play-dom-router}/classes/RouteMap.md +12 -6
  30. package/api/@xmachines/play-dom-router/functions/asCleanup.md +78 -0
  31. package/api/@xmachines/play-dom-router/functions/connectRouter.md +3 -8
  32. package/api/@xmachines/play-dom-router/functions/createBrowserHistory.md +7 -1
  33. package/api/@xmachines/play-dom-router/functions/createRouter.md +12 -6
  34. package/api/@xmachines/play-dom-router/interfaces/BasePathOptions.md +5 -5
  35. package/api/@xmachines/play-dom-router/interfaces/BrowserHistory.md +73 -19
  36. package/api/@xmachines/play-dom-router/interfaces/BrowserWindow.md +16 -16
  37. package/api/@xmachines/play-dom-router/interfaces/ConnectRouterOptions.md +8 -8
  38. package/api/@xmachines/play-dom-router/interfaces/PlayRouteEvent.md +9 -14
  39. package/api/@xmachines/play-dom-router/interfaces/RoutableActor.md +24 -21
  40. package/api/@xmachines/play-dom-router/interfaces/RouteLookupContract.md +3 -3
  41. package/api/@xmachines/play-dom-router/interfaces/RouteMapOptions.md +4 -4
  42. package/api/@xmachines/play-dom-router/interfaces/RouteMapping.md +3 -3
  43. package/api/@xmachines/play-dom-router/interfaces/RouterBridge.md +3 -3
  44. package/api/@xmachines/play-dom-router/interfaces/RouterConnection.md +36 -7
  45. package/api/@xmachines/play-dom-router/interfaces/VanillaRouter.md +40 -6
  46. package/api/@xmachines/play-dom-router/type-aliases/Cleanup.md +38 -0
  47. package/api/@xmachines/play-dom-router/variables/DISPOSE.md +34 -0
  48. package/api/@xmachines/play-react/README.md +18 -40
  49. package/api/@xmachines/play-react/classes/PlayErrorBoundary.md +50 -11
  50. package/api/@xmachines/play-react/functions/useActor.md +1 -1
  51. package/api/@xmachines/play-react/functions/usePlayView.md +1 -1
  52. package/api/@xmachines/play-react/functions/useSignalEffect.md +1 -1
  53. package/api/@xmachines/play-react/interfaces/ActorProviderProps.md +11 -11
  54. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryProps.md +8 -6
  55. package/api/@xmachines/play-react/interfaces/PlayErrorBoundaryState.md +6 -5
  56. package/api/@xmachines/play-react/interfaces/PlayUIProviderProps.md +13 -13
  57. package/api/@xmachines/play-react/interfaces/ViewContextValue.md +8 -8
  58. package/api/@xmachines/play-react/type-aliases/AnyPlayActor.md +11 -3
  59. package/api/@xmachines/play-react/variables/ActorProvider.md +1 -1
  60. package/api/@xmachines/play-react/variables/PlayRenderer.md +1 -1
  61. package/api/@xmachines/play-react/variables/PlayUIProvider.md +1 -1
  62. package/api/@xmachines/play-react/variables/schema.md +52 -0
  63. package/api/@xmachines/play-react-router/README.md +22 -50
  64. package/api/@xmachines/play-react-router/classes/ReactRouterBridge.md +17 -16
  65. package/api/@xmachines/play-react-router/classes/RouteMap.md +11 -5
  66. package/api/@xmachines/play-react-router/functions/createPlayRouterProvider.md +11 -8
  67. package/api/@xmachines/play-react-router/functions/createRouteMapFromTree.md +16 -9
  68. package/api/@xmachines/play-react-router/interfaces/PlayRouteEvent.md +9 -14
  69. package/api/@xmachines/play-react-router/interfaces/PlayRouterProviderProps.md +10 -10
  70. package/api/@xmachines/play-react-router/interfaces/RoutableActor.md +72 -0
  71. package/api/@xmachines/play-react-router/interfaces/RouteMapOptions.md +4 -4
  72. package/api/@xmachines/play-react-router/interfaces/RouteMapping.md +3 -3
  73. package/api/@xmachines/play-react-router/interfaces/RouterBridge.md +3 -3
  74. package/api/@xmachines/play-react-router/type-aliases/PlayRouterBridgeConstructor.md +17 -7
  75. package/api/@xmachines/play-react-router/type-aliases/PlayRouterProviderBaseProps.md +5 -5
  76. package/api/@xmachines/play-react-router/variables/PlayRouterProvider.md +4 -4
  77. package/api/@xmachines/play-router/README.md +108 -189
  78. package/api/@xmachines/play-router/errors/README.md +15 -0
  79. package/api/@xmachines/play-router/errors/classes/DuplicateBridgeError.md +191 -0
  80. package/api/@xmachines/play-router/errors/classes/DuplicateRoutePathError.md +175 -0
  81. package/api/@xmachines/play-router/errors/classes/EmptyRoutePathError.md +175 -0
  82. package/api/@xmachines/play-router/errors/classes/InvalidBasePathError.md +200 -0
  83. package/api/@xmachines/play-router/errors/classes/InvalidRoutePatternError.md +203 -0
  84. package/api/@xmachines/play-router/errors/classes/InvalidStateIdError.md +175 -0
  85. package/api/@xmachines/play-router/errors/classes/MissingBasePathParamError.md +199 -0
  86. package/api/@xmachines/play-router/errors/classes/RouterSyncError.md +192 -0
  87. package/api/@xmachines/play-router/errors/classes/UnknownStateTypeError.md +182 -0
  88. package/api/@xmachines/play-router/index/README.md +75 -0
  89. package/api/@xmachines/play-router/{classes → index/classes}/RouteMap.md +12 -6
  90. package/api/@xmachines/play-router/{classes → index/classes}/RouterBridgeBase.md +19 -17
  91. package/api/@xmachines/play-router/{functions → index/functions}/buildPlayRouteEvent.md +2 -2
  92. package/api/@xmachines/play-router/{functions → index/functions}/buildRouteTree.md +14 -4
  93. package/api/@xmachines/play-router/{functions → index/functions}/cleanFrameworkParams.md +3 -4
  94. package/api/@xmachines/play-router/{functions → index/functions}/createRouteMapFromTree.md +13 -6
  95. package/api/@xmachines/play-router/{functions → index/functions}/createRouterConnection.md +2 -2
  96. package/api/@xmachines/play-router/{functions → index/functions}/detectDuplicateRoutes.md +2 -2
  97. package/api/@xmachines/play-router/{functions → index/functions}/extractQuery.md +2 -2
  98. package/api/@xmachines/play-router/{functions → index/functions}/extractRouteParams.md +3 -3
  99. package/api/@xmachines/play-router/{functions → index/functions}/findRouteById.md +2 -2
  100. package/api/@xmachines/play-router/{functions → index/functions}/findRouteByPath.md +2 -2
  101. package/api/@xmachines/play-router/index/functions/getPatternParamNames.md +29 -0
  102. package/api/@xmachines/play-router/index/functions/getRequiredPatternParamNames.md +39 -0
  103. package/api/@xmachines/play-router/{functions → index/functions}/isMountableBridge.md +2 -2
  104. package/api/@xmachines/play-router/index/functions/joinBasePath.md +37 -0
  105. package/api/@xmachines/play-router/{functions → index/functions}/mountKey.md +2 -2
  106. package/api/@xmachines/play-router/index/functions/normalizeBasePath.md +43 -0
  107. package/api/@xmachines/play-router/{functions → index/functions}/openProviderBridge.md +14 -14
  108. package/api/@xmachines/play-router/index/functions/pickOwnParams.md +41 -0
  109. package/api/@xmachines/play-router/{functions → index/functions}/repointProviderBridge.md +2 -2
  110. package/api/@xmachines/play-router/index/functions/resolveBasePath.md +51 -0
  111. package/api/@xmachines/play-router/{functions → index/functions}/resolveFrameworkParams.md +11 -13
  112. package/api/@xmachines/play-router/{functions → index/functions}/sanitizePathname.md +2 -2
  113. package/api/@xmachines/play-router/index/functions/stripBasePath.md +44 -0
  114. package/api/@xmachines/play-router/{functions → index/functions}/validateRouteFormat.md +2 -2
  115. package/api/@xmachines/play-router/{functions → index/functions}/validateStateExists.md +2 -2
  116. package/api/@xmachines/play-router/{interfaces → index/interfaces}/BasePathOptions.md +6 -6
  117. package/api/@xmachines/play-router/index/interfaces/BuildPlayRouteEventOptions.md +13 -0
  118. package/api/@xmachines/play-router/index/interfaces/FrameworkParamsSource.md +47 -0
  119. package/api/@xmachines/play-router/{interfaces → index/interfaces}/LocationLike.md +6 -6
  120. package/api/@xmachines/play-router/{interfaces → index/interfaces}/MountableRouterBridge.md +9 -9
  121. package/api/@xmachines/play-router/{interfaces → index/interfaces}/OpenProviderBridgeArgs.md +13 -13
  122. package/api/@xmachines/play-router/index/interfaces/PlayRouteEvent.md +130 -0
  123. package/api/@xmachines/play-router/{interfaces → index/interfaces}/PlayRouterProviderBaseProps.md +15 -15
  124. package/api/@xmachines/play-router/index/interfaces/ResolvedBasePath.md +14 -0
  125. package/api/@xmachines/play-router/{interfaces → index/interfaces}/ResolvedRoutePath.md +6 -6
  126. package/api/@xmachines/play-router/index/interfaces/Routable.md +26 -0
  127. package/api/@xmachines/play-router/index/interfaces/RoutableActor.md +72 -0
  128. package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteInfo.md +11 -11
  129. package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteMapOptions.md +5 -5
  130. package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteMapping.md +6 -6
  131. package/api/@xmachines/play-router/index/interfaces/RouteMatch.md +12 -0
  132. package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteNode.md +13 -13
  133. package/api/@xmachines/play-router/index/interfaces/RouteObject.md +34 -0
  134. package/api/@xmachines/play-router/index/interfaces/RouteTree.md +27 -0
  135. package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouteWatcherHandle.md +7 -7
  136. package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouterBridge.md +5 -5
  137. package/api/@xmachines/play-router/{interfaces → index/interfaces}/RouterConnection.md +38 -9
  138. package/api/@xmachines/play-router/{interfaces → index/interfaces}/WindowLike.md +4 -4
  139. package/api/@xmachines/play-router/index/type-aliases/PlayRouterBridgeConstructor.md +46 -0
  140. package/api/@xmachines/play-router/index/type-aliases/RouteData.md +12 -0
  141. package/api/@xmachines/play-router/index/type-aliases/RouteDataResolver.md +31 -0
  142. package/api/@xmachines/play-router/index/type-aliases/RouteMetadata.md +11 -0
  143. package/api/@xmachines/play-router/index/variables/DISPOSE.md +34 -0
  144. package/api/@xmachines/play-router/index/variables/NO_BASE_PATH.md +18 -0
  145. package/api/@xmachines/play-router/index/variables/ROOT_NODE_ID.md +18 -0
  146. package/api/@xmachines/play-router/xstate/README.md +53 -0
  147. package/api/@xmachines/{play-dom-router → play-router/xstate}/functions/createRouteMap.md +8 -6
  148. package/api/@xmachines/play-router/{functions → xstate/functions}/extractMachineRoutes.md +4 -4
  149. package/api/@xmachines/play-router/xstate/functions/getNavigableRoutes.md +35 -0
  150. package/api/@xmachines/play-router/{functions → xstate/functions}/getRoutableRoutes.md +6 -6
  151. package/api/@xmachines/play-router/{functions → xstate/functions}/getRouteMappings.md +7 -7
  152. package/api/@xmachines/play-router/{functions → xstate/functions}/getTransitionReachableRoutes.md +2 -2
  153. package/api/@xmachines/play-router/{functions → xstate/functions}/isRouteReachable.md +2 -2
  154. package/api/@xmachines/play-router/{functions → xstate/functions}/machineToGraph.md +2 -2
  155. package/api/@xmachines/play-router/xstate/functions/routeExists.md +26 -0
  156. package/api/@xmachines/play-router/xstate/interfaces/MachineEdgeData.md +15 -0
  157. package/api/@xmachines/play-router/xstate/interfaces/MachineNodeData.md +17 -0
  158. package/api/@xmachines/play-router/{type-aliases → xstate/type-aliases}/MachineGraph.md +2 -2
  159. package/api/@xmachines/play-signals/README.md +5 -25
  160. package/api/@xmachines/play-signals/functions/watchSignal.md +27 -4
  161. package/api/@xmachines/play-signals/interfaces/ComputedOptions.md +2 -2
  162. package/api/@xmachines/play-signals/interfaces/SignalComputed.md +2 -2
  163. package/api/@xmachines/play-signals/interfaces/SignalOptions.md +2 -2
  164. package/api/@xmachines/play-signals/interfaces/SignalState.md +3 -3
  165. package/api/@xmachines/play-signals/interfaces/SignalWatcher.md +4 -4
  166. package/api/@xmachines/play-signals/type-aliases/Cleanup.md +38 -0
  167. package/api/@xmachines/play-signals/type-aliases/WatcherNotify.md +1 -1
  168. package/api/@xmachines/play-solid/README.md +36 -35
  169. package/api/@xmachines/play-solid/functions/useActor.md +1 -1
  170. package/api/@xmachines/play-solid/functions/usePlayView.md +14 -1
  171. package/api/@xmachines/play-solid/interfaces/ActorProviderProps.md +11 -11
  172. package/api/@xmachines/play-solid/interfaces/PlayUIProviderProps.md +13 -13
  173. package/api/@xmachines/play-solid/interfaces/ViewContextValue.md +16 -8
  174. package/api/@xmachines/play-solid/type-aliases/AnyPlayActor.md +11 -3
  175. package/api/@xmachines/play-solid/variables/ActorContext.md +1 -1
  176. package/api/@xmachines/play-solid/variables/ActorProvider.md +1 -1
  177. package/api/@xmachines/play-solid/variables/PlayRenderer.md +1 -1
  178. package/api/@xmachines/play-solid/variables/PlayUIProvider.md +1 -1
  179. package/api/@xmachines/play-solid/variables/schema.md +71 -0
  180. package/api/@xmachines/play-solid-router/README.md +31 -52
  181. package/api/@xmachines/play-solid-router/classes/RouteMap.md +11 -5
  182. package/api/@xmachines/play-solid-router/classes/SolidRouterBridge.md +30 -53
  183. package/api/@xmachines/play-solid-router/functions/createPlayRouterProvider.md +9 -8
  184. package/api/@xmachines/play-solid-router/interfaces/PlayActor.md +38 -35
  185. package/api/@xmachines/play-solid-router/interfaces/PlayRouteEvent.md +9 -14
  186. package/api/@xmachines/play-solid-router/interfaces/PlayRouterProviderProps.md +12 -12
  187. package/api/@xmachines/play-solid-router/interfaces/RoutableActor.md +72 -0
  188. package/api/@xmachines/play-solid-router/interfaces/RouteMapOptions.md +4 -4
  189. package/api/@xmachines/play-solid-router/interfaces/RouteMapping.md +5 -5
  190. package/api/@xmachines/play-solid-router/interfaces/RouterBridge.md +3 -3
  191. package/api/@xmachines/play-solid-router/type-aliases/PlayRouterBridgeConstructor.md +17 -7
  192. package/api/@xmachines/play-solid-router/type-aliases/PlayRouterProviderBaseProps.md +5 -5
  193. package/api/@xmachines/play-solid-router/type-aliases/SolidRouterHooks.md +4 -4
  194. package/api/@xmachines/play-solid-router/variables/PlayRouterProvider.md +4 -4
  195. package/api/@xmachines/play-svelte/README.md +13 -28
  196. package/api/@xmachines/play-svelte/functions/defineRegistry.md +1 -1
  197. package/api/@xmachines/play-svelte/functions/getActorContext.md +1 -1
  198. package/api/@xmachines/play-svelte/functions/getPlayViewContext.md +7 -1
  199. package/api/@xmachines/play-svelte/functions/setActorContext.md +1 -1
  200. package/api/@xmachines/play-svelte/interfaces/ActorProviderProps.md +12 -12
  201. package/api/@xmachines/play-svelte/interfaces/DefineRegistryOptions.md +4 -4
  202. package/api/@xmachines/play-svelte/interfaces/PlayUIProviderProps.md +14 -14
  203. package/api/@xmachines/play-svelte/interfaces/ViewContextValue.md +8 -8
  204. package/api/@xmachines/play-svelte/type-aliases/AnyPlayActor.md +11 -3
  205. package/api/@xmachines/play-svelte/variables/schema.md +16 -0
  206. package/api/@xmachines/play-svelte-spa-router/README.md +22 -41
  207. package/api/@xmachines/play-svelte-spa-router/classes/RouteMap.md +11 -5
  208. package/api/@xmachines/play-svelte-spa-router/classes/SvelteSpaRouterBridge.md +22 -21
  209. package/api/@xmachines/play-svelte-spa-router/functions/connectRouter.md +3 -2
  210. package/api/@xmachines/play-svelte-spa-router/interfaces/BasePathOptions.md +5 -5
  211. package/api/@xmachines/play-svelte-spa-router/interfaces/ConnectRouterOptions.md +8 -8
  212. package/api/@xmachines/play-svelte-spa-router/interfaces/PlayRouteEvent.md +9 -14
  213. package/api/@xmachines/play-svelte-spa-router/interfaces/RoutableActor.md +72 -0
  214. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapOptions.md +4 -4
  215. package/api/@xmachines/play-svelte-spa-router/interfaces/RouteMapping.md +3 -3
  216. package/api/@xmachines/play-svelte-spa-router/interfaces/RouterBridge.md +3 -3
  217. package/api/@xmachines/play-svelte-spa-router/interfaces/RouterConnection.md +36 -7
  218. package/api/@xmachines/play-svelte-spa-router/interfaces/WindowLike.md +3 -3
  219. package/api/@xmachines/play-sveltekit-router/README.md +17 -35
  220. package/api/@xmachines/play-sveltekit-router/classes/RouteMap.md +11 -5
  221. package/api/@xmachines/play-sveltekit-router/classes/SvelteKitRouterBridge.md +22 -21
  222. package/api/@xmachines/play-sveltekit-router/functions/connectRouter.md +3 -2
  223. package/api/@xmachines/play-sveltekit-router/interfaces/BasePathOptions.md +5 -5
  224. package/api/@xmachines/play-sveltekit-router/interfaces/ConnectRouterOptions.md +8 -8
  225. package/api/@xmachines/play-sveltekit-router/interfaces/LocationLike.md +3 -3
  226. package/api/@xmachines/play-sveltekit-router/interfaces/PlayRouteEvent.md +9 -14
  227. package/api/@xmachines/play-sveltekit-router/interfaces/RoutableActor.md +72 -0
  228. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapOptions.md +4 -4
  229. package/api/@xmachines/play-sveltekit-router/interfaces/RouteMapping.md +3 -3
  230. package/api/@xmachines/play-sveltekit-router/interfaces/RouterBridge.md +3 -3
  231. package/api/@xmachines/play-sveltekit-router/interfaces/RouterConnection.md +36 -7
  232. package/api/@xmachines/play-tanstack-react-router/README.md +19 -43
  233. package/api/@xmachines/play-tanstack-react-router/classes/RouteMap.md +11 -5
  234. package/api/@xmachines/play-tanstack-react-router/classes/TanStackReactRouterBridge.md +18 -17
  235. package/api/@xmachines/play-tanstack-react-router/functions/createPlayRouterProvider.md +11 -8
  236. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMapFromTree.md +16 -9
  237. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouteEvent.md +9 -14
  238. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayRouterProviderProps.md +10 -10
  239. package/api/@xmachines/play-tanstack-react-router/interfaces/RoutableActor.md +72 -0
  240. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapOptions.md +4 -4
  241. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteMapping.md +3 -3
  242. package/api/@xmachines/play-tanstack-react-router/interfaces/RouterBridge.md +3 -3
  243. package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterBridgeConstructor.md +17 -7
  244. package/api/@xmachines/play-tanstack-react-router/type-aliases/PlayRouterProviderBaseProps.md +5 -5
  245. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterInstance.md +1 -1
  246. package/api/@xmachines/play-tanstack-react-router/type-aliases/TanStackRouterLike.md +5 -5
  247. package/api/@xmachines/play-tanstack-react-router/variables/PlayRouterProvider.md +4 -4
  248. package/api/@xmachines/play-tanstack-router/README.md +6 -4
  249. package/api/@xmachines/play-tanstack-router/classes/TanStackRouterBridgeBase.md +17 -20
  250. package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouteMapLike.md +3 -3
  251. package/api/@xmachines/play-tanstack-router/type-aliases/TanStackRouterLike.md +5 -5
  252. package/api/@xmachines/play-tanstack-solid-router/README.md +26 -52
  253. package/api/@xmachines/play-tanstack-solid-router/classes/RouteMap.md +11 -5
  254. package/api/@xmachines/play-tanstack-solid-router/classes/TanStackSolidRouterBridge.md +49 -45
  255. package/api/@xmachines/play-tanstack-solid-router/functions/createPlayRouterProvider.md +9 -8
  256. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouteEvent.md +9 -14
  257. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayRouterProviderProps.md +10 -10
  258. package/api/@xmachines/play-tanstack-solid-router/interfaces/RoutableActor.md +72 -0
  259. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapOptions.md +4 -4
  260. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouteMapping.md +3 -3
  261. package/api/@xmachines/play-tanstack-solid-router/interfaces/RouterBridge.md +3 -3
  262. package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterBridgeConstructor.md +17 -7
  263. package/api/@xmachines/play-tanstack-solid-router/type-aliases/PlayRouterProviderBaseProps.md +5 -5
  264. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterInstance.md +1 -1
  265. package/api/@xmachines/play-tanstack-solid-router/type-aliases/TanStackRouterLike.md +5 -5
  266. package/api/@xmachines/play-tanstack-solid-router/variables/PlayRouterProvider.md +4 -4
  267. package/api/@xmachines/play-url/README.md +69 -0
  268. package/api/@xmachines/play-url/errors/README.md +17 -0
  269. package/api/@xmachines/play-url/errors/classes/InvalidBasePathError.md +200 -0
  270. package/api/@xmachines/play-url/errors/classes/InvalidRoutePatternError.md +203 -0
  271. package/api/@xmachines/play-url/errors/classes/MissingBasePathParamError.md +199 -0
  272. package/api/@xmachines/play-url/index/README.md +65 -0
  273. package/api/@xmachines/play-url/index/functions/cleanFrameworkParams.md +39 -0
  274. package/api/@xmachines/play-url/index/functions/getCandidates.md +29 -0
  275. package/api/@xmachines/play-url/index/functions/getCompiledPattern.md +31 -0
  276. package/api/@xmachines/play-url/index/functions/getIndexKey.md +30 -0
  277. package/api/@xmachines/play-url/index/functions/getNormalizedParamNameMap.md +32 -0
  278. package/api/@xmachines/play-url/index/functions/getPatternParamNames.md +29 -0
  279. package/api/@xmachines/play-url/index/functions/getRequiredPatternParamNames.md +39 -0
  280. package/api/@xmachines/play-url/index/functions/holdsUnsubstitutedParam.md +36 -0
  281. package/api/@xmachines/play-url/index/functions/isParameterizedPattern.md +36 -0
  282. package/api/@xmachines/{play-router → play-url/index}/functions/joinBasePath.md +2 -2
  283. package/api/@xmachines/{play-router → play-url/index}/functions/normalizeBasePath.md +2 -2
  284. package/api/@xmachines/play-url/index/functions/normalizeParamNames.md +36 -0
  285. package/api/@xmachines/play-url/index/functions/parsePattern.md +27 -0
  286. package/api/@xmachines/{play-router → play-url/index}/functions/pickOwnParams.md +4 -4
  287. package/api/@xmachines/{play-router → play-url/index}/functions/resolveBasePath.md +2 -2
  288. package/api/@xmachines/play-url/index/functions/resolveFrameworkParams.md +49 -0
  289. package/api/@xmachines/{play-router → play-url/index}/functions/stripBasePath.md +2 -2
  290. package/api/@xmachines/play-url/index/interfaces/BasePathOptions.md +28 -0
  291. package/api/@xmachines/{play-router → play-url/index}/interfaces/FrameworkParamsSource.md +9 -9
  292. package/api/@xmachines/play-url/index/interfaces/GroupPart.md +15 -0
  293. package/api/@xmachines/play-url/index/interfaces/LiteralPart.md +14 -0
  294. package/api/@xmachines/play-url/index/interfaces/ParamPart.md +21 -0
  295. package/api/@xmachines/play-url/index/interfaces/ParsedPattern.md +23 -0
  296. package/api/@xmachines/play-url/index/interfaces/PatternParam.md +15 -0
  297. package/api/@xmachines/{play-router → play-url/index}/interfaces/ResolvedBasePath.md +6 -6
  298. package/api/@xmachines/play-url/index/type-aliases/PatternModifier.md +11 -0
  299. package/api/@xmachines/play-url/index/type-aliases/PatternPart.md +9 -0
  300. package/api/@xmachines/play-url/index/type-aliases/URLPatternCtor.md +22 -0
  301. package/api/@xmachines/play-url/index/type-aliases/URLPatternLike.md +68 -0
  302. package/api/@xmachines/{play-router → play-url/index}/variables/NO_BASE_PATH.md +2 -2
  303. package/api/@xmachines/play-url/index/variables/URLPattern.md +21 -0
  304. package/api/@xmachines/play-view/README.md +165 -0
  305. package/api/@xmachines/play-view/errors/README.md +17 -0
  306. package/api/@xmachines/play-view/errors/classes/ReadOnlyContextError.md +192 -0
  307. package/api/@xmachines/play-view/index/README.md +55 -0
  308. package/api/@xmachines/{play-actor → play-view/index}/functions/attachRenderErrorHandler.md +6 -6
  309. package/api/@xmachines/{play-actor → play-view/index}/functions/composePlayState.md +2 -2
  310. package/api/@xmachines/play-view/index/functions/createFailureLatch.md +20 -0
  311. package/api/@xmachines/play-view/index/functions/createReportGuard.md +26 -0
  312. package/api/@xmachines/{play-actor → play-view/index}/functions/createViewStoreLifecycle.md +2 -2
  313. package/api/@xmachines/{play-actor → play-view/index}/functions/guardContextWrites.md +2 -2
  314. package/api/@xmachines/{play-actor → play-view/index}/functions/refreshContextSubtree.md +2 -2
  315. package/api/@xmachines/{play-actor → play-view/index}/functions/reuseComposedState.md +3 -3
  316. package/api/@xmachines/play-view/index/functions/sameViewInputs.md +25 -0
  317. package/api/@xmachines/{play-actor → play-view/index}/functions/toAtomState.md +2 -2
  318. package/api/@xmachines/{play-actor → play-view/index}/functions/typedSpec.md +2 -2
  319. package/api/@xmachines/play-view/index/interfaces/BaseActorProviderProps.md +49 -0
  320. package/api/@xmachines/{play-actor → play-view/index}/interfaces/BaseViewContextValue.md +12 -12
  321. package/api/@xmachines/play-view/index/interfaces/FailureLatch.md +60 -0
  322. package/api/@xmachines/{play-actor → play-view/index}/interfaces/PlaySpec.md +8 -8
  323. package/api/@xmachines/play-view/index/interfaces/ReportGuard.md +92 -0
  324. package/api/@xmachines/play-view/index/interfaces/ReportGuardMessages.md +18 -0
  325. package/api/@xmachines/{play-actor → play-view/index}/interfaces/ResolveViewStoreOptions.md +5 -5
  326. package/api/@xmachines/play-view/index/interfaces/ViewInputs.md +19 -0
  327. package/api/@xmachines/{play-actor → play-view/index}/interfaces/ViewStoreLifecycle.md +6 -5
  328. package/api/@xmachines/{play-actor → play-view/index}/interfaces/ViewStoreResolution.md +7 -7
  329. package/api/@xmachines/{play-actor → play-view/index}/interfaces/Viewable.md +5 -5
  330. package/api/@xmachines/play-view/index/type-aliases/ViewActor.md +26 -0
  331. package/api/@xmachines/{play-actor → play-view/index}/variables/CONTEXT_STATE_KEY.md +2 -2
  332. package/api/@xmachines/play-vue/README.md +46 -42
  333. package/api/@xmachines/play-vue/functions/defineRegistry.md +1 -1
  334. package/api/@xmachines/play-vue/functions/useActor.md +1 -1
  335. package/api/@xmachines/play-vue/functions/usePlayView.md +6 -1
  336. package/api/@xmachines/play-vue/interfaces/ActorProviderProps.md +13 -8
  337. package/api/@xmachines/play-vue/interfaces/PlayUIProviderProps.md +15 -10
  338. package/api/@xmachines/play-vue/interfaces/ViewContextValue.md +8 -8
  339. package/api/@xmachines/play-vue/type-aliases/AnyPlayActor.md +11 -3
  340. package/api/@xmachines/play-vue/type-aliases/ComponentEntry.md +1 -1
  341. package/api/@xmachines/play-vue/type-aliases/ComponentsMap.md +1 -1
  342. package/api/@xmachines/play-vue/type-aliases/DefineRegistryOptions.md +2 -2
  343. package/api/@xmachines/play-vue/variables/PlayRenderer.md +1 -1
  344. package/api/@xmachines/play-vue/variables/schema.md +71 -0
  345. package/api/@xmachines/play-vue-router/README.md +34 -77
  346. package/api/@xmachines/play-vue-router/errors/README.md +8 -0
  347. package/api/@xmachines/play-vue-router/errors/classes/VueRouterNavigationError.md +193 -0
  348. package/api/@xmachines/play-vue-router/errors/classes/VueRouterSendError.md +177 -0
  349. package/api/@xmachines/play-vue-router/index/README.md +20 -0
  350. package/api/@xmachines/play-vue-router/index/classes/RouteMap.md +157 -0
  351. package/api/@xmachines/play-vue-router/{classes → index/classes}/VueRouterBridge.md +24 -43
  352. package/api/@xmachines/play-vue-router/index/interfaces/PlayRouteEvent.md +130 -0
  353. package/api/@xmachines/play-vue-router/index/interfaces/RoutableActor.md +72 -0
  354. package/api/@xmachines/play-vue-router/{interfaces → index/interfaces}/RouteMapOptions.md +5 -5
  355. package/api/@xmachines/play-vue-router/{interfaces → index/interfaces}/RouteMapping.md +6 -6
  356. package/api/@xmachines/play-vue-router/{interfaces → index/interfaces}/RouterBridge.md +5 -5
  357. package/api/@xmachines/play-vue-router/{variables → index/variables}/PlayRouterProvider.md +4 -4
  358. package/api/@xmachines/play-xstate/README.md +163 -98
  359. package/api/@xmachines/play-xstate/errors/README.md +13 -0
  360. package/api/@xmachines/play-xstate/errors/classes/ActorThrewNonErrorError.md +199 -0
  361. package/api/@xmachines/play-xstate/errors/classes/InvalidEventError.md +198 -0
  362. package/api/@xmachines/play-xstate/errors/classes/InvalidMachineError.md +169 -0
  363. package/api/@xmachines/play-xstate/errors/classes/InvalidRouteHandlerError.md +197 -0
  364. package/api/@xmachines/play-xstate/errors/classes/InvalidRouteMetadataError.md +176 -0
  365. package/api/@xmachines/play-xstate/errors/classes/MissingRouteParamError.md +199 -0
  366. package/api/@xmachines/play-xstate/errors/classes/MissingStateIdError.md +203 -0
  367. package/api/@xmachines/play-xstate/index/README.md +38 -0
  368. package/api/@xmachines/play-xstate/index/classes/PlayerActor.md +584 -0
  369. package/api/@xmachines/play-xstate/index/functions/compose.md +224 -0
  370. package/api/@xmachines/play-xstate/index/functions/definePlayer.md +158 -0
  371. package/api/@xmachines/play-xstate/index/interfaces/PlayerConfig.md +22 -0
  372. package/api/@xmachines/play-xstate/{interfaces → index/interfaces}/PlayerFactoryResumeOptions.md +3 -3
  373. package/api/@xmachines/play-xstate/{interfaces → index/interfaces}/PlayerOptions.md +8 -8
  374. package/api/@xmachines/play-xstate/index/type-aliases/Capability.md +33 -0
  375. package/api/@xmachines/play-xstate/index/type-aliases/PlayerConstructor.md +39 -0
  376. package/api/@xmachines/play-xstate/index/type-aliases/PlayerFactory.md +27 -0
  377. package/api/@xmachines/play-xstate/index/variables/DISPOSE.md +34 -0
  378. package/api/@xmachines/play-xstate/with-routing/README.md +46 -0
  379. package/api/@xmachines/play-xstate/{functions → with-routing/functions}/buildRouteUrl.md +2 -2
  380. package/api/@xmachines/play-xstate/{functions → with-routing/functions}/deriveRoute.md +4 -4
  381. package/api/@xmachines/play-xstate/{functions → with-routing/functions}/formatPlayRouteTransitions.md +2 -2
  382. package/api/@xmachines/play-xstate/{functions → with-routing/functions}/isAbsoluteRoute.md +3 -3
  383. package/api/@xmachines/play-xstate/with-routing/functions/withRouting.md +36 -0
  384. package/api/@xmachines/play-xstate/{interfaces → with-routing/interfaces}/RouteContext.md +6 -6
  385. package/api/@xmachines/play-xstate/with-routing/interfaces/RouteObject.md +34 -0
  386. package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteData.md +12 -0
  387. package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteDataResolver.md +31 -0
  388. package/api/@xmachines/play-xstate/{type-aliases → with-routing/type-aliases}/RouteMachineConfig.md +5 -5
  389. package/api/@xmachines/play-xstate/with-routing/type-aliases/RouteMetadata.md +11 -0
  390. package/api/@xmachines/play-xstate/{type-aliases → with-routing/type-aliases}/RouteStateNode.md +21 -7
  391. package/api/@xmachines/play-xstate/with-view/README.md +31 -0
  392. package/api/@xmachines/play-xstate/with-view/functions/withView.md +32 -0
  393. package/api/@xmachines/shared/README.md +10 -32
  394. package/api/@xmachines/shared/vite-aliases/functions/xmAliases.md +1 -1
  395. package/api/@xmachines/shared/vite-aliases/functions/xmCacheDir.md +1 -1
  396. package/api/@xmachines/shared/vite-aliases/functions/xmOptimizeDeps.md +1 -1
  397. package/api/@xmachines/shared/vite-aliases/functions/xmResolve.md +1 -1
  398. package/api/@xmachines/shared/vite-aliases/functions/xmSvelteRunes.md +2 -2
  399. package/api/@xmachines/shared/vitest/functions/defineXmBrowserConfig.md +1 -1
  400. package/api/@xmachines/shared/vitest/functions/defineXmVitestConfig.md +2 -1
  401. package/api/@xmachines/shared/vitest/interfaces/XmBrowserConfigOptions.md +4 -4
  402. package/api/README.md +2 -0
  403. package/api/llms.txt +15 -10
  404. package/contributing/architecture.md +97 -65
  405. package/contributing/configuration.md +142 -41
  406. package/contributing/deployment.md +30 -28
  407. package/contributing/development.md +94 -31
  408. package/contributing/testing.md +90 -31
  409. package/examples/README.md +9 -7
  410. package/examples/form-validation.md +3 -2
  411. package/examples/multi-router-integration.md +61 -39
  412. package/examples/routing-patterns.md +15 -14
  413. package/examples/traffic-light.md +11 -5
  414. package/guides/README.md +1 -0
  415. package/guides/actor-model.md +35 -26
  416. package/guides/getting-started.md +47 -44
  417. package/guides/inspector.md +4 -4
  418. package/guides/routing.md +245 -0
  419. package/guides/signals.md +43 -0
  420. package/guides/state-machines.md +16 -17
  421. package/package.json +10 -9
  422. package/rfc/play.md +35 -22
  423. package/api/@xmachines/play-actor/classes/AbstractActor.md +0 -505
  424. package/api/@xmachines/play-actor/interfaces/BaseActorProviderProps.md +0 -48
  425. package/api/@xmachines/play-actor/interfaces/Routable.md +0 -14
  426. package/api/@xmachines/play-dom-router/interfaces/RouteMap.md +0 -122
  427. package/api/@xmachines/play-react/type-aliases/PlayRendererProps.md +0 -13
  428. package/api/@xmachines/play-react-router/functions/createRouteMap.md +0 -40
  429. package/api/@xmachines/play-react-router/interfaces/PlayActor.md +0 -70
  430. package/api/@xmachines/play-router/functions/createRouteMap.md +0 -40
  431. package/api/@xmachines/play-router/functions/getNavigableRoutes.md +0 -35
  432. package/api/@xmachines/play-router/functions/getPatternParamNames.md +0 -24
  433. package/api/@xmachines/play-router/functions/getRequiredPatternParamNames.md +0 -36
  434. package/api/@xmachines/play-router/functions/routeExists.md +0 -26
  435. package/api/@xmachines/play-router/interfaces/BuildPlayRouteEventOptions.md +0 -13
  436. package/api/@xmachines/play-router/interfaces/MachineEdgeData.md +0 -15
  437. package/api/@xmachines/play-router/interfaces/MachineNodeData.md +0 -17
  438. package/api/@xmachines/play-router/interfaces/PlayActor.md +0 -70
  439. package/api/@xmachines/play-router/interfaces/PlayRouteEvent.md +0 -135
  440. package/api/@xmachines/play-router/interfaces/RoutableActor.md +0 -65
  441. package/api/@xmachines/play-router/interfaces/RouteMatch.md +0 -12
  442. package/api/@xmachines/play-router/interfaces/RouteObject.md +0 -21
  443. package/api/@xmachines/play-router/interfaces/RouteTree.md +0 -21
  444. package/api/@xmachines/play-router/type-aliases/BaseRouteMapping.md +0 -13
  445. package/api/@xmachines/play-router/type-aliases/PlayRouterBridgeConstructor.md +0 -36
  446. package/api/@xmachines/play-router/type-aliases/RouteMetadata.md +0 -11
  447. package/api/@xmachines/play-solid-router/functions/createRouteMap.md +0 -40
  448. package/api/@xmachines/play-solid-router/interfaces/AbstractActor.md +0 -471
  449. package/api/@xmachines/play-solid-router/type-aliases/RoutableActor.md +0 -13
  450. package/api/@xmachines/play-svelte-spa-router/functions/createRouteMap.md +0 -40
  451. package/api/@xmachines/play-svelte-spa-router/type-aliases/RoutableActor.md +0 -9
  452. package/api/@xmachines/play-sveltekit-router/functions/createRouteMap.md +0 -40
  453. package/api/@xmachines/play-sveltekit-router/type-aliases/RoutableActor.md +0 -9
  454. package/api/@xmachines/play-tanstack-react-router/functions/createRouteMap.md +0 -40
  455. package/api/@xmachines/play-tanstack-react-router/functions/extractMachineRoutes.md +0 -29
  456. package/api/@xmachines/play-tanstack-react-router/interfaces/PlayActor.md +0 -70
  457. package/api/@xmachines/play-tanstack-react-router/interfaces/RouteNavigateEvent.md +0 -31
  458. package/api/@xmachines/play-tanstack-solid-router/functions/createRouteMap.md +0 -40
  459. package/api/@xmachines/play-tanstack-solid-router/interfaces/PlayActor.md +0 -70
  460. package/api/@xmachines/play-tanstack-solid-router/type-aliases/RoutableActor.md +0 -13
  461. package/api/@xmachines/play-vue/interfaces/VisibilityProviderProps.md +0 -9
  462. package/api/@xmachines/play-vue/variables/getPlayViewContext.md +0 -34
  463. package/api/@xmachines/play-vue-router/functions/createRouteMap.md +0 -40
  464. package/api/@xmachines/play-vue-router/interfaces/PlayActor.md +0 -70
  465. package/api/@xmachines/play-vue-router/interfaces/PlayRouteEvent.md +0 -135
  466. package/api/@xmachines/play-vue-router/type-aliases/RoutableActor.md +0 -13
  467. package/api/@xmachines/play-vue-router/type-aliases/VueRouteMap.md +0 -13
  468. package/api/@xmachines/play-vue-router/variables/VueRouteMap.md +0 -13
  469. package/api/@xmachines/play-xstate/classes/PlayerActor.md +0 -532
  470. package/api/@xmachines/play-xstate/functions/composeGuards.md +0 -86
  471. package/api/@xmachines/play-xstate/functions/composeGuardsOr.md +0 -72
  472. package/api/@xmachines/play-xstate/functions/contextFieldMatches.md +0 -43
  473. package/api/@xmachines/play-xstate/functions/definePlayer.md +0 -78
  474. package/api/@xmachines/play-xstate/functions/eventMatches.md +0 -45
  475. package/api/@xmachines/play-xstate/functions/hasContext.md +0 -45
  476. package/api/@xmachines/play-xstate/functions/negateGuard.md +0 -67
  477. package/api/@xmachines/play-xstate/interfaces/PlayerConfig.md +0 -20
  478. package/api/@xmachines/play-xstate/interfaces/RouteObject.md +0 -17
  479. package/api/@xmachines/play-xstate/type-aliases/ComposedGuard.md +0 -19
  480. package/api/@xmachines/play-xstate/type-aliases/Guard.md +0 -36
  481. package/api/@xmachines/play-xstate/type-aliases/GuardArray.md +0 -23
  482. package/api/@xmachines/play-xstate/type-aliases/PlayerFactory.md +0 -26
  483. 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
- ```bash
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
- # Skip all demo publish steps
30
- SEMREL_SKIP_STEPS="examples/demo"
27
+ ```bash
28
+ # Skip one prepare step
29
+ SEMREL_SKIP_STEPS="@semantic-release/exec:build$"
31
30
 
32
- # Skip all exec steps (build, typedoc, etc.)
31
+ # Skip every prepare step
33
32
  SEMREL_SKIP_STEPS="@semantic-release/exec"
34
33
 
35
- # Publish-only retry (skip build + demos)
36
- SEMREL_SKIP_STEPS="@semantic-release/exec|examples/demo"
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
@@ -47,21 +47,22 @@ SEMREL_SKIP_STEPS="@semantic-release/git|@semantic-release/gitlab"
47
47
 
48
48
  **Location:** `/tsconfig.json`
49
49
 
50
- The root TypeScript config is a **build coordinator only** — it compiles nothing itself. It lists every package and example via `references` so that `tsc --build` can determine the correct build order automatically.
50
+ The root TypeScript config is a **build coordinator only** — it compiles nothing itself. It lists every package and example via `references`, and that array is the whole build order: TypeScript does not inherit `references` through `extends`, so a package declares none of its own. `tests/tsconfig-reference-graph.test.ts` fails when the array misses a project or lists a package before something it imports.
51
51
 
52
52
  ```json
53
53
  {
54
54
  "files": [],
55
55
  "references": [
56
56
  // Layer 0 — no internal deps
57
- { "path": "./packages/play-signals" },
58
- { "path": "./packages/play" },
59
57
  { "path": "./packages/docs" },
58
+ { "path": "./packages/play" },
59
+ { "path": "./packages/shared" },
60
60
  // Layer 1 — depends on Layer 0
61
+ { "path": "./packages/play-signals" },
62
+ // Layer 2
61
63
  { "path": "./packages/play-actor" },
62
- // Layer 2 — depends on Layer 0 + 1
63
- { "path": "./packages/play-router" },
64
- { "path": "./packages/play-xstate" }
64
+ // Layer 3
65
+ { "path": "./packages/play-router" }
65
66
  // ...etc.
66
67
  ]
67
68
  }
@@ -80,7 +81,7 @@ All packages extend this base. Key compiler settings:
80
81
 
81
82
  | Setting | Value | Notes |
82
83
  | ---------------------------- | ------------ | -------------------------------------------------------- |
83
- | `target` | `ESNext` | Latest ECMAScript output |
84
+ | `target` | `ESNext` | Latest ECMAScript output. See the two passes below |
84
85
  | `module` | `NodeNext` | ESM with `.js` extension imports required |
85
86
  | `moduleResolution` | `NodeNext` | Matches `module` setting |
86
87
  | `customConditions` | `["source"]` | Resolves `@xmachines/*` to TypeScript source in dev/test |
@@ -98,6 +99,31 @@ All packages extend this base. Key compiler settings:
98
99
  | `isolatedModules` | `true` | |
99
100
  | `removeComments` | `false` | Preserves JSDoc in output |
100
101
 
102
+ **Two passes emit, and `emitDeclarationOnly` decides which one ships.** `build` is
103
+ `vite build && tsc --build`, so tsc runs last.
104
+
105
+ - **Fourteen publishable packages** let tsc emit JavaScript. tsc overwrites the Vite pass,
106
+ and `compilerOptions.target` above is what governs the published `dist/*.js`.
107
+ - **Five** — play-vue, play-svelte, play-solid, play-solid-router,
108
+ play-tanstack-solid-router — set `emitDeclarationOnly`, so tsc emits only `.d.ts` and the
109
+ Vite pass is the published JavaScript. `build.target` governs theirs.
110
+
111
+ Vite inherits no target from the tsconfig. It reads `compilerOptions.target` for one
112
+ purpose: to pick the `useDefineForClassFields` default that it gives the transform. The
113
+ syntax level of the Vite pass comes from `build.target`, which
114
+ `packages/shared/config/vite.ts` sets — `"esnext"` for a publishable package, and an
115
+ explicit browser list for a demo app.
116
+
117
+ Leave both stated, and keep both at ESNext for a library. A package that inherits the Vite
118
+ default builds against a browser baseline, which is a second and lower ceiling than the one
119
+ this table declares — and it is the ceiling that ships for those five.
120
+
121
+ **A demo states an explicit browser list, and not `baseline-widely-available`.** A target
122
+ controls syntax and adds no method. `baseline-widely-available` of Vite 8 names
123
+ `firefox114`, the demos bundle `play-router`, and `play-router` calls `toSorted()`, which
124
+ shipped in Firefox 115. The list in `vite.ts` therefore raises that one entry, so the
125
+ declared floor is the floor the bundle runs on.
126
+
101
127
  **Per-package `tsconfig.json` pattern:**
102
128
 
103
129
  ```json
@@ -107,11 +133,12 @@ All packages extend this base. Key compiler settings:
107
133
  "composite": true,
108
134
  "rootDir": "./src",
109
135
  "outDir": "./dist"
110
- },
111
- "references": [{ "path": "../dependency-package" }]
136
+ }
112
137
  }
113
138
  ```
114
139
 
140
+ A package declares no `references`. Its dependencies live in `package.json`, and the root array orders the build.
141
+
115
142
  **Test tsconfig (`@xmachines/shared/tsconfig-test`):**
116
143
 
117
144
  **Location:** `packages/shared/config/tsconfig.test.json`
@@ -154,6 +181,20 @@ export default defineConfig({
154
181
  | `typescript/no-explicit-any` | — | `error` |
155
182
  | `typescript/no-unused-vars` | — | `error` (ignores `_` prefixed names) |
156
183
  | `unicorn/filename-case` | — | `off` |
184
+ | `unicorn/no-array-sort` | — | `error` |
185
+ | `no-underscore-dangle` | — | `off` |
186
+
187
+ `unicorn/no-array-sort` is an error and not the warning of its category. The workspace
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
+ the lint job green while the Code Quality report showed the degradation, and `sort()` stayed
191
+ behind a suppression for a ceiling that had already gone.
192
+
193
+ `no-underscore-dangle` is off because it contradicts `typescript/no-unused-vars`, which
194
+ declares `^_` as the mark of a binding that exists on purpose and that nothing reads. A
195
+ `using` declaration is the case that makes the contradiction concrete: the scope reads the
196
+ binding through `Symbol.dispose`, the linter sees no read, and the `_` that answers one rule
197
+ trips the other.
157
198
 
158
199
  **Per-package override pattern:**
159
200
 
@@ -211,6 +252,64 @@ export default defineConfig({
211
252
  | `useTabs` | `false` |
212
253
  | `tabWidth` | `2` |
213
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
+
214
313
  ### Editor — `.editorconfig`
215
314
 
216
315
  **Location:** `/.editorconfig`
@@ -232,15 +331,15 @@ export default defineConfig({
232
331
 
233
332
  Root Vitest config is a **workspace coordinator** that lists all per-package configs under `test.projects`. It sets conservative monorepo-wide defaults:
234
333
 
235
- | Setting | Value | Notes |
236
- | ----------------- | ---------- | ------------------------------------------------------ |
237
- | `pool` | `"forks"` | Process-isolated workers |
238
- | `maxWorkers` | `4` | Root default; per-project configs may override |
239
- | `isolate` | `true` | |
240
- | `fileParallelism` | `false` | Conservative default; safe packages opt in with `true` |
241
- | `teardownTimeout` | `30000` ms | |
242
- | `hookTimeout` | `30000` ms | |
243
- | `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 | |
244
343
 
245
344
  **Coverage thresholds** (monorepo aggregate — `vitest run --coverage`):
246
345
 
@@ -326,11 +425,12 @@ Only `main` is a protected branch today. That works because `GITLAB_TOKEN` — w
326
425
  - `build` — `pnpm run build`
327
426
  - `typedoc` — `pnpm --filter @xmachines/docs run typedoc`
328
427
  - `format-docs` — `pnpm --filter @xmachines/docs run format`
329
- 5. `@semantic-release/npm` — one entry per published package (20 packages) + pack-only for demo apps
330
- 6. `@semantic-release/git` — commits `CHANGELOG.md`, updated `package.json` files, and generated API docs
331
- 7. `@semantic-release/gitlab` — creates a GitLab release with tarball assets
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.
332
432
 
333
- Any step can be skipped via the `SEMREL_SKIP_STEPS` CI variable (see [Environment Variables](#environment-variables)).
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.
334
434
 
335
435
  ---
336
436
 
@@ -344,14 +444,15 @@ The only environment-specific distinction is between **local development** (dev
344
444
 
345
445
  ## Required vs Optional Settings Summary
346
446
 
347
- | Config | Required to Work | Optional / Has Default |
348
- | ------------------------------------ | ------------------------------------- | ----------------------------- |
349
- | `SEMREL_SKIP_STEPS` | No | Default: `""` (run all steps) |
350
- | Root `tsconfig.json` `references` | Yes — must list all packages | — |
351
- | Per-package `composite: true` | Yesrequired for project references | — |
352
- | `@xmachines/shared/tsconfig` extends | Yes — all packages must extend it | — |
353
- | `@xmachines/shared/oxlint` extends | Yes — all packages must extend it | — |
354
- | `@xmachines/shared/oxfmt` extends | Yes — all packages must extend it | — |
447
+ | Config | Required to Work | Optional / Has Default |
448
+ | ------------------------------------ | --------------------------------------- | ----------------------------- |
449
+ | `SEMREL_SKIP_STEPS` | No | Default: `""` (run all steps) |
450
+ | Root `tsconfig.json` `references` | Yes — the whole build order | — |
451
+ | Per-package `references` | NoTypeScript drops them on `extends` | — |
452
+ | Per-package `composite: true` | Yes — required for project references | — |
453
+ | `@xmachines/shared/tsconfig` extends | Yes — all packages must extend it | — |
454
+ | `@xmachines/shared/oxlint` extends | Yes — all packages must extend it | — |
455
+ | `@xmachines/shared/oxfmt` extends | Yes — all packages must extend it | — |
355
456
 
356
457
  ---
357
458
 
@@ -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 | Purpose |
12
- | --------------- | ------------------------------------------------------------------------- | ------------------------------------------------------ |
13
- | npm registry | `release.config.mjs` (npm plugin entries derived from the workspace scan) | Publish all public packages |
14
- | GitLab Releases | `release.config.mjs` (`@semantic-release/gitlab` plugin) | Attach tarball artifacts to the GitLab release tag |
15
- | GitLab CI | `.gitlab-ci.yml` | Trigger builds, tests, and releases on push / MR / tag |
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. Reads `release.config.mjs` to find all `@semantic-release/npm` plugin entries where `npmPublish` is not `false`.
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
- Each publishable package is published in sequence via individual `@semantic-release/npm` plugin entries. Each entry specifies:
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
- - `pkgRoot` — the package directory relative to the workspace root
174
- - `tarballDir` — `dist/releases/` where the packed `.tgz` is saved
175
+ ```bash
176
+ node scripts/publish-release.mjs
177
+ ```
175
178
 
176
- Example (from `release.config.mjs`, where these entries are generated rather than
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
- ```js
180
- ["@semantic-release/npm", { pkgRoot: "packages/play", tarballDir: "dist/releases" }];
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
- After all packages are published:
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 `package-lock.json` (root)
190
- - `packages/*/{package.json,examples/*/package.json}` (all workspace packages)
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
- 2. **`@semantic-release/gitlab`** creates a GitLab Release entry attached to the version tag, with all `dist/releases/*.tgz` tarballs as downloadable assets labelled "Release tarballs".
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
- 3. **`@semantic-release/changelog`** updates `CHANGELOG.md` with generated release notes.
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 `@semantic-release/gitlab` for release creation and git push back |
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
 
@@ -20,7 +20,7 @@ This guide covers everything you need to set up a local development environment,
20
20
 
21
21
  ### Prerequisites
22
22
 
23
- - **Node.js** `>= 22.0.0`
23
+ - **Node.js** `>= 24.0.0` (the suite writes `using`, which needs V8 13.4)
24
24
  - **pnpm** via corepack (`corepack enable`; version pinned by the `packageManager` field — the project uses pnpm workspaces)
25
25
  - **Git**
26
26
 
@@ -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-actor/ # Abstract actor base (AbstractActor, Routable, Viewable)
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 v7 adapter
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
@@ -198,52 +216,73 @@ The monorepo uses **TypeScript project references** for correct build-order mana
198
216
 
199
217
  Packages are grouped into dependency layers as defined in the root `tsconfig.json`:
200
218
 
201
- | Layer | Packages | Depends on |
202
- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
203
- | 0 | `play-signals`, `play`, `docs` | External libs only |
204
- | 1 | `play-actor` | Layer 0 |
205
- | 2 | `play-router`, `play-dom-router`, `play-sveltekit-router`, `play-xstate`, `play-react`, `play-vue`, `play-solid`, `play-svelte`, `play-dom`, `play-tanstack-react-router`, `play-vue-router`, `play-solid-router`, `play-svelte-spa-router`, `play-tanstack-solid-router` | Layers 0–1 |
206
- | 3 | `play-react-router`, example demo apps | Layer 2 |
219
+ | Layer | Packages | Depends on |
220
+ | ----- | -------------------------------------------------------------------------------- | ------------------ |
221
+ | 0 | `docs`, `play`, `shared` | External libs only |
222
+ | 1 | `play-signals`, `play-url` | Layer 0 |
223
+ | 2 | `play-actor` | Layers 0–1 |
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 |
231
+
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.
207
233
 
208
234
  #### Mermaid Diagram
209
235
 
210
236
  ```mermaid
211
237
  flowchart LR
212
- subgraph L0["Layer 0 — no internal deps"]
213
- play-signals
238
+ subgraph L0["Layer 0 — no workspace deps"]
214
239
  play
240
+ shared
215
241
  docs
216
242
  end
217
243
 
218
244
  subgraph L1["Layer 1"]
245
+ play-signals
246
+ end
247
+
248
+ subgraph L2["Layer 2"]
219
249
  play-actor
220
250
  end
221
251
 
222
- subgraph L2["Layer 2 — view renderers & router adapters"]
223
- play-router
224
- play-dom-router
225
- play-sveltekit-router
226
- play-xstate
252
+ subgraph L3["Layer 3 — view renderers, and the router core"]
253
+ play-dom
227
254
  play-react
228
- play-vue
255
+ play-router
229
256
  play-solid
230
257
  play-svelte
231
- play-dom
232
- play-tanstack-react-router
233
- play-vue-router
234
- play-solid-router
235
- play-svelte-spa-router
236
- play-tanstack-solid-router
258
+ play-vue
237
259
  end
238
260
 
239
- subgraph L3["Layer 3 — application layer"]
240
- play-react-router
241
- examples["example demo apps"]
261
+ subgraph L4["Layer 4"]
262
+ play-tanstack-router
263
+ play-xstate
242
264
  end
243
265
 
244
- L0 --> L1
245
- L1 --> L2
246
- L2 --> L3
266
+ subgraph L5["Layer 5"]
267
+ actorshared["play-actor/examples/shared"]
268
+ end
269
+
270
+ subgraph L6["Layer 6"]
271
+ renderdemos["renderer demo apps"]
272
+ end
273
+
274
+ subgraph L7["Layer 7 — the eight router adapters"]
275
+ adapters["play-dom-router, play-react-router, play-solid-router,
276
+ play-svelte-spa-router, play-sveltekit-router,
277
+ play-tanstack-react-router, play-tanstack-solid-router,
278
+ play-vue-router"]
279
+ end
280
+
281
+ subgraph L8["Layer 8"]
282
+ routerdemos["router demo apps"]
283
+ end
284
+
285
+ L0 --> L1 --> L2 --> L3 --> L4 --> L5 --> L6 --> L7 --> L8
247
286
  ```
248
287
 
249
288
  ### Adding a New Package
@@ -351,6 +390,8 @@ Active plugins: `typescript`, `unicorn`, `import`. Key rules:
351
390
  | `typescript/no-explicit-any` | error |
352
391
  | `import/no-cycle` | error |
353
392
  | `typescript/no-unused-vars` | error (prefix unused with `_`) |
393
+ | `unicorn/no-array-sort` | error (use `toSorted()`) |
394
+ | `no-underscore-dangle` | off (clashes with `^_` unused) |
354
395
  | `correctness` category | error |
355
396
  | `suspicious` category | warn |
356
397
 
@@ -478,7 +519,29 @@ This project uses **Conventional Commits** — changelogs and version bumps are
478
519
  | `perf` | No bump (unless breaking) | Performance improvements |
479
520
  | `ci` | No bump | CI/CD pipeline changes |
480
521
 
481
- Breaking changes: append `!` after the type (`feat!:`) or add `BREAKING CHANGE:` in the footer.
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.
482
545
 
483
546
  Use the package short-name as scope when the change is isolated to one package:
484
547
 
@@ -501,7 +564,7 @@ feat(play-react): add PlayRenderer suspense boundary
501
564
 
502
565
  3. **Write tests** — new code must meet coverage thresholds (80% lines/functions/statements and 75% branches at the monorepo level; core packages enforce higher per-package thresholds)
503
566
  4. **Add JSDoc** — all new public exports require JSDoc with `@param`, `@returns`, and `@see` RFC links
504
- 5. **Never edit `packages/docs/api/`** — API docs are auto-generated; edit source JSDoc and regenerate with `pnpm run docs`
567
+ 5. **Never edit `packages/docs/api/`** — API docs are auto-generated; edit source JSDoc and regenerate with `pnpm run docs`. Keep the result out of your branch: the release regenerates and commits it (see [deployment.md](deployment.md)), so a branch that carries its own regeneration churns hundreds of files and conflicts with the next one.
505
568
 
506
569
  ### Merge Request Checklist
507
570