@real-router/core 0.54.5 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Router-C7eE1kIK.js +6 -0
- package/dist/cjs/Router-C7eE1kIK.js.map +1 -0
- package/dist/cjs/{Router-CJihdrWA.d.ts → Router-Dg-zk8AS.d.ts} +1 -1
- package/dist/cjs/{Router-CJihdrWA.d.ts.map → Router-Dg-zk8AS.d.ts.map} +1 -1
- package/dist/cjs/{RouterError-Bm9YnZ6e.d.ts → RouterError-WhCzIWuc.d.ts} +1 -1
- package/dist/cjs/{RouterError-Bm9YnZ6e.d.ts.map → RouterError-WhCzIWuc.d.ts.map} +1 -1
- package/dist/cjs/api.d.ts +2 -2
- package/dist/cjs/api.d.ts.map +1 -1
- package/dist/cjs/api.js +1 -1
- package/dist/cjs/api.js.map +1 -1
- package/dist/cjs/{cloneRouter-D5bMudso.js → cloneRouter-C9Rth_8U.js} +2 -2
- package/dist/cjs/{cloneRouter-D5bMudso.js.map → cloneRouter-C9Rth_8U.js.map} +1 -1
- package/dist/cjs/{index-EwbhzRQw.d.ts → index-C-i6vx5Y.d.ts} +1 -1
- package/dist/cjs/{index-EwbhzRQw.d.ts.map → index-C-i6vx5Y.d.ts.map} +1 -1
- package/dist/cjs/{index-8oPDJBQc.d.ts → index-K1U_fqfJ.d.ts} +2 -2
- package/dist/cjs/{index-8oPDJBQc.d.ts.map → index-K1U_fqfJ.d.ts.map} +1 -1
- package/dist/cjs/index.d.ts +3 -3
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/{internals-CM6oaz9n.js → internals-CWMOL1B8.js} +2 -2
- package/dist/cjs/{internals-CM6oaz9n.js.map → internals-CWMOL1B8.js.map} +1 -1
- package/dist/cjs/utils.d.ts +1 -1
- package/dist/cjs/utils.js +1 -1
- package/dist/cjs/validation.d.ts +4 -4
- package/dist/cjs/validation.js +1 -1
- package/dist/esm/{Router-BmhiDQUJ.d.mts → Router-Dg-zk8AS.d.mts} +1 -1
- package/dist/esm/{Router-BmhiDQUJ.d.mts.map → Router-Dg-zk8AS.d.mts.map} +1 -1
- package/dist/esm/Router-DiZbYMLx.mjs +6 -0
- package/dist/esm/Router-DiZbYMLx.mjs.map +1 -0
- package/dist/esm/{RouterError-hhfSVGtY.d.mts → RouterError-WhCzIWuc.d.mts} +1 -1
- package/dist/esm/{RouterError-hhfSVGtY.d.mts.map → RouterError-WhCzIWuc.d.mts.map} +1 -1
- package/dist/esm/api.d.mts +2 -2
- package/dist/esm/api.d.mts.map +1 -1
- package/dist/esm/api.mjs +1 -1
- package/dist/esm/api.mjs.map +1 -1
- package/dist/esm/cloneRouter-BYNiwchg.mjs +2 -0
- package/dist/esm/{cloneRouter-DM59kihh.mjs.map → cloneRouter-BYNiwchg.mjs.map} +1 -1
- package/dist/esm/{index-DNjaY7KH.d.mts → index-C-i6vx5Y.d.mts} +1 -1
- package/dist/esm/{index-DNjaY7KH.d.mts.map → index-C-i6vx5Y.d.mts.map} +1 -1
- package/dist/esm/{index-r_JTvSBH.d.mts → index-DKzxav48.d.mts} +2 -2
- package/dist/esm/{index-r_JTvSBH.d.mts.map → index-DKzxav48.d.mts.map} +1 -1
- package/dist/esm/index.d.mts +3 -3
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/{internals-C59msvHY.mjs → internals-DT4mneSz.mjs} +1 -1
- package/dist/esm/{internals-C59msvHY.mjs.map → internals-DT4mneSz.mjs.map} +1 -1
- package/dist/esm/utils.d.mts +1 -1
- package/dist/esm/utils.mjs +1 -1
- package/dist/esm/validation.d.mts +4 -4
- package/dist/esm/validation.mjs +1 -1
- package/package.json +3 -3
- package/src/api/getRoutesApi.ts +47 -88
- package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +68 -3
- package/src/namespaces/NavigationNamespace/types.ts +1 -1
- package/src/namespaces/RoutesNamespace/routesStore.ts +272 -52
- package/dist/cjs/Router-BzV5P1lA.js +0 -6
- package/dist/cjs/Router-BzV5P1lA.js.map +0 -1
- package/dist/esm/Router-_BDnheMY.mjs +0 -6
- package/dist/esm/Router-_BDnheMY.mjs.map +0 -1
- package/dist/esm/cloneRouter-DM59kihh.mjs +0 -2
|
@@ -132,6 +132,32 @@ export function refreshForwardMap(config: RouteConfig): Record<string, string> {
|
|
|
132
132
|
// Route handler registration
|
|
133
133
|
// =============================================================================
|
|
134
134
|
|
|
135
|
+
/**
|
|
136
|
+
* Throws if `forwardTo` is an async function (native or transpiled). Async
|
|
137
|
+
* forwardTo callbacks break the synchronous matchPath/buildPath contract.
|
|
138
|
+
* Runs inside `registerForwardTo`, which the prepare-phase build invokes via
|
|
139
|
+
* `registerAllRouteHandlers` — so the check fires before any store mutation.
|
|
140
|
+
*/
|
|
141
|
+
function assertForwardToNotAsync(forwardTo: unknown, fullName: string): void {
|
|
142
|
+
if (typeof forwardTo !== "function") {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const isNativeAsync =
|
|
147
|
+
(forwardTo as { constructor: { name: string } }).constructor.name ===
|
|
148
|
+
"AsyncFunction";
|
|
149
|
+
const isTranspiledAsync = (forwardTo as { toString: () => string })
|
|
150
|
+
.toString()
|
|
151
|
+
.includes("__awaiter");
|
|
152
|
+
|
|
153
|
+
if (isNativeAsync || isTranspiledAsync) {
|
|
154
|
+
throw new TypeError(
|
|
155
|
+
`forwardTo callback cannot be async for route "${fullName}". ` +
|
|
156
|
+
`Async functions break matchPath/buildPath.`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
135
161
|
function registerForwardTo<Dependencies extends DefaultDependencies>(
|
|
136
162
|
route: Route<Dependencies>,
|
|
137
163
|
fullName: string,
|
|
@@ -163,19 +189,7 @@ function registerForwardTo<Dependencies extends DefaultDependencies>(
|
|
|
163
189
|
);
|
|
164
190
|
}
|
|
165
191
|
|
|
166
|
-
|
|
167
|
-
const isNativeAsync =
|
|
168
|
-
(route.forwardTo as { constructor: { name: string } }).constructor
|
|
169
|
-
.name === "AsyncFunction";
|
|
170
|
-
const isTranspiledAsync = route.forwardTo.toString().includes("__awaiter");
|
|
171
|
-
|
|
172
|
-
if (isNativeAsync || isTranspiledAsync) {
|
|
173
|
-
throw new TypeError(
|
|
174
|
-
`forwardTo callback cannot be async for route "${fullName}". ` +
|
|
175
|
-
`Async functions break matchPath/buildPath.`,
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
192
|
+
assertForwardToNotAsync(route.forwardTo, fullName);
|
|
179
193
|
|
|
180
194
|
// forwardTo is guaranteed to exist at this point
|
|
181
195
|
if (typeof route.forwardTo === "string") {
|
|
@@ -193,7 +207,6 @@ function registerSingleRouteHandlers<Dependencies extends DefaultDependencies>(
|
|
|
193
207
|
routeCustomFields: Record<string, Record<string, unknown>>,
|
|
194
208
|
pendingCanActivate: Map<string, GuardFnFactory<Dependencies>>,
|
|
195
209
|
pendingCanDeactivate: Map<string, GuardFnFactory<Dependencies>>,
|
|
196
|
-
depsStore: RoutesDependencies<Dependencies> | undefined,
|
|
197
210
|
): void {
|
|
198
211
|
const standardKeys = new Set([
|
|
199
212
|
"name",
|
|
@@ -214,20 +227,15 @@ function registerSingleRouteHandlers<Dependencies extends DefaultDependencies>(
|
|
|
214
227
|
routeCustomFields[fullName] = customFields;
|
|
215
228
|
}
|
|
216
229
|
|
|
230
|
+
// Guards are collected here and registered into the lifecycle later — by
|
|
231
|
+
// `adoptRouteArtifacts` (add/replace) or `setDependencies` (initial routes) —
|
|
232
|
+
// so the build stays a pure, side-effect-free preparation step.
|
|
217
233
|
if (route.canActivate) {
|
|
218
|
-
|
|
219
|
-
depsStore.addActivateGuard(fullName, route.canActivate);
|
|
220
|
-
} else {
|
|
221
|
-
pendingCanActivate.set(fullName, route.canActivate);
|
|
222
|
-
}
|
|
234
|
+
pendingCanActivate.set(fullName, route.canActivate);
|
|
223
235
|
}
|
|
224
236
|
|
|
225
237
|
if (route.canDeactivate) {
|
|
226
|
-
|
|
227
|
-
depsStore.addDeactivateGuard(fullName, route.canDeactivate);
|
|
228
|
-
} else {
|
|
229
|
-
pendingCanDeactivate.set(fullName, route.canDeactivate);
|
|
230
|
-
}
|
|
238
|
+
pendingCanDeactivate.set(fullName, route.canDeactivate);
|
|
231
239
|
}
|
|
232
240
|
|
|
233
241
|
if (route.forwardTo) {
|
|
@@ -249,15 +257,12 @@ function registerSingleRouteHandlers<Dependencies extends DefaultDependencies>(
|
|
|
249
257
|
}
|
|
250
258
|
}
|
|
251
259
|
|
|
252
|
-
|
|
253
|
-
Dependencies extends DefaultDependencies,
|
|
254
|
-
>(
|
|
260
|
+
function registerAllRouteHandlers<Dependencies extends DefaultDependencies>(
|
|
255
261
|
routes: readonly Route<Dependencies>[],
|
|
256
262
|
config: RouteConfig,
|
|
257
263
|
routeCustomFields: Record<string, Record<string, unknown>>,
|
|
258
264
|
pendingCanActivate: Map<string, GuardFnFactory<Dependencies>>,
|
|
259
265
|
pendingCanDeactivate: Map<string, GuardFnFactory<Dependencies>>,
|
|
260
|
-
depsStore: RoutesDependencies<Dependencies> | undefined,
|
|
261
266
|
parentName = "",
|
|
262
267
|
): void {
|
|
263
268
|
for (const route of routes) {
|
|
@@ -270,7 +275,6 @@ export function registerAllRouteHandlers<
|
|
|
270
275
|
routeCustomFields,
|
|
271
276
|
pendingCanActivate,
|
|
272
277
|
pendingCanDeactivate,
|
|
273
|
-
depsStore,
|
|
274
278
|
);
|
|
275
279
|
|
|
276
280
|
if (route.children) {
|
|
@@ -280,7 +284,6 @@ export function registerAllRouteHandlers<
|
|
|
280
284
|
routeCustomFields,
|
|
281
285
|
pendingCanActivate,
|
|
282
286
|
pendingCanDeactivate,
|
|
283
|
-
depsStore,
|
|
284
287
|
fullName,
|
|
285
288
|
);
|
|
286
289
|
}
|
|
@@ -288,55 +291,272 @@ export function registerAllRouteHandlers<
|
|
|
288
291
|
}
|
|
289
292
|
|
|
290
293
|
// =============================================================================
|
|
291
|
-
//
|
|
294
|
+
// Prepare-then-commit (issue #698)
|
|
295
|
+
//
|
|
296
|
+
// add()/replace() build the complete new store state into LOCAL structures, and
|
|
297
|
+
// only swap it into the store once every core-level error has surfaced from the
|
|
298
|
+
// build itself (async/circular forwardTo throw in registerAllRouteHandlers /
|
|
299
|
+
// refreshForwardMap; invalid path constraint throws in rebuildTree). The store
|
|
300
|
+
// is mutated only by `adoptRouteArtifacts`, which cannot throw — so a rejected
|
|
301
|
+
// build leaves the existing routes untouched. The two silent-corruption cases
|
|
302
|
+
// route-tree never throws on (duplicate name vs an existing route, missing
|
|
303
|
+
// parent) are caught up front by `assertAddable`.
|
|
292
304
|
// =============================================================================
|
|
293
305
|
|
|
294
|
-
|
|
306
|
+
/**
|
|
307
|
+
* The fully-built, ready-to-swap result of preparing a route mutation. Holds
|
|
308
|
+
* everything `adoptRouteArtifacts` assigns into the store.
|
|
309
|
+
*/
|
|
310
|
+
interface RouteArtifacts<
|
|
295
311
|
Dependencies extends DefaultDependencies = DefaultDependencies,
|
|
296
|
-
>
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
const pendingCanActivate = new Map<string, GuardFnFactory<Dependencies>>();
|
|
307
|
-
const pendingCanDeactivate = new Map<string, GuardFnFactory<Dependencies>>();
|
|
312
|
+
> {
|
|
313
|
+
readonly definitions: RouteDefinition[];
|
|
314
|
+
readonly config: RouteConfig;
|
|
315
|
+
readonly routeCustomFields: Record<string, Record<string, unknown>>;
|
|
316
|
+
readonly pendingCanActivate: Map<string, GuardFnFactory<Dependencies>>;
|
|
317
|
+
readonly pendingCanDeactivate: Map<string, GuardFnFactory<Dependencies>>;
|
|
318
|
+
readonly tree: RouteTree;
|
|
319
|
+
readonly matcher: Matcher;
|
|
320
|
+
readonly resolvedForwardMap: Record<string, string>;
|
|
321
|
+
}
|
|
308
322
|
|
|
323
|
+
/** Null-proto shallow clone of a RouteConfig (preserves the 5 maps' contents). */
|
|
324
|
+
function cloneConfig(config: RouteConfig): RouteConfig {
|
|
325
|
+
const clone = createEmptyConfig();
|
|
326
|
+
|
|
327
|
+
Object.assign(clone.decoders, config.decoders);
|
|
328
|
+
Object.assign(clone.encoders, config.encoders);
|
|
329
|
+
Object.assign(clone.defaultParams, config.defaultParams);
|
|
330
|
+
Object.assign(clone.forwardMap, config.forwardMap);
|
|
331
|
+
Object.assign(clone.forwardFnMap, config.forwardFnMap);
|
|
332
|
+
|
|
333
|
+
return clone;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Returns a new definitions array with `added` inserted, without mutating the
|
|
338
|
+
* input. For a top-level add the existing definitions are shallow-copied and
|
|
339
|
+
* `added` appended. For a parented add the spine down to the parent is cloned
|
|
340
|
+
* (siblings/other branches are shared by reference) and `added` appended to the
|
|
341
|
+
* parent's children. Caller guarantees the parent path exists (see assertAddable).
|
|
342
|
+
*/
|
|
343
|
+
function insertAddedDefinitions(
|
|
344
|
+
definitions: readonly RouteDefinition[],
|
|
345
|
+
added: RouteDefinition[],
|
|
346
|
+
parentSegments: readonly string[],
|
|
347
|
+
): RouteDefinition[] {
|
|
348
|
+
if (parentSegments.length === 0) {
|
|
349
|
+
return [...definitions, ...added];
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const [head, ...rest] = parentSegments;
|
|
353
|
+
|
|
354
|
+
return definitions.map((def) => {
|
|
355
|
+
if (def.name !== head) {
|
|
356
|
+
return def;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const children = def.children ?? [];
|
|
360
|
+
|
|
361
|
+
return {
|
|
362
|
+
...def,
|
|
363
|
+
children:
|
|
364
|
+
rest.length === 0
|
|
365
|
+
? [...children, ...added]
|
|
366
|
+
: insertAddedDefinitions(children, added, rest),
|
|
367
|
+
};
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/** Depth-first walk yielding each route's full dotted name (no side effects). */
|
|
372
|
+
function walkRouteNames<Dependencies extends DefaultDependencies>(
|
|
373
|
+
routes: readonly Route<Dependencies>[],
|
|
374
|
+
parentName: string,
|
|
375
|
+
onName: (fullName: string) => void,
|
|
376
|
+
): void {
|
|
309
377
|
for (const route of routes) {
|
|
310
|
-
|
|
378
|
+
const fullName = parentName ? `${parentName}.${route.name}` : route.name;
|
|
379
|
+
|
|
380
|
+
onName(fullName);
|
|
381
|
+
|
|
382
|
+
if (route.children) {
|
|
383
|
+
walkRouteNames(route.children, fullName, onName);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Up-front guard for `add` against the two corruptions route-tree stays silent
|
|
390
|
+
* on: a missing `parent`, and a name that collides with an EXISTING route
|
|
391
|
+
* (which would otherwise be silently overwritten). Throws before any build.
|
|
392
|
+
*/
|
|
393
|
+
export function assertAddable<Dependencies extends DefaultDependencies>(
|
|
394
|
+
store: RoutesStore<Dependencies>,
|
|
395
|
+
routes: readonly Route<Dependencies>[],
|
|
396
|
+
parentName: string | undefined,
|
|
397
|
+
): void {
|
|
398
|
+
if (parentName !== undefined && !store.matcher.hasRoute(parentName)) {
|
|
399
|
+
throw new Error(
|
|
400
|
+
`[router.addRoute] Parent route "${parentName}" does not exist`,
|
|
401
|
+
);
|
|
311
402
|
}
|
|
312
403
|
|
|
313
|
-
|
|
404
|
+
walkRouteNames(routes, parentName ?? "", (fullName) => {
|
|
405
|
+
if (store.matcher.hasRoute(fullName)) {
|
|
406
|
+
throw new Error(`[router.addRoute] Route "${fullName}" already exists`);
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Builds RouteArtifacts from a final definitions array and the routes whose
|
|
413
|
+
* handlers (config + guards) populate `config`/`routeCustomFields`. Guards are
|
|
414
|
+
* collected into the returned pending maps (depsStore is intentionally omitted
|
|
415
|
+
* so nothing compiles or touches the lifecycle here). THROWS on async/circular
|
|
416
|
+
* forwardTo and invalid path constraint — before the caller mutates the store.
|
|
417
|
+
*/
|
|
418
|
+
function buildArtifacts<Dependencies extends DefaultDependencies>(
|
|
419
|
+
definitions: RouteDefinition[],
|
|
420
|
+
routesForHandlers: readonly Route<Dependencies>[],
|
|
421
|
+
config: RouteConfig,
|
|
422
|
+
routeCustomFields: Record<string, Record<string, unknown>>,
|
|
423
|
+
handlerParentName: string,
|
|
424
|
+
rootPath: string,
|
|
425
|
+
matcherOptions: CreateMatcherOptions | undefined,
|
|
426
|
+
): RouteArtifacts<Dependencies> {
|
|
427
|
+
const pendingCanActivate = new Map<string, GuardFnFactory<Dependencies>>();
|
|
428
|
+
const pendingCanDeactivate = new Map<string, GuardFnFactory<Dependencies>>();
|
|
314
429
|
|
|
315
430
|
registerAllRouteHandlers(
|
|
316
|
-
|
|
431
|
+
routesForHandlers,
|
|
317
432
|
config,
|
|
318
433
|
routeCustomFields,
|
|
319
434
|
pendingCanActivate,
|
|
320
435
|
pendingCanDeactivate,
|
|
321
|
-
|
|
322
|
-
"",
|
|
436
|
+
handlerParentName,
|
|
323
437
|
);
|
|
324
438
|
|
|
325
439
|
const resolvedForwardMap = refreshForwardMap(config);
|
|
440
|
+
const { tree, matcher } = rebuildTree(definitions, rootPath, matcherOptions);
|
|
326
441
|
|
|
327
442
|
return {
|
|
328
443
|
definitions,
|
|
329
444
|
config,
|
|
445
|
+
routeCustomFields,
|
|
446
|
+
pendingCanActivate,
|
|
447
|
+
pendingCanDeactivate,
|
|
330
448
|
tree,
|
|
331
449
|
matcher,
|
|
332
450
|
resolvedForwardMap,
|
|
333
|
-
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/** Builds the merged artifacts for an incremental `add` (existing ∪ new). */
|
|
455
|
+
export function buildAddArtifacts<Dependencies extends DefaultDependencies>(
|
|
456
|
+
store: RoutesStore<Dependencies>,
|
|
457
|
+
routes: readonly Route<Dependencies>[],
|
|
458
|
+
parentName: string | undefined,
|
|
459
|
+
): RouteArtifacts<Dependencies> {
|
|
460
|
+
const definitions = insertAddedDefinitions(
|
|
461
|
+
store.definitions,
|
|
462
|
+
routes.map((route) => sanitizeRoute(route)),
|
|
463
|
+
parentName === undefined ? [] : parentName.split("."),
|
|
464
|
+
);
|
|
465
|
+
|
|
466
|
+
return buildArtifacts(
|
|
467
|
+
definitions,
|
|
468
|
+
routes,
|
|
469
|
+
cloneConfig(store.config),
|
|
470
|
+
Object.assign(
|
|
471
|
+
Object.create(null) as Record<string, Record<string, unknown>>,
|
|
472
|
+
store.routeCustomFields,
|
|
473
|
+
),
|
|
474
|
+
parentName ?? "",
|
|
475
|
+
store.rootPath,
|
|
476
|
+
store.matcherOptions,
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/** Builds the fresh artifacts for a full `replace` (standalone new set). */
|
|
481
|
+
export function buildReplaceArtifacts<Dependencies extends DefaultDependencies>(
|
|
482
|
+
routes: readonly Route<Dependencies>[],
|
|
483
|
+
rootPath: string,
|
|
484
|
+
matcherOptions: CreateMatcherOptions | undefined,
|
|
485
|
+
): RouteArtifacts<Dependencies> {
|
|
486
|
+
return buildArtifacts(
|
|
487
|
+
routes.map((route) => sanitizeRoute(route)),
|
|
488
|
+
routes,
|
|
489
|
+
createEmptyConfig(),
|
|
490
|
+
Object.create(null) as Record<string, Record<string, unknown>>,
|
|
491
|
+
"",
|
|
492
|
+
rootPath,
|
|
493
|
+
matcherOptions,
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* Commits prepared artifacts into the store in place. Pure assignment — never
|
|
499
|
+
* throws — so it is the single atomic swap point of the prepare-then-commit
|
|
500
|
+
* pipeline. Guard registration is deferred to here (the build collected guards
|
|
501
|
+
* without compiling); `depsStore` is always set on a wired router, which is the
|
|
502
|
+
* only path that reaches `add`/`replace`.
|
|
503
|
+
*/
|
|
504
|
+
export function adoptRouteArtifacts<Dependencies extends DefaultDependencies>(
|
|
505
|
+
store: RoutesStore<Dependencies>,
|
|
506
|
+
artifacts: RouteArtifacts<Dependencies>,
|
|
507
|
+
): void {
|
|
508
|
+
store.definitions.length = 0;
|
|
509
|
+
|
|
510
|
+
for (const def of artifacts.definitions) {
|
|
511
|
+
store.definitions.push(def);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
Object.assign(store.config, artifacts.config);
|
|
515
|
+
store.routeCustomFields = artifacts.routeCustomFields;
|
|
516
|
+
store.tree = artifacts.tree;
|
|
517
|
+
store.matcher = artifacts.matcher;
|
|
518
|
+
store.resolvedForwardMap = artifacts.resolvedForwardMap;
|
|
519
|
+
|
|
520
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- depsStore is set once the router is wired; add/replace only run on a wired router (constructor-time registration uses createRoutesStore)
|
|
521
|
+
const deps = store.depsStore!;
|
|
522
|
+
|
|
523
|
+
for (const [name, handler] of artifacts.pendingCanActivate) {
|
|
524
|
+
deps.addActivateGuard(name, handler);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
for (const [name, handler] of artifacts.pendingCanDeactivate) {
|
|
528
|
+
deps.addDeactivateGuard(name, handler);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// =============================================================================
|
|
533
|
+
// Factory
|
|
534
|
+
// =============================================================================
|
|
535
|
+
|
|
536
|
+
export function createRoutesStore<
|
|
537
|
+
Dependencies extends DefaultDependencies = DefaultDependencies,
|
|
538
|
+
>(
|
|
539
|
+
routes: Route<Dependencies>[],
|
|
540
|
+
matcherOptions?: CreateMatcherOptions,
|
|
541
|
+
): RoutesStore<Dependencies> {
|
|
542
|
+
// Initial routes are a standalone set at rootPath "" — same build the
|
|
543
|
+
// prepare-then-commit `replace` path uses. Guards land in the pending maps
|
|
544
|
+
// (depsStore is wired later via setDependencies, which flushes them).
|
|
545
|
+
const artifacts = buildReplaceArtifacts(routes, "", matcherOptions);
|
|
546
|
+
|
|
547
|
+
return {
|
|
548
|
+
definitions: artifacts.definitions,
|
|
549
|
+
config: artifacts.config,
|
|
550
|
+
tree: artifacts.tree,
|
|
551
|
+
matcher: artifacts.matcher,
|
|
552
|
+
resolvedForwardMap: artifacts.resolvedForwardMap,
|
|
553
|
+
routeCustomFields: artifacts.routeCustomFields,
|
|
334
554
|
rootPath: "",
|
|
335
555
|
matcherOptions,
|
|
336
556
|
depsStore: undefined,
|
|
337
557
|
lifecycleNamespace: undefined,
|
|
338
|
-
pendingCanActivate,
|
|
339
|
-
pendingCanDeactivate,
|
|
558
|
+
pendingCanActivate: artifacts.pendingCanActivate,
|
|
559
|
+
pendingCanDeactivate: artifacts.pendingCanDeactivate,
|
|
340
560
|
treeOperations: {
|
|
341
561
|
commitTreeChanges,
|
|
342
562
|
resetStore,
|
|
@@ -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=new Map;#a=new Map;#o=[this.#i,this.#a];#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){let t=e===`activate`?this.#e:this.#n,n=e===`activate`?this.#t:this.#r;if(t.size===0)return n.size;if(n.size===0)return t.size;let r=new Set(t.keys());for(let e of n.keys())r.add(e);return r.size}addCanActivate(e,t,n=!1){this.#d(`activate`,e,t,n,`canActivate`)}addCanDeactivate(e,t,n=!1){this.#d(`deactivate`,e,t,n,`canDeactivate`)}clearCanActivate(e,t){let n=!1;t!==`external`&&(n=this.#e.delete(e)||n),t!==`definition`&&(n=this.#t.delete(e)||n),n&&this.#f(`activate`,e)}clearCanDeactivate(e,t){let n=!1;t!==`external`&&(n=this.#n.delete(e)||n),t!==`definition`&&(n=this.#r.delete(e)||n),n&&this.#f(`deactivate`,e)}clearAll(){this.#e.clear(),this.#t.clear(),this.#n.clear(),this.#r.clear(),this.#a.clear(),this.#i.clear()}clearDefinitionGuards(){for(let e of this.#e.keys())this.#t.has(e)||this.#a.delete(e);for(let e of this.#n.keys())this.#r.has(e)||this.#i.delete(e);this.#e.clear(),this.#n.clear()}getFactories(){let e={},t={};for(let[t,n]of this.#n)e[t]=n;for(let[t,n]of this.#r)e[t]=n;for(let[e,n]of this.#e)t[e]=n;for(let[e,n]of this.#t)t[e]=n;return[e,t]}getFactoriesByOrigin(){let e={},t={},n={},r={};for(let[t,n]of this.#n)e[t]=n;for(let[e,n]of this.#e)t[e]=n;for(let[e,t]of this.#r)n[e]=t;for(let[e,t]of this.#t)r[e]=t;return{definition:[e,t],external:[n,r]}}getFunctions(){return this.#o}canNavigateTo(e,t,n,r){for(let t of e)if(!this.#m(this.#i,t,n,r,`canNavigateTo`))return!1;for(let e of t)if(!this.#m(this.#a,e,n,r,`canNavigateTo`))return!1;return!0}#d(e,t,n,r,i){let a=this.#p(e),o=e===`activate`?this.#a:this.#i,s=r?a.definition:a.external,c=r?a.external:a.definition;s.has(t)||c.has(t)?this.#u?.()?.lifecycle.warnOverwrite(t,e,i):this.#u?.()?.lifecycle.validateCountThresholds(this.getHandlerCount(e)+1,i);let l=typeof n==`boolean`?Tt(n):n;s.set(t,l),this.#s.add(t);try{let e=this.#c.compileFactory(l);if(typeof e!=`function`)throw TypeError(`[router.${i}] Factory must return a function, got ${typeof e}`);o.set(t,e)}catch(n){throw s.delete(t),c.has(t)?this.#f(e,t):o.delete(t),n}finally{this.#s.delete(t)}}#f(e,t){let n=this.#p(e),r=e===`activate`?this.#a:this.#i,i=n.external.get(t)??n.definition.get(t);if(!i){r.delete(t);return}try{let e=this.#c.compileFactory(i);if(typeof e!=`function`){r.delete(t);return}r.set(t,e)}catch{r.delete(t)}}#p(e){return e===`activate`?{definition:this.#e,external:this.#t}:{definition:this.#n,external:this.#r}}#m(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,n){return new Promise((r,i)=>{let a=()=>{i(X(n.reason))};if(n.aborted){a();return}n.addEventListener(`abort`,a,{once:!0}),Promise.allSettled(e).then(e=>{if(n.removeEventListener(`abort`,a),n.aborted)return;if(t!==void 0){i(X(t));return}let o=e.find(e=>e.status===`rejected`);if(o!==void 0){i(X(o.reason));return}r()})})}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,n)}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-BzV5P1lA.js.map
|