@real-router/core 0.52.0 → 0.54.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +22 -10
  2. package/dist/cjs/Router-CJihdrWA.d.ts +67 -0
  3. package/dist/cjs/Router-CJihdrWA.d.ts.map +1 -0
  4. package/dist/cjs/Router-D8Awa7bY.js +6 -0
  5. package/dist/cjs/Router-D8Awa7bY.js.map +1 -0
  6. package/dist/cjs/RouterError-Bm9YnZ6e.d.ts +310 -0
  7. package/dist/cjs/RouterError-Bm9YnZ6e.d.ts.map +1 -0
  8. package/dist/cjs/api.d.ts +2 -1
  9. package/dist/cjs/api.d.ts.map +1 -1
  10. package/dist/cjs/api.js +1 -1
  11. package/dist/cjs/api.js.map +1 -1
  12. package/dist/cjs/cloneRouter-q-jHlBiv.js +2 -0
  13. package/dist/cjs/cloneRouter-q-jHlBiv.js.map +1 -0
  14. package/dist/cjs/index-8oPDJBQc.d.ts +306 -0
  15. package/dist/cjs/index-8oPDJBQc.d.ts.map +1 -0
  16. package/dist/cjs/{Router-DrBkBdZ5.d.ts → index-EwbhzRQw.d.ts} +4 -69
  17. package/dist/cjs/index-EwbhzRQw.d.ts.map +1 -0
  18. package/dist/cjs/index.d.ts +4 -197
  19. package/dist/cjs/index.d.ts.map +1 -1
  20. package/dist/cjs/index.js +1 -1
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/{internals-na15rxo_.js → internals-CM6oaz9n.js} +1 -1
  23. package/dist/cjs/internals-CM6oaz9n.js.map +1 -0
  24. package/dist/cjs/utils.d.ts +2 -91
  25. package/dist/cjs/utils.js +1 -1
  26. package/dist/cjs/utils.js.map +1 -1
  27. package/dist/cjs/validation.d.ts +55 -44
  28. package/dist/cjs/validation.d.ts.map +1 -1
  29. package/dist/cjs/validation.js +1 -1
  30. package/dist/esm/Router-BeMyxy_V.mjs +6 -0
  31. package/dist/esm/Router-BeMyxy_V.mjs.map +1 -0
  32. package/dist/esm/Router-BmhiDQUJ.d.mts +67 -0
  33. package/dist/esm/Router-BmhiDQUJ.d.mts.map +1 -0
  34. package/dist/esm/RouterError-hhfSVGtY.d.mts +310 -0
  35. package/dist/esm/RouterError-hhfSVGtY.d.mts.map +1 -0
  36. package/dist/esm/api.d.mts +2 -1
  37. package/dist/esm/api.d.mts.map +1 -1
  38. package/dist/esm/api.mjs +1 -1
  39. package/dist/esm/api.mjs.map +1 -1
  40. package/dist/esm/cloneRouter-C_ULpzHM.mjs +2 -0
  41. package/dist/esm/cloneRouter-C_ULpzHM.mjs.map +1 -0
  42. package/dist/esm/{Router-BeXr2zW4.d.mts → index-DNjaY7KH.d.mts} +4 -69
  43. package/dist/esm/index-DNjaY7KH.d.mts.map +1 -0
  44. package/dist/esm/index-r_JTvSBH.d.mts +306 -0
  45. package/dist/esm/index-r_JTvSBH.d.mts.map +1 -0
  46. package/dist/esm/index.d.mts +4 -197
  47. package/dist/esm/index.d.mts.map +1 -1
  48. package/dist/esm/index.mjs +1 -1
  49. package/dist/esm/index.mjs.map +1 -1
  50. package/dist/esm/{internals-CCymabFj.mjs → internals-C59msvHY.mjs} +1 -1
  51. package/dist/esm/internals-C59msvHY.mjs.map +1 -0
  52. package/dist/esm/utils.d.mts +2 -91
  53. package/dist/esm/utils.mjs +1 -1
  54. package/dist/esm/utils.mjs.map +1 -1
  55. package/dist/esm/validation.d.mts +56 -43
  56. package/dist/esm/validation.d.mts.map +1 -1
  57. package/dist/esm/validation.mjs +1 -1
  58. package/package.json +1 -1
  59. package/src/Router.ts +13 -16
  60. package/src/api/getDependenciesApi.ts +3 -11
  61. package/src/api/getPluginApi.ts +3 -3
  62. package/src/api/getRoutesApi.ts +4 -2
  63. package/src/internals.ts +13 -1
  64. package/src/namespaces/DependenciesNamespace/dependenciesStore.ts +1 -1
  65. package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +8 -4
  66. package/src/namespaces/NavigationNamespace/transition/completeTransition.ts +4 -0
  67. package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +3 -3
  68. package/src/namespaces/StateNamespace/StateNamespace.ts +2 -2
  69. package/src/utils/createRequestScope.ts +174 -0
  70. package/src/utils/hydrateRouter.ts +68 -12
  71. package/src/utils/index.ts +17 -1
  72. package/src/utils/serializeRouterState.ts +51 -4
  73. package/src/utils/serializeState.ts +46 -5
  74. package/dist/cjs/Router-DrBkBdZ5.d.ts.map +0 -1
  75. package/dist/cjs/Router-Pztue5fk.js +0 -6
  76. package/dist/cjs/Router-Pztue5fk.js.map +0 -1
  77. package/dist/cjs/RouterError-BmvAyBlx.js +0 -2
  78. package/dist/cjs/RouterError-BmvAyBlx.js.map +0 -1
  79. package/dist/cjs/RouterValidator-DLy_W2du.d.ts +0 -114
  80. package/dist/cjs/RouterValidator-DLy_W2du.d.ts.map +0 -1
  81. package/dist/cjs/getPluginApi-CUcFDzuA.js +0 -2
  82. package/dist/cjs/getPluginApi-CUcFDzuA.js.map +0 -1
  83. package/dist/cjs/internals-na15rxo_.js.map +0 -1
  84. package/dist/cjs/utils.d.ts.map +0 -1
  85. package/dist/esm/Router-BeXr2zW4.d.mts.map +0 -1
  86. package/dist/esm/Router-CK8U23pP.mjs +0 -6
  87. package/dist/esm/Router-CK8U23pP.mjs.map +0 -1
  88. package/dist/esm/RouterError-D-Zjbdv9.mjs +0 -2
  89. package/dist/esm/RouterError-D-Zjbdv9.mjs.map +0 -1
  90. package/dist/esm/RouterValidator-C-PvV00i.d.mts +0 -114
  91. package/dist/esm/RouterValidator-C-PvV00i.d.mts.map +0 -1
  92. package/dist/esm/getPluginApi-CsTfDB-O.mjs +0 -2
  93. package/dist/esm/getPluginApi-CsTfDB-O.mjs.map +0 -1
  94. package/dist/esm/internals-CCymabFj.mjs.map +0 -1
  95. package/dist/esm/utils.d.mts.map +0 -1
