@real-router/core 0.55.0 → 0.57.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 (145) hide show
  1. package/dist/cjs/Router-BSGzVINO.js +6 -0
  2. package/dist/cjs/Router-BSGzVINO.js.map +1 -0
  3. package/dist/{esm/Router-Dg-zk8AS.d.mts → cjs/Router-hW6ivqrX.d.ts} +2 -2
  4. package/dist/cjs/Router-hW6ivqrX.d.ts.map +1 -0
  5. package/dist/cjs/api.d.ts +2 -2
  6. package/dist/cjs/api.d.ts.map +1 -1
  7. package/dist/cjs/api.js +1 -1
  8. package/dist/cjs/api.js.map +1 -1
  9. package/dist/cjs/{cloneRouter-C9Rth_8U.js → cloneRouter-7z-60z_f.js} +2 -2
  10. package/dist/cjs/{cloneRouter-C9Rth_8U.js.map → cloneRouter-7z-60z_f.js.map} +1 -1
  11. package/dist/cjs/{index-C-i6vx5Y.d.ts → index-BWUmnecT.d.ts} +1 -2
  12. package/dist/cjs/index-BWUmnecT.d.ts.map +1 -0
  13. package/dist/cjs/{RouterError-WhCzIWuc.d.ts → index-CYpAZCoc.d.ts} +19 -2
  14. package/dist/cjs/index-CYpAZCoc.d.ts.map +1 -0
  15. package/dist/cjs/{index-K1U_fqfJ.d.ts → index-D2WRiyWS.d.ts} +2 -2
  16. package/dist/cjs/index-D2WRiyWS.d.ts.map +1 -0
  17. package/dist/cjs/index.d.ts +5 -5
  18. package/dist/cjs/index.js +1 -1
  19. package/dist/cjs/{internals-CWMOL1B8.js → internals-DJjgSePy.js} +2 -2
  20. package/dist/cjs/internals-DJjgSePy.js.map +1 -0
  21. package/dist/cjs/utils.d.ts +1 -1
  22. package/dist/cjs/utils.js +1 -1
  23. package/dist/cjs/utils.js.map +1 -1
  24. package/dist/cjs/validation.d.ts +17 -5
  25. package/dist/cjs/validation.d.ts.map +1 -1
  26. package/dist/cjs/validation.js +1 -1
  27. package/dist/esm/Router-B7txWo9N.mjs +6 -0
  28. package/dist/esm/Router-B7txWo9N.mjs.map +1 -0
  29. package/dist/{cjs/Router-Dg-zk8AS.d.ts → esm/Router-hW6ivqrX.d.mts} +2 -2
  30. package/dist/esm/Router-hW6ivqrX.d.mts.map +1 -0
  31. package/dist/esm/api.d.mts +2 -2
  32. package/dist/esm/api.d.mts.map +1 -1
  33. package/dist/esm/api.mjs +1 -1
  34. package/dist/esm/api.mjs.map +1 -1
  35. package/dist/esm/{cloneRouter-BYNiwchg.mjs → cloneRouter-BNCQ7tIa.mjs} +2 -2
  36. package/dist/esm/{cloneRouter-BYNiwchg.mjs.map → cloneRouter-BNCQ7tIa.mjs.map} +1 -1
  37. package/dist/esm/{index-C-i6vx5Y.d.mts → index-BWUmnecT.d.mts} +1 -2
  38. package/dist/esm/index-BWUmnecT.d.mts.map +1 -0
  39. package/dist/esm/{RouterError-WhCzIWuc.d.mts → index-CYpAZCoc.d.mts} +19 -2
  40. package/dist/esm/index-CYpAZCoc.d.mts.map +1 -0
  41. package/dist/esm/{index-DKzxav48.d.mts → index-CjWKWPY6.d.mts} +2 -2
  42. package/dist/esm/index-CjWKWPY6.d.mts.map +1 -0
  43. package/dist/esm/index.d.mts +5 -5
  44. package/dist/esm/index.mjs +1 -1
  45. package/dist/esm/index.mjs.map +1 -1
  46. package/dist/esm/{internals-DT4mneSz.mjs → internals-C8mRvTxc.mjs} +2 -2
  47. package/dist/esm/internals-C8mRvTxc.mjs.map +1 -0
  48. package/dist/esm/utils.d.mts +1 -1
  49. package/dist/esm/utils.mjs +1 -1
  50. package/dist/esm/utils.mjs.map +1 -1
  51. package/dist/esm/validation.d.mts +17 -5
  52. package/dist/esm/validation.d.mts.map +1 -1
  53. package/dist/esm/validation.mjs +1 -1
  54. package/package.json +3 -4
  55. package/dist/cjs/Router-C7eE1kIK.js +0 -6
  56. package/dist/cjs/Router-C7eE1kIK.js.map +0 -1
  57. package/dist/cjs/Router-Dg-zk8AS.d.ts.map +0 -1
  58. package/dist/cjs/RouterError-WhCzIWuc.d.ts.map +0 -1
  59. package/dist/cjs/index-C-i6vx5Y.d.ts.map +0 -1
  60. package/dist/cjs/index-K1U_fqfJ.d.ts.map +0 -1
  61. package/dist/cjs/internals-CWMOL1B8.js.map +0 -1
  62. package/dist/esm/Router-Dg-zk8AS.d.mts.map +0 -1
  63. package/dist/esm/Router-DiZbYMLx.mjs +0 -6
  64. package/dist/esm/Router-DiZbYMLx.mjs.map +0 -1
  65. package/dist/esm/RouterError-WhCzIWuc.d.mts.map +0 -1
  66. package/dist/esm/index-C-i6vx5Y.d.mts.map +0 -1
  67. package/dist/esm/index-DKzxav48.d.mts.map +0 -1
  68. package/dist/esm/internals-DT4mneSz.mjs.map +0 -1
  69. package/src/Router.ts +0 -725
  70. package/src/RouterError.ts +0 -324
  71. package/src/api/cloneRouter.ts +0 -159
  72. package/src/api/getDependenciesApi.ts +0 -160
  73. package/src/api/getLifecycleApi.ts +0 -65
  74. package/src/api/getPluginApi.ts +0 -228
  75. package/src/api/getRoutesApi.ts +0 -546
  76. package/src/api/helpers.ts +0 -10
  77. package/src/api/index.ts +0 -16
  78. package/src/api/types.ts +0 -12
  79. package/src/constants.ts +0 -101
  80. package/src/createRouter.ts +0 -32
  81. package/src/fsm/index.ts +0 -5
  82. package/src/fsm/routerFSM.ts +0 -130
  83. package/src/getNavigator.ts +0 -30
  84. package/src/guards.ts +0 -46
  85. package/src/helpers.ts +0 -197
  86. package/src/index.ts +0 -50
  87. package/src/internals.ts +0 -200
  88. package/src/namespaces/DependenciesNamespace/dependenciesStore.ts +0 -30
  89. package/src/namespaces/DependenciesNamespace/index.ts +0 -5
  90. package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +0 -485
  91. package/src/namespaces/EventBusNamespace/index.ts +0 -5
  92. package/src/namespaces/EventBusNamespace/types.ts +0 -11
  93. package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +0 -552
  94. package/src/namespaces/NavigationNamespace/constants.ts +0 -55
  95. package/src/namespaces/NavigationNamespace/index.ts +0 -5
  96. package/src/namespaces/NavigationNamespace/transition/completeTransition.ts +0 -108
  97. package/src/namespaces/NavigationNamespace/transition/errorHandling.ts +0 -124
  98. package/src/namespaces/NavigationNamespace/transition/guardPhase.ts +0 -283
  99. package/src/namespaces/NavigationNamespace/types.ts +0 -110
  100. package/src/namespaces/OptionsNamespace/OptionsNamespace.ts +0 -28
  101. package/src/namespaces/OptionsNamespace/constants.ts +0 -19
  102. package/src/namespaces/OptionsNamespace/helpers.ts +0 -50
  103. package/src/namespaces/OptionsNamespace/index.ts +0 -7
  104. package/src/namespaces/OptionsNamespace/validators.ts +0 -13
  105. package/src/namespaces/PluginsNamespace/PluginsNamespace.ts +0 -291
  106. package/src/namespaces/PluginsNamespace/constants.ts +0 -34
  107. package/src/namespaces/PluginsNamespace/index.ts +0 -7
  108. package/src/namespaces/PluginsNamespace/types.ts +0 -22
  109. package/src/namespaces/PluginsNamespace/validators.ts +0 -28
  110. package/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts +0 -558
  111. package/src/namespaces/RouteLifecycleNamespace/index.ts +0 -5
  112. package/src/namespaces/RouteLifecycleNamespace/types.ts +0 -10
  113. package/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts +0 -81
  114. package/src/namespaces/RouterLifecycleNamespace/constants.ts +0 -25
  115. package/src/namespaces/RouterLifecycleNamespace/index.ts +0 -5
  116. package/src/namespaces/RouterLifecycleNamespace/types.ts +0 -30
  117. package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +0 -582
  118. package/src/namespaces/RoutesNamespace/constants.ts +0 -6
  119. package/src/namespaces/RoutesNamespace/forwardChain.ts +0 -34
  120. package/src/namespaces/RoutesNamespace/helpers.ts +0 -204
  121. package/src/namespaces/RoutesNamespace/index.ts +0 -11
  122. package/src/namespaces/RoutesNamespace/routeGuards.ts +0 -62
  123. package/src/namespaces/RoutesNamespace/routesStore.ts +0 -566
  124. package/src/namespaces/RoutesNamespace/types.ts +0 -81
  125. package/src/namespaces/StateNamespace/StateNamespace.ts +0 -224
  126. package/src/namespaces/StateNamespace/helpers.ts +0 -24
  127. package/src/namespaces/StateNamespace/index.ts +0 -5
  128. package/src/namespaces/StateNamespace/types.ts +0 -15
  129. package/src/namespaces/index.ts +0 -35
  130. package/src/stateMetaStore.ts +0 -15
  131. package/src/transitionPath.ts +0 -436
  132. package/src/typeGuards.ts +0 -59
  133. package/src/types/RouterValidator.ts +0 -156
  134. package/src/types.ts +0 -69
  135. package/src/utils/createRequestScope.ts +0 -174
  136. package/src/utils/getStaticPaths.ts +0 -50
  137. package/src/utils/hydrateRouter.ts +0 -89
  138. package/src/utils/index.ts +0 -27
  139. package/src/utils/serializeRouterState.ts +0 -120
  140. package/src/utils/serializeState.ts +0 -63
  141. package/src/validation.ts +0 -12
  142. package/src/wiring/RouterWiringBuilder.ts +0 -275
  143. package/src/wiring/index.ts +0 -7
  144. package/src/wiring/types.ts +0 -47
  145. package/src/wiring/wireRouter.ts +0 -26
@@ -1,4 +1,4 @@
1
- import { DefaultDependencies, EventMethodMap, GuardFnFactory, LeaveFn, LimitsConfig, NavigationOptions, Options, Params, PluginFactory, Route, RouteConfigUpdate, RouteTreeState, Router, State, SubscribeFn, Unsubscribe } from "@real-router/types";
1
+ import { DefaultDependencies, EventMethodMap, GuardFnFactory, LeaveFn, LimitsConfig, NavigationOptions, Options, Params, PluginFactory, Route, RouteConfigUpdate, RouteTreeState, Router, State, SubscribeFn, TreeChangedEvent, Unsubscribe } from "@real-router/types";
2
2
 
3
3
  //#region src/types.d.ts
