@real-router/core 0.54.3 → 0.54.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/cjs/Router-BzV5P1lA.js +6 -0
  2. package/dist/cjs/Router-BzV5P1lA.js.map +1 -0
  3. package/dist/cjs/api.d.ts +63 -0
  4. package/dist/cjs/api.d.ts.map +1 -1
  5. package/dist/cjs/api.js +1 -1
  6. package/dist/cjs/{cloneRouter-CR7rdWPl.js → cloneRouter-D5bMudso.js} +2 -2
  7. package/dist/cjs/cloneRouter-D5bMudso.js.map +1 -0
  8. package/dist/cjs/index.js +1 -1
  9. package/dist/cjs/utils.js +1 -1
  10. package/dist/cjs/validation.d.ts +55 -14
  11. package/dist/cjs/validation.d.ts.map +1 -1
  12. package/dist/esm/Router-_BDnheMY.mjs +6 -0
  13. package/dist/esm/Router-_BDnheMY.mjs.map +1 -0
  14. package/dist/esm/api.d.mts +63 -0
  15. package/dist/esm/api.d.mts.map +1 -1
  16. package/dist/esm/api.mjs +1 -1
  17. package/dist/esm/{cloneRouter-BBjARLMk.mjs → cloneRouter-DM59kihh.mjs} +2 -2
  18. package/dist/esm/cloneRouter-DM59kihh.mjs.map +1 -0
  19. package/dist/esm/index.mjs +1 -1
  20. package/dist/esm/utils.mjs +1 -1
  21. package/dist/esm/validation.d.mts +55 -14
  22. package/dist/esm/validation.d.mts.map +1 -1
  23. package/package.json +3 -3
  24. package/src/api/cloneRouter.ts +89 -7
  25. package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +39 -10
  26. package/src/namespaces/NavigationNamespace/transition/guardPhase.ts +3 -0
  27. package/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts +264 -83
  28. package/dist/cjs/Router-fHKWlCpv.js +0 -6
  29. package/dist/cjs/Router-fHKWlCpv.js.map +0 -1
  30. package/dist/cjs/cloneRouter-CR7rdWPl.js.map +0 -1
  31. package/dist/esm/Router-Baa4TIPc.mjs +0 -6
  32. package/dist/esm/Router-Baa4TIPc.mjs.map +0 -1
  33. package/dist/esm/cloneRouter-BBjARLMk.mjs.map +0 -1
@@ -19,6 +19,23 @@ function booleanToFactory<Dependencies extends DefaultDependencies>(
19
19
  return () => guardFn;
20
20
  }
21
21
 
22
+ /**
23
+ * Origin of a registered guard. `"definition"` — declared in route config and
24
+ * thus subject to `clearDefinitionGuards()` cleanup during `replace()`.
25
+ * `"external"` — registered post-hoc via `getLifecycleApi().add*Guard(...)`
26
+ * and survives `replace()`.
27
+ *
28
+ * Storage is split per origin (two Maps per kind, four Maps total) so origin
29
+ * is a primary invariant rather than a derived Set-tracked property. The
30
+ * compiled function (`#canActivateFunctions` / `#canDeactivateFunctions`)
31
+ * reflects the **last add wins** semantic for the slot (regardless of
32
+ * origin) — matching the pre-refactor behaviour and the
33
+ * `replaceRoutes.test.ts` "definition wins on replace" contract. On clear,
34
+ * the function falls back to whichever origin Map still holds an entry
35
+ * (external preferred if both remain after a partial clear).
36
+ */
37
+ export type GuardOrigin = "definition" | "external";
38
+
22
39
  /**
23
40
  * Independent namespace for managing route lifecycle handlers.
24
41
  *
@@ -28,14 +45,29 @@ function booleanToFactory<Dependencies extends DefaultDependencies>(
28
45
  export class RouteLifecycleNamespace<
29
46
  Dependencies extends DefaultDependencies = DefaultDependencies,
30
47
  > {
31
- readonly #canDeactivateFactories = new Map<
48
+ // Storage split by origin: definition vs external. External wins at compile
49
+ // time for the same slot; clearDefinitionGuards / removeXGuard semantics are
50
+ // expressed in terms of these primary Maps.
51
+ readonly #definitionActivateFactories = new Map<
32
52
  string,
33
53
  GuardFnFactory<Dependencies>
34
54
  >();
35
- readonly #canActivateFactories = new Map<
55
+ readonly #externalActivateFactories = new Map<
36
56
  string,
37
57
  GuardFnFactory<Dependencies>
38
58
  >();
59
+ readonly #definitionDeactivateFactories = new Map<
60
+ string,
61
+ GuardFnFactory<Dependencies>
62
+ >();
63
+ readonly #externalDeactivateFactories = new Map<
64
+ string,
65
+ GuardFnFactory<Dependencies>
66
+ >();
67
+ // Compiled-function view. Single Map per kind because navigation does not
68
+ // distinguish origin — it just runs the effective guard. Set on add (last
69
+ // add wins) and recompiled on clear from whichever origin Map still holds
70
+ // the slot.
39
71
  readonly #canDeactivateFunctions = new Map<string, GuardFn>();
40
72
  readonly #canActivateFunctions = new Map<string, GuardFn>();
41
73
  // Cached tuple — Maps never change reference, so this is stable
@@ -45,8 +77,6 @@ export class RouteLifecycleNamespace<
45
77
  ];
46
78
 
47
79
  readonly #registering = new Set<string>();
48
- readonly #definitionActivateGuardNames = new Set<string>();
49
- readonly #definitionDeactivateGuardNames = new Set<string>();
50
80
 
51
81
  #deps!: RouteLifecycleDependencies<Dependencies>;
52
82
  #limits: Limits = DEFAULT_LIMITS;
@@ -72,9 +102,30 @@ export class RouteLifecycleNamespace<
72
102
  }
73
103
 
74
104
  getHandlerCount(type: "activate" | "deactivate"): number {
75
- return type === "activate"
76
- ? this.#canActivateFactories.size
77
- : this.#canDeactivateFactories.size;
105
+ const definitionMap =
106
+ type === "activate"
107
+ ? this.#definitionActivateFactories
108
+ : this.#definitionDeactivateFactories;
109
+ const externalMap =
110
+ type === "activate"
111
+ ? this.#externalActivateFactories
112
+ : this.#externalDeactivateFactories;
113
+
114
+ if (definitionMap.size === 0) {
115
+ return externalMap.size;
116
+ }
117
+
118
+ if (externalMap.size === 0) {
119
+ return definitionMap.size;
120
+ }
121
+
122
+ const names = new Set(definitionMap.keys());
123
+
124
+ for (const name of externalMap.keys()) {
125
+ names.add(name);
126
+ }
127
+
128
+ return names.size;
78
129
  }
79
130
 
80
131
  // =========================================================================
@@ -83,90 +134,95 @@ export class RouteLifecycleNamespace<
83
134
 
84
135
  /**
85
136
  * Adds a canActivate guard for a route.
86
- * Handles overwrite detection and registration.
87
137
  *
88
138
  * @param name - Route name (input-validated by facade)
89
139
  * @param handler - Guard function or boolean (input-validated by facade)
90
- * @param isFromDefinition - True when guard comes from route definition (tracked for HMR replace)
140
+ * @param isFromDefinition - True when guard comes from route definition
141
+ * (lands in the definition Map; subject to `clearDefinitionGuards()`).
142
+ * False (default) when added via `getLifecycleApi().addActivateGuard(...)`
143
+ * (lands in the external Map; survives `replace()`).
144
+ *
145
+ * Last add wins at runtime: the compiled function reflects the factory
146
+ * passed to the most recent call, regardless of origin. Origin only
147
+ * determines which Map the factory is filed under (relevant for
148
+ * `clearDefinitionGuards()` and `cloneRouter` re-registration).
91
149
  */
92
150
  addCanActivate(
93
151
  name: string,
94
152
  handler: GuardFnFactory<Dependencies> | boolean,
95
153
  isFromDefinition = false,
96
154
  ): void {
97
- if (isFromDefinition) {
98
- this.#definitionActivateGuardNames.add(name);
99
- } else {
100
- this.#definitionActivateGuardNames.delete(name);
101
- }
102
-
103
- const isOverwrite = this.#canActivateFactories.has(name);
104
-
105
155
  this.#registerHandler(
106
156
  "activate",
107
157
  name,
108
158
  handler,
109
- this.#canActivateFactories,
110
- this.#canActivateFunctions,
159
+ isFromDefinition,
111
160
  "canActivate",
112
- isOverwrite,
113
161
  );
114
162
  }
115
163
 