@@ -1,2 +0,0 @@
1
- const e=Object.freeze({ROUTER_NOT_STARTED:`NOT_STARTED`,NO_START_PATH_OR_STATE:`NO_START_PATH_OR_STATE`,ROUTER_ALREADY_STARTED:`ALREADY_STARTED`,ROUTE_NOT_FOUND:`ROUTE_NOT_FOUND`,SAME_STATES:`SAME_STATES`,CANNOT_DEACTIVATE:`CANNOT_DEACTIVATE`,CANNOT_ACTIVATE:`CANNOT_ACTIVATE`,TRANSITION_ERR:`TRANSITION_ERR`,TRANSITION_CANCELLED:`CANCELLED`,ROUTER_DISPOSED:`DISPOSED`,PLUGIN_CONFLICT:`PLUGIN_CONFLICT`,CONTEXT_NAMESPACE_ALREADY_CLAIMED:`CONTEXT_NAMESPACE_ALREADY_CLAIMED`}),t=`@@router/UNKNOWN_ROUTE`,n={UNKNOWN_ROUTE:t},r={ROUTER_START:`onStart`,ROUTER_STOP:`onStop`,TRANSITION_START:`onTransitionStart`,TRANSITION_LEAVE_APPROVE:`onTransitionLeaveApprove`,TRANSITION_CANCEL:`onTransitionCancel`,TRANSITION_SUCCESS:`onTransitionSuccess`,TRANSITION_ERROR:`onTransitionError`},i={ROUTER_START:`$start`,ROUTER_STOP:`$stop`,TRANSITION_START:`$$start`,TRANSITION_LEAVE_APPROVE:`$$leaveApprove`,TRANSITION_CANCEL:`$$cancel`,TRANSITION_SUCCESS:`$$success`,TRANSITION_ERROR:`$$error`},a={maxDependencies:100,maxPlugins:50,maxListeners:1e4,warnListeners:1e3,maxEventDepth:5,maxLifecycleHandlers:200},o=Object.freeze({}),s=Object.freeze({deactivated:Object.freeze([]),activated:Object.freeze([]),intersection:``}),c=Object.freeze({phase:`activating`,reason:`success`,segments:s});function l(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.name==`string`&&typeof t.path==`string`&&typeof t.params==`object`&&t.params!==null}function u(e){if(!e)return e;if(!l(e))throw TypeError(`[deepFreezeState] Expected valid State object, got: ${typeof e}`);let t=structuredClone(e),n=new WeakSet;function r(e){if(!(typeof e!=`object`||!e)&&!n.has(e))if(n.add(e),Object.freeze(e),Array.isArray(e))for(let t of e)r(t);else for(let t in e)r(e[t])}return r(t),t}function d(e){return e&&Object.freeze(e)}function f(e={}){return{...a,...e}}function p(e){if(e===void 0)return e;let t={};for(let n in e){if(!Object.hasOwn(e,n))continue;let r=e[n];r!==void 0&&(t[n]=r)}return t}const m=new Set(Object.values(e)),h=new Set([`code`,`segment`,`path`,`redirect`]),g=new Set([`setCode`,`setErrorInstance`,`setAdditionalFields`,`hasField`,`getField`,`toJSON`]);var _=class extends Error{segment;path;redirect;code;constructor(e,{message:t,segment:n,path:r,redirect:i,...a}={}){super(t??e),this.code=e,this.segment=n,this.path=r,this.redirect=i?u(i):void 0;for(let[e,t]of Object.entries(a)){if(h.has(e))throw TypeError(`[RouterError] Cannot set reserved property "${e}"`);g.has(e)||(this[e]=t)}}setCode(e){this.code=e,m.has(this.message)&&(this.message=e)}setErrorInstance(e){if(!e)throw TypeError(`[RouterError.setErrorInstance] err parameter is required and must be an Error instance`);this.message=e.message,this.cause=e.cause,this.stack=e.stack??``}setAdditionalFields(e){for(let[t,n]of Object.entries(e)){if(h.has(t))throw TypeError(`[RouterError.setAdditionalFields] Cannot set reserved property "${t}"`);g.has(t)||(this[t]=n)}}hasField(e){return e in this}getField(e){return this[e]}toJSON(){let e={code:this.code,message:this.message};this.segment!==void 0&&(e.segment=this.segment),this.path!==void 0&&(e.path=this.path),this.redirect!==void 0&&(e.redirect=this.redirect);let t=new Set([`code`,`message`,`segment`,`path`,`redirect`,`stack`]);for(let n in this)Object.hasOwn(this,n)&&!t.has(n)&&(e[n]=this[n]);return e}};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return e}});
2
- //# sourceMappingURL=RouterError-BmvAyBlx.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RouterError-BmvAyBlx.js","names":[],"sources":["../../src/constants.ts","../../src/helpers.ts","../../src/RouterError.ts"],"sourcesContent":["// 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/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","// 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"],"mappings":"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"}
@@ -1,114 +0,0 @@
1
- //#region src/types/RouterValidator.d.ts
2
- /**
3
- * RouterValidator interface - defines all validation methods used by the router.
4
- *
5
- * This interface is implemented by the validation plugin and injected into RouterInternals.
6
- * When ctx.validator is null (default), validation is skipped.
7
- * When ctx.validator is set (by validation plugin), all methods are called.
8
- *
9
- * All parameters use `unknown` type to avoid coupling to internal type names.
10
- */
11
- interface RouterValidator {
12
- /**
13
- * Route validation methods
14
- */
15
- routes: {
16
- validateBuildPathArgs: (route: unknown) => void;
17
- validateMatchPathArgs: (path: unknown) => void;
18
- validateIsActiveRouteArgs: (name: unknown, params: unknown, strict: unknown, ignoreQP: unknown) => void;
19
- validateShouldUpdateNodeArgs: (name: unknown) => void;
20
- validateStateBuilderArgs: (name: unknown, params: unknown, caller: string) => void;
21
- validateAddRouteArgs: (routes: unknown) => void;
22
- validateRoutes: (routes: unknown[], tree: unknown) => void;
23
- validateRemoveRouteArgs: (name: unknown) => void;
24
- validateUpdateRouteBasicArgs: (name: unknown, updates: unknown) => void;
25
- validateUpdateRoutePropertyTypes: (name: string, updates: unknown) => void;
26
- validateUpdateRoute: (name: string, updates: unknown, tree: unknown) => void;
27
- validateParentOption: (parent: unknown, tree: unknown) => void;
28
- validateRouteName: (name: unknown, caller: string) => void;
29
- throwIfInternalRoute: (name: unknown, caller: string) => void;
30
- throwIfInternalRouteInArray: (routes: unknown[], caller: string) => void;
31
- validateExistingRoutes: (store: unknown) => void;
32
- validateForwardToConsistency: (store: unknown) => void;
33
- validateSetRootPathArgs: (rootPath: unknown) => void;
34
- guardRouteCallbacks: (route: unknown) => void;
35
- guardNoAsyncCallbacks: (route: unknown) => void;
36
- };
37
- /**
38
- * Options validation methods
39
- */
40
- options: {
41
- validateLimitValue: (name: string, value: unknown) => void;
42
- validateLimits: (limits: unknown) => void;
43
- validateOptions: (options: unknown, methodName: string) => void;
44
- validateResolvedDefaultRoute: (routeName: unknown, store: unknown) => void;
45
- };
46
- /**
47
- * Dependencies validation methods
48
- */
49
- dependencies: {
50
- validateDependencyName: (name: unknown, caller: string) => void;
51
- validateSetDependencyArgs: (name: unknown, value: unknown, caller: string) => void;
52
- validateDependenciesObject: (deps: unknown, caller: string) => void;
53
- validateDependencyExists: (name: string, store: unknown) => void;
54
- validateDependencyLimit: (store: unknown, limits: unknown) => void;
55
- validateDependenciesStructure: (store: unknown) => void;
56
- validateDependencyCount: (store: unknown, methodName: string) => void;
57
- validateCloneArgs: (dependencies: unknown) => void;
58
- warnOverwrite: (name: string, methodName: string) => void;
59
- warnBatchOverwrite: (keys: string[], methodName: string) => void;
60
- warnRemoveNonExistent: (name: unknown) => void;
61
- };
62
- /**
63
- * Plugin validation methods
64
- */
65
- plugins: {
66
- validatePluginLimit: (count: number, limits: unknown) => void;
67
- validateNoDuplicatePlugins: (factory: unknown, factories: unknown[]) => void;
68
- validatePluginKeys: (plugin: unknown) => void;
69
- validateCountThresholds: (count: number) => void;
70
- warnBatchDuplicates: (plugins: unknown[]) => void;
71
- warnPluginMethodType: (methodName: string) => void;
72
- warnPluginAfterStart: (methodName: string) => void;
73
- validateAddInterceptorArgs: (method: unknown, fn: unknown) => void;
74
- };
75
- /**
76
- * Lifecycle guard validation methods
77
- */
78
- lifecycle: {
79
- validateHandler: (handler: unknown, caller: string) => void;
80
- validateNotRegistering: (name: string, guards: unknown, caller: string) => void;
81
- validateHandlerLimit: (count: number, limits: unknown, caller: string) => void;
82
- validateCountThresholds: (count: number, methodName: string) => void;
83
- warnOverwrite: (name: string, type: string, methodName: string) => void;
84
- warnAsyncGuardSync: (name: string, methodName: string) => void;
85
- };
86
- /**
87
- * Navigation validation methods
88
- */
89
- navigation: {
90
- validateNavigateArgs: (name: unknown) => void;
91
- validateNavigateToDefaultArgs: (options: unknown) => void;
92
- validateNavigateToStateArgs: (state: unknown) => void;
93
- validateNavigationOptions: (options: unknown, caller: string) => void;
94
- validateParams: (params: unknown, methodName: string) => void;
95
- validateStartArgs: (path: unknown) => void;
96
- };
97
- /**
98
- * State validation methods
99
- */
100
- state: {
101
- validateMakeStateArgs: (name: unknown, params: unknown, path: unknown) => void;
102
- validateAreStatesEqualArgs: (s1: unknown, s2: unknown, ignoreQP: unknown) => void;
103
- };
104
- /**
105
- * Event bus validation methods
106
- */
107
- eventBus: {
108
- validateEventName: (name: unknown) => void;
109
- validateListenerArgs: (name: unknown, cb: unknown) => void;
110
- };
111
- }
112
- //#endregion
113
- export { RouterValidator as t };
114
- //# sourceMappingURL=RouterValidator-DLy_W2du.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RouterValidator-DLy_W2du.d.ts","names":[],"sources":["../../src/types/RouterValidator.ts"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- const e=require(`./RouterError-BmvAyBlx.js`),t=require(`./internals-na15rxo_.js`);function n(t){if(t())throw new e.t(e.u.ROUTER_DISPOSED)}const r=new WeakMap;function i(i){let a=r.get(i);if(a)return a;let o=t.r(i),s={makeState:(e,t,n,r)=>(o.validator?.state.validateMakeStateArgs(e,t,n),o.makeState(e,t,n,r?.params)),buildState:(e,t)=>{o.validator?.routes.validateStateBuilderArgs(e,t,`buildState`);let{name:n,params:r}=o.forwardState(e,t);return o.buildStateResolved(n,r)},forwardState:(e,t)=>(o.validator?.routes.validateStateBuilderArgs(e,t,`forwardState`),o.forwardState(e,t)),matchPath:e=>(o.validator?.routes.validateMatchPathArgs(e),o.matchPath(e,o.getOptions())),navigateToState:(e,t)=>(n(o.isDisposed),o.validator?.navigation.validateNavigateToStateArgs(e),t!==void 0&&o.validator?.navigation.validateNavigationOptions(t,`navigateToState`),o.navigateToState(e,t)),setRootPath:e=>{n(o.isDisposed),o.validator?.routes.validateSetRootPathArgs(e),o.setRootPath(e)},getRootPath:o.getRootPath,addEventListener:(e,t)=>(n(o.isDisposed),o.validator?.eventBus.validateListenerArgs(e,t),o.addEventListener(e,t)),buildNavigationState:(e,t={})=>{o.validator?.routes.validateStateBuilderArgs(e,t,`buildNavigationState`);let{name:n,params:r}=o.forwardState(e,t),i=o.buildStateResolved(n,r);if(i)return o.makeState(i.name,i.params,o.buildPath(i.name,i.params),i.meta)},getOptions:o.getOptions,getTree:o.getTree,addInterceptor:(e,t)=>{n(o.isDisposed),o.validator?.plugins.validateAddInterceptorArgs(e,t);let r=o.interceptors.get(e);return r||(r=[],o.interceptors.set(e,r)),r.push(t),()=>{let e=r.indexOf(t);e!==-1&&r.splice(e,1)}},getRouteConfig:e=>{let t=o.routeGetStore();if(t.matcher.hasRoute(e))return t.routeCustomFields[e]},extendRouter:t=>{n(o.isDisposed);let r=Object.keys(t);for(let t of r)if(t in i)throw new e.t(e.u.PLUGIN_CONFLICT,{message:`Cannot extend router: property "${t}" already exists`});for(let e of r)i[e]=t[e];let a={keys:r};o.routerExtensions.push(a);let s=!1;return()=>{if(s)return;s=!0;for(let e of a.keys)delete i[e];let e=o.routerExtensions.indexOf(a);e!==-1&&o.routerExtensions.splice(e,1)}},emitTransitionError:e=>{n(o.isDisposed),o.emitTransitionError(e)},claimContextNamespace:(t=>{if(n(o.isDisposed),o.contextClaimRecords.has(t))throw new e.t(e.u.CONTEXT_NAMESPACE_ALREADY_CLAIMED,{message:`Cannot claim context namespace: "${t}" is already claimed by another plugin`});return o.contextClaimRecords.add(t),{write(e,n){e.context[t]=n},release(){o.contextClaimRecords.delete(t)}}})};return r.set(i,s),s}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
2
- //# sourceMappingURL=getPluginApi-CUcFDzuA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getPluginApi-CUcFDzuA.js","names":["RouterError","errorCodes","getInternals","RouterError","errorCodes"],"sources":["../../src/api/helpers.ts","../../src/api/getPluginApi.ts"],"sourcesContent":["// packages/core/src/api/helpers.ts\n\nimport { errorCodes } from \"../constants\";\nimport { RouterError } from \"../RouterError\";\n\nexport function throwIfDisposed(isDisposed: () => boolean): void {\n if (isDisposed()) {\n throw new RouterError(errorCodes.ROUTER_DISPOSED);\n }\n}\n","import { throwIfDisposed } from \"./helpers\";\nimport { errorCodes } from \"../constants\";\nimport { getInternals } from \"../internals\";\nimport { RouterError } from \"../RouterError\";\n\nimport type { PluginApi } from \"./types\";\nimport type {\n ContextNamespaceClaim,\n DefaultDependencies,\n Params,\n Router,\n State,\n} from \"@real-router/types\";\n\n// Cache the assembled PluginApi per router — mirrors getNavigator() (#525):\n// avoids re-allocating the closure-bag on each call (plugins call this once\n// at init, but tests + nested plugins poll it), and gives spy/stub helpers\n// a stable object identity to attach to (e.g. spying on\n// `getPluginApi(router).navigateToState` to inject errors in popstate\n// recovery tests).\nconst cache = new WeakMap<object, PluginApi>();\n\nexport function getPluginApi<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(router: Router<Dependencies>): PluginApi {\n const cached = cache.get(router);\n\n if (cached) {\n return cached;\n }\n\n const ctx = getInternals(router);\n const api: PluginApi = {\n makeState: (name, params, path, meta) => {\n ctx.validator?.state.validateMakeStateArgs(name, params, path);\n\n return ctx.makeState(\n name,\n params,\n path,\n meta?.params as\n | Record<string, Record<string, \"url\" | \"query\">>\n | undefined,\n );\n },\n buildState: (routeName, routeParams) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"buildState\",\n );\n\n const { name, params } = ctx.forwardState(routeName, routeParams);\n\n return ctx.buildStateResolved(name, params);\n },\n forwardState: <P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n routeName,\n routeParams,\n \"forwardState\",\n );\n\n return ctx.forwardState(routeName, routeParams);\n },\n matchPath: (path) => {\n ctx.validator?.routes.validateMatchPathArgs(path);\n\n return ctx.matchPath(path, ctx.getOptions());\n },\n navigateToState: (state, options) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.navigation.validateNavigateToStateArgs(state);\n\n if (options !== undefined) {\n ctx.validator?.navigation.validateNavigationOptions(\n options,\n \"navigateToState\",\n );\n }\n\n return ctx.navigateToState(state, options);\n },\n setRootPath: (rootPath) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.routes.validateSetRootPathArgs(rootPath);\n\n ctx.setRootPath(rootPath);\n },\n getRootPath: ctx.getRootPath,\n addEventListener: (eventName, cb) => {\n throwIfDisposed(ctx.isDisposed);\n\n ctx.validator?.eventBus.validateListenerArgs(eventName, cb);\n\n return ctx.addEventListener(eventName, cb);\n },\n buildNavigationState: (name, params = {}) => {\n ctx.validator?.routes.validateStateBuilderArgs(\n name,\n params,\n \"buildNavigationState\",\n );\n\n const { name: resolvedName, params: resolvedParams } = ctx.forwardState(\n name,\n params,\n );\n const routeInfo = ctx.buildStateResolved(resolvedName, resolvedParams);\n\n if (!routeInfo) {\n return;\n }\n\n return ctx.makeState(\n routeInfo.name,\n routeInfo.params,\n ctx.buildPath(routeInfo.name, routeInfo.params),\n routeInfo.meta,\n );\n },\n getOptions: ctx.getOptions,\n getTree: ctx.getTree,\n addInterceptor: (method, fn) => {\n throwIfDisposed(ctx.isDisposed);\n ctx.validator?.plugins.validateAddInterceptorArgs(method, fn);\n let list = ctx.interceptors.get(method);\n\n if (!list) {\n list = [];\n ctx.interceptors.set(method, list);\n }\n\n list.push(fn);\n\n return () => {\n const index = list.indexOf(fn);\n\n if (index !== -1) {\n list.splice(index, 1);\n }\n };\n },\n getRouteConfig: (name) => {\n const store = ctx.routeGetStore();\n\n if (!store.matcher.hasRoute(name)) {\n return;\n }\n\n return store.routeCustomFields[name];\n },\n extendRouter: (extensions: Record<string, unknown>) => {\n throwIfDisposed(ctx.isDisposed);\n\n const keys = Object.keys(extensions);\n\n for (const key of keys) {\n if (key in router) {\n throw new RouterError(errorCodes.PLUGIN_CONFLICT, {\n message: `Cannot extend router: property \"${key}\" already exists`,\n });\n }\n }\n\n for (const key of keys) {\n (router as Record<string, unknown>)[key] = extensions[key];\n }\n\n const extensionRecord = { keys };\n\n ctx.routerExtensions.push(extensionRecord);\n\n let removed = false;\n\n return () => {\n if (removed) {\n return;\n }\n\n removed = true;\n\n for (const key of extensionRecord.keys) {\n delete (router as Record<string, unknown>)[key];\n }\n\n const idx = ctx.routerExtensions.indexOf(extensionRecord);\n\n if (idx !== -1) {\n ctx.routerExtensions.splice(idx, 1);\n }\n };\n },\n emitTransitionError: (error) => {\n throwIfDisposed(ctx.isDisposed);\n ctx.emitTransitionError(error);\n },\n claimContextNamespace: ((namespace: string) => {\n throwIfDisposed(ctx.isDisposed);\n\n if (ctx.contextClaimRecords.has(namespace)) {\n throw new RouterError(errorCodes.CONTEXT_NAMESPACE_ALREADY_CLAIMED, {\n message: `Cannot claim context namespace: \"${namespace}\" is already claimed by another plugin`,\n });\n }\n\n ctx.contextClaimRecords.add(namespace);\n\n return {\n write(state: State, value: unknown) {\n (state.context as Record<string, unknown>)[namespace] = value;\n },\n release() {\n ctx.contextClaimRecords.delete(namespace);\n },\n } satisfies ContextNamespaceClaim;\n }) as PluginApi[\"claimContextNamespace\"],\n };\n\n cache.set(router, api);\n\n return api;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"internals-na15rxo_.js","names":[],"sources":["../../src/internals.ts"],"sourcesContent":["import type { DependenciesStore } from \"./namespaces/DependenciesNamespace\";\nimport type { RoutesStore } from \"./namespaces/RoutesNamespace\";\nimport type { Router as RouterClass } from \"./Router\";\nimport type { EventMethodMap, GuardFnFactory, PluginFactory } from \"./types\";\nimport type { RouterValidator } from \"./types/RouterValidator\";\nimport type {\n DefaultDependencies,\n EventName,\n NavigationOptions,\n Options,\n Params,\n Plugin,\n Router as RouterInterface,\n RouteTreeState,\n SimpleState,\n State,\n Unsubscribe,\n} from \"@real-router/types\";\nimport type { RouteTree } from \"route-tree\";\n\nexport interface RouterInternals<\n D extends DefaultDependencies = DefaultDependencies,\n> {\n readonly makeState: <P extends Params = Params>(\n name: string,\n params?: P,\n path?: string,\n meta?: Record<string, Record<string, \"url\" | \"query\">>,\n ) => State<P>;\n\n readonly forwardState: <P extends Params = Params>(\n routeName: string,\n routeParams: P,\n ) => SimpleState<P>;\n\n readonly buildStateResolved: (\n resolvedName: string,\n resolvedParams: Params,\n ) => RouteTreeState | undefined;\n\n readonly matchPath: <P extends Params = Params>(\n path: string,\n options?: Options,\n ) => State<P> | undefined;\n\n readonly getOptions: () => Options;\n\n readonly addEventListener: <E extends EventName>(\n eventName: E,\n cb: Plugin[EventMethodMap[E]],\n ) => Unsubscribe;\n\n readonly buildPath: (route: string, params?: Params) => string;\n\n readonly emitTransitionError: (error: Error) => void;\n\n readonly start: (path: string) => Promise<State>;\n\n /**\n * Plugin-only navigation entry point — delegates to\n * `NavigationNamespace.navigateToState` (`getPluginApi(router).navigateToState`).\n * Hidden from `Router`/`Navigator` to keep the userland surface minimal;\n * see `core-types/src/api.ts` for usage docs.\n */\n readonly navigateToState: (\n state: State,\n options?: NavigationOptions,\n ) => Promise<State>;\n\n /* eslint-disable @typescript-eslint/no-explicit-any -- heterogeneous map: stores different InterceptorFn<M> types under different keys */\n readonly interceptors: Map<\n string,\n ((next: (...args: any[]) => any, ...args: any[]) => any)[]\n >;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n readonly setRootPath: (rootPath: string) => void;\n readonly getRootPath: () => string;\n\n readonly getTree: () => RouteTree;\n\n readonly isDisposed: () => boolean;\n\n validator: RouterValidator | null;\n\n // Dependencies (issue #172)\n readonly dependenciesGetStore: () => DependenciesStore<D>;\n\n // Clone support (issue #173)\n readonly cloneOptions: () => Options;\n readonly cloneDependencies: () => Record<string, unknown>;\n readonly getLifecycleFactories: () => [\n Record<string, GuardFnFactory<D>>,\n Record<string, GuardFnFactory<D>>,\n ];\n readonly getPluginFactories: () => PluginFactory<D>[];\n\n // Consolidated route data store (issue #174 Phase 2)\n readonly routeGetStore: () => RoutesStore<D>;\n\n // Cross-namespace state (issue #174)\n readonly getStateName: () => string | undefined;\n readonly isTransitioning: () => boolean;\n readonly clearState: () => void;\n readonly setState: (state: State) => void;\n readonly routerExtensions: { keys: string[] }[];\n readonly contextClaimRecords: Set<string>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- existential type: stores RouterInternals for all Dependencies types\nconst internals = new WeakMap<object, RouterInternals<any>>();\n\nexport function getInternals<D extends DefaultDependencies>(\n router: RouterInterface<D>,\n): RouterInternals<D> {\n const ctx = internals.get(router);\n\n if (!ctx) {\n throw new TypeError(\n \"[real-router] Invalid router instance — not found in internals registry\",\n );\n }\n\n return ctx as RouterInternals<D>;\n}\n\nexport function registerInternals<D extends DefaultDependencies>(\n router: RouterClass<D>,\n ctx: RouterInternals<D>,\n): void {\n internals.set(router, ctx);\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument -- internal chain execution: type safety enforced at public API boundary (PluginApi.addInterceptor) */\nfunction executeInterceptorChain<T>(\n interceptors: ((next: (...args: any[]) => any, ...args: any[]) => any)[],\n original: (...args: any[]) => T,\n args: any[],\n): T {\n let chain = original as (...args: any[]) => any;\n\n for (const interceptor of interceptors) {\n const prev = chain;\n\n chain = (...chainArgs: any[]) => interceptor(prev, ...chainArgs);\n }\n\n return chain(...args) as T;\n}\n\nexport function createInterceptable<T extends (...args: any[]) => any>(\n name: string,\n original: T,\n interceptors: Map<\n string,\n ((next: (...args: any[]) => any, ...args: any[]) => any)[]\n >,\n): T {\n return ((...args: any[]) => {\n const chain = interceptors.get(name);\n\n if (!chain || chain.length === 0) {\n return original(...args);\n }\n\n return executeInterceptorChain(chain, original, args);\n }) as T;\n}\n\nexport function createInterceptable2<A, B, R>(\n name: string,\n original: (a: A, b: B) => R,\n interceptors: Map<\n string,\n ((next: (...args: any[]) => any, ...args: any[]) => any)[]\n >,\n): (a: A, b: B) => R {\n return (arg1: A, arg2: B) => {\n const chain = interceptors.get(name);\n\n if (!chain || chain.length === 0) {\n return original(arg1, arg2);\n }\n\n return executeInterceptorChain(chain, original, [arg1, arg2]);\n };\n}\n/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-argument */\n"],"mappings":"AA8GA,MAAM,EAAY,IAAI,QAEtB,SAAgB,EACd,EACoB,CACpB,IAAM,EAAM,EAAU,IAAI,EAAO,CAEjC,GAAI,CAAC,EACH,MAAU,UACR,0EACD,CAGH,OAAO,EAGT,SAAgB,EACd,EACA,EACM,CACN,EAAU,IAAI,EAAQ,EAAI,CAI5B,SAAS,EACP,EACA,EACA,EACG,CACH,IAAI,EAAQ,EAEZ,IAAK,IAAM,KAAe,EAAc,CACtC,IAAM,EAAO,EAEb,GAAS,GAAG,IAAqB,EAAY,EAAM,GAAG,EAAU,CAGlE,OAAO,EAAM,GAAG,EAAK,CAGvB,SAAgB,EACd,EACA,EACA,EAIG,CACH,QAAS,GAAG,IAAgB,CAC1B,IAAM,EAAQ,EAAa,IAAI,EAAK,CAMpC,MAJI,CAAC,GAAS,EAAM,SAAW,EACtB,EAAS,GAAG,EAAK,CAGnB,EAAwB,EAAO,EAAU,EAAK,GAIzD,SAAgB,EACd,EACA,EACA,EAImB,CACnB,OAAQ,EAAS,IAAY,CAC3B,IAAM,EAAQ,EAAa,IAAI,EAAK,CAMpC,MAJI,CAAC,GAAS,EAAM,SAAW,EACtB,EAAS,EAAM,EAAK,CAGtB,EAAwB,EAAO,EAAU,CAAC,EAAM,EAAK,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/utils/getStaticPaths.ts","../../src/utils/hydrateRouter.ts","../../src/utils/serializeRouterState.ts","../../src/utils/serializeState.ts"],"mappings":";;;KAKY,iBAAA,GAAoB,MAAA,eAExB,OAAA,CAAQ,MAAA;AAAA,iBAiBM,cAAA,sBACC,mBAAA,GAAsB,mBAAA,CAAA,CAE3C,MAAA,EAAQ,MAAA,CAAO,YAAA,GACf,OAAA,GAAU,iBAAA,GACT,OAAA;;;;;AAxBH;;;;;;;;;;;;;AAmBA;;;;;iBCFgB,aAAA,CACd,MAAA,EAAQ,MAAA,EACR,MAAA;EAAmB,IAAA;AAAA,IAClB,OAAA,CAAQ,KAAA;;;UCrBM,2BAAA;;AFCjB;;;;;;EEOE,cAAA;AAAA;;;;;;AFYF;;;;;;;;;;;;;;;;;;;;;;;;;iBEqBgB,oBAAA,CACd,KAAA,EAAO,KAAA,EACP,OAAA,GAAU,2BAAA;;;;;;AF1CZ;;;;;;;;;iBGOgB,cAAA,CAAe,IAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Router-BeXr2zW4.d.mts","names":["ConstraintPattern","RegExp","pattern","constraint","ParamMeta","Record","Readonly","ReadonlyMap","urlParams","queryParams","spatParams","paramTypeMap","constraintPatterns","pathPattern","URLParamsEncodingType","MatcherInputNode","name","path","fullName","absolute","children","nonAbsoluteChildren","paramMeta","staticPath","CompiledRoute","ReadonlySet","BuildParamSlot","MatchResult","parent","depth","matchSegments","meta","declaredQueryParams","declaredQueryParamsSet","hasTrailingSlash","hasConstraints","buildStaticParts","buildParamSlots","buildParamNamesSet","cachedResult","forwardTo","defaultParams","paramName","encoder","value","isOptional","BuildPathOptions","queryParamsMode","trailingSlash","SegmentNode","staticChildren","hasChildren","paramChild","node","splatChild","route","slashChildRoute","segments","params","SegmentMatcherOptions","caseSensitive","strictTrailingSlash","strictQueryParams","urlParamsEncoding","parseQueryString","queryString","buildQueryString","ResolvedMatcherOptions","buildParamMeta","validateConstraints","encodeURIComponentExcludingSubDelims","segment","ENCODING_METHODS","param","DECODING_METHODS","encodeParam","encoding","isSpatParam","createSegmentNode","SegmentMatcher","private","options","constructor","registerTree","match","buildPath","getSegmentsByName","getMetaByName","hasRoute","setRootPath","rootPath","ArrayFormat","BooleanFormat","NullFormat","NumberFormat","Options","arrayFormat","booleanFormat","nullFormat","numberFormat","FinalOptions","QueryParamPrimitive","QueryParamValue","SearchParams","Record","OmitResponse","querystring","removedParams","KeepResponse","keptParams","DecodeResult","parse","path","opts","parseInto","queryString","target","build","params","omit","paramsToOmit","keep","paramsToKeep","DEFAULT_QUERY_PARAMS","ParamMeta","SegmentMatcher","URLParamsEncodingType","DEFAULT_QUERY_PARAMS","Options","RouteDefinition","key","name","path","children","RouteTree","ReadonlyMap","Record","Readonly","absolute","paramMeta","parent","nonAbsoluteChildren","fullName","staticPath","paramTypeMap","TreeBuildOptions","skipFreeze","QueryParamsMode","TrailingSlashMode","BasePathOptions","trailingSlashMode","queryParamsMode","queryParams","urlParamsEncoding","BuildOptions","ignoreConstraints","MatchOptions","strictTrailingSlash","strongMatching","ParamSource","ParamTypeMap","RouteTreeStateMeta","MatchResult","P","RouteParams","segments","params","meta","RouteTreeState","createRouteTree","routes","options","getSegmentsByName","tree","routeName","nodeToDefinition","node","routeTreeToDefinitions","QueryParamsConfig","CreateMatcherOptions","caseSensitive","strictQueryParams","Matcher","createMatcher","validateRoute","Set","Map","route","methodName","rootNode","parentName","seenNames","seenPathsByParent"],"sources":["../../../path-matcher/dist/esm/index.d.mts","../../../search-params/dist/esm/index.d.mts","../../../route-tree/dist/esm/index.d.mts","../../src/types.ts","../../src/Router.ts"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import{a as e,d as t,f as n,i as r,l as i,n as a,o,r as s,s as c,t as l,u}from"./RouterError-D-Zjbdv9.mjs";import{i as d,n as f,r as p,t as m}from"./internals-CCymabFj.mjs";import{logger as h}from"@real-router/logger";import{FSM as g}from"@real-router/fsm";const ee={maxListeners:0,warnListeners:0,maxEventDepth:0};var _=class extends Error{},v=class{#e=new Map;#t=null;#n=ee;#r;#i;constructor(e){e?.limits&&(this.#n=e.limits),this.#r=e?.onListenerError??null,this.#i=e?.onListenerWarn??null}static validateCallback(e,t){if(typeof e!=`function`)throw TypeError(`Expected callback to be a function for event ${t}`)}setLimits(e){this.#n=e}on(e,t){let n=this.#c(e);if(n.has(t))throw Error(`Duplicate listener for "${e}"`);let{maxListeners:r,warnListeners:i}=this.#n;if(i!==0&&n.size===i&&this.#i?.(e,i),r!==0&&n.size>=r)throw Error(`Listener limit (${r}) reached for "${e}"`);return n.add(t),()=>{this.off(e,t)}}off(e,t){this.#e.get(e)?.delete(t)}emit(e,t,n,r,i){let a=this.#e.get(e);if(!a||a.size===0)return;let o=arguments.length-1;if(this.#n.maxEventDepth===0){this.#a(a,e,o,t,n,r,i);return}this.#s(a,e,o,t,n,r,i)}clearAll(){this.#e.clear(),this.#t=null}listenerCount(e){return this.#e.get(e)?.size??0}#a(e,t,n,r,i,a,o){if(e.size===1){let[s]=e;try{this.#o(s,n,r,i,a,o)}catch(e){this.#r?.(t,e)}return}let s=[...e];for(let e of s)try{this.#o(e,n,r,i,a,o)}catch(e){this.#r?.(t,e)}}#o(e,t,n,r,i,a){switch(t){case 0:e();break;case 1:e(n);break;case 2:e(n,r);break;case 3:e(n,r,i);break;default:e(n,r,i,a)}}#s(e,t,n,r,i,a,o){this.#t??=new Map;let s=this.#t,c=s.get(t)??0;if(c>=this.#n.maxEventDepth)throw new _(`Maximum recursion depth (${this.#n.maxEventDepth}) exceeded for event: ${t}`);try{s.set(t,c+1);let l=e.size===1?e:[...e];for(let e of l)try{this.#o(e,n,r,i,a,o)}catch(e){if(e instanceof _)throw e;this.#r?.(t,e)}}finally{s.set(t,s.get(t)-1)}}#c(e){let t=this.#e.get(e);if(t)return t;let n=new Set;return this.#e.set(e,n),n}};const y={IDLE:`IDLE`,STARTING:`STARTING`,READY:`READY`,TRANSITION_STARTED:`TRANSITION_STARTED`,LEAVE_APPROVED:`LEAVE_APPROVED`,DISPOSED:`DISPOSED`},b={START:`START`,STARTED:`STARTED`,NAVIGATE:`NAVIGATE`,LEAVE_APPROVE:`LEAVE_APPROVE`,COMPLETE:`COMPLETE`,FAIL:`FAIL`,CANCEL:`CANCEL`,STOP:`STOP`,DISPOSE:`DISPOSE`},te={initial:y.IDLE,context:null,transitions:{[y.IDLE]:{[b.START]:y.STARTING,[b.DISPOSE]:y.DISPOSED},[y.STARTING]:{[b.STARTED]:y.READY,[b.FAIL]:y.IDLE},[y.READY]:{[b.NAVIGATE]:y.TRANSITION_STARTED,[b.FAIL]:y.READY,[b.STOP]:y.IDLE},[y.TRANSITION_STARTED]:{[b.NAVIGATE]:y.TRANSITION_STARTED,[b.LEAVE_APPROVE]:y.LEAVE_APPROVED,[b.CANCEL]:y.READY,[b.FAIL]:y.READY},[y.LEAVE_APPROVED]:{[b.NAVIGATE]:y.TRANSITION_STARTED,[b.COMPLETE]:y.READY,[b.CANCEL]:y.READY,[b.FAIL]:y.READY},[y.DISPOSED]:{}}};function ne(){return new g(te)}function re(e){if(!e||typeof e!=`object`||e.constructor!==Object)throw TypeError(`dependencies must be a plain object`);for(let t in e)if(Object.getOwnPropertyDescriptor(e,t)?.get)throw TypeError(`dependencies cannot contain getters: "${t}"`)}function x(e,t){for(let n of e){let e=n;if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(`route must be a non-array object`);t?.routes.guardRouteCallbacks(n),t?.routes.guardNoAsyncCallbacks(n);let r=n.children;r&&x(r,t)}}function ie(t={}){let n=Object.create(null);for(let e in t)t[e]!==void 0&&(n[e]=t[e]);return{dependencies:n,limits:e}}function ae(e){return`(${e.replaceAll(/(^<|>$)/g,``)})`}const oe=/([:*])([^/?<]+)(<[^>]+>)?(\?)?/g,se=/([:*][^/?<]+(?:<[^>]+>)?)\?(?=\/|$)/g,ce=/\?(.+)$/;function le(e){let t=[],n=[],r=[],i={},a=new Map,o=e.replaceAll(se,`$1`),s=ce.exec(o);if(s!==null){let t=s[1].split(`&`);for(let e of t){let t=e.trim();t.length>0&&(n.push(t),i[t]=`query`)}e=e.slice(0,s.index)}let c;for(;(c=oe.exec(e))!==null;){let e=c[1],n=c[2],o=c[3];if(e===`*`)r.push(n),t.push(n),i[n]=`url`;else if(t.push(n),i[n]=`url`,o){let e=`^${ae(o)}$`;a.set(n,{pattern:new RegExp(e),constraint:o})}}return{urlParams:t,queryParams:n,spatParams:r,paramTypeMap:i,constraintPatterns:a,pathPattern:e}}const ue=/[^\w!$'()*+,.:;|~-]/gu,de=/[^\w!$'()*+,.:;|~-]/u,fe={default:e=>de.test(e)?e.replaceAll(ue,e=>encodeURIComponent(e)):e,uri:encodeURI,uriComponent:encodeURIComponent,none:e=>e},pe={default:decodeURIComponent,uri:decodeURI,uriComponent:decodeURIComponent,none:e=>e};function S(){return{staticChildren:Object.create(null),hasChildren:!1,paramChild:void 0,splatChild:void 0,route:void 0,slashChildRoute:void 0}}function C(e){return e.length>1&&e.endsWith(`/`)?e.slice(0,-1):e}function me(e,t){return e===``?t:t===``?e:e+t}function he(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function ge(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(!he(n)||!he(r))return!1;t+=3}else t++;return!0}const w=/<[^>]*>/g;function _e(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(w,``),u=o?l:me(n,l),d=i;a||(d=ve(e,t,u,o?``:n,r,i));for(let n of t.children.values())_e(e,n,u,r,d);a||r.pop()}function ve(e,t,n,r,i,a){let o=Se(n,r),s=Object.freeze([...i]),c=ye(s),l=C(n),u=ke(e.rootQueryParams,i),d=Ae(i),{buildStaticParts:f,buildParamSlots:p}=Oe(o?C(r):l,o?i.slice(0,-1):i,e.options.urlParamsEncoding),m={name:t.fullName,parent:a,depth:i.length-1,matchSegments:s,meta:c,declaredQueryParams:u,declaredQueryParamsSet:new Set(u),hasTrailingSlash:n.length>1&&n.endsWith(`/`),constraintPatterns:d,hasConstraints:d.size>0,buildStaticParts:f,buildParamSlots:p,buildParamNamesSet:new Set(p.map(e=>e.paramName))};return t.paramMeta.urlParams.length===0&&(m.cachedResult=Object.freeze({segments:m.matchSegments,params:Object.freeze({}),meta:m.meta})),e.routesByName.set(t.fullName,m),e.segmentsByName.set(t.fullName,s),e.metaByName.set(t.fullName,c),o?be(e,m,r):xe(e,m,n,l,t),m}function ye(e){let t={};for(let n of e)t[n.fullName]=n.paramTypeMap;return Object.freeze(t)}function be(e,t,n){we(e,t,n);let r=C(n),i=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.has(i)&&e.staticCache.set(i,t)}function xe(e,t,n,r,i){if(Ce(e,t,n),i.paramMeta.urlParams.length===0){let n=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.set(n,t)}}function Se(e,t){return C(e)===C(t)}function Ce(e,t,n){let r=C(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(w,``).replace(/\?$/,``);t.paramChild??={node:S(),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=De(e,t,c),r=s+1}t.route=i}function we(e,t,n){let r=Te(e,n);r.slashChildRoute=t}function Te(e,t){return Ee(e,e.root,t)}function Ee(e,t,n){let r=C(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=De(e,i,s),a=n+1}return i}function De(e,t,n){if(n.startsWith(`*`)){let e=n.slice(1);return t.splatChild??={node:S(),name:e},t.hasChildren=!0,t.splatChild.node}if(n.startsWith(`:`)){let e=n.slice(1).replaceAll(w,``).replace(/\?$/,``);return t.paramChild??={node:S(),name:e},t.hasChildren=!0,t.paramChild.node}let r=e.options.caseSensitive?n:n.toLowerCase();return r in t.staticChildren||(t.staticChildren[r]=S(),t.hasChildren=!0),t.staticChildren[r]}function Oe(e,t,n){let r=new Set,i=new Set;for(let e of t){for(let t of e.paramMeta.urlParams)r.add(t);for(let t of e.paramMeta.spatParams)i.add(t)}if(r.size===0)return{buildStaticParts:[e],buildParamSlots:[]};let a=[],o=[],s=/[:*]([\w]+)(?:<[^>]*>)?(\?)?/gu,c=0,l;for(;(l=s.exec(e))!==null;){let t=l[1],r=l[2]===`?`;a.push(e.slice(c,l.index));let s=i.has(t)?e=>{let t=fe[n],r=e.split(`/`),i=t(r[0]);for(let e=1;e<r.length;e++)i+=`/${t(r[e])}`;return i}:fe[n];o.push({paramName:t,isOptional:r,encoder:s}),c=l.index+l[0].length}return a.push(e.slice(c)),{buildStaticParts:a,buildParamSlots:o}}function ke(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 Ae(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 je=class{get options(){return this.#e}#e;#t=S();#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:pe[this.#e.urlParamsEncoding]}registerTree(e){this.#c=e.paramMeta.queryParams,_e({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=C(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(!ge(r))return!1;e[n]=t(r)}}return!0}#w(e,t){for(let[n,r]of t.constraintPatterns)if(!r.pattern.test(e[n]))return!1;return!0}};const 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)},Me=(e,t)=>{if(e===void 0)return t.boolean.decodeUndefined();let n=t.boolean.decodeRaw(e);if(n!==null)return n;let r=E(e),i=t.number.decode(r);return i===null?t.boolean.decodeValue(r):i},D=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)},Ne={none:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}=${D(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}=${D(t[r])}`;return n}},brackets:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}[]=${D(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}[]=${D(t[r])}`;return n}},index:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}[0]=${D(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}[${r}]=${D(t[r])}`;return n}},comma:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}=${D(t[0])}`;for(let e=1;e<t.length;e++)n+=`,${D(t[e])}`;return n},decodeValue:e=>e.includes(`,`)?e.split(`,`):null}},Pe={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}},Fe={default:{encode:e=>e},hidden:{encode:()=>``}},O={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}},Ie=(e,t,n,r)=>({boolean:Pe[t],null:Fe[n],number:O[r],array:Ne[e]}),Le={boolean:Pe.auto,null:Fe.default,number:O.auto,array:Ne.none},k={arrayFormat:`none`,booleanFormat:`auto`,nullFormat:`default`,numberFormat:`auto`},Re={...k,strategies:Le},ze=e=>{if(!e||e.arrayFormat===void 0&&e.booleanFormat===void 0&&e.nullFormat===void 0&&e.numberFormat===void 0)return Re;let t=e.arrayFormat??k.arrayFormat,n=e.booleanFormat??k.booleanFormat,r=e.nullFormat??k.nullFormat,i=e.numberFormat??k.numberFormat;return{arrayFormat:t,booleanFormat:n,nullFormat:r,numberFormat:i,strategies:Ie(t,n,r,i)}},A=e=>encodeURIComponent(e),Be=(e,t,n)=>{let r=A(e);switch(typeof t){case`string`:case`number`:return`${r}=${A(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}=${A(t)}`;default:return`${r}=${A(t)}`}},Ve=e=>{let t=e.indexOf(`?`);return t===-1?e:e.slice(t+1)};function He(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 Ue(e,t,n,r,i){return i?Me(r?e.slice(t+1,n):void 0,i):r?E(e.slice(t+1,n)):null}function We(e,t,n,r,i){let a=e.indexOf(`=`,t),o=a!==-1&&a<n,s=o?a:n,c=s,l=!1;for(let n=t;n<s;n++)if(e.codePointAt(n)===91){c=n,l=!0;break}let u=E(e.slice(t,c));if(!l&&o&&i?.array.decodeValue){let t=e.slice(a+1,n),o=i.array.decodeValue(t);if(o){for(let e of o)He(r,u,Me(e,i),!0);return}}He(r,u,Ue(e,a,n,o,i),l)}const Ge=(e,t)=>{let n=Ve(e);if(n===``||n===`?`)return{};if(!t)return Ke(n);let r=ze(t),i={},a=0,o=n.length;for(;a<o;){let e=n.indexOf(`&`,a);e===-1&&(e=o),We(n,a,e,i,r.strategies),a=e+1}return i};function Ke(e){let t={};return qe(e,t),t}function qe(e,t){let n=0,r=e.length;for(;n<r;){let i=e.indexOf(`&`,n);i===-1&&(i=r),We(e,n,i,t),n=i+1}}const Je=(e,t)=>{let n=Object.keys(e);if(n.length===0)return``;let r=ze(t),i=[];for(let t of n){let n=e[t];if(n===void 0)continue;let a=Be(t,n,r);a&&i.push(a)}return i.join(`&`)};function j(e,t){let n=e.path,r=n.startsWith(`~`),i=r?n.slice(1):n,a={name:e.name,path:i,absolute:r,children:[],parent:t,nonAbsoluteChildren:[],fullName:``};if(e.children)for(let t of e.children){let e=j(t,a);a.children.push(e)}return a}function Ye(e,t,n){let r=j({name:e,path:t},null);for(let e of n){let t=j(e,r);r.children.push(t)}return r}const Xe=Object.freeze(new Map),Ze=Object.freeze([]);function Qe(e){return e.parent?.name?`${e.parent.fullName}.${e.name}`:e.name}function $e(e,t){return e.endsWith(`/`)&&t.startsWith(`/`)?e+t.slice(1):e+t}function et(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:$e(i.staticPath,e.path):e.path}function tt(e){let t=new Map;for(let n of e)t.set(n.name,n);return t}function nt(e,t,n){let r=[],i=[];for(let a of e){let e=rt(a,t,n);r.push(e),e.absolute||i.push(e)}return{childrenMap:tt(r),nonAbsoluteChildren:i}}function rt(e,t,n){let r=le(e.path),i=r.paramTypeMap,a={name:e.name,path:e.path,absolute:e.absolute,parent:t,children:void 0,paramMeta:r,nonAbsoluteChildren:void 0,fullName:``,staticPath:null,paramTypeMap:i};if(a.fullName=Qe(a),a.staticPath=et(a),e.children.length===0)a.children=Xe,a.nonAbsoluteChildren=Ze;else{let{childrenMap:t,nonAbsoluteChildren:r}=nt(e.children,a,n);a.children=t,a.nonAbsoluteChildren=r}return n&&(e.children.length>0&&(Object.freeze(a.nonAbsoluteChildren),Object.freeze(a.children)),Object.freeze(i),Object.freeze(a)),a}function it(e,t=!0){return rt(e,null,t)}function at(e,t){let n=[];return{add(e){return n.push(e),this},addMany(e){return n.push(...e),this},build(r){return it(Ye(e,t,n),!r?.skipFreeze)}}}function ot(e,t,n,r){return at(e,t).addMany(n).build(r)}function M(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(),M)),n}function st(e){return Array.from(e.children.values(),M)}function ct(e){let t=e?.queryParams;return new je({...e?.caseSensitive===void 0?void 0:{caseSensitive:e.caseSensitive},...e?.strictTrailingSlash===void 0?void 0:{strictTrailingSlash:e.strictTrailingSlash},...e?.strictQueryParams===void 0?void 0:{strictQueryParams:e.strictQueryParams},...e?.urlParamsEncoding===void 0?void 0:{urlParamsEncoding:e.urlParamsEncoding},parseQueryString:e=>Ge(e,t),buildQueryString:e=>Je(e,t)})}const lt={defaultRoute:``,defaultParams:{},trailingSlash:`preserve`,queryParamsMode:`loose`,queryParams:k,urlParamsEncoding:`default`,allowNotFound:!0,rewritePathOnMatch:!0};function ut(e){Object.freeze(e);for(let t of Object.keys(e)){let n=e[t];n&&typeof n==`object`&&n.constructor===Object&&ut(n)}return e}function dt(e,t){return typeof e==`function`?e(t):e}function ft(e){if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(`[router.constructor] options must be a plain object`)}var pt=class{#e;constructor(e={}){this.#e=ut({...lt,...e})}static validateOptionsIsObject(e){ft(e)}get(){return this.#e}};function N(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!N(e[n],t[n]))return!1;return!0}return!1}const mt=new WeakMap;function ht(e){return mt.get(e)}function gt(e,t){mt.set(e,t)}var _t=class{#e=void 0;#t=void 0;#n;#r=new Map;get(){return this.#e}set(e){this.#t=this.#e,this.#e=e?s(e):void 0}getPrevious(){return this.#t}reset(){this.#e=void 0,this.#t=void 0,this.#r.clear()}setDependencies(e){this.#n=e}makeState(e,t,n,r,i){let a=this.#n.getDefaultParams(),l=Object.hasOwn(a,e),u;u=l?Object.freeze({...a[e],...t}):!t||t===c?c:Object.freeze({...t});let d={name:e,params:u,path:n??this.#n.buildPath(e,t),context:{},...!i&&{transition:o}};return r&&gt(d,r),i?d:s(d)}areStatesEqual(e,t,n=!0){if(!e||!t)return!!e==!!t;if(e.name!==t.name)return!1;if(n){let n=this.#i(e.name);for(let r of n)if(!N(e.params[r],t.params[r]))return!1;return!0}let r=Object.keys(e.params),i=Object.keys(t.params);if(r.length!==i.length)return!1;for(let n of r)if(!(n in t.params)||!N(e.params[n],t.params[n]))return!1;return!0}#i(e){let t=this.#r.get(e);if(t!==void 0)return t;let n=this.#n.getUrlParams(e);return this.#r.set(e,n),n}};const vt={[n.ROUTER_START]:t.ROUTER_START,[n.ROUTER_STOP]:t.ROUTER_STOP,[n.TRANSITION_SUCCESS]:t.TRANSITION_SUCCESS,[n.TRANSITION_START]:t.TRANSITION_START,[n.TRANSITION_LEAVE_APPROVE]:t.TRANSITION_LEAVE_APPROVE,[n.TRANSITION_ERROR]:t.TRANSITION_ERROR,[n.TRANSITION_CANCEL]:t.TRANSITION_CANCEL},yt=Object.keys(vt),P=`router.usePlugin`;function bt(e){if(!(e&&typeof e==`object`)||Array.isArray(e))throw TypeError(`[router.usePlugin] Plugin factory must return an object, got ${typeof e}`);if(typeof e.then==`function`)throw TypeError(`[router.usePlugin] Async plugin factories are not supported. Factory returned a Promise instead of a plugin object.`)}var xt=class t{#e=new Set;#t=new Set;#n;#r=e;#i=null;static validatePlugin(e){bt(e)}static validateNoDuplicatePlugins(e,t){for(let n of e)if(t(n))throw Error(`[router.usePlugin] Plugin factory already registered. To re-register, first unsubscribe the existing plugin.`)}setDependencies(e){this.#n=e}setLimits(e){
2
- // eslint-disable-next-line sonarjs/void-use -- @preserve: limits passed to validator via RouterInternals; void suppresses TS6133 until plugin implements validateCountThresholds
3
- this.#r=e,this.#r}setValidatorGetter(e){this.#i=e}count(){return this.#e.size}use(...e){if(this.#i?.()?.plugins.validateCountThresholds(this.#e.size+e.length),e.length===1){let t=e[0],n=this.#o(t);this.#e.add(t);let r=!1,i=()=>{if(!r){r=!0,this.#e.delete(t),this.#t.delete(i);try{n()}catch(e){h.error(P,`Error during cleanup:`,e)}}};return this.#t.add(i),i}let t=this.#a(e),n=[];try{for(let e of t){let t=this.#o(e);n.push({factory:e,cleanup:t})}}catch(e){for(let{cleanup:e}of n)try{e()}catch(e){h.error(P,`Cleanup error:`,e)}throw e}for(let{factory:e}of n)this.#e.add(e);let r=!1,i=()=>{if(!r){r=!0,this.#t.delete(i);for(let{factory:e}of n)this.#e.delete(e);for(let{cleanup:e}of n)try{e()}catch(e){h.error(P,`Error during cleanup:`,e)}}};return this.#t.add(i),i}getAll(){return[...this.#e]}has(e){return this.#e.has(e)}disposeAll(){for(let e of this.#t)e();this.#e.clear(),this.#t.clear()}#a(e){let t=new Set;for(let n of e)t.has(n)?this.#i?.()?.plugins.warnBatchDuplicates(e):t.add(n);return t}#o(e){let n=this.#n.compileFactory(e);t.validatePlugin(n),this.#i?.()?.plugins.validatePluginKeys(n),Object.freeze(n);let r=[];for(let e of yt)e in n&&(typeof n[e]==`function`?(r.push(this.#n.addEventListener(vt[e],n[e])),e===`onStart`&&this.#n.canNavigate()&&this.#i?.()?.plugins.warnPluginAfterStart(e)):this.#i?.()?.plugins.warnPluginMethodType(e));return()=>{for(let e of r)e();typeof n.teardown==`function`&&n.teardown()}}};function St(e){let t=()=>e;return()=>t}var Ct=class{#e=new Map;#t=new Map;#n=new Map;#r=new Map;#i=[this.#n,this.#r];#a=new Set;#o=new Set;#s=new Set;#c;#l=e;#u=null;setDependencies(e){this.#c=e}setLimits(e){
4
- // eslint-disable-next-line sonarjs/void-use -- @preserve: Wave 3 validator reads limits via RouterInternals; void suppresses TS6133 until then
5
- this.#l=e,this.#l}setValidatorGetter(e){this.#u=e}getHandlerCount(e){return e===`activate`?this.#t.size:this.#e.size}addCanActivate(e,t,n=!1){n?this.#o.add(e):this.#o.delete(e);let r=this.#t.has(e);this.#d(`activate`,e,t,this.#t,this.#r,`canActivate`,r)}addCanDeactivate(e,t,n=!1){n?this.#s.add(e):this.#s.delete(e);let r=this.#e.has(e);this.#d(`deactivate`,e,t,this.#e,this.#n,`canDeactivate`,r)}clearCanActivate(e){this.#t.delete(e),this.#r.delete(e),this.#o.delete(e)}clearCanDeactivate(e){this.#e.delete(e),this.#n.delete(e),this.#s.delete(e)}clearAll(){this.#t.clear(),this.#r.clear(),this.#e.clear(),this.#n.clear(),this.#o.clear(),this.#s.clear()}clearDefinitionGuards(){for(let e of this.#o)this.#t.delete(e),this.#r.delete(e);for(let e of this.#s)this.#e.delete(e),this.#n.delete(e);this.#o.clear(),this.#s.clear()}getFactories(){let e={},t={};for(let[t,n]of this.#e)e[t]=n;for(let[e,n]of this.#t)t[e]=n;return[e,t]}getFunctions(){return this.#i}canNavigateTo(e,t,n,r){for(let t of e)if(!this.#f(this.#n,t,n,r,`canNavigateTo`))return!1;for(let e of t)if(!this.#f(this.#r,e,n,r,`canNavigateTo`))return!1;return!0}#d(e,t,n,r,i,a,o){o?this.#u?.()?.lifecycle.warnOverwrite(t,e,a):this.#u?.()?.lifecycle.validateCountThresholds(r.size+1,a);let s=typeof n==`boolean`?St(n):n;r.set(t,s),this.#a.add(t);try{let e=this.#c.compileFactory(s);if(typeof e!=`function`)throw TypeError(`[router.${a}] Factory must return a function, got ${typeof e}`);i.set(t,e)}catch(e){throw r.delete(t),e}finally{this.#a.delete(t)}}#f(e,t,n,r,i){let a=e.get(t);if(!a)return!0;try{let e=a(n,r);return typeof e==`boolean`?e:(this.#u?.()?.lifecycle.warnAsyncGuardSync(t,i),!1)}catch{return!1}}};function wt(){return{decoders:Object.create(null),encoders:Object.create(null),defaultParams:Object.create(null),forwardMap:Object.create(null),forwardFnMap:Object.create(null)}}function Tt(e,t){for(let n in e)if(e[n]!==t[n])return!1;return!0}function Et(e,t,n){for(let r in e)if(!(r in n)&&e[r]!==t[r])return!1;return!0}function Dt(e,t){if(!t||!Ot(e,t))return e;let n={};for(let r in e)t[r]!==`query`&&(n[r]=e[r]);return n}function Ot(e,t){for(let n in e)if(t[n]===`query`)return!0;return!1}function F(e){let t={name:e.name,path:e.path};return e.children&&(t.children=e.children.map(e=>F(e))),t}function kt(e,t,n=``){for(let r=0;r<e.length;r++){let i=e[r],a=n?`${n}.${i.name}`:i.name;if(a===t)return e.splice(r,1),!0;if(i.children&&t.startsWith(`${a}.`)&&kt(i.children,t,a))return!0}return!1}function At(e,t){for(let n of Object.keys(e))t(n)&&delete e[n]}function jt(e,t){let n=t.search(/[?#]/),r=n===-1?t:t.slice(0,n);if(r===`/`||r.endsWith(`/`))return t;let i=e.search(/[?#]/),a=i===-1?e:e.slice(0,i);return a.length>1&&a.endsWith(`/`)?`${r}/${n===-1?``:t.slice(n)}`:t}function Mt(e,t,n=100){let r=new Set,i=[e],a=e;for(;t[a];){let e=t[a];if(r.has(e)){let t=i.indexOf(e),n=[...i.slice(t),e];throw Error(`Circular forwardTo: ${n.join(` → `)}`)}if(r.add(a),i.push(e),a=e,i.length>n)throw Error(`forwardTo chain exceeds maximum depth (${n}): ${i.join(` → `)}`)}return a}function Nt(e,t,n){let r=ot(``,t,e),i=ct(n);return i.registerTree(r),{tree:r,matcher:i}}function I(e){let t=Nt(e.definitions,e.rootPath,e.matcherOptions);e.tree=t.tree,e.matcher=t.matcher}function Pt(e){I(e),e.resolvedForwardMap=L(e.config)}function Ft(e){It(e),I(e)}function It(e){e.definitions.length=0,Object.assign(e.config,wt()),e.resolvedForwardMap=Object.create(null),e.routeCustomFields=Object.create(null)}function L(e){let t=Object.create(null);for(let n of Object.keys(e.forwardMap))t[n]=Mt(n,e.forwardMap);return t}function Lt(e,t,n){if(e.canActivate){let n=typeof e.forwardTo==`string`?e.forwardTo:`[dynamic]`;h.warn(`real-router`,`Route "${t}" has both forwardTo and canActivate. canActivate will be ignored because forwardTo creates a redirect (industry standard). Move canActivate to the target route "${n}".`)}if(e.canDeactivate){let n=typeof e.forwardTo==`string`?e.forwardTo:`[dynamic]`;h.warn(`real-router`,`Route "${t}" has both forwardTo and canDeactivate. canDeactivate will be ignored because forwardTo creates a redirect (industry standard). Move canDeactivate to the target route "${n}".`)}if(typeof e.forwardTo==`function`){let n=e.forwardTo.constructor.name===`AsyncFunction`,r=e.forwardTo.toString().includes(`__awaiter`);if(n||r)throw TypeError(`forwardTo callback cannot be async for route "${t}". Async functions break matchPath/buildPath.`)}typeof e.forwardTo==`string`?n.forwardMap[t]=e.forwardTo:n.forwardFnMap[t]=e.forwardTo}function Rt(e,t,n,r,i,a,o){let s=new Set([`name`,`path`,`children`,`canActivate`,`canDeactivate`,`forwardTo`,`encodeParams`,`decodeParams`,`defaultParams`]),c=Object.fromEntries(Object.entries(e).filter(([e])=>!s.has(e)));Object.keys(c).length>0&&(r[t]=c),e.canActivate&&(o?o.addActivateGuard(t,e.canActivate):i.set(t,e.canActivate)),e.canDeactivate&&(o?o.addDeactivateGuard(t,e.canDeactivate):a.set(t,e.canDeactivate)),e.forwardTo&&Lt(e,t,n),e.decodeParams&&(n.decoders[t]=t=>e.decodeParams?.(t)??t),e.encodeParams&&(n.encoders[t]=t=>e.encodeParams?.(t)??t),e.defaultParams&&(n.defaultParams[t]=e.defaultParams)}function R(e,t,n,r,i,a,o=``){for(let s of e){let e=o?`${o}.${s.name}`:s.name;Rt(s,e,t,n,r,i,a),s.children&&R(s.children,t,n,r,i,a,e)}}function zt(e,t){let n=[],r=wt(),i=Object.create(null),a=new Map,o=new Map;for(let t of e)n.push(F(t));let{tree:s,matcher:c}=Nt(n,``,t);return R(e,r,i,a,o,void 0,``),{definitions:n,config:r,tree:s,matcher:c,resolvedForwardMap:L(r),routeCustomFields:i,rootPath:``,matcherOptions:t,depsStore:void 0,lifecycleNamespace:void 0,pendingCanActivate:a,pendingCanDeactivate:o,treeOperations:{commitTreeChanges:Pt,resetStore:Ft,nodeToDefinition:M}}}const z=[];Object.freeze(z);function Bt(e){let t=e.length,n=[];for(let r=t-1;r>=0;r--)n.push(e[r]);return n}function Vt(e){let t=e.split(`.`),n=t.length,r=[t[0]],i=t[0].length;for(let a=1;a<n-1;a++)i+=1+t[a].length,r.push(e.slice(0,i));return r.push(e),r}function Ht(e){let t=typeof e;return t===`string`||t===`number`||t===`boolean`}function Ut(e,t,n,r){let i=t[e];if(!i||typeof i!=`object`)return!0;for(let e of Object.keys(i)){let t=n.params[e],i=r.params[e];if(Ht(t)&&Ht(i)&&String(t)!==String(i))return!1}return!0}function Wt(e,t,n,r,i,a){for(let o=0;o<a;o++){let a=r[o];if(a!==i[o]||!Ut(a,e,t,n))return o}return a}const Gt=new Map;function B(e){let t=Gt.get(e);if(t)return t;let n=Kt(e);return Object.freeze(n),Gt.set(e,n),n}function Kt(e){if(!e)return[``];let t=e.indexOf(`.`);if(t===-1)return[e];let n=e.indexOf(`.`,t+1);if(n===-1)return[e.slice(0,t),e];let r=e.indexOf(`.`,n+1);return r===-1?[e.slice(0,t),e.slice(0,n),e]:e.indexOf(`.`,r+1)===-1?[e.slice(0,t),e.slice(0,n),e.slice(0,r),e]:Vt(e)}let V,H,U=null,qt,Jt,W=null;function Yt(e,t){if(!t)return{intersection:``,toActivate:B(e.name),toDeactivate:z};let n=ht(e),r=ht(t);if(!n&&!r)return{intersection:``,toActivate:B(e.name),toDeactivate:Bt(B(t.name))};let i=B(e.name),a=B(t.name),o=Math.min(a.length,i.length),s=Wt(n??r,e,t,i,a,o),c;if(s>=a.length)c=z;else if(s===0&&a.length===1)c=a;else{c=[];for(let e=a.length-1;e>=s;e--)c.push(a[e])}let l=s===0?i:i.slice(s);return{intersection:s>0?a[s-1]:``,toDeactivate:c,toActivate:l}}function G(e,t){if(U!==null&&e===V&&t===H)return U;if(W!==null&&e===qt&&t===Jt)return W;let n=Yt(e,t);return qt=V,Jt=H,W=U,V=e,H=t,U=n,n}function Xt(e){let t=[];for(let n of e)for(let e of n.paramMeta.urlParams)t.push(e);return t}function Zt(e){return e.at(-1)?.fullName??``}function Qt(e,t){return{name:t??Zt(e.segments),params:e.params,meta:e.meta}}var $t=class{#e;#t;get#n(){return this.#e.depsStore}constructor(e=[],t){this.#e=zt(e,t)}static shouldUpdateNode(e){return(t,n)=>{if(!(t&&typeof t==`object`&&`name`in t))throw TypeError(`[router.shouldUpdateNode] toState must be valid State object`);if(t.transition.reload||e===``)return!0;let{intersection:r,toActivate:i,toDeactivate:a}=G(t,n);return e===r||i.includes(e)?!0:a.includes(e)}}setDependencies(e){this.#e.depsStore=e;for(let[t,n]of this.#e.pendingCanActivate)e.addActivateGuard(t,n);this.#e.pendingCanActivate.clear();for(let[t,n]of this.#e.pendingCanDeactivate)e.addDeactivateGuard(t,n);this.#e.pendingCanDeactivate.clear()}setLifecycleNamespace(e){this.#e.lifecycleNamespace=e}setRootPath(e){this.#e.rootPath=e,I(this.#e)}hasRoute(e){return this.#e.matcher.hasRoute(e)}clearRoutes(){Ft(this.#e)}buildPath(e,t,n){if(e===i.UNKNOWN_ROUTE)return typeof t?.path==`string`?t.path:``;let r=Object.hasOwn(this.#e.config.defaultParams,e)?{...this.#e.config.defaultParams[e],...t}:t??{},a=typeof this.#e.config.encoders[e]==`function`?this.#e.config.encoders[e]({...r}):r;return this.#e.matcher.buildPath(e,a,this.#i(n))}matchPath(e,t){let n=t,r=this.#e.matcher.match(e);if(!r)return;let{name:i,params:a,meta:o}=Qt(r),s=typeof this.#e.config.decoders[i]==`function`?this.#e.config.decoders[i](a):a,{name:c,params:l}=this.#n.forwardState(i,s),u=e;if(n.rewritePathOnMatch){let t=typeof this.#e.config.encoders[c]==`function`?this.#e.config.encoders[c]({...l}):l,r=n.trailingSlash;u=this.#e.matcher.buildPath(c,t,{trailingSlash:r===`never`||r===`always`?r:void 0,queryParamsMode:n.queryParamsMode}),r===`preserve`&&(u=jt(e,u))}return this.#n.makeState(c,l,u,o)}forwardState(e,t){if(Object.hasOwn(this.#e.config.forwardFnMap,e)){let n=this.#r(e,t),r=this.#e.config.forwardFnMap[e],i=this.#a(e,r,t);return{name:i,params:this.#r(i,n)}}let n=this.#e.resolvedForwardMap[e]??e;if(n!==e&&Object.hasOwn(this.#e.config.forwardFnMap,n)){let r=this.#r(e,t),i=this.#e.config.forwardFnMap[n],a=this.#a(n,i,t);return{name:a,params:this.#r(a,r)}}if(n!==e){let r=this.#r(e,t);return{name:n,params:this.#r(n,r)}}return{name:e,params:this.#r(e,t)}}buildStateResolved(e,t){let n=this.#e.matcher.getSegmentsByName(e);if(n)return Qt({segments:n,params:t,meta:this.#e.matcher.getMetaByName(e)},e)}isActiveRoute(e,t={},n=!1,r=!0){let i=this.#n.getState();if(!i)return!1;let a=i.name;if(a!==e&&!a.startsWith(`${e}.`)&&!e.startsWith(`${a}.`))return!1;let s=this.#e.config.defaultParams[e];if(n||a===e){let n={name:e,params:s?{...s,...t}:t,path:``,transition:o,context:{}};return this.#n.areStatesEqual(n,i,r)}if(!a.startsWith(`${e}.`))return!1;let c=i.params;return Tt(t,c)?s?Et(r?Dt(s,this.#e.matcher.getMetaByName(e)?.[e]):s,c,t):!0:!1}getMetaForState(e){return this.#e.matcher.hasRoute(e)?this.#e.matcher.getMetaByName(e):void 0}getUrlParams(e){let t=this.#e.matcher.getSegmentsByName(e);return t?Xt(t):[]}getStore(){return this.#e}#r(e,t){return Object.hasOwn(this.#e.config.defaultParams,e)?{...this.#e.config.defaultParams[e],...t}:t}#i(e){if(this.#t)return this.#t;let t=e?.trailingSlash;return this.#t=Object.freeze({trailingSlash:t===`never`||t===`always`?t:void 0,queryParamsMode:e?.queryParamsMode}),this.#t}#a(e,t,n){let r=new Set([e]),i=t(this.#n.getDependency,n),a=0;if(typeof i!=`string`)throw TypeError(`forwardTo callback must return a string, got ${typeof i}`);for(;a<100;){if(this.#e.matcher.getSegmentsByName(i)===void 0)throw Error(`Route "${i}" does not exist`);if(r.has(i)){let e=[...r,i].join(` → `);throw Error(`Circular forwardTo detected: ${e}`)}if(r.add(i),Object.hasOwn(this.#e.config.forwardFnMap,i)){let e=this.#e.config.forwardFnMap[i];i=e(this.#n.getDependency,n),a++;continue}let e=this.#e.config.forwardMap[i];if(e!==void 0){i=e,a++;continue}return i}throw Error(`forwardTo exceeds maximum depth of 100`)}};const en=new l(u.ROUTER_NOT_STARTED),tn=new l(u.ROUTE_NOT_FOUND),nn=new l(u.SAME_STATES),K=Promise.reject(en),rn=Promise.reject(tn),an=Promise.reject(nn);K.catch(()=>{}),rn.catch(()=>{}),an.catch(()=>{});function on(e,t,n,r,i){Object.freeze(n),Object.freeze(r);let a={phase:`activating`,reason:`success`,segments:Object.freeze({deactivated:n,activated:r,intersection:i})};return e?.name!==void 0&&(a.from=e.name),t.reload!==void 0&&(a.reload=t.reload),t.redirected!==void 0&&(a.redirected=t.redirected),Object.freeze(a)}function sn({signal:e,...t}){return t}function cn(e,t){let{toState:n,fromState:r,opts:a,toDeactivate:o,toActivate:s,intersection:c}=t;if(n.name!==i.UNKNOWN_ROUTE&&!e.hasRoute(n.name)){let t=new l(u.ROUTE_NOT_FOUND,{routeName:n.name});throw e.sendTransitionFail(n,r,t),t}if(r)for(let n of o)!s.includes(n)&&t.canDeactivateFunctions.has(n)&&e.clearCanDeactivate(n);n.transition=on(r,a,o,s,c);let d=Object.freeze(n);e.setState(d);let f=a.signal===void 0?a:sn(a);return e.sendTransitionDone(d,r,f),d}function ln(e,t,n,r){let i=t;i.code===u.TRANSITION_CANCELLED||i.code===u.ROUTE_NOT_FOUND||e.sendTransitionFail(n,r,i)}function q(e,t,n){if(e instanceof DOMException&&e.name===`AbortError`)throw new l(u.TRANSITION_CANCELLED);un(e,t,n)}function un(e,t,n){throw e instanceof l?(e.setCode(t),e):new l(t,fn(e,n))}const dn=new Set([`code`,`segment`,`path`,`redirect`]);function fn(e,t){let n={segment:t};if(e instanceof Error)return{...n,message:e.message,stack:e.stack,...`cause`in e&&e.cause!==void 0&&{cause:e.cause}};if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))dn.has(n)||(t[n]=r);return{...n,...t}}return n}async function pn(e,t,n){let r;try{r=await e}catch(e){q(e,t,n);return}if(!r)throw new l(t,{segment:n})}async function mn(e,t,n,r,i,a,o,s,c,d){await pn(c,n,d);for(let c=s;c<t.length;c++){if(!o())throw new l(u.TRANSITION_CANCELLED);let s=t[c],d=e.get(s);if(!d)continue;let f=!1;try{f=d(r,i,a)}catch(e){q(e,n,s)}if(f instanceof Promise){await pn(f,n,s);continue}if(!f)throw new l(n,{segment:s})}}async function hn(e,t,n,r,i,a,o,s,c){if(await e,!s())throw new l(u.TRANSITION_CANCELLED);let d=c();if(d!==void 0&&(await d,!s()))throw new l(u.TRANSITION_CANCELLED);if(r){let e=J(t,n,u.CANNOT_ACTIVATE,i,a,o,s);if(e!==void 0&&await e,!s())throw new l(u.TRANSITION_CANCELLED)}}function gn(e,t,n,r,i,a,o,s,c,d,f){if(i){let i=J(e,n,u.CANNOT_DEACTIVATE,o,s,c,d);if(i!==void 0)return hn(i,t,r,a,o,s,c,d,f)}if(!d())throw new l(u.TRANSITION_CANCELLED);let p=f();if(p!==void 0)return _n(p,a?t:void 0,r,o,s,c,d);if(a)return J(t,r,u.CANNOT_ACTIVATE,o,s,c,d)}async function _n(e,t,n,r,i,a,o){if(await e,!o())throw new l(u.TRANSITION_CANCELLED);if(t!==void 0){let e=J(t,n,u.CANNOT_ACTIVATE,r,i,a,o);if(e!==void 0&&await e,!o())throw new l(u.TRANSITION_CANCELLED)}}function J(e,t,n,r,i,a,o){for(let[s,c]of t.entries()){if(!o())throw new l(u.TRANSITION_CANCELLED);let d=e.get(c);if(!d)continue;let f=!1;try{f=d(r,i,a)}catch(e){q(e,n,c)}if(f instanceof Promise)return mn(e,t,n,r,i,a,o,s+1,f,c);if(!f)throw new l(n,{segment:c})}}const vn=[i.UNKNOWN_ROUTE];Object.freeze(vn);const yn={replace:!0};Object.freeze(yn);function bn(e,t){return t?.name===i.UNKNOWN_ROUTE&&!e.replace?{...e,replace:!0}:e}function xn(e,t,n){return!!e&&!t.reload&&!t.force&&e.path===n.path}var Sn=class{lastSyncResolved=!1;lastSyncRejected=!1;#e;#t=null;#n=0;setDependencies(e){this.#e=e}navigate(e,t,n){this.lastSyncResolved=!1;let r=this.#e;if(!r.canNavigate())return this.lastSyncRejected=!0,K;let i;try{i=r.buildNavigateState(e,t)}catch(e){return Promise.reject(e)}return i?this.#r(i,n):(r.emitTransitionError(void 0,r.getState(),tn),this.lastSyncRejected=!0,rn)}navigateToState(e,t){this.lastSyncResolved=!1;let n=this.#e;if(!n.canNavigate())return this.lastSyncRejected=!0,K;if(e.name!==i.UNKNOWN_ROUTE&&!n.hasRoute(e.name)){let t=new l(u.ROUTE_NOT_FOUND,{routeName:e.name});return n.emitTransitionError(void 0,n.getState(),t),this.lastSyncRejected=!0,Promise.reject(t)}let r={name:e.name,params:e.params,path:e.path,context:{...e.context}};return this.#r(r,t)}navigateToDefault(e){let t=this.#e;if(!t.getOptions().defaultRoute)return Promise.reject(new l(u.ROUTE_NOT_FOUND,{routeName:`defaultRoute not configured`}));let n,r;try{({route:n,params:r}=t.resolveDefault())}catch(e){return Promise.reject(e)}return n?this.navigate(n,r,e):Promise.reject(new l(u.ROUTE_NOT_FOUND,{routeName:`defaultRoute resolved to empty`}))}navigateToNotFound(e){this.#c();let t=this.#e.getState(),n=t?B(t.name).toReversed():[];Object.freeze(n);let r={deactivated:n,activated:vn,intersection:``};Object.freeze(r);let a={phase:`activating`,...t&&{from:t.name},reason:`success`,segments:r};Object.freeze(a);let o={name:i.UNKNOWN_ROUTE,params:c,path:e,transition:a,context:{}};return Object.freeze(o),this.#e.setState(o),this.#e.emitTransitionSuccess(o,t,yn),o}abortCurrentNavigation(){this.#t?.abort(new l(u.TRANSITION_CANCELLED)),this.#t=null}#r(e,t){let n=this.#e,r,a=!1,o=null;try{if(r=n.getState(),t=bn(t,r),xn(r,t,e))return n.emitTransitionError(e,r,nn),this.lastSyncRejected=!0,an;this.#c(t.signal);let s=++this.#n;if(n.startTransition(e,r),a=!0,this.#n!==s)throw new l(u.TRANSITION_CANCELLED);let[c,d]=n.getLifecycleFunctions(),f=e.name===i.UNKNOWN_ROUTE,p=G(e,r),{toDeactivate:m,toActivate:h,intersection:g}=p,ee=r&&!t.forceDeactivate&&m.length>0,_=!f&&h.length>0,v=c.size>0||d.size>0,y=e;if(!v){let e=this.#o(y,r,s,t,p,c);if(e!==void 0)return e}if(v){o=new AbortController,this.#t=o;let i=()=>this.#n===s&&n.isActive(),a=o.signal,f=gn(c,d,m,h,!!ee,_,e,r,a,i,()=>{if(n.sendLeaveApprove(y,r),n.hasLeaveListeners())return n.awaitLeaveListeners(y,r,a)});if(f!==void 0)return this.#i(f,{toState:e,fromState:r,opts:t,toDeactivate:m,toActivate:h,intersection:g,canDeactivateFunctions:c},o,s);if(!i())throw new l(u.TRANSITION_CANCELLED);this.#s(o)}return this.lastSyncResolved=!0,Promise.resolve(cn(n,{toState:e,fromState:r,opts:t,toDeactivate:m,toActivate:h,intersection:g,canDeactivateFunctions:c}))}catch(t){return this.#a(t,o,a,e,r),Promise.reject(t)}}async#i(e,t,n,r){let i=this.#e,a=()=>this.#n===r&&!n.signal.aborted&&i.isActive();try{if(t.opts.signal){if(t.opts.signal.aborted)throw new l(u.TRANSITION_CANCELLED,{reason:t.opts.signal.reason});t.opts.signal.addEventListener(`abort`,()=>{n.abort(t.opts.signal?.reason)},{once:!0,signal:n.signal})}if(await e,!a())throw new l(u.TRANSITION_CANCELLED);return cn(i,t)}catch(e){throw ln(i,e,t.toState,t.fromState),e}finally{this.#s(n)}}#a(e,t,n,r,i){t&&this.#s(t),n&&r&&ln(this.#e,e,r,i)}#o(e,t,n,r,i,a){let o=this.#e;if(o.sendLeaveApprove(e,t),o.hasLeaveListeners()){let s=new AbortController,c=o.awaitLeaveListeners(e,t,s.signal);if(c!==void 0)return this.#t=s,this.#i(c,{toState:e,fromState:t,opts:r,toDeactivate:i.toDeactivate,toActivate:i.toActivate,intersection:i.intersection,canDeactivateFunctions:a},s,n)}if(this.#n!==n)throw new l(u.TRANSITION_CANCELLED)}#s(e){e.abort(),this.#t===e&&(this.#t=null)}#c(e){if(this.#e.isTransitioning()&&(h.warn(`router.navigate`,`Concurrent navigation detected on shared router instance. For SSR, use cloneRouter() to create isolated instance per request.`),this.#t?.abort(new l(u.TRANSITION_CANCELLED)),this.#e.cancelNavigation()),e?.aborted)throw new l(u.TRANSITION_CANCELLED,{reason:e.reason})}};const Y={replace:!0};Object.freeze(Y);var Cn=class{#e;setDependencies(e){this.#e=e}async start(e){let t=this.#e,n=t.getOptions(),r=t.matchPath(e);if(!r&&!n.allowNotFound){let n=new l(u.ROUTE_NOT_FOUND,{path:e});throw t.emitTransitionError(void 0,void 0,n),n}return t.completeStart(),r?t.navigateToState(r,Y):t.navigateToNotFound(e)}stop(){this.#e.clearState()}};function X(e){return e instanceof Error?e:Error(String(e))}function wn(e,t){return Promise.allSettled(e).then(e=>{if(t!==void 0)throw X(t);let n=e.find(e=>e.status===`rejected`);if(n!==void 0)throw X(n.reason)})}var Z=class{#e;#t;#n=[];#r;#i;#a;#o;constructor(e){this.#e=e.routerFSM,this.#t=e.emitter,this.#r=void 0,this.#c()}static validateSubscribeListener(e){if(typeof e!=`function`)throw TypeError(`[router.subscribe] Expected a function. For Observable pattern use @real-router/rx package`)}static validateSubscribeLeaveListener(e){if(typeof e!=`function`)throw TypeError(`[router.subscribeLeave] Expected a function`)}emitRouterStart(){this.#t.emit(t.ROUTER_START)}emitRouterStop(){this.#t.emit(t.ROUTER_STOP)}emitTransitionStart(e,n){this.#t.emit(t.TRANSITION_START,e,n)}emitTransitionSuccess(e,n,r){this.#t.emit(t.TRANSITION_SUCCESS,e,n,r)}emitTransitionError(e,n,r){this.#t.emit(t.TRANSITION_ERROR,e,n,r)}emitTransitionCancel(e,n){this.#t.emit(t.TRANSITION_CANCEL,e,n)}emitTransitionLeaveApprove(e,n){this.#t.emit(t.TRANSITION_LEAVE_APPROVE,e,n)}sendStart(){this.#e.send(b.START)}sendStop(){this.#e.send(b.STOP)}sendDispose(){this.#e.send(b.DISPOSE)}sendStarted(){this.#e.send(b.STARTED)}sendNavigate(e,t){this.#r=e,this.#e.forceState(y.TRANSITION_STARTED),this.emitTransitionStart(e,t)}sendComplete(e,t,n={}){this.#e.forceState(y.READY),this.emitTransitionSuccess(e,t,n),this.#r===e&&(this.#r=void 0)}sendLeaveApprove(e,t){this.#e.forceState(y.LEAVE_APPROVED),this.emitTransitionLeaveApprove(e,t)}sendFail(e,t,n){let r=this.#r;this.#i=e,this.#a=t,this.#o=n,this.#e.send(b.FAIL),this.#r===r&&(this.#r=void 0)}sendFailSafe(e,t,n){this.isReady()?this.sendFail(e,t,n):this.emitTransitionError(e,t,n)}sendCancel(e,t){let n=this.#r;this.#i=e,this.#a=t,this.#e.send(b.CANCEL),this.#r===n&&(this.#r=void 0)}canBeginTransition(){return this.#e.canSend(b.NAVIGATE)}canStart(){return this.#e.canSend(b.START)}canCancel(){return this.#e.canSend(b.CANCEL)}isActive(){let e=this.#e.getState();return e!==y.IDLE&&e!==y.DISPOSED}isDisposed(){return this.#e.getState()===y.DISPOSED}isTransitioning(){let e=this.#e.getState();return e===y.TRANSITION_STARTED||e===y.LEAVE_APPROVED}isLeaveApproved(){return this.#e.getState()===y.LEAVE_APPROVED}isReady(){return this.#e.getState()===y.READY}getCurrentToState(){return this.#r}addEventListener(e,t){return this.#t.on(e,t)}subscribe(e){return this.#t.on(t.TRANSITION_SUCCESS,(t,n)=>{e({route:t,previousRoute:n})})}subscribeLeave(e){return this.#n.push(e),()=>{let t=this.#n.indexOf(e);t!==-1&&this.#n.splice(t,1)}}hasLeaveListeners(){return this.#n.length>0}awaitLeaveListeners(e,t,n){if(t===void 0)return;let r={route:t,nextRoute:e,signal:n},i,a;for(let e of this.#n)try{let t=e(r);t!==void 0&&typeof t.then==`function`&&(i??=[],i.push(t))}catch(e){a===void 0&&(a=e)}if(i===void 0){if(a!==void 0)throw X(a);return}return wn(i,a)}clearAll(){this.#t.clearAll(),this.#n.length=0}setLimits(e){this.#t.setLimits(e)}sendCancelIfPossible(e){let t=this.#r;!this.canCancel()||t===void 0||this.sendCancel(t,e)}#s(){this.emitTransitionError(this.#i,this.#a,this.#o)}#c(){let e=this.#e;e.on(y.STARTING,b.STARTED,()=>{this.emitRouterStart()}),e.on(y.READY,b.STOP,()=>{this.emitRouterStop()});let t=()=>{let e=this.#i;e!==void 0&&this.emitTransitionCancel(e,this.#a)};e.on(y.TRANSITION_STARTED,b.CANCEL,t),e.on(y.LEAVE_APPROVED,b.CANCEL,t),e.on(y.LEAVE_APPROVED,b.FAIL,()=>{this.#s()}),e.on(y.STARTING,b.FAIL,()=>{this.#s()}),e.on(y.READY,b.FAIL,()=>{this.#s()}),e.on(y.TRANSITION_STARTED,b.FAIL,()=>{this.#s()})}};const Tn=new l(u.ROUTER_ALREADY_STARTED),En=new Set([`all`,`warn-error`,`error-only`]);function Dn(e){return typeof e==`string`&&En.has(e)}function On(e){return typeof e==`string`?`"${e}"`:typeof e==`object`?JSON.stringify(e):String(e)}function kn(e){if(typeof e!=`object`||!e)throw TypeError(`Logger config must be an object`);let t=e;for(let e of Object.keys(t))if(e!==`level`&&e!==`callback`)throw TypeError(`Unknown logger config property: "${e}"`);if(`level`in t&&t.level!==void 0&&!Dn(t.level))throw TypeError(`Invalid logger level: ${On(t.level)}. Expected: "all" | "warn-error" | "error-only"`);if(`callback`in t&&t.callback!==void 0&&typeof t.callback!=`function`)throw TypeError(`Logger callback must be a function, got ${typeof t.callback}`);return!0}var An=class{router;options;limits;dependenciesStore;state;routes;routeLifecycle;plugins;navigation;lifecycle;eventBus;constructor(e){this.router=e.router,this.options=e.options,this.limits=e.limits,this.dependenciesStore=e.dependenciesStore,this.state=e.state,this.routes=e.routes,this.routeLifecycle=e.routeLifecycle,this.plugins=e.plugins,this.navigation=e.navigation,this.lifecycle=e.lifecycle,this.eventBus=e.eventBus}wireLimits(){this.dependenciesStore.limits=this.limits,this.plugins.setLimits(this.limits),this.eventBus.setLimits({maxListeners:this.limits.maxListeners,warnListeners:this.limits.warnListeners,maxEventDepth:this.limits.maxEventDepth}),this.routeLifecycle.setLimits(this.limits)}wireRouteLifecycleDeps(){let e={compileFactory:this.createCompileFactory()};this.routeLifecycle.setDependencies(e),this.routeLifecycle.setValidatorGetter(()=>{try{return p(this.router).validator}catch{return null}})}wireRoutesDeps(){this.routes.setDependencies({addActivateGuard:(e,t)=>{this.routeLifecycle.addCanActivate(e,t,!0)},addDeactivateGuard:(e,t)=>{this.routeLifecycle.addCanDeactivate(e,t,!0)},makeState:(e,t,n,r)=>this.state.makeState(e,t,n,r),getState:()=>this.state.get(),areStatesEqual:(e,t,n)=>this.state.areStatesEqual(e,t,n),getDependency:e=>this.dependenciesStore.dependencies[e],forwardState:(e,t)=>{let n=p(this.router);return n.validator?.routes.validateStateBuilderArgs(e,t,`forwardState`),n.forwardState(e,t)}}),this.routes.setLifecycleNamespace(this.routeLifecycle)}wirePluginsDeps(){let e={addEventListener:(e,t)=>this.eventBus.addEventListener(e,t),canNavigate:()=>this.eventBus.canBeginTransition(),compileFactory:this.createCompileFactory()};this.plugins.setDependencies(e),this.plugins.setValidatorGetter(()=>{try{return p(this.router).validator}catch{return null}})}wireNavigationDeps(){this.navigation.setDependencies({getOptions:()=>this.options.get(),hasRoute:e=>this.routes.hasRoute(e),getState:()=>this.state.get(),setState:e=>{this.state.set(e)},buildNavigateState:(e,t)=>{let n=p(this.router);n.validator?.routes.validateStateBuilderArgs(e,t,`navigate`);let i=n.forwardState(e,t),a=i.name,o=r(i.params),s=this.routes.getMetaForState(a);if(s===void 0)return;let c=n.buildPath(a,o);return this.state.makeState(a,o,c,s,!0)},resolveDefault:()=>{let e=this.options.get(),t=p(this.router),n=dt(e.defaultRoute,e=>this.dependenciesStore.dependencies[e]),r=dt(e.defaultParams,e=>this.dependenciesStore.dependencies[e]);return typeof e.defaultRoute==`function`&&t.validator?.options.validateResolvedDefaultRoute(n,t.routeGetStore()),{route:n,params:r}},startTransition:(e,t)=>{this.eventBus.sendNavigate(e,t)},cancelNavigation:()=>{let e=this.eventBus.getCurrentToState();e!==void 0&&this.eventBus.sendCancel(e,this.state.get())},sendTransitionDone:(e,t,n)=>{this.eventBus.sendComplete(e,t,n)},sendTransitionFail:(e,t,n)=>{this.eventBus.sendFail(e,t,n)},emitTransitionError:(e,t,n)=>{this.eventBus.sendFailSafe(e,t,n)},emitTransitionSuccess:(e,t,n)=>{this.eventBus.emitTransitionSuccess(e,t,n)},sendLeaveApprove:(e,t)=>{this.eventBus.sendLeaveApprove(e,t)},canNavigate:()=>this.eventBus.canBeginTransition(),getLifecycleFunctions:()=>this.routeLifecycle.getFunctions(),isActive:()=>this.router.isActive(),isTransitioning:()=>this.eventBus.isTransitioning(),clearCanDeactivate:e=>{this.routeLifecycle.clearCanDeactivate(e)},hasLeaveListeners:()=>this.eventBus.hasLeaveListeners(),awaitLeaveListeners:(e,t,n)=>this.eventBus.awaitLeaveListeners(e,t,n)})}wireLifecycleDeps(){this.lifecycle.setDependencies({getOptions:()=>this.options.get(),navigateToState:(e,t)=>this.navigation.navigateToState(e,t),navigateToNotFound:e=>this.navigation.navigateToNotFound(e),clearState:()=>{this.state.set(void 0)},matchPath:e=>this.routes.matchPath(e,this.options.get()),completeStart:()=>{this.eventBus.sendStarted()},emitTransitionError:(e,t,n)=>{this.eventBus.sendFail(e,t,n)}})}wireStateDeps(){this.state.setDependencies({getDefaultParams:()=>this.routes.getStore().config.defaultParams,buildPath:(e,t)=>p(this.router).buildPath(e,t),getUrlParams:e=>this.routes.getUrlParams(e)})}createCompileFactory(){let{router:e,dependenciesStore:t}=this;return n=>n(e,e=>t.dependencies[e])}};function jn(e){e.wireLimits(),e.wireRouteLifecycleDeps(),e.wireRoutesDeps(),e.wirePluginsDeps(),e.wireNavigationDeps(),e.wireLifecycleDeps(),e.wireStateDeps()}const Q=Object.freeze({});var Mn=class e{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;constructor(t=[],n={},r={}){n.logger&&kn(n.logger)&&(h.configure(n.logger),delete n.logger),pt.validateOptionsIsObject(n),re(r),t.length>0&&x(t),this.#e=new pt(n),this.#t=a(n.limits),this.#n=ie(r),this.#r=new _t,this.#i=new $t(t,Nn(this.#e.get())),this.#a=new Ct,this.#o=new xt,this.#s=new Sn,this.#c=new Cn;let i=ne(),o=new v({onListenerError:(e,t)=>{h.error(`Router`,`Error in listener for ${e}:`,t)},onListenerWarn:(e,t)=>{h.warn(`router.addEventListener`,`Event "${e}" has ${t} listeners — possible memory leak`)}});this.#l=new Z({routerFSM:i,emitter:o}),jn(new An({router:this,options:this.#e,limits:this.#t,dependenciesStore:this.#n,state:this.#r,routes:this.#i,routeLifecycle:this.#a,plugins:this.#o,navigation:this.#s,lifecycle:this.#c,eventBus:this.#l}));let s=new Map;d(this,{makeState:(e,t,n,r)=>this.#r.makeState(e,t,n,r),forwardState:f(`forwardState`,(e,t)=>this.#i.forwardState(e,t),s),buildStateResolved:(e,t)=>this.#i.buildStateResolved(e,t),matchPath:(e,t)=>this.#i.matchPath(e,t),getOptions:()=>this.#e.get(),addEventListener:(e,t)=>this.#l.addEventListener(e,t),buildPath:f(`buildPath`,(e,t)=>this.#i.buildPath(e,t??c,this.#e.get()),s),emitTransitionError:e=>{this.#l.sendFailSafe(void 0,this.#r.get(),e)},start:m(`start`,e=>this.#c.start(e),s),navigateToState:(t,n)=>{let r=this.#s.navigateToState(t,n??Q);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:e.#d(r),r},interceptors:s,setRootPath:e=>{this.#i.setRootPath(e)},getRootPath:()=>this.#i.getStore().rootPath,getTree:()=>this.#i.getStore().tree,isDisposed:()=>this.#l.isDisposed(),validator:null,dependenciesGetStore:()=>this.#n,cloneOptions:()=>({...this.#e.get()}),cloneDependencies:()=>({...this.#n.dependencies}),getLifecycleFactories:()=>this.#a.getFactories(),getPluginFactories:()=>this.#o.getAll(),routeGetStore:()=>this.#i.getStore(),getStateName:()=>this.#r.get()?.name,isTransitioning:()=>this.#l.isTransitioning(),clearState:()=>{this.#r.set(void 0)},setState:e=>{this.#r.set(e)},routerExtensions:[],contextClaimRecords:new Set}),this.isActiveRoute=this.isActiveRoute.bind(this),this.buildPath=this.buildPath.bind(this),this.getState=this.getState.bind(this),this.getPreviousState=this.getPreviousState.bind(this),this.areStatesEqual=this.areStatesEqual.bind(this),this.shouldUpdateNode=this.shouldUpdateNode.bind(this),this.isActive=this.isActive.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.dispose=this.dispose.bind(this),this.canNavigateTo=this.canNavigateTo.bind(this),this.usePlugin=this.usePlugin.bind(this),this.navigate=this.navigate.bind(this),this.navigateToDefault=this.navigateToDefault.bind(this),this.navigateToNotFound=this.navigateToNotFound.bind(this),this.subscribe=this.subscribe.bind(this),this.subscribeLeave=this.subscribeLeave.bind(this),this.isLeaveApproved=this.isLeaveApproved.bind(this)}isActiveRoute(e,t,n,r){return p(this).validator?.routes.validateIsActiveRouteArgs(e,t,n,r),p(this).validator?.routes.validateRouteName(e,`isActiveRoute`),e===``?(h.warn(`real-router`,`isActiveRoute("") called with empty string. Root node is not considered a parent of any route.`),!1):this.#i.isActiveRoute(e,t,n,r)}buildPath(e,t){let n=p(this);return n.validator?.routes.validateBuildPathArgs(e),n.validator?.navigation.validateParams(t,`buildPath`),n.buildPath(e,r(t))}getState(){return this.#r.get()}getPreviousState(){return this.#r.getPrevious()}areStatesEqual(e,t,n=!0){return p(this).validator?.state.validateAreStatesEqualArgs(e,t,n),this.#r.areStatesEqual(e,t,n)}shouldUpdateNode(e){return p(this).validator?.routes.validateShouldUpdateNodeArgs(e),$t.shouldUpdateNode(e)}isActive(){return this.#l.isActive()}start(t){if(!this.#l.canStart())return Promise.reject(Tn);p(this).validator?.navigation.validateStartArgs(t),this.#l.sendStart();let n=p(this).start(t).catch(e=>{throw this.#l.isReady()&&(this.#c.stop(),this.#l.sendStop()),e});return e.#d(n),n}stop(){return this.#s.abortCurrentNavigation(),this.#l.sendCancelIfPossible(this.#r.get()),!this.#l.isReady()&&!this.#l.isTransitioning()?this:(this.#c.stop(),this.#l.sendStop(),this)}dispose(){if(this.#l.isDisposed())return;this.#s.abortCurrentNavigation(),this.#l.sendCancelIfPossible(this.#r.get()),(this.#l.isReady()||this.#l.isTransitioning())&&(this.#c.stop(),this.#l.sendStop()),this.#l.sendDispose(),this.#l.clearAll(),this.#o.disposeAll();let e=p(this);for(let t of e.routerExtensions)for(let e of t.keys)delete this[e];e.routerExtensions.length=0,e.contextClaimRecords.clear(),this.#i.clearRoutes(),this.#a.clearAll(),this.#r.reset(),this.#n.dependencies=Object.create(null),this.#f()}canNavigateTo(e,t){let n=p(this);if(n.validator?.routes.validateRouteName(e,`canNavigateTo`),n.validator?.navigation.validateParams(t,`canNavigateTo`),!this.#i.hasRoute(e))return!1;let{name:r,params:i}=n.forwardState(e,t??{}),a=this.#r.makeState(r,i),o=this.#r.get(),{toDeactivate:s,toActivate:c}=G(a,o);return this.#a.canNavigateTo(s,c,a,o)}usePlugin(...e){let t=e.filter(Boolean);if(t.length===0)return()=>{};let n=p(this);n.validator?.plugins.validatePluginLimit(this.#o.count(),this.#t);for(let e of t)n.validator?.plugins.validateNoDuplicatePlugins(e,this.#o.getAll());return this.#o.use(...t)}subscribe(e){return Z.validateSubscribeListener(e),this.#l.subscribe(e)}subscribeLeave(e){return Z.validateSubscribeLeaveListener(e),this.#l.subscribeLeave(e)}isLeaveApproved(){return this.#l.isLeaveApproved()}navigate(t,n,r){let i=p(this);i.validator?.navigation.validateNavigateArgs(t),i.validator?.navigation.validateParams(n,`navigate`);let a=r??Q;i.validator?.navigation.validateNavigationOptions(a,`navigate`);let o=this.#s.navigate(t,n??c,a);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:e.#d(o),o}navigateToDefault(t){let n=p(this);n.validator?.navigation.validateNavigateToDefaultArgs(t);let r=t??Q;n.validator?.navigation.validateNavigationOptions(r,`navigateToDefault`);let i=this.#s.navigateToDefault(r);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:e.#d(i),i}navigateToNotFound(e){if(!this.#l.isActive())throw new l(u.ROUTER_NOT_STARTED);if(e!==void 0&&typeof e!=`string`)throw TypeError(`[router.navigateToNotFound] path must be a string, got ${typeof e}`);let t=e??this.#r.get().path;return this.#s.navigateToNotFound(t)}static#u=e=>{e instanceof l&&(e.code===u.SAME_STATES||e.code===u.TRANSITION_CANCELLED||e.code===u.ROUTER_NOT_STARTED||e.code===u.ROUTE_NOT_FOUND)||h.error(`router.navigate`,`Unexpected navigation error`,e)};static#d(t){t.catch(e.#u)}#f(){this.navigate=$,this.navigateToDefault=$,this.navigateToNotFound=$,this.start=$,this.stop=$,this.usePlugin=$,this.subscribe=$,this.subscribeLeave=$,this.canNavigateTo=$}};function $(){throw new l(u.ROUTER_DISPOSED)}function Nn(e){return{strictTrailingSlash:e.trailingSlash===`strict`,strictQueryParams:e.queryParamsMode===`strict`,urlParamsEncoding:e.urlParamsEncoding,queryParams:e.queryParams}}export{Mt as a,F as c,R as i,st as l,It as n,At as o,L as r,kt as s,Mn as t,x as u};
6
- //# sourceMappingURL=Router-CK8U23pP.mjs.map