@real-router/core 0.54.3 → 0.54.5
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/cjs/Router-BzV5P1lA.js +6 -0
- package/dist/cjs/Router-BzV5P1lA.js.map +1 -0
- package/dist/cjs/api.d.ts +63 -0
- package/dist/cjs/api.d.ts.map +1 -1
- package/dist/cjs/api.js +1 -1
- package/dist/cjs/{cloneRouter-CR7rdWPl.js → cloneRouter-D5bMudso.js} +2 -2
- package/dist/cjs/cloneRouter-D5bMudso.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/utils.js +1 -1
- package/dist/cjs/validation.d.ts +55 -14
- package/dist/cjs/validation.d.ts.map +1 -1
- package/dist/esm/Router-_BDnheMY.mjs +6 -0
- package/dist/esm/Router-_BDnheMY.mjs.map +1 -0
- package/dist/esm/api.d.mts +63 -0
- package/dist/esm/api.d.mts.map +1 -1
- package/dist/esm/api.mjs +1 -1
- package/dist/esm/{cloneRouter-BBjARLMk.mjs → cloneRouter-DM59kihh.mjs} +2 -2
- package/dist/esm/cloneRouter-DM59kihh.mjs.map +1 -0
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/utils.mjs +1 -1
- package/dist/esm/validation.d.mts +55 -14
- package/dist/esm/validation.d.mts.map +1 -1
- package/package.json +3 -3
- package/src/api/cloneRouter.ts +89 -7
- package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +39 -10
- package/src/namespaces/NavigationNamespace/transition/guardPhase.ts +3 -0
- package/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts +264 -83
- package/dist/cjs/Router-fHKWlCpv.js +0 -6
- package/dist/cjs/Router-fHKWlCpv.js.map +0 -1
- package/dist/cjs/cloneRouter-CR7rdWPl.js.map +0 -1
- package/dist/esm/Router-Baa4TIPc.mjs +0 -6
- package/dist/esm/Router-Baa4TIPc.mjs.map +0 -1
- package/dist/esm/cloneRouter-BBjARLMk.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Router-BzV5P1lA.js","names":["e","t","n","#n","#r","#i","#c","#e","#a","#s","#t","#o","FSM","e","t","n","r","i","o","s","c","l","u","d","f","p","m","h","g","_","v","y","b","x","S","w","T","E","D","#e","#u","#d","#c","#t","#n","#r","#i","#a","#g","#o","#y","#v","#b","#w","#C","#f","#p","#m","#h","#s","#_","#l","#x","#S","a","o","s","c","l","u","d","f","p","m","h","g","_","y","b","x","t","e","i","r","DEFAULT_QUERY_PARAMS","#options","#urlParamsCache","#frozenState","#previousState","#deps","#getUrlParams","PLUGINS_CONST","EVENTS_CONST","#plugins","#unsubscribes","#deps","#limits","#getValidator","#startPlugin","#deduplicateBatch","#definitionActivateFactories","#externalActivateFactories","#definitionDeactivateFactories","#externalDeactivateFactories","#canDeactivateFunctions","#canActivateFunctions","#functionsTuple","#registering","#deps","#limits","#getValidator","#registerHandler","#recompileSlot","#checkGuardSync","#getFactoryMaps","createRouteTree","createMatcher","#store","#deps","#getBuildPathOptions","#mergeDefaultParams","#resolveDynamicForward","#cachedBuildPathOpts","#deps","#executeNavigation","#abortPreviousNavigation","#currentController","#navigationId","#handleNoGuardsLeave","#finishAsyncNavigation","#cleanupController","#handleNavigateError","#deps","#fsm","#emitter","#leaveListeners","#currentToState","#setupFSMActions","#pendingToState","#pendingFromState","#pendingError","#emitPendingError","getInternals","#options","#limits","#dependenciesStore","#state","#routes","#routeLifecycle","#plugins","#navigation","#lifecycle","#eventBus","EventEmitter","createInterceptable2","createInterceptable","#suppressUnhandledRejection","getInternals","#markDisposed","#onSuppressedError"],"sources":["../../../event-emitter/dist/esm/index.mjs","../../src/constants.ts","../../src/fsm/routerFSM.ts","../../src/guards.ts","../../src/helpers.ts","../../src/namespaces/DependenciesNamespace/dependenciesStore.ts","../../../path-matcher/dist/esm/index.mjs","../../../search-params/dist/esm/index.mjs","../../../route-tree/dist/esm/index.mjs","../../src/namespaces/OptionsNamespace/constants.ts","../../src/namespaces/OptionsNamespace/helpers.ts","../../src/namespaces/OptionsNamespace/validators.ts","../../src/namespaces/OptionsNamespace/OptionsNamespace.ts","../../src/namespaces/StateNamespace/helpers.ts","../../src/stateMetaStore.ts","../../src/namespaces/StateNamespace/StateNamespace.ts","../../src/namespaces/PluginsNamespace/constants.ts","../../src/namespaces/PluginsNamespace/validators.ts","../../src/namespaces/PluginsNamespace/PluginsNamespace.ts","../../src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts","../../src/namespaces/RoutesNamespace/helpers.ts","../../src/namespaces/RoutesNamespace/forwardChain.ts","../../src/namespaces/RoutesNamespace/routesStore.ts","../../src/transitionPath.ts","../../src/namespaces/RoutesNamespace/RoutesNamespace.ts","../../src/RouterError.ts","../../src/namespaces/NavigationNamespace/constants.ts","../../src/namespaces/NavigationNamespace/transition/completeTransition.ts","../../src/namespaces/NavigationNamespace/transition/errorHandling.ts","../../src/namespaces/NavigationNamespace/transition/guardPhase.ts","../../src/namespaces/NavigationNamespace/NavigationNamespace.ts","../../src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts","../../src/namespaces/EventBusNamespace/EventBusNamespace.ts","../../src/namespaces/RouterLifecycleNamespace/constants.ts","../../src/typeGuards.ts","../../src/wiring/RouterWiringBuilder.ts","../../src/wiring/wireRouter.ts","../../src/Router.ts"],"sourcesContent":["const e={maxListeners:0,warnListeners:0,maxEventDepth:0};var t=class extends Error{},n=class{#e=new Map;#t=null;#n=e;#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,n,r,i,a,o,s){this.#t??=new Map;let c=this.#t,l=c.get(n)??0;if(l>=this.#n.maxEventDepth)throw new t(`Maximum recursion depth (${this.#n.maxEventDepth}) exceeded for event: ${n}`);try{c.set(n,l+1);let u=[...e];for(let e of u)try{this.#o(e,r,i,a,o,s)}catch(e){if(e instanceof t)throw e;this.#r?.(n,e)}}finally{c.set(n,c.get(n)-1)}}#c(e){let t=this.#e.get(e);if(t)return t;let n=new Set;return this.#e.set(e,n),n}};export{n as EventEmitter};\n//# sourceMappingURL=index.mjs.map","// packages/core/src/constants.ts\n\nimport type {\n EventToNameMap,\n EventToPluginMap,\n ErrorCodeToValueMap,\n ErrorCodeKeys,\n ErrorCodeValues,\n TransitionMeta,\n} from \"@real-router/types\";\n\nexport type ConstantsKeys = \"UNKNOWN_ROUTE\";\n\nexport type Constants = Record<ConstantsKeys, string>;\n\n// =============================================================================\n// Error Codes (migrated from router-error)\n// =============================================================================\n\nexport type ErrorCodes = Record<ErrorCodeKeys, ErrorCodeValues>;\n\n/**\n * Error codes for router operations.\n * Used to identify specific failure scenarios in navigation and lifecycle.\n * Frozen to prevent accidental modifications.\n */\nexport const errorCodes: ErrorCodeToValueMap = Object.freeze({\n ROUTER_NOT_STARTED: \"NOT_STARTED\", // navigate() called before start()\n NO_START_PATH_OR_STATE: \"NO_START_PATH_OR_STATE\", // start() without initial route\n ROUTER_ALREADY_STARTED: \"ALREADY_STARTED\", // start() called twice\n ROUTE_NOT_FOUND: \"ROUTE_NOT_FOUND\", // Navigation to non-existent route\n SAME_STATES: \"SAME_STATES\", // Navigate to current route without reload\n CANNOT_DEACTIVATE: \"CANNOT_DEACTIVATE\", // canDeactivate guard blocked navigation\n CANNOT_ACTIVATE: \"CANNOT_ACTIVATE\", // canActivate guard blocked navigation\n TRANSITION_ERR: \"TRANSITION_ERR\", // Generic transition failure\n TRANSITION_CANCELLED: \"CANCELLED\", // Navigation cancelled by user or new navigation\n ROUTER_DISPOSED: \"DISPOSED\", // Router has been disposed\n PLUGIN_CONFLICT: \"PLUGIN_CONFLICT\", // Plugin tried to extend router with already-existing property\n CONTEXT_NAMESPACE_ALREADY_CLAIMED: \"CONTEXT_NAMESPACE_ALREADY_CLAIMED\", // Plugin tried to claim a context namespace already owned by another plugin\n});\n\n/**\n * General router constants.\n * Special route names and identifiers.\n */\nexport const UNKNOWN_ROUTE = \"@@router/UNKNOWN_ROUTE\";\n\nexport const constants: Constants = {\n UNKNOWN_ROUTE,\n};\n\n/**\n * Plugin method names.\n * Maps to methods that plugins can implement to hook into router lifecycle.\n */\nexport const plugins: EventToPluginMap = {\n ROUTER_START: \"onStart\", // Plugin method called when router starts\n ROUTER_STOP: \"onStop\", // Plugin method called when router stops\n TRANSITION_START: \"onTransitionStart\", // Plugin method called when navigation begins\n TRANSITION_LEAVE_APPROVE: \"onTransitionLeaveApprove\", // Plugin method called when deactivation guards pass\n TRANSITION_CANCEL: \"onTransitionCancel\", // Plugin method called when navigation cancelled\n TRANSITION_SUCCESS: \"onTransitionSuccess\", // Plugin method called when navigation succeeds\n TRANSITION_ERROR: \"onTransitionError\", // Plugin method called when navigation fails\n};\n\n/**\n * Event names for router event system.\n * Used with addEventListener/removeEventListener for reactive subscriptions.\n */\nexport const events: EventToNameMap = {\n ROUTER_START: \"$start\", // Emitted when router.start() succeeds\n ROUTER_STOP: \"$stop\", // Emitted when router.stop() is called\n TRANSITION_START: \"$$start\", // Emitted when navigation begins\n TRANSITION_LEAVE_APPROVE: \"$$leaveApprove\", // Emitted when deactivation guards pass\n TRANSITION_CANCEL: \"$$cancel\", // Emitted when navigation is cancelled\n TRANSITION_SUCCESS: \"$$success\", // Emitted when navigation completes successfully\n TRANSITION_ERROR: \"$$error\", // Emitted when navigation fails\n};\n\nexport const DEFAULT_LIMITS = {\n maxDependencies: 100,\n maxPlugins: 50,\n maxListeners: 10_000,\n warnListeners: 1000,\n maxEventDepth: 5,\n maxLifecycleHandlers: 200,\n} as const;\n\nexport const EMPTY_PARAMS: Readonly<Record<string, never>> = Object.freeze({});\n\nconst FROZEN_EMPTY_SEGMENTS = Object.freeze({\n deactivated: Object.freeze([]) as unknown as string[],\n activated: Object.freeze([]) as unknown as string[],\n intersection: \"\",\n});\n\nexport const DEFAULT_TRANSITION = Object.freeze({\n phase: \"activating\",\n reason: \"success\",\n segments: FROZEN_EMPTY_SEGMENTS,\n}) as TransitionMeta;\n","// packages/core/src/fsm/routerFSM.ts\n\nimport { FSM } from \"@real-router/fsm\";\n\nimport type { FSMConfig } from \"@real-router/fsm\";\n\n/**\n * Router FSM states.\n *\n * - IDLE: Router not started or stopped\n * - STARTING: Router is initializing\n * - READY: Router is ready for navigation\n * - TRANSITION_STARTED: Navigation in progress (before deactivation guards)\n * - LEAVE_APPROVED: Deactivation guards passed, activation guards pending\n * - DISPOSED: Router has been disposed (R2+)\n */\nexport const routerStates = {\n IDLE: \"IDLE\",\n STARTING: \"STARTING\",\n READY: \"READY\",\n TRANSITION_STARTED: \"TRANSITION_STARTED\",\n LEAVE_APPROVED: \"LEAVE_APPROVED\",\n DISPOSED: \"DISPOSED\",\n} as const;\n\nexport type RouterState = (typeof routerStates)[keyof typeof routerStates];\n\n/**\n * Router FSM events.\n *\n * - START: Begin router initialization\n * - STARTED: Router initialization complete\n * - NAVIGATE: Begin navigation\n * - COMPLETE: Navigation completed successfully\n * - FAIL: Navigation or initialization failed\n * - CANCEL: Navigation cancelled\n * - STOP: Stop router\n * - DISPOSE: Dispose router (R2+)\n */\nexport const routerEvents = {\n START: \"START\",\n STARTED: \"STARTED\",\n NAVIGATE: \"NAVIGATE\",\n LEAVE_APPROVE: \"LEAVE_APPROVE\",\n COMPLETE: \"COMPLETE\",\n FAIL: \"FAIL\",\n CANCEL: \"CANCEL\",\n STOP: \"STOP\",\n DISPOSE: \"DISPOSE\",\n} as const;\n\nexport type RouterEvent = (typeof routerEvents)[keyof typeof routerEvents];\n\n/**\n * Typed payloads for router FSM events.\n *\n * Events without entries have no payload.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- payloads stored in EventBusNamespace fields (N8+N9 optimization)\nexport interface RouterPayloads {}\n\n/**\n * Router FSM configuration.\n *\n * Transitions:\n * - IDLE → STARTING (START), DISPOSED (DISPOSE)\n * - STARTING → READY (STARTED), IDLE (FAIL), DISPOSED (DISPOSE)\n * - READY → TRANSITION_STARTED (NAVIGATE), READY (FAIL, self-loop for early validation errors), IDLE (STOP), DISPOSED (DISPOSE)\n * - TRANSITION_STARTED → LEAVE_APPROVED (LEAVE_APPROVE), TRANSITION_STARTED (NAVIGATE, self-loop), READY (CANCEL, FAIL), DISPOSED (DISPOSE)\n * - LEAVE_APPROVED → READY (COMPLETE, CANCEL, FAIL), TRANSITION_STARTED (NAVIGATE), DISPOSED (DISPOSE)\n * - DISPOSED → (no transitions)\n *\n * DISPOSE is wired from every non-DISPOSED state so `router.dispose()` always\n * settles the FSM at DISPOSED. The facade orchestrates cleanup through IDLE\n * for healthy flows; the direct transitions guarantee the FSM is not left\n * stuck if cleanup is skipped (e.g. dispose mid-STARTING when the start\n * pipeline threw before STARTED/FAIL).\n */\nconst routerFSMConfig: FSMConfig<RouterState, RouterEvent, null> = {\n initial: routerStates.IDLE,\n context: null,\n transitions: {\n [routerStates.IDLE]: {\n [routerEvents.START]: routerStates.STARTING,\n [routerEvents.DISPOSE]: routerStates.DISPOSED,\n },\n [routerStates.STARTING]: {\n [routerEvents.STARTED]: routerStates.READY,\n [routerEvents.FAIL]: routerStates.IDLE,\n [routerEvents.DISPOSE]: routerStates.DISPOSED,\n },\n [routerStates.READY]: {\n [routerEvents.NAVIGATE]: routerStates.TRANSITION_STARTED,\n [routerEvents.FAIL]: routerStates.READY,\n [routerEvents.STOP]: routerStates.IDLE,\n [routerEvents.DISPOSE]: routerStates.DISPOSED,\n },\n [routerStates.TRANSITION_STARTED]: {\n [routerEvents.NAVIGATE]: routerStates.TRANSITION_STARTED,\n [routerEvents.LEAVE_APPROVE]: routerStates.LEAVE_APPROVED,\n [routerEvents.CANCEL]: routerStates.READY,\n [routerEvents.FAIL]: routerStates.READY,\n [routerEvents.DISPOSE]: routerStates.DISPOSED,\n },\n [routerStates.LEAVE_APPROVED]: {\n [routerEvents.NAVIGATE]: routerStates.TRANSITION_STARTED,\n [routerEvents.COMPLETE]: routerStates.READY,\n [routerEvents.CANCEL]: routerStates.READY,\n [routerEvents.FAIL]: routerStates.READY,\n [routerEvents.DISPOSE]: routerStates.DISPOSED,\n },\n [routerStates.DISPOSED]: {},\n },\n};\n\n/**\n * Factory function to create a router FSM instance.\n *\n * @returns FSM instance with initial state \"IDLE\"\n */\nexport function createRouterFSM(): FSM<\n RouterState,\n RouterEvent,\n null,\n RouterPayloads\n> {\n return new FSM<RouterState, RouterEvent, null, RouterPayloads>(\n routerFSMConfig,\n );\n}\n","// packages/core/src/guards.ts\n\nimport type { Route } from \"./types\";\nimport type { RouterValidator } from \"./types/RouterValidator\";\n\nexport function guardDependencies(deps: unknown): void {\n if (\n !deps ||\n typeof deps !== \"object\" ||\n (deps as { constructor: unknown }).constructor !== Object\n ) {\n throw new TypeError(\"dependencies must be a plain object\");\n }\n for (const key in deps as Record<string, unknown>) {\n if (Object.getOwnPropertyDescriptor(deps, key)?.get) {\n throw new TypeError(`dependencies cannot contain getters: \"${key}\"`);\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- accepts any Route type */\nexport function guardRouteStructure(\n routes: Route<any>[],\n validator?: RouterValidator | null,\n): void {\n /* eslint-enable @typescript-eslint/no-explicit-any */\n for (const route of routes) {\n const routeValue: unknown = route;\n\n if (\n routeValue === null ||\n typeof routeValue !== \"object\" ||\n Array.isArray(routeValue)\n ) {\n throw new TypeError(\"route must be a non-array object\");\n }\n\n validator?.routes.guardRouteCallbacks(route as Route);\n validator?.routes.guardNoAsyncCallbacks(route as Route);\n const children = (route as Route).children;\n\n if (children) {\n guardRouteStructure(children, validator);\n }\n }\n}\n","// packages/core/src/helpers.ts\n\nimport { DEFAULT_LIMITS } from \"./constants\";\n\nimport type { Limits } from \"./types\";\nimport type { Params, State, LimitsConfig } from \"@real-router/types\";\n\n// =============================================================================\n// State Helpers\n// =============================================================================\n\n/**\n * Structural type guard for State object.\n * Only checks required fields exist with correct types.\n * Does NOT validate params serializability (allows circular refs).\n *\n * Use `isState` from type-guards for full validation (serializable params).\n * Use this for internal operations like deepFreezeState that handle any object structure.\n *\n * @param value - Value to check\n * @returns true if value has State structure\n * @internal\n */\nfunction isStateStructural(value: unknown): value is State {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n return (\n typeof obj.name === \"string\" &&\n typeof obj.path === \"string\" &&\n typeof obj.params === \"object\" &&\n obj.params !== null\n );\n}\n\n/**\n * Deep freezes State object to prevent mutations.\n * Creates a deep clone first, then recursively freezes the clone and all nested objects.\n * Uses simple recursive freezing after cloning (no need for WeakSet since clone has no circular refs).\n *\n * @param state - The State object to freeze\n * @returns A frozen deep clone of the state\n * @throws {TypeError} If state is not a valid State object\n *\n * @example\n * const state = { name: 'home', params: {}, path: '/' };\n * const frozen = deepFreezeState(state);\n * // frozen.params is now immutable\n * // original state is unchanged\n */\nexport function deepFreezeState<T extends State>(state: T): T {\n // Early return for null/undefined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!state) {\n return state;\n }\n\n // Validate State structure (structural check, allows circular refs)\n if (!isStateStructural(state)) {\n throw new TypeError(\n `[deepFreezeState] Expected valid State object, got: ${typeof state}`,\n );\n }\n\n // Create a deep clone to avoid mutating the original\n // structuredClone preserves circular references, so we need to track visited objects\n const clonedState = structuredClone(state);\n\n // WeakSet to track visited objects (prevent infinite recursion with circular refs)\n const visited = new WeakSet<object>();\n\n // Recursive freeze function with circular reference protection\n function freezeClonedRecursive(obj: unknown): void {\n // Skip primitives, null, undefined\n // Note: typeof undefined === \"undefined\" !== \"object\", so checking undefined is redundant\n if (obj === null || typeof obj !== \"object\") {\n return;\n }\n\n // Skip already visited objects (circular reference protection)\n if (visited.has(obj)) {\n return;\n }\n\n // Mark as visited\n visited.add(obj);\n\n // Freeze the object/array itself\n Object.freeze(obj);\n\n // Iterate without Object.values() allocation\n if (Array.isArray(obj)) {\n for (const item of obj) {\n freezeClonedRecursive(item);\n }\n } else {\n for (const key in obj) {\n freezeClonedRecursive((obj as Record<string, unknown>)[key]);\n }\n }\n }\n\n // Freeze the entire cloned state tree\n freezeClonedRecursive(clonedState);\n\n return clonedState;\n}\n\n/**\n * Shallow-freezes a State object in place.\n *\n * Freezes only the top-level State object (blocks reassignment of `name`,\n * `params`, `path`, `transition`, `context`). Nested objects (`params`,\n * `transition`, `transition.segments`, `transition.segments.{deactivated,activated}`)\n * are expected to be **already frozen at creation time** by their producers:\n *\n * - `params` frozen in `makeState()` / `navigateToNotFound()`\n * - `transition`, `segments`, `deactivated`, `activated` frozen in\n * `buildTransitionMeta()` (or inline in `navigateToNotFound()`)\n *\n * `state.context` is **intentionally not frozen** — plugins write to it via\n * `claim.write(state, value)` after state creation.\n *\n * @internal\n */\nexport function freezeStateInPlace<T extends State>(state: T): T {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- defensive guard against external misuse\n if (!state) {\n return state;\n }\n\n return Object.freeze(state);\n}\n\n/**\n * Merges user limits with defaults.\n * Returns frozen object for immutability.\n */\nexport function createLimits(userLimits: Partial<LimitsConfig> = {}): Limits {\n return { ...DEFAULT_LIMITS, ...userLimits };\n}\n\n// =============================================================================\n// Params Helpers\n// =============================================================================\n\n/**\n * Strips `undefined` values from a params object before handoff to the query\n * string engine and state storage.\n *\n * **Why this exists:** `router.navigate(name, { x: undefined })` must not put\n * `x` into the resulting URL (publicly documented contract). The underlying\n * query engine (`search-params`) already does this, but the contract belongs\n * to `@real-router/core` — this function guarantees it at the core boundary\n * so that:\n * - Plugin interceptors on `forwardState` that inject `undefined` values are\n * caught before they reach the engine\n * - `state.params` never contains `undefined` values (roundtrip consistent\n * with URL)\n * - The contract is verifiable at core's own test surface (doesn't depend on\n * engine behavior for regression detection)\n *\n * Single pass. Always returns a fresh object when input is defined\n * (reference identity is not preserved — callers must not rely on it).\n */\nexport function normalizeParams(params: Params): Params;\n\nexport function normalizeParams(params: undefined): undefined;\n\nexport function normalizeParams(params: Params | undefined): Params | undefined;\n\nexport function normalizeParams(\n params: Params | undefined,\n): Params | undefined {\n if (params === undefined) {\n return params;\n }\n\n const normalized: Params = {};\n\n for (const key in params) {\n if (!Object.hasOwn(params, key)) {\n continue;\n }\n\n const value = params[key];\n\n if (value !== undefined) {\n normalized[key] = value;\n }\n }\n\n return normalized;\n}\n","import { DEFAULT_LIMITS } from \"../../constants\";\n\nimport type { Limits } from \"../../types\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\nexport interface DependenciesStore<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n dependencies: Partial<Dependencies>;\n limits: Limits;\n}\n\nexport function createDependenciesStore<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n initialDependencies: Partial<Dependencies> = {},\n): DependenciesStore<Dependencies> {\n const dependencies = Object.create(null) as Partial<Dependencies>;\n\n for (const key in initialDependencies) {\n if (initialDependencies[key] !== undefined) {\n dependencies[key] = initialDependencies[key];\n }\n }\n\n return {\n dependencies,\n limits: DEFAULT_LIMITS,\n };\n}\n","function e(e){return`(${e.replaceAll(/(^<|>$)/g,``)})`}const t=/([:*])([^/?<]+)(<[^>]+>)?(\\?)?/g,n=/([:*][^/?<]+(?:<[^>]+>)?)\\?(?=\\/|$)/g,r=/\\?(.+)$/;function i(i){let a=[],o=[],s=[],c={},l=new Map,u=i.replaceAll(n,`$1`),d=r.exec(u);if(d!==null){let e=d[1].split(`&`);for(let t of e){let e=t.trim();e.length>0&&(o.push(e),c[e]=`query`)}i=i.slice(0,d.index)}let f;for(;(f=t.exec(i))!==null;){let t=f[1],n=f[2],r=f[3];if(t===`*`)s.push(n),a.push(n),c[n]=`url`;else if(a.push(n),c[n]=`url`,r){let t=`^${e(r)}$`;l.set(n,{pattern:new RegExp(t),constraint:r})}}return{urlParams:a,queryParams:o,spatParams:s,paramTypeMap:c,constraintPatterns:l,pathPattern:i}}function a(e,t,n){for(let[r,{pattern:i,constraint:a}]of t){let t=String(e[r]);if(!i.test(t)){let e=a?a.replaceAll(/(^<)|(>$)/g,``):`[^/]+`;throw Error(`[validateConstraints] Parameter '${r}' of '${n}' has invalid format: got '${t}', expected to match '${e}'`)}}}const o=/[^\\w!$'()*+,.:;|~-]/gu,s=/[^\\w!$'()*+,.:;|~-]/u,c=e=>s.test(e)?e.replaceAll(o,e=>encodeURIComponent(e)):e,l={default:c,uri:encodeURI,uriComponent:encodeURIComponent,none:e=>e},u={default:decodeURIComponent,uri:decodeURI,uriComponent:decodeURIComponent,none:e=>e},d=(e,t,n)=>{let r=l[t],i=String(e);if(!n)return r(i);let a=i.split(`/`),o=r(a[0]);for(let e=1;e<a.length;e++)o+=`/`+r(a[e]);return o};function f(){return{staticChildren:Object.create(null),hasChildren:!1,paramChild:void 0,splatChild:void 0,route:void 0,slashChildRoute:void 0}}function p(e){return e.length>1&&e.endsWith(`/`)?e.slice(0,-1):e}function m(e,t){return e===``?t:t===``?e:e+t}function h(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function g(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(!h(n)||!h(r))return!1;t+=3}else t++;return!0}const _=/<[^>]*>/g;function v(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(_,``),u=o?l:m(n,l),d=i;a||(d=y(e,t,u,o?``:n,r,i));for(let n of t.children.values())v(e,n,u,r,d);a||r.pop()}function y(e,t,n,r,i,a){let o=C(n,r),s=Object.freeze([...i]),c=b(s),l=p(n),u=j(e.rootQueryParams,i),d=M(i),{buildStaticParts:f,buildParamSlots:m}=A(o?p(r):l,o?i.slice(0,-1):i,e.options.urlParamsEncoding),h={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:m,buildParamNamesSet:new Set(m.map(e=>e.paramName))};return t.paramMeta.urlParams.length===0&&(h.cachedResult=Object.freeze({segments:h.matchSegments,params:Object.freeze({}),meta:h.meta})),e.routesByName.set(t.fullName,h),e.segmentsByName.set(t.fullName,s),e.metaByName.set(t.fullName,c),o?x(e,h,r):S(e,h,n,l,t),h}function b(e){let t={};for(let n of e)t[n.fullName]=n.paramTypeMap;return Object.freeze(t)}function x(e,t,n){E(e,t,n);let r=p(n),i=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.has(i)&&e.staticCache.set(i,t)}function S(e,t,n,r,i){if(w(e,t,n),i.paramMeta.urlParams.length===0){let n=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.set(n,t)}}function C(e,t){return p(e)===p(t)}function w(e,t,n){let r=p(n);if(r===`/`){e.root.route=t;return}T(e,e.root,r,1,t)}function T(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(_,``).replace(/\\?$/,``);t.paramChild??={node:f(),name:r},T(e,t.paramChild.node,n,s+1,i),s>=a?t.route??=i:T(e,t,n,s+1,i);return}t=k(e,t,c),r=s+1}t.route=i}function E(e,t,n){let r=D(e,n);r.slashChildRoute=t}function D(e,t){return O(e,e.root,t)}function O(e,t,n){let r=p(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=k(e,i,s),a=n+1}return i}function k(e,t,n){if(n.startsWith(`*`)){let e=n.slice(1);return t.splatChild??={node:f(),name:e},t.hasChildren=!0,t.splatChild.node}if(n.startsWith(`:`)){let e=n.slice(1).replaceAll(_,``).replace(/\\?$/,``);return t.paramChild??={node:f(),name:e},t.hasChildren=!0,t.paramChild.node}let r=e.options.caseSensitive?n:n.toLowerCase();return r in t.staticChildren||(t.staticChildren[r]=f(),t.hasChildren=!0),t.staticChildren[r]}function A(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,u;for(;(u=s.exec(e))!==null;){let t=u[1],r=u[2]===`?`;a.push(e.slice(c,u.index));let s=i.has(t)?e=>{let t=l[n],r=e.split(`/`),i=t(r[0]);for(let e=1;e<r.length;e++)i+=`/${t(r[e])}`;return i}:l[n];o.push({paramName:t,isOptional:r,encoder:s}),c=u.index+u[0].length}return a.push(e.slice(c)),{buildStaticParts:a,buildParamSlots:o}}function j(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 M(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 N=class{get options(){return this.#e}#e;#t=f();#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,buildQueryString:e.buildQueryString},this.#u=this.#e.caseSensitive,this.#d=this.#e.urlParamsEncoding===`none`?null:u[this.#e.urlParamsEncoding]}registerTree(e){this.#c=e.paramMeta.queryParams,v({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=p(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(!g(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}};export{u as DECODING_METHODS,l as ENCODING_METHODS,N as SegmentMatcher,i as buildParamMeta,f as createSegmentNode,d as encodeParam,c as encodeURIComponentExcludingSubDelims,a as validateConstraints};\n//# sourceMappingURL=index.mjs.map","const e=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=(t,n)=>{if(t===void 0)return n.boolean.decodeUndefined();let r=n.boolean.decodeRaw(t);if(r!==null)return r;let i=e(t),a=n.number.decode(i);return a===null?n.boolean.decodeValue(i):a},n=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)},r=(e,t,r)=>{if(t.length===0)return``;let i=`${e}${r}`,a=`${i}=${n(t[0])}`;for(let e=1;e<t.length;e++)a+=`&${i}=${n(t[e])}`;return a},i={none:{encodeArray:(e,t)=>r(e,t,``)},brackets:{encodeArray:(e,t)=>r(e,t,`[]`)},index:{encodeArray:(e,t)=>{if(t.length===0)return``;let r=`${e}[0]=${n(t[0])}`;for(let i=1;i<t.length;i++)r+=`&${e}[${i}]=${n(t[i])}`;return r}},comma:{encodeArray:(e,t)=>{if(t.length===0)return``;let r=`${e}=${n(t[0])}`;for(let e=1;e<t.length;e++)r+=`,${n(t[e])}`;return r},decodeValue:e=>e.includes(`,`)?e.split(`,`):null}},a={none:{encode:(e,t)=>`${e}=${t}`,decodeUndefined:()=>null,decodeRaw:()=>null,decodeValue:e=>e},auto:{encode:(e,t)=>`${e}=${t}`,decodeUndefined:()=>null,decodeRaw:e=>e===`true`?!0:e===`false`?!1:null,decodeValue:e=>e},\"empty-true\":{encode:(e,t)=>t?e:`${e}=false`,decodeUndefined:()=>!0,decodeRaw:()=>null,decodeValue:e=>e}},o={default:{encode:e=>e},hidden:{encode:()=>``}},s={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}},c=(e,t,n,r)=>({boolean:a[t],null:o[n],number:s[r],array:i[e]}),l={boolean:a.auto,null:o.default,number:s.auto,array:i.none},u={arrayFormat:`none`,booleanFormat:`auto`,nullFormat:`default`,numberFormat:`auto`},d={...u,strategies:l},f=e=>{if(!e||e.arrayFormat===void 0&&e.booleanFormat===void 0&&e.nullFormat===void 0&&e.numberFormat===void 0)return d;let t=e.arrayFormat??u.arrayFormat,n=e.booleanFormat??u.booleanFormat,r=e.nullFormat??u.nullFormat,i=e.numberFormat??u.numberFormat;return{arrayFormat:t,booleanFormat:n,nullFormat:r,numberFormat:i,strategies:c(t,n,r,i)}},p=e=>encodeURIComponent(e),m=(e,t,n)=>{let r=p(e);switch(typeof t){case`string`:case`number`:return`${r}=${p(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}=${p(t)}`;default:return`${r}=${p(t)}`}},h=e=>{let t=e.indexOf(`?`);return t===-1?e:e.slice(t+1)};function g(e,t,n,r){return e&&(e+=`&`),e+t.slice(n,r)}function _(e,t,n){for(let r=t;r<n;r++){let n=e.codePointAt(r);if(n===61||n===91)return e.slice(t,r)}return e.slice(t,n)}function v(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 y(n,r,i,a,o){return o?t(a?n.slice(r+1,i):void 0,o):a?e(n.slice(r+1,i)):null}function b(n,r,i,a,o){let s=n.indexOf(`=`,r),c=s!==-1&&s<i,l=c?s:i,u=l,d=!1;for(let e=r;e<l;e++)if(n.codePointAt(e)===91){u=e,d=!0;break}let f=e(n.slice(r,u));if(!d&&c&&o?.array.decodeValue){let e=n.slice(s+1,i),r=o.array.decodeValue(e);if(r){for(let e of r)v(a,f,t(e,o),!0);return}}v(a,f,y(n,s,i,c,o),d)}const x=(e,t)=>{let n=h(e);if(n===``||n===`?`)return{};if(!t)return S(n);let r=f(t),i={},a=0,o=n.length;for(;a<o;){let e=n.indexOf(`&`,a);e===-1&&(e=o),b(n,a,e,i,r.strategies),a=e+1}return i};function S(e){let t={};return w(e,t),t}function C(e,t){e!==``&&w(e,t)}function w(e,t){let n=0,r=e.length;for(;n<r;){let i=e.indexOf(`&`,n);i===-1&&(i=r),b(e,n,i,t),n=i+1}}const T=(e,t)=>{let n=Object.keys(e);if(n.length===0)return``;let r=f(t),i=[];for(let t of n){let n=e[t];if(n===void 0)continue;let a=m(t,n,r);a&&i.push(a)}return i.join(`&`)},E=(e,t,n)=>{let r=h(e);if(r===``)return{querystring:``,removedParams:{}};if(t.length===0)return{querystring:e.startsWith(`?`)?e:r,removedParams:{}};let i=f(n),a=e.startsWith(`?`),o=new Set(t),s=``,c=``,l=0,u=r.length;for(;l<u;){let e=r.indexOf(`&`,l);e===-1&&(e=u);let t=_(r,l,e);o.has(t)?c=g(c,r,l,e):s=g(s,r,l,e),l=e+1}return{querystring:a&&s?`?${s}`:s,removedParams:x(c,i)}},D=(e,t,n)=>{let r=h(e);if(r===``||t.length===0)return{keptParams:{},querystring:``};let i=f(n),a=new Set(t),o=``,s=0,c=r.length;for(;s<c;){let e=r.indexOf(`&`,s);e===-1&&(e=c);let t=_(r,s,e);a.has(t)&&(o=g(o,r,s,e)),s=e+1}return{keptParams:x(o,i),querystring:o}};export{u as DEFAULT_QUERY_PARAMS,T as build,D as keep,E as omit,x as parse,C as parseInto};\n//# sourceMappingURL=index.mjs.map","import{SegmentMatcher as e,buildParamMeta as t}from\"path-matcher\";import{DEFAULT_QUERY_PARAMS as n,build as r,parse as i}from\"search-params\";function a(e,t){let n=e.path,r=n.startsWith(`~`),i=r?n.slice(1):n,o={name:e.name,path:i,absolute:r,children:[],parent:t,nonAbsoluteChildren:[],fullName:``};if(e.children)for(let t of e.children){let e=a(t,o);o.children.push(e)}return o}function o(e,t,n){let r=a({name:e,path:t},null);for(let e of n){let t=a(e,r);r.children.push(t)}return r}const s=Object.freeze(new Map),c=Object.freeze([]);function l(e){return e.parent?.name?`${e.parent.fullName}.${e.name}`:e.name}function u(e,t){return e.endsWith(`/`)&&t.startsWith(`/`)?e+t.slice(1):e+t}function d(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:u(i.staticPath,e.path):e.path}function f(e){let t=new Map;for(let n of e)t.set(n.name,n);return t}function p(e,t,n){let r=[],i=[];for(let a of e){let e=m(a,t,n);r.push(e),e.absolute||i.push(e)}return{childrenMap:f(r),nonAbsoluteChildren:i}}function m(e,n,r){let i=t(e.path),a=i.paramTypeMap,o={name:e.name,path:e.path,absolute:e.absolute,parent:n,children:void 0,paramMeta:i,nonAbsoluteChildren:void 0,fullName:``,staticPath:null,paramTypeMap:a};if(o.fullName=l(o),o.staticPath=d(o),e.children.length===0)o.children=s,o.nonAbsoluteChildren=c;else{let{childrenMap:t,nonAbsoluteChildren:n}=p(e.children,o,r);o.children=t,o.nonAbsoluteChildren=n}return r&&(e.children.length>0&&(Object.freeze(o.nonAbsoluteChildren),Object.freeze(o.children)),Object.freeze(a),Object.freeze(o)),o}function h(e,t=!0){return m(e,null,t)}function g(e,t){let n=[];return{add(e){return n.push(e),this},addMany(e){return n.push(...e),this},build(r){return h(o(e,t,n),!r?.skipFreeze)}}}function _(e,t,n,r){return g(e,t).addMany(n).build(r)}function v(e,t){let n=[],r=t.includes(`.`)?t.split(`.`):[t];e.path!==``&&n.push(e);let i=e;for(let e of r){let t=i.children.get(e);if(!t)return null;n.push(t),i=t}return n}function y(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(),y)),n}function b(e){return Array.from(e.children.values(),y)}function x(t){let n=t?.queryParams;return new e({...t?.caseSensitive===void 0?void 0:{caseSensitive:t.caseSensitive},...t?.strictTrailingSlash===void 0?void 0:{strictTrailingSlash:t.strictTrailingSlash},...t?.strictQueryParams===void 0?void 0:{strictQueryParams:t.strictQueryParams},...t?.urlParamsEncoding===void 0?void 0:{urlParamsEncoding:t.urlParamsEncoding},parseQueryString:e=>i(e,n),buildQueryString:e=>r(e,n)})}function S(e,t){return TypeError(`[router.${e}] ${t}`)}function C(e,t,n,r){if(typeof e!=`string`){let t;throw t=e===null?`null`:Array.isArray(e)?`array`:typeof e,S(n,`Route path must be a string, got ${t}`)}if(e===``)return;if(/\\s/.test(e))throw S(n,`Invalid path for route \"${t}\": whitespace not allowed in \"${e}\"`);if(!/^([/?~]|[^/]+$)/.test(e))throw S(n,`Route \"${t}\" has invalid path format: \"${e}\". Path should start with '/', '~', '?' or be a relative segment.`);if(e.includes(`//`))throw S(n,`Invalid path for route \"${t}\": double slashes not allowed in \"${e}\"`);let i=r&&r.paramMeta.urlParams.length>0;if(e.startsWith(`~`)&&i)throw S(n,`Absolute path \"${e}\" cannot be used under parent route with URL parameters`)}const w=/^[A-Z_a-z][\\w-]*$/,T=/\\S/,E=1e4;function D(e){return e===null?`null`:typeof e==`object`?`constructor`in e&&e.constructor.name!==`Object`?e.constructor.name:`object`:typeof e}function O(e){for(let t of Object.keys(e)){let n=Object.getOwnPropertyDescriptor(e,t);if(n&&(n.get||n.set))return!0}return!1}function k(e,t){if(!e||typeof e!=`object`)throw TypeError(`[router.${t}] Route must be an object, got ${D(e)}`);let n=Object.getPrototypeOf(e);if(n!==Object.prototype&&n!==null)throw TypeError(`[router.${t}] Route must be a plain object, got ${D(e)}`);if(O(e))throw TypeError(`[router.${t}] Route must not have getters or setters`)}function A(e,t){if(e.encodeParams!==void 0&&typeof e.encodeParams!=`function`)throw TypeError(`[router.${t}] Route \"${String(e.name)}\" encodeParams must be a function`)}function j(e,t){if(e.decodeParams!==void 0&&typeof e.decodeParams!=`function`)throw TypeError(`[router.${t}] Route \"${String(e.name)}\" decodeParams must be a function`)}function M(e,t){if(typeof e.name!=`string`)throw TypeError(`[router.${t}] Route name must be a string, got ${D(e.name)}`);let n=e.name;if(n===``)throw TypeError(`[router.${t}] Route name cannot be empty`);if(!T.test(n))throw TypeError(`[router.${t}] Route name cannot contain only whitespace`);if(n.length>E)throw TypeError(`[router.${t}] Route name exceeds maximum length of ${E} characters`);if(!n.startsWith(`@@`)){if(n.includes(`.`))throw TypeError(`[router.${t}] Route name \"${n}\" cannot contain dots. Use children array or { parent } option in addRoute() instead.`);if(!w.test(n))throw TypeError(`[router.${t}] Invalid route name \"${n}\". Name must start with a letter or underscore, followed by letters, numbers, underscores, or hyphens.`)}}function N(e,t){if(!t.includes(`.`))return e.children.get(t);let n=e;for(let e of t.split(`.`))if(n=n.children.get(e),!n)return;return n}function P(e,t,n){if(N(e,t))throw Error(`[router.${n}] Route \"${t}\" already exists`)}function F(e,t,n){if(e.has(t))throw Error(`[router.${n}] Duplicate route \"${t}\" in batch`);e.add(t)}function I(e,t,n,r){let i=t===``?e:N(e,t);if(i){for(let e of i.children.values())if(e.path===n)throw Error(`[router.${r}] Path \"${n}\" is already defined`)}}function L(e,t,n,r){let i=e.get(t);if(i?.has(n))throw Error(`[router.${r}] Path \"${n}\" is already defined`);i?i.add(n):e.set(t,new Set([n]))}function R(e,t,n,r=``,i,a){k(e,t);let o=e;M(o,t),C(o.path,o.name,t,n),A(o,t),j(o,t);let s=o.name,c=r?`${r}.${s}`:s;n&&c&&P(n,c,t),i&&F(i,c,t);let l=o.path,u=r;if(n&&I(n,u,l,t),a&&L(a,u,l,t),o.children!==void 0){if(!Array.isArray(o.children))throw TypeError(`[router.${t}] Route \"${s}\" children must be an array, got ${D(o.children)}`);for(let e of o.children)R(e,t,n,c,i,a)}}export{n as DEFAULT_QUERY_PARAMS,x as createMatcher,_ as createRouteTree,v as getSegmentsByName,y as nodeToDefinition,b as routeTreeToDefinitions,R as validateRoute};\n//# sourceMappingURL=index.mjs.map","// packages/core/src/namespaces/OptionsNamespace/constants.ts\n\nimport { DEFAULT_QUERY_PARAMS } from \"route-tree\";\n\nimport type { Options } from \"@real-router/types\";\n\n/**\n * Default options for the router.\n */\nexport const defaultOptions: Options = {\n defaultRoute: \"\",\n defaultParams: {},\n trailingSlash: \"preserve\",\n queryParamsMode: \"loose\",\n queryParams: DEFAULT_QUERY_PARAMS,\n urlParamsEncoding: \"default\",\n allowNotFound: true,\n rewritePathOnMatch: true,\n} satisfies Options;\n","// packages/core/src/namespaces/OptionsNamespace/helpers.ts\n\nimport type { Options, Params } from \"@real-router/types\";\n\n/**\n * Recursively freezes an object and all nested objects.\n * Only freezes plain objects, not primitives or special objects.\n */\nexport function deepFreeze<T extends object>(obj: T): Readonly<T> {\n Object.freeze(obj);\n\n for (const key of Object.keys(obj)) {\n const value = (obj as Record<string, unknown>)[key];\n\n if (value && typeof value === \"object\" && value.constructor === Object) {\n deepFreeze(value);\n }\n }\n\n return obj;\n}\n\n/**\n * Resolves an option value that can be static or a callback.\n * If the value is a function, calls it with getDependency and returns the result.\n * Otherwise, returns the value as-is.\n */\nexport function resolveOption(\n value: Options[\"defaultRoute\"],\n getDependency: (name: string) => unknown,\n): string;\n\nexport function resolveOption(\n value: Options[\"defaultParams\"],\n getDependency: (name: string) => unknown,\n): Params;\n\nexport function resolveOption(\n value: Options[\"defaultRoute\"] | Options[\"defaultParams\"],\n getDependency: (name: string) => unknown,\n): string | Params {\n if (typeof value === \"function\") {\n // Runtime getDependency is (name: string) => unknown, but DefaultRouteCallback<object>\n // expects <K extends keyof object>(name: K) => object[K] where keyof object = never.\n // Cast needed to bridge generic constraint mismatch.\n return value(getDependency as never);\n }\n\n return value;\n}\n","// packages/core/src/namespaces/OptionsNamespace/validators.ts\n\n/**\n * Minimal crash guard for options.\n * Full DX validation moved to @real-router/validation-plugin (retrospective pattern).\n */\nexport function validateOptionsIsObject(\n options: unknown,\n): asserts options is Record<string, unknown> {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"[router.constructor] options must be a plain object\");\n }\n}\n","// packages/core/src/namespaces/OptionsNamespace/OptionsNamespace.ts\n\nimport { defaultOptions } from \"./constants\";\nimport { deepFreeze } from \"./helpers\";\nimport { validateOptionsIsObject } from \"./validators\";\n\nimport type { Options } from \"@real-router/types\";\n\nexport class OptionsNamespace {\n readonly #options: Readonly<Options>;\n\n constructor(initialOptions: Partial<Options> = {}) {\n this.#options = deepFreeze({\n ...defaultOptions,\n ...initialOptions,\n });\n }\n\n static validateOptionsIsObject(\n options: unknown,\n ): asserts options is Record<string, unknown> {\n validateOptionsIsObject(options);\n }\n\n get(): Readonly<Options> {\n return this.#options;\n }\n}\n","// packages/core/src/namespaces/StateNamespace/helpers.ts\n\nexport function areParamValuesEqual(val1: unknown, val2: unknown): boolean {\n if (val1 === val2) {\n return true;\n }\n\n if (Array.isArray(val1) && Array.isArray(val2)) {\n if (val1.length !== val2.length) {\n return false;\n }\n\n // eslint-disable-next-line unicorn/no-for-loop -- hot path: for-of entries() allocates iterator per recursive call\n for (let i = 0; i < val1.length; i++) {\n if (!areParamValuesEqual(val1[i], val2[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n}\n","// packages/core/src/stateMetaStore.ts\n\nimport type { Params, State } from \"@real-router/types\";\n\nconst store = new WeakMap<State, Params>();\n\n/** @internal */\nexport function getStateMetaParams(state: State): Params | undefined {\n return store.get(state);\n}\n\n/** @internal */\nexport function setStateMetaParams(state: State, params: Params): void {\n store.set(state, params);\n}\n","// packages/core/src/namespaces/StateNamespace/StateNamespace.ts\n\nimport { areParamValuesEqual } from \"./helpers\";\nimport { DEFAULT_TRANSITION, EMPTY_PARAMS } from \"../../constants\";\nimport { freezeStateInPlace } from \"../../helpers\";\nimport { setStateMetaParams } from \"../../stateMetaStore\";\n\nimport type { StateNamespaceDependencies } from \"./types\";\nimport type { Params, State } from \"@real-router/types\";\nimport type { RouteTreeStateMeta } from \"route-tree\";\n\n/**\n * Independent namespace for managing router state storage and creation.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle state storage, freezing, and creation.\n */\nexport class StateNamespace {\n /**\n * Cached frozen state - avoids structuredClone on every getState() call.\n */\n #frozenState: State | undefined = undefined;\n\n /**\n * Previous state before the last setState call.\n */\n #previousState: State | undefined = undefined;\n\n /**\n * Dependencies injected from Router.\n */\n #deps!: StateNamespaceDependencies;\n\n /**\n * Cache for URL params by route name.\n */\n readonly #urlParamsCache = new Map<string, string[]>();\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Returns the current router state.\n *\n * The returned state is deeply frozen (immutable) for safety.\n * Returns `undefined` if the router has not been started or has been stopped.\n */\n get<P extends Params = Params>(): State<P> | undefined {\n return this.#frozenState as State<P> | undefined; // NOSONAR -- generic narrowing needed for public API\n }\n\n /**\n * Sets the current router state.\n *\n * The state is deeply frozen before storage to ensure immutability.\n * The previous state is preserved and accessible via `getPrevious()`.\n *\n * @param state - Already validated by facade, or undefined to clear\n */\n set(state: State | undefined): void {\n // Preserve current state as previous before updating\n this.#previousState = this.#frozenState;\n\n // If state is already frozen (from makeState()), use it directly.\n // For external states, freeze in place without cloning.\n this.#frozenState = state ? freezeStateInPlace(state) : undefined;\n }\n\n /**\n * Returns the previous router state (before the last navigation).\n */\n getPrevious(): State | undefined {\n return this.#previousState;\n }\n\n reset(): void {\n this.#frozenState = undefined;\n this.#previousState = undefined;\n this.#urlParamsCache.clear();\n }\n\n // =========================================================================\n // Dependency Injection\n // =========================================================================\n\n /**\n * Sets dependencies for state creation methods.\n * Must be called before using makeState, areStatesEqual, etc.\n */\n setDependencies(deps: StateNamespaceDependencies): void {\n this.#deps = deps;\n }\n\n // =========================================================================\n // State Creation Methods\n // =========================================================================\n\n /**\n * Creates a state object for a route.\n *\n * `params` is frozen at creation so it is always immutable, even when\n * `skipFreeze=true` is passed to defer the outer `Object.freeze(state)` call.\n * This keeps params-freezing invariants independent of transition-pipeline\n * mutation (e.g. `completeTransition` attaching `state.transition`).\n *\n * `context` is initialized as a fresh empty object — intentionally NOT frozen\n * so plugins can publish data via `claim.write(state, value)` after creation.\n */\n makeState<P extends Params = Params>(\n name: string,\n params?: P,\n path?: string,\n meta?: RouteTreeStateMeta,\n skipFreeze?: boolean,\n ): State<P> {\n // Optimization: O(1) lookup instead of O(depth) ancestor iteration\n const defaultParamsConfig = this.#deps.getDefaultParams();\n const hasDefaultParams = Object.hasOwn(defaultParamsConfig, name);\n\n // Conditional allocation: avoid spreading when no defaultParams exist\n let mergedParams: P;\n\n if (hasDefaultParams) {\n mergedParams = Object.freeze({\n ...defaultParamsConfig[name],\n ...params,\n }) as P;\n } else if (!params || params === EMPTY_PARAMS) {\n mergedParams = EMPTY_PARAMS as P;\n } else {\n mergedParams = Object.freeze({ ...params });\n }\n\n const state = {\n name,\n params: mergedParams,\n path: path ?? this.#deps.buildPath(name, params),\n context: {},\n ...(!skipFreeze && { transition: DEFAULT_TRANSITION }),\n } as State<P>;\n\n if (meta) {\n setStateMetaParams(state, meta);\n }\n\n return skipFreeze ? state : freezeStateInPlace(state);\n }\n\n // =========================================================================\n // State Comparison Methods\n // =========================================================================\n\n /**\n * Compares two states for equality.\n * By default, ignores query params (only compares URL params).\n */\n areStatesEqual(\n state1: State | undefined,\n state2: State | undefined,\n ignoreQueryParams = true,\n ): boolean {\n if (!state1 || !state2) {\n return !!state1 === !!state2;\n }\n\n if (state1.name !== state2.name) {\n return false;\n }\n\n if (ignoreQueryParams) {\n const urlParams = this.#getUrlParams(state1.name);\n\n for (const urlParam of urlParams) {\n if (\n !areParamValuesEqual(state1.params[urlParam], state2.params[urlParam])\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n const state1Keys = Object.keys(state1.params);\n const state2Keys = Object.keys(state2.params);\n\n if (state1Keys.length !== state2Keys.length) {\n return false;\n }\n\n for (const param of state1Keys) {\n if (\n !(param in state2.params) ||\n !areParamValuesEqual(state1.params[param], state2.params[param])\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n // =========================================================================\n // Private Helpers\n // =========================================================================\n\n /**\n * Gets URL params for a route name, using cache for performance.\n */\n #getUrlParams(name: string): string[] {\n const cached = this.#urlParamsCache.get(name);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const result = this.#deps.getUrlParams(name);\n\n this.#urlParamsCache.set(name, result);\n\n return result;\n }\n}\n","// packages/core/src/namespaces/PluginsNamespace/constants.ts\n\nimport {\n events as EVENTS_CONST,\n plugins as PLUGINS_CONST,\n} from \"../../constants\";\n\nimport type { EventName } from \"@real-router/types\";\n\n/**\n * Maps plugin method names to router event names.\n */\nexport const EVENTS_MAP = {\n [PLUGINS_CONST.ROUTER_START]: EVENTS_CONST.ROUTER_START,\n [PLUGINS_CONST.ROUTER_STOP]: EVENTS_CONST.ROUTER_STOP,\n [PLUGINS_CONST.TRANSITION_SUCCESS]: EVENTS_CONST.TRANSITION_SUCCESS,\n [PLUGINS_CONST.TRANSITION_START]: EVENTS_CONST.TRANSITION_START,\n [PLUGINS_CONST.TRANSITION_LEAVE_APPROVE]:\n EVENTS_CONST.TRANSITION_LEAVE_APPROVE,\n [PLUGINS_CONST.TRANSITION_ERROR]: EVENTS_CONST.TRANSITION_ERROR,\n [PLUGINS_CONST.TRANSITION_CANCEL]: EVENTS_CONST.TRANSITION_CANCEL,\n} as const satisfies Record<\n (typeof PLUGINS_CONST)[keyof typeof PLUGINS_CONST],\n EventName\n>;\n\n/**\n * Plugin method names that correspond to router events.\n */\nexport const EVENT_METHOD_NAMES = Object.keys(\n EVENTS_MAP,\n) as (keyof typeof EVENTS_MAP)[];\n\nexport const LOGGER_CONTEXT = \"router.usePlugin\";\n","// packages/core/src/namespaces/PluginsNamespace/validators.ts\n\n/**\n * Static validation functions for PluginsNamespace.\n * Called by Router facade before instance methods.\n */\n\nimport type { Plugin } from \"@real-router/types\";\n\n/**\n * Validates that a plugin factory returned a valid plugin object.\n */\nexport function validatePlugin(plugin: Plugin): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!(plugin && typeof plugin === \"object\") || Array.isArray(plugin)) {\n throw new TypeError(\n `[router.usePlugin] Plugin factory must return an object, got ${typeof plugin}`,\n );\n }\n\n // Detect async factory (returns Promise)\n if (typeof (plugin as unknown as { then?: unknown }).then === \"function\") {\n throw new TypeError(\n `[router.usePlugin] Async plugin factories are not supported. ` +\n `Factory returned a Promise instead of a plugin object.`,\n );\n }\n}\n","// packages/core/src/namespaces/PluginsNamespace/PluginsNamespace.ts\n\nimport { logger } from \"@real-router/logger\";\n\nimport { EVENTS_MAP, EVENT_METHOD_NAMES, LOGGER_CONTEXT } from \"./constants\";\nimport { validatePlugin } from \"./validators\";\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\nimport type { PluginsDependencies } from \"./types\";\nimport type { Limits, PluginFactory } from \"../../types\";\nimport type { RouterValidator } from \"../../types/RouterValidator\";\nimport type {\n DefaultDependencies,\n Plugin,\n Unsubscribe,\n} from \"@real-router/types\";\n\n/**\n * Independent namespace for managing plugins.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic.\n */\nexport class PluginsNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #plugins = new Set<PluginFactory<Dependencies>>();\n readonly #unsubscribes = new Set<Unsubscribe>();\n\n #deps!: PluginsDependencies<Dependencies>;\n #limits: Limits = DEFAULT_LIMITS;\n #getValidator: (() => RouterValidator | null) | null = null;\n\n // =========================================================================\n // Static validation methods (called by facade before instance methods)\n // Proxy to functions in validators.ts for separation of concerns\n // =========================================================================\n\n static validatePlugin(plugin: Plugin): void {\n validatePlugin(plugin);\n }\n\n static validateNoDuplicatePlugins<D extends DefaultDependencies>(\n newFactories: PluginFactory<D>[],\n hasPlugin: (factory: PluginFactory<D>) => boolean,\n ): void {\n for (const factory of newFactories) {\n if (hasPlugin(factory)) {\n throw new Error(\n `[router.usePlugin] Plugin factory already registered. ` +\n `To re-register, first unsubscribe the existing plugin.`,\n );\n }\n }\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n setDependencies(deps: PluginsDependencies<Dependencies>): void {\n this.#deps = deps;\n }\n\n setLimits(limits: Limits): void {\n this.#limits = limits;\n // eslint-disable-next-line sonarjs/void-use -- @preserve: limits passed to validator via RouterInternals; void suppresses TS6133 until plugin implements validateCountThresholds\n void this.#limits;\n }\n\n setValidatorGetter(getter: () => RouterValidator | null): void {\n this.#getValidator = getter;\n }\n\n // =========================================================================\n // Instance methods (trust input - already validated by facade)\n // =========================================================================\n\n /**\n * Returns the number of registered plugins.\n * Used by facade for limit validation.\n */\n /* v8 ignore next 3 -- @preserve: only called via validator interface (ctx.validator?.plugins.validatePluginLimit), not reachable without validation plugin */\n count(): number {\n return this.#plugins.size;\n }\n\n /**\n * Registers one or more plugin factories.\n * Returns unsubscribe function to remove all added plugins.\n * Input already validated by facade (limit, duplicates).\n *\n * @param factories - Already validated by facade\n */\n use(...factories: PluginFactory<Dependencies>[]): Unsubscribe {\n // Emit warnings for count thresholds (not validation, just warnings)\n this.#getValidator?.()?.plugins.validateCountThresholds(\n this.#plugins.size + factories.length,\n );\n\n // Fast path for single plugin (common case)\n if (factories.length === 1) {\n const factory = factories[0];\n const cleanup = this.#startPlugin(factory);\n\n this.#plugins.add(factory);\n\n let unsubscribed = false;\n\n const unsubscribe: Unsubscribe = () => {\n if (unsubscribed) {\n return;\n }\n\n unsubscribed = true;\n this.#plugins.delete(factory);\n this.#unsubscribes.delete(unsubscribe);\n try {\n cleanup();\n } catch (error) {\n logger.error(LOGGER_CONTEXT, \"Error during cleanup:\", error);\n }\n };\n\n this.#unsubscribes.add(unsubscribe);\n\n return unsubscribe;\n }\n\n // Deduplicate batch with warning (validation already done by facade)\n const seenInBatch = this.#deduplicateBatch(factories);\n\n // Track successfully initialized plugins for cleanup\n const initializedPlugins: {\n factory: PluginFactory<Dependencies>;\n cleanup: Unsubscribe;\n }[] = [];\n\n // Initialize deduplicated plugins sequentially\n try {\n for (const plugin of seenInBatch) {\n const cleanup = this.#startPlugin(plugin);\n\n initializedPlugins.push({ factory: plugin, cleanup });\n }\n } catch (error) {\n // Rollback on failure - cleanup all initialized plugins\n for (const { cleanup } of initializedPlugins) {\n try {\n cleanup();\n } catch (cleanupError) {\n logger.error(LOGGER_CONTEXT, \"Cleanup error:\", cleanupError);\n }\n }\n\n throw error;\n }\n\n // Commit phase - add to registry\n for (const { factory } of initializedPlugins) {\n this.#plugins.add(factory);\n }\n\n // Return unsubscribe function\n let unsubscribed = false;\n\n const unsubscribe: Unsubscribe = () => {\n if (unsubscribed) {\n return;\n }\n\n unsubscribed = true;\n this.#unsubscribes.delete(unsubscribe);\n\n for (const { factory } of initializedPlugins) {\n this.#plugins.delete(factory);\n }\n\n for (const { cleanup } of initializedPlugins) {\n try {\n cleanup();\n } catch (error) {\n logger.error(LOGGER_CONTEXT, \"Error during cleanup:\", error);\n }\n }\n };\n\n this.#unsubscribes.add(unsubscribe);\n\n return unsubscribe;\n }\n\n /**\n * Returns registered plugin factories.\n */\n getAll(): PluginFactory<Dependencies>[] {\n return [...this.#plugins];\n }\n\n /**\n * Checks if a plugin factory is registered.\n * Used internally by validation to avoid array allocation.\n */\n /* v8 ignore next 3 -- @preserve: only called via validator interface, not reachable without validation plugin */\n has(factory: PluginFactory<Dependencies>): boolean {\n return this.#plugins.has(factory);\n }\n\n /**\n * Disposes all registered plugins by running their teardown callbacks\n * and removing event listener subscriptions.\n * Active disposal is required because plugins have an active lifecycle\n * (event subscriptions, teardown hooks).\n * Named \"dispose\" (not \"clear\") because there is active cleanup to perform.\n */\n disposeAll(): void {\n for (const unsubscribe of this.#unsubscribes) {\n unsubscribe();\n }\n\n this.#plugins.clear();\n this.#unsubscribes.clear();\n }\n\n // =========================================================================\n // Private methods\n // =========================================================================\n\n /**\n * Deduplicates batch with warning for duplicates within batch.\n * Validation (existing duplicates) is done by facade.\n */\n #deduplicateBatch(\n plugins: PluginFactory<Dependencies>[],\n ): Set<PluginFactory<Dependencies>> {\n const seenInBatch = new Set<PluginFactory<Dependencies>>();\n\n for (const plugin of plugins) {\n if (seenInBatch.has(plugin)) {\n this.#getValidator?.()?.plugins.warnBatchDuplicates(plugins);\n } else {\n seenInBatch.add(plugin);\n }\n }\n\n return seenInBatch;\n }\n\n #startPlugin(pluginFactory: PluginFactory<Dependencies>): Unsubscribe {\n const appliedPlugin = this.#deps.compileFactory(pluginFactory);\n\n PluginsNamespace.validatePlugin(appliedPlugin);\n this.#getValidator?.()?.plugins.validatePluginKeys(appliedPlugin);\n\n Object.freeze(appliedPlugin);\n\n // Collect all unsubscribe functions\n const removeEventListeners: Unsubscribe[] = [];\n\n // Subscribe plugin methods to corresponding router events\n for (const methodName of EVENT_METHOD_NAMES) {\n if (methodName in appliedPlugin) {\n if (typeof appliedPlugin[methodName] === \"function\") {\n removeEventListeners.push(\n this.#deps.addEventListener(\n EVENTS_MAP[methodName],\n appliedPlugin[methodName],\n ),\n );\n\n if (methodName === \"onStart\" && this.#deps.canNavigate()) {\n this.#getValidator?.()?.plugins.warnPluginAfterStart(methodName);\n }\n } else {\n this.#getValidator?.()?.plugins.warnPluginMethodType(methodName);\n }\n }\n }\n\n // Return composite cleanup function\n return () => {\n for (const removeListener of removeEventListeners) {\n removeListener();\n }\n\n if (typeof appliedPlugin.teardown === \"function\") {\n appliedPlugin.teardown();\n }\n };\n }\n}\n","// packages/core/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts\n\nimport { DEFAULT_LIMITS } from \"../../constants\";\n\nimport type { RouteLifecycleDependencies } from \"./types\";\nimport type { GuardFnFactory, Limits } from \"../../types\";\nimport type { RouterValidator } from \"../../types/RouterValidator\";\nimport type { DefaultDependencies, GuardFn, State } from \"@real-router/types\";\n\n/**\n * Converts a boolean value to a guard function factory.\n * Used for the shorthand syntax where true/false is passed instead of a function.\n */\nfunction booleanToFactory<Dependencies extends DefaultDependencies>(\n value: boolean,\n): GuardFnFactory<Dependencies> {\n const guardFn: GuardFn = () => value;\n\n return () => guardFn;\n}\n\n/**\n * Origin of a registered guard. `\"definition\"` — declared in route config and\n * thus subject to `clearDefinitionGuards()` cleanup during `replace()`.\n * `\"external\"` — registered post-hoc via `getLifecycleApi().add*Guard(...)`\n * and survives `replace()`.\n *\n * Storage is split per origin (two Maps per kind, four Maps total) so origin\n * is a primary invariant rather than a derived Set-tracked property. The\n * compiled function (`#canActivateFunctions` / `#canDeactivateFunctions`)\n * reflects the **last add wins** semantic for the slot (regardless of\n * origin) — matching the pre-refactor behaviour and the\n * `replaceRoutes.test.ts` \"definition wins on replace\" contract. On clear,\n * the function falls back to whichever origin Map still holds an entry\n * (external preferred if both remain after a partial clear).\n */\nexport type GuardOrigin = \"definition\" | \"external\";\n\n/**\n * Independent namespace for managing route lifecycle handlers.\n *\n * Static methods handle input validation (called by facade).\n * Instance methods handle state-dependent validation, storage and business logic.\n */\nexport class RouteLifecycleNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n // Storage split by origin: definition vs external. External wins at compile\n // time for the same slot; clearDefinitionGuards / removeXGuard semantics are\n // expressed in terms of these primary Maps.\n readonly #definitionActivateFactories = new Map<\n string,\n GuardFnFactory<Dependencies>\n >();\n readonly #externalActivateFactories = new Map<\n string,\n GuardFnFactory<Dependencies>\n >();\n readonly #definitionDeactivateFactories = new Map<\n string,\n GuardFnFactory<Dependencies>\n >();\n readonly #externalDeactivateFactories = new Map<\n string,\n GuardFnFactory<Dependencies>\n >();\n // Compiled-function view. Single Map per kind because navigation does not\n // distinguish origin — it just runs the effective guard. Set on add (last\n // add wins) and recompiled on clear from whichever origin Map still holds\n // the slot.\n readonly #canDeactivateFunctions = new Map<string, GuardFn>();\n readonly #canActivateFunctions = new Map<string, GuardFn>();\n // Cached tuple — Maps never change reference, so this is stable\n readonly #functionsTuple: [Map<string, GuardFn>, Map<string, GuardFn>] = [\n this.#canDeactivateFunctions,\n this.#canActivateFunctions,\n ];\n\n readonly #registering = new Set<string>();\n\n #deps!: RouteLifecycleDependencies<Dependencies>;\n #limits: Limits = DEFAULT_LIMITS;\n #getValidator: (() => RouterValidator | null) | null = null;\n\n setDependencies(deps: RouteLifecycleDependencies<Dependencies>): void {\n this.#deps = deps;\n }\n\n /**\n * Updates handler registration limits (max lifecycle handlers threshold).\n *\n * @param limits - Limits configuration with maxLifecycleHandlers\n */\n setLimits(limits: Limits): void {\n this.#limits = limits;\n // eslint-disable-next-line sonarjs/void-use -- @preserve: Wave 3 validator reads limits via RouterInternals; void suppresses TS6133 until then\n void this.#limits;\n }\n\n setValidatorGetter(getter: () => RouterValidator | null): void {\n this.#getValidator = getter;\n }\n\n getHandlerCount(type: \"activate\" | \"deactivate\"): number {\n const definitionMap =\n type === \"activate\"\n ? this.#definitionActivateFactories\n : this.#definitionDeactivateFactories;\n const externalMap =\n type === \"activate\"\n ? this.#externalActivateFactories\n : this.#externalDeactivateFactories;\n\n if (definitionMap.size === 0) {\n return externalMap.size;\n }\n\n if (externalMap.size === 0) {\n return definitionMap.size;\n }\n\n const names = new Set(definitionMap.keys());\n\n for (const name of externalMap.keys()) {\n names.add(name);\n }\n\n return names.size;\n }\n\n // =========================================================================\n // Instance methods\n // =========================================================================\n\n /**\n * Adds a canActivate guard for a route.\n *\n * @param name - Route name (input-validated by facade)\n * @param handler - Guard function or boolean (input-validated by facade)\n * @param isFromDefinition - True when guard comes from route definition\n * (lands in the definition Map; subject to `clearDefinitionGuards()`).\n * False (default) when added via `getLifecycleApi().addActivateGuard(...)`\n * (lands in the external Map; survives `replace()`).\n *\n * Last add wins at runtime: the compiled function reflects the factory\n * passed to the most recent call, regardless of origin. Origin only\n * determines which Map the factory is filed under (relevant for\n * `clearDefinitionGuards()` and `cloneRouter` re-registration).\n */\n addCanActivate(\n name: string,\n handler: GuardFnFactory<Dependencies> | boolean,\n isFromDefinition = false,\n ): void {\n this.#registerHandler(\n \"activate\",\n name,\n handler,\n isFromDefinition,\n \"canActivate\",\n );\n }\n\n /**\n * Adds a canDeactivate guard for a route.\n *\n * Symmetric counterpart to {@link addCanActivate}.\n */\n addCanDeactivate(\n name: string,\n handler: GuardFnFactory<Dependencies> | boolean,\n isFromDefinition = false,\n ): void {\n this.#registerHandler(\n \"deactivate\",\n name,\n handler,\n isFromDefinition,\n \"canDeactivate\",\n );\n }\n\n /**\n * Removes a canActivate guard for a route.\n *\n * @param name - Route name (already validated by facade)\n * @param origin - Optional origin filter. `\"definition\"` clears only the\n * definition slot; `\"external\"` clears only the external slot; omitted\n * (default) clears both — backward compatible with pre-refactor semantics.\n */\n clearCanActivate(name: string, origin?: GuardOrigin): void {\n let cleared = false;\n\n if (origin !== \"external\") {\n cleared = this.#definitionActivateFactories.delete(name) || cleared;\n }\n\n if (origin !== \"definition\") {\n cleared = this.#externalActivateFactories.delete(name) || cleared;\n }\n\n if (cleared) {\n this.#recompileSlot(\"activate\", name);\n }\n }\n\n /**\n * Removes a canDeactivate guard for a route.\n *\n * Symmetric counterpart to {@link clearCanActivate}.\n */\n clearCanDeactivate(name: string, origin?: GuardOrigin): void {\n let cleared = false;\n\n if (origin !== \"external\") {\n cleared = this.#definitionDeactivateFactories.delete(name) || cleared;\n }\n\n if (origin !== \"definition\") {\n cleared = this.#externalDeactivateFactories.delete(name) || cleared;\n }\n\n if (cleared) {\n this.#recompileSlot(\"deactivate\", name);\n }\n }\n\n /**\n * Clears all lifecycle handlers (canActivate and canDeactivate).\n * Used by clearRoutes to reset all lifecycle state.\n */\n clearAll(): void {\n this.#definitionActivateFactories.clear();\n this.#externalActivateFactories.clear();\n this.#definitionDeactivateFactories.clear();\n this.#externalDeactivateFactories.clear();\n this.#canActivateFunctions.clear();\n this.#canDeactivateFunctions.clear();\n }\n\n /**\n * Clears only lifecycle handlers that were registered from route definitions.\n * Used by HMR `replace()` to remove definition-sourced guards without\n * touching externally-added guards.\n *\n * For slots where both definition and external exist, the external factory\n * stays and the compiled function is unchanged (external already won at\n * registration time). For definition-only slots, the compiled function is\n * dropped.\n */\n clearDefinitionGuards(): void {\n for (const name of this.#definitionActivateFactories.keys()) {\n if (!this.#externalActivateFactories.has(name)) {\n this.#canActivateFunctions.delete(name);\n }\n }\n\n for (const name of this.#definitionDeactivateFactories.keys()) {\n if (!this.#externalDeactivateFactories.has(name)) {\n this.#canDeactivateFunctions.delete(name);\n }\n }\n\n this.#definitionActivateFactories.clear();\n this.#definitionDeactivateFactories.clear();\n }\n\n /**\n * Returns lifecycle factories as a flat `[deactivate, activate]` tuple of\n * `Record<name, factory>` — the effective view where external wins over\n * definition for the same slot. Used by `getRoutesApi` to enrich route\n * objects with their current canActivate / canDeactivate factories and by\n * the route-removal cleanup path.\n *\n * For cloneRouter (which needs to preserve origin on re-registration), use\n * {@link getFactoriesByOrigin} instead.\n */\n getFactories(): [\n Record<string, GuardFnFactory<Dependencies>>,\n Record<string, GuardFnFactory<Dependencies>>,\n ] {\n const deactivateRecord: Record<string, GuardFnFactory<Dependencies>> = {};\n const activateRecord: Record<string, GuardFnFactory<Dependencies>> = {};\n\n for (const [name, factory] of this.#definitionDeactivateFactories) {\n deactivateRecord[name] = factory;\n }\n for (const [name, factory] of this.#externalDeactivateFactories) {\n deactivateRecord[name] = factory;\n }\n\n for (const [name, factory] of this.#definitionActivateFactories) {\n activateRecord[name] = factory;\n }\n for (const [name, factory] of this.#externalActivateFactories) {\n activateRecord[name] = factory;\n }\n\n return [deactivateRecord, activateRecord];\n }\n\n /**\n * Returns factories tagged by origin — definition and external as separate\n * `[deactivate, activate]` tuples. Used by `cloneRouter` to re-register\n * guards on the clone with their original origin flag preserved.\n */\n getFactoriesByOrigin(): {\n definition: [\n Record<string, GuardFnFactory<Dependencies>>,\n Record<string, GuardFnFactory<Dependencies>>,\n ];\n external: [\n Record<string, GuardFnFactory<Dependencies>>,\n Record<string, GuardFnFactory<Dependencies>>,\n ];\n } {\n const defDeact: Record<string, GuardFnFactory<Dependencies>> = {};\n const defAct: Record<string, GuardFnFactory<Dependencies>> = {};\n const extensionDeact: Record<string, GuardFnFactory<Dependencies>> = {};\n const extensionAct: Record<string, GuardFnFactory<Dependencies>> = {};\n\n for (const [name, factory] of this.#definitionDeactivateFactories) {\n defDeact[name] = factory;\n }\n for (const [name, factory] of this.#definitionActivateFactories) {\n defAct[name] = factory;\n }\n for (const [name, factory] of this.#externalDeactivateFactories) {\n extensionDeact[name] = factory;\n }\n for (const [name, factory] of this.#externalActivateFactories) {\n extensionAct[name] = factory;\n }\n\n return {\n definition: [defDeact, defAct],\n external: [extensionDeact, extensionAct],\n };\n }\n\n /**\n * Returns compiled lifecycle functions for transition execution.\n *\n * @returns Tuple of [canDeactivateFunctions, canActivateFunctions] as Maps\n */\n getFunctions(): [Map<string, GuardFn>, Map<string, GuardFn>] {\n return this.#functionsTuple;\n }\n\n canNavigateTo(\n toDeactivate: string[],\n toActivate: string[],\n toState: State,\n fromState: State | undefined,\n ): boolean {\n for (const segment of toDeactivate) {\n if (\n !this.#checkGuardSync(\n this.#canDeactivateFunctions,\n segment,\n toState,\n fromState,\n \"canNavigateTo\",\n )\n ) {\n return false;\n }\n }\n\n for (const segment of toActivate) {\n if (\n !this.#checkGuardSync(\n this.#canActivateFunctions,\n segment,\n toState,\n fromState,\n \"canNavigateTo\",\n )\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n // =========================================================================\n // Private methods (business logic)\n // =========================================================================\n\n /**\n * Routes a registration into the origin-specific factory Map and compiles\n * the just-added factory (last add wins for the compiled function).\n * Emits overwrite / threshold warnings symmetric with the pre-refactor\n * single-Map behaviour: any prior entry for the slot — same origin or\n * cross-origin — counts as an overwrite for the warning surface; only a\n * brand-new slot (no entry in either Map) increments the threshold check.\n */\n #registerHandler(\n type: \"activate\" | \"deactivate\",\n name: string,\n handler: GuardFnFactory<Dependencies> | boolean,\n isFromDefinition: boolean,\n methodName: string,\n ): void {\n const factoryMaps = this.#getFactoryMaps(type);\n const functions =\n type === \"activate\"\n ? this.#canActivateFunctions\n : this.#canDeactivateFunctions;\n const targetMap = isFromDefinition\n ? factoryMaps.definition\n : factoryMaps.external;\n const otherMap = isFromDefinition\n ? factoryMaps.external\n : factoryMaps.definition;\n\n const isOverwrite = targetMap.has(name) || otherMap.has(name);\n\n if (isOverwrite) {\n this.#getValidator?.()?.lifecycle.warnOverwrite(name, type, methodName);\n } else {\n this.#getValidator?.()?.lifecycle.validateCountThresholds(\n this.getHandlerCount(type) + 1,\n methodName,\n );\n }\n\n const factory =\n typeof handler === \"boolean\"\n ? booleanToFactory<Dependencies>(handler)\n : handler;\n\n targetMap.set(name, factory);\n\n // Mark route as being registered before calling user factory\n this.#registering.add(name);\n\n try {\n const fn = this.#deps.compileFactory(factory);\n\n if (typeof fn !== \"function\") {\n throw new TypeError(\n `[router.${methodName}] Factory must return a function, got ${typeof fn}`,\n );\n }\n\n functions.set(name, fn);\n } catch (error) {\n // Rollback the slot we just touched to keep storage consistent. If a\n // cross-origin entry exists for the same name, its compiled function\n // remains in place — recompile so navigation still sees a valid guard.\n targetMap.delete(name);\n\n if (otherMap.has(name)) {\n this.#recompileSlot(type, name);\n } else {\n functions.delete(name);\n }\n\n throw error;\n } finally {\n this.#registering.delete(name);\n }\n }\n\n /**\n * Recompiles the compiled-function slot from whichever origin Map still has\n * an entry for `name` after a clear. External wins over definition; if\n * neither has an entry, the compiled function is deleted.\n */\n #recompileSlot(type: \"activate\" | \"deactivate\", name: string): void {\n const factoryMaps = this.#getFactoryMaps(type);\n const functions =\n type === \"activate\"\n ? this.#canActivateFunctions\n : this.#canDeactivateFunctions;\n\n const effective =\n factoryMaps.external.get(name) ?? factoryMaps.definition.get(name);\n\n if (!effective) {\n functions.delete(name);\n\n return;\n }\n\n try {\n const fn = this.#deps.compileFactory(effective);\n\n /* v8 ignore next 4 -- @preserve: stored factories were validated at add time, compileFactory should yield a function on second call too */\n if (typeof fn !== \"function\") {\n functions.delete(name);\n\n return;\n }\n\n functions.set(name, fn);\n } catch {\n /* v8 ignore next 2 -- @preserve: defensive — a user-provided factory could theoretically throw on re-compile (state changed since add time); deleting the function blocks navigation on that slot */\n functions.delete(name);\n }\n }\n\n #getFactoryMaps(type: \"activate\" | \"deactivate\"): {\n definition: Map<string, GuardFnFactory<Dependencies>>;\n external: Map<string, GuardFnFactory<Dependencies>>;\n } {\n return type === \"activate\"\n ? {\n definition: this.#definitionActivateFactories,\n external: this.#externalActivateFactories,\n }\n : {\n definition: this.#definitionDeactivateFactories,\n external: this.#externalDeactivateFactories,\n };\n }\n\n /**\n * Shared implementation for synchronous guard checks.\n * Warns if a guard returns a Promise (async guards are not supported in sync mode).\n * Catches exceptions and treats them as navigation-blocking (`false`).\n *\n * @param functions - Map of compiled guard functions to look up\n * @param name - Route name to check the guard for\n * @param toState - Target navigation state\n * @param fromState - Current state (`undefined` on initial navigation)\n * @param methodName - Public API method name for warning messages\n */\n #checkGuardSync(\n functions: Map<string, GuardFn>,\n name: string,\n toState: State,\n fromState: State | undefined,\n methodName: string,\n ): boolean {\n const guardFn = functions.get(name);\n\n if (!guardFn) {\n return true;\n }\n\n try {\n const result = guardFn(toState, fromState);\n\n if (typeof result === \"boolean\") {\n return result;\n }\n\n this.#getValidator?.()?.lifecycle.warnAsyncGuardSync(name, methodName);\n\n return false;\n } catch {\n return false;\n }\n }\n}\n","// packages/core/src/namespaces/RoutesNamespace/helpers.ts\n\nimport type { RouteConfig } from \"./types\";\nimport type { Route } from \"../../types\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Params,\n} from \"@real-router/types\";\nimport type { RouteDefinition } from \"route-tree\";\n\n/**\n * Creates an empty RouteConfig.\n */\nexport function createEmptyConfig(): RouteConfig {\n return {\n decoders: Object.create(null) as Record<string, (params: Params) => Params>,\n encoders: Object.create(null) as Record<string, (params: Params) => Params>,\n defaultParams: Object.create(null) as Record<string, Params>,\n forwardMap: Object.create(null) as Record<string, string>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n forwardFnMap: Object.create(null) as Record<string, ForwardToCallback<any>>,\n };\n}\n\n// ============================================================================\n// Route Tree Helpers\n// ============================================================================\n\n/**\n * Checks if all params from source exist with same values in target.\n * Small function body allows V8 inlining.\n */\nexport function paramsMatch(source: Params, target: Params): boolean {\n for (const key in source) {\n if (source[key] !== target[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks params match, skipping keys present in skipKeys.\n */\nexport function paramsMatchExcluding(\n source: Params,\n target: Params,\n skipKeys: Params,\n): boolean {\n for (const key in source) {\n if (key in skipKeys) {\n continue;\n }\n if (source[key] !== target[key]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a copy of `defaultParams` with query-typed keys removed, based on\n * `ownMeta` (the per-route paramTypeMap from the matcher). When no query keys\n * are present, returns the input by reference (zero-allocation fast path).\n *\n * `ownMeta` may be `undefined` for non-registered route names — this is the\n * caller's escape hatch (e.g. `getMetaByName(name)?.[name]`); a missing meta\n * means no query type information is available, so defaults pass through\n * unchanged.\n */\nexport function stripQueryDefaults(\n defaultParams: Params,\n ownMeta: Record<string, \"url\" | \"query\"> | undefined,\n): Params {\n if (!ownMeta || !hasQueryDefault(defaultParams, ownMeta)) {\n return defaultParams;\n }\n\n const filtered: Params = {};\n\n for (const key in defaultParams) {\n if (ownMeta[key] !== \"query\") {\n filtered[key] = defaultParams[key];\n }\n }\n\n return filtered;\n}\n\nfunction hasQueryDefault(\n defaultParams: Params,\n ownMeta: Record<string, \"url\" | \"query\">,\n): boolean {\n for (const key in defaultParams) {\n if (ownMeta[key] === \"query\") {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Sanitizes a route by keeping only essential properties.\n */\nexport function sanitizeRoute<Dependencies extends DefaultDependencies>(\n route: Route<Dependencies>,\n): RouteDefinition {\n const sanitized: RouteDefinition = {\n name: route.name,\n path: route.path,\n };\n\n if (route.children) {\n sanitized.children = route.children.map((child) => sanitizeRoute(child));\n }\n\n return sanitized;\n}\n\n/**\n * Recursively removes a route from definitions array.\n */\nexport function removeFromDefinitions(\n definitions: RouteDefinition[],\n routeName: string,\n parentPrefix = \"\",\n): boolean {\n for (let i = 0; i < definitions.length; i++) {\n const route = definitions[i];\n const fullName = parentPrefix\n ? `${parentPrefix}.${route.name}`\n : route.name;\n\n if (fullName === routeName) {\n definitions.splice(i, 1);\n\n return true;\n }\n\n if (\n route.children &&\n routeName.startsWith(`${fullName}.`) &&\n removeFromDefinitions(route.children, routeName, fullName)\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Clears configuration entries that match the predicate.\n */\nexport function clearConfigEntries<T>(\n config: Record<string, T>,\n matcher: (key: string) => boolean,\n): void {\n for (const key of Object.keys(config)) {\n if (matcher(key)) {\n delete config[key];\n }\n }\n}\n\n/**\n * Used by matchPath() when trailingSlash is \"preserve\": the matcher's\n * buildPath() with an unset trailingSlash mode strips trailing slashes,\n * but \"preserve\" means the source path's trailing-slash choice wins.\n * If the source had a trailing slash, re-attach it to the rewritten path.\n * The reverse case (rewritten has trailing, source does not) is not\n * reachable with the current matcher — it never adds a trailing slash\n * with undefined mode.\n */\nexport function matchSourceTrailingSlash(\n sourcePath: string,\n rewrittenPath: string,\n): string {\n const queryIndex = rewrittenPath.search(/[?#]/);\n const pathPart =\n queryIndex === -1 ? rewrittenPath : rewrittenPath.slice(0, queryIndex);\n\n if (pathPart === \"/\" || pathPart.endsWith(\"/\")) {\n return rewrittenPath;\n }\n\n const sourceQueryIndex = sourcePath.search(/[?#]/);\n const sourcePathPart =\n sourceQueryIndex === -1\n ? sourcePath\n : sourcePath.slice(0, sourceQueryIndex);\n\n if (!(sourcePathPart.length > 1 && sourcePathPart.endsWith(\"/\"))) {\n return rewrittenPath;\n }\n\n const querySuffix = queryIndex === -1 ? \"\" : rewrittenPath.slice(queryIndex);\n\n return `${pathPart}/${querySuffix}`;\n}\n","// packages/core/src/namespaces/RoutesNamespace/forwardChain.ts\n\nexport function resolveForwardChain(\n startRoute: string,\n forwardMap: Record<string, string>,\n maxDepth = 100,\n): string {\n const visited = new Set<string>();\n const chain: string[] = [startRoute];\n let current = startRoute;\n\n while (forwardMap[current]) {\n const next = forwardMap[current];\n\n if (visited.has(next)) {\n const cycleStart = chain.indexOf(next);\n const cycle = [...chain.slice(cycleStart), next];\n\n throw new Error(`Circular forwardTo: ${cycle.join(\" → \")}`);\n }\n\n visited.add(current);\n chain.push(next);\n current = next;\n\n if (chain.length > maxDepth) {\n throw new Error(\n `forwardTo chain exceeds maximum depth (${maxDepth}): ${chain.join(\" → \")}`,\n );\n }\n }\n\n return current;\n}\n","// packages/core/src/namespaces/RoutesNamespace/routesStore.ts\n\nimport { logger } from \"@real-router/logger\";\nimport { createMatcher, createRouteTree, nodeToDefinition } from \"route-tree\";\n\nimport { DEFAULT_ROUTE_NAME } from \"./constants\";\nimport { resolveForwardChain } from \"./forwardChain\";\nimport { createEmptyConfig, sanitizeRoute } from \"./helpers\";\n\nimport type { RouteConfig, RoutesDependencies } from \"./types\";\nimport type { GuardFnFactory, Route } from \"../../types\";\nimport type { RouteLifecycleNamespace } from \"../RouteLifecycleNamespace\";\nimport type { DefaultDependencies, Params } from \"@real-router/types\";\nimport type {\n CreateMatcherOptions,\n Matcher,\n RouteDefinition,\n RouteTree,\n} from \"route-tree\";\n\n// =============================================================================\n// Interfaces\n// =============================================================================\n\nexport interface RoutesStore<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly definitions: RouteDefinition[];\n readonly config: RouteConfig;\n tree: RouteTree;\n matcher: Matcher;\n resolvedForwardMap: Record<string, string>;\n routeCustomFields: Record<string, Record<string, unknown>>;\n rootPath: string;\n readonly matcherOptions: CreateMatcherOptions | undefined;\n depsStore: RoutesDependencies<Dependencies> | undefined;\n lifecycleNamespace: RouteLifecycleNamespace<Dependencies> | undefined;\n readonly pendingCanActivate: Map<string, GuardFnFactory<Dependencies>>;\n readonly pendingCanDeactivate: Map<string, GuardFnFactory<Dependencies>>;\n readonly treeOperations: {\n readonly commitTreeChanges: (store: RoutesStore<Dependencies>) => void;\n readonly resetStore: (store: RoutesStore<Dependencies>) => void;\n readonly nodeToDefinition: (node: RouteTree) => RouteDefinition;\n };\n}\n\n// =============================================================================\n// Tree operations\n// =============================================================================\n\nfunction rebuildTree(\n definitions: RouteDefinition[],\n rootPath: string,\n matcherOptions: CreateMatcherOptions | undefined,\n): { tree: RouteTree; matcher: Matcher } {\n const tree = createRouteTree(DEFAULT_ROUTE_NAME, rootPath, definitions);\n const matcher = createMatcher(matcherOptions);\n\n matcher.registerTree(tree);\n\n return { tree, matcher };\n}\n\nexport function rebuildTreeInPlace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(store: RoutesStore<Dependencies>): void {\n const result = rebuildTree(\n store.definitions,\n store.rootPath,\n store.matcherOptions,\n );\n\n store.tree = result.tree;\n store.matcher = result.matcher;\n}\n\nexport function commitTreeChanges<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(store: RoutesStore<Dependencies>): void {\n rebuildTreeInPlace(store);\n store.resolvedForwardMap = refreshForwardMap(store.config);\n}\n\n// =============================================================================\n// Store reset\n// =============================================================================\n\n/**\n * Clears all routes and resets config.\n * Does NOT clear lifecycle handlers or state — caller handles that.\n */\nexport function resetStore<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(store: RoutesStore<Dependencies>): void {\n clearRouteData(store);\n rebuildTreeInPlace(store);\n}\n\n/**\n * Clears route data without rebuilding the tree.\n * Used by replace() to avoid double rebuild (clearRouteData + commitTreeChanges).\n */\nexport function clearRouteData<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(store: RoutesStore<Dependencies>): void {\n store.definitions.length = 0;\n\n Object.assign(store.config, createEmptyConfig());\n\n store.resolvedForwardMap = Object.create(null) as Record<string, string>;\n store.routeCustomFields = Object.create(null) as Record<\n string,\n Record<string, unknown>\n >;\n}\n\n// =============================================================================\n// Forward map\n// =============================================================================\n\nexport function refreshForwardMap(config: RouteConfig): Record<string, string> {\n const map = Object.create(null) as Record<string, string>;\n\n for (const fromRoute of Object.keys(config.forwardMap)) {\n map[fromRoute] = resolveForwardChain(fromRoute, config.forwardMap);\n }\n\n return map;\n}\n\n// =============================================================================\n// Route handler registration\n// =============================================================================\n\nfunction registerForwardTo<Dependencies extends DefaultDependencies>(\n route: Route<Dependencies>,\n fullName: string,\n config: RouteConfig,\n): void {\n if (route.canActivate) {\n /* v8 ignore next -- @preserve: edge case, both string and function tested separately */\n const forwardTarget =\n typeof route.forwardTo === \"string\" ? route.forwardTo : \"[dynamic]\";\n\n logger.warn(\n \"real-router\",\n `Route \"${fullName}\" has both forwardTo and canActivate. ` +\n `canActivate will be ignored because forwardTo creates a redirect (industry standard). ` +\n `Move canActivate to the target route \"${forwardTarget}\".`,\n );\n }\n\n if (route.canDeactivate) {\n /* v8 ignore next -- @preserve: edge case, both string and function tested separately */\n const forwardTarget =\n typeof route.forwardTo === \"string\" ? route.forwardTo : \"[dynamic]\";\n\n logger.warn(\n \"real-router\",\n `Route \"${fullName}\" has both forwardTo and canDeactivate. ` +\n `canDeactivate will be ignored because forwardTo creates a redirect (industry standard). ` +\n `Move canDeactivate to the target route \"${forwardTarget}\".`,\n );\n }\n\n if (typeof route.forwardTo === \"function\") {\n const isNativeAsync =\n (route.forwardTo as { constructor: { name: string } }).constructor\n .name === \"AsyncFunction\";\n const isTranspiledAsync = route.forwardTo.toString().includes(\"__awaiter\");\n\n if (isNativeAsync || isTranspiledAsync) {\n throw new TypeError(\n `forwardTo callback cannot be async for route \"${fullName}\". ` +\n `Async functions break matchPath/buildPath.`,\n );\n }\n }\n\n // forwardTo is guaranteed to exist at this point\n if (typeof route.forwardTo === \"string\") {\n config.forwardMap[fullName] = route.forwardTo;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n config.forwardFnMap[fullName] = route.forwardTo!;\n }\n}\n\nfunction registerSingleRouteHandlers<Dependencies extends DefaultDependencies>(\n route: Route<Dependencies>,\n fullName: string,\n config: RouteConfig,\n routeCustomFields: Record<string, Record<string, unknown>>,\n pendingCanActivate: Map<string, GuardFnFactory<Dependencies>>,\n pendingCanDeactivate: Map<string, GuardFnFactory<Dependencies>>,\n depsStore: RoutesDependencies<Dependencies> | undefined,\n): void {\n const standardKeys = new Set([\n \"name\",\n \"path\",\n \"children\",\n \"canActivate\",\n \"canDeactivate\",\n \"forwardTo\",\n \"encodeParams\",\n \"decodeParams\",\n \"defaultParams\",\n ]);\n const customFields = Object.fromEntries(\n Object.entries(route).filter(([key]) => !standardKeys.has(key)),\n );\n\n if (Object.keys(customFields).length > 0) {\n routeCustomFields[fullName] = customFields;\n }\n\n if (route.canActivate) {\n if (depsStore) {\n depsStore.addActivateGuard(fullName, route.canActivate);\n } else {\n pendingCanActivate.set(fullName, route.canActivate);\n }\n }\n\n if (route.canDeactivate) {\n if (depsStore) {\n depsStore.addDeactivateGuard(fullName, route.canDeactivate);\n } else {\n pendingCanDeactivate.set(fullName, route.canDeactivate);\n }\n }\n\n if (route.forwardTo) {\n registerForwardTo(route, fullName, config);\n }\n\n if (route.decodeParams) {\n config.decoders[fullName] = (params: Params): Params =>\n route.decodeParams?.(params) ?? params;\n }\n\n if (route.encodeParams) {\n config.encoders[fullName] = (params: Params): Params =>\n route.encodeParams?.(params) ?? params;\n }\n\n if (route.defaultParams) {\n config.defaultParams[fullName] = route.defaultParams;\n }\n}\n\nexport function registerAllRouteHandlers<\n Dependencies extends DefaultDependencies,\n>(\n routes: readonly Route<Dependencies>[],\n config: RouteConfig,\n routeCustomFields: Record<string, Record<string, unknown>>,\n pendingCanActivate: Map<string, GuardFnFactory<Dependencies>>,\n pendingCanDeactivate: Map<string, GuardFnFactory<Dependencies>>,\n depsStore: RoutesDependencies<Dependencies> | undefined,\n parentName = \"\",\n): void {\n for (const route of routes) {\n const fullName = parentName ? `${parentName}.${route.name}` : route.name;\n\n registerSingleRouteHandlers(\n route,\n fullName,\n config,\n routeCustomFields,\n pendingCanActivate,\n pendingCanDeactivate,\n depsStore,\n );\n\n if (route.children) {\n registerAllRouteHandlers(\n route.children,\n config,\n routeCustomFields,\n pendingCanActivate,\n pendingCanDeactivate,\n depsStore,\n fullName,\n );\n }\n }\n}\n\n// =============================================================================\n// Factory\n// =============================================================================\n\nexport function createRoutesStore<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routes: Route<Dependencies>[],\n matcherOptions?: CreateMatcherOptions,\n): RoutesStore<Dependencies> {\n const definitions: RouteDefinition[] = [];\n const config: RouteConfig = createEmptyConfig();\n const routeCustomFields: Record<\n string,\n Record<string, unknown>\n > = Object.create(null) as Record<string, Record<string, unknown>>;\n const pendingCanActivate = new Map<string, GuardFnFactory<Dependencies>>();\n const pendingCanDeactivate = new Map<string, GuardFnFactory<Dependencies>>();\n\n for (const route of routes) {\n definitions.push(sanitizeRoute(route));\n }\n\n const { tree, matcher } = rebuildTree(definitions, \"\", matcherOptions);\n\n registerAllRouteHandlers(\n routes,\n config,\n routeCustomFields,\n pendingCanActivate,\n pendingCanDeactivate,\n undefined,\n \"\",\n );\n\n const resolvedForwardMap = refreshForwardMap(config);\n\n return {\n definitions,\n config,\n tree,\n matcher,\n resolvedForwardMap,\n routeCustomFields,\n rootPath: \"\",\n matcherOptions,\n depsStore: undefined,\n lifecycleNamespace: undefined,\n pendingCanActivate,\n pendingCanDeactivate,\n treeOperations: {\n commitTreeChanges,\n resetStore,\n nodeToDefinition,\n },\n };\n}\n","// packages/core/src/transitionPath.ts\n\nimport { getStateMetaParams } from \"./stateMetaStore\";\n\nimport type { State } from \"@real-router/types\";\n\n/**\n * Parameters extracted from a route segment.\n * Maps parameter names to their string values.\n */\ntype PrimitiveParam = string | number | boolean;\n\n/**\n * Represents a transition path between two router states.\n * Contains information about which route segments need to be activated/deactivated.\n */\nexport interface TransitionPath {\n /** The common ancestor route segment where paths diverge */\n intersection: string;\n /** Route segments that need to be deactivated (in reverse order) */\n toDeactivate: string[];\n /** Route segments that need to be activated (in order) */\n toActivate: string[];\n}\n\n// Constants for better maintainability\nconst ROUTE_SEGMENT_SEPARATOR = \".\";\nconst EMPTY_INTERSECTION = \"\";\nconst DEFAULT_ROUTE_NAME = \"\";\nconst FROZEN_EMPTY_ARRAY: string[] = [];\n\nObject.freeze(FROZEN_EMPTY_ARRAY);\n\n/**\n * Builds a reversed copy of a string array.\n * Optimization: single pass instead of creating intermediate array with .toReversed().\n *\n * @param arr - Source array\n * @returns New array with elements in reverse order\n * @internal\n */\nfunction reverseArray(arr: string[]): string[] {\n const length = arr.length;\n const result: string[] = [];\n\n for (let i = length - 1; i >= 0; i--) {\n result.push(arr[i]);\n }\n\n return result;\n}\n\n/**\n * Handles conversion of route names with many segments (5+).\n * Internal helper for nameToIDs function.\n *\n * Uses optimized hybrid approach: split to get segments, then slice original\n * string to build cumulative paths. This approach is 65-81% faster than\n * string concatenation for typical cases (5-10 segments).\n *\n * @param name - Route name with 5 or more segments\n * @returns Array of cumulative segment IDs\n * @throws {Error} If route depth exceeds maximum allowed\n * @internal\n */\nfunction nameToIDsGeneral(name: string): string[] {\n // We know there are at least 5 segments at this point (after fast paths)\n const segments = name.split(ROUTE_SEGMENT_SEPARATOR);\n const segmentCount = segments.length;\n\n // First segment is always just itself\n const ids: string[] = [segments[0]];\n\n // Calculate cumulative lengths and slice from original string\n // This avoids repeated string concatenation (O(k²) → O(k))\n let cumulativeLength = segments[0].length;\n\n for (let i = 1; i < segmentCount - 1; i++) {\n cumulativeLength += 1 + segments[i].length; // +1 for dot separator\n ids.push(name.slice(0, cumulativeLength));\n }\n\n // Last segment is always the full route name\n ids.push(name);\n\n return ids;\n}\n\nfunction isPrimitive(value: unknown): value is PrimitiveParam {\n const type = typeof value;\n\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\n/**\n * Compares segment parameters between two states without creating intermediate objects.\n * Returns true if all primitive params for the given segment are equal in both states.\n */\nfunction segmentParamsEqual(\n name: string,\n toMetaParams: Record<string, unknown>,\n toState: State,\n fromState: State,\n): boolean {\n const keys = toMetaParams[name];\n\n if (!keys || typeof keys !== \"object\") {\n return true;\n }\n\n for (const key of Object.keys(keys)) {\n const toVal = toState.params[key];\n const fromVal = fromState.params[key];\n\n if (\n isPrimitive(toVal) &&\n isPrimitive(fromVal) &&\n String(toVal) !== String(fromVal)\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Finds the point where two state paths diverge based on segments and parameters.\n * Compares both segment names and their parameters to find the first difference.\n *\n * @param toMetaParams - Cached meta.params from toState (avoids per-segment WeakMap lookup)\n * @param toState - Target state\n * @param fromState - Source state\n * @param toStateIds - Segment IDs for target state\n * @param fromStateIds - Segment IDs for source state\n * @param maxI - Maximum index to check (minimum of both arrays)\n * @returns Index of first difference, or maxI if all checked segments match\n */\nfunction pointOfDifference(\n toMetaParams: Record<string, unknown>,\n toState: State,\n fromState: State,\n toStateIds: string[],\n fromStateIds: string[],\n maxI: number,\n): number {\n for (let i = 0; i < maxI; i++) {\n const toSegment = toStateIds[i];\n const fromSegment = fromStateIds[i];\n\n // Different segment names - immediate difference\n if (toSegment !== fromSegment) {\n return i;\n }\n\n if (!segmentParamsEqual(toSegment, toMetaParams, toState, fromState)) {\n return i;\n }\n }\n\n return maxI;\n}\n\n/**\n * Converts a route name to an array of hierarchical segment identifiers.\n * Each segment ID includes all parent segments in the path.\n *\n * @param name - Route name in dot notation (e.g., 'users.profile.edit')\n * @returns Array of cumulative segment IDs\n * @throws {Error} If route depth exceeds maximum allowed depth\n *\n * @example\n * // Simple route\n * nameToIDs('users');\n * // Returns: ['users']\n *\n * @example\n * // Nested route\n * nameToIDs('users.profile.edit');\n * // Returns: ['users', 'users.profile', 'users.profile.edit']\n *\n * @example\n * // Empty string (root route)\n * nameToIDs('');\n * // Returns: ['']\n *\n * @remarks\n * Input parameter is NOT validated in this function for performance reasons.\n * Validation significantly slows down nameToIDs execution.\n * The input should be validated by the function/method that calls nameToIDs.\n */\nconst nameToIDsCache = new Map<string, string[]>();\n\nexport function nameToIDs(name: string): string[] {\n const cached = nameToIDsCache.get(name);\n\n if (cached) {\n return cached;\n }\n\n const result = computeNameToIDs(name);\n\n Object.freeze(result);\n nameToIDsCache.set(name, result);\n\n return result;\n}\n\nfunction computeNameToIDs(name: string): string[] {\n if (!name) {\n return [DEFAULT_ROUTE_NAME];\n }\n\n const firstDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR);\n\n if (firstDot === -1) {\n return [name];\n }\n\n const secondDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR, firstDot + 1);\n\n if (secondDot === -1) {\n return [name.slice(0, firstDot), name];\n }\n\n const thirdDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR, secondDot + 1);\n\n if (thirdDot === -1) {\n return [name.slice(0, firstDot), name.slice(0, secondDot), name];\n }\n\n const fourthDot = name.indexOf(ROUTE_SEGMENT_SEPARATOR, thirdDot + 1);\n\n if (fourthDot === -1) {\n return [\n name.slice(0, firstDot),\n name.slice(0, secondDot),\n name.slice(0, thirdDot),\n name,\n ];\n }\n\n return nameToIDsGeneral(name);\n}\n\n/**\n * Calculates the transition path between two router states.\n * Determines which route segments need to be deactivated and activated\n * to transition from one state to another.\n *\n * @param toState - Target state to transition to\n * @param fromState - Current state to transition from (optional)\n * @returns Transition path with intersection and segments to activate/deactivate\n *\n * @throws {TypeError} When toState is null or undefined\n * @throws {TypeError} When toState is not an object\n * @throws {TypeError} When toState.name is missing or not a string\n * @throws {TypeError} When toState.params is missing or not an object\n * @throws {TypeError} When toState.path is missing or not a string\n * @throws {TypeError} When toState.name contains invalid route format:\n * - Contains only whitespace (e.g., \" \")\n * - Has consecutive dots (e.g., \"users..profile\")\n * - Has leading/trailing dots (e.g., \".users\" or \"users.\")\n * - Segments don't match pattern [a-zA-Z_][a-zA-Z0-9_-]* (e.g., \"users.123\")\n * - Contains spaces or special characters (e.g., \"users profile\")\n * - Exceeds maximum length (8192 characters)\n * @throws {TypeError} When fromState is provided and has any of the validation errors listed above for toState\n *\n * @example\n * // ✅ Valid calls\n * getTransitionPath({ name: 'users.profile', params: {}, path: '/users/profile' });\n * getTransitionPath(toState, fromState);\n * getTransitionPath({ name: '', params: {}, path: '/' }); // root route\n *\n * @example\n * // ❌ Invalid calls that throw TypeError\n * getTransitionPath(null); // toState is null\n * getTransitionPath(undefined); // toState is undefined\n * getTransitionPath({}); // missing required fields\n * getTransitionPath({ name: 123, params: {}, path: '/' }); // name not a string\n * getTransitionPath({ name: 'home', path: '/' }); // missing params\n * getTransitionPath({ name: 'users..profile', params: {}, path: '/' }); // consecutive dots\n * getTransitionPath({ name: '.users', params: {}, path: '/' }); // leading dot\n * getTransitionPath({ name: 'users.', params: {}, path: '/' }); // trailing dot\n * getTransitionPath({ name: 'users profile', params: {}, path: '/' }); // contains space\n * getTransitionPath({ name: 'users.123', params: {}, path: '/' }); // segment starts with number\n * getTransitionPath(validToState, { name: 'invalid..route', params: {}, path: '/' }); // fromState invalid\n *\n * @example\n * // Full activation (no fromState)\n * getTransitionPath(makeState('users.profile'));\n * // Returns: {\n * // intersection: '',\n * // toActivate: ['users', 'users.profile'],\n * // toDeactivate: []\n * // }\n *\n * @example\n * // Partial transition with common ancestor\n * getTransitionPath(\n * makeState('users.profile'),\n * makeState('users.list')\n * );\n * // Returns: {\n * // intersection: 'users',\n * // toActivate: ['users.profile'],\n * // toDeactivate: ['users.list']\n * // }\n *\n * @example\n * // Complete route change\n * getTransitionPath(\n * makeState('admin.dashboard'),\n * makeState('users.profile')\n * );\n * // Returns: {\n * // intersection: '',\n * // toActivate: ['admin', 'admin.dashboard'],\n * // toDeactivate: ['users.profile', 'users']\n * // }\n */\n// Single-entry cache: shouldUpdateNode calls getTransitionPath N times per\n// navigation with the same state objects (once per subscribed node).\n// Cache by reference eliminates N-1 redundant computations.\nlet cached1To: State | undefined;\nlet cached1From: State | undefined;\nlet cached1Result: TransitionPath | null = null;\n\nlet cached2To: State | undefined;\nlet cached2From: State | undefined;\nlet cached2Result: TransitionPath | null = null;\n\nfunction computeTransitionPath(\n toState: State,\n fromState?: State,\n): TransitionPath {\n // ===== FAST PATH 1: Initial navigation (no fromState) =====\n // This is the best performing case in benchmarks (5M ops/sec)\n if (!fromState) {\n return {\n intersection: EMPTY_INTERSECTION,\n toActivate: nameToIDs(toState.name),\n toDeactivate: FROZEN_EMPTY_ARRAY,\n };\n }\n\n // ===== FAST PATH 3: Missing meta requires full reload =====\n // Single WeakMap lookup per state, reused in pointOfDifference/segmentParamsEqual\n const toMetaParams = getStateMetaParams(toState);\n const fromMetaParams = getStateMetaParams(fromState);\n\n if (!toMetaParams && !fromMetaParams) {\n return {\n intersection: EMPTY_INTERSECTION,\n toActivate: nameToIDs(toState.name),\n toDeactivate: reverseArray(nameToIDs(fromState.name)),\n };\n }\n\n // ===== STANDARD PATH: Routes with parameters =====\n const toStateIds = nameToIDs(toState.name);\n const fromStateIds = nameToIDs(fromState.name);\n const maxI = Math.min(fromStateIds.length, toStateIds.length);\n\n const i = pointOfDifference(\n (toMetaParams ?? fromMetaParams) as Record<string, unknown>,\n toState,\n fromState,\n toStateIds,\n fromStateIds,\n maxI,\n );\n\n // Optimization: Build deactivation list in reverse order directly\n // instead of slice(i).toReversed() which creates 2 arrays\n let toDeactivate: string[];\n\n if (i >= fromStateIds.length) {\n toDeactivate = FROZEN_EMPTY_ARRAY;\n } else if (i === 0 && fromStateIds.length === 1) {\n // Single-segment route: reversed = original, reuse cached frozen array\n toDeactivate = fromStateIds;\n } else {\n toDeactivate = [];\n\n for (let j = fromStateIds.length - 1; j >= i; j--) {\n toDeactivate.push(fromStateIds[j]);\n }\n }\n\n // Build activation list — reuse cached frozen array when using full list\n const toActivate = i === 0 ? toStateIds : toStateIds.slice(i);\n\n // Determine intersection point (common ancestor)\n const intersection = i > 0 ? fromStateIds[i - 1] : EMPTY_INTERSECTION;\n\n return {\n intersection,\n toDeactivate,\n toActivate,\n };\n}\n\nexport function getTransitionPath(\n toState: State,\n fromState?: State,\n): TransitionPath {\n if (\n cached1Result !== null &&\n toState === cached1To &&\n fromState === cached1From\n ) {\n return cached1Result;\n }\n\n /* v8 ignore next 6 -- @preserve: 2nd cache slot hit path exercised by alternating navigation benchmarks, not unit tests */\n if (\n cached2Result !== null &&\n toState === cached2To &&\n fromState === cached2From\n ) {\n return cached2Result;\n }\n\n const result = computeTransitionPath(toState, fromState);\n\n cached2To = cached1To;\n cached2From = cached1From;\n cached2Result = cached1Result;\n\n cached1To = toState;\n cached1From = fromState;\n cached1Result = result;\n\n return result;\n}\n","// packages/core/src/namespaces/RoutesNamespace/RoutesNamespace.ts\n\nimport { DEFAULT_ROUTE_NAME } from \"./constants\";\nimport {\n matchSourceTrailingSlash,\n paramsMatch,\n paramsMatchExcluding,\n stripQueryDefaults,\n} from \"./helpers\";\nimport {\n createRoutesStore,\n rebuildTreeInPlace,\n resetStore,\n} from \"./routesStore\";\nimport { constants, DEFAULT_TRANSITION } from \"../../constants\";\nimport { getTransitionPath } from \"../../transitionPath\";\n\nimport type { RoutesStore } from \"./routesStore\";\nimport type { RoutesDependencies } from \"./types\";\nimport type { Route } from \"../../types\";\nimport type { RouteLifecycleNamespace } from \"../RouteLifecycleNamespace\";\nimport type {\n DefaultDependencies,\n ForwardToCallback,\n Options,\n Params,\n State,\n} from \"@real-router/types\";\nimport type {\n CreateMatcherOptions,\n RouteParams,\n RouteTree,\n RouteTreeState,\n} from \"route-tree\";\n\nfunction collectUrlParamsArray(segments: readonly RouteTree[]): string[] {\n const params: string[] = [];\n\n for (const segment of segments) {\n for (const param of segment.paramMeta.urlParams) {\n params.push(param);\n }\n }\n\n return params;\n}\n\nexport function buildNameFromSegments(\n segments: readonly { fullName: string }[],\n): string {\n return segments.at(-1)?.fullName ?? \"\";\n}\n\nexport function createRouteState<P extends RouteParams = RouteParams>(\n matchResult: {\n readonly segments: readonly { fullName: string }[];\n readonly params: Readonly<Record<string, unknown>>;\n readonly meta: Readonly<Record<string, Record<string, \"url\" | \"query\">>>;\n },\n name?: string,\n): RouteTreeState<P> {\n const resolvedName = name ?? buildNameFromSegments(matchResult.segments);\n\n return {\n name: resolvedName,\n params: matchResult.params as P,\n meta: matchResult.meta,\n };\n}\n\ninterface CachedBuildPathOpts {\n readonly trailingSlash?: \"always\" | \"never\" | undefined;\n readonly queryParamsMode?: \"default\" | \"strict\" | \"loose\" | undefined;\n}\n\n/**\n * Independent namespace for managing routes.\n *\n * Static methods handle validation (called by facade).\n * Instance methods handle storage and business logic.\n */\nexport class RoutesNamespace<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n readonly #store: RoutesStore<Dependencies>;\n #cachedBuildPathOpts: CachedBuildPathOpts | undefined;\n\n get #deps(): RoutesDependencies<Dependencies> {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.#store.depsStore!;\n }\n\n constructor(\n routes: Route<Dependencies>[] = [],\n matcherOptions?: CreateMatcherOptions,\n ) {\n this.#store = createRoutesStore(routes, matcherOptions);\n }\n\n /**\n * Creates a predicate function to check if a route node should be updated.\n * Note: Argument validation is done by facade (Router.ts) via validateShouldUpdateNodeArgs.\n */\n static shouldUpdateNode(\n nodeName: string,\n ): (toState: State, fromState?: State) => boolean {\n return (toState: State, fromState?: State): boolean => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!(toState && typeof toState === \"object\" && \"name\" in toState)) {\n throw new TypeError(\n \"[router.shouldUpdateNode] toState must be valid State object\",\n );\n }\n\n if (toState.transition.reload) {\n return true;\n }\n\n // Root node (DEFAULT_ROUTE_NAME === \"\") has no route-level identity — it\n // represents \"any route\". It must update on every transition so that\n // consumers subscribed via useRouteNode(\"\") (including RouteView at\n // the top of the tree) see every change. This matches the documented\n // contract in adapter docs: `useRouteNode(\"\")` — Root — ALL route\n // changes. See #519 for the missed transitions it was suffering from\n // (users → users.user had intersection=\"users\", leaving the root node\n // un-updated under a flat <Match segment=\"users.user\" exact> pattern).\n if (nodeName === DEFAULT_ROUTE_NAME) {\n return true;\n }\n\n const { intersection, toActivate, toDeactivate } = getTransitionPath(\n toState,\n fromState,\n );\n\n if (nodeName === intersection) {\n return true;\n }\n\n if (toActivate.includes(nodeName)) {\n return true;\n }\n\n return toDeactivate.includes(nodeName);\n };\n }\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n /**\n * Sets dependencies and registers pending canActivate handlers.\n * canActivate handlers from initial routes are deferred until deps are set.\n */\n setDependencies(deps: RoutesDependencies<Dependencies>): void {\n this.#store.depsStore = deps;\n\n for (const [routeName, handler] of this.#store.pendingCanActivate) {\n deps.addActivateGuard(routeName, handler);\n }\n\n this.#store.pendingCanActivate.clear();\n\n for (const [routeName, handler] of this.#store.pendingCanDeactivate) {\n deps.addDeactivateGuard(routeName, handler);\n }\n\n this.#store.pendingCanDeactivate.clear();\n }\n\n /**\n * Sets the lifecycle namespace reference.\n */\n setLifecycleNamespace(\n namespace: RouteLifecycleNamespace<Dependencies> | undefined,\n ): void {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#store.lifecycleNamespace = namespace!;\n }\n\n // =========================================================================\n // Route tree operations\n // =========================================================================\n\n setRootPath(newRootPath: string): void {\n this.#store.rootPath = newRootPath;\n rebuildTreeInPlace(this.#store);\n }\n\n hasRoute(name: string): boolean {\n return this.#store.matcher.hasRoute(name);\n }\n\n clearRoutes(): void {\n resetStore(this.#store);\n }\n\n // =========================================================================\n // Path operations\n // =========================================================================\n\n /**\n * Builds a URL path for a route.\n * Note: Argument validation is done by facade (Router.ts) via validateBuildPathArgs.\n *\n * @param route - Route name\n * @param params - Route parameters\n * @param options - Router options\n */\n buildPath(route: string, params?: Params, options?: Options): string {\n if (route === constants.UNKNOWN_ROUTE) {\n return typeof params?.path === \"string\" ? params.path : \"\";\n }\n\n const paramsWithDefault = Object.hasOwn(\n this.#store.config.defaultParams,\n route,\n )\n ? { ...this.#store.config.defaultParams[route], ...params }\n : /* v8 ignore next -- @preserve: V8 can't track ?? branch in ternary; covered by buildPath tests without params */ (params ??\n {});\n\n const encodedParams =\n typeof this.#store.config.encoders[route] === \"function\"\n ? this.#store.config.encoders[route]({ ...paramsWithDefault })\n : paramsWithDefault;\n\n return this.#store.matcher.buildPath(\n route,\n encodedParams,\n this.#getBuildPathOptions(options),\n );\n }\n\n /**\n * Matches a URL path to a route in the tree.\n * Note: Argument validation is done by facade (Router.ts) via validateMatchPathArgs.\n */\n matchPath<P extends Params = Params>(\n path: string,\n options?: Options,\n ): State<P> | undefined {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Router.ts always passes options\n const opts = options!;\n\n const matchResult = this.#store.matcher.match(path);\n\n if (!matchResult) {\n return undefined;\n }\n\n const routeState = createRouteState(matchResult);\n const { name, params, meta } = routeState;\n\n const decodedParams =\n typeof this.#store.config.decoders[name] === \"function\"\n ? this.#store.config.decoders[name](params)\n : params;\n\n const { name: routeName, params: routeParams } = this.#deps.forwardState<P>(\n name,\n decodedParams as P,\n );\n\n let builtPath = path;\n\n if (opts.rewritePathOnMatch) {\n const buildParams =\n typeof this.#store.config.encoders[routeName] === \"function\"\n ? this.#store.config.encoders[routeName]({\n ...(routeParams as Params),\n })\n : (routeParams as Record<string, unknown>);\n\n const ts = opts.trailingSlash;\n\n builtPath = this.#store.matcher.buildPath(routeName, buildParams, {\n trailingSlash: ts === \"never\" || ts === \"always\" ? ts : undefined,\n queryParamsMode: opts.queryParamsMode,\n });\n\n if (ts === \"preserve\") {\n builtPath = matchSourceTrailingSlash(path, builtPath);\n }\n }\n\n return this.#deps.makeState<P>(routeName, routeParams, builtPath, meta);\n }\n\n /**\n * Applies forwardTo and returns resolved state with merged defaultParams.\n *\n * Merges params in order:\n * 1. Source route defaultParams\n * 2. Provided params\n * 3. Target route defaultParams (after resolving forwardTo)\n */\n forwardState<P extends Params = Params>(\n name: string,\n params: P,\n ): { name: string; params: P } {\n if (Object.hasOwn(this.#store.config.forwardFnMap, name)) {\n const paramsWithSourceDefaults = this.#mergeDefaultParams(name, params);\n const dynamicForward = this.#store.config.forwardFnMap[name];\n const resolved = this.#resolveDynamicForward(\n name,\n dynamicForward,\n params,\n );\n\n return {\n name: resolved,\n params: this.#mergeDefaultParams(resolved, paramsWithSourceDefaults),\n };\n }\n\n const staticForward = this.#store.resolvedForwardMap[name] ?? name;\n\n if (\n staticForward !== name &&\n Object.hasOwn(this.#store.config.forwardFnMap, staticForward)\n ) {\n const paramsWithSourceDefaults = this.#mergeDefaultParams(name, params);\n const targetDynamicForward =\n this.#store.config.forwardFnMap[staticForward];\n const resolved = this.#resolveDynamicForward(\n staticForward,\n targetDynamicForward,\n params,\n );\n\n return {\n name: resolved,\n params: this.#mergeDefaultParams(resolved, paramsWithSourceDefaults),\n };\n }\n\n if (staticForward !== name) {\n const paramsWithSourceDefaults = this.#mergeDefaultParams(name, params);\n\n return {\n name: staticForward,\n params: this.#mergeDefaultParams(\n staticForward,\n paramsWithSourceDefaults,\n ),\n };\n }\n\n return { name, params: this.#mergeDefaultParams(name, params) };\n }\n\n /**\n * Builds a RouteTreeState from already-resolved route name and params.\n * Called by Router.buildState after forwardState is applied at facade level.\n * This allows plugins to intercept forwardState.\n */\n buildStateResolved(\n resolvedName: string,\n resolvedParams: Params,\n ): RouteTreeState | undefined {\n const segments = this.#store.matcher.getSegmentsByName(resolvedName);\n\n if (!segments) {\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const meta = this.#store.matcher.getMetaByName(resolvedName)!;\n\n return createRouteState(\n { segments, params: resolvedParams, meta },\n resolvedName,\n );\n }\n\n // =========================================================================\n // Query operations\n // =========================================================================\n\n /**\n * Checks if a route is currently active.\n */\n isActiveRoute(\n name: string,\n params: Params = {},\n strictEquality = false,\n ignoreQueryParams = true,\n ): boolean {\n // Note: empty string check is handled by Router.ts facade\n const activeState = this.#deps.getState();\n\n if (!activeState) {\n return false;\n }\n\n const activeName = activeState.name;\n\n // Fast path: check if routes are related before expensive operations\n if (\n activeName !== name &&\n !activeName.startsWith(`${name}.`) &&\n !name.startsWith(`${activeName}.`)\n ) {\n return false;\n }\n\n const defaultParams = this.#store.config.defaultParams[name] as\n | Params\n | undefined;\n\n // Exact match case\n if (strictEquality || activeName === name) {\n const effectiveParams = defaultParams\n ? { ...defaultParams, ...params }\n : params;\n\n const targetState: State = {\n name,\n params: effectiveParams,\n path: \"\",\n transition: DEFAULT_TRANSITION,\n context: {},\n };\n\n return this.#deps.areStatesEqual(\n targetState,\n activeState,\n ignoreQueryParams,\n );\n }\n\n // The fast path above lets through three relations: exact (handled in\n // the previous block), `activeName` descendant of `name`, and `name`\n // descendant of `activeName`. Only the first two count as \"active\" —\n // a link pointing DEEPER than the current state is a navigation option,\n // not an active state. Reject the descendant-of-active case explicitly.\n if (!activeName.startsWith(`${name}.`)) {\n return false;\n }\n\n // Hierarchical check: activeState is a descendant of target (name)\n const activeParams = activeState.params;\n\n if (!paramsMatch(params, activeParams)) {\n return false;\n }\n\n if (!defaultParams) {\n return true;\n }\n\n // Honor `ignoreQueryParams` symmetrically with the exact-match branch\n // above: query-only param differences (e.g. parent has\n // `defaultParams: { sort: \"asc\" }` while the active descendant is\n // `products.detail` with `params: { id: \"6\" }` and no sort) must not\n // disqualify an ancestor link from being active. Strip query-typed\n // keys of `name` from the defaults before comparison; URL-typed keys\n // (`:id`, `:role`, etc.) are still enforced.\n // `name` reaches this point only after the fast-path established a valid\n // hierarchical relation AND `defaultParams` is non-null — both imply the\n // matcher has registered the route, so `getMetaByName(name)![name]` is\n // always defined here. Non-null assertions trade a defensive guard for\n // honest 100% coverage.\n const defaultsToCheck = ignoreQueryParams\n ? stripQueryDefaults(\n defaultParams,\n this.#store.matcher.getMetaByName(name)?.[name],\n )\n : defaultParams;\n\n return paramsMatchExcluding(defaultsToCheck, activeParams, params);\n }\n\n getMetaForState(\n name: string,\n ): Record<string, Record<string, \"url\" | \"query\">> | undefined {\n return this.#store.matcher.hasRoute(name)\n ? this.#store.matcher.getMetaByName(name)\n : undefined;\n }\n\n getUrlParams(name: string): string[] {\n const segments = this.#store.matcher.getSegmentsByName(name);\n\n if (!segments) {\n return [];\n }\n\n return collectUrlParamsArray(segments as readonly RouteTree[]);\n }\n\n getStore(): RoutesStore<Dependencies> {\n return this.#store;\n }\n\n #mergeDefaultParams<P extends Params = Params>(\n routeName: string,\n params: P,\n ): P {\n if (Object.hasOwn(this.#store.config.defaultParams, routeName)) {\n return {\n ...this.#store.config.defaultParams[routeName],\n ...params,\n };\n }\n\n return params;\n }\n\n #getBuildPathOptions(options?: Options): CachedBuildPathOpts {\n if (this.#cachedBuildPathOpts) {\n return this.#cachedBuildPathOpts;\n }\n\n const ts = options?.trailingSlash;\n\n this.#cachedBuildPathOpts = Object.freeze({\n trailingSlash: ts === \"never\" || ts === \"always\" ? ts : undefined,\n queryParamsMode: options?.queryParamsMode,\n });\n\n return this.#cachedBuildPathOpts;\n }\n\n #resolveDynamicForward(\n startName: string,\n startFn: ForwardToCallback<Dependencies>,\n params: Params,\n ): string {\n const visited = new Set<string>([startName]);\n\n let current = startFn(this.#deps.getDependency, params);\n let depth = 0;\n const MAX_DEPTH = 100;\n\n if (typeof current !== \"string\") {\n throw new TypeError(\n `forwardTo callback must return a string, got ${typeof current}`,\n );\n }\n\n while (depth < MAX_DEPTH) {\n if (this.#store.matcher.getSegmentsByName(current) === undefined) {\n throw new Error(`Route \"${current}\" does not exist`);\n }\n\n if (visited.has(current)) {\n const chain = [...visited, current].join(\" → \");\n\n throw new Error(`Circular forwardTo detected: ${chain}`);\n }\n\n visited.add(current);\n\n if (Object.hasOwn(this.#store.config.forwardFnMap, current)) {\n const fn = this.#store.config.forwardFnMap[\n current\n ] as ForwardToCallback<Dependencies>;\n\n current = fn(this.#deps.getDependency, params);\n\n depth++;\n continue;\n }\n\n const staticForward = this.#store.config.forwardMap[current];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (staticForward !== undefined) {\n current = staticForward;\n depth++;\n continue;\n }\n\n return current;\n }\n\n throw new Error(`forwardTo exceeds maximum depth of ${MAX_DEPTH}`);\n }\n}\n","// packages/core/src/RouterError.ts\n\nimport { errorCodes } from \"./constants\";\nimport { deepFreezeState } from \"./helpers\";\n\nimport type { State } from \"@real-router/types\";\n\n// Pre-compute Set of error code values for O(1) lookup in setCode()\n// This avoids creating array and doing linear search on every setCode() call\nconst errorCodeValues = new Set(Object.values(errorCodes));\n\n// Reserved built-in properties - throw error if user tries to set these\nconst reservedProperties = new Set([\"code\", \"segment\", \"path\", \"redirect\"]);\n\n// Reserved method names - silently ignore attempts to overwrite these\nconst reservedMethods = new Set([\n \"setCode\",\n \"setErrorInstance\",\n \"setAdditionalFields\",\n \"hasField\",\n \"getField\",\n \"toJSON\",\n]);\n\nexport class RouterError extends Error {\n [key: string]: unknown;\n\n // Using public properties to ensure structural compatibility\n // with RouterError interface in core-types\n readonly segment: string | undefined;\n readonly path: string | undefined;\n readonly redirect: State | undefined;\n\n // Note: code appears to be writable but setCode() should be used\n // to properly update both code and message together\n code: string;\n\n /**\n * Creates a new RouterError instance.\n *\n * The options object accepts built-in fields (message, segment, path, redirect)\n * and any additional custom fields, which will all be attached to the error instance.\n *\n * @param code - The error code (e.g., \"ROUTE_NOT_FOUND\", \"CANNOT_ACTIVATE\")\n * @param options - Optional configuration object\n * @param options.message - Custom error message (defaults to code if not provided)\n * @param options.segment - The route segment where the error occurred\n * @param options.path - The full path where the error occurred\n * @param options.redirect - Optional redirect state for navigation errors\n *\n * @example\n * ```typescript\n * // Basic error\n * const err1 = new RouterError(\"ROUTE_NOT_FOUND\");\n *\n * // Error with custom message\n * const err2 = new RouterError(\"ERR\", { message: \"Something went wrong\" });\n *\n * // Error with context and custom fields\n * const err3 = new RouterError(\"CANNOT_ACTIVATE\", {\n * message: \"Insufficient permissions\",\n * segment: \"admin\",\n * path: \"/admin/users\",\n * userId: \"123\" // custom field\n * });\n *\n * // Error with redirect\n * const err4 = new RouterError(\"TRANSITION_ERR\", {\n * redirect: { name: \"home\", path: \"/\", params: {} }\n * });\n * ```\n */\n constructor(\n code: string,\n {\n message,\n segment,\n path,\n redirect,\n ...rest\n }: {\n [key: string]: unknown;\n message?: string | undefined;\n segment?: string | undefined;\n path?: string | undefined;\n redirect?: State | undefined;\n } = {},\n ) {\n super(message ?? code);\n\n this.code = code;\n this.segment = segment;\n this.path = path;\n // Deep freeze redirect to prevent mutations (creates a frozen clone)\n this.redirect = redirect ? deepFreezeState(redirect) : undefined;\n\n // Assign custom fields, checking reserved properties and filtering out reserved method names\n // Issue #39: Throw for reserved properties to match setAdditionalFields behavior\n for (const [key, value] of Object.entries(rest)) {\n if (reservedProperties.has(key)) {\n throw new TypeError(\n `[RouterError] Cannot set reserved property \"${key}\"`,\n );\n }\n\n if (!reservedMethods.has(key)) {\n this[key] = value;\n }\n }\n }\n\n /**\n * Updates the error code and conditionally updates the message.\n *\n * If the current message is one of the standard error code values\n * (e.g., \"ROUTE_NOT_FOUND\", \"SAME_STATES\"), it will be replaced with the new code.\n * This allows keeping error messages in sync with codes when using standard error codes.\n *\n * If the message is custom (not a standard error code), it will be preserved.\n *\n * @param newCode - The new error code to set\n *\n * @example\n * // Message follows code (standard error code as message)\n * const err = new RouterError(\"ROUTE_NOT_FOUND\", { message: \"ROUTE_NOT_FOUND\" });\n * err.setCode(\"CUSTOM_ERROR\"); // message becomes \"CUSTOM_ERROR\"\n *\n * @example\n * // Custom message is preserved\n * const err = new RouterError(\"ERR\", { message: \"Custom error message\" });\n * err.setCode(\"NEW_CODE\"); // message stays \"Custom error message\"\n */\n setCode(newCode: string): void {\n this.code = newCode;\n\n // Only update message if it's a standard error code value (not a custom message)\n if (errorCodeValues.has(this.message)) {\n this.message = newCode;\n }\n }\n\n /**\n * Copies properties from another Error instance to this RouterError.\n *\n * This method updates the message, cause, and stack trace from the provided error.\n * Useful for wrapping native errors while preserving error context.\n *\n * @param err - The Error instance to copy properties from\n * @throws {TypeError} If err is null or undefined\n *\n * @example\n * ```typescript\n * const routerErr = new RouterError(\"TRANSITION_ERR\");\n * try {\n * // some operation that might fail\n * } catch (nativeErr) {\n * routerErr.setErrorInstance(nativeErr);\n * throw routerErr;\n * }\n * ```\n */\n setErrorInstance(err: Error): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!err) {\n throw new TypeError(\n \"[RouterError.setErrorInstance] err parameter is required and must be an Error instance\",\n );\n }\n\n this.message = err.message;\n this.cause = err.cause;\n this.stack = err.stack ?? \"\";\n }\n\n /**\n * Adds custom fields to the error object.\n *\n * This method allows attaching arbitrary data to the error for debugging or logging purposes.\n * All fields become accessible as properties on the error instance and are included in JSON serialization.\n *\n * Reserved method names (setCode, setErrorInstance, setAdditionalFields, hasField, getField, toJSON)\n * are automatically filtered out to prevent accidental overwriting of class methods.\n *\n * @param fields - Object containing custom fields to add to the error\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"CANNOT_ACTIVATE\");\n * err.setAdditionalFields({\n * userId: \"123\",\n * attemptedRoute: \"/admin\",\n * reason: \"insufficient permissions\"\n * });\n *\n * console.log(err.userId); // \"123\"\n * console.log(JSON.stringify(err)); // includes all custom fields\n * ```\n */\n setAdditionalFields(fields: Record<string, unknown>): void {\n // Assign fields, throwing for reserved properties, silently ignoring methods\n for (const [key, value] of Object.entries(fields)) {\n if (reservedProperties.has(key)) {\n throw new TypeError(\n `[RouterError.setAdditionalFields] Cannot set reserved property \"${key}\"`,\n );\n }\n\n if (!reservedMethods.has(key)) {\n this[key] = value;\n }\n }\n }\n\n /**\n * Checks if a custom field exists on the error object.\n *\n * This method checks for both custom fields added via setAdditionalFields()\n * and built-in fields (code, message, segment, etc.).\n *\n * @param key - The field name to check\n * @returns `true` if the field exists, `false` otherwise\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ERR\", { segment: \"users\" });\n * err.setAdditionalFields({ userId: \"123\" });\n *\n * err.hasField(\"userId\"); // true\n * err.hasField(\"segment\"); // true\n * err.hasField(\"unknown\"); // false\n * ```\n */\n hasField(key: string): boolean {\n return key in this;\n }\n\n /**\n * Retrieves a custom field value from the error object.\n *\n * This method can access both custom fields and built-in fields.\n * Returns `undefined` if the field doesn't exist.\n *\n * @param key - The field name to retrieve\n * @returns The field value, or `undefined` if it doesn't exist\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ERR\");\n * err.setAdditionalFields({ userId: \"123\", role: \"admin\" });\n *\n * err.getField(\"userId\"); // \"123\"\n * err.getField(\"role\"); // \"admin\"\n * err.getField(\"code\"); // \"ERR\" (built-in field)\n * err.getField(\"unknown\"); // undefined\n * ```\n */\n getField(key: string): unknown {\n return this[key];\n }\n\n /**\n * Serializes the error to a JSON-compatible object.\n *\n * This method is automatically called by JSON.stringify() and includes:\n * - Built-in fields: code, message, segment (if set), path (if set), redirect (if set)\n * - All custom fields added via setAdditionalFields() or constructor\n * - Excludes: stack trace (for security/cleanliness)\n *\n * @returns A plain object representation of the error, suitable for JSON serialization\n *\n * @example\n * ```typescript\n * const err = new RouterError(\"ROUTE_NOT_FOUND\", {\n * message: \"Route not found\",\n * path: \"/admin/users/123\"\n * });\n * err.setAdditionalFields({ userId: \"123\" });\n *\n * JSON.stringify(err);\n * // {\n * // \"code\": \"ROUTE_NOT_FOUND\",\n * // \"message\": \"Route not found\",\n * // \"path\": \"/admin/users/123\",\n * // \"userId\": \"123\"\n * // }\n * ```\n */\n toJSON(): Record<string, unknown> {\n const result: Record<string, unknown> = {\n code: this.code,\n message: this.message,\n };\n\n if (this.segment !== undefined) {\n result.segment = this.segment;\n }\n if (this.path !== undefined) {\n result.path = this.path;\n }\n if (this.redirect !== undefined) {\n result.redirect = this.redirect;\n }\n\n // add all public fields\n // Using Set.has() for O(1) lookup instead of Array.includes() O(n)\n // Overall complexity: O(n) instead of O(n*m)\n const excludeKeys = new Set([\n \"code\",\n \"message\",\n \"segment\",\n \"path\",\n \"redirect\",\n \"stack\",\n ]);\n\n for (const key in this) {\n if (Object.hasOwn(this, key) && !excludeKeys.has(key)) {\n result[key] = this[key];\n }\n }\n\n return result;\n }\n}\n","// packages/core/src/namespaces/NavigationNamespace/constants.ts\n\nimport { errorCodes } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\n\nimport type { State } from \"@real-router/types\";\n\n// =============================================================================\n// Cached Errors & Rejected Promises (Performance Optimization)\n// =============================================================================\n// Pre-create error instances and rejected promises for sync error paths\n// in navigate(). Eliminates per-call allocations:\n// - new RouterError() — object + stack trace capture (~500ns-2μs)\n// - Promise.reject() — promise allocation\n// - .catch(handler) — derived promise from suppression\n//\n// Trade-off: All error instances share the same stack trace (points here).\n// This is acceptable because:\n// 1. These errors indicate expected conditions, not internal bugs\n// 2. Error code and message are sufficient for debugging\n// 3. The facade skips .catch() suppression for cached promises (zero alloc)\n// =============================================================================\n\nexport const CACHED_NOT_STARTED_ERROR = new RouterError(\n errorCodes.ROUTER_NOT_STARTED,\n);\n\nexport const CACHED_ROUTE_NOT_FOUND_ERROR = new RouterError(\n errorCodes.ROUTE_NOT_FOUND,\n);\n\nexport const CACHED_SAME_STATES_ERROR = new RouterError(errorCodes.SAME_STATES);\n\n// Pre-suppressed rejected promises — .catch() at module load prevents\n// unhandled rejection warnings. The facade skips additional .catch() calls\n// via the lastSyncRejected flag (zero derived-promise allocation).\nexport const CACHED_NOT_STARTED_REJECTION: Promise<State> = Promise.reject(\n CACHED_NOT_STARTED_ERROR,\n);\n\nexport const CACHED_ROUTE_NOT_FOUND_REJECTION: Promise<State> = Promise.reject(\n CACHED_ROUTE_NOT_FOUND_ERROR,\n);\n\nexport const CACHED_SAME_STATES_REJECTION: Promise<State> = Promise.reject(\n CACHED_SAME_STATES_ERROR,\n);\n\n// Suppress once at module load — prevents unhandled rejection events.\n// Subsequent .catch() / await by user code still works correctly:\n// a rejected promise stays rejected forever, each .catch() creates\n// its own derived promise and fires its handler.\nCACHED_NOT_STARTED_REJECTION.catch(() => {}); // NOSONAR -- intentional suppression, not a promise chain\nCACHED_ROUTE_NOT_FOUND_REJECTION.catch(() => {}); // NOSONAR\nCACHED_SAME_STATES_REJECTION.catch(() => {}); // NOSONAR\n","import { errorCodes, constants } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\n\nimport type { NavigationDependencies, NavigationContext } from \"../types\";\nimport type {\n NavigationOptions,\n State,\n TransitionMeta,\n} from \"@real-router/types\";\n\ntype MutableTransitionMeta = {\n -readonly [K in keyof TransitionMeta]: TransitionMeta[K];\n};\n\nfunction buildTransitionMeta(\n fromState: State | undefined,\n opts: NavigationOptions,\n toDeactivate: string[],\n toActivate: string[],\n intersection: string,\n): TransitionMeta {\n Object.freeze(toDeactivate);\n Object.freeze(toActivate);\n\n const segments = Object.freeze({\n deactivated: toDeactivate,\n activated: toActivate,\n intersection,\n });\n\n const meta: MutableTransitionMeta = {\n phase: \"activating\",\n reason: \"success\",\n segments,\n };\n\n if (fromState?.name !== undefined) {\n meta.from = fromState.name;\n }\n\n if (opts.reload !== undefined) {\n meta.reload = opts.reload;\n }\n\n if (opts.replace !== undefined) {\n meta.replace = opts.replace;\n }\n\n if (opts.redirected !== undefined) {\n meta.redirected = opts.redirected;\n }\n\n return Object.freeze(meta);\n}\n\nfunction stripSignal({\n signal: _,\n ...rest\n}: NavigationOptions): NavigationOptions {\n return rest;\n}\n\nexport function completeTransition(\n deps: NavigationDependencies,\n nav: NavigationContext,\n): State {\n const { toState, fromState, opts, toDeactivate, toActivate, intersection } =\n nav;\n\n if (\n toState.name !== constants.UNKNOWN_ROUTE &&\n !deps.hasRoute(toState.name)\n ) {\n const err = new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: toState.name,\n });\n\n deps.sendTransitionFail(toState, fromState, err);\n\n throw err;\n }\n\n if (fromState) {\n for (const name of toDeactivate) {\n if (!toActivate.includes(name) && nav.canDeactivateFunctions.has(name)) {\n deps.clearCanDeactivate(name);\n }\n }\n }\n\n (toState as { transition: TransitionMeta }).transition = buildTransitionMeta(\n fromState,\n opts,\n toDeactivate,\n toActivate,\n intersection,\n );\n\n const finalState = Object.freeze(toState);\n\n deps.setState(finalState);\n\n const transitionOpts = opts.signal === undefined ? opts : stripSignal(opts);\n\n deps.sendTransitionDone(finalState, fromState, transitionOpts);\n\n return finalState;\n}\n","// packages/core/src/namespaces/NavigationNamespace/transition/errorHandling.ts\n\nimport { errorCodes } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\n\nimport type { NavigationDependencies } from \"../types\";\nimport type { State } from \"@real-router/types\";\n\nexport function routeTransitionError(\n deps: NavigationDependencies,\n error: unknown,\n toState: State,\n fromState: State | undefined,\n): void {\n const routerError = error as RouterError;\n\n if (\n routerError.code === errorCodes.TRANSITION_CANCELLED ||\n routerError.code === errorCodes.ROUTE_NOT_FOUND\n ) {\n return;\n }\n\n deps.sendTransitionFail(toState, fromState, routerError);\n}\n\nexport function handleGuardError(\n error: unknown,\n errorCode: string,\n segment: string,\n): never {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n rethrowAsRouterError(error, errorCode, segment);\n}\n\n/**\n * Error metadata structure for transition errors.\n * Contains information extracted from caught exceptions.\n */\nexport interface SyncErrorMetadata {\n [key: string]: unknown;\n message?: string;\n stack?: string | undefined;\n cause?: unknown;\n segment?: string;\n}\n\n/**\n * Re-throws a caught error as a RouterError with the given error code.\n * If the error is already a RouterError, sets the code directly.\n * Otherwise wraps it with wrapSyncError metadata.\n */\nexport function rethrowAsRouterError(\n error: unknown,\n errorCode: string,\n segment: string,\n): never {\n if (error instanceof RouterError) {\n error.setCode(errorCode);\n\n throw error;\n }\n\n throw new RouterError(errorCode, wrapSyncError(error, segment));\n}\n\nconst reservedRouterErrorProps = new Set([\n \"code\",\n \"segment\",\n \"path\",\n \"redirect\",\n]);\n\n/**\n * Wraps a synchronously thrown value into structured error metadata.\n *\n * This helper extracts useful debugging information from various thrown values:\n * - Error instances: extracts message, stack, and cause (ES2022+)\n * - Plain objects: spreads properties into metadata\n * - Primitives (string, number, etc.): returns minimal metadata\n *\n * @param thrown - The value caught in a try-catch block\n * @param segment - Route segment name (for lifecycle hooks)\n * @returns Structured error metadata for RouterError\n */\nexport function wrapSyncError(\n thrown: unknown,\n segment: string,\n): SyncErrorMetadata {\n const base: SyncErrorMetadata = { segment };\n\n // Handle Error instances - extract all useful properties\n if (thrown instanceof Error) {\n return {\n ...base,\n message: thrown.message,\n stack: thrown.stack,\n // Error.cause requires ES2022+ - safely access if present\n ...(\"cause\" in thrown &&\n thrown.cause !== undefined && { cause: thrown.cause }),\n };\n }\n\n // Handle plain objects - spread properties into metadata, filtering reserved props\n if (thrown && typeof thrown === \"object\") {\n const filtered: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(thrown)) {\n // Issue #39: Skip reserved properties to avoid RouterError constructor TypeError\n if (!reservedRouterErrorProps.has(key)) {\n filtered[key] = value;\n }\n }\n\n return { ...base, ...filtered };\n }\n\n // Primitives (string, number, boolean, null, undefined, symbol, bigint)\n // Return base metadata only - the primitive value isn't useful as metadata\n return base;\n}\n","import { handleGuardError } from \"./errorHandling\";\nimport { errorCodes } from \"../../../constants\";\nimport { RouterError } from \"../../../RouterError\";\n\nimport type { GuardFn, State } from \"@real-router/types\";\n\nasync function resolveAsyncGuard(\n promise: Promise<boolean>,\n errorCode: string,\n segment: string,\n): Promise<void> {\n let result: boolean;\n\n try {\n result = await promise;\n } catch (error: unknown) {\n handleGuardError(error, errorCode, segment);\n\n return; // unreachable — handleGuardError returns never\n }\n\n if (!result) {\n throw new RouterError(errorCode, { segment });\n }\n}\n\nasync function resolveRemainingGuards( // NOSONAR -- params kept flat to avoid object allocation on hot path\n guards: Map<string, GuardFn>,\n segments: string[],\n errorCode: string,\n toState: State,\n fromState: State | undefined,\n signal: AbortSignal | undefined,\n isActive: () => boolean,\n startIndex: number,\n firstResult: Promise<boolean>,\n firstSegment: string,\n): Promise<void> {\n await resolveAsyncGuard(firstResult, errorCode, firstSegment);\n\n for (let i = startIndex; i < segments.length; i++) {\n if (!isActive()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n const segment = segments[i];\n const guardFn = guards.get(segment);\n\n if (!guardFn) {\n continue;\n }\n\n let guardResult: boolean | Promise<boolean> = false;\n\n try {\n guardResult = guardFn(toState, fromState, signal);\n } catch (error: unknown) {\n handleGuardError(error, errorCode, segment);\n }\n\n if (guardResult instanceof Promise) {\n await resolveAsyncGuard(guardResult, errorCode, segment);\n continue;\n }\n\n if (!guardResult) {\n throw new RouterError(errorCode, { segment });\n }\n }\n}\n\nasync function finishAsyncPipeline( // NOSONAR\n deactivateCompletion: Promise<void>,\n activateGuards: Map<string, GuardFn>,\n toActivate: string[],\n shouldActivate: boolean,\n toState: State,\n fromState: State | undefined,\n signal: AbortSignal,\n isActive: () => boolean,\n emitLeaveApprove: () => Promise<void> | undefined,\n): Promise<void> {\n await deactivateCompletion;\n\n if (!isActive()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n const leaveResult = emitLeaveApprove();\n\n if (leaveResult !== undefined) {\n await leaveResult;\n\n /* v8 ignore next 3 -- @preserve: V8 cannot track cancellation check through async leave continuation after Promise.allSettled */\n if (!isActive()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n }\n\n if (shouldActivate) {\n const pending = runGuards(\n activateGuards,\n toActivate,\n errorCodes.CANNOT_ACTIVATE,\n toState,\n fromState,\n signal,\n isActive,\n );\n\n if (pending !== undefined) {\n await pending;\n }\n\n if (!isActive()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n }\n}\n\nexport function executeGuardPipeline( // NOSONAR\n deactivateGuards: Map<string, GuardFn>,\n activateGuards: Map<string, GuardFn>,\n toDeactivate: string[],\n toActivate: string[],\n shouldDeactivate: boolean,\n shouldActivate: boolean,\n toState: State,\n fromState: State | undefined,\n signal: AbortSignal,\n isActive: () => boolean,\n emitLeaveApprove: () => Promise<void> | undefined,\n): Promise<void> | undefined {\n if (shouldDeactivate) {\n const pending = runGuards(\n deactivateGuards,\n toDeactivate,\n errorCodes.CANNOT_DEACTIVATE,\n toState,\n fromState,\n signal,\n isActive,\n );\n\n if (pending !== undefined) {\n return finishAsyncPipeline(\n pending,\n activateGuards,\n toActivate,\n shouldActivate,\n toState,\n fromState,\n signal,\n isActive,\n emitLeaveApprove,\n );\n }\n }\n\n if (!isActive()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n const leaveResult = emitLeaveApprove();\n\n if (leaveResult !== undefined) {\n return finishAfterAsyncLeave(\n leaveResult,\n /* v8 ignore next -- @preserve: false-branch unreachable — navigateToNotFound bypasses guards pipeline */\n shouldActivate ? activateGuards : undefined,\n toActivate,\n toState,\n fromState,\n signal,\n isActive,\n );\n }\n\n if (shouldActivate) {\n return runGuards(\n activateGuards,\n toActivate,\n errorCodes.CANNOT_ACTIVATE,\n toState,\n fromState,\n signal,\n isActive,\n );\n }\n\n return undefined;\n}\n\nasync function finishAfterAsyncLeave(\n leaveCompletion: Promise<void>,\n activateGuards: Map<string, GuardFn> | undefined,\n toActivate: string[],\n toState: State,\n fromState: State | undefined,\n signal: AbortSignal,\n isActive: () => boolean,\n): Promise<void> {\n await leaveCompletion;\n\n /* v8 ignore next 3 -- @preserve: unreachable after #663 — signal abort\n mid-leave rejects via settleLeavePromises, so `await leaveCompletion`\n throws directly instead of completing with a stale isActive() */\n if (!isActive()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n /* v8 ignore next -- @preserve: false-branch unreachable — navigateToNotFound bypasses guards pipeline */\n if (activateGuards !== undefined) {\n const pending = runGuards(\n activateGuards,\n toActivate,\n errorCodes.CANNOT_ACTIVATE,\n toState,\n fromState,\n signal,\n isActive,\n );\n\n if (pending !== undefined) {\n await pending;\n }\n\n if (!isActive()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n }\n}\n\nfunction runGuards(\n guards: Map<string, GuardFn>,\n segments: string[],\n errorCode: string,\n toState: State,\n fromState: State | undefined,\n signal: AbortSignal | undefined,\n isActive: () => boolean,\n): Promise<void> | undefined {\n for (const [i, segment] of segments.entries()) {\n if (!isActive()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n const guardFn = guards.get(segment);\n\n if (!guardFn) {\n continue;\n }\n\n let guardResult: boolean | Promise<boolean> = false;\n\n try {\n guardResult = guardFn(toState, fromState, signal);\n } catch (error: unknown) {\n handleGuardError(error, errorCode, segment);\n }\n\n if (guardResult instanceof Promise) {\n return resolveRemainingGuards(\n guards,\n segments,\n errorCode,\n toState,\n fromState,\n signal,\n isActive,\n i + 1,\n guardResult,\n segment,\n );\n }\n\n if (!guardResult) {\n throw new RouterError(errorCode, { segment });\n }\n }\n\n return undefined;\n}\n","import { logger } from \"@real-router/logger\";\n\nimport {\n CACHED_NOT_STARTED_REJECTION,\n CACHED_ROUTE_NOT_FOUND_ERROR,\n CACHED_ROUTE_NOT_FOUND_REJECTION,\n CACHED_SAME_STATES_ERROR,\n CACHED_SAME_STATES_REJECTION,\n} from \"./constants\";\nimport { completeTransition } from \"./transition/completeTransition\";\nimport { routeTransitionError } from \"./transition/errorHandling\";\nimport { executeGuardPipeline } from \"./transition/guardPhase\";\nimport { EMPTY_PARAMS, errorCodes, constants } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\nimport { getTransitionPath, nameToIDs } from \"../../transitionPath\";\n\nimport type { NavigationContext, NavigationDependencies } from \"./types\";\nimport type { TransitionPath } from \"../../transitionPath\";\nimport type {\n GuardFn,\n NavigationOptions,\n Params,\n State,\n TransitionMeta,\n} from \"@real-router/types\";\n\nconst FROZEN_ACTIVATED: string[] = [constants.UNKNOWN_ROUTE];\n\nObject.freeze(FROZEN_ACTIVATED);\nconst FROZEN_REPLACE_OPTS: NavigationOptions = { replace: true };\n\nObject.freeze(FROZEN_REPLACE_OPTS);\n\nfunction forceReplaceFromUnknown(\n opts: NavigationOptions,\n fromState: State | undefined,\n): NavigationOptions {\n return fromState?.name === constants.UNKNOWN_ROUTE && !opts.replace\n ? { ...opts, replace: true }\n : opts;\n}\n\nfunction isSameNavigation(\n fromState: State | undefined,\n opts: NavigationOptions,\n toState: State,\n): boolean {\n return (\n !!fromState &&\n !opts.reload &&\n !opts.force &&\n fromState.path === toState.path\n );\n}\n\n/**\n * Independent namespace for managing navigation.\n *\n * Handles navigate(), navigateToDefault(), navigateToNotFound(), and transition state.\n *\n * Performance: navigate() uses optimistic sync execution — guards run synchronously\n * until one returns a Promise, then switches to async. This eliminates Promise/AbortController\n * overhead for the common case (no guards or sync guards).\n */\nexport class NavigationNamespace {\n lastSyncResolved = false;\n lastSyncRejected = false;\n #deps!: NavigationDependencies;\n #currentController: AbortController | null = null;\n #navigationId = 0;\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n setDependencies(deps: NavigationDependencies): void {\n this.#deps = deps;\n }\n\n // =========================================================================\n // Instance methods\n // =========================================================================\n\n navigate(\n name: string,\n params: Params,\n opts: NavigationOptions,\n ): Promise<State> {\n this.lastSyncResolved = false;\n const deps = this.#deps;\n\n // Fast-path sync rejections: cached error + cached Promise.reject\n // No allocations, no throw/catch overhead, facade skips .catch() suppression\n if (!deps.canNavigate()) {\n this.lastSyncRejected = true;\n\n return CACHED_NOT_STARTED_REJECTION;\n }\n\n let toState: State | undefined;\n\n try {\n toState = deps.buildNavigateState(name, params);\n } catch (error) {\n /* v8 ignore next 3 -- @preserve: reachable only via validator-driven\n throws from buildNavigateState (validateStateBuilderArgs) — covered\n in @real-router/validation-plugin's suite, not in core. */\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- preserve original throw shape from user-provided buildNavigateState\n return Promise.reject(error);\n }\n\n if (!toState) {\n deps.emitTransitionError(\n undefined,\n deps.getState(),\n CACHED_ROUTE_NOT_FOUND_ERROR,\n );\n this.lastSyncRejected = true;\n\n return CACHED_ROUTE_NOT_FOUND_REJECTION;\n }\n\n return this.#executeNavigation(toState, opts);\n }\n\n /**\n * Navigate to a fully-built `State` directly, skipping `buildNavigateState`\n * (forwardState + buildPath + meta lookup). Used by URL plugins after they\n * have already produced a `State` from a browser-initiated event via\n * `api.matchPath(url)` — see issue #525.\n *\n * Semantics vs. `navigate(name, params, opts)`:\n * - `forwardState` is NOT re-applied. matchPath already runs it; reapplying\n * is redundant in the idempotent case and can race in the dynamic case.\n * - `buildPath` is NOT re-run. The caller's `state.path` is used as-is —\n * so `trailingSlash:\"preserve\"` matchedState paths flow through unchanged\n * (closes #525 Q2). `buildPath` interceptors do NOT run; the URL the\n * user navigated to is the source of truth for this code path.\n * - All other pipeline steps run unchanged: SAME_STATES check, FSM\n * transition, guards, `subscribeLeave`, `completeTransition`,\n * plugin lifecycle hooks.\n */\n navigateToState(state: State, opts: NavigationOptions): Promise<State> {\n this.lastSyncResolved = false;\n const deps = this.#deps;\n\n if (!deps.canNavigate()) {\n this.lastSyncRejected = true;\n\n return CACHED_NOT_STARTED_REJECTION;\n }\n\n // Reject states whose route no longer exists (e.g. the route tree was\n // mutated between matchPath and navigateToState). UNKNOWN_ROUTE is\n // structurally legal — it is the navigateToNotFound output shape.\n if (state.name !== constants.UNKNOWN_ROUTE && !deps.hasRoute(state.name)) {\n const err = new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: state.name,\n });\n\n deps.emitTransitionError(undefined, deps.getState(), err);\n this.lastSyncRejected = true;\n\n return Promise.reject(err);\n }\n\n // States from `matchPath` are deeply frozen (`freezeStateInPlace`).\n // `completeTransition` mutates `toState.transition` and `context` is\n // intentionally extensible for plugin claim writes, so we hand the\n // pipeline a writable shell — same shape `makeState(skipFreeze=true)`\n // produces. `params` stays referentially shared (already frozen).\n // `transition` is omitted so completeTransition can assign it.\n const writableState = {\n name: state.name,\n params: state.params,\n path: state.path,\n context: { ...state.context },\n } as State;\n\n return this.#executeNavigation(writableState, opts);\n }\n\n navigateToDefault(opts: NavigationOptions): Promise<State> {\n const deps = this.#deps;\n const options = deps.getOptions();\n\n if (!options.defaultRoute) {\n return Promise.reject(\n new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: \"defaultRoute not configured\",\n }),\n );\n }\n\n let route: string;\n let params: Params;\n\n try {\n ({ route, params } = deps.resolveDefault());\n } catch (error) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- preserve original throw shape from user-provided resolveDefault callback\n return Promise.reject(error);\n }\n\n if (!route) {\n return Promise.reject(\n new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n routeName: \"defaultRoute resolved to empty\",\n }),\n );\n }\n\n return this.navigate(route, params, opts);\n }\n\n navigateToNotFound(path: string): State {\n this.#abortPreviousNavigation();\n\n const fromState = this.#deps.getState();\n const deactivated: string[] = fromState\n ? nameToIDs(fromState.name).toReversed()\n : [];\n\n Object.freeze(deactivated);\n\n const segments: TransitionMeta[\"segments\"] = {\n deactivated,\n activated: FROZEN_ACTIVATED,\n intersection: \"\",\n };\n\n Object.freeze(segments);\n\n const transitionMeta: TransitionMeta = {\n phase: \"activating\",\n ...(fromState && { from: fromState.name }),\n reason: \"success\",\n replace: true,\n segments,\n };\n\n Object.freeze(transitionMeta);\n\n const state: State = {\n name: constants.UNKNOWN_ROUTE,\n params: EMPTY_PARAMS,\n path,\n transition: transitionMeta,\n context: {},\n };\n\n Object.freeze(state);\n\n this.#deps.setState(state);\n this.#deps.emitTransitionSuccess(state, fromState, FROZEN_REPLACE_OPTS);\n\n return state;\n }\n\n abortCurrentNavigation(): void {\n this.#currentController?.abort(\n new RouterError(errorCodes.TRANSITION_CANCELLED),\n );\n this.#currentController = null;\n }\n\n #executeNavigation(toState: State, opts: NavigationOptions): Promise<State> {\n const deps = this.#deps;\n let fromState: State | undefined;\n let transitionStarted = false;\n let controller: AbortController | null = null;\n\n try {\n fromState = deps.getState();\n opts = forceReplaceFromUnknown(opts, fromState);\n\n if (isSameNavigation(fromState, opts, toState)) {\n deps.emitTransitionError(toState, fromState, CACHED_SAME_STATES_ERROR);\n this.lastSyncRejected = true;\n\n return CACHED_SAME_STATES_REJECTION;\n }\n\n this.#abortPreviousNavigation(opts.signal);\n\n const myId = ++this.#navigationId;\n\n deps.startTransition(toState, fromState);\n transitionStarted = true;\n\n // Reentrant navigate from TRANSITION_START listener superseded this navigation\n if (this.#navigationId !== myId) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n const [canDeactivateFunctions, canActivateFunctions] =\n deps.getLifecycleFunctions();\n const isUnknownRoute = toState.name === constants.UNKNOWN_ROUTE;\n\n const transitionPath = getTransitionPath(toState, fromState);\n const { toDeactivate, toActivate, intersection } = transitionPath;\n\n const shouldDeactivate =\n fromState && !opts.forceDeactivate && toDeactivate.length > 0;\n const shouldActivate = !isUnknownRoute && toActivate.length > 0;\n const hasGuards =\n canDeactivateFunctions.size > 0 || canActivateFunctions.size > 0;\n\n const confirmedToState = toState;\n\n if (!hasGuards) {\n const asyncLeave = this.#handleNoGuardsLeave(\n confirmedToState,\n fromState,\n myId,\n opts,\n transitionPath,\n canDeactivateFunctions,\n );\n\n /* v8 ignore start */\n if (asyncLeave !== undefined) {\n return asyncLeave;\n }\n /* v8 ignore stop */\n }\n\n if (hasGuards) {\n controller = new AbortController();\n this.#currentController = controller;\n const isCurrentNav = () =>\n this.#navigationId === myId && deps.isActive();\n\n const signal = controller.signal;\n\n const emitLeaveApproveCallback = (): Promise<void> | undefined => {\n deps.sendLeaveApprove(confirmedToState, fromState);\n\n if (deps.hasLeaveListeners()) {\n return deps.awaitLeaveListeners(\n confirmedToState,\n fromState,\n signal,\n );\n }\n\n return undefined;\n };\n\n const guardCompletion = executeGuardPipeline(\n canDeactivateFunctions,\n canActivateFunctions,\n toDeactivate,\n toActivate,\n !!shouldDeactivate,\n shouldActivate,\n toState,\n fromState,\n signal,\n isCurrentNav,\n emitLeaveApproveCallback,\n );\n\n if (guardCompletion !== undefined) {\n return this.#finishAsyncNavigation(\n guardCompletion,\n {\n toState,\n fromState,\n opts,\n toDeactivate,\n toActivate,\n intersection,\n canDeactivateFunctions,\n },\n controller,\n myId,\n );\n }\n\n if (!isCurrentNav()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n this.#cleanupController(controller);\n }\n\n this.lastSyncResolved = true;\n\n return Promise.resolve(\n completeTransition(deps, {\n toState,\n fromState,\n opts,\n toDeactivate,\n toActivate,\n intersection,\n canDeactivateFunctions,\n }),\n );\n } catch (error) {\n this.#handleNavigateError(\n error,\n controller,\n transitionStarted,\n toState,\n fromState,\n );\n\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- preserve original throw shape from guards or transition pipeline\n return Promise.reject(error);\n }\n }\n\n async #finishAsyncNavigation(\n guardCompletion: Promise<void>,\n nav: NavigationContext,\n controller: AbortController,\n myId: number,\n ): Promise<State> {\n const deps = this.#deps;\n const isActive = () =>\n this.#navigationId === myId &&\n !controller.signal.aborted &&\n deps.isActive();\n\n try {\n if (nav.opts.signal) {\n if (nav.opts.signal.aborted) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED, {\n reason: nav.opts.signal.reason,\n });\n }\n\n nav.opts.signal.addEventListener(\n \"abort\",\n () => {\n controller.abort(nav.opts.signal?.reason);\n },\n { once: true, signal: controller.signal },\n );\n }\n\n await guardCompletion;\n\n if (!isActive()) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n\n return completeTransition(deps, nav);\n } catch (error) {\n routeTransitionError(deps, error, nav.toState, nav.fromState);\n\n throw error;\n } finally {\n this.#cleanupController(controller);\n }\n }\n\n #handleNavigateError(\n error: unknown,\n controller: AbortController | null,\n transitionStarted: boolean,\n toState: State | undefined,\n fromState: State | undefined,\n ): void {\n if (controller) {\n this.#cleanupController(controller);\n }\n\n if (transitionStarted && toState) {\n routeTransitionError(this.#deps, error, toState, fromState);\n }\n }\n\n #handleNoGuardsLeave(\n toState: State,\n fromState: State | undefined,\n myId: number,\n opts: NavigationOptions,\n transitionPath: TransitionPath,\n canDeactivateFunctions: Map<string, GuardFn>,\n ): Promise<State> | undefined {\n const deps = this.#deps;\n\n deps.sendLeaveApprove(toState, fromState);\n\n /* v8 ignore start */\n if (deps.hasLeaveListeners()) {\n const controller = new AbortController();\n const leaveResult = deps.awaitLeaveListeners(\n toState,\n fromState,\n controller.signal,\n );\n\n if (leaveResult !== undefined) {\n this.#currentController = controller;\n\n return this.#finishAsyncNavigation(\n leaveResult,\n {\n toState,\n fromState,\n opts,\n toDeactivate: transitionPath.toDeactivate,\n toActivate: transitionPath.toActivate,\n intersection: transitionPath.intersection,\n canDeactivateFunctions,\n },\n controller,\n myId,\n );\n }\n }\n\n if (this.#navigationId !== myId) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED);\n }\n /* v8 ignore stop */\n\n return undefined;\n }\n\n #cleanupController(controller: AbortController): void {\n controller.abort();\n\n if (this.#currentController === controller) {\n this.#currentController = null;\n }\n }\n\n #abortPreviousNavigation(externalSignal?: AbortSignal): void {\n if (this.#deps.isTransitioning()) {\n logger.warn(\n \"router.navigate\",\n \"Concurrent navigation detected on shared router instance. \" +\n \"For SSR, use cloneRouter() to create isolated instance per request.\",\n );\n this.#currentController?.abort(\n new RouterError(errorCodes.TRANSITION_CANCELLED),\n );\n this.#deps.cancelNavigation();\n }\n\n if (externalSignal?.aborted) {\n throw new RouterError(errorCodes.TRANSITION_CANCELLED, {\n reason: externalSignal.reason,\n });\n }\n }\n}\n","// packages/core/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts\n\nimport { errorCodes } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\n\nimport type { RouterLifecycleDependencies } from \"./types\";\nimport type { NavigationOptions, State } from \"@real-router/types\";\n\nconst REPLACE_OPTS: NavigationOptions = { replace: true };\n\nObject.freeze(REPLACE_OPTS);\n\n/**\n * Independent namespace for managing router lifecycle.\n *\n * Handles start() and stop(). Lifecycle state (isActive, isStarted) is managed\n * by RouterFSM in the facade (Router.ts).\n */\nexport class RouterLifecycleNamespace {\n #deps!: RouterLifecycleDependencies;\n\n // =========================================================================\n // Dependency injection\n // =========================================================================\n\n /**\n * Sets dependencies for lifecycle operations.\n * Must be called before using lifecycle methods.\n */\n setDependencies(deps: RouterLifecycleDependencies): void {\n this.#deps = deps;\n }\n\n // =========================================================================\n // Instance methods\n // =========================================================================\n\n /**\n * Starts the router with the given path.\n *\n * Guards (concurrent start, already started) are handled by the facade via\n * RouterFSM state checks before this method is called.\n */\n async start(startPath: string): Promise<State> {\n const deps = this.#deps;\n const options = deps.getOptions();\n\n const matchedState = deps.matchPath(startPath);\n\n if (!matchedState && !options.allowNotFound) {\n const err = new RouterError(errorCodes.ROUTE_NOT_FOUND, {\n path: startPath,\n });\n\n deps.emitTransitionError(undefined, undefined, err);\n\n throw err;\n }\n\n deps.completeStart();\n\n if (matchedState) {\n // navigateToState commits matchedState verbatim — same primitive URL\n // plugins use on popstate / navigate-event (#525). Keeps trailing-slash\n // and any other source-URL flavor that matchPath produced; skips the\n // redundant forwardState+buildPath round-trip in buildNavigateState.\n return deps.navigateToState(matchedState, REPLACE_OPTS);\n }\n\n return deps.navigateToNotFound(startPath);\n }\n\n /**\n * Stops the router and resets state.\n *\n * Called only for READY/TRANSITION_STARTED states (facade handles STARTING/IDLE/DISPOSED).\n */\n stop(): void {\n this.#deps.clearState();\n }\n}\n","// packages/core/src/namespaces/EventBusNamespace/EventBusNamespace.ts\n\nimport { events } from \"../../constants\";\nimport { routerEvents, routerStates } from \"../../fsm\";\n\nimport type { EventBusOptions } from \"./types\";\nimport type { RouterEvent, RouterPayloads, RouterState } from \"../../fsm\";\nimport type { RouterError } from \"../../RouterError\";\nimport type { EventMethodMap, RouterEventMap } from \"../../types\";\nimport type { FSM } from \"@real-router/fsm\";\nimport type {\n EventName,\n LeaveFn,\n LeaveState,\n NavigationOptions,\n Plugin,\n State,\n SubscribeFn,\n Unsubscribe,\n} from \"@real-router/types\";\nimport type { EventEmitter } from \"event-emitter\";\n\nfunction ensureError(value: unknown): Error {\n /* v8 ignore next -- @preserve: defensive guard — listeners should always throw Error objects */\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction settleLeavePromises(\n promises: Promise<void>[],\n firstSyncError: unknown,\n signal: AbortSignal,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const onAbort = (): void => {\n reject(ensureError(signal.reason));\n };\n\n if (signal.aborted) {\n onAbort();\n\n return;\n }\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n void Promise.allSettled(promises).then((results) => {\n signal.removeEventListener(\"abort\", onAbort);\n\n if (signal.aborted) {\n // Race lost to abort — the abort handler already rejected; do nothing\n return;\n }\n\n if (firstSyncError !== undefined) {\n reject(ensureError(firstSyncError));\n\n return;\n }\n\n const rejected = results.find(\n (result): result is PromiseRejectedResult =>\n result.status === \"rejected\",\n );\n\n if (rejected !== undefined) {\n reject(ensureError(rejected.reason));\n\n return;\n }\n\n resolve();\n });\n });\n}\n\nexport class EventBusNamespace {\n readonly #fsm: FSM<RouterState, RouterEvent, null, RouterPayloads>;\n readonly #emitter: EventEmitter<RouterEventMap>;\n readonly #leaveListeners: LeaveFn[] = [];\n\n #currentToState: State | undefined;\n #pendingToState: State | undefined;\n #pendingFromState: State | undefined;\n #pendingError: unknown;\n\n constructor(options: EventBusOptions) {\n this.#fsm = options.routerFSM;\n this.#emitter = options.emitter;\n this.#currentToState = undefined;\n this.#setupFSMActions();\n }\n\n static validateSubscribeListener(listener: unknown): void {\n if (typeof listener !== \"function\") {\n throw new TypeError(\n \"[router.subscribe] Expected a function. \" +\n \"For Observable pattern use @real-router/rx package\",\n );\n }\n }\n\n static validateSubscribeLeaveListener(listener: unknown): void {\n if (typeof listener !== \"function\") {\n throw new TypeError(\"[router.subscribeLeave] Expected a function\");\n }\n }\n\n emitRouterStart(): void {\n this.#emitter.emit(events.ROUTER_START);\n }\n\n emitRouterStop(): void {\n this.#emitter.emit(events.ROUTER_STOP);\n }\n\n emitTransitionStart(toState: State, fromState?: State): void {\n this.#emitter.emit(events.TRANSITION_START, toState, fromState);\n }\n\n emitTransitionSuccess(\n toState: State,\n fromState?: State,\n opts?: NavigationOptions,\n ): void {\n this.#emitter.emit(events.TRANSITION_SUCCESS, toState, fromState, opts);\n }\n\n emitTransitionError(\n toState?: State,\n fromState?: State,\n error?: RouterError,\n ): void {\n this.#emitter.emit(events.TRANSITION_ERROR, toState, fromState, error);\n }\n\n emitTransitionCancel(toState: State, fromState?: State): void {\n this.#emitter.emit(events.TRANSITION_CANCEL, toState, fromState);\n }\n\n emitTransitionLeaveApprove(toState: State, fromState?: State): void {\n this.#emitter.emit(events.TRANSITION_LEAVE_APPROVE, toState, fromState);\n }\n\n sendStart(): void {\n this.#fsm.send(routerEvents.START);\n }\n\n sendStop(): void {\n this.#fsm.send(routerEvents.STOP);\n }\n\n sendDispose(): void {\n this.#fsm.send(routerEvents.DISPOSE);\n }\n\n sendStarted(): void {\n this.#fsm.send(routerEvents.STARTED);\n }\n\n sendNavigate(toState: State, fromState?: State): void {\n this.#currentToState = toState;\n // Bypass FSM dispatch — forceState + direct emit (no action lookup, no rest params)\n this.#fsm.forceState(routerStates.TRANSITION_STARTED);\n this.emitTransitionStart(toState, fromState);\n }\n\n sendComplete(\n state: State,\n fromState?: State,\n opts: NavigationOptions = {},\n ): void {\n // Bypass FSM dispatch — forceState + direct emit\n this.#fsm.forceState(routerStates.READY);\n this.emitTransitionSuccess(state, fromState, opts);\n\n if (this.#currentToState === state) {\n this.#currentToState = undefined;\n }\n }\n\n sendLeaveApprove(toState: State, fromState?: State): void {\n // Bypass FSM dispatch — forceState + direct emit (no action lookup, no rest params)\n this.#fsm.forceState(routerStates.LEAVE_APPROVED);\n this.emitTransitionLeaveApprove(toState, fromState);\n }\n\n sendFail(toState?: State, fromState?: State, error?: unknown): void {\n const prev = this.#currentToState;\n\n this.#pendingToState = toState;\n this.#pendingFromState = fromState;\n this.#pendingError = error;\n this.#fsm.send(routerEvents.FAIL);\n\n if (this.#currentToState === prev) {\n this.#currentToState = undefined;\n }\n }\n\n sendFailSafe(toState?: State, fromState?: State, error?: unknown): void {\n if (this.isReady()) {\n this.sendFail(toState, fromState, error);\n } else {\n this.emitTransitionError(toState, fromState, error as RouterError);\n }\n }\n\n sendCancel(toState: State, fromState?: State): void {\n const prev = this.#currentToState;\n\n this.#pendingToState = toState;\n this.#pendingFromState = fromState;\n this.#fsm.send(routerEvents.CANCEL);\n\n if (this.#currentToState === prev) {\n this.#currentToState = undefined;\n }\n }\n\n canBeginTransition(): boolean {\n return this.#fsm.canSend(routerEvents.NAVIGATE);\n }\n\n canStart(): boolean {\n return this.#fsm.canSend(routerEvents.START);\n }\n\n canCancel(): boolean {\n return this.#fsm.canSend(routerEvents.CANCEL);\n }\n\n isActive(): boolean {\n const fsmState = this.#fsm.getState();\n\n return fsmState !== routerStates.IDLE && fsmState !== routerStates.DISPOSED;\n }\n\n isDisposed(): boolean {\n return this.#fsm.getState() === routerStates.DISPOSED;\n }\n\n isTransitioning(): boolean {\n const state = this.#fsm.getState();\n\n return (\n state === routerStates.TRANSITION_STARTED ||\n state === routerStates.LEAVE_APPROVED\n );\n }\n\n isLeaveApproved(): boolean {\n return this.#fsm.getState() === routerStates.LEAVE_APPROVED;\n }\n\n isReady(): boolean {\n return this.#fsm.getState() === routerStates.READY;\n }\n\n isStarting(): boolean {\n return this.#fsm.getState() === routerStates.STARTING;\n }\n\n getCurrentToState(): State | undefined {\n return this.#currentToState;\n }\n\n addEventListener<E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ): Unsubscribe {\n return this.#emitter.on(\n eventName,\n cb as (...args: RouterEventMap[typeof eventName]) => void,\n );\n }\n\n subscribe(listener: SubscribeFn): Unsubscribe {\n return this.#emitter.on(\n events.TRANSITION_SUCCESS,\n (toState: State, fromState?: State) => {\n listener({ route: toState, previousRoute: fromState });\n },\n );\n }\n\n subscribeLeave(listener: LeaveFn): Unsubscribe {\n this.#leaveListeners.push(listener);\n\n return () => {\n const idx = this.#leaveListeners.indexOf(listener);\n\n if (idx !== -1) {\n this.#leaveListeners.splice(idx, 1);\n }\n };\n }\n\n hasLeaveListeners(): boolean {\n return this.#leaveListeners.length > 0;\n }\n\n awaitLeaveListeners(\n toState: State,\n fromState: State | undefined,\n signal: AbortSignal,\n ): Promise<void> | undefined {\n if (fromState === undefined) {\n return undefined;\n }\n\n const leaveState: LeaveState = {\n route: fromState,\n nextRoute: toState,\n signal,\n };\n\n let promises: Promise<void>[] | undefined;\n let firstSyncError: unknown;\n\n for (const listener of this.#leaveListeners) {\n try {\n const result = listener(leaveState);\n\n if (result !== undefined && typeof result.then === \"function\") {\n promises ??= [];\n promises.push(result);\n }\n } catch (error: unknown) {\n if (firstSyncError === undefined) {\n firstSyncError = error;\n }\n }\n }\n\n if (promises === undefined) {\n if (firstSyncError !== undefined) {\n throw ensureError(firstSyncError);\n }\n\n return undefined;\n }\n\n return settleLeavePromises(promises, firstSyncError, signal);\n }\n\n clearAll(): void {\n this.#emitter.clearAll();\n this.#leaveListeners.length = 0;\n }\n\n setLimits(limits: {\n maxListeners: number;\n warnListeners: number;\n maxEventDepth: number;\n }): void {\n this.#emitter.setLimits(limits);\n }\n\n sendCancelIfPossible(fromState: State | undefined): void {\n const toState = this.#currentToState;\n\n if (!this.canCancel() || toState === undefined) {\n return;\n }\n\n this.sendCancel(toState, fromState);\n }\n\n #emitPendingError(): void {\n this.emitTransitionError(\n this.#pendingToState,\n this.#pendingFromState,\n this.#pendingError as RouterError | undefined,\n );\n }\n\n #setupFSMActions(): void {\n const fsm = this.#fsm;\n\n fsm.on(routerStates.STARTING, routerEvents.STARTED, () => {\n this.emitRouterStart();\n });\n\n fsm.on(routerStates.READY, routerEvents.STOP, () => {\n this.emitRouterStop();\n });\n\n // NAVIGATE and COMPLETE actions bypassed — sendNavigate/sendComplete\n // use fsm.forceState() + direct emit for zero-allocation hot path.\n const handleCancel = () => {\n const toState = this.#pendingToState;\n\n /* v8 ignore next -- @preserve: #pendingToState guaranteed set by sendCancel before send() */\n if (toState === undefined) {\n return;\n }\n\n this.emitTransitionCancel(toState, this.#pendingFromState);\n };\n\n fsm.on(routerStates.TRANSITION_STARTED, routerEvents.CANCEL, handleCancel);\n fsm.on(routerStates.LEAVE_APPROVED, routerEvents.CANCEL, handleCancel);\n\n fsm.on(routerStates.LEAVE_APPROVED, routerEvents.FAIL, () => {\n this.#emitPendingError();\n });\n\n fsm.on(routerStates.STARTING, routerEvents.FAIL, () => {\n this.#emitPendingError();\n });\n\n fsm.on(routerStates.READY, routerEvents.FAIL, () => {\n this.#emitPendingError();\n });\n\n fsm.on(routerStates.TRANSITION_STARTED, routerEvents.FAIL, () => {\n this.#emitPendingError();\n });\n }\n}\n","// packages/core/src/namespaces/RouterLifecycleNamespace/constants.ts\n\nimport { errorCodes } from \"../../constants\";\nimport { RouterError } from \"../../RouterError\";\n\n// =============================================================================\n// Cached Errors (Performance Optimization)\n// =============================================================================\n// Pre-create error instances to avoid object allocation on hot paths.\n// Error creation involves: new object, stack trace capture (~500ns-2μs).\n// Cached errors skip this overhead entirely.\n//\n// Trade-off: All error instances share the same stack trace (points here).\n// This is acceptable because:\n// 1. These errors indicate user misconfiguration, not internal bugs\n// 2. Error code and message are sufficient for debugging\n// 3. Performance gain (~80% for error paths) outweighs stack trace loss\n// =============================================================================\n\n/**\n * Cached error for start() called when router is already started/starting.\n */\nexport const CACHED_ALREADY_STARTED_ERROR = new RouterError(\n errorCodes.ROUTER_ALREADY_STARTED,\n);\n","// packages/core/src/typeGuards.ts\n\n/**\n * RealRouter-specific type guards for logger configuration\n */\nimport type { LoggerConfig, LogLevelConfig } from \"@real-router/logger\";\n\nconst VALID_LEVELS_SET = new Set<string>([\"all\", \"warn-error\", \"error-only\"]);\n\nfunction isValidLevel(value: unknown): value is LogLevelConfig {\n return typeof value === \"string\" && VALID_LEVELS_SET.has(value);\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `\"${value}\"`;\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(value);\n}\n\nexport function isLoggerConfig(config: unknown): config is LoggerConfig {\n if (typeof config !== \"object\" || config === null) {\n throw new TypeError(\"Logger config must be an object\");\n }\n\n const obj = config;\n\n // Check for unknown properties\n for (const key of Object.keys(obj)) {\n if (key !== \"level\" && key !== \"callback\") {\n throw new TypeError(`Unknown logger config property: \"${key}\"`);\n }\n }\n\n // Validate level if present\n if (\"level\" in obj && obj.level !== undefined && !isValidLevel(obj.level)) {\n throw new TypeError(\n `Invalid logger level: ${formatValue(obj.level)}. Expected: \"all\" | \"warn-error\" | \"error-only\"`,\n );\n }\n\n // Validate callback if present\n if (\n \"callback\" in obj &&\n obj.callback !== undefined &&\n typeof obj.callback !== \"function\"\n ) {\n throw new TypeError(\n `Logger callback must be a function, got ${typeof obj.callback}`,\n );\n }\n\n return true;\n}\n","// packages/core/src/wiring/RouterWiringBuilder.ts\n\nimport { normalizeParams } from \"../helpers\";\nimport { getInternals } from \"../internals\";\nimport { resolveOption } from \"../namespaces/OptionsNamespace\";\n\nimport type { EventBusNamespace } from \"../namespaces\";\nimport type { WiringOptions } from \"./types\";\nimport type { NavigationDependencies } from \"../namespaces/NavigationNamespace\";\nimport type { PluginsDependencies } from \"../namespaces/PluginsNamespace\";\nimport type { RouteLifecycleDependencies } from \"../namespaces/RouteLifecycleNamespace\";\nimport type { RouterLifecycleDependencies } from \"../namespaces/RouterLifecycleNamespace\";\nimport type { RoutesDependencies } from \"../namespaces/RoutesNamespace\";\nimport type { DefaultDependencies, Params } from \"@real-router/types\";\n\nexport class RouterWiringBuilder<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> {\n private readonly router: WiringOptions<Dependencies>[\"router\"];\n private readonly options: WiringOptions<Dependencies>[\"options\"];\n private readonly limits: WiringOptions<Dependencies>[\"limits\"];\n private readonly dependenciesStore: WiringOptions<Dependencies>[\"dependenciesStore\"];\n private readonly state: WiringOptions<Dependencies>[\"state\"];\n private readonly routes: WiringOptions<Dependencies>[\"routes\"];\n private readonly routeLifecycle: WiringOptions<Dependencies>[\"routeLifecycle\"];\n private readonly plugins: WiringOptions<Dependencies>[\"plugins\"];\n private readonly navigation: WiringOptions<Dependencies>[\"navigation\"];\n private readonly lifecycle: WiringOptions<Dependencies>[\"lifecycle\"];\n private readonly eventBus: EventBusNamespace;\n\n constructor(wiringOptions: WiringOptions<Dependencies>) {\n this.router = wiringOptions.router;\n this.options = wiringOptions.options;\n this.limits = wiringOptions.limits;\n this.dependenciesStore = wiringOptions.dependenciesStore;\n this.state = wiringOptions.state;\n this.routes = wiringOptions.routes;\n this.routeLifecycle = wiringOptions.routeLifecycle;\n this.plugins = wiringOptions.plugins;\n this.navigation = wiringOptions.navigation;\n this.lifecycle = wiringOptions.lifecycle;\n this.eventBus = wiringOptions.eventBus;\n }\n\n wireLimits(): void {\n this.dependenciesStore.limits = this.limits;\n this.plugins.setLimits(this.limits);\n this.eventBus.setLimits({\n maxListeners: this.limits.maxListeners,\n warnListeners: this.limits.warnListeners,\n maxEventDepth: this.limits.maxEventDepth,\n });\n this.routeLifecycle.setLimits(this.limits);\n }\n\n wireRouteLifecycleDeps(): void {\n const routeLifecycleDeps: RouteLifecycleDependencies<Dependencies> = {\n compileFactory: this.createCompileFactory(),\n };\n\n this.routeLifecycle.setDependencies(routeLifecycleDeps);\n this.routeLifecycle.setValidatorGetter(\n /* v8 ignore next 3 -- @preserve: returns null during construction (before registerInternals) */\n () => {\n try {\n return getInternals(this.router).validator;\n } catch {\n return null;\n }\n },\n );\n }\n\n wireRoutesDeps(): void {\n const routesDeps: RoutesDependencies<Dependencies> = {\n addActivateGuard: (name, handler) => {\n this.routeLifecycle.addCanActivate(name, handler, true);\n },\n addDeactivateGuard: (name, handler) => {\n this.routeLifecycle.addCanDeactivate(name, handler, true);\n },\n makeState: (name, params, path, meta) =>\n this.state.makeState(name, params, path, meta),\n getState: () => this.state.get(),\n areStatesEqual: (state1, state2, ignoreQueryParams) =>\n this.state.areStatesEqual(state1, state2, ignoreQueryParams),\n getDependency: (name) =>\n this.dependenciesStore.dependencies[name] as Dependencies[typeof name],\n forwardState: <P extends Params = Params>(name: string, params: P) => {\n const ctx = getInternals(this.router);\n\n ctx.validator?.routes.validateStateBuilderArgs(\n name,\n params,\n \"forwardState\",\n );\n\n return ctx.forwardState(name, params);\n },\n };\n\n this.routes.setDependencies(routesDeps);\n this.routes.setLifecycleNamespace(this.routeLifecycle);\n }\n\n wirePluginsDeps(): void {\n const pluginsDeps: PluginsDependencies<Dependencies> = {\n addEventListener: (eventName, cb) =>\n this.eventBus.addEventListener(eventName, cb),\n canNavigate: () => this.eventBus.canBeginTransition(),\n compileFactory: this.createCompileFactory(),\n };\n\n this.plugins.setDependencies(pluginsDeps);\n this.plugins.setValidatorGetter(\n /* v8 ignore next 3 -- @preserve: returns null during construction (before registerInternals) */\n () => {\n try {\n return getInternals(this.router).validator;\n } catch {\n return null;\n }\n },\n );\n }\n\n wireNavigationDeps(): void {\n const navigationDeps: NavigationDependencies = {\n getOptions: () => this.options.get(),\n hasRoute: (name) => this.routes.hasRoute(name),\n getState: () => this.state.get(),\n setState: (state) => {\n this.state.set(state);\n },\n buildNavigateState: (routeName, routeParams) => {\n const ctx = getInternals(this.router);\n\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"navigate\",\n );\n\n const forwarded = ctx.forwardState(routeName, routeParams);\n const name = forwarded.name;\n const params = normalizeParams(forwarded.params);\n const meta = this.routes.getMetaForState(name);\n\n if (meta === undefined) {\n return;\n }\n\n const path = ctx.buildPath(name, params);\n\n return this.state.makeState(name, params, path, meta, true);\n },\n resolveDefault: () => {\n const options = this.options.get();\n const ctx = getInternals(this.router);\n\n const route = resolveOption(\n options.defaultRoute,\n (name: string) =>\n this.dependenciesStore.dependencies[name as keyof Dependencies],\n );\n const params = resolveOption(\n options.defaultParams,\n /* v8 ignore next -- @preserve: unreachable unless defaultParams is a callback that calls getDependency */\n (name: string) =>\n this.dependenciesStore.dependencies[name as keyof Dependencies],\n );\n\n if (typeof options.defaultRoute === \"function\") {\n ctx.validator?.options.validateResolvedDefaultRoute(\n route,\n ctx.routeGetStore(),\n );\n }\n\n return { route, params };\n },\n startTransition: (toState, fromState) => {\n this.eventBus.sendNavigate(toState, fromState);\n },\n cancelNavigation: () => {\n const toState = this.eventBus.getCurrentToState();\n\n /* v8 ignore next -- @preserve: getCurrentToState() guaranteed set before TRANSITION_STARTED */\n if (toState === undefined) {\n return;\n }\n\n this.eventBus.sendCancel(toState, this.state.get());\n },\n sendTransitionDone: (state, fromState, opts) => {\n this.eventBus.sendComplete(state, fromState, opts);\n },\n sendTransitionFail: (toState, fromState, error) => {\n this.eventBus.sendFail(toState, fromState, error);\n },\n emitTransitionError: (toState, fromState, error) => {\n this.eventBus.sendFailSafe(toState, fromState, error);\n },\n emitTransitionSuccess: (toState, fromState, opts) => {\n this.eventBus.emitTransitionSuccess(toState, fromState, opts);\n },\n sendLeaveApprove: (toState, fromState) => {\n this.eventBus.sendLeaveApprove(toState, fromState);\n },\n canNavigate: () => this.eventBus.canBeginTransition(),\n getLifecycleFunctions: () => this.routeLifecycle.getFunctions(),\n isActive: () => this.router.isActive(),\n isTransitioning: () => this.eventBus.isTransitioning(),\n clearCanDeactivate: (name: string) => {\n this.routeLifecycle.clearCanDeactivate(name);\n },\n hasLeaveListeners: () => this.eventBus.hasLeaveListeners(),\n awaitLeaveListeners: (toState, fromState, signal) =>\n this.eventBus.awaitLeaveListeners(toState, fromState, signal),\n };\n\n this.navigation.setDependencies(navigationDeps);\n }\n\n wireLifecycleDeps(): void {\n const lifecycleDeps: RouterLifecycleDependencies = {\n getOptions: () => this.options.get(),\n navigateToState: (state, opts) =>\n this.navigation.navigateToState(state, opts),\n navigateToNotFound: (path) => this.navigation.navigateToNotFound(path),\n clearState: () => {\n this.state.set(undefined);\n },\n matchPath: (path) => this.routes.matchPath(path, this.options.get()),\n completeStart: () => {\n this.eventBus.sendStarted();\n },\n emitTransitionError: (toState, fromState, error) => {\n this.eventBus.sendFail(toState, fromState, error);\n },\n };\n\n this.lifecycle.setDependencies(lifecycleDeps);\n }\n\n wireStateDeps(): void {\n this.state.setDependencies({\n getDefaultParams: () => this.routes.getStore().config.defaultParams,\n buildPath: (name, params) => {\n const ctx = getInternals(this.router);\n\n return ctx.buildPath(name, params);\n },\n getUrlParams: (name) => this.routes.getUrlParams(name),\n });\n }\n\n private createCompileFactory() {\n const { router, dependenciesStore } = this;\n\n return <T>(\n factory: (\n router: WiringOptions<Dependencies>[\"router\"],\n getDependency: <K extends keyof Dependencies>(\n name: K,\n ) => Dependencies[K],\n ) => T,\n ): T =>\n factory(\n router,\n <K extends keyof Dependencies>(name: K) =>\n dependenciesStore.dependencies[name] as Dependencies[K],\n );\n }\n}\n","// packages/core/src/wiring/wireRouter.ts\n\nimport type { RouterWiringBuilder } from \"./RouterWiringBuilder\";\nimport type { DefaultDependencies } from \"@real-router/types\";\n\n/**\n * Director function — calls RouterWiringBuilder methods in the correct dependency order.\n *\n * ORDER MATTERS:\n * - `wireLimits()` first: all namespaces must have limits before any other setup\n * - `wireRouteLifecycleDeps()` BEFORE `wireRoutesDeps()`: RoutesNamespace.setDependencies()\n * registers pending canActivate handlers which require RouteLifecycleNamespace to be ready\n * - `wireNavigationDeps()` BEFORE `wireLifecycleDeps()`: lifecycle deps reference\n * NavigationNamespace.navigate() which requires navigation deps to be set\n */\nexport function wireRouter<Dependencies extends DefaultDependencies>(\n builder: RouterWiringBuilder<Dependencies>,\n): void {\n builder.wireLimits();\n builder.wireRouteLifecycleDeps();\n builder.wireRoutesDeps();\n builder.wirePluginsDeps();\n builder.wireNavigationDeps();\n builder.wireLifecycleDeps();\n builder.wireStateDeps();\n}\n","// packages/core/src/Router.ts\n\n/**\n * Router class - facade with integrated namespaces.\n *\n * All functionality is now provided by namespace classes.\n */\n\nimport { logger } from \"@real-router/logger\";\nimport { EventEmitter } from \"event-emitter\";\n\nimport { EMPTY_PARAMS, errorCodes } from \"./constants\";\nimport { createRouterFSM } from \"./fsm\";\nimport { guardDependencies, guardRouteStructure } from \"./guards\";\nimport { createLimits, normalizeParams } from \"./helpers\";\nimport {\n createInterceptable,\n createInterceptable2,\n getInternals,\n registerInternals,\n} from \"./internals\";\nimport {\n EventBusNamespace,\n NavigationNamespace,\n OptionsNamespace,\n PluginsNamespace,\n RouteLifecycleNamespace,\n RouterLifecycleNamespace,\n RoutesNamespace,\n StateNamespace,\n createDependenciesStore,\n} from \"./namespaces\";\nimport { CACHED_ALREADY_STARTED_ERROR } from \"./namespaces/RouterLifecycleNamespace/constants\";\nimport { RouterError } from \"./RouterError\";\nimport { getTransitionPath } from \"./transitionPath\";\nimport { isLoggerConfig } from \"./typeGuards\";\nimport { RouterWiringBuilder, wireRouter } from \"./wiring\";\n\nimport type { RouterInternals } from \"./internals\";\nimport type { DependenciesStore } from \"./namespaces\";\nimport type { Limits, PluginFactory, Route, RouterEventMap } from \"./types\";\nimport type {\n DefaultDependencies,\n LeaveFn,\n NavigationOptions,\n Options,\n Params,\n Router as RouterInterface,\n State,\n SubscribeFn,\n Unsubscribe,\n} from \"@real-router/types\";\nimport type { CreateMatcherOptions } from \"route-tree\";\n\nconst EMPTY_OPTS: Readonly<NavigationOptions> = Object.freeze({});\n\n/**\n * Router class with integrated namespace architecture.\n *\n * All functionality is provided by namespace classes:\n * - OptionsNamespace: getOptions (immutable)\n * - DependenciesStore: get/set/remove dependencies\n * - EventEmitter: subscribe\n * - StateNamespace: state storage (getState, setState, getPreviousState)\n * - RoutesNamespace: route tree operations\n * - RouteLifecycleNamespace: canActivate/canDeactivate guards\n * - PluginsNamespace: plugin lifecycle\n * - NavigationNamespace: navigate\n * - RouterLifecycleNamespace: start, stop, isStarted\n *\n * @internal This class implementation is internal. Use createRouter() instead.\n */\nexport class Router<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> implements RouterInterface<Dependencies> {\n [key: string]: unknown;\n\n // ============================================================================\n // Namespaces\n // ============================================================================\n\n readonly #options: OptionsNamespace;\n readonly #limits: Limits;\n readonly #dependenciesStore: DependenciesStore<Dependencies>;\n readonly #state: StateNamespace;\n readonly #routes: RoutesNamespace<Dependencies>;\n readonly #routeLifecycle: RouteLifecycleNamespace<Dependencies>;\n readonly #plugins: PluginsNamespace<Dependencies>;\n readonly #navigation: NavigationNamespace;\n readonly #lifecycle: RouterLifecycleNamespace;\n\n readonly #eventBus: EventBusNamespace;\n\n // ============================================================================\n // Constructor\n // ============================================================================\n\n /**\n * @param routes - Route definitions\n * @param options - Router options\n * @param dependencies - DI dependencies\n */\n constructor(\n routes: Route<Dependencies>[] = [],\n options: Partial<Options> = {},\n dependencies: Dependencies = {} as Dependencies,\n ) {\n // Configure logger if provided\n if (options.logger && isLoggerConfig(options.logger)) {\n logger.configure(options.logger);\n delete options.logger;\n }\n\n // =========================================================================\n // Validate inputs before creating namespaces\n // =========================================================================\n\n // Always validate options\n OptionsNamespace.validateOptionsIsObject(options);\n\n // Unconditional guard-level validation before creating namespaces\n guardDependencies(dependencies);\n\n if (routes.length > 0) {\n guardRouteStructure(routes);\n }\n\n // =========================================================================\n // Create Namespaces\n // =========================================================================\n\n this.#options = new OptionsNamespace(options);\n this.#limits = createLimits(options.limits);\n this.#dependenciesStore =\n createDependenciesStore<Dependencies>(dependencies);\n this.#state = new StateNamespace();\n this.#routes = new RoutesNamespace<Dependencies>(\n routes,\n deriveMatcherOptions(this.#options.get()),\n );\n this.#routeLifecycle = new RouteLifecycleNamespace<Dependencies>();\n this.#plugins = new PluginsNamespace<Dependencies>();\n this.#navigation = new NavigationNamespace();\n this.#lifecycle = new RouterLifecycleNamespace();\n\n // =========================================================================\n // Initialize EventBus\n // =========================================================================\n\n const routerFSM = createRouterFSM();\n // eslint-disable-next-line unicorn/prefer-event-target\n const emitter = new EventEmitter<RouterEventMap>({\n onListenerError: (eventName, error) => {\n logger.error(\"Router\", `Error in listener for ${eventName}:`, error);\n },\n onListenerWarn: (eventName, count) => {\n logger.warn(\n \"router.addEventListener\",\n `Event \"${eventName}\" has ${count} listeners — possible memory leak`,\n );\n },\n });\n\n this.#eventBus = new EventBusNamespace({ routerFSM, emitter });\n\n // =========================================================================\n // Wire Dependencies\n // =========================================================================\n\n wireRouter(\n new RouterWiringBuilder<Dependencies>({\n router: this,\n options: this.#options,\n limits: this.#limits,\n dependenciesStore: this.#dependenciesStore,\n state: this.#state,\n routes: this.#routes,\n routeLifecycle: this.#routeLifecycle,\n plugins: this.#plugins,\n navigation: this.#navigation,\n lifecycle: this.#lifecycle,\n eventBus: this.#eventBus,\n }),\n );\n\n // =========================================================================\n // Register Internals (WeakMap for plugin/infrastructure access)\n // =========================================================================\n\n const interceptorsMap: RouterInternals[\"interceptors\"] = new Map();\n\n registerInternals(this, {\n makeState: (name, params, path, meta) =>\n this.#state.makeState(name, params, path, meta),\n // `as unknown as` is required: createInterceptable2 returns a\n // non-generic `(a: A, b: B) => R`, but RouterInternals[\"forwardState\"]\n // is declared with a generic parameter `<P extends Params = Params>`,\n // which tsc will not infer from the non-generic source. Sonar S4325\n // misclassifies this as a redundant cast.\n forwardState: createInterceptable2(\n \"forwardState\",\n (name: string, params: Params) =>\n this.#routes.forwardState(name, params),\n interceptorsMap,\n ) as unknown as RouterInternals[\"forwardState\"],\n buildStateResolved: (name, params) =>\n this.#routes.buildStateResolved(name, params),\n matchPath: (path, matchOptions) =>\n this.#routes.matchPath(path, matchOptions),\n getOptions: () => this.#options.get(),\n addEventListener: (eventName, cb) =>\n this.#eventBus.addEventListener(eventName, cb),\n buildPath: createInterceptable2(\n \"buildPath\",\n (route: string, params?: Params) =>\n this.#routes.buildPath(\n route,\n params ?? EMPTY_PARAMS,\n this.#options.get(),\n ),\n interceptorsMap,\n ),\n emitTransitionError: (error) => {\n this.#eventBus.sendFailSafe(undefined, this.#state.get(), error);\n },\n start: createInterceptable(\n \"start\",\n (path: string) => {\n return this.#lifecycle.start(path);\n },\n interceptorsMap,\n ),\n navigateToState: (state, navOpts) => {\n // Plugin-only navigation primitive (#525). Mirrors the same\n // unhandled-rejection suppression and lastSync* bookkeeping used by\n // the public Router.navigate facade so plugin call-sites can\n // fire-and-forget the returned promise (popstate handlers do).\n const promiseState = this.#navigation.navigateToState(\n state,\n navOpts ?? EMPTY_OPTS,\n );\n\n if (this.#navigation.lastSyncResolved) {\n this.#navigation.lastSyncResolved = false;\n } else if (this.#navigation.lastSyncRejected) {\n this.#navigation.lastSyncRejected = false;\n } else {\n Router.#suppressUnhandledRejection(promiseState);\n }\n\n return promiseState;\n },\n interceptors: interceptorsMap,\n setRootPath: (rootPath) => {\n this.#routes.setRootPath(rootPath);\n },\n getRootPath: () => this.#routes.getStore().rootPath,\n getTree: () => this.#routes.getStore().tree,\n isDisposed: () => this.#eventBus.isDisposed(),\n validator: null,\n // Dependencies (issue #172)\n dependenciesGetStore: () => this.#dependenciesStore,\n // Clone support (issue #173)\n cloneOptions: () => ({ ...this.#options.get() }),\n cloneDependencies: () => ({ ...this.#dependenciesStore.dependencies }),\n getLifecycleFactories: () => this.#routeLifecycle.getFactories(),\n getPluginFactories: () => this.#plugins.getAll(),\n routeGetStore: () => this.#routes.getStore(),\n // Cross-namespace state (issue #174)\n getStateName: () => this.#state.get()?.name,\n isTransitioning: () => this.#eventBus.isTransitioning(),\n clearState: () => {\n this.#state.set(undefined);\n },\n setState: (state) => {\n this.#state.set(state);\n },\n routerExtensions: [],\n contextClaimRecords: new Set(),\n hydrationState: null,\n });\n\n // =========================================================================\n // Bind Public Methods\n // =========================================================================\n // All public methods that access private fields must be bound to preserve\n // `this` context when methods are extracted as references.\n // See: https://github.com/tc39/proposal-bind-operator\n // =========================================================================\n\n // Path & State Building\n this.isActiveRoute = this.isActiveRoute.bind(this);\n this.buildPath = this.buildPath.bind(this);\n\n // State Management\n this.getState = this.getState.bind(this);\n this.getPreviousState = this.getPreviousState.bind(this);\n this.areStatesEqual = this.areStatesEqual.bind(this);\n this.shouldUpdateNode = this.shouldUpdateNode.bind(this);\n\n // Router Lifecycle\n this.isActive = this.isActive.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.dispose = this.dispose.bind(this);\n\n // Route Lifecycle (Guards)\n this.canNavigateTo = this.canNavigateTo.bind(this);\n\n // Plugins\n this.usePlugin = this.usePlugin.bind(this);\n\n // Navigation\n this.navigate = this.navigate.bind(this);\n this.navigateToDefault = this.navigateToDefault.bind(this);\n this.navigateToNotFound = this.navigateToNotFound.bind(this);\n\n // Subscription\n this.subscribe = this.subscribe.bind(this);\n this.subscribeLeave = this.subscribeLeave.bind(this);\n this.isLeaveApproved = this.isLeaveApproved.bind(this);\n }\n\n // ============================================================================\n // Path & State Building\n // ============================================================================\n\n isActiveRoute(\n name: string,\n params?: Params,\n strictEquality?: boolean,\n ignoreQueryParams?: boolean,\n ): boolean {\n getInternals(this).validator?.routes.validateIsActiveRouteArgs(\n name,\n params,\n strictEquality,\n ignoreQueryParams,\n );\n\n getInternals(this).validator?.routes.validateRouteName(\n name,\n \"isActiveRoute\",\n );\n\n // Empty string is special case - warn and return false (root node is not a parent)\n if (name === \"\") {\n logger.warn(\n \"real-router\",\n 'isActiveRoute(\"\") called with empty string. Root node is not considered a parent of any route.',\n );\n\n return false;\n }\n\n return this.#routes.isActiveRoute(\n name,\n params,\n strictEquality,\n ignoreQueryParams,\n );\n }\n\n buildPath(route: string, params?: Params): string {\n const ctx = getInternals(this);\n\n ctx.validator?.routes.validateBuildPathArgs(route);\n ctx.validator?.navigation.validateParams(params, \"buildPath\");\n\n return ctx.buildPath(route, normalizeParams(params));\n }\n\n // ============================================================================\n // State Management (delegated to StateNamespace)\n // ============================================================================\n\n getState<P extends Params = Params>(): State<P> | undefined {\n return this.#state.get<P>();\n }\n\n getPreviousState(): State | undefined {\n return this.#state.getPrevious();\n }\n\n areStatesEqual(\n state1: State | undefined,\n state2: State | undefined,\n ignoreQueryParams = true,\n ): boolean {\n getInternals(this).validator?.state.validateAreStatesEqualArgs(\n state1,\n state2,\n ignoreQueryParams,\n );\n\n return this.#state.areStatesEqual(state1, state2, ignoreQueryParams);\n }\n\n shouldUpdateNode(\n nodeName: string,\n ): (toState: State, fromState?: State) => boolean {\n getInternals(this).validator?.routes.validateShouldUpdateNodeArgs(nodeName);\n\n return RoutesNamespace.shouldUpdateNode(nodeName);\n }\n\n // ============================================================================\n // Router Lifecycle\n // ============================================================================\n\n isActive(): boolean {\n return this.#eventBus.isActive();\n }\n\n start(startPath: string): Promise<State> {\n if (!this.#eventBus.canStart()) {\n return Promise.reject(CACHED_ALREADY_STARTED_ERROR);\n }\n\n getInternals(this).validator?.navigation.validateStartArgs(startPath);\n\n this.#eventBus.sendStart();\n\n // Convert sync interceptor throws to rejections so the recovery branch in\n // .catch is reachable; otherwise the throw escapes synchronously, FSM is\n // left in STARTING, and the router is permanently bricked (#668).\n let internalStart: Promise<State>;\n\n try {\n internalStart = getInternals(this).start(startPath);\n } catch (syncError: unknown) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- preserve original throw shape from user-provided start interceptor\n internalStart = Promise.reject(syncError);\n }\n\n const promiseState = internalStart.catch((error: unknown) => {\n if (this.#eventBus.isReady()) {\n this.#lifecycle.stop();\n this.#eventBus.sendStop();\n } else if (this.#eventBus.isStarting()) {\n this.#eventBus.sendFail(undefined, undefined, error);\n }\n\n throw error;\n });\n\n Router.#suppressUnhandledRejection(promiseState);\n\n return promiseState;\n }\n\n stop(): this {\n this.#navigation.abortCurrentNavigation();\n this.#eventBus.sendCancelIfPossible(this.#state.get());\n\n if (!this.#eventBus.isReady() && !this.#eventBus.isTransitioning()) {\n return this;\n }\n\n this.#lifecycle.stop();\n this.#eventBus.sendStop();\n\n return this;\n }\n\n dispose(): void {\n if (this.#eventBus.isDisposed()) {\n return;\n }\n\n this.#navigation.abortCurrentNavigation();\n this.#eventBus.sendCancelIfPossible(this.#state.get());\n\n if (this.#eventBus.isReady() || this.#eventBus.isTransitioning()) {\n this.#lifecycle.stop();\n this.#eventBus.sendStop();\n }\n\n this.#eventBus.sendDispose();\n this.#eventBus.clearAll();\n\n this.#plugins.disposeAll();\n\n // Safety net: clean up extensions plugins failed to remove in teardown\n const ctx = getInternals(this);\n\n for (const extension of ctx.routerExtensions) {\n for (const key of extension.keys) {\n delete (this as Record<string, unknown>)[key];\n }\n }\n\n ctx.routerExtensions.length = 0;\n\n // Safety net: release context namespace claims plugins failed to release in teardown\n ctx.contextClaimRecords.clear();\n\n this.#routes.clearRoutes();\n this.#routeLifecycle.clearAll();\n this.#state.reset();\n this.#dependenciesStore.dependencies = Object.create(\n null,\n ) as Partial<Dependencies>;\n\n this.#markDisposed();\n }\n\n // ============================================================================\n // Route Lifecycle (Guards)\n // ============================================================================\n\n canNavigateTo(name: string, params?: Params): boolean {\n const ctx = getInternals(this);\n\n ctx.validator?.routes.validateRouteName(name, \"canNavigateTo\");\n ctx.validator?.navigation.validateParams(params, \"canNavigateTo\");\n\n if (!this.#routes.hasRoute(name)) {\n return false;\n }\n\n const { name: resolvedName, params: resolvedParams } = ctx.forwardState(\n name,\n params ?? {},\n );\n const toState = this.#state.makeState(resolvedName, resolvedParams);\n const fromState = this.#state.get();\n\n const { toDeactivate, toActivate } = getTransitionPath(toState, fromState);\n\n return this.#routeLifecycle.canNavigateTo(\n toDeactivate,\n toActivate,\n toState,\n fromState,\n );\n }\n\n // ============================================================================\n // Plugins\n // ============================================================================\n\n usePlugin(\n ...plugins: (PluginFactory<Dependencies> | false | null | undefined)[]\n ): Unsubscribe {\n const filtered = plugins.filter(Boolean) as PluginFactory<Dependencies>[];\n\n if (filtered.length === 0) {\n return () => {};\n }\n\n const ctx = getInternals(this);\n\n ctx.validator?.plugins.validatePluginLimit(\n this.#plugins.count(),\n this.#limits,\n );\n for (const plugin of filtered) {\n ctx.validator?.plugins.validateNoDuplicatePlugins(\n plugin,\n this.#plugins.getAll(),\n );\n }\n\n return this.#plugins.use(...filtered);\n }\n\n // ============================================================================\n // Subscription (backed by EventEmitter)\n // ============================================================================\n\n subscribe(listener: SubscribeFn): Unsubscribe {\n EventBusNamespace.validateSubscribeListener(listener);\n\n return this.#eventBus.subscribe(listener);\n }\n\n subscribeLeave(listener: LeaveFn): Unsubscribe {\n EventBusNamespace.validateSubscribeLeaveListener(listener);\n\n return this.#eventBus.subscribeLeave(listener);\n }\n\n isLeaveApproved(): boolean {\n return this.#eventBus.isLeaveApproved();\n }\n\n // ============================================================================\n // Navigation\n // ============================================================================\n\n navigate(\n routeName: string,\n routeParams?: Params,\n options?: NavigationOptions,\n ): Promise<State> {\n const ctx = getInternals(this);\n\n ctx.validator?.navigation.validateNavigateArgs(routeName);\n ctx.validator?.navigation.validateParams(routeParams, \"navigate\");\n\n const opts = options ?? EMPTY_OPTS;\n\n ctx.validator?.navigation.validateNavigationOptions(opts, \"navigate\");\n\n const promiseState = this.#navigation.navigate(\n routeName,\n routeParams ?? EMPTY_PARAMS,\n opts,\n );\n\n if (this.#navigation.lastSyncResolved) {\n this.#navigation.lastSyncResolved = false;\n } else if (this.#navigation.lastSyncRejected) {\n // Cached rejection — already pre-suppressed at module load, skip .catch()\n this.#navigation.lastSyncRejected = false;\n } else {\n Router.#suppressUnhandledRejection(promiseState);\n }\n\n return promiseState;\n }\n\n navigateToDefault(options?: NavigationOptions): Promise<State> {\n const ctx = getInternals(this);\n\n ctx.validator?.navigation.validateNavigateToDefaultArgs(options);\n\n const opts = options ?? EMPTY_OPTS;\n\n ctx.validator?.navigation.validateNavigationOptions(\n opts,\n \"navigateToDefault\",\n );\n\n const promiseState = this.#navigation.navigateToDefault(opts);\n\n if (this.#navigation.lastSyncResolved) {\n this.#navigation.lastSyncResolved = false;\n } else if (this.#navigation.lastSyncRejected) {\n this.#navigation.lastSyncRejected = false;\n } else {\n Router.#suppressUnhandledRejection(promiseState);\n }\n\n return promiseState;\n }\n\n navigateToNotFound(path?: string): State {\n if (!this.#eventBus.isActive()) {\n throw new RouterError(errorCodes.ROUTER_NOT_STARTED);\n }\n\n if (path !== undefined && typeof path !== \"string\") {\n throw new TypeError(\n `[router.navigateToNotFound] path must be a string, got ${typeof path}`,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- isActive() guarantees state exists\n const resolvedPath = path ?? this.#state.get()!.path;\n\n return this.#navigation.navigateToNotFound(resolvedPath);\n }\n\n /**\n * Pre-allocated callback for #suppressUnhandledRejection.\n * Avoids creating a new closure on every navigate() call.\n */\n static readonly #onSuppressedError = (error: unknown): void => {\n if (\n error instanceof RouterError &&\n (error.code === errorCodes.SAME_STATES ||\n error.code === errorCodes.TRANSITION_CANCELLED ||\n error.code === errorCodes.ROUTER_NOT_STARTED ||\n error.code === errorCodes.ROUTE_NOT_FOUND)\n ) {\n return;\n }\n\n logger.error(\"router.navigate\", \"Unexpected navigation error\", error);\n };\n\n /**\n * Fire-and-forget safety: prevents unhandled rejection warnings\n * when navigate/navigateToDefault is called without await.\n * Expected errors are silently suppressed; unexpected ones are logged.\n */\n static #suppressUnhandledRejection(promise: Promise<State>): void {\n promise.catch(Router.#onSuppressedError);\n }\n\n #markDisposed(): void {\n this.navigate = throwDisposed;\n this.navigateToDefault = throwDisposed;\n this.navigateToNotFound = throwDisposed;\n this.start = throwDisposed;\n this.stop = throwDisposed;\n this.usePlugin = throwDisposed;\n\n this.subscribe = throwDisposed;\n this.subscribeLeave = throwDisposed;\n this.canNavigateTo = throwDisposed;\n }\n}\n\nfunction throwDisposed(): never {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n}\n\n/**\n * Derives CreateMatcherOptions from router Options.\n * Maps core option names to matcher option names.\n */\nfunction deriveMatcherOptions(\n options: Readonly<Options>,\n): CreateMatcherOptions {\n return {\n strictTrailingSlash: options.trailingSlash === \"strict\",\n strictQueryParams: options.queryParamsMode === \"strict\",\n urlParamsEncoding: options.urlParamsEncoding,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n queryParams: options.queryParams!,\n };\n}\n"],"mappings":"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"}
|