116
164
  /**
117
165
  * Adds a canDeactivate guard for a route.
118
- * Handles overwrite detection and registration.
119
166
  *
120
- * @param name - Route name (input-validated by facade)
121
- * @param handler - Guard function or boolean (input-validated by facade)
122
- * @param isFromDefinition - True when guard comes from route definition (tracked for HMR replace)
167
+ * Symmetric counterpart to {@link addCanActivate}.
123
168
  */
124
169
  addCanDeactivate(
125
170
  name: string,
126
171
  handler: GuardFnFactory<Dependencies> | boolean,
127
172
  isFromDefinition = false,
128
173
  ): void {
129
- if (isFromDefinition) {
130
- this.#definitionDeactivateGuardNames.add(name);
131
- } else {
132
- this.#definitionDeactivateGuardNames.delete(name);
133
- }
134
-
135
- const isOverwrite = this.#canDeactivateFactories.has(name);
136
-
137
174
  this.#registerHandler(
138
175
  "deactivate",
139
176
  name,
140
177
  handler,
141
- this.#canDeactivateFactories,
142
- this.#canDeactivateFunctions,
178
+ isFromDefinition,
143
179
  "canDeactivate",
144
- isOverwrite,
145
180
  );
146
181
  }
147
182
 
148
183
  /**
149
184
  * Removes a canActivate guard for a route.
150
- * Input already validated by facade (not registering).
151
185
  *
152
186
  * @param name - Route name (already validated by facade)
187
+ * @param origin - Optional origin filter. `"definition"` clears only the
188
+ * definition slot; `"external"` clears only the external slot; omitted
189
+ * (default) clears both — backward compatible with pre-refactor semantics.
153
190
  */