4
4
  /**
@@ -64,4 +64,4 @@ declare class Router$1<Dependencies extends DefaultDependencies = DefaultDepende
64
64
  }
65
65
  //#endregion
66
66
  export { Limits as a, RouteConfigUpdate as c, GuardFnFactory as i, BuildStateResultWithSegments as n, PluginFactory as o, EventMethodMap as r, Route as s, Router$1 as t };
67
- //# sourceMappingURL=Router-Dg-zk8AS.d.ts.map
67
+ //# sourceMappingURL=Router-hW6ivqrX.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router-hW6ivqrX.d.mts","names":[],"sources":["../../src/types.ts","../../src/Router.ts"],"mappings":";;;;;;KAgEY,MAAA,GAAS,QAAQ,CAAC,YAAA;;;;;;;;UASb,4BAAA,WAAuC,MAAA,GAAS,MAAA;EAAA,SACtD,KAAA,EAAO,cAAA,CAAe,CAAA;EAAA,SACtB,QAAA;AAAA;;;;AAXX;;;;AAA0C;AAS1C;;;;;;;;;;cCOa,QAAA,sBACU,mBAAA,GAAsB,mBAAA,aAChC,MAAA,CAAgB,YAAA;EAAA;GAC1B,GAAA;EDTe;;;;AACC;cCoCf,MAAA,GAAQ,KAAA,CAAM,YAAA,KACd,OAAA,GAAS,OAAA,CAAQ,OAAA,GACjB,YAAA,GAAc,YAAA;EAqOhB,aAAA,CACE,IAAA,UACA,MAAA,GAAS,MAAA,EACT,cAAA,YACA,iBAAA;EAgCF,SAAA,CAAU,KAAA,UAAe,MAAA,GAAS,MAAA;EAalC,QAAA,WAAmB,MAAA,GAAS,MAAA,KAAW,KAAA,CAAM,CAAA;EAI7C,gBAAA,IAAoB,KAAA;EAIpB,cAAA,CACE,MAAA,EAAQ,KAAA,cACR,MAAA,EAAQ,KAAA,cACR,iBAAA;EAWF,gBAAA,CACE,QAAA,YACE,OAAA,EAAS,KAAA,EAAO,SAAA,GAAY,KAAA;EAUhC,QAAA;EAIA,KAAA,CAAM,SAAA,WAAoB,OAAA,CAAQ,KAAA;EAqClC,IAAA;EAcA,OAAA;EA8CA,aAAA,CAAc,IAAA,UAAc,MAAA,GAAS,MAAA;EA+BrC,SAAA,IACK,OAAA,GAAU,aAAA,CAAc,YAAA,kCAC1B,WAAA;EA2BH,SAAA,CAAU,QAAA,EAAU,WAAA,GAAc,WAAA;EAMlC,cAAA,CAAe,QAAA,EAAU,OAAA,GAAU,WAAA;EAMnC,eAAA;EAQA,QAAA,CACE,SAAA,UACA,WAAA,GAAc,MAAA,EACd,OAAA,GAAU,iBAAA,GACT,OAAA,CAAQ,KAAA;EA4BX,iBAAA,CAAkB,OAAA,GAAU,iBAAA,GAAoB,OAAA,CAAQ,KAAA;EAyBxD,kBAAA,CAAmB,IAAA,YAAgB,KAAA;AAAA"}
@@ -1,5 +1,5 @@
1
- import { i as RouteTree } from "./index-C-i6vx5Y.mjs";
2
- import { t as Router$1 } from "./Router-Dg-zk8AS.mjs";
1
+ import { i as RouteTree } from "./index-BWUmnecT.mjs";
2
+ import { t as Router$1 } from "./Router-hW6ivqrX.mjs";
3
3
  import { DefaultDependencies, DependenciesApi, LifecycleApi, PluginApi as PluginApi$1, Router, RoutesApi } from "@real-router/types";
4
4
 
5
5
  //#region src/api/types.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.mts","names":[],"sources":["../../src/api/types.ts","../../src/api/getPluginApi.ts","../../src/api/getRoutesApi.ts","../../src/api/getDependenciesApi.ts","../../src/api/getLifecycleApi.ts","../../src/api/cloneRouter.ts"],"mappings":";;;;;UAGiB,SAAA,SAAkB,IAAA,CAAK,WAAA;EACtC,OAAA,QAAe,SAAA;AAAA;;;iBCkBD,YAAA,sBACO,mBAAA,GAAsB,mBAAA,CAAA,CAC3C,MAAA,EAAQ,MAAA,CAAO,YAAA,IAAgB,SAAA;;;iBCuVjB,YAAA,sBACO,mBAAA,GAAsB,mBAAA,CAAA,CAC3C,MAAA,EAAQ,MAAA,CAAO,YAAA,IAAgB,SAAA,CAAU,YAAA;;;iBChS3B,kBAAA,sBACO,mBAAA,GAAsB,mBAAA,CAAA,CAC3C,MAAA,EAAQ,MAAA,CAAO,YAAA,IAAgB,eAAA,CAAgB,YAAA;;;iBC7EjC,eAAA,sBACO,mBAAA,GAAsB,mBAAA,CAAA,CAC3C,MAAA,EAAQ,MAAA,CAAO,YAAA,IAAgB,YAAA,CAAa,YAAA;;;;;;AJL9C;;;;;;;;;;;;;AAC0B;;;;ACkB1B;;;;;;;;;;;;;;;;;;AAE0C;;;;ACuV1C;;;;;;;;;;;;;;;;;;;;AAEuD;iBGvSvC,WAAA,sBACO,mBAAA,GAAsB,mBAAA,CAAA,CAE3C,MAAA,EAAQ,MAAA,CAAO,YAAA,GACf,YAAA,GAAe,YAAA,GACd,QAAA,CAAY,YAAA"}
1
+ {"version":3,"file":"api.d.mts","names":[],"sources":["../../src/api/types.ts","../../src/api/getPluginApi.ts","../../src/api/getRoutesApi.ts","../../src/api/getDependenciesApi.ts","../../src/api/getLifecycleApi.ts","../../src/api/cloneRouter.ts"],"mappings":";;;;;UAGiB,SAAA,SAAkB,IAAA,CAAK,WAAA;EACtC,OAAA,QAAe,SAAA;AAAA;;;iBCkBD,YAAA,sBACO,mBAAA,GAAsB,mBAAA,EAC3C,MAAA,EAAQ,MAAA,CAAO,YAAA,IAAgB,SAAA;;;iBCsjBjB,YAAA,sBACO,mBAAA,GAAsB,mBAAA,EAC3C,MAAA,EAAQ,MAAA,CAAO,YAAA,IAAgB,SAAA,CAAU,YAAA;;;iBC/f3B,kBAAA,sBACO,mBAAA,GAAsB,mBAAA,EAC3C,MAAA,EAAQ,MAAA,CAAO,YAAA,IAAgB,eAAA,CAAgB,YAAA;;;iBC7EjC,eAAA,sBACO,mBAAA,GAAsB,mBAAA,EAC3C,MAAA,EAAQ,MAAA,CAAO,YAAA,IAAgB,YAAA,CAAa,YAAA;;;;;;AJL9C;;;;;;;;;;;;;AAC0B;;;;ACkB1B;;;;;;;;;;;;;;;;;;AAE0C;;;;ACsjB1C;;;;;;;;;;;;;;;;;;;;AAEuD;iBGtgBvC,WAAA,sBACO,mBAAA,GAAsB,mBAAA,EAE3C,MAAA,EAAQ,MAAA,CAAO,YAAA,GACf,YAAA,GAAe,YAAA,GACd,QAAA,CAAY,YAAA"}
package/dist/esm/api.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,f as t,i as n,l as r,o as i,r as a,s as o,u as s}from"./Router-DiZbYMLx.mjs";import{r as c,t as l}from"./internals-DT4mneSz.mjs";import{i as u,n as d,r as f,t as p}from"./cloneRouter-BYNiwchg.mjs";import{logger as m}from"@real-router/logger";function h(e,t,n){if(t){let n=t===e,r=t.startsWith(`${e}.`);if(n||r){let r=n?``:` (current: "${t}")`;return m.warn(`router.removeRoute`,`Cannot remove route "${e}" — it is currently active${r}. Navigate away first.`),!1}}return n&&m.warn(`router.removeRoute`,`Route "${e}" removed while navigation is in progress. This may cause unexpected behavior.`),!0}function g(e){return e?(m.error(`router.clearRoutes`,`Cannot clear routes while navigation is in progress. Wait for navigation to complete.`),!1):!0}function _(e,t,n,i){let a=t=>t===e||t.startsWith(`${e}.`);r(t.decoders,a),r(t.encoders,a),r(t.defaultParams,a),r(t.forwardMap,a),r(t.forwardFnMap,a),r(n,a),r(t.forwardMap,e=>a(t.forwardMap[e]));let[o,s]=i.getFactories();for(let e of Object.keys(s))a(e)&&i.clearCanActivate(e);for(let e of Object.keys(o))a(e)&&i.clearCanDeactivate(e)}function v(e,t,n){let r=Object.assign(Object.create(null),n.forwardMap),i=Object.assign(Object.create(null),n.forwardFnMap);t===null?(delete r[e],delete i[e]):typeof t==`string`?(delete i[e],r[e]=t):(delete r[e],i[e]=t);let a=o({...n,forwardMap:r});return n.forwardMap=r,n.forwardFnMap=i,a}function y(e,t,n,r){let i={name:e.name,path:e.path},a=n.forwardFnMap[t],o=n.forwardMap[t];a===void 0?o!==void 0&&(i.forwardTo=o):i.forwardTo=a,t in n.defaultParams&&(i.defaultParams=n.defaultParams[t]),t in n.decoders&&(i.decodeParams=n.decoders[t]),t in n.encoders&&(i.encodeParams=n.encoders[t]);let[s,c]=r;return t in c&&(i.canActivate=c[t]),t in s&&(i.canDeactivate=s[t]),e.children&&(i.children=e.children.map(e=>y(e,`${t}.${e.name}`,n,r))),i}function b(t,r,i){n(t,r,i),a(t,e(t,r,i))}function x(e,t,n,r,o){let s=i(t,e.rootPath,e.matcherOptions);if(e.lifecycleNamespace.clearDefinitionGuards(),a(e,s),r!==void 0){let e=n.matchPath(r,n.getOptions());e?n.setState({...e,transition:o}):n.clearState()}}function S(e,t){return s(e.definitions,t)?(_(t,e.config,e.routeCustomFields,e.lifecycleNamespace),e.treeOperations.commitTreeChanges(e),!0):!1}function C(e,t,n){if(n.forwardTo!==void 0&&(e.resolvedForwardMap=v(t,n.forwardTo,e.config)),n.defaultParams!==void 0&&(n.defaultParams===null?delete e.config.defaultParams[t]:e.config.defaultParams[t]=n.defaultParams),n.decodeParams!==void 0)if(n.decodeParams===null)delete e.config.decoders[t];else{let r=n.decodeParams;e.config.decoders[t]=e=>r(e)??e}if(n.encodeParams!==void 0)if(n.encodeParams===null)delete e.config.encoders[t];else{let r=n.encodeParams;e.config.encoders[t]=e=>r(e)??e}}function w(e,t){let n=e.matcher.getSegmentsByName(t);if(!n)return;let r=n.at(-1),i=e.treeOperations.nodeToDefinition(r),a=e.lifecycleNamespace.getFactories();return y(i,t,e.config,a)}function T(e){let n=c(e),r=n.routeGetStore(),i=l(`add`,(e,t)=>{b(r,e,t?.parent)},n.interceptors);return{add:(e,a)=>{u(n.isDisposed);let o=Array.isArray(e)?e:[e],s=a?.parent;t(o,n.validator),s!==void 0&&n.validator?.routes.validateParentOption(s,r.tree),n.validator?.routes.throwIfInternalRouteInArray(o,`addRoute`),n.validator?.routes.validateAddRouteArgs(o),n.validator?.routes.validateRoutes(o,r),i(o,s===void 0?void 0:{parent:s})},remove:e=>{u(n.isDisposed),n.validator?.routes.validateRemoveRouteArgs(e),n.validator?.routes.throwIfInternalRoute(e,`removeRoute`),h(e,n.getStateName(),n.isTransitioning())&&(S(r,e)||m.warn(`router.removeRoute`,`Route "${e}" not found. No changes made.`))},update:(e,t)=>{u(n.isDisposed),n.validator?.routes.validateUpdateRouteBasicArgs(e,t),n.validator?.routes.throwIfInternalRoute(e,`updateRoute`);let{forwardTo:i,defaultParams:a,decodeParams:o,encodeParams:s,canActivate:c,canDeactivate:l}=t;n.validator?.routes.validateUpdateRoutePropertyTypes(e,t),n.isTransitioning()&&m.error(`router.updateRoute`,`Updating route "${e}" while navigation is in progress. This may cause unexpected behavior.`),n.validator?.routes.validateUpdateRoute(e,t,r),C(r,e,{forwardTo:i,defaultParams:a,decodeParams:o,encodeParams:s}),c!==void 0&&(c===null?r.lifecycleNamespace.clearCanActivate(e):r.lifecycleNamespace.addCanActivate(e,c,!0)),l!==void 0&&(l===null?r.lifecycleNamespace.clearCanDeactivate(e):r.lifecycleNamespace.addCanDeactivate(e,l,!0))},clear:()=>{u(n.isDisposed),g(n.isTransitioning())&&(r.treeOperations.resetStore(r),r.lifecycleNamespace.clearAll(),n.clearState())},has:e=>(n.validator?.routes.validateRouteName(e,`hasRoute`),r.matcher.hasRoute(e)),get:e=>(n.validator?.routes.validateRouteName(e,`getRoute`),w(r,e)),replace:i=>{u(n.isDisposed);let a=Array.isArray(i)?i:[i];if(!g(n.isTransitioning()))return;t(a,n.validator),n.validator?.routes.throwIfInternalRouteInArray(a,`replaceRoutes`),n.validator?.routes.validateAddRouteArgs(a),n.validator?.routes.validateRoutes(a,r);let o=e.getState();x(r,a,n,o?.path,o?.transition)}}}function E(e,t,n,r){if(n===void 0)return!1;if(!Object.hasOwn(e.dependencies,t))r?.dependencies.validateDependencyCount(e,`setDependency`);else{let i=e.dependencies[t];i!==n&&!(Number.isNaN(i)&&Number.isNaN(n))&&r?.dependencies.warnOverwrite(t,`setDependency`)}return e.dependencies[t]=n,!0}function D(e,t,n){let r=[];for(let i in t)t[i]!==void 0&&(Object.hasOwn(e.dependencies,i)?r.push(i):n?.dependencies.validateDependencyCount(e,`setDependencies`),e.dependencies[i]=t[i]);r.length>0&&n?.dependencies.warnBatchOverwrite(r,`setDependencies`)}function O(e){let t=c(e);return{get:e=>{t.validator?.dependencies.validateDependencyName(e,`getDependency`);let n=t.dependenciesGetStore(),r=n.dependencies[e];return t.validator?.dependencies.validateDependencyExists(e,n),r},getAll:()=>({...t.dependenciesGetStore().dependencies}),set:(e,n)=>{u(t.isDisposed),t.validator?.dependencies.validateSetDependencyArgs(e,n,`setDependency`),E(t.dependenciesGetStore(),e,n,t.validator)},setAll:e=>{u(t.isDisposed);let n=t.dependenciesGetStore();t.validator?.dependencies.validateDependenciesObject(e,`setDependencies`),t.validator?.dependencies.validateDependencyLimit(n,n.limits),D(n,e,t.validator)},remove:e=>{u(t.isDisposed),t.validator?.dependencies.validateDependencyName(e,`removeDependency`);let n=t.dependenciesGetStore();Object.hasOwn(n.dependencies,e)||t.validator?.dependencies.warnRemoveNonExistent(e),delete n.dependencies[e]},reset:()=>{u(t.isDisposed);let e=t.dependenciesGetStore();e.dependencies=Object.create(null)},has:e=>(t.validator?.dependencies.validateDependencyName(e,`hasDependency`),Object.hasOwn(t.dependenciesGetStore().dependencies,e))}}export{p as cloneRouter,O as getDependenciesApi,d as getLifecycleApi,f as getPluginApi,T as getRoutesApi};
1
+ import{a as e,f as t,i as n,l as r,o as i,r as a,s as o,u as s}from"./Router-B7txWo9N.mjs";import{r as c}from"./internals-C8mRvTxc.mjs";import{i as l,n as u,r as d,t as f}from"./cloneRouter-BNCQ7tIa.mjs";import{logger as p}from"@real-router/logger";function m(e,t,n){if(t){let n=t===e,r=t.startsWith(`${e}.`);if(n||r){let r=n?``:` (current: "${t}")`;return p.warn(`router.removeRoute`,`Cannot remove route "${e}" — it is currently active${r}. Navigate away first.`),!1}}return n&&p.warn(`router.removeRoute`,`Route "${e}" removed while navigation is in progress. This may cause unexpected behavior.`),!0}function h(e){return e?(p.error(`router.clearRoutes`,`Cannot clear routes while navigation is in progress. Wait for navigation to complete.`),!1):!0}function g(e,t,n,i){let a=t=>t===e||t.startsWith(`${e}.`);r(t.decoders,a),r(t.encoders,a),r(t.defaultParams,a),r(t.forwardMap,a),r(t.forwardFnMap,a),r(n,a),r(t.forwardMap,e=>a(t.forwardMap[e]));let[o,s]=i.getFactories();for(let e of Object.keys(s))a(e)&&i.clearCanActivate(e);for(let e of Object.keys(o))a(e)&&i.clearCanDeactivate(e)}function _(e,t,n){let r=Object.assign(Object.create(null),n.forwardMap),i=Object.assign(Object.create(null),n.forwardFnMap);t===null?(delete r[e],delete i[e]):typeof t==`string`?(delete i[e],r[e]=t):(delete r[e],i[e]=t);let a=o({...n,forwardMap:r});return n.forwardMap=r,n.forwardFnMap=i,a}function v(e,t,n,r){let i=n.forwardFnMap[t],a=n.forwardMap[t];i===void 0?a!==void 0&&(e.forwardTo=a):e.forwardTo=i,t in n.defaultParams&&(e.defaultParams=n.defaultParams[t]),t in n.decoders&&(e.decodeParams=n.decoders[t]),t in n.encoders&&(e.encodeParams=n.encoders[t]);let[o,s]=r;return t in s&&(e.canActivate=s[t]),t in o&&(e.canDeactivate=o[t]),e}function y(e,t,n,r){let i={name:e.name,path:e.path};return v(i,t,n,r),e.children&&(i.children=e.children.map(e=>y(e,`${t}.${e.name}`,n,r))),i}function b(e,t,n,r){let i={name:e,path:t};return v(i,e,n,r),Object.freeze(i)}function x(e,t){let n=new Map,r=e.lifecycleNamespace.getFactories(),i=(a,o)=>{for(let s of a){let a=o?`${o}.${s.name}`:s.name;t(a)&&n.set(a,b(a,s.path,e.config,r)),s.children&&i(s.children,a)}};return i(e.definitions,``),n}function S(e,t){let n=`${t}.`,r=x(e,e=>e===t||e.startsWith(n));return Object.freeze([...r.values()])}function C(e,t,n){let r=n.lifecycleNamespace.getFactories(),i=[],a=(e,t)=>{for(let o of e){let e=t?`${t}.${o.name}`:o.name;i.push(b(e,o.path,n.config,r)),o.children&&a(o.children,e)}};return a(e,t??``),Object.freeze(i)}function w(e,t){let n=[],r=[];for(let[r,i]of e)t.has(r)||n.push(i);for(let[n,i]of t)e.has(n)||r.push(i);return{removed:Object.freeze(n),added:Object.freeze(r)}}function T(e){let t={};return e.forwardTo!==void 0&&(t.forwardTo=e.forwardTo),e.defaultParams!==void 0&&(t.defaultParams=e.defaultParams),e.encodeParams!==void 0&&(t.encodeParams=e.encodeParams),e.decodeParams!==void 0&&(t.decodeParams=e.decodeParams),Object.freeze(t)}function E(t,r,i){n(t,r,i),a(t,e(t,r,i))}function D(e,t,n,r,o,s){let c=i(t,e.rootPath,e.matcherOptions);if(e.lifecycleNamespace.clearDefinitionGuards(),a(e,c),s?.(),r!==void 0){let e=n.matchPath(r,n.getOptions());e?n.setState({...e,transition:o}):n.clearState()}}function O(e,t){return s(e.definitions,t)?(g(t,e.config,e.routeCustomFields,e.lifecycleNamespace),e.treeOperations.commitTreeChanges(e),!0):!1}function k(e,t,n){if(n.forwardTo!==void 0&&(e.resolvedForwardMap=_(t,n.forwardTo,e.config)),n.defaultParams!==void 0&&(n.defaultParams===null?delete e.config.defaultParams[t]:e.config.defaultParams[t]=n.defaultParams),n.decodeParams!==void 0)if(n.decodeParams===null)delete e.config.decoders[t];else{let r=n.decodeParams;e.config.decoders[t]=e=>r(e)??e}if(n.encodeParams!==void 0)if(n.encodeParams===null)delete e.config.encoders[t];else{let r=n.encodeParams;e.config.encoders[t]=e=>r(e)??e}}function A(e,t){let n=e.matcher.getSegmentsByName(t);if(!n)return;let r=n.at(-1),i=e.treeOperations.nodeToDefinition(r),a=e.lifecycleNamespace.getFactories();return y(i,t,e.config,a)}function j(e){let n=c(e),r=n.routeGetStore(),i=e=>{n.treeChanged.emit(e)};return{add:(e,a)=>{l(n.isDisposed);let o=Array.isArray(e)?e:[e],s=a?.parent;if(t(o,n.validator),s!==void 0&&n.validator?.routes.validateParentOption(s,r.tree),n.validator?.routes.throwIfInternalRouteInArray(o,`addRoute`),n.validator?.routes.validateAddRouteArgs(o),n.validator?.routes.validateRoutes(o,r),E(r,o,s),n.treeChanged.listenerCount()>0){let e=C(o,s,r);i(s===void 0?{op:`add`,added:e}:{op:`add`,added:e,parent:s})}},remove:e=>{if(l(n.isDisposed),n.validator?.routes.validateRemoveRouteArgs(e),n.validator?.routes.throwIfInternalRoute(e,`removeRoute`),!m(e,n.getStateName(),n.isTransitioning()))return;let t=n.treeChanged.listenerCount()>0?S(r,e):void 0;if(!O(r,e)){p.warn(`router.removeRoute`,`Route "${e}" not found. No changes made.`);return}t!==void 0&&i({op:`remove`,name:e,removedSubtree:t})},update:(e,t)=>{l(n.isDisposed),n.validator?.routes.validateUpdateRouteBasicArgs(e,t),n.validator?.routes.throwIfInternalRoute(e,`updateRoute`);let{forwardTo:a,defaultParams:o,decodeParams:s,encodeParams:c,canActivate:u,canDeactivate:d}=t;if(n.validator?.routes.validateUpdateRoutePropertyTypes(e,t),n.isTransitioning()&&p.error(`router.updateRoute`,`Updating route "${e}" while navigation is in progress. This may cause unexpected behavior.`),n.validator?.routes.validateUpdateRoute(e,t,r),k(r,e,{forwardTo:a,defaultParams:o,decodeParams:s,encodeParams:c}),u!==void 0&&(u===null?r.lifecycleNamespace.clearCanActivate(e):r.lifecycleNamespace.addCanActivate(e,u,!0)),d!==void 0&&(d===null?r.lifecycleNamespace.clearCanDeactivate(e):r.lifecycleNamespace.addCanDeactivate(e,d,!0)),n.treeChanged.listenerCount()>0){let t=T({forwardTo:a,defaultParams:o,encodeParams:c,decodeParams:s});Object.keys(t).length>0&&i({op:`update`,name:e,patch:t})}},clear:()=>{if(l(n.isDisposed),!h(n.isTransitioning()))return;let e=n.treeChanged.listenerCount()>0?Object.freeze([...x(r,()=>!0).values()]):void 0;r.treeOperations.resetStore(r),r.lifecycleNamespace.clearAll(),n.clearState(),e!==void 0&&i({op:`clear`,removed:e})},has:e=>(n.validator?.routes.validateRouteName(e,`hasRoute`),r.matcher.hasRoute(e)),get:e=>(n.validator?.routes.validateRouteName(e,`getRoute`),A(r,e)),replace:a=>{l(n.isDisposed);let o=Array.isArray(a)?a:[a];if(!h(n.isTransitioning()))return;t(o,n.validator),n.validator?.routes.throwIfInternalRouteInArray(o,`replaceRoutes`),n.validator?.routes.validateAddRouteArgs(o),n.validator?.routes.validateRoutes(o,r);let s=e.getState(),c=n.treeChanged.listenerCount()>0?x(r,()=>!0):void 0;D(r,o,n,s?.path,s?.transition,c===void 0?void 0:()=>{let{removed:e,added:t}=w(c,x(r,()=>!0));i({op:`replace`,removed:e,added:t})})},subscribeChanges:e=>n.treeChanged.subscribe(e)}}function M(e,t,n,r){if(n===void 0)return!1;if(!Object.hasOwn(e.dependencies,t))r?.dependencies.validateDependencyCount(e,`setDependency`);else{let i=e.dependencies[t];i!==n&&!(Number.isNaN(i)&&Number.isNaN(n))&&r?.dependencies.warnOverwrite(t,`setDependency`)}return e.dependencies[t]=n,!0}function N(e,t,n){let r=[];for(let i in t)t[i]!==void 0&&(Object.hasOwn(e.dependencies,i)?r.push(i):n?.dependencies.validateDependencyCount(e,`setDependencies`),e.dependencies[i]=t[i]);r.length>0&&n?.dependencies.warnBatchOverwrite(r,`setDependencies`)}function P(e){let t=c(e);return{get:e=>{t.validator?.dependencies.validateDependencyName(e,`getDependency`);let n=t.dependenciesGetStore(),r=n.dependencies[e];return t.validator?.dependencies.validateDependencyExists(e,n),r},getAll:()=>({...t.dependenciesGetStore().dependencies}),set:(e,n)=>{l(t.isDisposed),t.validator?.dependencies.validateSetDependencyArgs(e,n,`setDependency`),M(t.dependenciesGetStore(),e,n,t.validator)},setAll:e=>{l(t.isDisposed);let n=t.dependenciesGetStore();t.validator?.dependencies.validateDependenciesObject(e,`setDependencies`),t.validator?.dependencies.validateDependencyLimit(n,n.limits),N(n,e,t.validator)},remove:e=>{l(t.isDisposed),t.validator?.dependencies.validateDependencyName(e,`removeDependency`);let n=t.dependenciesGetStore();Object.hasOwn(n.dependencies,e)||t.validator?.dependencies.warnRemoveNonExistent(e),delete n.dependencies[e]},reset:()=>{l(t.isDisposed);let e=t.dependenciesGetStore();e.dependencies=Object.create(null)},has:e=>(t.validator?.dependencies.validateDependencyName(e,`hasDependency`),Object.hasOwn(t.dependenciesGetStore().dependencies,e))}}export{f as cloneRouter,P as getDependenciesApi,u as getLifecycleApi,d as getPluginApi,j as getRoutesApi};
2
2
  //# sourceMappingURL=api.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.mjs","names":[],"sources":["../../src/namespaces/RoutesNamespace/routeGuards.ts","../../src/api/getRoutesApi.ts","../../src/api/getDependenciesApi.ts"],"sourcesContent":["import { logger } from \"@real-router/logger\";\n\n/**\n * Validates removeRoute constraints.\n * Returns false if removal should be blocked (route is active).\n * Logs warnings for edge cases.\n *\n * @param name - Route name to remove\n * @param currentStateName - Current active route name (or undefined)\n * @param isNavigating - Whether navigation is in progress\n * @returns true if removal can proceed, false if blocked\n */\nexport function validateRemoveRoute(\n name: string,\n currentStateName: string | undefined,\n isNavigating: boolean,\n): boolean {\n if (currentStateName) {\n const isExactMatch = currentStateName === name;\n const isParentOfCurrent = currentStateName.startsWith(`${name}.`);\n\n if (isExactMatch || isParentOfCurrent) {\n const suffix = isExactMatch ? \"\" : ` (current: \"${currentStateName}\")`;\n\n logger.warn(\n \"router.removeRoute\",\n `Cannot remove route \"${name}\" — it is currently active${suffix}. Navigate away first.`,\n );\n\n return false;\n }\n }\n\n if (isNavigating) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" removed while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n return true;\n}\n\n/**\n * Validates clearRoutes operation.\n * Returns false if operation should be blocked (navigation in progress).\n *\n * @param isNavigating - Whether navigation is in progress\n * @returns true if clearRoutes can proceed, false if blocked\n */\nexport function validateClearRoutes(isNavigating: boolean): boolean {\n if (isNavigating) {\n logger.error(\n \"router.clearRoutes\",\n \"Cannot clear routes while navigation is in progress. Wait for navigation to complete.\",\n );\n\n return false;\n }\n\n return true;\n}\n","import { logger } from \"@real-router/logger\";\n\nimport { throwIfDisposed } from \"./helpers\";\nimport { guardRouteStructure } from \"../guards\";\nimport { createInterceptable, getInternals } from \"../internals\";\nimport {\n clearConfigEntries,\n removeFromDefinitions,\n} from \"../namespaces/RoutesNamespace/helpers\";\nimport {\n validateClearRoutes,\n validateRemoveRoute,\n} from \"../namespaces/RoutesNamespace/routeGuards\";\nimport {\n adoptRouteArtifacts,\n assertAddable,\n buildAddArtifacts,\n buildReplaceArtifacts,\n refreshForwardMap,\n} from \"../namespaces/RoutesNamespace/routesStore\";\n\nimport type { RoutesApi } from \"./types\";\nimport type { RouterInternals } from \"../internals\";\nimport type { RouteLifecycleNamespace, RouteConfig } from \"../namespaces\";\nimport type { RoutesStore } from \"../namespaces/RoutesNamespace\";\nimport type { GuardFnFactory, Route } from \"../types\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Params,\n Router,\n TransitionMeta,\n} from \"@real-router/types\";\nimport type { RouteDefinition, RouteTree } from \"route-tree\";\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Clears all config entries and lifecycle handlers for a removed route\n * (and all its descendants).\n */\nfunction clearRouteConfigurations<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routeName: string,\n config: RouteConfig,\n routeCustomFields: Record<string, Record<string, unknown>>,\n lifecycleNamespace: RouteLifecycleNamespace<Dependencies>,\n): void {\n const shouldClear = (name: string): boolean =>\n name === routeName || name.startsWith(`${routeName}.`);\n\n clearConfigEntries(config.decoders, shouldClear);\n clearConfigEntries(config.encoders, shouldClear);\n clearConfigEntries(config.defaultParams, shouldClear);\n clearConfigEntries(config.forwardMap, shouldClear);\n clearConfigEntries(config.forwardFnMap, shouldClear);\n clearConfigEntries(routeCustomFields, shouldClear);\n\n // Clear forwardMap entries pointing TO the deleted route (or its descendants)\n clearConfigEntries(config.forwardMap, (key) =>\n shouldClear(config.forwardMap[key]),\n );\n\n // Clear lifecycle handlers\n const [canDeactivateFactories, canActivateFactories] =\n lifecycleNamespace.getFactories();\n\n for (const name of Object.keys(canActivateFactories)) {\n if (shouldClear(name)) {\n lifecycleNamespace.clearCanActivate(name);\n }\n }\n\n for (const name of Object.keys(canDeactivateFactories)) {\n if (shouldClear(name)) {\n lifecycleNamespace.clearCanDeactivate(name);\n }\n }\n}\n\n/**\n * Updates forwardTo for a route in config and returns the refreshed resolved\n * forward map (REPLACE semantics — caller must call ctx.setResolvedForwardMap).\n */\nfunction updateForwardTo<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null,\n config: RouteConfig,\n): Record<string, string> {\n // Prepare-then-commit (issue #698): apply the change to CLONES of the forward\n // maps, resolve the chain (a cycle throws here), and only then swap the clones\n // in — so a rejected update never leaves config.forwardMap poisoned.\n const forwardMap = Object.assign(\n Object.create(null) as RouteConfig[\"forwardMap\"],\n config.forwardMap,\n );\n const forwardFnMap = Object.assign(\n Object.create(null) as RouteConfig[\"forwardFnMap\"],\n config.forwardFnMap,\n );\n\n if (forwardTo === null) {\n delete forwardMap[name];\n delete forwardFnMap[name];\n } else if (typeof forwardTo === \"string\") {\n delete forwardFnMap[name];\n forwardMap[name] = forwardTo;\n } else {\n delete forwardMap[name];\n forwardFnMap[name] = forwardTo;\n }\n\n const resolved = refreshForwardMap({ ...config, forwardMap });\n\n config.forwardMap = forwardMap;\n config.forwardFnMap = forwardFnMap;\n\n return resolved;\n}\n\n/**\n * Builds a full Route object from a bare RouteDefinition by re-attaching\n * config entries and lifecycle factories.\n *\n * RECURSIVE — call with the factories tuple obtained ONCE from\n * `lifecycleNamespace.getFactories()` and pass it through to children.\n */\nfunction enrichRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routeDef: RouteDefinition,\n routeName: string,\n config: RouteConfig,\n factories: [\n Record<string, GuardFnFactory<Dependencies>>,\n Record<string, GuardFnFactory<Dependencies>>,\n ],\n): Route<Dependencies> {\n const route: Route<Dependencies> = {\n name: routeDef.name,\n path: routeDef.path,\n };\n\n const forwardToFn = config.forwardFnMap[routeName];\n const forwardToStr = config.forwardMap[routeName];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (forwardToFn !== undefined) {\n route.forwardTo = forwardToFn;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if (forwardToStr !== undefined) {\n route.forwardTo = forwardToStr;\n }\n\n if (routeName in config.defaultParams) {\n route.defaultParams = config.defaultParams[routeName];\n }\n\n if (routeName in config.decoders) {\n route.decodeParams = config.decoders[routeName];\n }\n\n if (routeName in config.encoders) {\n route.encodeParams = config.encoders[routeName];\n }\n\n const [canDeactivateFactories, canActivateFactories] = factories;\n\n if (routeName in canActivateFactories) {\n route.canActivate = canActivateFactories[routeName];\n }\n\n if (routeName in canDeactivateFactories) {\n route.canDeactivate = canDeactivateFactories[routeName];\n }\n\n if (routeDef.children) {\n route.children = routeDef.children.map((child) =>\n enrichRoute(child, `${routeName}.${child.name}`, config, factories),\n );\n }\n\n return route;\n}\n\n// ============================================================================\n// CRUD operations\n// ============================================================================\n\n/**\n * Adds one or more routes to the router.\n * Input already validated by facade.\n */\nfunction addRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n routes: Route<Dependencies>[],\n parentName?: string,\n): void {\n // Prepare-then-commit (issue #698): reject the silent-corruption cases\n // up front (dup name vs existing, missing parent), build the merged tree /\n // config into locals (async/circular forwardTo + invalid constraint throw\n // here), then swap atomically. A rejected add leaves the store untouched.\n assertAddable(store, routes, parentName);\n adoptRouteArtifacts(store, buildAddArtifacts(store, routes, parentName));\n}\n\n/**\n * Atomically replaces all routes with a new set (HMR / code-splitting).\n * Prepare-then-commit (issue #698): the new set is fully built into locals\n * first — a circular/async forwardTo or invalid path throws here, leaving the\n * existing tree intact — then committed.\n */\nfunction replaceRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n routes: Route<Dependencies>[],\n ctx: RouterInternals<Dependencies>,\n currentPath: string | undefined,\n previousTransition: TransitionMeta | undefined,\n): void {\n // Build the whole new set BEFORE touching the store.\n const artifacts = buildReplaceArtifacts(\n routes,\n store.rootPath,\n store.matcherOptions,\n );\n\n // Clear definition lifecycle handlers (preserve external guards), then swap.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearDefinitionGuards();\n adoptRouteArtifacts(store, artifacts);\n\n // Revalidate state (preserve transition from previous state)\n if (currentPath !== undefined) {\n const revalidated = ctx.matchPath(currentPath, ctx.getOptions());\n\n if (revalidated) {\n ctx.setState({\n ...revalidated,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- previousTransition is guaranteed defined: currentPath is only set when getState() returned a state, which always has transition\n transition: previousTransition!,\n });\n } else {\n ctx.clearState();\n }\n }\n}\n\n/**\n * Removes a route and all its children.\n *\n * @returns true if removed, false if not found\n */\nfunction removeRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(store: RoutesStore<Dependencies>, name: string): boolean {\n const wasRemoved = removeFromDefinitions(store.definitions, name);\n\n if (!wasRemoved) {\n return false;\n }\n\n clearRouteConfigurations(\n name,\n store.config,\n store.routeCustomFields,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n store.lifecycleNamespace!,\n );\n\n store.treeOperations.commitTreeChanges(store);\n\n return true;\n}\n\n/**\n * Updates a route's configuration in place.\n */\nfunction updateRouteConfig<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n name: string,\n updates: {\n forwardTo?: string | ForwardToCallback<Dependencies> | null | undefined;\n defaultParams?: Params | null | undefined;\n decodeParams?: ((params: Params) => Params) | null | undefined;\n encodeParams?: ((params: Params) => Params) | null | undefined;\n },\n): void {\n if (updates.forwardTo !== undefined) {\n store.resolvedForwardMap = updateForwardTo(\n name,\n updates.forwardTo,\n store.config,\n );\n }\n\n if (updates.defaultParams !== undefined) {\n if (updates.defaultParams === null) {\n delete store.config.defaultParams[name];\n } else {\n store.config.defaultParams[name] = updates.defaultParams;\n }\n }\n\n if (updates.decodeParams !== undefined) {\n if (updates.decodeParams === null) {\n delete store.config.decoders[name];\n } else {\n const decoder = updates.decodeParams;\n\n store.config.decoders[name] = (params: Params): Params =>\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime fallback if user-provided decoder violates its return type\n decoder(params) ?? params;\n }\n }\n\n if (updates.encodeParams !== undefined) {\n if (updates.encodeParams === null) {\n delete store.config.encoders[name];\n } else {\n const encoder = updates.encodeParams;\n\n store.config.encoders[name] = (params: Params): Params =>\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime fallback if user-provided encoder violates its return type\n encoder(params) ?? params;\n }\n }\n}\n\n/**\n * Gets a route by name with all its configuration.\n */\nfunction getRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n name: string,\n): Route<Dependencies> | undefined {\n const segments = store.matcher.getSegmentsByName(name);\n\n if (!segments) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- segments is non-empty (checked above)\n const targetNode = segments.at(-1)! as RouteTree;\n const definition = store.treeOperations.nodeToDefinition(targetNode);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const factories = store.lifecycleNamespace!.getFactories();\n\n return enrichRoute(definition, name, store.config, factories);\n}\n\n// ============================================================================\n// API factory\n// ============================================================================\n\nexport function getRoutesApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): RoutesApi<Dependencies> {\n const ctx = getInternals(router);\n\n const store = ctx.routeGetStore();\n\n const interceptableAdd = createInterceptable(\n \"add\",\n (routeArray: Route<Dependencies>[], options?: { parent?: string }) => {\n addRoutes(store, routeArray, options?.parent);\n },\n ctx.interceptors,\n );\n\n return {\n add: (routes, options) => {\n throwIfDisposed(ctx.isDisposed);\n\n const routeArray = Array.isArray(routes) ? routes : [routes];\n const parentName = options?.parent;\n\n guardRouteStructure(routeArray, ctx.validator);\n\n if (parentName !== undefined) {\n ctx.validator?.routes.validateParentOption(parentName, store.tree);\n }\n\n ctx.validator?.routes.throwIfInternalRouteInArray(routeArray, \"addRoute\");\n ctx.validator?.routes.validateAddRouteArgs(routeArray);\n ctx.validator?.routes.validateRoutes(routeArray, store);\n\n interceptableAdd(\n routeArray,\n parentName === undefined ? undefined : { parent: parentName },\n );\n },\n\n remove: (name) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRemoveRouteArgs(name);\n ctx.validator?.routes.throwIfInternalRoute(name, \"removeRoute\");\n\n const canRemove = validateRemoveRoute(\n name,\n ctx.getStateName(),\n ctx.isTransitioning(),\n );\n\n if (!canRemove) {\n return;\n }\n\n const wasRemoved = removeRoute(store, name);\n\n if (!wasRemoved) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" not found. No changes made.`,\n );\n }\n },\n\n update: (name, updates) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateUpdateRouteBasicArgs(name, updates);\n ctx.validator?.routes.throwIfInternalRoute(name, \"updateRoute\");\n\n const {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n canActivate,\n canDeactivate,\n } = updates;\n\n ctx.validator?.routes.validateUpdateRoutePropertyTypes(name, updates);\n\n /* v8 ignore next 6 -- @preserve: race condition guard, mirrors Router.updateRoute() same-path guard tested via Router.ts unit tests */\n if (ctx.isTransitioning()) {\n logger.error(\n \"router.updateRoute\",\n `Updating route \"${name}\" while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n ctx.validator?.routes.validateUpdateRoute(name, updates, store);\n\n updateRouteConfig(store, name, {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n });\n\n if (canActivate !== undefined) {\n if (canActivate === null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearCanActivate(name);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.addCanActivate(name, canActivate, true);\n }\n }\n\n if (canDeactivate !== undefined) {\n if (canDeactivate === null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearCanDeactivate(name);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.addCanDeactivate(name, canDeactivate, true);\n }\n }\n },\n\n clear: () => {\n throwIfDisposed(ctx.isDisposed);\n\n const canClear = validateClearRoutes(ctx.isTransitioning());\n\n /* v8 ignore next 3 -- @preserve: race condition guard, mirrors Router.clearRoutes() same-path guard tested via validateClearRoutes unit tests */\n if (!canClear) {\n return;\n }\n\n store.treeOperations.resetStore(store);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearAll();\n ctx.clearState();\n },\n\n has: (name) => {\n ctx.validator?.routes.validateRouteName(name, \"hasRoute\");\n\n return store.matcher.hasRoute(name);\n },\n\n get: (name) => {\n ctx.validator?.routes.validateRouteName(name, \"getRoute\");\n\n return getRoute(store, name);\n },\n\n replace: (routes) => {\n throwIfDisposed(ctx.isDisposed);\n\n const routeArray = Array.isArray(routes) ? routes : [routes];\n\n const canReplace = validateClearRoutes(ctx.isTransitioning());\n\n if (!canReplace) {\n return;\n }\n\n guardRouteStructure(routeArray, ctx.validator);\n\n ctx.validator?.routes.throwIfInternalRouteInArray(\n routeArray,\n \"replaceRoutes\",\n );\n ctx.validator?.routes.validateAddRouteArgs(routeArray);\n ctx.validator?.routes.validateRoutes(routeArray, store);\n\n const currentState = router.getState();\n\n replaceRoutes(\n store,\n routeArray,\n ctx,\n currentState?.path,\n currentState?.transition,\n );\n },\n };\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { getInternals } from \"../internals\";\n\nimport type { DependenciesApi } from \"./types\";\nimport type { DependenciesStore } from \"../namespaces\";\nimport type { RouterValidator } from \"../types/RouterValidator\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\n// =============================================================================\n// Module-private CRUD functions\n// =============================================================================\n\nfunction setDependency(\n store: DependenciesStore,\n dependencyName: string,\n dependencyValue: unknown,\n validator?: RouterValidator | null,\n): boolean {\n // undefined = \"don't set\" (feature for conditional setting)\n if (dependencyValue === undefined) {\n return false;\n }\n\n const isNewKey = !Object.hasOwn(store.dependencies, dependencyName);\n\n if (isNewKey) {\n // Only check limit when adding new keys (overwrites don't increase count)\n validator?.dependencies.validateDependencyCount(store, \"setDependency\");\n } else {\n const oldValue = (store.dependencies as Record<string, unknown>)[\n dependencyName\n ];\n const isChanging = oldValue !== dependencyValue;\n // Special case for NaN idempotency (NaN !== NaN is always true)\n const bothAreNaN = Number.isNaN(oldValue) && Number.isNaN(dependencyValue);\n\n if (isChanging && !bothAreNaN) {\n validator?.dependencies.warnOverwrite(dependencyName, \"setDependency\");\n }\n }\n\n (store.dependencies as Record<string, unknown>)[dependencyName] =\n dependencyValue;\n\n return true;\n}\n\nfunction setMultipleDependencies(\n store: DependenciesStore,\n deps: Record<string, unknown>,\n validator?: RouterValidator | null,\n): void {\n const overwrittenKeys: string[] = [];\n\n for (const key in deps) {\n if (deps[key] !== undefined) {\n if (Object.hasOwn(store.dependencies, key)) {\n overwrittenKeys.push(key);\n } else {\n validator?.dependencies.validateDependencyCount(\n store,\n \"setDependencies\",\n );\n }\n\n (store.dependencies as Record<string, unknown>)[key] = deps[key];\n }\n }\n\n if (overwrittenKeys.length > 0) {\n validator?.dependencies.warnBatchOverwrite(\n overwrittenKeys,\n \"setDependencies\",\n );\n }\n}\n\n// =============================================================================\n// Public API factory\n// =============================================================================\n\nexport function getDependenciesApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): DependenciesApi<Dependencies> {\n const ctx = getInternals(router);\n\n return {\n get: (name) => {\n ctx.validator?.dependencies.validateDependencyName(name, \"getDependency\");\n\n const store = ctx.dependenciesGetStore();\n const value = (store.dependencies as Record<string, unknown>)[\n name as string\n ];\n\n ctx.validator?.dependencies.validateDependencyExists(\n name as string,\n store,\n );\n\n return value as Dependencies[typeof name];\n },\n getAll: () => ({ ...ctx.dependenciesGetStore().dependencies }),\n set: (name, value) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.dependencies.validateSetDependencyArgs(\n name,\n value,\n \"setDependency\",\n );\n\n setDependency(ctx.dependenciesGetStore(), name, value, ctx.validator);\n },\n setAll: (deps) => {\n throwIfDisposed(ctx.isDisposed);\n\n const store = ctx.dependenciesGetStore();\n\n ctx.validator?.dependencies.validateDependenciesObject(\n deps,\n \"setDependencies\",\n );\n ctx.validator?.dependencies.validateDependencyLimit(store, store.limits);\n\n setMultipleDependencies(\n store,\n deps as Record<string, unknown>,\n ctx.validator,\n );\n },\n remove: (name) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.dependencies.validateDependencyName(\n name,\n \"removeDependency\",\n );\n\n const store = ctx.dependenciesGetStore();\n\n if (!Object.hasOwn(store.dependencies, name)) {\n ctx.validator?.dependencies.warnRemoveNonExistent(name);\n }\n\n delete (store.dependencies as Record<string, unknown>)[name as string];\n },\n reset: () => {\n throwIfDisposed(ctx.isDisposed);\n const store = ctx.dependenciesGetStore();\n\n store.dependencies = Object.create(null) as Partial<Dependencies>;\n },\n has: (name) => {\n ctx.validator?.dependencies.validateDependencyName(name, \"hasDependency\");\n\n return Object.hasOwn(ctx.dependenciesGetStore().dependencies, name);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"api.mjs","names":[],"sources":["../../src/namespaces/RoutesNamespace/routeGuards.ts","../../src/api/getRoutesApi.ts","../../src/api/getDependenciesApi.ts"],"sourcesContent":["import { logger } from \"@real-router/logger\";\n\n/**\n * Validates removeRoute constraints.\n * Returns false if removal should be blocked (route is active).\n * Logs warnings for edge cases.\n *\n * @param name - Route name to remove\n * @param currentStateName - Current active route name (or undefined)\n * @param isNavigating - Whether navigation is in progress\n * @returns true if removal can proceed, false if blocked\n */\nexport function validateRemoveRoute(\n name: string,\n currentStateName: string | undefined,\n isNavigating: boolean,\n): boolean {\n if (currentStateName) {\n const isExactMatch = currentStateName === name;\n const isParentOfCurrent = currentStateName.startsWith(`${name}.`);\n\n if (isExactMatch || isParentOfCurrent) {\n const suffix = isExactMatch ? \"\" : ` (current: \"${currentStateName}\")`;\n\n logger.warn(\n \"router.removeRoute\",\n `Cannot remove route \"${name}\" — it is currently active${suffix}. Navigate away first.`,\n );\n\n return false;\n }\n }\n\n if (isNavigating) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" removed while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n return true;\n}\n\n/**\n * Validates clearRoutes operation.\n * Returns false if operation should be blocked (navigation in progress).\n *\n * @param isNavigating - Whether navigation is in progress\n * @returns true if clearRoutes can proceed, false if blocked\n */\nexport function validateClearRoutes(isNavigating: boolean): boolean {\n if (isNavigating) {\n logger.error(\n \"router.clearRoutes\",\n \"Cannot clear routes while navigation is in progress. Wait for navigation to complete.\",\n );\n\n return false;\n }\n\n return true;\n}\n","import { logger } from \"@real-router/logger\";\n\nimport { throwIfDisposed } from \"./helpers\";\nimport { guardRouteStructure } from \"../guards\";\nimport { getInternals } from \"../internals\";\nimport {\n clearConfigEntries,\n removeFromDefinitions,\n} from \"../namespaces/RoutesNamespace/helpers\";\nimport {\n validateClearRoutes,\n validateRemoveRoute,\n} from \"../namespaces/RoutesNamespace/routeGuards\";\nimport {\n adoptRouteArtifacts,\n assertAddable,\n buildAddArtifacts,\n buildReplaceArtifacts,\n refreshForwardMap,\n} from \"../namespaces/RoutesNamespace/routesStore\";\n\nimport type { RoutesApi } from \"./types\";\nimport type { RouterInternals } from \"../internals\";\nimport type { RouteLifecycleNamespace, RouteConfig } from \"../namespaces\";\nimport type { RoutesStore } from \"../namespaces/RoutesNamespace\";\nimport type { GuardFnFactory, Route } from \"../types\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Params,\n Router,\n TransitionMeta,\n TreeChangedEvent,\n TreeStructuralPatch,\n} from \"@real-router/types\";\nimport type { RouteDefinition, RouteTree } from \"route-tree\";\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Clears all config entries and lifecycle handlers for a removed route\n * (and all its descendants).\n */\nfunction clearRouteConfigurations<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routeName: string,\n config: RouteConfig,\n routeCustomFields: Record<string, Record<string, unknown>>,\n lifecycleNamespace: RouteLifecycleNamespace<Dependencies>,\n): void {\n const shouldClear = (name: string): boolean =>\n name === routeName || name.startsWith(`${routeName}.`);\n\n clearConfigEntries(config.decoders, shouldClear);\n clearConfigEntries(config.encoders, shouldClear);\n clearConfigEntries(config.defaultParams, shouldClear);\n clearConfigEntries(config.forwardMap, shouldClear);\n clearConfigEntries(config.forwardFnMap, shouldClear);\n clearConfigEntries(routeCustomFields, shouldClear);\n\n // Clear forwardMap entries pointing TO the deleted route (or its descendants)\n clearConfigEntries(config.forwardMap, (key) =>\n shouldClear(config.forwardMap[key]),\n );\n\n // Clear lifecycle handlers\n const [canDeactivateFactories, canActivateFactories] =\n lifecycleNamespace.getFactories();\n\n for (const name of Object.keys(canActivateFactories)) {\n if (shouldClear(name)) {\n lifecycleNamespace.clearCanActivate(name);\n }\n }\n\n for (const name of Object.keys(canDeactivateFactories)) {\n if (shouldClear(name)) {\n lifecycleNamespace.clearCanDeactivate(name);\n }\n }\n}\n\n/**\n * Updates forwardTo for a route in config and returns the refreshed resolved\n * forward map (REPLACE semantics — caller must call ctx.setResolvedForwardMap).\n */\nfunction updateForwardTo<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n name: string,\n forwardTo: string | ForwardToCallback<Dependencies> | null,\n config: RouteConfig,\n): Record<string, string> {\n // Prepare-then-commit (issue #698): apply the change to CLONES of the forward\n // maps, resolve the chain (a cycle throws here), and only then swap the clones\n // in — so a rejected update never leaves config.forwardMap poisoned.\n const forwardMap = Object.assign(\n Object.create(null) as RouteConfig[\"forwardMap\"],\n config.forwardMap,\n );\n const forwardFnMap = Object.assign(\n Object.create(null) as RouteConfig[\"forwardFnMap\"],\n config.forwardFnMap,\n );\n\n if (forwardTo === null) {\n delete forwardMap[name];\n delete forwardFnMap[name];\n } else if (typeof forwardTo === \"string\") {\n delete forwardFnMap[name];\n forwardMap[name] = forwardTo;\n } else {\n delete forwardMap[name];\n forwardFnMap[name] = forwardTo;\n }\n\n const resolved = refreshForwardMap({ ...config, forwardMap });\n\n config.forwardMap = forwardMap;\n config.forwardFnMap = forwardFnMap;\n\n return resolved;\n}\n\n/**\n * Re-attaches the stored config (forwardTo / defaultParams / encode-decode) and\n * lifecycle guards for `lookupName` onto `route`, then returns it (mutates in\n * place). Shared by {@link enrichRoute} (nested, bare `name`) and\n * {@link buildFlatRoute} (flat, full dotted `name`) — one source of truth for\n * the route-config field set.\n */\nfunction assignRouteConfig<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n route: Route<Dependencies>,\n lookupName: string,\n config: RouteConfig,\n factories: [\n Record<string, GuardFnFactory<Dependencies>>,\n Record<string, GuardFnFactory<Dependencies>>,\n ],\n): Route<Dependencies> {\n const forwardToFn = config.forwardFnMap[lookupName];\n const forwardToStr = config.forwardMap[lookupName];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (forwardToFn !== undefined) {\n route.forwardTo = forwardToFn;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if (forwardToStr !== undefined) {\n route.forwardTo = forwardToStr;\n }\n\n if (lookupName in config.defaultParams) {\n route.defaultParams = config.defaultParams[lookupName];\n }\n\n if (lookupName in config.decoders) {\n route.decodeParams = config.decoders[lookupName];\n }\n\n if (lookupName in config.encoders) {\n route.encodeParams = config.encoders[lookupName];\n }\n\n const [canDeactivateFactories, canActivateFactories] = factories;\n\n if (lookupName in canActivateFactories) {\n route.canActivate = canActivateFactories[lookupName];\n }\n\n if (lookupName in canDeactivateFactories) {\n route.canDeactivate = canDeactivateFactories[lookupName];\n }\n\n return route;\n}\n\n/**\n * Builds a full Route object from a bare RouteDefinition by re-attaching\n * config entries and lifecycle factories.\n *\n * RECURSIVE — call with the factories tuple obtained ONCE from\n * `lifecycleNamespace.getFactories()` and pass it through to children.\n */\nfunction enrichRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routeDef: RouteDefinition,\n routeName: string,\n config: RouteConfig,\n factories: [\n Record<string, GuardFnFactory<Dependencies>>,\n Record<string, GuardFnFactory<Dependencies>>,\n ],\n): Route<Dependencies> {\n const route: Route<Dependencies> = {\n name: routeDef.name,\n path: routeDef.path,\n };\n\n assignRouteConfig(route, routeName, config, factories);\n\n if (routeDef.children) {\n route.children = routeDef.children.map((child) =>\n enrichRoute(child, `${routeName}.${child.name}`, config, factories),\n );\n }\n\n return route;\n}\n\n// ============================================================================\n// TREE_CHANGED payload helpers\n// ============================================================================\n\n/**\n * Builds a single FLAT `Route` for `fullName` from the store config + lifecycle\n * factories — `name` is the FULL dotted name and there is no `children` array\n * (consumers want a flat, by-name list). Frozen on construction.\n */\nfunction buildFlatRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n fullName: string,\n path: string,\n config: RouteConfig,\n factories: [\n Record<string, GuardFnFactory<Dependencies>>,\n Record<string, GuardFnFactory<Dependencies>>,\n ],\n): Route<Dependencies> {\n const route: Route<Dependencies> = { name: fullName, path };\n\n assignRouteConfig(route, fullName, config, factories);\n\n return Object.freeze(route);\n}\n\n/**\n * Walks the store's definitions depth-first, building a FLAT\n * `Map<fullName, Route>` for every node whose full dotted name satisfies\n * `include`. Reads the live store, so call it at the right moment relative to\n * the mutation (before for removed, after for added).\n */\nfunction collectFlatRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n include: (fullName: string) => boolean,\n): Map<string, Route<Dependencies>> {\n const result = new Map<string, Route<Dependencies>>();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const factories = store.lifecycleNamespace!.getFactories();\n\n const walk = (defs: readonly RouteDefinition[], parentName: string): void => {\n for (const def of defs) {\n const fullName = parentName ? `${parentName}.${def.name}` : def.name;\n\n if (include(fullName)) {\n result.set(\n fullName,\n buildFlatRoute(fullName, def.path, store.config, factories),\n );\n }\n\n if (def.children) {\n walk(def.children, fullName);\n }\n }\n };\n\n walk(store.definitions, \"\");\n\n return result;\n}\n\n/**\n * Collects the route `name` and all of its descendants as a FLAT, frozen array.\n * MUST be called BEFORE the removal mutation — the nodes are gone afterwards.\n */\nfunction collectSubtree<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n name: string,\n): readonly Route<Dependencies>[] {\n const prefix = `${name}.`;\n const subtree = collectFlatRoutes(\n store,\n (fullName) => fullName === name || fullName.startsWith(prefix),\n );\n\n return Object.freeze([...subtree.values()]);\n}\n\n/**\n * Builds the FLAT, frozen payload array for an `add`, walking only the input\n * routes — O(added), not O(tree). `path` is taken from the input verbatim\n * (`sanitizeRoute` never rewrites it); config fields are read from the\n * post-commit store by full name. `add` never removes, so the input subtree is\n * exactly what changed.\n */\nfunction collectAddedRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routes: readonly Route<Dependencies>[],\n parentName: string | undefined,\n store: RoutesStore<Dependencies>,\n): readonly Route<Dependencies>[] {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const factories = store.lifecycleNamespace!.getFactories();\n const result: Route<Dependencies>[] = [];\n\n const walk = (\n input: readonly Route<Dependencies>[],\n parent: string,\n ): void => {\n for (const route of input) {\n const fullName = parent ? `${parent}.${route.name}` : route.name;\n\n result.push(\n buildFlatRoute(fullName, route.path, store.config, factories),\n );\n\n if (route.children) {\n walk(route.children, fullName);\n }\n }\n };\n\n walk(routes, parentName ?? \"\");\n\n return Object.freeze(result);\n}\n\n/** Diffs two flat route maps by full name into frozen removed/added arrays. */\nfunction diffFlatRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n before: ReadonlyMap<string, Route<Dependencies>>,\n after: ReadonlyMap<string, Route<Dependencies>>,\n): {\n removed: readonly Route<Dependencies>[];\n added: readonly Route<Dependencies>[];\n} {\n const removed: Route<Dependencies>[] = [];\n const added: Route<Dependencies>[] = [];\n\n for (const [fullName, route] of before) {\n if (!after.has(fullName)) {\n removed.push(route);\n }\n }\n\n for (const [fullName, route] of after) {\n if (!before.has(fullName)) {\n added.push(route);\n }\n }\n\n return { removed: Object.freeze(removed), added: Object.freeze(added) };\n}\n\n/**\n * Builds the structural subset of an `update()` patch (forwardTo /\n * defaultParams / encodeParams / decodeParams) from the already-destructured\n * update fields — so user getters are not re-invoked. A guard-only patch yields\n * an empty object → the caller emits no TREE_CHANGED (О-7: guards are\n * invoked-on-demand, not cached, so they need no observation channel).\n *\n * The returned envelope is a fresh object (caller's patch untouched) and is\n * frozen on construction. Nested values (e.g. `defaultParams`) are kept by\n * reference — the same objects the router stored — so exotic inputs (circular\n * refs, class instances) are tolerated, matching `update()`'s existing contract.\n */\nfunction buildStructuralPatch<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(fields: {\n forwardTo?: string | ForwardToCallback<Dependencies> | null | undefined;\n defaultParams?: Params | null | undefined;\n decodeParams?: ((params: Params) => Params) | null | undefined;\n encodeParams?: ((params: Params) => Params) | null | undefined;\n}): Readonly<TreeStructuralPatch<Dependencies>> {\n const patch: TreeStructuralPatch<Dependencies> = {};\n\n if (fields.forwardTo !== undefined) {\n patch.forwardTo = fields.forwardTo;\n }\n\n if (fields.defaultParams !== undefined) {\n patch.defaultParams = fields.defaultParams;\n }\n\n if (fields.encodeParams !== undefined) {\n patch.encodeParams = fields.encodeParams;\n }\n\n if (fields.decodeParams !== undefined) {\n patch.decodeParams = fields.decodeParams;\n }\n\n return Object.freeze(patch);\n}\n\n// ============================================================================\n// CRUD operations\n// ============================================================================\n\n/**\n * Adds one or more routes to the router.\n * Input already validated by facade.\n */\nfunction addRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n routes: Route<Dependencies>[],\n parentName?: string,\n): void {\n // Prepare-then-commit (issue #698): reject the silent-corruption cases\n // up front (dup name vs existing, missing parent), build the merged tree /\n // config into locals (async/circular forwardTo + invalid constraint throw\n // here), then swap atomically. A rejected add leaves the store untouched.\n assertAddable(store, routes, parentName);\n adoptRouteArtifacts(store, buildAddArtifacts(store, routes, parentName));\n}\n\n/**\n * Atomically replaces all routes with a new set (HMR / code-splitting).\n * Prepare-then-commit (issue #698): the new set is fully built into locals\n * first — a circular/async forwardTo or invalid path throws here, leaving the\n * existing tree intact — then committed.\n */\nfunction replaceRoutes<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n routes: Route<Dependencies>[],\n ctx: RouterInternals<Dependencies>,\n currentPath: string | undefined,\n previousTransition: TransitionMeta | undefined,\n onCommitted?: () => void,\n): void {\n // Build the whole new set BEFORE touching the store.\n const artifacts = buildReplaceArtifacts(\n routes,\n store.rootPath,\n store.matcherOptions,\n );\n\n // Clear definition lifecycle handlers (preserve external guards), then swap.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearDefinitionGuards();\n adoptRouteArtifacts(store, artifacts);\n\n // TREE_CHANGED fires here (О-5): the new tree is committed but state is not\n // yet revalidated, so the handler sees the new tree and the still-old state.\n onCommitted?.();\n\n // Revalidate state (preserve transition from previous state)\n if (currentPath !== undefined) {\n const revalidated = ctx.matchPath(currentPath, ctx.getOptions());\n\n if (revalidated) {\n ctx.setState({\n ...revalidated,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- previousTransition is guaranteed defined: currentPath is only set when getState() returned a state, which always has transition\n transition: previousTransition!,\n });\n } else {\n ctx.clearState();\n }\n }\n}\n\n/**\n * Removes a route and all its children.\n *\n * @returns true if removed, false if not found\n */\nfunction removeRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(store: RoutesStore<Dependencies>, name: string): boolean {\n const wasRemoved = removeFromDefinitions(store.definitions, name);\n\n if (!wasRemoved) {\n return false;\n }\n\n clearRouteConfigurations(\n name,\n store.config,\n store.routeCustomFields,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n store.lifecycleNamespace!,\n );\n\n store.treeOperations.commitTreeChanges(store);\n\n return true;\n}\n\n/**\n * Updates a route's configuration in place.\n */\nfunction updateRouteConfig<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n name: string,\n updates: {\n forwardTo?: string | ForwardToCallback<Dependencies> | null | undefined;\n defaultParams?: Params | null | undefined;\n decodeParams?: ((params: Params) => Params) | null | undefined;\n encodeParams?: ((params: Params) => Params) | null | undefined;\n },\n): void {\n if (updates.forwardTo !== undefined) {\n store.resolvedForwardMap = updateForwardTo(\n name,\n updates.forwardTo,\n store.config,\n );\n }\n\n if (updates.defaultParams !== undefined) {\n if (updates.defaultParams === null) {\n delete store.config.defaultParams[name];\n } else {\n store.config.defaultParams[name] = updates.defaultParams;\n }\n }\n\n if (updates.decodeParams !== undefined) {\n if (updates.decodeParams === null) {\n delete store.config.decoders[name];\n } else {\n const decoder = updates.decodeParams;\n\n store.config.decoders[name] = (params: Params): Params =>\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime fallback if user-provided decoder violates its return type\n decoder(params) ?? params;\n }\n }\n\n if (updates.encodeParams !== undefined) {\n if (updates.encodeParams === null) {\n delete store.config.encoders[name];\n } else {\n const encoder = updates.encodeParams;\n\n store.config.encoders[name] = (params: Params): Params =>\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime fallback if user-provided encoder violates its return type\n encoder(params) ?? params;\n }\n }\n}\n\n/**\n * Gets a route by name with all its configuration.\n */\nfunction getRoute<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n store: RoutesStore<Dependencies>,\n name: string,\n): Route<Dependencies> | undefined {\n const segments = store.matcher.getSegmentsByName(name);\n\n if (!segments) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- segments is non-empty (checked above)\n const targetNode = segments.at(-1)! as RouteTree;\n const definition = store.treeOperations.nodeToDefinition(targetNode);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const factories = store.lifecycleNamespace!.getFactories();\n\n return enrichRoute(definition, name, store.config, factories);\n}\n\n// ============================================================================\n// API factory\n// ============================================================================\n\nexport function getRoutesApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): RoutesApi<Dependencies> {\n const ctx = getInternals(router);\n\n const store = ctx.routeGetStore();\n\n // Single cast site: the channel is typed with default Dependencies on\n // RouterInternals (RouterEventMap is non-generic), but payloads are built\n // with this api's Dependencies. The runtime shape is identical.\n const emitChange = (event: TreeChangedEvent<Dependencies>): void => {\n ctx.treeChanged.emit(event as TreeChangedEvent);\n };\n\n return {\n add: (routes, options) => {\n throwIfDisposed(ctx.isDisposed);\n\n const routeArray = Array.isArray(routes) ? routes : [routes];\n const parentName = options?.parent;\n\n guardRouteStructure(routeArray, ctx.validator);\n\n if (parentName !== undefined) {\n ctx.validator?.routes.validateParentOption(parentName, store.tree);\n }\n\n ctx.validator?.routes.throwIfInternalRouteInArray(routeArray, \"addRoute\");\n ctx.validator?.routes.validateAddRouteArgs(routeArray);\n ctx.validator?.routes.validateRoutes(routeArray, store);\n\n addRoutes(store, routeArray, parentName);\n\n // Built from the post-commit store (О-1), only when someone is listening.\n if (ctx.treeChanged.listenerCount() > 0) {\n const added = collectAddedRoutes(routeArray, parentName, store);\n\n emitChange(\n parentName === undefined\n ? { op: \"add\", added }\n : { op: \"add\", added, parent: parentName },\n );\n }\n },\n\n remove: (name) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRemoveRouteArgs(name);\n ctx.validator?.routes.throwIfInternalRoute(name, \"removeRoute\");\n\n const canRemove = validateRemoveRoute(\n name,\n ctx.getStateName(),\n ctx.isTransitioning(),\n );\n\n if (!canRemove) {\n return;\n }\n\n // Snapshot the subtree BEFORE the mutation — the nodes are gone after.\n const removedSubtree =\n ctx.treeChanged.listenerCount() > 0\n ? collectSubtree(store, name)\n : undefined;\n const wasRemoved = removeRoute(store, name);\n\n if (!wasRemoved) {\n logger.warn(\n \"router.removeRoute\",\n `Route \"${name}\" not found. No changes made.`,\n );\n\n return;\n }\n\n if (removedSubtree !== undefined) {\n emitChange({ op: \"remove\", name, removedSubtree });\n }\n },\n\n update: (name, updates) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateUpdateRouteBasicArgs(name, updates);\n ctx.validator?.routes.throwIfInternalRoute(name, \"updateRoute\");\n\n const {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n canActivate,\n canDeactivate,\n } = updates;\n\n ctx.validator?.routes.validateUpdateRoutePropertyTypes(name, updates);\n\n /* v8 ignore next 6 -- @preserve: race condition guard, mirrors Router.updateRoute() same-path guard tested via Router.ts unit tests */\n if (ctx.isTransitioning()) {\n logger.error(\n \"router.updateRoute\",\n `Updating route \"${name}\" while navigation is in progress. This may cause unexpected behavior.`,\n );\n }\n\n ctx.validator?.routes.validateUpdateRoute(name, updates, store);\n\n updateRouteConfig(store, name, {\n forwardTo,\n defaultParams,\n decodeParams,\n encodeParams,\n });\n\n if (canActivate !== undefined) {\n if (canActivate === null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearCanActivate(name);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.addCanActivate(name, canActivate, true);\n }\n }\n\n if (canDeactivate !== undefined) {\n if (canDeactivate === null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearCanDeactivate(name);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.addCanDeactivate(name, canDeactivate, true);\n }\n }\n\n // Conditional emit: structural fields only, built from the destructured\n // locals (so user getters are not re-invoked). A guard-only or empty\n // patch produces no event (О-7 + empty-patch rule).\n if (ctx.treeChanged.listenerCount() > 0) {\n const patch = buildStructuralPatch<Dependencies>({\n forwardTo,\n defaultParams,\n encodeParams,\n decodeParams,\n });\n\n if (Object.keys(patch).length > 0) {\n emitChange({ op: \"update\", name, patch });\n }\n }\n },\n\n clear: () => {\n throwIfDisposed(ctx.isDisposed);\n\n const canClear = validateClearRoutes(ctx.isTransitioning());\n\n /* v8 ignore next 3 -- @preserve: race condition guard, mirrors Router.clearRoutes() same-path guard tested via validateClearRoutes unit tests */\n if (!canClear) {\n return;\n }\n\n // Snapshot the routes BEFORE the reset empties them. Emitted whenever\n // there is a listener — even for an empty clear (О-4).\n const removed =\n ctx.treeChanged.listenerCount() > 0\n ? Object.freeze([...collectFlatRoutes(store, () => true).values()])\n : undefined;\n\n store.treeOperations.resetStore(store);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n store.lifecycleNamespace!.clearAll();\n ctx.clearState();\n\n if (removed !== undefined) {\n emitChange({ op: \"clear\", removed });\n }\n },\n\n has: (name) => {\n ctx.validator?.routes.validateRouteName(name, \"hasRoute\");\n\n return store.matcher.hasRoute(name);\n },\n\n get: (name) => {\n ctx.validator?.routes.validateRouteName(name, \"getRoute\");\n\n return getRoute(store, name);\n },\n\n replace: (routes) => {\n throwIfDisposed(ctx.isDisposed);\n\n const routeArray = Array.isArray(routes) ? routes : [routes];\n\n const canReplace = validateClearRoutes(ctx.isTransitioning());\n\n if (!canReplace) {\n return;\n }\n\n guardRouteStructure(routeArray, ctx.validator);\n\n ctx.validator?.routes.throwIfInternalRouteInArray(\n routeArray,\n \"replaceRoutes\",\n );\n ctx.validator?.routes.validateAddRouteArgs(routeArray);\n ctx.validator?.routes.validateRoutes(routeArray, store);\n\n const currentState = router.getState();\n\n // The flat removed/added diff is O(N) — compute it only when someone is\n // listening (Решение 3.B). Snapshot the old tree BEFORE the swap.\n const before =\n ctx.treeChanged.listenerCount() > 0\n ? collectFlatRoutes(store, () => true)\n : undefined;\n\n replaceRoutes(\n store,\n routeArray,\n ctx,\n currentState?.path,\n currentState?.transition,\n before === undefined\n ? undefined\n : () => {\n const after = collectFlatRoutes(store, () => true);\n const { removed, added } = diffFlatRoutes(before, after);\n\n emitChange({ op: \"replace\", removed, added });\n },\n );\n },\n\n subscribeChanges: (handler) => ctx.treeChanged.subscribe(handler),\n };\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { getInternals } from \"../internals\";\n\nimport type { DependenciesApi } from \"./types\";\nimport type { DependenciesStore } from \"../namespaces\";\nimport type { RouterValidator } from \"../types/RouterValidator\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\n// =============================================================================\n// Module-private CRUD functions\n// =============================================================================\n\nfunction setDependency(\n store: DependenciesStore,\n dependencyName: string,\n dependencyValue: unknown,\n validator?: RouterValidator | null,\n): boolean {\n // undefined = \"don't set\" (feature for conditional setting)\n if (dependencyValue === undefined) {\n return false;\n }\n\n const isNewKey = !Object.hasOwn(store.dependencies, dependencyName);\n\n if (isNewKey) {\n // Only check limit when adding new keys (overwrites don't increase count)\n validator?.dependencies.validateDependencyCount(store, \"setDependency\");\n } else {\n const oldValue = (store.dependencies as Record<string, unknown>)[\n dependencyName\n ];\n const isChanging = oldValue !== dependencyValue;\n // Special case for NaN idempotency (NaN !== NaN is always true)\n const bothAreNaN = Number.isNaN(oldValue) && Number.isNaN(dependencyValue);\n\n if (isChanging && !bothAreNaN) {\n validator?.dependencies.warnOverwrite(dependencyName, \"setDependency\");\n }\n }\n\n (store.dependencies as Record<string, unknown>)[dependencyName] =\n dependencyValue;\n\n return true;\n}\n\nfunction setMultipleDependencies(\n store: DependenciesStore,\n deps: Record<string, unknown>,\n validator?: RouterValidator | null,\n): void {\n const overwrittenKeys: string[] = [];\n\n for (const key in deps) {\n if (deps[key] !== undefined) {\n if (Object.hasOwn(store.dependencies, key)) {\n overwrittenKeys.push(key);\n } else {\n validator?.dependencies.validateDependencyCount(\n store,\n \"setDependencies\",\n );\n }\n\n (store.dependencies as Record<string, unknown>)[key] = deps[key];\n }\n }\n\n if (overwrittenKeys.length > 0) {\n validator?.dependencies.warnBatchOverwrite(\n overwrittenKeys,\n \"setDependencies\",\n );\n }\n}\n\n// =============================================================================\n// Public API factory\n// =============================================================================\n\nexport function getDependenciesApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): DependenciesApi<Dependencies> {\n const ctx = getInternals(router);\n\n return {\n get: (name) => {\n ctx.validator?.dependencies.validateDependencyName(name, \"getDependency\");\n\n const store = ctx.dependenciesGetStore();\n const value = (store.dependencies as Record<string, unknown>)[\n name as string\n ];\n\n ctx.validator?.dependencies.validateDependencyExists(\n name as string,\n store,\n );\n\n return value as Dependencies[typeof name];\n },\n getAll: () => ({ ...ctx.dependenciesGetStore().dependencies }),\n set: (name, value) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.dependencies.validateSetDependencyArgs(\n name,\n value,\n \"setDependency\",\n );\n\n setDependency(ctx.dependenciesGetStore(), name, value, ctx.validator);\n },\n setAll: (deps) => {\n throwIfDisposed(ctx.isDisposed);\n\n const store = ctx.dependenciesGetStore();\n\n ctx.validator?.dependencies.validateDependenciesObject(\n deps,\n \"setDependencies\",\n );\n ctx.validator?.dependencies.validateDependencyLimit(store, store.limits);\n\n setMultipleDependencies(\n store,\n deps as Record<string, unknown>,\n ctx.validator,\n );\n },\n remove: (name) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.dependencies.validateDependencyName(\n name,\n \"removeDependency\",\n );\n\n const store = ctx.dependenciesGetStore();\n\n if (!Object.hasOwn(store.dependencies, name)) {\n ctx.validator?.dependencies.warnRemoveNonExistent(name);\n }\n\n delete (store.dependencies as Record<string, unknown>)[name as string];\n },\n reset: () => {\n throwIfDisposed(ctx.isDisposed);\n const store = ctx.dependenciesGetStore();\n\n store.dependencies = Object.create(null) as Partial<Dependencies>;\n },\n has: (name) => {\n ctx.validator?.dependencies.validateDependencyName(name, \"hasDependency\");\n\n return Object.hasOwn(ctx.dependenciesGetStore().dependencies, name);\n },\n };\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{d as e,h as t,n,t as r}from"./Router-DiZbYMLx.mjs";import{r as i}from"./internals-DT4mneSz.mjs";function a(e){if(e())throw new n(t.ROUTER_DISPOSED)}const o=new WeakMap;function s(e){let r=o.get(e);if(r)return r;let s=i(e),c={makeState:(e,t,n,r)=>(s.validator?.state.validateMakeStateArgs(e,t,n),s.makeState(e,t,n,r?.params)),buildState:(e,t)=>{s.validator?.routes.validateStateBuilderArgs(e,t,`buildState`);let{name:n,params:r}=s.forwardState(e,t);return s.buildStateResolved(n,r)},forwardState:(e,t)=>(s.validator?.routes.validateStateBuilderArgs(e,t,`forwardState`),s.forwardState(e,t)),matchPath:e=>(s.validator?.routes.validateMatchPathArgs(e),s.matchPath(e,s.getOptions())),navigateToState:(e,t)=>(a(s.isDisposed),s.validator?.navigation.validateNavigateToStateArgs(e),t!==void 0&&s.validator?.navigation.validateNavigationOptions(t,`navigateToState`),s.navigateToState(e,t)),setRootPath:e=>{a(s.isDisposed),s.validator?.routes.validateSetRootPathArgs(e),s.setRootPath(e)},getRootPath:s.getRootPath,addEventListener:(e,t)=>(a(s.isDisposed),s.validator?.eventBus.validateListenerArgs(e,t),s.addEventListener(e,t)),buildNavigationState:(e,t={})=>{s.validator?.routes.validateStateBuilderArgs(e,t,`buildNavigationState`);let{name:n,params:r}=s.forwardState(e,t),i=s.buildStateResolved(n,r);if(i)return s.makeState(i.name,i.params,s.buildPath(i.name,i.params),i.meta)},getOptions:s.getOptions,getTree:s.getTree,addInterceptor:(e,t)=>{a(s.isDisposed),s.validator?.plugins.validateAddInterceptorArgs(e,t);let n=s.interceptors.get(e);return n||(n=[],s.interceptors.set(e,n)),n.push(t),()=>{let e=n.indexOf(t);e!==-1&&n.splice(e,1)}},getRouteConfig:e=>{let t=s.routeGetStore();if(t.matcher.hasRoute(e))return t.routeCustomFields[e]},extendRouter:r=>{a(s.isDisposed);let i=Object.keys(r);for(let r of i)if(r in e)throw new n(t.PLUGIN_CONFLICT,{message:`Cannot extend router: property "${r}" already exists`});for(let t of i)e[t]=r[t];let o={keys:i};s.routerExtensions.push(o);let c=!1;return()=>{if(c)return;c=!0;for(let t of o.keys)delete e[t];let t=s.routerExtensions.indexOf(o);t!==-1&&s.routerExtensions.splice(t,1)}},emitTransitionError:e=>{a(s.isDisposed),s.emitTransitionError(e)},claimContextNamespace:e=>{if(a(s.isDisposed),s.contextClaimRecords.has(e))throw new n(t.CONTEXT_NAMESPACE_ALREADY_CLAIMED,{message:`Cannot claim context namespace: "${e}" is already claimed by another plugin`});return s.contextClaimRecords.add(e),{write(t,n){t.context[e]=n},release(){s.contextClaimRecords.delete(e)}}}};return o.set(e,c),c}function c(e){let t=i(e),n=t.routeGetStore().lifecycleNamespace;return{addActivateGuard(e,r){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`addActivateGuard`),t.validator?.lifecycle.validateHandler(r,`addActivateGuard`);let i=n.getHandlerCount(`activate`);t.validator?.lifecycle.validateHandlerLimit(i,t.dependenciesGetStore().limits,`canActivate`),n.addCanActivate(e,r)},addDeactivateGuard(e,r){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`addDeactivateGuard`),t.validator?.lifecycle.validateHandler(r,`addDeactivateGuard`);let i=n.getHandlerCount(`deactivate`);t.validator?.lifecycle.validateHandlerLimit(i,t.dependenciesGetStore().limits,`canDeactivate`),n.addCanDeactivate(e,r)},removeActivateGuard(e){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeActivateGuard`),n.clearCanActivate(e)},removeDeactivateGuard(e){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeDeactivateGuard`),n.clearCanDeactivate(e)}}}function l(a,o){let s=i(a);if(s.isDisposed())throw new n(t.ROUTER_DISPOSED);s.validator?.dependencies.validateCloneArgs(o);let l=s.routeGetStore(),u=e(l.tree),d=l.config,f=l.resolvedForwardMap,p=l.routeCustomFields,m=s.cloneOptions(),h=s.cloneDependencies(),{definition:g,external:_}=l.lifecycleNamespace.getFactoriesByOrigin(),v=s.getPluginFactories(),y=new r(u,m,{...h,...o}),b=i(y).routeGetStore(),x=b.lifecycleNamespace,[S,C]=g,[w,T]=_;for(let[e,t]of Object.entries(S))x.addCanDeactivate(e,t,!0);for(let[e,t]of Object.entries(C))x.addCanActivate(e,t,!0);let E=c(y);for(let[e,t]of Object.entries(w))E.addDeactivateGuard(e,t);for(let[e,t]of Object.entries(T))E.addActivateGuard(e,t);return v.length>0&&y.usePlugin(...v),Object.assign(b.config.decoders,d.decoders),Object.assign(b.config.encoders,d.encoders),Object.assign(b.config.defaultParams,d.defaultParams),Object.assign(b.config.forwardMap,d.forwardMap),Object.assign(b.config.forwardFnMap,d.forwardFnMap),Object.assign(b.resolvedForwardMap,f),Object.assign(b.routeCustomFields,p),y}export{a as i,c as n,s as r,l as t};
2
- //# sourceMappingURL=cloneRouter-BYNiwchg.mjs.map
1
+ import{d as e,h as t,n,t as r}from"./Router-B7txWo9N.mjs";import{r as i}from"./internals-C8mRvTxc.mjs";function a(e){if(e())throw new n(t.ROUTER_DISPOSED)}const o=new WeakMap;function s(e){let r=o.get(e);if(r)return r;let s=i(e),c={makeState:(e,t,n,r)=>(s.validator?.state.validateMakeStateArgs(e,t,n),s.makeState(e,t,n,r?.params)),buildState:(e,t)=>{s.validator?.routes.validateStateBuilderArgs(e,t,`buildState`);let{name:n,params:r}=s.forwardState(e,t);return s.buildStateResolved(n,r)},forwardState:(e,t)=>(s.validator?.routes.validateStateBuilderArgs(e,t,`forwardState`),s.forwardState(e,t)),matchPath:e=>(s.validator?.routes.validateMatchPathArgs(e),s.matchPath(e,s.getOptions())),navigateToState:(e,t)=>(a(s.isDisposed),s.validator?.navigation.validateNavigateToStateArgs(e),t!==void 0&&s.validator?.navigation.validateNavigationOptions(t,`navigateToState`),s.navigateToState(e,t)),setRootPath:e=>{a(s.isDisposed),s.validator?.routes.validateSetRootPathArgs(e),s.setRootPath(e)},getRootPath:s.getRootPath,addEventListener:(e,t)=>(a(s.isDisposed),s.validator?.eventBus.validateListenerArgs(e,t),s.addEventListener(e,t)),buildNavigationState:(e,t={})=>{s.validator?.routes.validateStateBuilderArgs(e,t,`buildNavigationState`);let{name:n,params:r}=s.forwardState(e,t),i=s.buildStateResolved(n,r);if(i)return s.makeState(i.name,i.params,s.buildPath(i.name,i.params),i.meta)},getOptions:s.getOptions,getTree:s.getTree,addInterceptor:(e,t)=>{a(s.isDisposed),s.validator?.plugins.validateAddInterceptorArgs(e,t);let n=s.interceptors.get(e);return n||(n=[],s.interceptors.set(e,n)),n.push(t),()=>{let e=n.indexOf(t);e!==-1&&n.splice(e,1)}},getRouteConfig:e=>{let t=s.routeGetStore();if(t.matcher.hasRoute(e))return t.routeCustomFields[e]},extendRouter:r=>{a(s.isDisposed);let i=Object.keys(r);for(let r of i)if(r in e)throw new n(t.PLUGIN_CONFLICT,{message:`Cannot extend router: property "${r}" already exists`});for(let t of i)e[t]=r[t];let o={keys:i};s.routerExtensions.push(o);let c=!1;return()=>{if(c)return;c=!0;for(let t of o.keys)delete e[t];let t=s.routerExtensions.indexOf(o);t!==-1&&s.routerExtensions.splice(t,1)}},emitTransitionError:e=>{a(s.isDisposed),s.emitTransitionError(e)},claimContextNamespace:e=>{if(a(s.isDisposed),s.contextClaimRecords.has(e))throw new n(t.CONTEXT_NAMESPACE_ALREADY_CLAIMED,{message:`Cannot claim context namespace: "${e}" is already claimed by another plugin`});return s.contextClaimRecords.add(e),{write(t,n){t.context[e]=n},release(){s.contextClaimRecords.delete(e)}}}};return o.set(e,c),c}function c(e){let t=i(e),n=t.routeGetStore().lifecycleNamespace;return{addActivateGuard(e,r){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`addActivateGuard`),t.validator?.lifecycle.validateHandler(r,`addActivateGuard`);let i=n.getHandlerCount(`activate`);t.validator?.lifecycle.validateHandlerLimit(i,t.dependenciesGetStore().limits,`canActivate`),n.addCanActivate(e,r)},addDeactivateGuard(e,r){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`addDeactivateGuard`),t.validator?.lifecycle.validateHandler(r,`addDeactivateGuard`);let i=n.getHandlerCount(`deactivate`);t.validator?.lifecycle.validateHandlerLimit(i,t.dependenciesGetStore().limits,`canDeactivate`),n.addCanDeactivate(e,r)},removeActivateGuard(e){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeActivateGuard`),n.clearCanActivate(e)},removeDeactivateGuard(e){a(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeDeactivateGuard`),n.clearCanDeactivate(e)}}}function l(a,o){let s=i(a);if(s.isDisposed())throw new n(t.ROUTER_DISPOSED);s.validator?.dependencies.validateCloneArgs(o);let l=s.routeGetStore(),u=e(l.tree),d=l.config,f=l.resolvedForwardMap,p=l.routeCustomFields,m=s.cloneOptions(),h=s.cloneDependencies(),{definition:g,external:_}=l.lifecycleNamespace.getFactoriesByOrigin(),v=s.getPluginFactories(),y=new r(u,m,{...h,...o}),b=i(y).routeGetStore(),x=b.lifecycleNamespace,[S,C]=g,[w,T]=_;for(let[e,t]of Object.entries(S))x.addCanDeactivate(e,t,!0);for(let[e,t]of Object.entries(C))x.addCanActivate(e,t,!0);let E=c(y);for(let[e,t]of Object.entries(w))E.addDeactivateGuard(e,t);for(let[e,t]of Object.entries(T))E.addActivateGuard(e,t);return v.length>0&&y.usePlugin(...v),Object.assign(b.config.decoders,d.decoders),Object.assign(b.config.encoders,d.encoders),Object.assign(b.config.defaultParams,d.defaultParams),Object.assign(b.config.forwardMap,d.forwardMap),Object.assign(b.config.forwardFnMap,d.forwardFnMap),Object.assign(b.resolvedForwardMap,f),Object.assign(b.routeCustomFields,p),y}export{a as i,c as n,s as r,l as t};
2
+ //# sourceMappingURL=cloneRouter-BNCQ7tIa.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloneRouter-BYNiwchg.mjs","names":["routeTreeToDefinitions","RouterClass"],"sources":["../../src/api/helpers.ts","../../src/api/getPluginApi.ts","../../src/api/getLifecycleApi.ts","../../src/api/cloneRouter.ts"],"sourcesContent":["// packages/core/src/api/helpers.ts\n\nimport { errorCodes } from \"../constants\";\nimport { RouterError } from \"../RouterError\";\n\nexport function throwIfDisposed(isDisposed: () => boolean): void {\n if (isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { RouterError } from \"../RouterError\";\n\nimport type { PluginApi } from \"./types\";\nimport type {\n ContextNamespaceClaim,\n DefaultDependencies,\n Params,\n Router,\n State,\n} from \"@real-router/types\";\n\n// Cache the assembled PluginApi per router — mirrors getNavigator() (#525):\n// avoids re-allocating the closure-bag on each call (plugins call this once\n// at init, but tests + nested plugins poll it), and gives spy/stub helpers\n// a stable object identity to attach to (e.g. spying on\n// `getPluginApi(router).navigateToState` to inject errors in popstate\n// recovery tests).\nconst cache = new WeakMap<object, PluginApi>();\n\nexport function getPluginApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): PluginApi {\n const cached = cache.get(router);\n\n if (cached) {\n return cached;\n }\n\n const ctx = getInternals(router);\n const api: PluginApi = {\n makeState: (name, params, path, meta) => {\n ctx.validator?.state.validateMakeStateArgs(name, params, path);\n\n return ctx.makeState(\n name,\n params,\n path,\n meta?.params as\n | Record<string, Record<string, \"url\" | \"query\">>\n | undefined,\n );\n },\n buildState: (routeName, routeParams) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"buildState\",\n );\n\n const { name, params } = ctx.forwardState(routeName, routeParams);\n\n return ctx.buildStateResolved(name, params);\n },\n forwardState: <P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"forwardState\",\n );\n\n return ctx.forwardState(routeName, routeParams);\n },\n matchPath: (path) => {\n ctx.validator?.routes.validateMatchPathArgs(path);\n\n return ctx.matchPath(path, ctx.getOptions());\n },\n navigateToState: (state, options) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.navigation.validateNavigateToStateArgs(state);\n\n if (options !== undefined) {\n ctx.validator?.navigation.validateNavigationOptions(\n options,\n \"navigateToState\",\n );\n }\n\n return ctx.navigateToState(state, options);\n },\n setRootPath: (rootPath) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateSetRootPathArgs(rootPath);\n\n ctx.setRootPath(rootPath);\n },\n getRootPath: ctx.getRootPath,\n addEventListener: (eventName, cb) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.eventBus.validateListenerArgs(eventName, cb);\n\n return ctx.addEventListener(eventName, cb);\n },\n buildNavigationState: (name, params = {}) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n name,\n params,\n \"buildNavigationState\",\n );\n\n const { name: resolvedName, params: resolvedParams } = ctx.forwardState(\n name,\n params,\n );\n const routeInfo = ctx.buildStateResolved(resolvedName, resolvedParams);\n\n if (!routeInfo) {\n return;\n }\n\n return ctx.makeState(\n routeInfo.name,\n routeInfo.params,\n ctx.buildPath(routeInfo.name, routeInfo.params),\n routeInfo.meta,\n );\n },\n getOptions: ctx.getOptions,\n getTree: ctx.getTree,\n addInterceptor: (method, fn) => {\n throwIfDisposed(ctx.isDisposed);\n ctx.validator?.plugins.validateAddInterceptorArgs(method, fn);\n let list = ctx.interceptors.get(method);\n\n if (!list) {\n list = [];\n ctx.interceptors.set(method, list);\n }\n\n list.push(fn);\n\n return () => {\n const index = list.indexOf(fn);\n\n if (index !== -1) {\n list.splice(index, 1);\n }\n };\n },\n getRouteConfig: (name) => {\n const store = ctx.routeGetStore();\n\n if (!store.matcher.hasRoute(name)) {\n return;\n }\n\n return store.routeCustomFields[name];\n },\n extendRouter: (extensions: Record<string, unknown>) => {\n throwIfDisposed(ctx.isDisposed);\n\n const keys = Object.keys(extensions);\n\n for (const key of keys) {\n if (key in router) {\n throw new RouterError(errorCodes.PLUGIN_CONFLICT, {\n message: `Cannot extend router: property \"${key}\" already exists`,\n });\n }\n }\n\n for (const key of keys) {\n (router as Record<string, unknown>)[key] = extensions[key];\n }\n\n const extensionRecord = { keys };\n\n ctx.routerExtensions.push(extensionRecord);\n\n let removed = false;\n\n return () => {\n if (removed) {\n return;\n }\n\n removed = true;\n\n for (const key of extensionRecord.keys) {\n delete (router as Record<string, unknown>)[key];\n }\n\n const idx = ctx.routerExtensions.indexOf(extensionRecord);\n\n if (idx !== -1) {\n ctx.routerExtensions.splice(idx, 1);\n }\n };\n },\n emitTransitionError: (error) => {\n throwIfDisposed(ctx.isDisposed);\n ctx.emitTransitionError(error);\n },\n claimContextNamespace: (namespace: string) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (ctx.contextClaimRecords.has(namespace)) {\n throw new RouterError(errorCodes.CONTEXT_NAMESPACE_ALREADY_CLAIMED, {\n message: `Cannot claim context namespace: \"${namespace}\" is already claimed by another plugin`,\n });\n }\n\n ctx.contextClaimRecords.add(namespace);\n\n return {\n write(state: State, value: unknown) {\n state.context[namespace] = value;\n },\n release() {\n ctx.contextClaimRecords.delete(namespace);\n },\n } satisfies ContextNamespaceClaim;\n },\n };\n\n cache.set(router, api);\n\n return api;\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { getInternals } from \"../internals\";\n\nimport type { LifecycleApi } from \"./types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\nexport function getLifecycleApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): LifecycleApi<Dependencies> {\n const ctx = getInternals(router);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const lifecycleNamespace = ctx.routeGetStore().lifecycleNamespace!;\n\n return {\n addActivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"addActivateGuard\");\n ctx.validator?.lifecycle.validateHandler(handler, \"addActivateGuard\");\n\n const activateCount = lifecycleNamespace.getHandlerCount(\"activate\");\n\n ctx.validator?.lifecycle.validateHandlerLimit(\n activateCount,\n ctx.dependenciesGetStore().limits,\n \"canActivate\",\n );\n\n lifecycleNamespace.addCanActivate(name, handler);\n },\n\n addDeactivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"addDeactivateGuard\");\n ctx.validator?.lifecycle.validateHandler(handler, \"addDeactivateGuard\");\n\n const deactivateCount = lifecycleNamespace.getHandlerCount(\"deactivate\");\n\n ctx.validator?.lifecycle.validateHandlerLimit(\n deactivateCount,\n ctx.dependenciesGetStore().limits,\n \"canDeactivate\",\n );\n\n lifecycleNamespace.addCanDeactivate(name, handler);\n },\n\n removeActivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"removeActivateGuard\");\n\n lifecycleNamespace.clearCanActivate(name);\n },\n\n removeDeactivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"removeDeactivateGuard\");\n\n lifecycleNamespace.clearCanDeactivate(name);\n },\n };\n}\n","import { routeTreeToDefinitions } from \"route-tree\";\n\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { Router as RouterClass } from \"../Router\";\nimport { RouterError } from \"../RouterError\";\nimport { getLifecycleApi } from \"./getLifecycleApi\";\n\nimport type { Route } from \"../types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\n/**\n * Build an independent router instance that shares the route tree, options,\n * lifecycle guards, and plugin factories of `router`. The primary use case\n * is **SSR multi-tenancy** — one base router per process, one clone per\n * request.\n *\n * @param router - Source router (must not be disposed).\n * @param dependencies - Optional per-clone overrides merged on top of the\n * base router's dependencies. Always **fresh per call** in the documented\n * SSR pattern: pass per-request state here, never store it in the base.\n *\n * @remarks\n *\n * **Dependency merge — shallow by design.** `base.dependencies` are spread\n * into the clone via `{ ...sourceDeps, ...dependencies }`. Top-level keys\n * are new objects, but **values are shared by reference**: a `Map`, `Set`,\n * class instance, function, or nested plain object stored in\n * `base.dependencies` is the **same instance** in every clone. Mutations\n * in one clone are visible in the base and in every sibling clone.\n *\n * This is intentional. `structuredClone` of dep values is **not** applied\n * because it would:\n * - strip class prototypes (`new DbClient()` → plain object, methods lost)\n * - reject functions and symbols (`DataCloneError`)\n * - fragment singleton pools (one connection pool per request — pool\n * semantics destroyed)\n * - reject circular references\n *\n * **SSR rule of thumb.** Place values in `base.dependencies` according to\n * their lifecycle:\n *\n * - **Singletons / shared services** → `base.dependencies`. Examples: DB\n * client, connection pool, logger, config, feature-flag client. Process-\n * wide pooling depends on sharing these by reference.\n * - **Per-request state** → the `dependencies` override parameter (or\n * `createRequestScope`'s `deps` argument). Examples: `currentUser`,\n * `traceId`, `sessionId`, `abortSignal`. The override is applied last,\n * so it wins over base keys; pass a fresh object per call.\n *\n * Cross-request data leaks are **only possible** when per-request mutable\n * state is incorrectly placed in `base.dependencies`. The override slot is\n * the safe channel.\n *\n * @example\n * ```typescript\n * // Server boot — singletons only\n * const base = createRouter(routes, options, {\n * db: new DbClient(dbUrl),\n * logger,\n * });\n *\n * // Per request — fresh override per call\n * const clone = cloneRouter(base, {\n * currentUser,\n * traceId,\n * });\n * // clone.deps.db === base.deps.db ✓ shared pool (intentional)\n * // clone.deps.currentUser ✓ unique per request\n * ```\n *\n * @see createRequestScope — `@real-router/core/utils` SSR helper that\n * wraps this function and injects `abortSignal` automatically.\n */\nexport function cloneRouter<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n dependencies?: Dependencies,\n): RouterClass<Dependencies> {\n const ctx = getInternals(router);\n\n if (ctx.isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n\n ctx.validator?.dependencies.validateCloneArgs(dependencies);\n\n // Get source store directly\n const sourceStore = ctx.routeGetStore();\n const routes = routeTreeToDefinitions(sourceStore.tree);\n const routeConfig = sourceStore.config;\n const resolvedForwardMap = sourceStore.resolvedForwardMap;\n const routeCustomFields = sourceStore.routeCustomFields;\n\n const options = ctx.cloneOptions();\n const sourceDeps = ctx.cloneDependencies();\n // Origin-aware factory snapshot — definition guards are re-registered with\n // `isFromDefinition=true` on the clone so `replace()` can still strip them\n // via `clearDefinitionGuards()`. External guards take the public lifecycle\n // API path so they survive `replace()` symmetric with the base.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const sourceLifecycleNamespace = sourceStore.lifecycleNamespace!;\n const { definition: definitionFactories, external: externalFactories } =\n sourceLifecycleNamespace.getFactoriesByOrigin();\n const pluginFactories = ctx.getPluginFactories();\n\n const mergedDeps = {\n ...sourceDeps,\n ...dependencies,\n } as Dependencies;\n\n const newRouter = new RouterClass<Dependencies>(\n routes as Route<Dependencies>[],\n options,\n mergedDeps,\n );\n\n const newCtx = getInternals(newRouter);\n const newStore = newCtx.routeGetStore();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const newLifecycleNamespace = newStore.lifecycleNamespace!;\n\n const [definitionDeactivate, definitionActivate] = definitionFactories;\n const [externalDeactivate, externalActivate] = externalFactories;\n\n for (const [name, handler] of Object.entries(definitionDeactivate)) {\n newLifecycleNamespace.addCanDeactivate(name, handler, true);\n }\n\n for (const [name, handler] of Object.entries(definitionActivate)) {\n newLifecycleNamespace.addCanActivate(name, handler, true);\n }\n\n const lifecycle = getLifecycleApi(newRouter);\n\n for (const [name, handler] of Object.entries(externalDeactivate)) {\n lifecycle.addDeactivateGuard(name, handler);\n }\n\n for (const [name, handler] of Object.entries(externalActivate)) {\n lifecycle.addActivateGuard(name, handler);\n }\n\n if (pluginFactories.length > 0) {\n newRouter.usePlugin(...pluginFactories);\n }\n\n // Apply cloned config directly to new store\n Object.assign(newStore.config.decoders, routeConfig.decoders);\n Object.assign(newStore.config.encoders, routeConfig.encoders);\n Object.assign(newStore.config.defaultParams, routeConfig.defaultParams);\n Object.assign(newStore.config.forwardMap, routeConfig.forwardMap);\n Object.assign(newStore.config.forwardFnMap, routeConfig.forwardFnMap);\n Object.assign(newStore.resolvedForwardMap, resolvedForwardMap);\n Object.assign(newStore.routeCustomFields, routeCustomFields);\n\n return newRouter;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cloneRouter-BNCQ7tIa.mjs","names":["routeTreeToDefinitions","RouterClass"],"sources":["../../src/api/helpers.ts","../../src/api/getPluginApi.ts","../../src/api/getLifecycleApi.ts","../../src/api/cloneRouter.ts"],"sourcesContent":["// packages/core/src/api/helpers.ts\n\nimport { errorCodes } from \"../constants\";\nimport { RouterError } from \"../RouterError\";\n\nexport function throwIfDisposed(isDisposed: () => boolean): void {\n if (isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { RouterError } from \"../RouterError\";\n\nimport type { PluginApi } from \"./types\";\nimport type {\n ContextNamespaceClaim,\n DefaultDependencies,\n Params,\n Router,\n State,\n} from \"@real-router/types\";\n\n// Cache the assembled PluginApi per router — mirrors getNavigator() (#525):\n// avoids re-allocating the closure-bag on each call (plugins call this once\n// at init, but tests + nested plugins poll it), and gives spy/stub helpers\n// a stable object identity to attach to (e.g. spying on\n// `getPluginApi(router).navigateToState` to inject errors in popstate\n// recovery tests).\nconst cache = new WeakMap<object, PluginApi>();\n\nexport function getPluginApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): PluginApi {\n const cached = cache.get(router);\n\n if (cached) {\n return cached;\n }\n\n const ctx = getInternals(router);\n const api: PluginApi = {\n makeState: (name, params, path, meta) => {\n ctx.validator?.state.validateMakeStateArgs(name, params, path);\n\n return ctx.makeState(\n name,\n params,\n path,\n meta?.params as\n | Record<string, Record<string, \"url\" | \"query\">>\n | undefined,\n );\n },\n buildState: (routeName, routeParams) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"buildState\",\n );\n\n const { name, params } = ctx.forwardState(routeName, routeParams);\n\n return ctx.buildStateResolved(name, params);\n },\n forwardState: <P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"forwardState\",\n );\n\n return ctx.forwardState(routeName, routeParams);\n },\n matchPath: (path) => {\n ctx.validator?.routes.validateMatchPathArgs(path);\n\n return ctx.matchPath(path, ctx.getOptions());\n },\n navigateToState: (state, options) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.navigation.validateNavigateToStateArgs(state);\n\n if (options !== undefined) {\n ctx.validator?.navigation.validateNavigationOptions(\n options,\n \"navigateToState\",\n );\n }\n\n return ctx.navigateToState(state, options);\n },\n setRootPath: (rootPath) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateSetRootPathArgs(rootPath);\n\n ctx.setRootPath(rootPath);\n },\n getRootPath: ctx.getRootPath,\n addEventListener: (eventName, cb) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.eventBus.validateListenerArgs(eventName, cb);\n\n return ctx.addEventListener(eventName, cb);\n },\n buildNavigationState: (name, params = {}) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n name,\n params,\n \"buildNavigationState\",\n );\n\n const { name: resolvedName, params: resolvedParams } = ctx.forwardState(\n name,\n params,\n );\n const routeInfo = ctx.buildStateResolved(resolvedName, resolvedParams);\n\n if (!routeInfo) {\n return;\n }\n\n return ctx.makeState(\n routeInfo.name,\n routeInfo.params,\n ctx.buildPath(routeInfo.name, routeInfo.params),\n routeInfo.meta,\n );\n },\n getOptions: ctx.getOptions,\n getTree: ctx.getTree,\n addInterceptor: (method, fn) => {\n throwIfDisposed(ctx.isDisposed);\n ctx.validator?.plugins.validateAddInterceptorArgs(method, fn);\n let list = ctx.interceptors.get(method);\n\n if (!list) {\n list = [];\n ctx.interceptors.set(method, list);\n }\n\n list.push(fn);\n\n return () => {\n const index = list.indexOf(fn);\n\n if (index !== -1) {\n list.splice(index, 1);\n }\n };\n },\n getRouteConfig: (name) => {\n const store = ctx.routeGetStore();\n\n if (!store.matcher.hasRoute(name)) {\n return;\n }\n\n return store.routeCustomFields[name];\n },\n extendRouter: (extensions: Record<string, unknown>) => {\n throwIfDisposed(ctx.isDisposed);\n\n const keys = Object.keys(extensions);\n\n for (const key of keys) {\n if (key in router) {\n throw new RouterError(errorCodes.PLUGIN_CONFLICT, {\n message: `Cannot extend router: property \"${key}\" already exists`,\n });\n }\n }\n\n for (const key of keys) {\n (router as Record<string, unknown>)[key] = extensions[key];\n }\n\n const extensionRecord = { keys };\n\n ctx.routerExtensions.push(extensionRecord);\n\n let removed = false;\n\n return () => {\n if (removed) {\n return;\n }\n\n removed = true;\n\n for (const key of extensionRecord.keys) {\n delete (router as Record<string, unknown>)[key];\n }\n\n const idx = ctx.routerExtensions.indexOf(extensionRecord);\n\n if (idx !== -1) {\n ctx.routerExtensions.splice(idx, 1);\n }\n };\n },\n emitTransitionError: (error) => {\n throwIfDisposed(ctx.isDisposed);\n ctx.emitTransitionError(error);\n },\n claimContextNamespace: (namespace: string) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (ctx.contextClaimRecords.has(namespace)) {\n throw new RouterError(errorCodes.CONTEXT_NAMESPACE_ALREADY_CLAIMED, {\n message: `Cannot claim context namespace: \"${namespace}\" is already claimed by another plugin`,\n });\n }\n\n ctx.contextClaimRecords.add(namespace);\n\n return {\n write(state: State, value: unknown) {\n state.context[namespace] = value;\n },\n release() {\n ctx.contextClaimRecords.delete(namespace);\n },\n } satisfies ContextNamespaceClaim;\n },\n };\n\n cache.set(router, api);\n\n return api;\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { getInternals } from \"../internals\";\n\nimport type { LifecycleApi } from \"./types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\nexport function getLifecycleApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): LifecycleApi<Dependencies> {\n const ctx = getInternals(router);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const lifecycleNamespace = ctx.routeGetStore().lifecycleNamespace!;\n\n return {\n addActivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"addActivateGuard\");\n ctx.validator?.lifecycle.validateHandler(handler, \"addActivateGuard\");\n\n const activateCount = lifecycleNamespace.getHandlerCount(\"activate\");\n\n ctx.validator?.lifecycle.validateHandlerLimit(\n activateCount,\n ctx.dependenciesGetStore().limits,\n \"canActivate\",\n );\n\n lifecycleNamespace.addCanActivate(name, handler);\n },\n\n addDeactivateGuard(name, handler) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"addDeactivateGuard\");\n ctx.validator?.lifecycle.validateHandler(handler, \"addDeactivateGuard\");\n\n const deactivateCount = lifecycleNamespace.getHandlerCount(\"deactivate\");\n\n ctx.validator?.lifecycle.validateHandlerLimit(\n deactivateCount,\n ctx.dependenciesGetStore().limits,\n \"canDeactivate\",\n );\n\n lifecycleNamespace.addCanDeactivate(name, handler);\n },\n\n removeActivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"removeActivateGuard\");\n\n lifecycleNamespace.clearCanActivate(name);\n },\n\n removeDeactivateGuard(name) {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateRouteName(name, \"removeDeactivateGuard\");\n\n lifecycleNamespace.clearCanDeactivate(name);\n },\n };\n}\n","import { routeTreeToDefinitions } from \"route-tree\";\n\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { Router as RouterClass } from \"../Router\";\nimport { RouterError } from \"../RouterError\";\nimport { getLifecycleApi } from \"./getLifecycleApi\";\n\nimport type { Route } from \"../types\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\n/**\n * Build an independent router instance that shares the route tree, options,\n * lifecycle guards, and plugin factories of `router`. The primary use case\n * is **SSR multi-tenancy** — one base router per process, one clone per\n * request.\n *\n * @param router - Source router (must not be disposed).\n * @param dependencies - Optional per-clone overrides merged on top of the\n * base router's dependencies. Always **fresh per call** in the documented\n * SSR pattern: pass per-request state here, never store it in the base.\n *\n * @remarks\n *\n * **Dependency merge — shallow by design.** `base.dependencies` are spread\n * into the clone via `{ ...sourceDeps, ...dependencies }`. Top-level keys\n * are new objects, but **values are shared by reference**: a `Map`, `Set`,\n * class instance, function, or nested plain object stored in\n * `base.dependencies` is the **same instance** in every clone. Mutations\n * in one clone are visible in the base and in every sibling clone.\n *\n * This is intentional. `structuredClone` of dep values is **not** applied\n * because it would:\n * - strip class prototypes (`new DbClient()` → plain object, methods lost)\n * - reject functions and symbols (`DataCloneError`)\n * - fragment singleton pools (one connection pool per request — pool\n * semantics destroyed)\n * - reject circular references\n *\n * **SSR rule of thumb.** Place values in `base.dependencies` according to\n * their lifecycle:\n *\n * - **Singletons / shared services** → `base.dependencies`. Examples: DB\n * client, connection pool, logger, config, feature-flag client. Process-\n * wide pooling depends on sharing these by reference.\n * - **Per-request state** → the `dependencies` override parameter (or\n * `createRequestScope`'s `deps` argument). Examples: `currentUser`,\n * `traceId`, `sessionId`, `abortSignal`. The override is applied last,\n * so it wins over base keys; pass a fresh object per call.\n *\n * Cross-request data leaks are **only possible** when per-request mutable\n * state is incorrectly placed in `base.dependencies`. The override slot is\n * the safe channel.\n *\n * @example\n * ```typescript\n * // Server boot — singletons only\n * const base = createRouter(routes, options, {\n * db: new DbClient(dbUrl),\n * logger,\n * });\n *\n * // Per request — fresh override per call\n * const clone = cloneRouter(base, {\n * currentUser,\n * traceId,\n * });\n * // clone.deps.db === base.deps.db ✓ shared pool (intentional)\n * // clone.deps.currentUser ✓ unique per request\n * ```\n *\n * @see createRequestScope — `@real-router/core/utils` SSR helper that\n * wraps this function and injects `abortSignal` automatically.\n */\nexport function cloneRouter<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n dependencies?: Dependencies,\n): RouterClass<Dependencies> {\n const ctx = getInternals(router);\n\n if (ctx.isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n\n ctx.validator?.dependencies.validateCloneArgs(dependencies);\n\n // Get source store directly\n const sourceStore = ctx.routeGetStore();\n const routes = routeTreeToDefinitions(sourceStore.tree);\n const routeConfig = sourceStore.config;\n const resolvedForwardMap = sourceStore.resolvedForwardMap;\n const routeCustomFields = sourceStore.routeCustomFields;\n\n const options = ctx.cloneOptions();\n const sourceDeps = ctx.cloneDependencies();\n // Origin-aware factory snapshot — definition guards are re-registered with\n // `isFromDefinition=true` on the clone so `replace()` can still strip them\n // via `clearDefinitionGuards()`. External guards take the public lifecycle\n // API path so they survive `replace()` symmetric with the base.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const sourceLifecycleNamespace = sourceStore.lifecycleNamespace!;\n const { definition: definitionFactories, external: externalFactories } =\n sourceLifecycleNamespace.getFactoriesByOrigin();\n const pluginFactories = ctx.getPluginFactories();\n\n const mergedDeps = {\n ...sourceDeps,\n ...dependencies,\n } as Dependencies;\n\n const newRouter = new RouterClass<Dependencies>(\n routes as Route<Dependencies>[],\n options,\n mergedDeps,\n );\n\n const newCtx = getInternals(newRouter);\n const newStore = newCtx.routeGetStore();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- guaranteed set after wiring\n const newLifecycleNamespace = newStore.lifecycleNamespace!;\n\n const [definitionDeactivate, definitionActivate] = definitionFactories;\n const [externalDeactivate, externalActivate] = externalFactories;\n\n for (const [name, handler] of Object.entries(definitionDeactivate)) {\n newLifecycleNamespace.addCanDeactivate(name, handler, true);\n }\n\n for (const [name, handler] of Object.entries(definitionActivate)) {\n newLifecycleNamespace.addCanActivate(name, handler, true);\n }\n\n const lifecycle = getLifecycleApi(newRouter);\n\n for (const [name, handler] of Object.entries(externalDeactivate)) {\n lifecycle.addDeactivateGuard(name, handler);\n }\n\n for (const [name, handler] of Object.entries(externalActivate)) {\n lifecycle.addActivateGuard(name, handler);\n }\n\n if (pluginFactories.length > 0) {\n newRouter.usePlugin(...pluginFactories);\n }\n\n // Apply cloned config directly to new store\n Object.assign(newStore.config.decoders, routeConfig.decoders);\n Object.assign(newStore.config.encoders, routeConfig.encoders);\n Object.assign(newStore.config.defaultParams, routeConfig.defaultParams);\n Object.assign(newStore.config.forwardMap, routeConfig.forwardMap);\n Object.assign(newStore.config.forwardFnMap, routeConfig.forwardFnMap);\n Object.assign(newStore.resolvedForwardMap, resolvedForwardMap);\n Object.assign(newStore.routeCustomFields, routeCustomFields);\n\n return newRouter;\n}\n"],"mappings":"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"}
@@ -180,7 +180,6 @@ declare class SegmentMatcher {
180
180
  getSegmentsByName(name: string): readonly MatcherInputNode[] | undefined;
181
181
  getMetaByName(name: string): Readonly<Record<string, Record<string, "url" | "query">>> | undefined;
182
182
  hasRoute(name: string): boolean;
183
- setRootPath(rootPath: string): void;
184
183
  } //#endregion
185
184
  //#endregion
186
185
  //#region ../search-params/dist/esm/index.d.mts
@@ -343,4 +342,4 @@ type Matcher = SegmentMatcher;
343
342
  */
344
343
  //#endregion
345
344
  export { RouteTree as i, Matcher as n, RouteDefinition as r, CreateMatcherOptions as t };
346
- //# sourceMappingURL=index-C-i6vx5Y.d.mts.map
345
+ //# sourceMappingURL=index-BWUmnecT.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BWUmnecT.d.mts","names":["pattern","RegExp","constraint","urlParams","queryParams","spatParams","paramTypeMap","Readonly","Record","constraintPatterns","ReadonlyMap","ConstraintPattern","pathPattern","name","path","fullName","absolute","children","MatcherInputNode","nonAbsoluteChildren","paramMeta","ParamMeta","staticPath","parent","CompiledRoute","depth","matchSegments","meta","declaredQueryParams","declaredQueryParamsSet","ReadonlySet","hasTrailingSlash","hasConstraints","buildStaticParts","buildParamSlots","BuildParamSlot","buildParamNamesSet","cachedResult","MatchResult","paramName","encoder","value","isOptional","queryParamsMode","trailingSlash","staticChildren","SegmentNode","hasChildren","paramChild","node","splatChild","route","slashChildRoute","segments","params","caseSensitive","strictTrailingSlash","strictQueryParams","urlParamsEncoding","URLParamsEncodingType","parseQueryString","queryString","buildQueryString","private","options","ResolvedMatcherOptions","constructor","SegmentMatcherOptions","registerTree","match","buildPath","BuildPathOptions","getSegmentsByName","getMetaByName","hasRoute","arrayFormat","ArrayFormat","booleanFormat","BooleanFormat","nullFormat","NullFormat","numberFormat","NumberFormat","QueryParamPrimitive","Record","QueryParamValue","querystring","removedParams","keptParams","path","Options","opts","queryString","target","params","paramsToOmit","OmitResponse","paramsToKeep","KeepResponse","FinalOptions","key","name","path","children","RouteDefinition","absolute","ReadonlyMap","RouteTree","paramMeta","ParamMeta","parent","nonAbsoluteChildren","fullName","staticPath","paramTypeMap","Readonly","Record","skipFreeze","trailingSlashMode","TrailingSlashMode","queryParamsMode","QueryParamsMode","queryParams","Options","urlParamsEncoding","URLParamsEncodingType","BasePathOptions","ignoreConstraints","strictTrailingSlash","strongMatching","ParamSource","ParamTypeMap","P","RouteParams","segments","params","meta","RouteTreeStateMeta","routes","TreeBuildOptions","options","tree","routeName","node","caseSensitive","strictQueryParams","QueryParamsConfig","SegmentMatcher","CreateMatcherOptions","Matcher","route","methodName","rootNode","parentName","Set","seenNames","Map","seenPathsByParent"],"sources":["../../../path-matcher/dist/esm/index.d.mts","../../../search-params/dist/esm/index.d.mts","../../../route-tree/dist/esm/index.d.mts"],"mappings":"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"}
@@ -306,5 +306,22 @@ declare class RouterError extends Error {
306
306
  toJSON(): Record<string, unknown>;
307
307
  }
308
308
  //#endregion
309
- export { RouterValidator as n, RouterError as t };
310
- //# sourceMappingURL=RouterError-WhCzIWuc.d.mts.map
309
+ //#region ../event-emitter/dist/esm/index.d.mts
310
+ //#endregion
311
+ //#region src/EventEmitter.d.ts
312
+ /**
313
+ * Sentinel error for recursion depth violations.
314
+ * Re-thrown from the per-listener catch so it propagates to the caller.
315
+ */
316
+ declare class RecursionDepthError extends Error {
317
+ constructor(message?: string);
318
+ }
319
+ /**
320
+ * Generic typed event emitter with listener limits, duplicate detection,
321
+ * recursion depth protection, and per-listener error isolation.
322
+ *
323
+ * All features are opt-in via constructor options and limits.
324
+ */
325
+ //#endregion
326
+ export { RouterError as n, RouterValidator as r, RecursionDepthError as t };
327
+ //# sourceMappingURL=index-CYpAZCoc.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CYpAZCoc.d.mts","names":["maxListeners","warnListeners","maxEventDepth","limits","EventEmitterLimits","onListenerError","eventName","error","onListenerWarn","count","Error","constructor","message","TEventMap","Record","private","EventEmitterOptions","options","validateCallback","cb","Function","setLimits","on","E","args","Unsubscribe","off","emit","arg1","arg2","arg3","arg4","clearAll","listenerCount"],"sources":["../../src/types/RouterValidator.ts","../../src/RouterError.ts","../../../event-emitter/dist/esm/index.d.mts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as Router$1 } from "./Router-Dg-zk8AS.mjs";
1
+ import { t as Router$1 } from "./Router-hW6ivqrX.mjs";
2
2
  import { DefaultDependencies, Params, Router, State } from "@real-router/types";
3
3
 
4
4
  //#region src/utils/createRequestScope.d.ts
@@ -303,4 +303,4 @@ interface SerializeRouterStateOptions {
303
303
  declare function serializeRouterState(state: State, options?: SerializeRouterStateOptions): string;
304
304
  //#endregion
305
305
  export { SerializeStateOptions as a, HydrateRouterOptions as c, getStaticPaths as d, IncomingMessageLike as f, createRequestScope as g, RequestScopeSource as h, Serialize as i, hydrateRouter as l, RequestScope as m, SerializedRouterState as n, serializeState as o, RequestLike as p, serializeRouterState as r, Deserialize as s, SerializeRouterStateOptions as t, StaticPathEntries as u };
306
- //# sourceMappingURL=index-DKzxav48.d.mts.map
306
+ //# sourceMappingURL=index-CjWKWPY6.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CjWKWPY6.d.mts","names":[],"sources":["../../src/utils/createRequestScope.ts","../../src/utils/getStaticPaths.ts","../../src/utils/hydrateRouter.ts","../../src/utils/serializeState.ts","../../src/utils/serializeRouterState.ts"],"mappings":";;;;;;AAUA;;;UAAiB,mBAAA;EACf,EAAA,GAAK,KAAA,WAAgB,QAAA;EACrB,cAAA,IAAkB,KAAA,WAAgB,QAAA;AAAA;;;;;AAAoB;UAQvC,WAAA;EACf,MAAA,EAAQ,WAAW;AAAA;AAAA,KAGT,kBAAA,GAAqB,mBAAA,GAAsB,WAAW;AAAA,UAEjD,YAAA,sBACM,mBAAA,GAAsB,mBAAA,UACnC,eAAA;EAJE;;;;AAAsD;EAAtD,SAUD,MAAA,EAAQ,QAAA,CAAY,YAAA;EARF;;;;EAAA,SAclB,MAAA,EAAQ,WAAA;EANA;;;;;EAajB,OAAA,QAAe,OAAA;AAAA;;;;;;;;;;;;AAAO;AA4ExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAM4B;;;;AC5H5B;;;;;;;;;;;;AAEsB;AAiBtB;;;;;;;iBDmGgB,kBAAA,sBACO,mBAAA,GAAsB,mBAAA,EAE3C,OAAA,EAAS,kBAAA,EACT,IAAA,EAAM,MAAA,CAAO,YAAA,GACb,IAAA,GAAO,OAAA,CAAQ,YAAA,IACd,YAAA,CAAa,YAAA;;;KC5HJ,iBAAA,GAAoB,MAAA,eAExB,OAAA,CAAQ,MAAA;AAAA,iBAiBM,cAAA,sBACC,mBAAA,GAAsB,mBAAA,EAE3C,MAAA,EAAQ,MAAA,CAAO,YAAA,GACf,OAAA,GAAU,iBAAA,GACT,OAAA;;;;;;ADnBH;;KEAY,WAAA,IAAe,IAAY;AAAA,UAEtB,oBAAA;EFDf;;;;;;;AACsD;AAQxD;;;;AACqB;EEKnB,WAAA,GAAc,WAAW;AAAA;;;AFFuC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;AAqBwB;AA4ExB;;;;;;;;;;iBExDsB,aAAA,CACpB,MAAA,EAAQ,MAAA,EACR,MAAA;EAAmB,IAAA;AAAA,GACnB,OAAA,GAAU,oBAAA,GACT,OAAA,CAAQ,KAAA;;;;;;;AF7DX;;;;KGFY,SAAA,IAAa,IAAa;AAAA,UAErB,qBAAA;EHCM;;;;;AACiC;AAQxD;EGFE,SAAA,GAAY,SAAS;AAAA;;AHGF;AAGrB;;;;AAAkE;AAElE;;;;;;;;;;;;;;;;;;;iBGqBgB,cAAA,CACd,IAAA,WACA,OAAA,GAAU,qBAAqB;;;;;AHvCjC;;;;;;KIGY,qBAAA,WAAgC,MAAA,GAAS,MAAA,IAAU,IAAA,CAC7D,KAAA,CAAM,CAAA;AAAA,UAIS,2BAAA;EJNG;;;AAAoC;AAQxD;;;EIME,cAAA;EJLmB;AAGrB;;;;AAAkE;AAElE;;;;;;;;;;;EImBE,SAAA,GAAY,SAAS;AAAA;;;;;;;;;;;;AJEC;AA4ExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBInCgB,oBAAA,CACd,KAAA,EAAO,KAAA,EACP,OAAA,GAAU,2BAA2B"}
@@ -1,7 +1,7 @@
1
- import { i as RouteTree } from "./index-C-i6vx5Y.mjs";
2
- import { c as RouteConfigUpdate, i as GuardFnFactory, n as BuildStateResultWithSegments, o as PluginFactory, s as Route, t as Router } from "./Router-Dg-zk8AS.mjs";
3
- import { n as RouterValidator, t as RouterError } from "./RouterError-WhCzIWuc.mjs";
4
- import { Config, DefaultDependencies, DefaultDependencies as DefaultDependencies$1, ErrorCodeKeys, ErrorCodeToValueMap, ErrorCodeValues, EventToNameMap, GuardFn, Listener, NavigationOptions, Navigator, Navigator as Navigator$1, Options, Options as Options$1, Params, Plugin, Router as Router$1, SimpleState, State, SubscribeFn, SubscribeState, Subscription, Unsubscribe } from "@real-router/types";
1
+ import { i as RouteTree } from "./index-BWUmnecT.mjs";
2
+ import { c as RouteConfigUpdate, i as GuardFnFactory, n as BuildStateResultWithSegments, o as PluginFactory, s as Route, t as Router } from "./Router-hW6ivqrX.mjs";
3
+ import { n as RouterError, r as RouterValidator, t as RecursionDepthError } from "./index-CYpAZCoc.mjs";
4
+ import { Config, DefaultDependencies, DefaultDependencies as DefaultDependencies$1, ErrorCodeKeys, ErrorCodeToValueMap, ErrorCodeValues, EventToNameMap, GuardFn, Listener, NavigationOptions, Navigator, Navigator as Navigator$1, Options, Options as Options$1, Params, Plugin, Router as Router$1, SimpleState, State, SubscribeFn, SubscribeState, Subscription, TreeChangedAdd, TreeChangedClear, TreeChangedEvent, TreeChangedRemove, TreeChangedReplace, TreeChangedUpdate, TreeStructuralPatch, Unsubscribe } from "@real-router/types";
5
5
 
6
6
  //#region src/constants.d.ts
7
7
  type ConstantsKeys = "UNKNOWN_ROUTE";
@@ -50,5 +50,5 @@ declare const getNavigator: <Dependencies extends DefaultDependencies$1 = Defaul
50
50
  //#region src/namespaces/RoutesNamespace/forwardChain.d.ts
51
51
  declare function resolveForwardChain(startRoute: string, forwardMap: Record<string, string>, maxDepth?: number): string;
52
52
  //#endregion
53
- export { type BuildStateResultWithSegments, type Config, type Constants, type DefaultDependencies, type ErrorCodes, type GuardFn, type GuardFnFactory, type Listener, type NavigationOptions, type Navigator, type Options, type Params, type Plugin, type PluginFactory, type Route, type RouteConfigUpdate, type RouteTree, Router, RouterError, type RouterValidator, type SimpleState, type State, type SubscribeFn, type SubscribeState, type Subscription, UNKNOWN_ROUTE, type Unsubscribe, constants, createRouter, errorCodes, events, getNavigator, resolveForwardChain };
53
+ export { type BuildStateResultWithSegments, type Config, type Constants, type DefaultDependencies, type ErrorCodes, type GuardFn, type GuardFnFactory, type Listener, type NavigationOptions, type Navigator, type Options, type Params, type Plugin, type PluginFactory, RecursionDepthError, type Route, type RouteConfigUpdate, type RouteTree, Router, RouterError, type RouterValidator, type SimpleState, type State, type SubscribeFn, type SubscribeState, type Subscription, type TreeChangedAdd, type TreeChangedClear, type TreeChangedEvent, type TreeChangedRemove, type TreeChangedReplace, type TreeChangedUpdate, type TreeStructuralPatch, UNKNOWN_ROUTE, type Unsubscribe, constants, createRouter, errorCodes, events, getNavigator, resolveForwardChain };
54
54
  //# sourceMappingURL=index.d.mts.map
@@ -1,2 +1,2 @@
1
- import{c as e,g as t,h as n,m as r,n as i,p as a,t as o}from"./Router-DiZbYMLx.mjs";const s=(e=[],t={},n={})=>new o(e,t,n),c=new WeakMap,l=e=>{let t=c.get(e);return t||(t=Object.freeze({navigate:e.navigate,getState:e.getState,isActiveRoute:e.isActiveRoute,canNavigateTo:e.canNavigateTo,subscribe:e.subscribe,subscribeLeave:e.subscribeLeave,isLeaveApproved:e.isLeaveApproved}),c.set(e,t)),t};export{o as Router,i as RouterError,a as UNKNOWN_ROUTE,r as constants,s as createRouter,n as errorCodes,t as events,l as getNavigator,e as resolveForwardChain};
1
+ import{_ as e,c as t,g as n,h as r,m as i,n as a,p as o,t as s}from"./Router-B7txWo9N.mjs";const c=(e=[],t={},n={})=>new s(e,t,n),l=new WeakMap,u=e=>{let t=l.get(e);return t||(t=Object.freeze({navigate:e.navigate,getState:e.getState,isActiveRoute:e.isActiveRoute,canNavigateTo:e.canNavigateTo,subscribe:e.subscribe,subscribeLeave:e.subscribeLeave,isLeaveApproved:e.isLeaveApproved}),l.set(e,t)),t};export{e as RecursionDepthError,s as Router,a as RouterError,o as UNKNOWN_ROUTE,i as constants,c as createRouter,r as errorCodes,n as events,u as getNavigator,t as resolveForwardChain};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/createRouter.ts","../../src/getNavigator.ts"],"sourcesContent":["// packages/core/src/createRouter.ts\n\nimport { Router } from \"./Router\";\n\nimport type { Route } from \"./types\";\nimport type { DefaultDependencies, Options } from \"@real-router/types\";\n\n/**\n * Creates a new router instance.\n *\n * @param routes - Array of route definitions\n * @param options - Router configuration options\n * @param dependencies - Dependencies to inject into the router\n * @returns A new Router instance\n *\n * @example\n * const router = createRouter([\n * { name: 'home', path: '/' },\n * { name: 'users', path: '/users' },\n * ]);\n *\n * router.start('/');\n */\nexport const createRouter = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routes: Route<Dependencies>[] = [],\n options: Partial<Options> = {},\n dependencies: Dependencies = {} as Dependencies,\n): Router<Dependencies> => {\n return new Router<Dependencies>(routes, options, dependencies);\n};\n","import type {\n Navigator,\n DefaultDependencies,\n Router,\n} from \"@real-router/types\";\n\nconst cache = new WeakMap<Router, Navigator>();\n\nexport const getNavigator = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n): Navigator => {\n let nav = cache.get(router);\n\n if (!nav) {\n nav = Object.freeze({\n navigate: router.navigate,\n getState: router.getState,\n isActiveRoute: router.isActiveRoute,\n canNavigateTo: router.canNavigateTo,\n subscribe: router.subscribe,\n subscribeLeave: router.subscribeLeave,\n isLeaveApproved: router.isLeaveApproved,\n } as Navigator);\n cache.set(router, nav);\n }\n\n return nav;\n};\n"],"mappings":"oFAuBA,MAAa,GAGX,EAAgC,CAAC,EACjC,EAA4B,CAAC,EAC7B,EAA6B,CAAC,IAEvB,IAAI,EAAqB,EAAQ,EAAS,CAAY,ECxBzD,EAAQ,IAAI,QAEL,EAGX,GACc,CACd,IAAI,EAAM,EAAM,IAAI,CAAM,EAe1B,OAbK,IACH,EAAM,OAAO,OAAO,CAClB,SAAU,EAAO,SACjB,SAAU,EAAO,SACjB,cAAe,EAAO,cACtB,cAAe,EAAO,cACtB,UAAW,EAAO,UAClB,eAAgB,EAAO,eACvB,gBAAiB,EAAO,eAC1B,CAAc,EACd,EAAM,IAAI,EAAQ,CAAG,GAGhB,CACT"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/createRouter.ts","../../src/getNavigator.ts"],"sourcesContent":["// packages/core/src/createRouter.ts\n\nimport { Router } from \"./Router\";\n\nimport type { Route } from \"./types\";\nimport type { DefaultDependencies, Options } from \"@real-router/types\";\n\n/**\n * Creates a new router instance.\n *\n * @param routes - Array of route definitions\n * @param options - Router configuration options\n * @param dependencies - Dependencies to inject into the router\n * @returns A new Router instance\n *\n * @example\n * const router = createRouter([\n * { name: 'home', path: '/' },\n * { name: 'users', path: '/users' },\n * ]);\n *\n * router.start('/');\n */\nexport const createRouter = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routes: Route<Dependencies>[] = [],\n options: Partial<Options> = {},\n dependencies: Dependencies = {} as Dependencies,\n): Router<Dependencies> => {\n return new Router<Dependencies>(routes, options, dependencies);\n};\n","import type {\n Navigator,\n DefaultDependencies,\n Router,\n} from \"@real-router/types\";\n\nconst cache = new WeakMap<Router, Navigator>();\n\nexport const getNavigator = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n): Navigator => {\n let nav = cache.get(router);\n\n if (!nav) {\n nav = Object.freeze({\n navigate: router.navigate,\n getState: router.getState,\n isActiveRoute: router.isActiveRoute,\n canNavigateTo: router.canNavigateTo,\n subscribe: router.subscribe,\n subscribeLeave: router.subscribeLeave,\n isLeaveApproved: router.isLeaveApproved,\n } as Navigator);\n cache.set(router, nav);\n }\n\n return nav;\n};\n"],"mappings":"2FAuBA,MAAa,GAGX,EAAgC,CAAC,EACjC,EAA4B,CAAC,EAC7B,EAA6B,CAAC,IAEvB,IAAI,EAAqB,EAAQ,EAAS,CAAY,ECxBzD,EAAQ,IAAI,QAEL,EAGX,GACc,CACd,IAAI,EAAM,EAAM,IAAI,CAAM,EAe1B,OAbK,IACH,EAAM,OAAO,OAAO,CAClB,SAAU,EAAO,SACjB,SAAU,EAAO,SACjB,cAAe,EAAO,cACtB,cAAe,EAAO,cACtB,UAAW,EAAO,UAClB,eAAgB,EAAO,eACvB,gBAAiB,EAAO,eAC1B,CAAc,EACd,EAAM,IAAI,EAAQ,CAAG,GAGhB,CACT"}
@@ -1,2 +1,2 @@
1
- const e=new WeakMap;function t(t){let n=e.get(t);if(!n)throw TypeError(`[real-router] Invalid router instance — not found in internals registry`);return n}function n(t,n){e.set(t,n)}function r(e,t,n){let r=t;for(let t of e){let e=r;r=(...n)=>t(e,...n)}return r(...n)}function i(e,t,n){return((...i)=>{let a=n.get(e);return!a||a.length===0?t(...i):r(a,t,i)})}function a(e,t,n){return(i,a)=>{let o=n.get(e);return!o||o.length===0?t(i,a):r(o,t,[i,a])}}export{n as i,a as n,t as r,i as t};
2
- //# sourceMappingURL=internals-DT4mneSz.mjs.map
1
+ const e=new WeakMap;function t(t){let n=e.get(t);if(!n)throw TypeError(`[real-router] Invalid router instance — not found in internals registry`);return n}function n(t,n){e.set(t,n)}function r(e,t,n){let r=t;for(let t of e){let e=r;r=(...n)=>t(e,...n)}return r(...n)}function i(e,t,n){return((...i)=>{let a=n.get(e);return!a||a.length===0?t(...i):r(a,t,i)})}function a(e,t,n){return(i,a)=>{let o=n.get(e);return!o||o.length===0?t(i,a):r(o,t,[i,a])}}export{n as i,i as n,t as r,a as t};
2
+ //# sourceMappingURL=internals-C8mRvTxc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internals-C8mRvTxc.mjs","names":[],"sources":["../../src/internals.ts"],"sourcesContent":["import type { DependenciesStore } from \"./namespaces\";\nimport type { RoutesStore } from \"./namespaces/RoutesNamespace\";\nimport type { Router as RouterClass } from \"./Router\";\nimport type { EventMethodMap, GuardFnFactory, PluginFactory } from \"./types\";\nimport type { RouterValidator } from \"./types/RouterValidator\";\nimport type { SerializedRouterState } from \"./utils\";\nimport type {\n DefaultDependencies,\n EventName,\n NavigationOptions,\n Options,\n Params,\n Plugin,\n Router as RouterInterface,\n RouteTreeState,\n SimpleState,\n State,\n TreeChangedEvent,\n Unsubscribe,\n} from \"@real-router/types\";\nimport type { RouteTree } from \"route-tree\";\n\nexport interface RouterInternals<\n D extends DefaultDependencies = DefaultDependencies,\n> {\n readonly makeState: <P extends Params = Params>(\n name: string,\n params?: P,\n path?: string,\n meta?: Record<string, Record<string, \"url\" | \"query\">>,\n ) => State<P>;\n\n readonly forwardState: <P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ) => SimpleState<P>;\n\n readonly buildStateResolved: (\n resolvedName: string,\n resolvedParams: Params,\n ) => RouteTreeState | undefined;\n\n readonly matchPath: <P extends Params = Params>(\n path: string,\n options?: Options,\n ) => State<P> | undefined;\n\n readonly getOptions: () => Options;\n\n readonly addEventListener: <E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ) => Unsubscribe;\n\n /**\n * Route-tree mutation channel — internal access for the `getRoutesApi`\n * wrapper. A dedicated bridge is required because the public\n * `addEventListener<E extends EventName>` structurally rejects\n * `\"TREE_CHANGED\"` (it is not in the public `EventName` union), is strict on\n * duplicates, and exposes neither `emit` nor `listenerCount`.\n */\n readonly treeChanged: {\n readonly emit: (event: TreeChangedEvent) => void;\n readonly subscribe: (\n handler: (event: TreeChangedEvent) => void,\n ) => Unsubscribe;\n readonly listenerCount: () => number;\n };\n\n readonly buildPath: (route: string, params?: Params) => string;\n\n readonly emitTransitionError: (error: Error) => void;\n\n readonly start: (path: string) => Promise<State>;\n\n /**\n * Plugin-only navigation entry point — delegates to\n * `NavigationNamespace.navigateToState` (`getPluginApi(router).navigateToState`).\n * Hidden from `Router`/`Navigator` to keep the userland surface minimal;\n * see `core-types/src/api.ts` for usage docs.\n */\n readonly navigateToState: (\n state: State,\n options?: NavigationOptions,\n ) => Promise<State>;\n\n /* eslint-disable @typescript-eslint/no-explicit-any -- heterogeneous map: stores different InterceptorFn<M> types under different keys */\n readonly interceptors: Map<\n string,\n ((next: (...args: any[]) => any, ...args: any[]) => any)[]\n >;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n readonly setRootPath: (rootPath: string) => void;\n readonly getRootPath: () => string;\n\n readonly getTree: () => RouteTree;\n\n readonly isDisposed: () => boolean;\n\n validator: RouterValidator | null;\n\n // Dependencies (issue #172)\n readonly dependenciesGetStore: () => DependenciesStore<D>;\n\n // Clone support (issue #173)\n readonly cloneOptions: () => Options;\n readonly cloneDependencies: () => Record<string, unknown>;\n readonly getLifecycleFactories: () => [\n Record<string, GuardFnFactory<D>>,\n Record<string, GuardFnFactory<D>>,\n ];\n readonly getPluginFactories: () => PluginFactory<D>[];\n\n // Consolidated route data store (issue #174 Phase 2)\n readonly routeGetStore: () => RoutesStore<D>;\n\n // Cross-namespace state (issue #174)\n readonly getStateName: () => string | undefined;\n readonly isTransitioning: () => boolean;\n readonly clearState: () => void;\n readonly setState: (state: State) => void;\n readonly routerExtensions: { keys: string[] }[];\n readonly contextClaimRecords: Set<string>;\n\n /**\n * One-shot hydration scratchpad populated by `hydrateRouter` immediately\n * before delegating to `router.start(parsed.path)` and cleared in the\n * matching `finally`. SSR loader plugins read this slot directly via\n * `getInternals(router).hydrationState` to short-circuit their own loader\n * call when the server-resolved namespace value is already present in the\n * parsed state (#596). `null` outside of an active `hydrateRouter`\n * invocation.\n */\n hydrationState: SerializedRouterState | null;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- existential type: stores RouterInternals for all Dependencies types\nconst internals = new WeakMap<object, RouterInternals<any>>();\n\nexport function getInternals<D extends DefaultDependencies>(\n router: RouterInterface<D>,\n): RouterInternals<D> {\n const ctx = internals.get(router);\n\n if (!ctx) {\n throw new TypeError(\n \"[real-router] Invalid router instance — not found in internals registry\",\n );\n }\n\n return ctx as RouterInternals<D>;\n}\n\nexport function registerInternals<D extends DefaultDependencies>(\n router: RouterClass<D>,\n ctx: RouterInternals<D>,\n): void {\n internals.set(router, ctx);\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument -- internal chain execution: type safety enforced at public API boundary (PluginApi.addInterceptor) */\nfunction executeInterceptorChain<T>(\n interceptors: ((next: (...args: any[]) => any, ...args: any[]) => any)[],\n original: (...args: any[]) => T,\n args: any[],\n): T {\n let chain = original as (...args: any[]) => any;\n\n for (const interceptor of interceptors) {\n const prev = chain;\n\n chain = (...chainArgs: any[]) => interceptor(prev, ...chainArgs);\n }\n\n return chain(...args) as T;\n}\n\n/**\n * Variadic interceptor wrapper — wraps a function of any arity, returning the\n * same callable type `T`. Use {@link createBinaryInterceptable} instead when the\n * wrapped method takes exactly two args and the caller needs the precise\n * `(a, b) => r` signature preserved (the variadic form widens args to `any[]`).\n */\nexport function createInterceptable<T extends (...args: any[]) => any>(\n name: string,\n original: T,\n interceptors: Map<\n string,\n ((next: (...args: any[]) => any, ...args: any[]) => any)[]\n >,\n): T {\n return ((...args: any[]) => {\n const chain = interceptors.get(name);\n\n if (!chain || chain.length === 0) {\n return original(...args);\n }\n\n return executeInterceptorChain(chain, original, args);\n }) as T;\n}\n\n/**\n * Two-argument interceptor wrapper — preserves the exact `(a: A, b: B) => R`\n * signature, which the variadic {@link createInterceptable} cannot express\n * (it widens args to `any[]`). Used for the binary interceptable methods\n * `forwardState(routeName, routeParams)` and `buildPath(route, params)`.\n */\nexport function createBinaryInterceptable<A, B, R>(\n name: string,\n original: (a: A, b: B) => R,\n interceptors: Map<\n string,\n ((next: (...args: any[]) => any, ...args: any[]) => any)[]\n >,\n): (a: A, b: B) => R {\n return (arg1: A, arg2: B) => {\n const chain = interceptors.get(name);\n\n if (!chain || chain.length === 0) {\n return original(arg1, arg2);\n }\n\n return executeInterceptorChain(chain, original, [arg1, arg2]);\n };\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument */\n"],"mappings":"AA0IA,MAAM,EAAY,IAAI,QAEtB,SAAgB,EACd,EACoB,CACpB,IAAM,EAAM,EAAU,IAAI,CAAM,EAEhC,GAAI,CAAC,EACH,MAAU,UACR,yEACF,EAGF,OAAO,CACT,CAEA,SAAgB,EACd,EACA,EACM,CACN,EAAU,IAAI,EAAQ,CAAG,CAC3B,CAGA,SAAS,EACP,EACA,EACA,EACG,CACH,IAAI,EAAQ,EAEZ,IAAK,IAAM,KAAe,EAAc,CACtC,IAAM,EAAO,EAEb,GAAS,GAAG,IAAqB,EAAY,EAAM,GAAG,CAAS,CACjE,CAEA,OAAO,EAAM,GAAG,CAAI,CACtB,CAQA,SAAgB,EACd,EACA,EACA,EAIG,CACH,QAAS,GAAG,IAAgB,CAC1B,IAAM,EAAQ,EAAa,IAAI,CAAI,EAMnC,MAJI,CAAC,GAAS,EAAM,SAAW,EACtB,EAAS,GAAG,CAAI,EAGlB,EAAwB,EAAO,EAAU,CAAI,CACtD,EACF,CAQA,SAAgB,EACd,EACA,EACA,EAImB,CACnB,OAAQ,EAAS,IAAY,CAC3B,IAAM,EAAQ,EAAa,IAAI,CAAI,EAMnC,MAJI,CAAC,GAAS,EAAM,SAAW,EACtB,EAAS,EAAM,CAAI,EAGrB,EAAwB,EAAO,EAAU,CAAC,EAAM,CAAI,CAAC,CAC9D,CACF"}
@@ -1,2 +1,2 @@
1
- import { a as SerializeStateOptions, c as HydrateRouterOptions, d as getStaticPaths, f as IncomingMessageLike, g as createRequestScope, h as RequestScopeSource, i as Serialize, l as hydrateRouter, m as RequestScope, n as SerializedRouterState, o as serializeState, p as RequestLike, r as serializeRouterState, s as Deserialize, t as SerializeRouterStateOptions, u as StaticPathEntries } from "./index-DKzxav48.mjs";
1
+ import { a as SerializeStateOptions, c as HydrateRouterOptions, d as getStaticPaths, f as IncomingMessageLike, g as createRequestScope, h as RequestScopeSource, i as Serialize, l as hydrateRouter, m as RequestScope, n as SerializedRouterState, o as serializeState, p as RequestLike, r as serializeRouterState, s as Deserialize, t as SerializeRouterStateOptions, u as StaticPathEntries } from "./index-CjWKWPY6.mjs";
2
2
  export { type Deserialize, type HydrateRouterOptions, type IncomingMessageLike, type RequestLike, type RequestScope, type RequestScopeSource, type Serialize, type SerializeRouterStateOptions, type SerializeStateOptions, type SerializedRouterState, type StaticPathEntries, createRequestScope, getStaticPaths, hydrateRouter, serializeRouterState, serializeState };
@@ -1,2 +1,2 @@
1
- import{r as e}from"./internals-DT4mneSz.mjs";import{r as t,t as n}from"./cloneRouter-BYNiwchg.mjs";function r(e){return`signal`in e&&typeof e.signal==`object`&&e.signal!==void 0&&typeof e.signal.aborted==`boolean`}function i(e,t,i){let a,o;if(r(e))o=e.signal;else{let t=new AbortController,n=()=>{t.abort()};e.on(`close`,n),o=t.signal,a=()=>{e.removeListener?.(`close`,n)}}let s=n(t,{...i,abortSignal:o}),c=!1,l=()=>c?Promise.resolve():(c=!0,a?.(),s.dispose(),Promise.resolve());return{router:s,signal:o,dispose:l,[Symbol.asyncDispose]:l}}function a(e){let t=[];for(let n of e.children.values())n.children.size===0?t.push(n.fullName):t.push(...a(n));return t}async function o(e,n){let r=a(t(e).getTree()),i=[];for(let t of r){let r=n?.[t];if(r){let n=await r();for(let r of n)i.push(e.buildPath(t,r))}else i.push(e.buildPath(t,{}))}return i}async function s(t,n,r){let i=r?.deserialize??JSON.parse,a=typeof n==`string`?i(n):n,o=e(t),s=o.hydrationState;o.hydrationState=a;try{return await t.start(a.path)}finally{o.hydrationState=s}}function c(e,t){return((t?.serialize??JSON.stringify)(e)??`null`).replaceAll(`<`,String.raw`\u003c`).replaceAll(`>`,String.raw`\u003e`).replaceAll(`&`,String.raw`\u0026`)}function l(e,t){let n=t?.excludeContext,r=e.context;if(n?.length){let t={},i=e.context;for(let e of Object.keys(i))n.includes(e)||(t[e]=i[e]);r=t}let i={name:e.name,params:e.params,path:e.path,context:r};return t?.serialize?c(i,{serialize:t.serialize}):c(i)}export{i as createRequestScope,o as getStaticPaths,s as hydrateRouter,l as serializeRouterState,c as serializeState};
1
+ import{r as e}from"./internals-C8mRvTxc.mjs";import{r as t,t as n}from"./cloneRouter-BNCQ7tIa.mjs";function r(e){return`signal`in e&&typeof e.signal==`object`&&e.signal!==void 0&&typeof e.signal.aborted==`boolean`}function i(e,t,i){let a,o;if(r(e))o=e.signal;else{let t=new AbortController,n=()=>{t.abort()};e.on(`close`,n),o=t.signal,a=()=>{e.removeListener?.(`close`,n)}}let s=n(t,{...i,abortSignal:o}),c=!1,l=()=>c?Promise.resolve():(c=!0,a?.(),s.dispose(),Promise.resolve());return{router:s,signal:o,dispose:l,[Symbol.asyncDispose]:l}}function a(e){let t=[];for(let n of e.children.values())n.children.size===0?t.push(n.fullName):t.push(...a(n));return t}async function o(e,n){let r=a(t(e).getTree()),i=[];for(let t of r){let r=n?.[t];if(r){let n=await r();for(let r of n)i.push(e.buildPath(t,r))}else i.push(e.buildPath(t,{}))}return i}async function s(t,n,r){let i=r?.deserialize??JSON.parse,a=typeof n==`string`?i(n):n,o=e(t),s=o.hydrationState;o.hydrationState=a;try{return await t.start(a.path)}finally{o.hydrationState=s}}function c(e,t){return((t?.serialize??JSON.stringify)(e)??`null`).replaceAll(`<`,String.raw`\u003c`).replaceAll(`>`,String.raw`\u003e`).replaceAll(`&`,String.raw`\u0026`)}function l(e,t){let n=t?.excludeContext,r=e.context;if(n?.length){let t={},i=e.context;for(let e of Object.keys(i))n.includes(e)||(t[e]=i[e]);r=t}let i={name:e.name,params:e.params,path:e.path,context:r};return t?.serialize?c(i,{serialize:t.serialize}):c(i)}export{i as createRequestScope,o as getStaticPaths,s as hydrateRouter,l as serializeRouterState,c as serializeState};
2
2
  //# sourceMappingURL=utils.mjs.map