@real-router/core 0.45.3 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/api.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{c as e,i as t,l as n,n as r,o as i,r as a,s as o,t as s,u as c}from"./Router-BP_Wjnyr.mjs";import{c as l,t as u}from"./RouterError-BOUkCIgf.mjs";import{r as d,t as f}from"./internals-CCymabFj.mjs";import{n as p,t as m}from"./getPluginApi-BvOUPp3g.mjs";import{logger as h}from"@real-router/logger";function g(e,t,n){if(t){let n=t===e,r=t.startsWith(`${e}.`);if(n||r){let r=n?``:` (current: "${t}")`;return h.warn(`router.removeRoute`,`Cannot remove route "${e}" — it is currently active${r}. Navigate away first.`),!1}}return n&&h.warn(`router.removeRoute`,`Route "${e}" removed while navigation is in progress. This may cause unexpected behavior.`),!0}function _(e){return e?(h.error(`router.clearRoutes`,`Cannot clear routes while navigation is in progress. Wait for navigation to complete.`),!1):!0}function v(e,t,n=``){for(let r of e){let e=n?`${n}.${r.name}`:r.name;if(e===t)return r;if(r.children&&t.startsWith(`${e}.`))return v(r.children,t,e)}}function y(e,t,n,r){let a=t=>t===e||t.startsWith(`${e}.`);i(t.decoders,a),i(t.encoders,a),i(t.defaultParams,a),i(t.forwardMap,a),i(t.forwardFnMap,a),i(n,a),i(t.forwardMap,e=>a(t.forwardMap[e]));let[o,s]=r.getFactories();for(let e of Object.keys(s))a(e)&&r.clearCanActivate(e);for(let e of Object.keys(o))a(e)&&r.clearCanDeactivate(e)}function b(e,t,n,r){return t===null?(delete n.forwardMap[e],delete n.forwardFnMap[e]):typeof t==`string`?(delete n.forwardFnMap[e],n.forwardMap[e]=t):(delete n.forwardMap[e],n.forwardFnMap[e]=t),r(n)}function x(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=>x(e,`${t}.${e.name}`,n,r))),i}function S(n,r,i){if(i){let t=v(n.definitions,i);t.children??=[];for(let n of r)t.children.push(e(n))}else for(let t of r)n.definitions.push(e(t));t(r,n.config,n.routeCustomFields,n.pendingCanActivate,n.pendingCanDeactivate,n.depsStore,i??``),n.treeOperations.commitTreeChanges(n)}function C(n,i,a,o){r(n),n.lifecycleNamespace.clearDefinitionGuards();for(let t of i)n.definitions.push(e(t));if(t(i,n.config,n.routeCustomFields,n.pendingCanActivate,n.pendingCanDeactivate,n.depsStore,``),n.treeOperations.commitTreeChanges(n),o!==void 0){let e=a.matchPath(o,a.getOptions());e?a.setState(e):a.clearState()}}function w(e,t){return o(e.definitions,t)?(y(t,e.config,e.routeCustomFields,e.lifecycleNamespace),e.treeOperations.commitTreeChanges(e),!0):!1}function T(e,t,n){if(n.forwardTo!==void 0&&(e.resolvedForwardMap=b(t,n.forwardTo,e.config,e=>a(e))),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 E(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 x(i,t,e.config,a)}function D(e){let t=d(e),n=t.routeGetStore(),r=f(`add`,(e,t)=>{S(n,e,t?.parent)},t.interceptors);return{add:(e,i)=>{p(t.isDisposed);let a=Array.isArray(e)?e:[e],o=i?.parent;c(a,t.validator),o!==void 0&&t.validator?.routes.validateParentOption(o,n.tree),t.validator?.routes.throwIfInternalRouteInArray(a,`addRoute`),t.validator?.routes.validateAddRouteArgs(a),t.validator?.routes.validateRoutes(a,n),r(a,o===void 0?void 0:{parent:o})},remove:e=>{p(t.isDisposed),t.validator?.routes.validateRemoveRouteArgs(e),t.validator?.routes.throwIfInternalRoute(e,`removeRoute`),g(e,t.getStateName(),t.isTransitioning())&&(w(n,e)||h.warn(`router.removeRoute`,`Route "${e}" not found. No changes made.`))},update:(e,r)=>{p(t.isDisposed),t.validator?.routes.validateUpdateRouteBasicArgs(e,r),t.validator?.routes.throwIfInternalRoute(e,`updateRoute`);let{forwardTo:i,defaultParams:a,decodeParams:o,encodeParams:s,canActivate:c,canDeactivate:l}=r;t.validator?.routes.validateUpdateRoutePropertyTypes(e,r),t.isTransitioning()&&h.error(`router.updateRoute`,`Updating route "${e}" while navigation is in progress. This may cause unexpected behavior.`),t.validator?.routes.validateUpdateRoute(e,r,n),T(n,e,{forwardTo:i,defaultParams:a,decodeParams:o,encodeParams:s}),c!==void 0&&(c===null?n.lifecycleNamespace.clearCanActivate(e):n.lifecycleNamespace.addCanActivate(e,c,!0)),l!==void 0&&(l===null?n.lifecycleNamespace.clearCanDeactivate(e):n.lifecycleNamespace.addCanDeactivate(e,l,!0))},clear:()=>{p(t.isDisposed),_(t.isTransitioning())&&(n.treeOperations.resetStore(n),n.lifecycleNamespace.clearAll(),t.clearState())},has:e=>(t.validator?.routes.validateRouteName(e,`hasRoute`),n.matcher.hasRoute(e)),get:e=>(t.validator?.routes.validateRouteName(e,`getRoute`),E(n,e)),replace:r=>{p(t.isDisposed);let i=Array.isArray(r)?r:[r];if(!_(t.isTransitioning()))return;c(i,t.validator),t.validator?.routes.throwIfInternalRouteInArray(i,`replaceRoutes`),t.validator?.routes.validateAddRouteArgs(i),t.validator?.routes.validateRoutes(i,n);let a=e.getState()?.path;C(n,i,t,a)}}}function O(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 k(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 A(e){let t=d(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)=>{p(t.isDisposed),t.validator?.dependencies.validateSetDependencyArgs(e,n,`setDependency`),O(t.dependenciesGetStore(),e,n,t.validator)},setAll:e=>{p(t.isDisposed);let n=t.dependenciesGetStore();t.validator?.dependencies.validateDependenciesObject(e,`setDependencies`),t.validator?.dependencies.validateDependencyLimit(n,n.limits),k(n,e,t.validator)},remove:e=>{p(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:()=>{p(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))}}function j(e){let t=d(e),n=t.routeGetStore().lifecycleNamespace;return{addActivateGuard(e,r){p(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){p(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){p(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeActivateGuard`),n.clearCanActivate(e)},removeDeactivateGuard(e){p(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeDeactivateGuard`),n.clearCanDeactivate(e)}}}function M(e,t){let r=d(e);if(r.isDisposed())throw new u(l.ROUTER_DISPOSED);r.validator?.dependencies.validateCloneArgs(t);let i=r.routeGetStore(),a=n(i.tree),o=i.config,c=i.resolvedForwardMap,f=i.routeCustomFields,p=r.cloneOptions(),m=r.cloneDependencies(),[h,g]=r.getLifecycleFactories(),_=r.getPluginFactories(),v=new s(a,p,{...m,...t}),y=j(v);for(let[e,t]of Object.entries(h))y.addDeactivateGuard(e,t);for(let[e,t]of Object.entries(g))y.addActivateGuard(e,t);_.length>0&&v.usePlugin(..._);let b=d(v).routeGetStore();return Object.assign(b.config.decoders,o.decoders),Object.assign(b.config.encoders,o.encoders),Object.assign(b.config.defaultParams,o.defaultParams),Object.assign(b.config.forwardMap,o.forwardMap),Object.assign(b.config.forwardFnMap,o.forwardFnMap),Object.assign(b.resolvedForwardMap,c),Object.assign(b.routeCustomFields,f),v}export{M as cloneRouter,A as getDependenciesApi,j as getLifecycleApi,m as getPluginApi,D as getRoutesApi};
1
+ import{c as e,i as t,l as n,n as r,o as i,r as a,s as o,t as s,u as c}from"./Router-DmPynezS.mjs";import{c as l,t as u}from"./RouterError-BOUkCIgf.mjs";import{r as d,t as f}from"./internals-CCymabFj.mjs";import{n as p,t as m}from"./getPluginApi-BvOUPp3g.mjs";import{logger as h}from"@real-router/logger";function g(e,t,n){if(t){let n=t===e,r=t.startsWith(`${e}.`);if(n||r){let r=n?``:` (current: "${t}")`;return h.warn(`router.removeRoute`,`Cannot remove route "${e}" — it is currently active${r}. Navigate away first.`),!1}}return n&&h.warn(`router.removeRoute`,`Route "${e}" removed while navigation is in progress. This may cause unexpected behavior.`),!0}function _(e){return e?(h.error(`router.clearRoutes`,`Cannot clear routes while navigation is in progress. Wait for navigation to complete.`),!1):!0}function v(e,t,n=``){for(let r of e){let e=n?`${n}.${r.name}`:r.name;if(e===t)return r;if(r.children&&t.startsWith(`${e}.`))return v(r.children,t,e)}}function y(e,t,n,r){let a=t=>t===e||t.startsWith(`${e}.`);i(t.decoders,a),i(t.encoders,a),i(t.defaultParams,a),i(t.forwardMap,a),i(t.forwardFnMap,a),i(n,a),i(t.forwardMap,e=>a(t.forwardMap[e]));let[o,s]=r.getFactories();for(let e of Object.keys(s))a(e)&&r.clearCanActivate(e);for(let e of Object.keys(o))a(e)&&r.clearCanDeactivate(e)}function b(e,t,n,r){return t===null?(delete n.forwardMap[e],delete n.forwardFnMap[e]):typeof t==`string`?(delete n.forwardFnMap[e],n.forwardMap[e]=t):(delete n.forwardMap[e],n.forwardFnMap[e]=t),r(n)}function x(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=>x(e,`${t}.${e.name}`,n,r))),i}function S(n,r,i){if(i){let t=v(n.definitions,i);t.children??=[];for(let n of r)t.children.push(e(n))}else for(let t of r)n.definitions.push(e(t));t(r,n.config,n.routeCustomFields,n.pendingCanActivate,n.pendingCanDeactivate,n.depsStore,i??``),n.treeOperations.commitTreeChanges(n)}function C(n,i,a,o){r(n),n.lifecycleNamespace.clearDefinitionGuards();for(let t of i)n.definitions.push(e(t));if(t(i,n.config,n.routeCustomFields,n.pendingCanActivate,n.pendingCanDeactivate,n.depsStore,``),n.treeOperations.commitTreeChanges(n),o!==void 0){let e=a.matchPath(o,a.getOptions());e?a.setState(e):a.clearState()}}function w(e,t){return o(e.definitions,t)?(y(t,e.config,e.routeCustomFields,e.lifecycleNamespace),e.treeOperations.commitTreeChanges(e),!0):!1}function T(e,t,n){if(n.forwardTo!==void 0&&(e.resolvedForwardMap=b(t,n.forwardTo,e.config,e=>a(e))),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 E(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 x(i,t,e.config,a)}function D(e){let t=d(e),n=t.routeGetStore(),r=f(`add`,(e,t)=>{S(n,e,t?.parent)},t.interceptors);return{add:(e,i)=>{p(t.isDisposed);let a=Array.isArray(e)?e:[e],o=i?.parent;c(a,t.validator),o!==void 0&&t.validator?.routes.validateParentOption(o,n.tree),t.validator?.routes.throwIfInternalRouteInArray(a,`addRoute`),t.validator?.routes.validateAddRouteArgs(a),t.validator?.routes.validateRoutes(a,n),r(a,o===void 0?void 0:{parent:o})},remove:e=>{p(t.isDisposed),t.validator?.routes.validateRemoveRouteArgs(e),t.validator?.routes.throwIfInternalRoute(e,`removeRoute`),g(e,t.getStateName(),t.isTransitioning())&&(w(n,e)||h.warn(`router.removeRoute`,`Route "${e}" not found. No changes made.`))},update:(e,r)=>{p(t.isDisposed),t.validator?.routes.validateUpdateRouteBasicArgs(e,r),t.validator?.routes.throwIfInternalRoute(e,`updateRoute`);let{forwardTo:i,defaultParams:a,decodeParams:o,encodeParams:s,canActivate:c,canDeactivate:l}=r;t.validator?.routes.validateUpdateRoutePropertyTypes(e,r),t.isTransitioning()&&h.error(`router.updateRoute`,`Updating route "${e}" while navigation is in progress. This may cause unexpected behavior.`),t.validator?.routes.validateUpdateRoute(e,r,n),T(n,e,{forwardTo:i,defaultParams:a,decodeParams:o,encodeParams:s}),c!==void 0&&(c===null?n.lifecycleNamespace.clearCanActivate(e):n.lifecycleNamespace.addCanActivate(e,c,!0)),l!==void 0&&(l===null?n.lifecycleNamespace.clearCanDeactivate(e):n.lifecycleNamespace.addCanDeactivate(e,l,!0))},clear:()=>{p(t.isDisposed),_(t.isTransitioning())&&(n.treeOperations.resetStore(n),n.lifecycleNamespace.clearAll(),t.clearState())},has:e=>(t.validator?.routes.validateRouteName(e,`hasRoute`),n.matcher.hasRoute(e)),get:e=>(t.validator?.routes.validateRouteName(e,`getRoute`),E(n,e)),replace:r=>{p(t.isDisposed);let i=Array.isArray(r)?r:[r];if(!_(t.isTransitioning()))return;c(i,t.validator),t.validator?.routes.throwIfInternalRouteInArray(i,`replaceRoutes`),t.validator?.routes.validateAddRouteArgs(i),t.validator?.routes.validateRoutes(i,n);let a=e.getState()?.path;C(n,i,t,a)}}}function O(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 k(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 A(e){let t=d(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)=>{p(t.isDisposed),t.validator?.dependencies.validateSetDependencyArgs(e,n,`setDependency`),O(t.dependenciesGetStore(),e,n,t.validator)},setAll:e=>{p(t.isDisposed);let n=t.dependenciesGetStore();t.validator?.dependencies.validateDependenciesObject(e,`setDependencies`),t.validator?.dependencies.validateDependencyLimit(n,n.limits),k(n,e,t.validator)},remove:e=>{p(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:()=>{p(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))}}function j(e){let t=d(e),n=t.routeGetStore().lifecycleNamespace;return{addActivateGuard(e,r){p(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){p(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){p(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeActivateGuard`),n.clearCanActivate(e)},removeDeactivateGuard(e){p(t.isDisposed),t.validator?.routes.validateRouteName(e,`removeDeactivateGuard`),n.clearCanDeactivate(e)}}}function M(e,t){let r=d(e);if(r.isDisposed())throw new u(l.ROUTER_DISPOSED);r.validator?.dependencies.validateCloneArgs(t);let i=r.routeGetStore(),a=n(i.tree),o=i.config,c=i.resolvedForwardMap,f=i.routeCustomFields,p=r.cloneOptions(),m=r.cloneDependencies(),[h,g]=r.getLifecycleFactories(),_=r.getPluginFactories(),v=new s(a,p,{...m,...t}),y=j(v);for(let[e,t]of Object.entries(h))y.addDeactivateGuard(e,t);for(let[e,t]of Object.entries(g))y.addActivateGuard(e,t);_.length>0&&v.usePlugin(..._);let b=d(v).routeGetStore();return Object.assign(b.config.decoders,o.decoders),Object.assign(b.config.encoders,o.encoders),Object.assign(b.config.defaultParams,o.defaultParams),Object.assign(b.config.forwardMap,o.forwardMap),Object.assign(b.config.forwardFnMap,o.forwardFnMap),Object.assign(b.resolvedForwardMap,c),Object.assign(b.routeCustomFields,f),v}export{M as cloneRouter,A as getDependenciesApi,j as getLifecycleApi,m as getPluginApi,D as getRoutesApi};
2
2
  //# sourceMappingURL=api.mjs.map
@@ -1,2 +1,2 @@
1
- import{a as e,t}from"./Router-BP_Wjnyr.mjs";import{c as n,l as r,o as i,s as a,t as o}from"./RouterError-BOUkCIgf.mjs";const s=(e=[],n={},r={})=>new t(e,n,r),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{t as Router,o as RouterError,i as UNKNOWN_ROUTE,a as constants,s as createRouter,n as errorCodes,r as events,l as getNavigator,e as resolveForwardChain};
1
+ import{a as e,t}from"./Router-DmPynezS.mjs";import{c as n,l as r,o as i,s as a,t as o}from"./RouterError-BOUkCIgf.mjs";const s=(e=[],n={},r={})=>new t(e,n,r),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{t as Router,o as RouterError,i as UNKNOWN_ROUTE,a as constants,s as createRouter,n as errorCodes,r as events,l as getNavigator,e as resolveForwardChain};
2
2
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@real-router/core",
3
- "version": "0.45.3",
3
+ "version": "0.47.0",
4
4
  "type": "commonjs",
5
5
  "description": "A simple, powerful, view-agnostic, modular and extensible router",
6
6
  "main": "./dist/cjs/index.js",
@@ -21,6 +21,7 @@
21
21
  },
22
22
  "exports": {
23
23
  ".": {
24
+ "@real-router/internal-source": "./src/index.ts",
24
25
  "types": {
25
26
  "import": "./dist/esm/index.d.mts",
26
27
  "require": "./dist/cjs/index.d.ts"
@@ -29,6 +30,7 @@
29
30
  "require": "./dist/cjs/index.js"
30
31
  },
31
32
  "./api": {
33
+ "@real-router/internal-source": "./src/api/index.ts",
32
34
  "types": {
33
35
  "import": "./dist/esm/api.d.mts",
34
36
  "require": "./dist/cjs/api.d.ts"
@@ -37,6 +39,7 @@
37
39
  "require": "./dist/cjs/api.js"
38
40
  },
39
41
  "./utils": {
42
+ "@real-router/internal-source": "./src/utils/index.ts",
40
43
  "types": {
41
44
  "import": "./dist/esm/utils.d.mts",
42
45
  "require": "./dist/cjs/utils.d.ts"
@@ -45,6 +48,7 @@
45
48
  "require": "./dist/cjs/utils.js"
46
49
  },
47
50
  "./validation": {
51
+ "@real-router/internal-source": "./src/validation.ts",
48
52
  "types": {
49
53
  "import": "./dist/esm/validation.d.mts",
50
54
  "require": "./dist/cjs/validation.d.ts"
@@ -83,13 +87,13 @@
83
87
  "homepage": "https://github.com/greydragon888/real-router",
84
88
  "sideEffects": false,
85
89
  "dependencies": {
86
- "@real-router/logger": "^0.2.3",
87
- "@real-router/types": "^0.31.2",
88
- "@real-router/fsm": "^0.3.0"
90
+ "@real-router/fsm": "^0.4.0",
91
+ "@real-router/logger": "^0.3.0",
92
+ "@real-router/types": "^0.33.0"
89
93
  },
90
94
  "devDependencies": {
91
- "route-tree": "^0.3.4",
92
- "event-emitter": "^0.1.2"
95
+ "event-emitter": "^0.1.2",
96
+ "route-tree": "^0.3.4"
93
97
  },
94
98
  "scripts": {
95
99
  "build": "tsdown --config-loader unrun",
@@ -102,7 +106,6 @@
102
106
  "type-check": "tsc --noEmit",
103
107
  "lint": "eslint --cache --ext .ts src/ tests/ --fix --max-warnings 0",
104
108
  "lint:package": "publint",
105
- "lint:types": "attw --pack .",
106
- "build:dist-only": "tsdown --config-loader unrun"
109
+ "lint:types": "attw --pack ."
107
110
  }
108
111
  }
@@ -11,6 +11,7 @@ import type { FSM } from "@real-router/fsm";
11
11
  import type {
12
12
  EventName,
13
13
  LeaveFn,
14
+ LeaveState,
14
15
  NavigationOptions,
15
16
  Plugin,
16
17
  State,
@@ -19,9 +20,34 @@ import type {
19
20
  } from "@real-router/types";
20
21
  import type { EventEmitter } from "event-emitter";
21
22
 
23
+ function ensureError(value: unknown): Error {
24
+ /* v8 ignore next -- @preserve: defensive guard — listeners should always throw Error objects */
25
+ return value instanceof Error ? value : new Error(String(value));
26
+ }
27
+
28
+ function settleLeavePromises(
29
+ promises: Promise<void>[],
30
+ firstSyncError: unknown,
31
+ ): Promise<void> {
32
+ return Promise.allSettled(promises).then((results) => {
33
+ if (firstSyncError !== undefined) {
34
+ throw ensureError(firstSyncError);
35
+ }
36
+
37
+ const rejected = results.find(
38
+ (result): result is PromiseRejectedResult => result.status === "rejected",
39
+ );
40
+
41
+ if (rejected !== undefined) {
42
+ throw ensureError(rejected.reason);
43
+ }
44
+ });
45
+ }
46
+
22
47
  export class EventBusNamespace {
23
48
  readonly #fsm: FSM<RouterState, RouterEvent, null, RouterPayloads>;
24
49
  readonly #emitter: EventEmitter<RouterEventMap>;
50
+ readonly #leaveListeners: LeaveFn[] = [];
25
51
 
26
52
  #currentToState: State | undefined;
27
53
  #pendingToState: State | undefined;
@@ -225,18 +251,68 @@ export class EventBusNamespace {
225
251
  }
226
252
 
227
253
  subscribeLeave(listener: LeaveFn): Unsubscribe {
228
- return this.#emitter.on(
229
- events.TRANSITION_LEAVE_APPROVE,
230
- (toState: State, fromState?: State) => {
231
- if (fromState !== undefined) {
232
- listener({ route: fromState, nextRoute: toState });
254
+ this.#leaveListeners.push(listener);
255
+
256
+ return () => {
257
+ const idx = this.#leaveListeners.indexOf(listener);
258
+
259
+ if (idx !== -1) {
260
+ this.#leaveListeners.splice(idx, 1);
261
+ }
262
+ };
263
+ }
264
+
265
+ hasLeaveListeners(): boolean {
266
+ return this.#leaveListeners.length > 0;
267
+ }
268
+
269
+ awaitLeaveListeners(
270
+ toState: State,
271
+ fromState: State | undefined,
272
+ signal: AbortSignal,
273
+ ): Promise<void> | undefined {
274
+ if (fromState === undefined) {
275
+ return undefined;
276
+ }
277
+
278
+ const leaveState: LeaveState = {
279
+ route: fromState,
280
+ nextRoute: toState,
281
+ signal,
282
+ };
283
+
284
+ let promises: Promise<void>[] | undefined;
285
+ let firstSyncError: unknown;
286
+
287
+ for (const listener of this.#leaveListeners) {
288
+ try {
289
+ const result = listener(leaveState);
290
+
291
+ if (result !== undefined && typeof result.then === "function") {
292
+ promises ??= [];
293
+ promises.push(result);
233
294
  }
234
- },
235
- );
295
+ } catch (error: unknown) {
296
+ if (firstSyncError === undefined) {
297
+ firstSyncError = error;
298
+ }
299
+ }
300
+ }
301
+
302
+ if (promises === undefined) {
303
+ if (firstSyncError !== undefined) {
304
+ throw ensureError(firstSyncError);
305
+ }
306
+
307
+ return undefined;
308
+ }
309
+
310
+ return settleLeavePromises(promises, firstSyncError);
236
311
  }
237
312
 
238
313
  clearAll(): void {
239
314
  this.#emitter.clearAll();
315
+ this.#leaveListeners.length = 0;
240
316
  }
241
317
 
242
318
  setLimits(limits: {
@@ -15,7 +15,9 @@ import { RouterError } from "../../RouterError";
15
15
  import { getTransitionPath, nameToIDs } from "../../transitionPath";
16
16
 
17
17
  import type { NavigationContext, NavigationDependencies } from "./types";
18
+ import type { TransitionPath } from "../../transitionPath";
18
19
  import type {
20
+ GuardFn,
19
21
  NavigationOptions,
20
22
  Params,
21
23
  State,
@@ -140,10 +142,8 @@ export class NavigationNamespace {
140
142
  deps.getLifecycleFunctions();
141
143
  const isUnknownRoute = toState.name === constants.UNKNOWN_ROUTE;
142
144
 
143
- const { toDeactivate, toActivate, intersection } = getTransitionPath(
144
- toState,
145
- fromState,
146
- );
145
+ const transitionPath = getTransitionPath(toState, fromState);
146
+ const { toDeactivate, toActivate, intersection } = transitionPath;
147
147
 
148
148
  const shouldDeactivate =
149
149
  fromState && !opts.forceDeactivate && toDeactivate.length > 0;
@@ -152,30 +152,46 @@ export class NavigationNamespace {
152
152
  canDeactivateFunctions.size > 0 || canActivateFunctions.size > 0;
153
153
 
154
154
  const confirmedToState = toState;
155
- const emitLeaveApproveCallback = () => {
156
- deps.sendLeaveApprove(confirmedToState, fromState);
157
- };
158
-
159
- const isCurrentNav = () => this.#navigationId === myId && deps.isActive();
160
155
 
161
156
  if (!hasGuards) {
162
- // No guards — emitLeaveApprove directly before completeTransition
163
- emitLeaveApproveCallback();
157
+ const asyncLeave = this.#handleNoGuardsLeave(
158
+ confirmedToState,
159
+ fromState,
160
+ myId,
161
+ opts,
162
+ transitionPath,
163
+ canDeactivateFunctions,
164
+ );
164
165
 
165
- // Reentrant check: subscribeLeave() listener may have called router.navigate()
166
- // Same pattern as reentrant check after emitTransitionStart (line 141-143)
167
- /* v8 ignore next 3 -- @preserve: reentrant navigate from TRANSITION_LEAVE_APPROVE listener; tested but V8 cannot track the branch through the synchronous callback chain */
168
- if (this.#navigationId !== myId) {
169
- throw new RouterError(errorCodes.TRANSITION_CANCELLED);
166
+ /* v8 ignore start */
167
+ if (asyncLeave !== undefined) {
168
+ return asyncLeave;
170
169
  }
170
+ /* v8 ignore stop */
171
171
  }
172
172
 
173
173
  if (hasGuards) {
174
174
  controller = new AbortController();
175
175
  this.#currentController = controller;
176
+ const isCurrentNav = () =>
177
+ this.#navigationId === myId && deps.isActive();
176
178
 
177
179
  const signal = controller.signal;
178
180
 
181
+ const emitLeaveApproveCallback = (): Promise<void> | undefined => {
182
+ deps.sendLeaveApprove(confirmedToState, fromState);
183
+
184
+ if (deps.hasLeaveListeners()) {
185
+ return deps.awaitLeaveListeners(
186
+ confirmedToState,
187
+ fromState,
188
+ signal,
189
+ );
190
+ }
191
+
192
+ return undefined;
193
+ };
194
+
179
195
  const guardCompletion = executeGuardPipeline(
180
196
  canDeactivateFunctions,
181
197
  canActivateFunctions,
@@ -375,6 +391,55 @@ export class NavigationNamespace {
375
391
  }
376
392
  }
377
393
 
394
+ #handleNoGuardsLeave(
395
+ toState: State,
396
+ fromState: State | undefined,
397
+ myId: number,
398
+ opts: NavigationOptions,
399
+ transitionPath: TransitionPath,
400
+ canDeactivateFunctions: Map<string, GuardFn>,
401
+ ): Promise<State> | undefined {
402
+ const deps = this.#deps;
403
+
404
+ deps.sendLeaveApprove(toState, fromState);
405
+
406
+ /* v8 ignore start */
407
+ if (deps.hasLeaveListeners()) {
408
+ const controller = new AbortController();
409
+ const leaveResult = deps.awaitLeaveListeners(
410
+ toState,
411
+ fromState,
412
+ controller.signal,
413
+ );
414
+
415
+ if (leaveResult !== undefined) {
416
+ this.#currentController = controller;
417
+
418
+ return this.#finishAsyncNavigation(
419
+ leaveResult,
420
+ {
421
+ toState,
422
+ fromState,
423
+ opts,
424
+ toDeactivate: transitionPath.toDeactivate,
425
+ toActivate: transitionPath.toActivate,
426
+ intersection: transitionPath.intersection,
427
+ canDeactivateFunctions,
428
+ },
429
+ controller,
430
+ myId,
431
+ );
432
+ }
433
+ }
434
+
435
+ if (this.#navigationId !== myId) {
436
+ throw new RouterError(errorCodes.TRANSITION_CANCELLED);
437
+ }
438
+ /* v8 ignore stop */
439
+
440
+ return undefined;
441
+ }
442
+
378
443
  #cleanupController(controller: AbortController): void {
379
444
  controller.abort();
380
445
 
@@ -78,7 +78,7 @@ async function finishAsyncPipeline( // NOSONAR
78
78
  fromState: State | undefined,
79
79
  signal: AbortSignal,
80
80
  isActive: () => boolean,
81
- emitLeaveApprove: () => void,
81
+ emitLeaveApprove: () => Promise<void> | undefined,
82
82
  ): Promise<void> {
83
83
  await deactivateCompletion;
84
84
 
@@ -86,7 +86,16 @@ async function finishAsyncPipeline( // NOSONAR
86
86
  throw new RouterError(errorCodes.TRANSITION_CANCELLED);
87
87
  }
88
88
 
89
- emitLeaveApprove();
89
+ const leaveResult = emitLeaveApprove();
90
+
91
+ if (leaveResult !== undefined) {
92
+ await leaveResult;
93
+
94
+ /* v8 ignore next 3 -- @preserve: V8 cannot track cancellation check through async leave continuation after Promise.allSettled */
95
+ if (!isActive()) {
96
+ throw new RouterError(errorCodes.TRANSITION_CANCELLED);
97
+ }
98
+ }
90
99
 
91
100
  if (shouldActivate) {
92
101
  const pending = runGuards(
@@ -120,7 +129,7 @@ export function executeGuardPipeline( // NOSONAR
120
129
  fromState: State | undefined,
121
130
  signal: AbortSignal,
122
131
  isActive: () => boolean,
123
- emitLeaveApprove: () => void,
132
+ emitLeaveApprove: () => Promise<void> | undefined,
124
133
  ): Promise<void> | undefined {
125
134
  if (shouldDeactivate) {
126
135
  const pending = runGuards(
@@ -152,7 +161,20 @@ export function executeGuardPipeline( // NOSONAR
152
161
  throw new RouterError(errorCodes.TRANSITION_CANCELLED);
153
162
  }
154
163
 
155
- emitLeaveApprove();
164
+ const leaveResult = emitLeaveApprove();
165
+
166
+ if (leaveResult !== undefined) {
167
+ return finishAfterAsyncLeave(
168
+ leaveResult,
169
+ /* v8 ignore next -- @preserve: false-branch unreachable — navigateToNotFound bypasses guards pipeline */
170
+ shouldActivate ? activateGuards : undefined,
171
+ toActivate,
172
+ toState,
173
+ fromState,
174
+ signal,
175
+ isActive,
176
+ );
177
+ }
156
178
 
157
179
  if (shouldActivate) {
158
180
  return runGuards(
@@ -169,6 +191,43 @@ export function executeGuardPipeline( // NOSONAR
169
191
  return undefined;
170
192
  }
171
193
 
194
+ async function finishAfterAsyncLeave(
195
+ leaveCompletion: Promise<void>,
196
+ activateGuards: Map<string, GuardFn> | undefined,
197
+ toActivate: string[],
198
+ toState: State,
199
+ fromState: State | undefined,
200
+ signal: AbortSignal,
201
+ isActive: () => boolean,
202
+ ): Promise<void> {
203
+ await leaveCompletion;
204
+
205
+ if (!isActive()) {
206
+ throw new RouterError(errorCodes.TRANSITION_CANCELLED);
207
+ }
208
+
209
+ /* v8 ignore next -- @preserve: false-branch unreachable — navigateToNotFound bypasses guards pipeline */
210
+ if (activateGuards !== undefined) {
211
+ const pending = runGuards(
212
+ activateGuards,
213
+ toActivate,
214
+ errorCodes.CANNOT_ACTIVATE,
215
+ toState,
216
+ fromState,
217
+ signal,
218
+ isActive,
219
+ );
220
+
221
+ if (pending !== undefined) {
222
+ await pending;
223
+ }
224
+
225
+ if (!isActive()) {
226
+ throw new RouterError(errorCodes.TRANSITION_CANCELLED);
227
+ }
228
+ }
229
+ }
230
+
172
231
  function runGuards(
173
232
  guards: Map<string, GuardFn>,
174
233
  segments: string[],
@@ -97,4 +97,14 @@ export interface NavigationDependencies {
97
97
 
98
98
  /** Clear canDeactivate guard for a route */
99
99
  clearCanDeactivate: (name: string) => void;
100
+
101
+ /** Check if any leave listeners are registered */
102
+ hasLeaveListeners: () => boolean;
103
+
104
+ /** Call all leave listeners — returns Promise if any are async, undefined otherwise */
105
+ awaitLeaveListeners: (
106
+ toState: State,
107
+ fromState: State | undefined,
108
+ signal: AbortSignal,
109
+ ) => Promise<void> | undefined;
100
110
  }
@@ -14,7 +14,7 @@ type PrimitiveParam = string | number | boolean;
14
14
  * Represents a transition path between two router states.
15
15
  * Contains information about which route segments need to be activated/deactivated.
16
16
  */
17
- interface TransitionPath {
17
+ export interface TransitionPath {
18
18
  /** The common ancestor route segment where paths diverge */
19
19
  intersection: string;
20
20
  /** Route segments that need to be deactivated (in reverse order) */
@@ -203,6 +203,9 @@ export class RouterWiringBuilder<
203
203
  clearCanDeactivate: (name: string) => {
204
204
  this.routeLifecycle.clearCanDeactivate(name);
205
205
  },
206
+ hasLeaveListeners: () => this.eventBus.hasLeaveListeners(),
207
+ awaitLeaveListeners: (toState, fromState, signal) =>
208
+ this.eventBus.awaitLeaveListeners(toState, fromState, signal),
206
209
  };
207
210
 
208
211
  this.navigation.setDependencies(navigationDeps);
@@ -1,6 +0,0 @@
1
- const e=require(`./RouterError-AQUx-VLW.js`),t=require(`./internals-na15rxo_.js`);let n=require(`@real-router/logger`),r=require(`@real-router/fsm`);const i={maxListeners:0,warnListeners:0,maxEventDepth:0};var a=class extends Error{},o=class{#e=new Map;#t=null;#n=i;#r;#i;constructor(e){e?.limits&&(this.#n=e.limits),this.#r=e?.onListenerError??null,this.#i=e?.onListenerWarn??null}static validateCallback(e,t){if(typeof e!=`function`)throw TypeError(`Expected callback to be a function for event ${t}`)}setLimits(e){this.#n=e}on(e,t){let n=this.#c(e);if(n.has(t))throw Error(`Duplicate listener for "${e}"`);let{maxListeners:r,warnListeners:i}=this.#n;if(i!==0&&n.size===i&&this.#i?.(e,i),r!==0&&n.size>=r)throw Error(`Listener limit (${r}) reached for "${e}"`);return n.add(t),()=>{this.off(e,t)}}off(e,t){this.#e.get(e)?.delete(t)}emit(e,t,n,r,i){let a=this.#e.get(e);if(!a||a.size===0)return;let o=arguments.length-1;if(this.#n.maxEventDepth===0){this.#a(a,e,o,t,n,r,i);return}this.#s(a,e,o,t,n,r,i)}clearAll(){this.#e.clear(),this.#t=null}listenerCount(e){return this.#e.get(e)?.size??0}#a(e,t,n,r,i,a,o){if(e.size===1){let[s]=e;try{this.#o(s,n,r,i,a,o)}catch(e){this.#r?.(t,e)}return}let s=[...e];for(let e of s)try{this.#o(e,n,r,i,a,o)}catch(e){this.#r?.(t,e)}}#o(e,t,n,r,i,a){switch(t){case 0:e();break;case 1:e(n);break;case 2:e(n,r);break;case 3:e(n,r,i);break;default:e(n,r,i,a)}}#s(e,t,n,r,i,o,s){this.#t??=new Map;let c=this.#t,l=c.get(t)??0;if(l>=this.#n.maxEventDepth)throw new a(`Maximum recursion depth (${this.#n.maxEventDepth}) exceeded for event: ${t}`);try{c.set(t,l+1);let u=e.size===1?e:[...e];for(let e of u)try{this.#o(e,n,r,i,o,s)}catch(e){if(e instanceof a)throw e;this.#r?.(t,e)}}finally{c.set(t,c.get(t)-1)}}#c(e){let t=this.#e.get(e);if(t)return t;let n=new Set;return this.#e.set(e,n),n}};const s={IDLE:`IDLE`,STARTING:`STARTING`,READY:`READY`,TRANSITION_STARTED:`TRANSITION_STARTED`,LEAVE_APPROVED:`LEAVE_APPROVED`,DISPOSED:`DISPOSED`},c={START:`START`,STARTED:`STARTED`,NAVIGATE:`NAVIGATE`,LEAVE_APPROVE:`LEAVE_APPROVE`,COMPLETE:`COMPLETE`,FAIL:`FAIL`,CANCEL:`CANCEL`,STOP:`STOP`,DISPOSE:`DISPOSE`},l={initial:s.IDLE,context:null,transitions:{[s.IDLE]:{[c.START]:s.STARTING,[c.DISPOSE]:s.DISPOSED},[s.STARTING]:{[c.STARTED]:s.READY,[c.FAIL]:s.IDLE},[s.READY]:{[c.NAVIGATE]:s.TRANSITION_STARTED,[c.FAIL]:s.READY,[c.STOP]:s.IDLE},[s.TRANSITION_STARTED]:{[c.NAVIGATE]:s.TRANSITION_STARTED,[c.LEAVE_APPROVE]:s.LEAVE_APPROVED,[c.CANCEL]:s.READY,[c.FAIL]:s.READY},[s.LEAVE_APPROVED]:{[c.NAVIGATE]:s.TRANSITION_STARTED,[c.COMPLETE]:s.READY,[c.CANCEL]:s.READY,[c.FAIL]:s.READY},[s.DISPOSED]:{}}};function u(){return new r.FSM(l)}function d(e){if(!e||typeof e!=`object`||e.constructor!==Object)throw TypeError(`dependencies must be a plain object`);for(let t in e)if(Object.getOwnPropertyDescriptor(e,t)?.get)throw TypeError(`dependencies cannot contain getters: "${t}"`)}function f(e,t){for(let n of e){let e=n;if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(`route must be a non-array object`);t?.routes.guardRouteCallbacks(n),t?.routes.guardNoAsyncCallbacks(n);let r=n.children;r&&f(r,t)}}function p(t={}){let n=Object.create(null);for(let e in t)t[e]!==void 0&&(n[e]=t[e]);return{dependencies:n,limits:e.i}}function m(e){return`(${e.replaceAll(/(^<|>$)/g,``)})`}const h=/([:*])([^/?<]+)(<[^>]+>)?(\?)?/g,ee=/([:*][^/?<]+(?:<[^>]+>)?)\?(?=\/|$)/g,te=/\?(.+)$/;function g(e){let t=[],n=[],r=[],i={},a=new Map,o=e.replaceAll(ee,`$1`),s=te.exec(o);if(s!==null){let t=s[1].split(`&`);for(let e of t){let t=e.trim();t.length>0&&(n.push(t),i[t]=`query`)}e=e.slice(0,s.index)}let c;for(;(c=h.exec(e))!==null;){let e=c[1],n=c[2],o=c[3];if(e===`*`)r.push(n),t.push(n),i[n]=`url`;else if(t.push(n),i[n]=`url`,o){let e=`^${m(o)}$`;a.set(n,{pattern:new RegExp(e),constraint:o})}}return{urlParams:t,queryParams:n,spatParams:r,paramTypeMap:i,constraintPatterns:a,pathPattern:e}}const ne=/[^\w!$'()*+,.:;|~-]/gu,_=/[^\w!$'()*+,.:;|~-]/u,v={default:e=>_.test(e)?e.replaceAll(ne,e=>encodeURIComponent(e)):e,uri:encodeURI,uriComponent:encodeURIComponent,none:e=>e},re={default:decodeURIComponent,uri:decodeURI,uriComponent:decodeURIComponent,none:e=>e};function y(){return{staticChildren:Object.create(null),hasChildren:!1,paramChild:void 0,splatChild:void 0,route:void 0,slashChildRoute:void 0}}function b(e){return e.length>1&&e.endsWith(`/`)?e.slice(0,-1):e}function ie(e,t){return e===``?t:t===``?e:e+t}function ae(e){let t={};if(e.length===0)return t;let n=0,r=e.length;for(;n<=r;){let i=e.indexOf(`&`,n);i===-1&&(i=r);let a=e.indexOf(`=`,n);a===-1||a>i?t[decodeURIComponent(e.slice(n,i))]=``:t[decodeURIComponent(e.slice(n,a))]=decodeURIComponent(e.slice(a+1,i)),n=i+1}return t}function oe(e){let t=``;for(let n in e){t.length>0&&(t+=`&`);let r=e[n],i=encodeURIComponent(n);t+=r===``?i:`${i}=${encodeURIComponent(String(r))}`}return t}function x(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function se(e){let t=0;for(;t<e.length;)if(e.codePointAt(t)===37){if(t+2>=e.length)return!1;let n=e.codePointAt(t+1)??0,r=e.codePointAt(t+2)??0;if(!x(n)||!x(r))return!1;t+=3}else t++;return!0}const S=/<[^>]*>/g;function ce(e,t,n,r,i){let a=t.fullName===``;a||r.push(t);let o=t.absolute,s=t.paramMeta.pathPattern,c=o&&s.startsWith(`~`)?s.slice(1):s,l=(o?c:s).replaceAll(S,``),u=o?l:ie(n,l),d=i;a||(d=le(e,t,u,o?``:n,r,i));for(let n of t.children.values())ce(e,n,u,r,d);a||r.pop()}function le(e,t,n,r,i,a){let o=pe(n,r),s=Object.freeze([...i]),c=ue(s),l=b(n),u=be(e.rootQueryParams,i),d=xe(i),{buildStaticParts:f,buildParamSlots:p}=ye(o?b(r):l,o?i.slice(0,-1):i,e.options.urlParamsEncoding),m={name:t.fullName,parent:a,depth:i.length-1,matchSegments:s,meta:c,declaredQueryParams:u,declaredQueryParamsSet:new Set(u),hasTrailingSlash:n.length>1&&n.endsWith(`/`),constraintPatterns:d,hasConstraints:d.size>0,buildStaticParts:f,buildParamSlots:p,buildParamNamesSet:new Set(p.map(e=>e.paramName))};return t.paramMeta.urlParams.length===0&&(m.cachedResult=Object.freeze({segments:m.matchSegments,params:Object.freeze({}),meta:m.meta})),e.routesByName.set(t.fullName,m),e.segmentsByName.set(t.fullName,s),e.metaByName.set(t.fullName,c),o?de(e,m,r):fe(e,m,n,l,t),m}function ue(e){let t={};for(let n of e)t[n.fullName]=n.paramTypeMap;return Object.freeze(t)}function de(e,t,n){he(e,t,n);let r=b(n),i=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.has(i)&&e.staticCache.set(i,t)}function fe(e,t,n,r,i){if(me(e,t,n),i.paramMeta.urlParams.length===0){let n=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.set(n,t)}}function pe(e,t){return b(e)===b(t)}function me(e,t,n){let r=b(n);if(r===`/`){e.root.route=t;return}C(e,e.root,r,1,t)}function C(e,t,n,r,i){let a=n.length;for(;r<=a;){let o=n.indexOf(`/`,r),s=o===-1?a:o,c=n.slice(r,s);if(c.endsWith(`?`)){let r=c.slice(1).replaceAll(S,``).replace(/\?$/,``);t.paramChild??={node:y(),name:r},C(e,t.paramChild.node,n,s+1,i),s>=a?t.route??=i:C(e,t,n,s+1,i);return}t=ve(e,t,c),r=s+1}t.route=i}function he(e,t,n){let r=ge(e,n);r.slashChildRoute=t}function ge(e,t){return _e(e,e.root,t)}function _e(e,t,n){let r=b(n);if(r===`/`||r===``)return t;let i=t,a=1,o=r.length;for(;a<=o;){let t=r.indexOf(`/`,a),n=t===-1?o:t;if(n<=a)break;let s=r.slice(a,n);i=ve(e,i,s),a=n+1}return i}function ve(e,t,n){if(n.startsWith(`*`)){let e=n.slice(1);return t.splatChild??={node:y(),name:e},t.hasChildren=!0,t.splatChild.node}if(n.startsWith(`:`)){let e=n.slice(1).replaceAll(S,``).replace(/\?$/,``);return t.paramChild??={node:y(),name:e},t.hasChildren=!0,t.paramChild.node}let r=e.options.caseSensitive?n:n.toLowerCase();return r in t.staticChildren||(t.staticChildren[r]=y(),t.hasChildren=!0),t.staticChildren[r]}function ye(e,t,n){let r=new Set,i=new Set;for(let e of t){for(let t of e.paramMeta.urlParams)r.add(t);for(let t of e.paramMeta.spatParams)i.add(t)}if(r.size===0)return{buildStaticParts:[e],buildParamSlots:[]};let a=[],o=[],s=/[:*]([\w]+)(?:<[^>]*>)?(\?)?/gu,c=0,l;for(;(l=s.exec(e))!==null;){let t=l[1],r=l[2]===`?`;a.push(e.slice(c,l.index));let s=i.has(t)?e=>{let t=v[n],r=e.split(`/`),i=t(r[0]);for(let e=1;e<r.length;e++)i+=`/${t(r[e])}`;return i}:v[n];o.push({paramName:t,isOptional:r,encoder:s}),c=l.index+l[0].length}return a.push(e.slice(c)),{buildStaticParts:a,buildParamSlots:o}}function be(e,t){let n=[];e.length>0&&n.push(...e);for(let e of t)e.paramMeta.queryParams.length>0&&n.push(...e.paramMeta.queryParams);return n}function xe(e){let t=new Map;for(let n of e)for(let[e,r]of n.paramMeta.constraintPatterns)t.set(e,r);return t}var Se=class{get options(){return this.#e}#e;#t=y();#n=new Map;#r=new Map;#i=new Map;#a=new Map;#o={cleanPath:``,normalized:``,queryString:void 0};#s=``;#c=[];#l=``;#u;#d;constructor(e){this.#e={caseSensitive:e?.caseSensitive??!0,strictTrailingSlash:e?.strictTrailingSlash??!1,strictQueryParams:e?.strictQueryParams??!1,urlParamsEncoding:e?.urlParamsEncoding??`default`,parseQueryString:e?.parseQueryString??ae,buildQueryString:e?.buildQueryString??oe},this.#u=this.#e.caseSensitive,this.#d=this.#e.urlParamsEncoding===`none`?null:re[this.#e.urlParamsEncoding]}registerTree(e){this.#c=e.paramMeta.queryParams,ce({root:this.#t,options:this.#e,routesByName:this.#n,segmentsByName:this.#r,metaByName:this.#i,staticCache:this.#a,rootQueryParams:this.#c},e,``,[],null)}match(e){if(!this.#g(e))return;let{cleanPath:t,normalized:n,queryString:r}=this.#o,i=this.#u?n:n.toLowerCase(),a=this.#a.get(i);if(a)return this.#e.strictTrailingSlash&&!this.#y(t,a)?void 0:r===void 0&&a.cachedResult?a.cachedResult:this.#v(a,{},r);let o={},s=this.#b(n,o);if(s&&!(this.#e.strictTrailingSlash&&!this.#y(t,s))&&!(s.hasConstraints&&!this.#w(o,s))&&this.#C(o))return this.#v(s,o,r)}buildPath(e,t,n){let r=this.#n.get(e);if(!r)throw Error(`[SegmentMatcher.buildPath] '${e}' is not defined`);r.hasConstraints&&t&&this.#f(r,e,t);let i=this.#p(r,t),a=this.#m(i,n?.trailingSlash),o=this.#h(r,t,n?.queryParamsMode);return a+(o?`?${o}`:``)}getSegmentsByName(e){return this.#r.get(e)}getMetaByName(e){return this.#i.get(e)}hasRoute(e){return this.#n.has(e)}setRootPath(e){this.#s=e}#f(e,t,n){for(let[r,i]of e.constraintPatterns){let e=n[r];if(e!=null){let n=typeof e==`object`?JSON.stringify(e):String(e);if(!i.pattern.test(n))throw Error(`[SegmentMatcher.buildPath] '${t}' — param '${r}' value '${n}' does not match constraint '${i.constraint}'`)}}}#p(e,t){let n=e.buildStaticParts,r=e.buildParamSlots;if(r.length===0)return this.#s+n[0];let i=this.#s+n[0];for(let[e,a]of r.entries()){let r=t?.[a.paramName];if(r==null){if(!a.isOptional)throw Error(`[SegmentMatcher.buildPath] Missing required param '${a.paramName}'`);i.length>1&&i.endsWith(`/`)&&(i=i.slice(0,-1)),i+=n[e+1];continue}let o;o=typeof r==`string`?r:typeof r==`object`?JSON.stringify(r):String(r);let s=a.encoder(o);i+=s+n[e+1]}return i}#m(e,t){return t===`always`&&!e.endsWith(`/`)?`${e}/`:t===`never`&&e!==`/`&&e.endsWith(`/`)?e.slice(0,-1):e}#h(e,t,n){if(!t||e.declaredQueryParams.length===0&&n!==`loose`)return``;let r={},i=!1;for(let n of e.declaredQueryParams)n in t&&(r[n]=t[n],i=!0);if(n===`loose`)for(let n in t)Object.hasOwn(t,n)&&!e.declaredQueryParamsSet.has(n)&&!e.buildParamNamesSet.has(n)&&(r[n]=t[n],i=!0);return i?this.#e.buildQueryString(r):``}#g(e){if(e===``&&(e=`/`),e.codePointAt(0)!==47)return!1;let t=this.#s.length;if(t>0){if(e.length<t||!e.startsWith(this.#s))return!1;e=e.length===t?`/`:e.slice(t)}let n=this.#_(e);if(n===-2)return!1;n===-3&&(e=this.#l);let r=n>=0?e.slice(0,n):e,i=n>=0?e.slice(n+1):void 0,a=b(r);return this.#o.cleanPath=r,this.#o.normalized=a,this.#o.queryString=i,!0}#_(e){let t=!1;for(let n=0;n<e.length;n++){let r=e.codePointAt(n);if(r===35)return this.#l=e.slice(0,n),-3;if(r===63)return n;if(r>=128)return-2;if(r===47){if(t)return-2;t=!0}else t=!1}return-1}#v(e,t,n){if(n!==void 0){let r=this.#e.parseQueryString(n);if(this.#e.strictQueryParams){let n=e.declaredQueryParamsSet;for(let e in r){if(!n.has(e))return;t[e]=r[e]}}else for(let e in r)t[e]=r[e]}return{segments:e.matchSegments,params:t,meta:e.meta}}#y(e,t){return(e.length>1&&e.endsWith(`/`))===t.hasTrailingSlash}#b(e,t){return e.length===1?this.#t.slashChildRoute??this.#t.route:this.#x(this.#t,e,1,t)}#x(e,t,n,r){let i=e,a=t.length,o=this.#u;for(;n<=a;){let e=t.indexOf(`/`,n),s=e===-1?a:e,c=t.slice(n,s),l=o?c:c.toLowerCase(),u;if(l in i.staticChildren)u=i.staticChildren[l];else if(i.paramChild)u=i.paramChild.node,r[i.paramChild.name]=c;else if(i.splatChild)return this.#S(i.splatChild,t,n,r);else return;i=u,n=s+1}return i.slashChildRoute??i.route}#S(e,t,n,r){let i=e.node;if(!i.hasChildren)return r[e.name]=t.slice(n),i.route;let a={},o=this.#x(i,t,n,a);return o?(Object.assign(r,a),o):(r[e.name]=t.slice(n),i.route)}#C(e){let t=this.#d;if(!t)return!0;for(let n in e){let r=e[n];if(r.includes(`%`)){if(!se(r))return!1;e[n]=t(r)}}return!0}#w(e,t){for(let[n,r]of t.constraintPatterns)if(!r.pattern.test(e[n]))return!1;return!0}};const w=e=>{let t=e.indexOf(`%`),n=e.indexOf(`+`);if(t===-1&&n===-1)return e;let r=n===-1?e:e.replaceAll(`+`,` `);return t===-1?r:decodeURIComponent(r)},T=(e,t)=>{if(e===void 0)return t.boolean.decodeUndefined();let n=t.boolean.decodeRaw(e);if(n!==null)return n;let r=w(e),i=t.number.decode(r);return i===null?t.boolean.decodeValue(r):i},E=e=>{let t=typeof e;if(t!==`string`&&t!==`number`&&t!==`boolean`)throw TypeError(`[search-params] Array element must be a string, number, or boolean — received ${t===`object`&&e===null?`null`:t}`);return encodeURIComponent(e)},Ce={none:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}=${E(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}=${E(t[r])}`;return n}},brackets:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}[]=${E(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}[]=${E(t[r])}`;return n}},index:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}[0]=${E(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}[${r}]=${E(t[r])}`;return n}},comma:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}=${E(t[0])}`;for(let e=1;e<t.length;e++)n+=`,${E(t[e])}`;return n},decodeValue:e=>e.includes(`,`)?e.split(`,`):null}},we={encode:(e,t)=>`${e}=${t}`,decodeUndefined:()=>null,decodeRaw:()=>null,decodeValue:e=>e},Te={encode:(e,t)=>`${e}=${t}`,decodeUndefined:()=>null,decodeRaw:e=>e===`true`?!0:e===`false`?!1:null,decodeValue:e=>e},Ee={encode:(e,t)=>t?e:`${e}=false`,decodeUndefined:()=>!0,decodeRaw:()=>null,decodeValue:e=>e},De={none:we,auto:Te,"empty-true":Ee},Oe={default:{encode:e=>e},hidden:{encode:()=>``}},ke={auto:{decode:e=>{let t=e.length;if(t===0||t>1&&e.codePointAt(0)===48&&e.codePointAt(1)!==46)return null;let n=!1;for(let r=0;r<t;r++){let i=e.codePointAt(r);if(!(i!==void 0&&i>=48&&i<=57)){if(i===46&&!n&&r!==0&&r!==t-1){n=!0;continue}return null}}let r=Number(e);return!Number.isSafeInteger(r)&&!n?null:r}},none:{decode:()=>null}},Ae=(e,t,n,r)=>({boolean:De[t],null:Oe[n],number:ke[r],array:Ce[e]}),je={boolean:De.auto,null:Oe.default,number:ke.auto,array:Ce.none},D={arrayFormat:`none`,booleanFormat:`auto`,nullFormat:`default`,numberFormat:`auto`},Me={...D,strategies:je},Ne=e=>{if(!e||e.arrayFormat===void 0&&e.booleanFormat===void 0&&e.nullFormat===void 0&&e.numberFormat===void 0)return Me;let t=e.arrayFormat??D.arrayFormat,n=e.booleanFormat??D.booleanFormat,r=e.nullFormat??D.nullFormat,i=e.numberFormat??D.numberFormat;return{arrayFormat:t,booleanFormat:n,nullFormat:r,numberFormat:i,strategies:Ae(t,n,r,i)}},O=e=>encodeURIComponent(e),Pe=(e,t,n)=>{let r=O(e);switch(typeof t){case`string`:case`number`:return`${r}=${O(t)}`;case`boolean`:return n.strategies.boolean.encode(r,t);case`object`:return t===null?n.strategies.null.encode(r):Array.isArray(t)?n.strategies.array.encodeArray(r,t):`${r}=${O(t)}`;default:return`${r}=${O(t)}`}},Fe=e=>{let t=e.indexOf(`?`);return t===-1?e:e.slice(t+1)};function Ie(e,t,n,r){let i=e[t];i===void 0?e[t]=r?[n]:n:Array.isArray(i)?i.push(n):e[t]=[i,n]}function Le(e,t,n,r,i){return i?T(r?e.slice(t+1,n):void 0,i):r?w(e.slice(t+1,n)):null}function Re(e,t,n,r,i){let a=e.indexOf(`=`,t),o=a!==-1&&a<n,s=o?a:n,c=s,l=!1;for(let n=t;n<s;n++)if(e.codePointAt(n)===91){c=n,l=!0;break}let u=w(e.slice(t,c));if(!l&&o&&i?.array.decodeValue){let t=e.slice(a+1,n),o=i.array.decodeValue(t);if(o){for(let e of o)Ie(r,u,T(e,i),!0);return}}Ie(r,u,Le(e,a,n,o,i),l)}const ze=(e,t)=>{let n=Fe(e);if(n===``||n===`?`)return{};if(!t)return Be(n);let r=Ne(t),i={},a=0,o=n.length;for(;a<o;){let e=n.indexOf(`&`,a);e===-1&&(e=o),Re(n,a,e,i,r.strategies),a=e+1}return i};function Be(e){let t={};return Ve(e,t),t}function Ve(e,t){let n=0,r=e.length;for(;n<r;){let i=e.indexOf(`&`,n);i===-1&&(i=r),Re(e,n,i,t),n=i+1}}const He=(e,t)=>{let n=Object.keys(e);if(n.length===0)return``;let r=Ne(t),i=[];for(let t of n){let n=e[t];if(n===void 0)continue;let a=Pe(t,n,r);a&&i.push(a)}return i.join(`&`)};function k(e,t){let n=e.path,r=n.startsWith(`~`),i=r?n.slice(1):n,a={name:e.name,path:i,absolute:r,children:[],parent:t,nonAbsoluteChildren:[],fullName:``};if(e.children)for(let t of e.children){let e=k(t,a);a.children.push(e)}return a}function Ue(e,t,n){let r=k({name:e,path:t},null);for(let e of n){let t=k(e,r);r.children.push(t)}return r}const We=Object.freeze(new Map),Ge=Object.freeze([]);function Ke(e){return e.parent?.name?`${e.parent.fullName}.${e.name}`:e.name}function qe(e,t){return e.endsWith(`/`)&&t.startsWith(`/`)?e+t.slice(1):e+t}function Je(e){if(!e.path)return null;let{urlParams:t,queryParams:n,spatParams:r}=e.paramMeta;if(t.length>0||n.length>0||r.length>0)return null;if(e.absolute)return e.path;let i=e.parent;return i?.path?i.staticPath===null?null:qe(i.staticPath,e.path):e.path}function Ye(e){let t=new Map;for(let n of e)t.set(n.name,n);return t}function Xe(e,t,n){let r=[],i=[];for(let a of e){let e=Ze(a,t,n);r.push(e),e.absolute||i.push(e)}return{childrenMap:Ye(r),nonAbsoluteChildren:i}}function Ze(e,t,n){let r=g(e.path),i=r.paramTypeMap,a={name:e.name,path:e.path,absolute:e.absolute,parent:t,children:void 0,paramMeta:r,nonAbsoluteChildren:void 0,fullName:``,staticPath:null,paramTypeMap:i};if(a.fullName=Ke(a),a.staticPath=Je(a),e.children.length===0)a.children=We,a.nonAbsoluteChildren=Ge;else{let{childrenMap:t,nonAbsoluteChildren:r}=Xe(e.children,a,n);a.children=t,a.nonAbsoluteChildren=r}return n&&(e.children.length>0&&(Object.freeze(a.nonAbsoluteChildren),Object.freeze(a.children)),Object.freeze(i),Object.freeze(a)),a}function Qe(e,t=!0){return Ze(e,null,t)}function $e(e,t){let n=[];return{add(e){return n.push(e),this},addMany(e){return n.push(...e),this},build(r){return Qe(Ue(e,t,n),!r?.skipFreeze)}}}function et(e,t,n,r){return $e(e,t).addMany(n).build(r)}function A(e){let t=e.absolute?`~${e.path}`:e.path,n={name:e.name,path:t};return e.children.size>0&&(n.children=Array.from(e.children.values(),A)),n}function tt(e){return Array.from(e.children.values(),A)}function nt(e){let t=e?.queryParams;return new Se({...e?.caseSensitive===void 0?void 0:{caseSensitive:e.caseSensitive},...e?.strictTrailingSlash===void 0?void 0:{strictTrailingSlash:e.strictTrailingSlash},...e?.strictQueryParams===void 0?void 0:{strictQueryParams:e.strictQueryParams},...e?.urlParamsEncoding===void 0?void 0:{urlParamsEncoding:e.urlParamsEncoding},parseQueryString:e=>ze(e,t),buildQueryString:e=>He(e,t)})}const rt={defaultRoute:``,defaultParams:{},trailingSlash:`preserve`,queryParamsMode:`loose`,queryParams:D,urlParamsEncoding:`default`,allowNotFound:!0,rewritePathOnMatch:!0};function it(e){Object.freeze(e);for(let t of Object.keys(e)){let n=e[t];n&&typeof n==`object`&&n.constructor===Object&&it(n)}return e}function at(e,t){return typeof e==`function`?e(t):e}function ot(e){if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(`[router.constructor] options must be a plain object`)}var st=class{#e;constructor(e={}){this.#e=it({...rt,...e})}static validateOptionsIsObject(e){ot(e)}get(){return this.#e}};function j(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!j(e[n],t[n]))return!1;return!0}return!1}const ct=new WeakMap;function M(e){return ct.get(e)}function lt(e,t){ct.set(e,t)}var ut=class{#e=void 0;#t=void 0;#n;#r=new Map;get(){return this.#e}set(t){this.#t=this.#e,this.#e=t?e.r(t):void 0}getPrevious(){return this.#t}reset(){this.#e=void 0,this.#t=void 0,this.#r.clear()}setDependencies(e){this.#n=e}makeState(t,n,r,i,a){let o=this.#n.getDefaultParams(),s=Object.hasOwn(o,t),c;c=s?{...o[t],...n}:!n||n===e.a?e.a:{...n};let l={name:t,params:c,path:r??this.#n.buildPath(t,n)};return i&&lt(l,i),a?l:e.r(l)}areStatesEqual(e,t,n=!0){if(!e||!t)return!!e==!!t;if(e.name!==t.name)return!1;if(n){let n=this.#i(e.name);for(let r of n)if(!j(e.params[r],t.params[r]))return!1;return!0}let r=Object.keys(e.params),i=Object.keys(t.params);if(r.length!==i.length)return!1;for(let n of r)if(!(n in t.params)||!j(e.params[n],t.params[n]))return!1;return!0}#i(e){let t=this.#r.get(e);if(t!==void 0)return t;let n=this.#n.getUrlParams(e);return this.#r.set(e,n),n}};const N={[e.u.ROUTER_START]:e.l.ROUTER_START,[e.u.ROUTER_STOP]:e.l.ROUTER_STOP,[e.u.TRANSITION_SUCCESS]:e.l.TRANSITION_SUCCESS,[e.u.TRANSITION_START]:e.l.TRANSITION_START,[e.u.TRANSITION_LEAVE_APPROVE]:e.l.TRANSITION_LEAVE_APPROVE,[e.u.TRANSITION_ERROR]:e.l.TRANSITION_ERROR,[e.u.TRANSITION_CANCEL]:e.l.TRANSITION_CANCEL},dt=Object.keys(N),P=`router.usePlugin`;function ft(e){if(!(e&&typeof e==`object`)||Array.isArray(e))throw TypeError(`[router.usePlugin] Plugin factory must return an object, got ${typeof e}`);if(typeof e.then==`function`)throw TypeError(`[router.usePlugin] Async plugin factories are not supported. Factory returned a Promise instead of a plugin object.`)}var pt=class t{#e=new Set;#t=new Set;#n;#r=e.i;#i=null;static validatePlugin(e){ft(e)}static validateNoDuplicatePlugins(e,t){for(let n of e)if(t(n))throw Error(`[router.usePlugin] Plugin factory already registered. To re-register, first unsubscribe the existing plugin.`)}setDependencies(e){this.#n=e}setLimits(e){
2
- // eslint-disable-next-line sonarjs/void-use -- @preserve: limits passed to validator via RouterInternals; void suppresses TS6133 until plugin implements validateCountThresholds
3
- this.#r=e,this.#r}setValidatorGetter(e){this.#i=e}count(){return this.#e.size}use(...e){if(this.#i?.()?.plugins.validateCountThresholds(this.#e.size+e.length),e.length===1){let t=e[0],r=this.#o(t);this.#e.add(t);let i=!1,a=()=>{if(!i){i=!0,this.#e.delete(t),this.#t.delete(a);try{r()}catch(e){n.logger.error(P,`Error during cleanup:`,e)}}};return this.#t.add(a),a}let t=this.#a(e),r=[];try{for(let e of t){let t=this.#o(e);r.push({factory:e,cleanup:t})}}catch(e){for(let{cleanup:e}of r)try{e()}catch(e){n.logger.error(P,`Cleanup error:`,e)}throw e}for(let{factory:e}of r)this.#e.add(e);let i=!1,a=()=>{if(!i){i=!0,this.#t.delete(a);for(let{factory:e}of r)this.#e.delete(e);for(let{cleanup:e}of r)try{e()}catch(e){n.logger.error(P,`Error during cleanup:`,e)}}};return this.#t.add(a),a}getAll(){return[...this.#e]}has(e){return this.#e.has(e)}disposeAll(){for(let e of this.#t)e();this.#e.clear(),this.#t.clear()}#a(e){let t=new Set;for(let n of e)t.has(n)?this.#i?.()?.plugins.warnBatchDuplicates(e):t.add(n);return t}#o(e){let n=this.#n.compileFactory(e);t.validatePlugin(n),this.#i?.()?.plugins.validatePluginKeys(n),Object.freeze(n);let r=[];for(let e of dt)e in n&&(typeof n[e]==`function`?(r.push(this.#n.addEventListener(N[e],n[e])),e===`onStart`&&this.#n.canNavigate()&&this.#i?.()?.plugins.warnPluginAfterStart(e)):this.#i?.()?.plugins.warnPluginMethodType(e));return()=>{for(let e of r)e();typeof n.teardown==`function`&&n.teardown()}}};function mt(e){let t=()=>e;return()=>t}var ht=class{#e=new Map;#t=new Map;#n=new Map;#r=new Map;#i=[this.#n,this.#r];#a=new Set;#o=new Set;#s=new Set;#c;#l=e.i;#u=null;setDependencies(e){this.#c=e}setLimits(e){
4
- // eslint-disable-next-line sonarjs/void-use -- @preserve: Wave 3 validator reads limits via RouterInternals; void suppresses TS6133 until then
5
- this.#l=e,this.#l}setValidatorGetter(e){this.#u=e}getHandlerCount(e){return e===`activate`?this.#t.size:this.#e.size}addCanActivate(e,t,n=!1){n?this.#o.add(e):this.#o.delete(e);let r=this.#t.has(e);this.#d(`activate`,e,t,this.#t,this.#r,`canActivate`,r)}addCanDeactivate(e,t,n=!1){n?this.#s.add(e):this.#s.delete(e);let r=this.#e.has(e);this.#d(`deactivate`,e,t,this.#e,this.#n,`canDeactivate`,r)}clearCanActivate(e){this.#t.delete(e),this.#r.delete(e),this.#o.delete(e)}clearCanDeactivate(e){this.#e.delete(e),this.#n.delete(e),this.#s.delete(e)}clearAll(){this.#t.clear(),this.#r.clear(),this.#e.clear(),this.#n.clear(),this.#o.clear(),this.#s.clear()}clearDefinitionGuards(){for(let e of this.#o)this.#t.delete(e),this.#r.delete(e);for(let e of this.#s)this.#e.delete(e),this.#n.delete(e);this.#o.clear(),this.#s.clear()}getFactories(){let e={},t={};for(let[t,n]of this.#e)e[t]=n;for(let[e,n]of this.#t)t[e]=n;return[e,t]}getFunctions(){return this.#i}canNavigateTo(e,t,n,r){for(let t of e)if(!this.#f(this.#n,t,n,r,`canNavigateTo`))return!1;for(let e of t)if(!this.#f(this.#r,e,n,r,`canNavigateTo`))return!1;return!0}#d(e,t,n,r,i,a,o){o?this.#u?.()?.lifecycle.warnOverwrite(t,e,a):this.#u?.()?.lifecycle.validateCountThresholds(r.size+1,a);let s=typeof n==`boolean`?mt(n):n;r.set(t,s),this.#a.add(t);try{let e=this.#c.compileFactory(s);if(typeof e!=`function`)throw TypeError(`[router.${a}] Factory must return a function, got ${typeof e}`);i.set(t,e)}catch(e){throw r.delete(t),e}finally{this.#a.delete(t)}}#f(e,t,n,r,i){let a=e.get(t);if(!a)return!0;try{let e=a(n,r);return typeof e==`boolean`?e:(this.#u?.()?.lifecycle.warnAsyncGuardSync(t,i),!1)}catch{return!1}}};function F(){return{decoders:Object.create(null),encoders:Object.create(null),defaultParams:Object.create(null),forwardMap:Object.create(null),forwardFnMap:Object.create(null)}}function gt(e,t){for(let n in e)if(e[n]!==t[n])return!1;return!0}function _t(e,t,n){for(let r in e)if(!(r in n)&&e[r]!==t[r])return!1;return!0}function I(e){let t={name:e.name,path:e.path};return e.children&&(t.children=e.children.map(e=>I(e))),t}function L(e,t,n=``){for(let r=0;r<e.length;r++){let i=e[r],a=n?`${n}.${i.name}`:i.name;if(a===t)return e.splice(r,1),!0;if(i.children&&t.startsWith(`${a}.`)&&L(i.children,t,a))return!0}return!1}function vt(e,t){for(let n of Object.keys(e))t(n)&&delete e[n]}function R(e,t,n=100){let r=new Set,i=[e],a=e;for(;t[a];){let e=t[a];if(r.has(e)){let t=i.indexOf(e),n=[...i.slice(t),e];throw Error(`Circular forwardTo: ${n.join(` → `)}`)}if(r.add(a),i.push(e),a=e,i.length>n)throw Error(`forwardTo chain exceeds maximum depth (${n}): ${i.join(` → `)}`)}return a}function yt(e,t,n){let r=et(``,t,e),i=nt(n);return i.registerTree(r),{tree:r,matcher:i}}function z(e){let t=yt(e.definitions,e.rootPath,e.matcherOptions);e.tree=t.tree,e.matcher=t.matcher}function bt(e){z(e),e.resolvedForwardMap=B(e.config)}function xt(e){St(e),z(e)}function St(e){e.definitions.length=0,Object.assign(e.config,F()),e.resolvedForwardMap=Object.create(null),e.routeCustomFields=Object.create(null)}function B(e){let t=Object.create(null);for(let n of Object.keys(e.forwardMap))t[n]=R(n,e.forwardMap);return t}function Ct(e,t,r){if(e.canActivate){let r=typeof e.forwardTo==`string`?e.forwardTo:`[dynamic]`;n.logger.warn(`real-router`,`Route "${t}" has both forwardTo and canActivate. canActivate will be ignored because forwardTo creates a redirect (industry standard). Move canActivate to the target route "${r}".`)}if(e.canDeactivate){let r=typeof e.forwardTo==`string`?e.forwardTo:`[dynamic]`;n.logger.warn(`real-router`,`Route "${t}" has both forwardTo and canDeactivate. canDeactivate will be ignored because forwardTo creates a redirect (industry standard). Move canDeactivate to the target route "${r}".`)}if(typeof e.forwardTo==`function`){let n=e.forwardTo.constructor.name===`AsyncFunction`,r=e.forwardTo.toString().includes(`__awaiter`);if(n||r)throw TypeError(`forwardTo callback cannot be async for route "${t}". Async functions break matchPath/buildPath.`)}typeof e.forwardTo==`string`?r.forwardMap[t]=e.forwardTo:r.forwardFnMap[t]=e.forwardTo}function wt(e,t,n,r,i,a,o){let s=new Set([`name`,`path`,`children`,`canActivate`,`canDeactivate`,`forwardTo`,`encodeParams`,`decodeParams`,`defaultParams`]),c=Object.fromEntries(Object.entries(e).filter(([e])=>!s.has(e)));Object.keys(c).length>0&&(r[t]=c),e.canActivate&&(o?o.addActivateGuard(t,e.canActivate):i.set(t,e.canActivate)),e.canDeactivate&&(o?o.addDeactivateGuard(t,e.canDeactivate):a.set(t,e.canDeactivate)),e.forwardTo&&Ct(e,t,n),e.decodeParams&&(n.decoders[t]=t=>e.decodeParams?.(t)??t),e.encodeParams&&(n.encoders[t]=t=>e.encodeParams?.(t)??t),e.defaultParams&&(n.defaultParams[t]=e.defaultParams)}function V(e,t,n,r,i,a,o=``){for(let s of e){let e=o?`${o}.${s.name}`:s.name;wt(s,e,t,n,r,i,a),s.children&&V(s.children,t,n,r,i,a,e)}}function Tt(e,t){let n=[],r=F(),i=Object.create(null),a=new Map,o=new Map;for(let t of e)n.push(I(t));let{tree:s,matcher:c}=yt(n,``,t);return V(e,r,i,a,o,void 0,``),{definitions:n,config:r,tree:s,matcher:c,resolvedForwardMap:B(r),routeCustomFields:i,rootPath:``,matcherOptions:t,depsStore:void 0,lifecycleNamespace:void 0,pendingCanActivate:a,pendingCanDeactivate:o,treeOperations:{commitTreeChanges:bt,resetStore:xt,nodeToDefinition:A}}}const H=[];Object.freeze(H);function Et(e){let t=e.length,n=[];for(let r=t-1;r>=0;r--)n.push(e[r]);return n}function Dt(e){let t=e.split(`.`),n=t.length,r=[t[0]],i=t[0].length;for(let a=1;a<n-1;a++)i+=1+t[a].length,r.push(e.slice(0,i));return r.push(e),r}function Ot(e){let t=typeof e;return t===`string`||t===`number`||t===`boolean`}function kt(e,t,n,r){let i=t[e];if(!i||typeof i!=`object`)return!0;for(let e of Object.keys(i)){let t=n.params[e],i=r.params[e];if(Ot(t)&&Ot(i)&&String(t)!==String(i))return!1}return!0}function At(e,t,n,r,i,a){for(let o=0;o<a;o++){let a=r[o];if(a!==i[o]||!kt(a,e,t,n))return o}return a}const jt=new Map;function U(e){let t=jt.get(e);if(t)return t;let n=Mt(e);return Object.freeze(n),jt.set(e,n),n}function Mt(e){if(!e)return[``];let t=e.indexOf(`.`);if(t===-1)return[e];let n=e.indexOf(`.`,t+1);if(n===-1)return[e.slice(0,t),e];let r=e.indexOf(`.`,n+1);return r===-1?[e.slice(0,t),e.slice(0,n),e]:e.indexOf(`.`,r+1)===-1?[e.slice(0,t),e.slice(0,n),e.slice(0,r),e]:Dt(e)}let W,G,K=null,Nt,Pt,q=null;function Ft(e,t){if(!t)return{intersection:``,toActivate:U(e.name),toDeactivate:H};let n=M(e),r=M(t);if(!n&&!r)return{intersection:``,toActivate:U(e.name),toDeactivate:Et(U(t.name))};let i=U(e.name),a=U(t.name),o=Math.min(a.length,i.length),s=At(n??r,e,t,i,a,o),c;if(s>=a.length)c=H;else if(s===0&&a.length===1)c=a;else{c=[];for(let e=a.length-1;e>=s;e--)c.push(a[e])}let l=s===0?i:i.slice(s);return{intersection:s>0?a[s-1]:``,toDeactivate:c,toActivate:l}}function J(e,t){if(K!==null&&e===W&&t===G)return K;if(q!==null&&e===Nt&&t===Pt)return q;let n=Ft(e,t);return Nt=W,Pt=G,q=K,W=e,G=t,K=n,n}function It(e){let t=[];for(let n of e)for(let e of n.paramMeta.urlParams)t.push(e);return t}function Lt(e){return e.at(-1)?.fullName??``}function Rt(e,t){return{name:t??Lt(e.segments),params:e.params,meta:e.meta}}var zt=class{#e;#t;get#n(){return this.#e.depsStore}constructor(e=[],t){this.#e=Tt(e,t)}static shouldUpdateNode(e){return(t,n)=>{if(!(t&&typeof t==`object`&&`name`in t))throw TypeError(`[router.shouldUpdateNode] toState must be valid State object`);if(t.transition?.reload||e===``&&!n)return!0;let{intersection:r,toActivate:i,toDeactivate:a}=J(t,n);return e===r||i.includes(e)?!0:a.includes(e)}}setDependencies(e){this.#e.depsStore=e;for(let[t,n]of this.#e.pendingCanActivate)e.addActivateGuard(t,n);this.#e.pendingCanActivate.clear();for(let[t,n]of this.#e.pendingCanDeactivate)e.addDeactivateGuard(t,n);this.#e.pendingCanDeactivate.clear()}setLifecycleNamespace(e){this.#e.lifecycleNamespace=e}setRootPath(e){this.#e.rootPath=e,z(this.#e)}hasRoute(e){return this.#e.matcher.hasRoute(e)}clearRoutes(){xt(this.#e)}buildPath(t,n,r){if(t===e.s.UNKNOWN_ROUTE)return typeof n?.path==`string`?n.path:``;let i=Object.hasOwn(this.#e.config.defaultParams,t)?{...this.#e.config.defaultParams[t],...n}:n??{},a=typeof this.#e.config.encoders[t]==`function`?this.#e.config.encoders[t]({...i}):i;return this.#e.matcher.buildPath(t,a,this.#i(r))}matchPath(e,t){let n=t,r=this.#e.matcher.match(e);if(!r)return;let{name:i,params:a,meta:o}=Rt(r),s=typeof this.#e.config.decoders[i]==`function`?this.#e.config.decoders[i](a):a,{name:c,params:l}=this.#n.forwardState(i,s),u=e;if(n.rewritePathOnMatch){let e=typeof this.#e.config.encoders[c]==`function`?this.#e.config.encoders[c]({...l}):l,t=n.trailingSlash;u=this.#e.matcher.buildPath(c,e,{trailingSlash:t===`never`||t===`always`?t:void 0,queryParamsMode:n.queryParamsMode})}return this.#n.makeState(c,l,u,o)}forwardState(e,t){if(Object.hasOwn(this.#e.config.forwardFnMap,e)){let n=this.#r(e,t),r=this.#e.config.forwardFnMap[e],i=this.#a(e,r,t);return{name:i,params:this.#r(i,n)}}let n=this.#e.resolvedForwardMap[e]??e;if(n!==e&&Object.hasOwn(this.#e.config.forwardFnMap,n)){let r=this.#r(e,t),i=this.#e.config.forwardFnMap[n],a=this.#a(n,i,t);return{name:a,params:this.#r(a,r)}}if(n!==e){let r=this.#r(e,t);return{name:n,params:this.#r(n,r)}}return{name:e,params:this.#r(e,t)}}buildStateResolved(e,t){let n=this.#e.matcher.getSegmentsByName(e);if(n)return Rt({segments:n,params:t,meta:this.#e.matcher.getMetaByName(e)},e)}isActiveRoute(e,t={},n=!1,r=!0){let i=this.#n.getState();if(!i)return!1;let a=i.name;if(a!==e&&!a.startsWith(`${e}.`)&&!e.startsWith(`${a}.`))return!1;let o=this.#e.config.defaultParams[e];if(n||a===e){let n={name:e,params:o?{...o,...t}:t,path:``};return this.#n.areStatesEqual(n,i,r)}let s=i.params;return gt(t,s)?!o||_t(o,s,t):!1}getMetaForState(e){return this.#e.matcher.hasRoute(e)?this.#e.matcher.getMetaByName(e):void 0}getUrlParams(e){let t=this.#e.matcher.getSegmentsByName(e);return t?It(t):[]}getStore(){return this.#e}#r(e,t){return Object.hasOwn(this.#e.config.defaultParams,e)?{...this.#e.config.defaultParams[e],...t}:t}#i(e){if(this.#t)return this.#t;let t=e?.trailingSlash;return this.#t=Object.freeze({trailingSlash:t===`never`||t===`always`?t:void 0,queryParamsMode:e?.queryParamsMode}),this.#t}#a(e,t,n){let r=new Set([e]),i=t(this.#n.getDependency,n),a=0;if(typeof i!=`string`)throw TypeError(`forwardTo callback must return a string, got ${typeof i}`);for(;a<100;){if(this.#e.matcher.getSegmentsByName(i)===void 0)throw Error(`Route "${i}" does not exist`);if(r.has(i)){let e=[...r,i].join(` → `);throw Error(`Circular forwardTo detected: ${e}`)}if(r.add(i),Object.hasOwn(this.#e.config.forwardFnMap,i)){let e=this.#e.config.forwardFnMap[i];i=e(this.#n.getDependency,n),a++;continue}let e=this.#e.config.forwardMap[i];if(e!==void 0){i=e,a++;continue}return i}throw Error(`forwardTo exceeds maximum depth of 100`)}};const Bt=new e.t(e.c.ROUTER_NOT_STARTED),Vt=new e.t(e.c.ROUTE_NOT_FOUND),Ht=new e.t(e.c.SAME_STATES),Ut=Promise.reject(Bt),Wt=Promise.reject(Vt),Gt=Promise.reject(Ht);Ut.catch(()=>{}),Wt.catch(()=>{}),Gt.catch(()=>{});function Kt(e,t,n,r,i){let a={phase:`activating`,reason:`success`,segments:{deactivated:n,activated:r,intersection:i}};return e?.name!==void 0&&(a.from=e.name),t.reload!==void 0&&(a.reload=t.reload),t.redirected!==void 0&&(a.redirected=t.redirected),a}function qt({signal:e,...t}){return t}function Jt(t,n){let{toState:r,fromState:i,opts:a,toDeactivate:o,toActivate:s,intersection:c}=n;if(r.name!==e.s.UNKNOWN_ROUTE&&!t.hasRoute(r.name)){let n=new e.t(e.c.ROUTE_NOT_FOUND,{routeName:r.name});throw t.sendTransitionFail(r,i,n),n}if(i)for(let e of o)!s.includes(e)&&n.canDeactivateFunctions.has(e)&&t.clearCanDeactivate(e);r.transition=Kt(i,a,o,s,c);let l=e.r(r);t.setState(l);let u=a.signal===void 0?a:qt(a);return t.sendTransitionDone(l,i,u),l}function Yt(t,n,r,i){let a=n;a.code===e.c.TRANSITION_CANCELLED||a.code===e.c.ROUTE_NOT_FOUND||t.sendTransitionFail(r,i,a)}function Y(t,n,r){if(t instanceof DOMException&&t.name===`AbortError`)throw new e.t(e.c.TRANSITION_CANCELLED);Xt(t,n,r)}function Xt(t,n,r){throw t instanceof e.t?(t.setCode(n),t):new e.t(n,Qt(t,r))}const Zt=new Set([`code`,`segment`,`path`,`redirect`]);function Qt(e,t){let n={segment:t};if(e instanceof Error)return{...n,message:e.message,stack:e.stack,...`cause`in e&&e.cause!==void 0&&{cause:e.cause}};if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))Zt.has(n)||(t[n]=r);return{...n,...t}}return n}async function $t(t,n,r){let i;try{i=await t}catch(e){Y(e,n,r);return}if(!i)throw new e.t(n,{segment:r})}async function en(t,n,r,i,a,o,s,c,l,u){await $t(l,r,u);for(let l=c;l<n.length;l++){if(!s())throw new e.t(e.c.TRANSITION_CANCELLED);let c=n[l],u=t.get(c);if(!u)continue;let d=!1;try{d=u(i,a,o)}catch(e){Y(e,r,c)}if(d instanceof Promise){await $t(d,r,c);continue}if(!d)throw new e.t(r,{segment:c})}}async function tn(t,n,r,i,a,o,s,c,l){if(await t,!c())throw new e.t(e.c.TRANSITION_CANCELLED);if(l(),i){let t=X(n,r,e.c.CANNOT_ACTIVATE,a,o,s,c);if(t!==void 0&&await t,!c())throw new e.t(e.c.TRANSITION_CANCELLED)}}function nn(t,n,r,i,a,o,s,c,l,u,d){if(a){let a=X(t,r,e.c.CANNOT_DEACTIVATE,s,c,l,u);if(a!==void 0)return tn(a,n,i,o,s,c,l,u,d)}if(!u())throw new e.t(e.c.TRANSITION_CANCELLED);if(d(),o)return X(n,i,e.c.CANNOT_ACTIVATE,s,c,l,u)}function X(t,n,r,i,a,o,s){for(let[c,l]of n.entries()){if(!s())throw new e.t(e.c.TRANSITION_CANCELLED);let u=t.get(l);if(!u)continue;let d=!1;try{d=u(i,a,o)}catch(e){Y(e,r,l)}if(d instanceof Promise)return en(t,n,r,i,a,o,s,c+1,d,l);if(!d)throw new e.t(r,{segment:l})}}const Z=[e.s.UNKNOWN_ROUTE];Object.freeze(Z);const rn={replace:!0};Object.freeze(rn);function an(t,n){return n?.name===e.s.UNKNOWN_ROUTE&&!t.replace?{...t,replace:!0}:t}function on(e,t,n){return!!e&&!t.reload&&!t.force&&e.path===n.path}var sn=class{lastSyncResolved=!1;lastSyncRejected=!1;#e;#t=null;#n=0;setDependencies(e){this.#e=e}navigate(t,n,r){this.lastSyncResolved=!1;let i=this.#e;if(!i.canNavigate())return this.lastSyncRejected=!0,Ut;let a,o,s=!1,c=null;try{if(a=i.buildNavigateState(t,n),!a)return i.emitTransitionError(void 0,i.getState(),Vt),this.lastSyncRejected=!0,Wt;if(o=i.getState(),r=an(r,o),on(o,r,a))return i.emitTransitionError(a,o,Ht),this.lastSyncRejected=!0,Gt;this.#o(r.signal);let l=++this.#n;if(i.startTransition(a,o),s=!0,this.#n!==l)throw new e.t(e.c.TRANSITION_CANCELLED);let[u,d]=i.getLifecycleFunctions(),f=a.name===e.s.UNKNOWN_ROUTE,{toDeactivate:p,toActivate:m,intersection:h}=J(a,o),ee=o&&!r.forceDeactivate&&p.length>0,te=!f&&m.length>0,g=u.size>0||d.size>0,ne=a,_=()=>{i.sendLeaveApprove(ne,o)},v=()=>this.#n===l&&i.isActive();if(!g&&(_(),this.#n!==l))throw new e.t(e.c.TRANSITION_CANCELLED);if(g){c=new AbortController,this.#t=c;let t=c.signal,n=nn(u,d,p,m,!!ee,te,a,o,t,v,_);if(n!==void 0)return this.#r(n,{toState:a,fromState:o,opts:r,toDeactivate:p,toActivate:m,intersection:h,canDeactivateFunctions:u},c,l);if(!v())throw new e.t(e.c.TRANSITION_CANCELLED);this.#a(c)}return this.lastSyncResolved=!0,Promise.resolve(Jt(i,{toState:a,fromState:o,opts:r,toDeactivate:p,toActivate:m,intersection:h,canDeactivateFunctions:u}))}catch(e){return this.#i(e,c,s,a,o),Promise.reject(e)}}navigateToDefault(t){let n=this.#e;if(!n.getOptions().defaultRoute)return Promise.reject(new e.t(e.c.ROUTE_NOT_FOUND,{routeName:`defaultRoute not configured`}));let{route:r,params:i}=n.resolveDefault();return r?this.navigate(r,i,t):Promise.reject(new e.t(e.c.ROUTE_NOT_FOUND,{routeName:`defaultRoute resolved to empty`}))}navigateToNotFound(t){this.#o();let n=this.#e.getState(),r=n?U(n.name).toReversed():[];Object.freeze(r);let i={deactivated:r,activated:Z,intersection:``};Object.freeze(i);let a={phase:`activating`,...n&&{from:n.name},reason:`success`,segments:i};Object.freeze(a);let o={name:e.s.UNKNOWN_ROUTE,params:{},path:t,transition:a};return Object.freeze(o),this.#e.setState(o),this.#e.emitTransitionSuccess(o,n,rn),o}abortCurrentNavigation(){this.#t?.abort(new e.t(e.c.TRANSITION_CANCELLED)),this.#t=null}async#r(t,n,r,i){let a=this.#e,o=()=>this.#n===i&&!r.signal.aborted&&a.isActive();try{if(n.opts.signal){if(n.opts.signal.aborted)throw new e.t(e.c.TRANSITION_CANCELLED,{reason:n.opts.signal.reason});n.opts.signal.addEventListener(`abort`,()=>{r.abort(n.opts.signal?.reason)},{once:!0,signal:r.signal})}if(await t,!o())throw new e.t(e.c.TRANSITION_CANCELLED);return Jt(a,n)}catch(e){throw Yt(a,e,n.toState,n.fromState),e}finally{this.#a(r)}}#i(e,t,n,r,i){t&&this.#a(t),n&&r&&Yt(this.#e,e,r,i)}#a(e){e.abort(),this.#t===e&&(this.#t=null)}#o(t){if(this.#e.isTransitioning()&&(n.logger.warn(`router.navigate`,`Concurrent navigation detected on shared router instance. For SSR, use cloneRouter() to create isolated instance per request.`),this.#t?.abort(new e.t(e.c.TRANSITION_CANCELLED)),this.#e.cancelNavigation()),t?.aborted)throw new e.t(e.c.TRANSITION_CANCELLED,{reason:t.reason})}};const cn={replace:!0};Object.freeze(cn);var ln=class{#e;setDependencies(e){this.#e=e}async start(t){let n=this.#e,r=n.getOptions(),i=n.matchPath(t);if(!i&&!r.allowNotFound){let r=new e.t(e.c.ROUTE_NOT_FOUND,{path:t});throw n.emitTransitionError(void 0,void 0,r),r}return n.completeStart(),i?n.navigate(i.name,i.params,cn):n.navigateToNotFound(t)}stop(){this.#e.clearState()}},Q=class{#e;#t;#n;#r;#i;#a;constructor(e){this.#e=e.routerFSM,this.#t=e.emitter,this.#n=void 0,this.#s()}static validateSubscribeListener(e){if(typeof e!=`function`)throw TypeError(`[router.subscribe] Expected a function. For Observable pattern use @real-router/rx package`)}static validateSubscribeLeaveListener(e){if(typeof e!=`function`)throw TypeError(`[router.subscribeLeave] Expected a function`)}emitRouterStart(){this.#t.emit(e.l.ROUTER_START)}emitRouterStop(){this.#t.emit(e.l.ROUTER_STOP)}emitTransitionStart(t,n){this.#t.emit(e.l.TRANSITION_START,t,n)}emitTransitionSuccess(t,n,r){this.#t.emit(e.l.TRANSITION_SUCCESS,t,n,r)}emitTransitionError(t,n,r){this.#t.emit(e.l.TRANSITION_ERROR,t,n,r)}emitTransitionCancel(t,n){this.#t.emit(e.l.TRANSITION_CANCEL,t,n)}emitTransitionLeaveApprove(t,n){this.#t.emit(e.l.TRANSITION_LEAVE_APPROVE,t,n)}sendStart(){this.#e.send(c.START)}sendStop(){this.#e.send(c.STOP)}sendDispose(){this.#e.send(c.DISPOSE)}sendStarted(){this.#e.send(c.STARTED)}sendNavigate(e,t){this.#n=e,this.#e.forceState(s.TRANSITION_STARTED),this.emitTransitionStart(e,t)}sendComplete(e,t,n={}){this.#e.forceState(s.READY),this.emitTransitionSuccess(e,t,n),this.#n===e&&(this.#n=void 0)}sendLeaveApprove(e,t){this.#e.forceState(s.LEAVE_APPROVED),this.emitTransitionLeaveApprove(e,t)}sendFail(e,t,n){let r=this.#n;this.#r=e,this.#i=t,this.#a=n,this.#e.send(c.FAIL),this.#n===r&&(this.#n=void 0)}sendFailSafe(e,t,n){this.isReady()?this.sendFail(e,t,n):this.emitTransitionError(e,t,n)}sendCancel(e,t){let n=this.#n;this.#r=e,this.#i=t,this.#e.send(c.CANCEL),this.#n===n&&(this.#n=void 0)}canBeginTransition(){return this.#e.canSend(c.NAVIGATE)}canStart(){return this.#e.canSend(c.START)}canCancel(){return this.#e.canSend(c.CANCEL)}isActive(){let e=this.#e.getState();return e!==s.IDLE&&e!==s.DISPOSED}isDisposed(){return this.#e.getState()===s.DISPOSED}isTransitioning(){let e=this.#e.getState();return e===s.TRANSITION_STARTED||e===s.LEAVE_APPROVED}isLeaveApproved(){return this.#e.getState()===s.LEAVE_APPROVED}isReady(){return this.#e.getState()===s.READY}getCurrentToState(){return this.#n}addEventListener(e,t){return this.#t.on(e,t)}subscribe(t){return this.#t.on(e.l.TRANSITION_SUCCESS,(e,n)=>{t({route:e,previousRoute:n})})}subscribeLeave(t){return this.#t.on(e.l.TRANSITION_LEAVE_APPROVE,(e,n)=>{n!==void 0&&t({route:n,nextRoute:e})})}clearAll(){this.#t.clearAll()}setLimits(e){this.#t.setLimits(e)}sendCancelIfPossible(e){let t=this.#n;!this.canCancel()||t===void 0||this.sendCancel(t,e)}#o(){this.emitTransitionError(this.#r,this.#i,this.#a)}#s(){let e=this.#e;e.on(s.STARTING,c.STARTED,()=>{this.emitRouterStart()}),e.on(s.READY,c.STOP,()=>{this.emitRouterStop()});let t=()=>{let e=this.#r;e!==void 0&&this.emitTransitionCancel(e,this.#i)};e.on(s.TRANSITION_STARTED,c.CANCEL,t),e.on(s.LEAVE_APPROVED,c.CANCEL,t),e.on(s.LEAVE_APPROVED,c.FAIL,()=>{this.#o()}),e.on(s.STARTING,c.FAIL,()=>{this.#o()}),e.on(s.READY,c.FAIL,()=>{this.#o()}),e.on(s.TRANSITION_STARTED,c.FAIL,()=>{this.#o()})}};const un=new e.t(e.c.ROUTER_ALREADY_STARTED),dn=new Set([`all`,`warn-error`,`error-only`]);function fn(e){return typeof e==`string`&&dn.has(e)}function pn(e){return typeof e==`string`?`"${e}"`:typeof e==`object`?JSON.stringify(e):String(e)}function mn(e){if(typeof e!=`object`||!e)throw TypeError(`Logger config must be an object`);let t=e;for(let e of Object.keys(t))if(e!==`level`&&e!==`callback`)throw TypeError(`Unknown logger config property: "${e}"`);if(`level`in t&&t.level!==void 0&&!fn(t.level))throw TypeError(`Invalid logger level: ${pn(t.level)}. Expected: "all" | "warn-error" | "error-only"`);if(`callback`in t&&t.callback!==void 0&&typeof t.callback!=`function`)throw TypeError(`Logger callback must be a function, got ${typeof t.callback}`);return!0}var hn=class{router;options;limits;dependenciesStore;state;routes;routeLifecycle;plugins;navigation;lifecycle;eventBus;constructor(e){this.router=e.router,this.options=e.options,this.limits=e.limits,this.dependenciesStore=e.dependenciesStore,this.state=e.state,this.routes=e.routes,this.routeLifecycle=e.routeLifecycle,this.plugins=e.plugins,this.navigation=e.navigation,this.lifecycle=e.lifecycle,this.eventBus=e.eventBus}wireLimits(){this.dependenciesStore.limits=this.limits,this.plugins.setLimits(this.limits),this.eventBus.setLimits({maxListeners:this.limits.maxListeners,warnListeners:this.limits.warnListeners,maxEventDepth:this.limits.maxEventDepth}),this.routeLifecycle.setLimits(this.limits)}wireRouteLifecycleDeps(){let e={compileFactory:this.createCompileFactory()};this.routeLifecycle.setDependencies(e),this.routeLifecycle.setValidatorGetter(()=>{try{return t.r(this.router).validator}catch{return null}})}wireRoutesDeps(){this.routes.setDependencies({addActivateGuard:(e,t)=>{this.routeLifecycle.addCanActivate(e,t,!0)},addDeactivateGuard:(e,t)=>{this.routeLifecycle.addCanDeactivate(e,t,!0)},makeState:(e,t,n,r)=>this.state.makeState(e,t,n,r),getState:()=>this.state.get(),areStatesEqual:(e,t,n)=>this.state.areStatesEqual(e,t,n),getDependency:e=>this.dependenciesStore.dependencies[e],forwardState:(e,n)=>{let r=t.r(this.router);return r.validator?.routes.validateStateBuilderArgs(e,n,`forwardState`),r.forwardState(e,n)}}),this.routes.setLifecycleNamespace(this.routeLifecycle)}wirePluginsDeps(){let e={addEventListener:(e,t)=>this.eventBus.addEventListener(e,t),canNavigate:()=>this.eventBus.canBeginTransition(),compileFactory:this.createCompileFactory()};this.plugins.setDependencies(e),this.plugins.setValidatorGetter(()=>{try{return t.r(this.router).validator}catch{return null}})}wireNavigationDeps(){this.navigation.setDependencies({getOptions:()=>this.options.get(),hasRoute:e=>this.routes.hasRoute(e),getState:()=>this.state.get(),setState:e=>{this.state.set(e)},buildNavigateState:(e,n)=>{let r=t.r(this.router);r.validator?.routes.validateStateBuilderArgs(e,n,`navigate`);let{name:i,params:a}=r.forwardState(e,n),o=this.routes.getMetaForState(i);if(o===void 0)return;let s=r.buildPath(i,a);return this.state.makeState(i,a,s,o,!0)},resolveDefault:()=>{let e=this.options.get();return{route:at(e.defaultRoute,e=>this.dependenciesStore.dependencies[e]),params:at(e.defaultParams,e=>this.dependenciesStore.dependencies[e])}},startTransition:(e,t)=>{this.eventBus.sendNavigate(e,t)},cancelNavigation:()=>{let e=this.eventBus.getCurrentToState();e!==void 0&&this.eventBus.sendCancel(e,this.state.get())},sendTransitionDone:(e,t,n)=>{this.eventBus.sendComplete(e,t,n)},sendTransitionFail:(e,t,n)=>{this.eventBus.sendFail(e,t,n)},emitTransitionError:(e,t,n)=>{this.eventBus.sendFailSafe(e,t,n)},emitTransitionSuccess:(e,t,n)=>{this.eventBus.emitTransitionSuccess(e,t,n)},sendLeaveApprove:(e,t)=>{this.eventBus.sendLeaveApprove(e,t)},canNavigate:()=>this.eventBus.canBeginTransition(),getLifecycleFunctions:()=>this.routeLifecycle.getFunctions(),isActive:()=>this.router.isActive(),isTransitioning:()=>this.eventBus.isTransitioning(),clearCanDeactivate:e=>{this.routeLifecycle.clearCanDeactivate(e)}})}wireLifecycleDeps(){this.lifecycle.setDependencies({getOptions:()=>this.options.get(),navigate:(e,t,n)=>this.navigation.navigate(e,t,n),navigateToNotFound:e=>this.navigation.navigateToNotFound(e),clearState:()=>{this.state.set(void 0)},matchPath:e=>this.routes.matchPath(e,this.options.get()),completeStart:()=>{this.eventBus.sendStarted()},emitTransitionError:(e,t,n)=>{this.eventBus.sendFail(e,t,n)}})}wireStateDeps(){this.state.setDependencies({getDefaultParams:()=>this.routes.getStore().config.defaultParams,buildPath:(e,n)=>t.r(this.router).buildPath(e,n),getUrlParams:e=>this.routes.getUrlParams(e)})}createCompileFactory(){let{router:e,dependenciesStore:t}=this;return n=>n(e,e=>t.dependencies[e])}};function gn(e){e.wireLimits(),e.wireRouteLifecycleDeps(),e.wireRoutesDeps(),e.wirePluginsDeps(),e.wireNavigationDeps(),e.wireLifecycleDeps(),e.wireStateDeps()}const _n=Object.freeze({});var vn=class r{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;constructor(r=[],i={},a={}){i.logger&&mn(i.logger)&&(n.logger.configure(i.logger),delete i.logger),st.validateOptionsIsObject(i),d(a),r.length>0&&f(r),this.#e=new st(i),this.#t=e.n(i.limits),this.#n=p(a),this.#r=new ut,this.#i=new zt(r,yn(this.#e.get())),this.#a=new ht,this.#o=new pt,this.#s=new sn,this.#c=new ln,this.#l=new Q({routerFSM:u(),emitter:new o({onListenerError:(e,t)=>{n.logger.error(`Router`,`Error in listener for ${e}:`,t)},onListenerWarn:(e,t)=>{n.logger.warn(`router.addEventListener`,`Event "${e}" has ${t} listeners — possible memory leak`)}})}),gn(new hn({router:this,options:this.#e,limits:this.#t,dependenciesStore:this.#n,state:this.#r,routes:this.#i,routeLifecycle:this.#a,plugins:this.#o,navigation:this.#s,lifecycle:this.#c,eventBus:this.#l}));let s=new Map;t.i(this,{makeState:(e,t,n,r)=>this.#r.makeState(e,t,n,r),forwardState:t.n(`forwardState`,(e,t)=>this.#i.forwardState(e,t),s),buildStateResolved:(e,t)=>this.#i.buildStateResolved(e,t),matchPath:(e,t)=>this.#i.matchPath(e,t),getOptions:()=>this.#e.get(),addEventListener:(e,t)=>this.#l.addEventListener(e,t),buildPath:t.n(`buildPath`,(t,n)=>this.#i.buildPath(t,n??e.a,this.#e.get()),s),start:t.t(`start`,e=>this.#c.start(e),s),interceptors:s,setRootPath:e=>{this.#i.setRootPath(e)},getRootPath:()=>this.#i.getStore().rootPath,getTree:()=>this.#i.getStore().tree,isDisposed:()=>this.#l.isDisposed(),validator:null,dependenciesGetStore:()=>this.#n,cloneOptions:()=>({...this.#e.get()}),cloneDependencies:()=>({...this.#n.dependencies}),getLifecycleFactories:()=>this.#a.getFactories(),getPluginFactories:()=>this.#o.getAll(),routeGetStore:()=>this.#i.getStore(),getStateName:()=>this.#r.get()?.name,isTransitioning:()=>this.#l.isTransitioning(),clearState:()=>{this.#r.set(void 0)},setState:e=>{this.#r.set(e)},routerExtensions:[]}),this.isActiveRoute=this.isActiveRoute.bind(this),this.buildPath=this.buildPath.bind(this),this.getState=this.getState.bind(this),this.getPreviousState=this.getPreviousState.bind(this),this.areStatesEqual=this.areStatesEqual.bind(this),this.shouldUpdateNode=this.shouldUpdateNode.bind(this),this.isActive=this.isActive.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.dispose=this.dispose.bind(this),this.canNavigateTo=this.canNavigateTo.bind(this),this.usePlugin=this.usePlugin.bind(this),this.navigate=this.navigate.bind(this),this.navigateToDefault=this.navigateToDefault.bind(this),this.navigateToNotFound=this.navigateToNotFound.bind(this),this.subscribe=this.subscribe.bind(this),this.subscribeLeave=this.subscribeLeave.bind(this),this.isLeaveApproved=this.isLeaveApproved.bind(this)}isActiveRoute(e,r,i,a){return t.r(this).validator?.routes.validateIsActiveRouteArgs(e,r,i,a),t.r(this).validator?.routes.validateRouteName(e,`isActiveRoute`),e===``?(n.logger.warn(`real-router`,`isActiveRoute("") called with empty string. Root node is not considered a parent of any route.`),!1):this.#i.isActiveRoute(e,r,i,a)}buildPath(e,n){let r=t.r(this);return r.validator?.routes.validateBuildPathArgs(e),r.validator?.navigation.validateParams(n,`buildPath`),r.buildPath(e,n)}getState(){return this.#r.get()}getPreviousState(){return this.#r.getPrevious()}areStatesEqual(e,n,r=!0){return t.r(this).validator?.state.validateAreStatesEqualArgs(e,n,r),this.#r.areStatesEqual(e,n,r)}shouldUpdateNode(e){return t.r(this).validator?.routes.validateShouldUpdateNodeArgs(e),zt.shouldUpdateNode(e)}isActive(){return this.#l.isActive()}start(e){if(!this.#l.canStart())return Promise.reject(un);t.r(this).validator?.navigation.validateStartArgs(e),this.#l.sendStart();let n=t.r(this).start(e).catch(e=>{throw this.#l.isReady()&&(this.#c.stop(),this.#l.sendStop()),e});return r.#d(n),n}stop(){return this.#s.abortCurrentNavigation(),this.#l.sendCancelIfPossible(this.#r.get()),!this.#l.isReady()&&!this.#l.isTransitioning()?this:(this.#c.stop(),this.#l.sendStop(),this)}dispose(){if(this.#l.isDisposed())return;this.#s.abortCurrentNavigation(),this.#l.sendCancelIfPossible(this.#r.get()),(this.#l.isReady()||this.#l.isTransitioning())&&(this.#c.stop(),this.#l.sendStop()),this.#l.sendDispose(),this.#l.clearAll(),this.#o.disposeAll();let e=t.r(this);for(let t of e.routerExtensions)for(let e of t.keys)delete this[e];e.routerExtensions.length=0,this.#i.clearRoutes(),this.#a.clearAll(),this.#r.reset(),this.#n.dependencies=Object.create(null),this.#f()}canNavigateTo(e,n){let r=t.r(this);if(r.validator?.routes.validateRouteName(e,`canNavigateTo`),r.validator?.navigation.validateParams(n,`canNavigateTo`),!this.#i.hasRoute(e))return!1;let{name:i,params:a}=r.forwardState(e,n??{}),o=this.#r.makeState(i,a),s=this.#r.get(),{toDeactivate:c,toActivate:l}=J(o,s);return this.#a.canNavigateTo(c,l,o,s)}usePlugin(...e){let n=e.filter(Boolean);if(n.length===0)return()=>{};let r=t.r(this);r.validator?.plugins.validatePluginLimit(this.#o.count(),this.#t);for(let e of n)r.validator?.plugins.validateNoDuplicatePlugins(e,this.#o.getAll());return this.#o.use(...n)}subscribe(e){return Q.validateSubscribeListener(e),this.#l.subscribe(e)}subscribeLeave(e){return Q.validateSubscribeLeaveListener(e),this.#l.subscribeLeave(e)}isLeaveApproved(){return this.#l.isLeaveApproved()}navigate(n,i,a){let o=t.r(this);o.validator?.navigation.validateNavigateArgs(n),o.validator?.navigation.validateParams(i,`navigate`);let s=a??_n;o.validator?.navigation.validateNavigationOptions(s,`navigate`);let c=this.#s.navigate(n,i??e.a,s);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:r.#d(c),c}navigateToDefault(e){let n=t.r(this);n.validator?.navigation.validateNavigateToDefaultArgs(e);let i=e??_n;n.validator?.navigation.validateNavigationOptions(i,`navigateToDefault`);let a=this.#s.navigateToDefault(i);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:r.#d(a),a}navigateToNotFound(t){if(!this.#l.isActive())throw new e.t(e.c.ROUTER_NOT_STARTED);if(t!==void 0&&typeof t!=`string`)throw TypeError(`[router.navigateToNotFound] path must be a string, got ${typeof t}`);let n=t??this.#r.get().path;return this.#s.navigateToNotFound(n)}static#u=t=>{t instanceof e.t&&(t.code===e.c.SAME_STATES||t.code===e.c.TRANSITION_CANCELLED||t.code===e.c.ROUTER_NOT_STARTED||t.code===e.c.ROUTE_NOT_FOUND)||n.logger.error(`router.navigate`,`Unexpected navigation error`,t)};static#d(e){e.catch(r.#u)}#f(){this.navigate=$,this.navigateToDefault=$,this.navigateToNotFound=$,this.start=$,this.stop=$,this.usePlugin=$,this.subscribe=$,this.subscribeLeave=$,this.canNavigateTo=$}};function $(){throw new e.t(e.c.ROUTER_DISPOSED)}function yn(e){return{strictTrailingSlash:e.trailingSlash===`strict`,strictQueryParams:e.queryParamsMode===`strict`,urlParamsEncoding:e.urlParamsEncoding,queryParams:e.queryParams}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return tt}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return St}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return vt}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return vn}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return f}});
6
- //# sourceMappingURL=Router-CF-hVxvn.js.map