154
- clearCanActivate(name: string): void {
155
- this.#canActivateFactories.delete(name);
156
- this.#canActivateFunctions.delete(name);
157
- this.#definitionActivateGuardNames.delete(name);
191
+ clearCanActivate(name: string, origin?: GuardOrigin): void {
192
+ let cleared = false;
193
+
194
+ if (origin !== "external") {
195
+ cleared = this.#definitionActivateFactories.delete(name) || cleared;
196
+ }
197
+
198
+ if (origin !== "definition") {
199
+ cleared = this.#externalActivateFactories.delete(name) || cleared;
200
+ }
201
+
202
+ if (cleared) {
203
+ this.#recompileSlot("activate", name);
204
+ }
158
205
  }
159
206
 
160
207
  /**
161
208
  * Removes a canDeactivate guard for a route.
162
- * Input already validated by facade (not registering).
163
209
  *
164
- * @param name - Route name (already validated by facade)
210
+ * Symmetric counterpart to {@link clearCanActivate}.
165
211
  */
166
- clearCanDeactivate(name: string): void {
167
- this.#canDeactivateFactories.delete(name);
168
- this.#canDeactivateFunctions.delete(name);
169
- this.#definitionDeactivateGuardNames.delete(name);
212
+ clearCanDeactivate(name: string, origin?: GuardOrigin): void {
213
+ let cleared = false;
214
+
215
+ if (origin !== "external") {
216
+ cleared = this.#definitionDeactivateFactories.delete(name) || cleared;
217
+ }
218
+
219
+ if (origin !== "definition") {
220
+ cleared = this.#externalDeactivateFactories.delete(name) || cleared;
221
+ }
222
+
223
+ if (cleared) {
224
+ this.#recompileSlot("deactivate", name);
225
+ }
170
226
  }
171
227
 
172
228
  /**
@@ -174,36 +230,50 @@ export class RouteLifecycleNamespace<
174
230
  * Used by clearRoutes to reset all lifecycle state.
175
231
  */
176
232
  clearAll(): void {
177
- this.#canActivateFactories.clear();
233
+ this.#definitionActivateFactories.clear();
234
+ this.#externalActivateFactories.clear();
235
+ this.#definitionDeactivateFactories.clear();
236
+ this.#externalDeactivateFactories.clear();
178
237
  this.#canActivateFunctions.clear();
179
- this.#canDeactivateFactories.clear();
180
238
  this.#canDeactivateFunctions.clear();
181
- this.#definitionActivateGuardNames.clear();
182
- this.#definitionDeactivateGuardNames.clear();
183
239
  }
184
240
 
185
241
  /**
186
242
  * Clears only lifecycle handlers that were registered from route definitions.
187
- * Used by HMR to remove definition-sourced guards without touching externally-added guards.
243
+ * Used by HMR `replace()` to remove definition-sourced guards without
244
+ * touching externally-added guards.
245
+ *
246
+ * For slots where both definition and external exist, the external factory
247
+ * stays and the compiled function is unchanged (external already won at
248
+ * registration time). For definition-only slots, the compiled function is
249
+ * dropped.
188
250
  */
189
251
  clearDefinitionGuards(): void {
190
- for (const name of this.#definitionActivateGuardNames) {
191
- this.#canActivateFactories.delete(name);
192
- this.#canActivateFunctions.delete(name);
252
+ for (const name of this.#definitionActivateFactories.keys()) {
253
+ if (!this.#externalActivateFactories.has(name)) {
254
+ this.#canActivateFunctions.delete(name);
255
+ }
193
256
  }
194
- for (const name of this.#definitionDeactivateGuardNames) {
195
- this.#canDeactivateFactories.delete(name);
196
- this.#canDeactivateFunctions.delete(name);
257
+
258
+ for (const name of this.#definitionDeactivateFactories.keys()) {
259
+ if (!this.#externalDeactivateFactories.has(name)) {
260
+ this.#canDeactivateFunctions.delete(name);
261
+ }
197
262
  }
198
263
 
199
- this.#definitionActivateGuardNames.clear();
200
- this.#definitionDeactivateGuardNames.clear();
264
+ this.#definitionActivateFactories.clear();
265
+ this.#definitionDeactivateFactories.clear();
201
266
  }
202
267
 
203
268
  /**
204
- * Returns lifecycle factories as records for cloning.
269
+ * Returns lifecycle factories as a flat `[deactivate, activate]` tuple of
270
+ * `Record<name, factory>` — the effective view where external wins over
271
+ * definition for the same slot. Used by `getRoutesApi` to enrich route
272
+ * objects with their current canActivate / canDeactivate factories and by
273
+ * the route-removal cleanup path.
205
274
  *
206
- * @returns Tuple of [canDeactivateFactories, canActivateFactories]
275
+ * For cloneRouter (which needs to preserve origin on re-registration), use
276
+ * {@link getFactoriesByOrigin} instead.
207
277
  */
208
278
  getFactories(): [
209
279
  Record<string, GuardFnFactory<Dependencies>>,
@@ -212,17 +282,62 @@ export class RouteLifecycleNamespace<
212
282
  const deactivateRecord: Record<string, GuardFnFactory<Dependencies>> = {};
213
283
  const activateRecord: Record<string, GuardFnFactory<Dependencies>> = {};
214
284
 
215
- for (const [name, factory] of this.#canDeactivateFactories) {
285
+ for (const [name, factory] of this.#definitionDeactivateFactories) {
286
+ deactivateRecord[name] = factory;
287
+ }
288
+ for (const [name, factory] of this.#externalDeactivateFactories) {
216
289
  deactivateRecord[name] = factory;
217
290
  }
218
291
 
219
- for (const [name, factory] of this.#canActivateFactories) {
292
+ for (const [name, factory] of this.#definitionActivateFactories) {
293
+ activateRecord[name] = factory;
294
+ }
295
+ for (const [name, factory] of this.#externalActivateFactories) {
220
296
  activateRecord[name] = factory;
221
297
  }
222
298
 
223
299
  return [deactivateRecord, activateRecord];
224
300
  }
225
301
 
302
+ /**
303
+ * Returns factories tagged by origin — definition and external as separate
304
+ * `[deactivate, activate]` tuples. Used by `cloneRouter` to re-register
305
+ * guards on the clone with their original origin flag preserved.
306
+ */
307
+ getFactoriesByOrigin(): {
308
+ definition: [
309
+ Record<string, GuardFnFactory<Dependencies>>,
310
+ Record<string, GuardFnFactory<Dependencies>>,
311
+ ];
312
+ external: [
313
+ Record<string, GuardFnFactory<Dependencies>>,
314
+ Record<string, GuardFnFactory<Dependencies>>,
315
+ ];
316
+ } {
317
+ const defDeact: Record<string, GuardFnFactory<Dependencies>> = {};
318
+ const defAct: Record<string, GuardFnFactory<Dependencies>> = {};
319
+ const extensionDeact: Record<string, GuardFnFactory<Dependencies>> = {};
320
+ const extensionAct: Record<string, GuardFnFactory<Dependencies>> = {};
321
+
322
+ for (const [name, factory] of this.#definitionDeactivateFactories) {
323
+ defDeact[name] = factory;
324
+ }
325
+ for (const [name, factory] of this.#definitionActivateFactories) {
326
+ defAct[name] = factory;
327
+ }
328
+ for (const [name, factory] of this.#externalDeactivateFactories) {
329
+ extensionDeact[name] = factory;
330
+ }
331
+ for (const [name, factory] of this.#externalActivateFactories) {
332
+ extensionAct[name] = factory;
333
+ }
334
+
335
+ return {
336
+ definition: [defDeact, defAct],
337
+ external: [extensionDeact, extensionAct],
338
+ };
339
+ }
340
+
226
341
  /**
227
342
  * Returns compiled lifecycle functions for transition execution.
228
343
  *
@@ -274,44 +389,49 @@ export class RouteLifecycleNamespace<
274
389
  // =========================================================================
275
390
 
276
391
  /**
277
- * Registers a handler.
278
- * Handles overwrite warning, count threshold warnings, and factory compilation.
279
- *
280
- * @param type - Guard type for log messages ("activate" or "deactivate")
281
- * @param name - Route name to register the guard for
282
- * @param handler - Guard factory function or boolean shorthand
283
- * @param factories - Target factory map (canActivate or canDeactivate)
284
- * @param functions - Target compiled functions map (canActivate or canDeactivate)
285
- * @param methodName - Public API method name for error/warning messages
286
- * @param isOverwrite - Whether this replaces an existing guard for the same route
392
+ * Routes a registration into the origin-specific factory Map and compiles
393
+ * the just-added factory (last add wins for the compiled function).
394
+ * Emits overwrite / threshold warnings symmetric with the pre-refactor
395
+ * single-Map behaviour: any prior entry for the slot same origin or
396
+ * cross-origin counts as an overwrite for the warning surface; only a
397
+ * brand-new slot (no entry in either Map) increments the threshold check.
287
398
  */
288
399
  #registerHandler(
289
400
  type: "activate" | "deactivate",
290
401
  name: string,
291
402
  handler: GuardFnFactory<Dependencies> | boolean,
292
- factories: Map<string, GuardFnFactory<Dependencies>>,
293
- functions: Map<string, GuardFn>,
403
+ isFromDefinition: boolean,
294
404
  methodName: string,
295
- isOverwrite: boolean,
296
405
  ): void {
297
- // Emit warnings
406
+ const factoryMaps = this.#getFactoryMaps(type);
407
+ const functions =
408
+ type === "activate"
409
+ ? this.#canActivateFunctions
410
+ : this.#canDeactivateFunctions;
411
+ const targetMap = isFromDefinition
412
+ ? factoryMaps.definition
413
+ : factoryMaps.external;
414
+ const otherMap = isFromDefinition
415
+ ? factoryMaps.external
416
+ : factoryMaps.definition;
417
+
418
+ const isOverwrite = targetMap.has(name) || otherMap.has(name);
419
+
298
420
  if (isOverwrite) {
299
421
  this.#getValidator?.()?.lifecycle.warnOverwrite(name, type, methodName);
300
422
  } else {
301
423
  this.#getValidator?.()?.lifecycle.validateCountThresholds(
302
- factories.size + 1,
424
+ this.getHandlerCount(type) + 1,
303
425
  methodName,
304
426
  );
305
427
  }
306
428
 
307
- // Convert boolean to factory if needed
308
429
  const factory =
309
430
  typeof handler === "boolean"
310
431
  ? booleanToFactory<Dependencies>(handler)
311
432
  : handler;
312
433
 
313
- // Store factory
314
- factories.set(name, factory);
434
+ targetMap.set(name, factory);
315
435
 
316
436
  // Mark route as being registered before calling user factory
317
437
  this.#registering.add(name);
@@ -327,8 +447,16 @@ export class RouteLifecycleNamespace<
327
447
 
328
448
  functions.set(name, fn);
329
449
  } catch (error) {
330
- // Rollback on failure to maintain consistency
331
- factories.delete(name);
450
+ // Rollback the slot we just touched to keep storage consistent. If a
451
+ // cross-origin entry exists for the same name, its compiled function
452
+ // remains in place — recompile so navigation still sees a valid guard.
453
+ targetMap.delete(name);
454
+
455
+ if (otherMap.has(name)) {
456
+ this.#recompileSlot(type, name);
457
+ } else {
458
+ functions.delete(name);
459
+ }
332
460
 
333
461
  throw error;
334
462
  } finally {
@@ -336,6 +464,59 @@ export class RouteLifecycleNamespace<
336
464
  }
337
465
  }
338
466
 
467
+ /**
468
+ * Recompiles the compiled-function slot from whichever origin Map still has
469
+ * an entry for `name` after a clear. External wins over definition; if
470
+ * neither has an entry, the compiled function is deleted.
471
+ */
472
+ #recompileSlot(type: "activate" | "deactivate", name: string): void {
473
+ const factoryMaps = this.#getFactoryMaps(type);
474
+ const functions =
475
+ type === "activate"
476
+ ? this.#canActivateFunctions
477
+ : this.#canDeactivateFunctions;
478
+
479
+ const effective =
480
+ factoryMaps.external.get(name) ?? factoryMaps.definition.get(name);
481
+
482
+ if (!effective) {
483
+ functions.delete(name);
484
+
485
+ return;
486
+ }
487
+
488
+ try {
489
+ const fn = this.#deps.compileFactory(effective);
490
+
491
+ /* v8 ignore next 4 -- @preserve: stored factories were validated at add time, compileFactory should yield a function on second call too */
492
+ if (typeof fn !== "function") {
493
+ functions.delete(name);
494
+
495
+ return;
496
+ }
497
+
498
+ functions.set(name, fn);
499
+ } catch {
500
+ /* v8 ignore next 2 -- @preserve: defensive — a user-provided factory could theoretically throw on re-compile (state changed since add time); deleting the function blocks navigation on that slot */
501
+ functions.delete(name);
502
+ }
503
+ }
504
+
505
+ #getFactoryMaps(type: "activate" | "deactivate"): {
506
+ definition: Map<string, GuardFnFactory<Dependencies>>;
507
+ external: Map<string, GuardFnFactory<Dependencies>>;
508
+ } {
509
+ return type === "activate"
510
+ ? {
511
+ definition: this.#definitionActivateFactories,
512
+ external: this.#externalActivateFactories,
513
+ }
514
+ : {
515
+ definition: this.#definitionDeactivateFactories,
516
+ external: this.#externalDeactivateFactories,
517
+ };
518
+ }
519
+
339
520
  /**
340
521
  * Shared implementation for synchronous guard checks.
341
522
  * Warns if a guard returns a Promise (async guards are not supported in sync mode).
@@ -1,6 +0,0 @@
1
- const e=require(`./internals-CM6oaz9n.js`);let t=require(`@real-router/logger`),n=require(`@real-router/fsm`);const r={maxListeners:0,warnListeners:0,maxEventDepth:0};var i=class extends Error{},a=class{#e=new Map;#t=null;#n=r;#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,a,o,s){this.#t??=new Map;let c=this.#t,l=c.get(t)??0;if(l>=this.#n.maxEventDepth)throw new i(`Maximum recursion depth (${this.#n.maxEventDepth}) exceeded for event: ${t}`);try{c.set(t,l+1);let u=[...e];for(let e of u)try{this.#o(e,n,r,a,o,s)}catch(e){if(e instanceof i)throw e;this.#r?.(t,e)}}finally{c.set(t,c.get(t)-1)}}#c(e){let t=this.#e.get(e);if(t)return t;let n=new Set;return this.#e.set(e,n),n}};const o=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`}),s=`@@router/UNKNOWN_ROUTE`,c={UNKNOWN_ROUTE:s},l={ROUTER_START:`onStart`,ROUTER_STOP:`onStop`,TRANSITION_START:`onTransitionStart`,TRANSITION_LEAVE_APPROVE:`onTransitionLeaveApprove`,TRANSITION_CANCEL:`onTransitionCancel`,TRANSITION_SUCCESS:`onTransitionSuccess`,TRANSITION_ERROR:`onTransitionError`},u={ROUTER_START:`$start`,ROUTER_STOP:`$stop`,TRANSITION_START:`$$start`,TRANSITION_LEAVE_APPROVE:`$$leaveApprove`,TRANSITION_CANCEL:`$$cancel`,TRANSITION_SUCCESS:`$$success`,TRANSITION_ERROR:`$$error`},d={maxDependencies:100,maxPlugins:50,maxListeners:1e4,warnListeners:1e3,maxEventDepth:5,maxLifecycleHandlers:200},f=Object.freeze({}),p=Object.freeze({deactivated:Object.freeze([]),activated:Object.freeze([]),intersection:``}),m=Object.freeze({phase:`activating`,reason:`success`,segments:p}),h={IDLE:`IDLE`,STARTING:`STARTING`,READY:`READY`,TRANSITION_STARTED:`TRANSITION_STARTED`,LEAVE_APPROVED:`LEAVE_APPROVED`,DISPOSED:`DISPOSED`},g={START:`START`,STARTED:`STARTED`,NAVIGATE:`NAVIGATE`,LEAVE_APPROVE:`LEAVE_APPROVE`,COMPLETE:`COMPLETE`,FAIL:`FAIL`,CANCEL:`CANCEL`,STOP:`STOP`,DISPOSE:`DISPOSE`},_={initial:h.IDLE,context:null,transitions:{[h.IDLE]:{[g.START]:h.STARTING,[g.DISPOSE]:h.DISPOSED},[h.STARTING]:{[g.STARTED]:h.READY,[g.FAIL]:h.IDLE,[g.DISPOSE]:h.DISPOSED},[h.READY]:{[g.NAVIGATE]:h.TRANSITION_STARTED,[g.FAIL]:h.READY,[g.STOP]:h.IDLE,[g.DISPOSE]:h.DISPOSED},[h.TRANSITION_STARTED]:{[g.NAVIGATE]:h.TRANSITION_STARTED,[g.LEAVE_APPROVE]:h.LEAVE_APPROVED,[g.CANCEL]:h.READY,[g.FAIL]:h.READY,[g.DISPOSE]:h.DISPOSED},[h.LEAVE_APPROVED]:{[g.NAVIGATE]:h.TRANSITION_STARTED,[g.COMPLETE]:h.READY,[g.CANCEL]:h.READY,[g.FAIL]:h.READY,[g.DISPOSE]:h.DISPOSED},[h.DISPOSED]:{}}};function v(){return new n.FSM(_)}function y(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 b(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&&b(r,t)}}function ee(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 te(e){if(!e)return e;if(!ee(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 ne(e){return e&&Object.freeze(e)}function re(e={}){return{...d,...e}}function ie(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}function ae(e={}){let t=Object.create(null);for(let n in e)e[n]!==void 0&&(t[n]=e[n]);return{dependencies:t,limits:d}}function oe(e){return`(${e.replaceAll(/(^<|>$)/g,``)})`}const se=/([:*])([^/?<]+)(<[^>]+>)?(\?)?/g,ce=/([:*][^/?<]+(?:<[^>]+>)?)\?(?=\/|$)/g,le=/\?(.+)$/;function ue(e){let t=[],n=[],r=[],i={},a=new Map,o=e.replaceAll(ce,`$1`),s=le.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=se.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=`^${oe(o)}$`;a.set(n,{pattern:new RegExp(e),constraint:o})}}return{urlParams:t,queryParams:n,spatParams:r,paramTypeMap:i,constraintPatterns:a,pathPattern:e}}const de=/[^\w!$'()*+,.:;|~-]/gu,fe=/[^\w!$'()*+,.:;|~-]/u,pe={default:e=>fe.test(e)?e.replaceAll(de,e=>encodeURIComponent(e)):e,uri:encodeURI,uriComponent:encodeURIComponent,none:e=>e},me={default:decodeURIComponent,uri:decodeURI,uriComponent:decodeURIComponent,none:e=>e};function x(){return{staticChildren:Object.create(null),hasChildren:!1,paramChild:void 0,splatChild:void 0,route:void 0,slashChildRoute:void 0}}function S(e){return e.length>1&&e.endsWith(`/`)?e.slice(0,-1):e}function he(e,t){return e===``?t:t===``?e:e+t}function ge(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function _e(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(!ge(n)||!ge(r))return!1;t+=3}else t++;return!0}const C=/<[^>]*>/g;function ve(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(C,``),u=o?l:he(n,l),d=i;a||(d=ye(e,t,u,o?``:n,r,i));for(let n of t.children.values())ve(e,n,u,r,d);a||r.pop()}function ye(e,t,n,r,i,a){let o=Ce(n,r),s=Object.freeze([...i]),c=be(s),l=S(n),u=Ae(e.rootQueryParams,i),d=je(i),{buildStaticParts:f,buildParamSlots:p}=ke(o?S(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?xe(e,m,r):Se(e,m,n,l,t),m}function be(e){let t={};for(let n of e)t[n.fullName]=n.paramTypeMap;return Object.freeze(t)}function xe(e,t,n){Te(e,t,n);let r=S(n),i=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.has(i)&&e.staticCache.set(i,t)}function Se(e,t,n,r,i){if(we(e,t,n),i.paramMeta.urlParams.length===0){let n=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.set(n,t)}}function Ce(e,t){return S(e)===S(t)}function we(e,t,n){let r=S(n);if(r===`/`){e.root.route=t;return}w(e,e.root,r,1,t)}function w(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(C,``).replace(/\?$/,``);t.paramChild??={node:x(),name:r},w(e,t.paramChild.node,n,s+1,i),s>=a?t.route??=i:w(e,t,n,s+1,i);return}t=Oe(e,t,c),r=s+1}t.route=i}function Te(e,t,n){let r=Ee(e,n);r.slashChildRoute=t}function Ee(e,t){return De(e,e.root,t)}function De(e,t,n){let r=S(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=Oe(e,i,s),a=n+1}return i}function Oe(e,t,n){if(n.startsWith(`*`)){let e=n.slice(1);return t.splatChild??={node:x(),name:e},t.hasChildren=!0,t.splatChild.node}if(n.startsWith(`:`)){let e=n.slice(1).replaceAll(C,``).replace(/\?$/,``);return t.paramChild??={node:x(),name:e},t.hasChildren=!0,t.paramChild.node}let r=e.options.caseSensitive?n:n.toLowerCase();return r in t.staticChildren||(t.staticChildren[r]=x(),t.hasChildren=!0),t.staticChildren[r]}function ke(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=pe[n],r=e.split(`/`),i=t(r[0]);for(let e=1;e<r.length;e++)i+=`/${t(r[e])}`;return i}:pe[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 Ae(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 je(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 Me=class{get options(){return this.#e}#e;#t=x();#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:me[this.#e.urlParamsEncoding]}registerTree(e){this.#c=e.paramMeta.queryParams,ve({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=S(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(!_e(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 T=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)},Ne=(e,t)=>{if(e===void 0)return t.boolean.decodeUndefined();let n=t.boolean.decodeRaw(e);if(n!==null)return n;let r=T(e),i=t.number.decode(r);return i===null?t.boolean.decodeValue(r):i},E=e=>{let t=typeof e;if(t!==`string`&&t!==`number`&&t!==`boolean`)throw TypeError(`[search-params] Array element must be a string, number, or boolean — received ${t===`object`&&e===null?`null`:t}`);return encodeURIComponent(e)},Pe=(e,t,n)=>{if(t.length===0)return``;let r=`${e}${n}`,i=`${r}=${E(t[0])}`;for(let e=1;e<t.length;e++)i+=`&${r}=${E(t[e])}`;return i},Fe={none:{encodeArray:(e,t)=>Pe(e,t,``)},brackets:{encodeArray:(e,t)=>Pe(e,t,`[]`)},index:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}[0]=${E(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}[${r}]=${E(t[r])}`;return n}},comma:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}=${E(t[0])}`;for(let e=1;e<t.length;e++)n+=`,${E(t[e])}`;return n},decodeValue:e=>e.includes(`,`)?e.split(`,`):null}},Ie={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}},Le={default:{encode:e=>e},hidden:{encode:()=>``}},Re={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}},ze=(e,t,n,r)=>({boolean:Ie[t],null:Le[n],number:Re[r],array:Fe[e]}),Be={boolean:Ie.auto,null:Le.default,number:Re.auto,array:Fe.none},D={arrayFormat:`none`,booleanFormat:`auto`,nullFormat:`default`,numberFormat:`auto`},Ve={...D,strategies:Be},He=e=>{if(!e||e.arrayFormat===void 0&&e.booleanFormat===void 0&&e.nullFormat===void 0&&e.numberFormat===void 0)return Ve;let t=e.arrayFormat??D.arrayFormat,n=e.booleanFormat??D.booleanFormat,r=e.nullFormat??D.nullFormat,i=e.numberFormat??D.numberFormat;return{arrayFormat:t,booleanFormat:n,nullFormat:r,numberFormat:i,strategies:ze(t,n,r,i)}},O=e=>encodeURIComponent(e),Ue=(e,t,n)=>{let r=O(e);switch(typeof t){case`string`:case`number`:return`${r}=${O(t)}`;case`boolean`:return n.strategies.boolean.encode(r,t);case`object`:return t===null?n.strategies.null.encode(r):Array.isArray(t)?n.strategies.array.encodeArray(r,t):`${r}=${O(t)}`;default:return`${r}=${O(t)}`}},We=e=>{let t=e.indexOf(`?`);return t===-1?e:e.slice(t+1)};function Ge(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 Ke(e,t,n,r,i){return i?Ne(r?e.slice(t+1,n):void 0,i):r?T(e.slice(t+1,n)):null}function qe(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=T(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)Ge(r,u,Ne(e,i),!0);return}}Ge(r,u,Ke(e,a,n,o,i),l)}const Je=(e,t)=>{let n=We(e);if(n===``||n===`?`)return{};if(!t)return Ye(n);let r=He(t),i={},a=0,o=n.length;for(;a<o;){let e=n.indexOf(`&`,a);e===-1&&(e=o),qe(n,a,e,i,r.strategies),a=e+1}return i};function Ye(e){let t={};return Xe(e,t),t}function Xe(e,t){let n=0,r=e.length;for(;n<r;){let i=e.indexOf(`&`,n);i===-1&&(i=r),qe(e,n,i,t),n=i+1}}const Ze=(e,t)=>{let n=Object.keys(e);if(n.length===0)return``;let r=He(t),i=[];for(let t of n){let n=e[t];if(n===void 0)continue;let a=Ue(t,n,r);a&&i.push(a)}return i.join(`&`)};function k(e,t){let n=e.path,r=n.startsWith(`~`),i=r?n.slice(1):n,a={name:e.name,path:i,absolute:r,children:[],parent:t,nonAbsoluteChildren:[],fullName:``};if(e.children)for(let t of e.children){let e=k(t,a);a.children.push(e)}return a}function Qe(e,t,n){let r=k({name:e,path:t},null);for(let e of n){let t=k(e,r);r.children.push(t)}return r}const $e=Object.freeze(new Map),et=Object.freeze([]);function tt(e){return e.parent?.name?`${e.parent.fullName}.${e.name}`:e.name}function nt(e,t){return e.endsWith(`/`)&&t.startsWith(`/`)?e+t.slice(1):e+t}function rt(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:nt(i.staticPath,e.path):e.path}function it(e){let t=new Map;for(let n of e)t.set(n.name,n);return t}function at(e,t,n){let r=[],i=[];for(let a of e){let e=ot(a,t,n);r.push(e),e.absolute||i.push(e)}return{childrenMap:it(r),nonAbsoluteChildren:i}}function ot(e,t,n){let r=ue(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=tt(a),a.staticPath=rt(a),e.children.length===0)a.children=$e,a.nonAbsoluteChildren=et;else{let{childrenMap:t,nonAbsoluteChildren:r}=at(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 st(e,t=!0){return ot(e,null,t)}function ct(e,t){let n=[];return{add(e){return n.push(e),this},addMany(e){return n.push(...e),this},build(r){return st(Qe(e,t,n),!r?.skipFreeze)}}}function lt(e,t,n,r){return ct(e,t).addMany(n).build(r)}function A(e){let t=e.absolute?`~${e.path}`:e.path,n={name:e.name,path:t};return e.children.size>0&&(n.children=Array.from(e.children.values(),A)),n}function ut(e){return Array.from(e.children.values(),A)}function dt(e){let t=e?.queryParams;return new Me({...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=>Je(e,t),buildQueryString:e=>Ze(e,t)})}const ft={defaultRoute:``,defaultParams:{},trailingSlash:`preserve`,queryParamsMode:`loose`,queryParams:D,urlParamsEncoding:`default`,allowNotFound:!0,rewritePathOnMatch:!0};function pt(e){Object.freeze(e);for(let t of Object.keys(e)){let n=e[t];n&&typeof n==`object`&&n.constructor===Object&&pt(n)}return e}function mt(e,t){return typeof e==`function`?e(t):e}function ht(e){if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(`[router.constructor] options must be a plain object`)}var gt=class{#e;constructor(e={}){this.#e=pt({...ft,...e})}static validateOptionsIsObject(e){ht(e)}get(){return this.#e}};function j(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!j(e[n],t[n]))return!1;return!0}return!1}const _t=new WeakMap;function vt(e){return _t.get(e)}function yt(e,t){_t.set(e,t)}var bt=class{#e=void 0;#t=void 0;#n;#r=new Map;get(){return this.#e}set(e){this.#t=this.#e,this.#e=e?ne(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(),o=Object.hasOwn(a,e),s;s=o?Object.freeze({...a[e],...t}):!t||t===f?f:Object.freeze({...t});let c={name:e,params:s,path:n??this.#n.buildPath(e,t),context:{},...!i&&{transition:m}};return r&&yt(c,r),i?c:ne(c)}areStatesEqual(e,t,n=!0){if(!e||!t)return!!e==!!t;if(e.name!==t.name)return!1;if(n){let n=this.#i(e.name);for(let r of n)if(!j(e.params[r],t.params[r]))return!1;return!0}let r=Object.keys(e.params),i=Object.keys(t.params);if(r.length!==i.length)return!1;for(let n of r)if(!(n in t.params)||!j(e.params[n],t.params[n]))return!1;return!0}#i(e){let t=this.#r.get(e);if(t!==void 0)return t;let n=this.#n.getUrlParams(e);return this.#r.set(e,n),n}};const xt={[l.ROUTER_START]:u.ROUTER_START,[l.ROUTER_STOP]:u.ROUTER_STOP,[l.TRANSITION_SUCCESS]:u.TRANSITION_SUCCESS,[l.TRANSITION_START]:u.TRANSITION_START,[l.TRANSITION_LEAVE_APPROVE]:u.TRANSITION_LEAVE_APPROVE,[l.TRANSITION_ERROR]:u.TRANSITION_ERROR,[l.TRANSITION_CANCEL]:u.TRANSITION_CANCEL},St=Object.keys(xt),M=`router.usePlugin`;function Ct(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 wt=class e{#e=new Set;#t=new Set;#n;#r=d;#i=null;static validatePlugin(e){Ct(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 n=e[0],r=this.#o(n);this.#e.add(n);let i=!1,a=()=>{if(!i){i=!0,this.#e.delete(n),this.#t.delete(a);try{r()}catch(e){t.logger.error(M,`Error during cleanup:`,e)}}};return this.#t.add(a),a}let n=this.#a(e),r=[];try{for(let e of n){let t=this.#o(e);r.push({factory:e,cleanup:t})}}catch(e){for(let{cleanup:e}of r)try{e()}catch(e){t.logger.error(M,`Cleanup error:`,e)}throw e}for(let{factory:e}of r)this.#e.add(e);let i=!1,a=()=>{if(!i){i=!0,this.#t.delete(a);for(let{factory:e}of r)this.#e.delete(e);for(let{cleanup:e}of r)try{e()}catch(e){t.logger.error(M,`Error during cleanup:`,e)}}};return this.#t.add(a),a}getAll(){return[...this.#e]}has(e){return this.#e.has(e)}disposeAll(){for(let e of this.#t)e();this.#e.clear(),this.#t.clear()}#a(e){let t=new Set;for(let n of e)t.has(n)?this.#i?.()?.plugins.warnBatchDuplicates(e):t.add(n);return t}#o(t){let n=this.#n.compileFactory(t);e.validatePlugin(n),this.#i?.()?.plugins.validatePluginKeys(n),Object.freeze(n);let r=[];for(let e of St)e in n&&(typeof n[e]==`function`?(r.push(this.#n.addEventListener(xt[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 Tt(e){let t=()=>e;return()=>t}var Et=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=d;#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`?Tt(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 N(){return{decoders:Object.create(null),encoders:Object.create(null),defaultParams:Object.create(null),forwardMap:Object.create(null),forwardFnMap:Object.create(null)}}function Dt(e,t){for(let n in e)if(e[n]!==t[n])return!1;return!0}function Ot(e,t,n){for(let r in e)if(!(r in n)&&e[r]!==t[r])return!1;return!0}function kt(e,t){if(!t||!At(e,t))return e;let n={};for(let r in e)t[r]!==`query`&&(n[r]=e[r]);return n}function At(e,t){for(let n in e)if(t[n]===`query`)return!0;return!1}function P(e){let t={name:e.name,path:e.path};return e.children&&(t.children=e.children.map(e=>P(e))),t}function jt(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}.`)&&jt(i.children,t,a))return!0}return!1}function Mt(e,t){for(let n of Object.keys(e))t(n)&&delete e[n]}function Nt(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 Pt(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 Ft(e,t,n){let r=lt(``,t,e),i=dt(n);return i.registerTree(r),{tree:r,matcher:i}}function F(e){let t=Ft(e.definitions,e.rootPath,e.matcherOptions);e.tree=t.tree,e.matcher=t.matcher}function It(e){F(e),e.resolvedForwardMap=I(e.config)}function Lt(e){Rt(e),F(e)}function Rt(e){e.definitions.length=0,Object.assign(e.config,N()),e.resolvedForwardMap=Object.create(null),e.routeCustomFields=Object.create(null)}function I(e){let t=Object.create(null);for(let n of Object.keys(e.forwardMap))t[n]=Pt(n,e.forwardMap);return t}function zt(e,n,r){if(e.canActivate){let r=typeof e.forwardTo==`string`?e.forwardTo:`[dynamic]`;t.logger.warn(`real-router`,`Route "${n}" has both forwardTo and canActivate. canActivate will be ignored because forwardTo creates a redirect (industry standard). Move canActivate to the target route "${r}".`)}if(e.canDeactivate){let r=typeof e.forwardTo==`string`?e.forwardTo:`[dynamic]`;t.logger.warn(`real-router`,`Route "${n}" has both forwardTo and canDeactivate. canDeactivate will be ignored because forwardTo creates a redirect (industry standard). Move canDeactivate to the target route "${r}".`)}if(typeof e.forwardTo==`function`){let t=e.forwardTo.constructor.name===`AsyncFunction`,r=e.forwardTo.toString().includes(`__awaiter`);if(t||r)throw TypeError(`forwardTo callback cannot be async for route "${n}". Async functions break matchPath/buildPath.`)}typeof e.forwardTo==`string`?r.forwardMap[n]=e.forwardTo:r.forwardFnMap[n]=e.forwardTo}function Bt(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&&zt(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 L(e,t,n,r,i,a,o=``){for(let s of e){let e=o?`${o}.${s.name}`:s.name;Bt(s,e,t,n,r,i,a),s.children&&L(s.children,t,n,r,i,a,e)}}function Vt(e,t){let n=[],r=N(),i=Object.create(null),a=new Map,o=new Map;for(let t of e)n.push(P(t));let{tree:s,matcher:c}=Ft(n,``,t);return L(e,r,i,a,o,void 0,``),{definitions:n,config:r,tree:s,matcher:c,resolvedForwardMap:I(r),routeCustomFields:i,rootPath:``,matcherOptions:t,depsStore:void 0,lifecycleNamespace:void 0,pendingCanActivate:a,pendingCanDeactivate:o,treeOperations:{commitTreeChanges:It,resetStore:Lt,nodeToDefinition:A}}}const R=[];Object.freeze(R);function Ht(e){let t=e.length,n=[];for(let r=t-1;r>=0;r--)n.push(e[r]);return n}function Ut(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 Wt(e){let t=typeof e;return t===`string`||t===`number`||t===`boolean`}function Gt(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(Wt(t)&&Wt(i)&&String(t)!==String(i))return!1}return!0}function Kt(e,t,n,r,i,a){for(let o=0;o<a;o++){let a=r[o];if(a!==i[o]||!Gt(a,e,t,n))return o}return a}const qt=new Map;function z(e){let t=qt.get(e);if(t)return t;let n=Jt(e);return Object.freeze(n),qt.set(e,n),n}function Jt(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]:Ut(e)}let B,V,H=null,Yt,Xt,U=null;function Zt(e,t){if(!t)return{intersection:``,toActivate:z(e.name),toDeactivate:R};let n=vt(e),r=vt(t);if(!n&&!r)return{intersection:``,toActivate:z(e.name),toDeactivate:Ht(z(t.name))};let i=z(e.name),a=z(t.name),o=Math.min(a.length,i.length),s=Kt(n??r,e,t,i,a,o),c;if(s>=a.length)c=R;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 W(e,t){if(H!==null&&e===B&&t===V)return H;if(U!==null&&e===Yt&&t===Xt)return U;let n=Zt(e,t);return Yt=B,Xt=V,U=H,B=e,V=t,H=n,n}function Qt(e){let t=[];for(let n of e)for(let e of n.paramMeta.urlParams)t.push(e);return t}function $t(e){return e.at(-1)?.fullName??``}function en(e,t){return{name:t??$t(e.segments),params:e.params,meta:e.meta}}var tn=class{#e;#t;get#n(){return this.#e.depsStore}constructor(e=[],t){this.#e=Vt(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}=W(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,F(this.#e)}hasRoute(e){return this.#e.matcher.hasRoute(e)}clearRoutes(){Lt(this.#e)}buildPath(e,t,n){if(e===c.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??{},i=typeof this.#e.config.encoders[e]==`function`?this.#e.config.encoders[e]({...r}):r;return this.#e.matcher.buildPath(e,i,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}=en(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=Nt(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 en({segments:n,params:t,meta:this.#e.matcher.getMetaByName(e)},e)}isActiveRoute(e,t={},n=!1,r=!0){let i=this.#n.getState();if(!i)return!1;let a=i.name;if(a!==e&&!a.startsWith(`${e}.`)&&!e.startsWith(`${a}.`))return!1;let o=this.#e.config.defaultParams[e];if(n||a===e){let n={name:e,params:o?{...o,...t}:t,path:``,transition:m,context:{}};return this.#n.areStatesEqual(n,i,r)}if(!a.startsWith(`${e}.`))return!1;let s=i.params;return Dt(t,s)?o?Ot(r?kt(o,this.#e.matcher.getMetaByName(e)?.[e]):o,s,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?Qt(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 nn=new Set(Object.values(o)),rn=new Set([`code`,`segment`,`path`,`redirect`]),an=new Set([`setCode`,`setErrorInstance`,`setAdditionalFields`,`hasField`,`getField`,`toJSON`]);var G=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?te(i):void 0;for(let[e,t]of Object.entries(a)){if(rn.has(e))throw TypeError(`[RouterError] Cannot set reserved property "${e}"`);an.has(e)||(this[e]=t)}}setCode(e){this.code=e,nn.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(rn.has(t))throw TypeError(`[RouterError.setAdditionalFields] Cannot set reserved property "${t}"`);an.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}};const on=new G(o.ROUTER_NOT_STARTED),sn=new G(o.ROUTE_NOT_FOUND),cn=new G(o.SAME_STATES),K=Promise.reject(on),ln=Promise.reject(sn),un=Promise.reject(cn);K.catch(()=>{}),ln.catch(()=>{}),un.catch(()=>{});function dn(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.replace!==void 0&&(a.replace=t.replace),t.redirected!==void 0&&(a.redirected=t.redirected),Object.freeze(a)}function fn({signal:e,...t}){return t}function pn(e,t){let{toState:n,fromState:r,opts:i,toDeactivate:a,toActivate:s,intersection:l}=t;if(n.name!==c.UNKNOWN_ROUTE&&!e.hasRoute(n.name)){let t=new G(o.ROUTE_NOT_FOUND,{routeName:n.name});throw e.sendTransitionFail(n,r,t),t}if(r)for(let n of a)!s.includes(n)&&t.canDeactivateFunctions.has(n)&&e.clearCanDeactivate(n);n.transition=dn(r,i,a,s,l);let u=Object.freeze(n);e.setState(u);let d=i.signal===void 0?i:fn(i);return e.sendTransitionDone(u,r,d),u}function mn(e,t,n,r){let i=t;i.code===o.TRANSITION_CANCELLED||i.code===o.ROUTE_NOT_FOUND||e.sendTransitionFail(n,r,i)}function q(e,t,n){if(e instanceof DOMException&&e.name===`AbortError`)throw new G(o.TRANSITION_CANCELLED);hn(e,t,n)}function hn(e,t,n){throw e instanceof G?(e.setCode(t),e):new G(t,_n(e,n))}const gn=new Set([`code`,`segment`,`path`,`redirect`]);function _n(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))gn.has(n)||(t[n]=r);return{...n,...t}}return n}async function J(e,t,n){let r;try{r=await e}catch(e){q(e,t,n);return}if(!r)throw new G(t,{segment:n})}async function vn(e,t,n,r,i,a,s,c,l,u){await J(l,n,u);for(let l=c;l<t.length;l++){if(!s())throw new G(o.TRANSITION_CANCELLED);let c=t[l],u=e.get(c);if(!u)continue;let d=!1;try{d=u(r,i,a)}catch(e){q(e,n,c)}if(d instanceof Promise){await J(d,n,c);continue}if(!d)throw new G(n,{segment:c})}}async function yn(e,t,n,r,i,a,s,c,l){if(await e,!c())throw new G(o.TRANSITION_CANCELLED);let u=l();if(u!==void 0&&(await u,!c()))throw new G(o.TRANSITION_CANCELLED);if(r){let e=Y(t,n,o.CANNOT_ACTIVATE,i,a,s,c);if(e!==void 0&&await e,!c())throw new G(o.TRANSITION_CANCELLED)}}function bn(e,t,n,r,i,a,s,c,l,u,d){if(i){let i=Y(e,n,o.CANNOT_DEACTIVATE,s,c,l,u);if(i!==void 0)return yn(i,t,r,a,s,c,l,u,d)}if(!u())throw new G(o.TRANSITION_CANCELLED);let f=d();if(f!==void 0)return xn(f,a?t:void 0,r,s,c,l,u);if(a)return Y(t,r,o.CANNOT_ACTIVATE,s,c,l,u)}async function xn(e,t,n,r,i,a,s){if(await e,!s())throw new G(o.TRANSITION_CANCELLED);if(t!==void 0){let e=Y(t,n,o.CANNOT_ACTIVATE,r,i,a,s);if(e!==void 0&&await e,!s())throw new G(o.TRANSITION_CANCELLED)}}function Y(e,t,n,r,i,a,s){for(let[c,l]of t.entries()){if(!s())throw new G(o.TRANSITION_CANCELLED);let u=e.get(l);if(!u)continue;let d=!1;try{d=u(r,i,a)}catch(e){q(e,n,l)}if(d instanceof Promise)return vn(e,t,n,r,i,a,s,c+1,d,l);if(!d)throw new G(n,{segment:l})}}const Sn=[c.UNKNOWN_ROUTE];Object.freeze(Sn);const Cn={replace:!0};Object.freeze(Cn);function wn(e,t){return t?.name===c.UNKNOWN_ROUTE&&!e.replace?{...e,replace:!0}:e}function Tn(e,t,n){return!!e&&!t.reload&&!t.force&&e.path===n.path}var En=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(),sn),this.lastSyncRejected=!0,ln)}navigateToState(e,t){this.lastSyncResolved=!1;let n=this.#e;if(!n.canNavigate())return this.lastSyncRejected=!0,K;if(e.name!==c.UNKNOWN_ROUTE&&!n.hasRoute(e.name)){let t=new G(o.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 G(o.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 G(o.ROUTE_NOT_FOUND,{routeName:`defaultRoute resolved to empty`}))}navigateToNotFound(e){this.#c();let t=this.#e.getState(),n=t?z(t.name).toReversed():[];Object.freeze(n);let r={deactivated:n,activated:Sn,intersection:``};Object.freeze(r);let i={phase:`activating`,...t&&{from:t.name},reason:`success`,replace:!0,segments:r};Object.freeze(i);let a={name:c.UNKNOWN_ROUTE,params:f,path:e,transition:i,context:{}};return Object.freeze(a),this.#e.setState(a),this.#e.emitTransitionSuccess(a,t,Cn),a}abortCurrentNavigation(){this.#t?.abort(new G(o.TRANSITION_CANCELLED)),this.#t=null}#r(e,t){let n=this.#e,r,i=!1,a=null;try{if(r=n.getState(),t=wn(t,r),Tn(r,t,e))return n.emitTransitionError(e,r,cn),this.lastSyncRejected=!0,un;this.#c(t.signal);let s=++this.#n;if(n.startTransition(e,r),i=!0,this.#n!==s)throw new G(o.TRANSITION_CANCELLED);let[l,u]=n.getLifecycleFunctions(),d=e.name===c.UNKNOWN_ROUTE,f=W(e,r),{toDeactivate:p,toActivate:m,intersection:h}=f,g=r&&!t.forceDeactivate&&p.length>0,_=!d&&m.length>0,v=l.size>0||u.size>0,y=e;if(!v){let e=this.#o(y,r,s,t,f,l);if(e!==void 0)return e}if(v){a=new AbortController,this.#t=a;let i=()=>this.#n===s&&n.isActive(),c=a.signal,d=bn(l,u,p,m,!!g,_,e,r,c,i,()=>{if(n.sendLeaveApprove(y,r),n.hasLeaveListeners())return n.awaitLeaveListeners(y,r,c)});if(d!==void 0)return this.#i(d,{toState:e,fromState:r,opts:t,toDeactivate:p,toActivate:m,intersection:h,canDeactivateFunctions:l},a,s);if(!i())throw new G(o.TRANSITION_CANCELLED);this.#s(a)}return this.lastSyncResolved=!0,Promise.resolve(pn(n,{toState:e,fromState:r,opts:t,toDeactivate:p,toActivate:m,intersection:h,canDeactivateFunctions:l}))}catch(t){return this.#a(t,a,i,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 G(o.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 G(o.TRANSITION_CANCELLED);return pn(i,t)}catch(e){throw mn(i,e,t.toState,t.fromState),e}finally{this.#s(n)}}#a(e,t,n,r,i){t&&this.#s(t),n&&r&&mn(this.#e,e,r,i)}#o(e,t,n,r,i,a){let s=this.#e;if(s.sendLeaveApprove(e,t),s.hasLeaveListeners()){let o=new AbortController,c=s.awaitLeaveListeners(e,t,o.signal);if(c!==void 0)return this.#t=o,this.#i(c,{toState:e,fromState:t,opts:r,toDeactivate:i.toDeactivate,toActivate:i.toActivate,intersection:i.intersection,canDeactivateFunctions:a},o,n)}if(this.#n!==n)throw new G(o.TRANSITION_CANCELLED)}#s(e){e.abort(),this.#t===e&&(this.#t=null)}#c(e){if(this.#e.isTransitioning()&&(t.logger.warn(`router.navigate`,`Concurrent navigation detected on shared router instance. For SSR, use cloneRouter() to create isolated instance per request.`),this.#t?.abort(new G(o.TRANSITION_CANCELLED)),this.#e.cancelNavigation()),e?.aborted)throw new G(o.TRANSITION_CANCELLED,{reason:e.reason})}};const Dn={replace:!0};Object.freeze(Dn);var On=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 G(o.ROUTE_NOT_FOUND,{path:e});throw t.emitTransitionError(void 0,void 0,n),n}return t.completeStart(),r?t.navigateToState(r,Dn):t.navigateToNotFound(e)}stop(){this.#e.clearState()}};function X(e){return e instanceof Error?e:Error(String(e))}function kn(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(u.ROUTER_START)}emitRouterStop(){this.#t.emit(u.ROUTER_STOP)}emitTransitionStart(e,t){this.#t.emit(u.TRANSITION_START,e,t)}emitTransitionSuccess(e,t,n){this.#t.emit(u.TRANSITION_SUCCESS,e,t,n)}emitTransitionError(e,t,n){this.#t.emit(u.TRANSITION_ERROR,e,t,n)}emitTransitionCancel(e,t){this.#t.emit(u.TRANSITION_CANCEL,e,t)}emitTransitionLeaveApprove(e,t){this.#t.emit(u.TRANSITION_LEAVE_APPROVE,e,t)}sendStart(){this.#e.send(g.START)}sendStop(){this.#e.send(g.STOP)}sendDispose(){this.#e.send(g.DISPOSE)}sendStarted(){this.#e.send(g.STARTED)}sendNavigate(e,t){this.#r=e,this.#e.forceState(h.TRANSITION_STARTED),this.emitTransitionStart(e,t)}sendComplete(e,t,n={}){this.#e.forceState(h.READY),this.emitTransitionSuccess(e,t,n),this.#r===e&&(this.#r=void 0)}sendLeaveApprove(e,t){this.#e.forceState(h.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(g.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(g.CANCEL),this.#r===n&&(this.#r=void 0)}canBeginTransition(){return this.#e.canSend(g.NAVIGATE)}canStart(){return this.#e.canSend(g.START)}canCancel(){return this.#e.canSend(g.CANCEL)}isActive(){let e=this.#e.getState();return e!==h.IDLE&&e!==h.DISPOSED}isDisposed(){return this.#e.getState()===h.DISPOSED}isTransitioning(){let e=this.#e.getState();return e===h.TRANSITION_STARTED||e===h.LEAVE_APPROVED}isLeaveApproved(){return this.#e.getState()===h.LEAVE_APPROVED}isReady(){return this.#e.getState()===h.READY}isStarting(){return this.#e.getState()===h.STARTING}getCurrentToState(){return this.#r}addEventListener(e,t){return this.#t.on(e,t)}subscribe(e){return this.#t.on(u.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 kn(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(h.STARTING,g.STARTED,()=>{this.emitRouterStart()}),e.on(h.READY,g.STOP,()=>{this.emitRouterStop()});let t=()=>{let e=this.#i;e!==void 0&&this.emitTransitionCancel(e,this.#a)};e.on(h.TRANSITION_STARTED,g.CANCEL,t),e.on(h.LEAVE_APPROVED,g.CANCEL,t),e.on(h.LEAVE_APPROVED,g.FAIL,()=>{this.#s()}),e.on(h.STARTING,g.FAIL,()=>{this.#s()}),e.on(h.READY,g.FAIL,()=>{this.#s()}),e.on(h.TRANSITION_STARTED,g.FAIL,()=>{this.#s()})}};const An=new G(o.ROUTER_ALREADY_STARTED),jn=new Set([`all`,`warn-error`,`error-only`]);function Mn(e){return typeof e==`string`&&jn.has(e)}function Nn(e){return typeof e==`string`?`"${e}"`:typeof e==`object`?JSON.stringify(e):String(e)}function Pn(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&&!Mn(t.level))throw TypeError(`Invalid logger level: ${Nn(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 Fn=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 t={compileFactory:this.createCompileFactory()};this.routeLifecycle.setDependencies(t),this.routeLifecycle.setValidatorGetter(()=>{try{return e.r(this.router).validator}catch{return null}})}wireRoutesDeps(){this.routes.setDependencies({addActivateGuard:(e,t)=>{this.routeLifecycle.addCanActivate(e,t,!0)},addDeactivateGuard:(e,t)=>{this.routeLifecycle.addCanDeactivate(e,t,!0)},makeState:(e,t,n,r)=>this.state.makeState(e,t,n,r),getState:()=>this.state.get(),areStatesEqual:(e,t,n)=>this.state.areStatesEqual(e,t,n),getDependency:e=>this.dependenciesStore.dependencies[e],forwardState:(t,n)=>{let r=e.r(this.router);return r.validator?.routes.validateStateBuilderArgs(t,n,`forwardState`),r.forwardState(t,n)}}),this.routes.setLifecycleNamespace(this.routeLifecycle)}wirePluginsDeps(){let t={addEventListener:(e,t)=>this.eventBus.addEventListener(e,t),canNavigate:()=>this.eventBus.canBeginTransition(),compileFactory:this.createCompileFactory()};this.plugins.setDependencies(t),this.plugins.setValidatorGetter(()=>{try{return e.r(this.router).validator}catch{return null}})}wireNavigationDeps(){this.navigation.setDependencies({getOptions:()=>this.options.get(),hasRoute:e=>this.routes.hasRoute(e),getState:()=>this.state.get(),setState:e=>{this.state.set(e)},buildNavigateState:(t,n)=>{let r=e.r(this.router);r.validator?.routes.validateStateBuilderArgs(t,n,`navigate`);let i=r.forwardState(t,n),a=i.name,o=ie(i.params),s=this.routes.getMetaForState(a);if(s===void 0)return;let c=r.buildPath(a,o);return this.state.makeState(a,o,c,s,!0)},resolveDefault:()=>{let t=this.options.get(),n=e.r(this.router),r=mt(t.defaultRoute,e=>this.dependenciesStore.dependencies[e]),i=mt(t.defaultParams,e=>this.dependenciesStore.dependencies[e]);return typeof t.defaultRoute==`function`&&n.validator?.options.validateResolvedDefaultRoute(r,n.routeGetStore()),{route:r,params:i}},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:(t,n)=>e.r(this.router).buildPath(t,n),getUrlParams:e=>this.routes.getUrlParams(e)})}createCompileFactory(){let{router:e,dependenciesStore:t}=this;return n=>n(e,e=>t.dependencies[e])}};function In(e){e.wireLimits(),e.wireRouteLifecycleDeps(),e.wireRoutesDeps(),e.wirePluginsDeps(),e.wireNavigationDeps(),e.wireLifecycleDeps(),e.wireStateDeps()}const Q=Object.freeze({});var Ln=class n{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;constructor(r=[],i={},o={}){i.logger&&Pn(i.logger)&&(t.logger.configure(i.logger),delete i.logger),gt.validateOptionsIsObject(i),y(o),r.length>0&&b(r),this.#e=new gt(i),this.#t=re(i.limits),this.#n=ae(o),this.#r=new bt,this.#i=new tn(r,Rn(this.#e.get())),this.#a=new Et,this.#o=new wt,this.#s=new En,this.#c=new On;let s=v(),c=new a({onListenerError:(e,n)=>{t.logger.error(`Router`,`Error in listener for ${e}:`,n)},onListenerWarn:(e,n)=>{t.logger.warn(`router.addEventListener`,`Event "${e}" has ${n} listeners — possible memory leak`)}});this.#l=new Z({routerFSM:s,emitter:c}),In(new Fn({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 l=new Map;e.i(this,{makeState:(e,t,n,r)=>this.#r.makeState(e,t,n,r),forwardState:e.n(`forwardState`,(e,t)=>this.#i.forwardState(e,t),l),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:e.n(`buildPath`,(e,t)=>this.#i.buildPath(e,t??f,this.#e.get()),l),emitTransitionError:e=>{this.#l.sendFailSafe(void 0,this.#r.get(),e)},start:e.t(`start`,e=>this.#c.start(e),l),navigateToState:(e,t)=>{let r=this.#s.navigateToState(e,t??Q);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:n.#d(r),r},interceptors:l,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,hydrationState:null}),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(n,r,i,a){return e.r(this).validator?.routes.validateIsActiveRouteArgs(n,r,i,a),e.r(this).validator?.routes.validateRouteName(n,`isActiveRoute`),n===``?(t.logger.warn(`real-router`,`isActiveRoute("") called with empty string. Root node is not considered a parent of any route.`),!1):this.#i.isActiveRoute(n,r,i,a)}buildPath(t,n){let r=e.r(this);return r.validator?.routes.validateBuildPathArgs(t),r.validator?.navigation.validateParams(n,`buildPath`),r.buildPath(t,ie(n))}getState(){return this.#r.get()}getPreviousState(){return this.#r.getPrevious()}areStatesEqual(t,n,r=!0){return e.r(this).validator?.state.validateAreStatesEqualArgs(t,n,r),this.#r.areStatesEqual(t,n,r)}shouldUpdateNode(t){return e.r(this).validator?.routes.validateShouldUpdateNodeArgs(t),tn.shouldUpdateNode(t)}isActive(){return this.#l.isActive()}start(t){if(!this.#l.canStart())return Promise.reject(An);e.r(this).validator?.navigation.validateStartArgs(t),this.#l.sendStart();let r;try{r=e.r(this).start(t)}catch(e){r=Promise.reject(e)}let i=r.catch(e=>{throw this.#l.isReady()?(this.#c.stop(),this.#l.sendStop()):this.#l.isStarting()&&this.#l.sendFail(void 0,void 0,e),e});return n.#d(i),i}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 t=e.r(this);for(let e of t.routerExtensions)for(let t of e.keys)delete this[t];t.routerExtensions.length=0,t.contextClaimRecords.clear(),this.#i.clearRoutes(),this.#a.clearAll(),this.#r.reset(),this.#n.dependencies=Object.create(null),this.#f()}canNavigateTo(t,n){let r=e.r(this);if(r.validator?.routes.validateRouteName(t,`canNavigateTo`),r.validator?.navigation.validateParams(n,`canNavigateTo`),!this.#i.hasRoute(t))return!1;let{name:i,params:a}=r.forwardState(t,n??{}),o=this.#r.makeState(i,a),s=this.#r.get(),{toDeactivate:c,toActivate:l}=W(o,s);return this.#a.canNavigateTo(c,l,o,s)}usePlugin(...t){let n=t.filter(Boolean);if(n.length===0)return()=>{};let r=e.r(this);r.validator?.plugins.validatePluginLimit(this.#o.count(),this.#t);for(let e of n)r.validator?.plugins.validateNoDuplicatePlugins(e,this.#o.getAll());return this.#o.use(...n)}subscribe(e){return Z.validateSubscribeListener(e),this.#l.subscribe(e)}subscribeLeave(e){return Z.validateSubscribeLeaveListener(e),this.#l.subscribeLeave(e)}isLeaveApproved(){return this.#l.isLeaveApproved()}navigate(t,r,i){let a=e.r(this);a.validator?.navigation.validateNavigateArgs(t),a.validator?.navigation.validateParams(r,`navigate`);let o=i??Q;a.validator?.navigation.validateNavigationOptions(o,`navigate`);let s=this.#s.navigate(t,r??f,o);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:n.#d(s),s}navigateToDefault(t){let r=e.r(this);r.validator?.navigation.validateNavigateToDefaultArgs(t);let i=t??Q;r.validator?.navigation.validateNavigationOptions(i,`navigateToDefault`);let a=this.#s.navigateToDefault(i);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:n.#d(a),a}navigateToNotFound(e){if(!this.#l.isActive())throw new G(o.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 G&&(e.code===o.SAME_STATES||e.code===o.TRANSITION_CANCELLED||e.code===o.ROUTER_NOT_STARTED||e.code===o.ROUTE_NOT_FOUND)||t.logger.error(`router.navigate`,`Unexpected navigation error`,e)};static#d(e){e.catch(n.#u)}#f(){this.navigate=$,this.navigateToDefault=$,this.navigateToNotFound=$,this.start=$,this.stop=$,this.usePlugin=$,this.subscribe=$,this.subscribeLeave=$,this.canNavigateTo=$}};function $(){throw new G(o.ROUTER_DISPOSED)}function Rn(e){return{strictTrailingSlash:e.trailingSlash===`strict`,strictQueryParams:e.queryParamsMode===`strict`,urlParamsEncoding:e.urlParamsEncoding,queryParams:e.queryParams}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return jt}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Pt}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Rt}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Mt}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ln}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return ut}});
6
- //# sourceMappingURL=Router-fHKWlCpv.js.map