@real-router/core 0.50.1 → 0.51.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-CmI2Uw9u.js +6 -0
- package/dist/cjs/Router-CmI2Uw9u.js.map +1 -0
- package/dist/cjs/Router-DrBkBdZ5.d.ts.map +1 -1
- package/dist/{esm/RouterValidator-BLtjhvRo.d.mts → cjs/RouterValidator-DLy_W2du.d.ts} +2 -1
- package/dist/cjs/{RouterValidator-BL1Uq6Rq.d.ts.map → RouterValidator-DLy_W2du.d.ts.map} +1 -1
- package/dist/cjs/api.d.ts.map +1 -1
- package/dist/cjs/api.js +1 -1
- package/dist/cjs/getPluginApi-CUcFDzuA.js +2 -0
- package/dist/cjs/getPluginApi-CUcFDzuA.js.map +1 -0
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/internals-na15rxo_.js.map +1 -1
- package/dist/cjs/utils.d.ts +49 -2
- package/dist/cjs/utils.d.ts.map +1 -1
- package/dist/cjs/utils.js +1 -1
- package/dist/cjs/utils.js.map +1 -1
- package/dist/cjs/validation.d.ts +9 -2
- package/dist/cjs/validation.d.ts.map +1 -1
- package/dist/esm/Router-BeXr2zW4.d.mts.map +1 -1
- package/dist/esm/Router-MsNZv4zY.mjs +6 -0
- package/dist/esm/Router-MsNZv4zY.mjs.map +1 -0
- package/dist/{cjs/RouterValidator-BL1Uq6Rq.d.ts → esm/RouterValidator-C-PvV00i.d.mts} +2 -1
- package/dist/esm/{RouterValidator-BLtjhvRo.d.mts.map → RouterValidator-C-PvV00i.d.mts.map} +1 -1
- package/dist/esm/api.d.mts.map +1 -1
- package/dist/esm/api.mjs +1 -1
- package/dist/esm/getPluginApi-CsTfDB-O.mjs +2 -0
- package/dist/esm/getPluginApi-CsTfDB-O.mjs.map +1 -0
- package/dist/esm/index.d.mts +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/internals-CCymabFj.mjs.map +1 -1
- package/dist/esm/utils.d.mts +49 -2
- package/dist/esm/utils.d.mts.map +1 -1
- package/dist/esm/utils.mjs +1 -1
- package/dist/esm/utils.mjs.map +1 -1
- package/dist/esm/validation.d.mts +9 -2
- package/dist/esm/validation.d.mts.map +1 -1
- package/package.json +3 -3
- package/src/Router.ts +20 -0
- package/src/api/getPluginApi.ts +33 -2
- package/src/internals.ts +12 -0
- package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +164 -94
- package/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts +5 -5
- package/src/namespaces/RouterLifecycleNamespace/types.ts +9 -5
- package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +34 -5
- package/src/namespaces/RoutesNamespace/helpers.ts +42 -0
- package/src/types/RouterValidator.ts +1 -0
- package/src/utils/hydrateRouter.ts +33 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/serializeRouterState.ts +31 -0
- package/src/wiring/RouterWiringBuilder.ts +2 -2
- package/dist/cjs/Router-n8xC-aPB.js +0 -6
- package/dist/cjs/Router-n8xC-aPB.js.map +0 -1
- package/dist/cjs/getPluginApi-BBcZZXA5.js +0 -2
- package/dist/cjs/getPluginApi-BBcZZXA5.js.map +0 -1
- package/dist/esm/Router-CCqj9JRq.mjs +0 -6
- package/dist/esm/Router-CCqj9JRq.mjs.map +0 -1
- package/dist/esm/getPluginApi-DasnID2W.mjs +0 -2
- package/dist/esm/getPluginApi-DasnID2W.mjs.map +0 -1
|
@@ -98,24 +98,176 @@ export class NavigationNamespace {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
let toState: State | undefined;
|
|
101
|
-
let fromState: State | undefined;
|
|
102
|
-
let transitionStarted = false;
|
|
103
|
-
let controller: AbortController | null = null;
|
|
104
101
|
|
|
105
102
|
try {
|
|
106
103
|
toState = deps.buildNavigateState(name, params);
|
|
104
|
+
} catch (error) {
|
|
105
|
+
/* v8 ignore next 3 -- @preserve: reachable only via validator-driven
|
|
106
|
+
throws from buildNavigateState (validateStateBuilderArgs) — covered
|
|
107
|
+
in @real-router/validation-plugin's suite, not in core. */
|
|
108
|
+
return Promise.reject(error as Error);
|
|
109
|
+
}
|
|
107
110
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
111
|
+
if (!toState) {
|
|
112
|
+
deps.emitTransitionError(
|
|
113
|
+
undefined,
|
|
114
|
+
deps.getState(),
|
|
115
|
+
CACHED_ROUTE_NOT_FOUND_ERROR,
|
|
116
|
+
);
|
|
117
|
+
this.lastSyncRejected = true;
|
|
115
118
|
|
|
116
|
-
|
|
117
|
-
|
|
119
|
+
return CACHED_ROUTE_NOT_FOUND_REJECTION;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return this.#executeNavigation(toState, opts);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Navigate to a fully-built `State` directly, skipping `buildNavigateState`
|
|
127
|
+
* (forwardState + buildPath + meta lookup). Used by URL plugins after they
|
|
128
|
+
* have already produced a `State` from a browser-initiated event via
|
|
129
|
+
* `api.matchPath(url)` — see issue #525.
|
|
130
|
+
*
|
|
131
|
+
* Semantics vs. `navigate(name, params, opts)`:
|
|
132
|
+
* - `forwardState` is NOT re-applied. matchPath already runs it; reapplying
|
|
133
|
+
* is redundant in the idempotent case and can race in the dynamic case.
|
|
134
|
+
* - `buildPath` is NOT re-run. The caller's `state.path` is used as-is —
|
|
135
|
+
* so `trailingSlash:"preserve"` matchedState paths flow through unchanged
|
|
136
|
+
* (closes #525 Q2). `buildPath` interceptors do NOT run; the URL the
|
|
137
|
+
* user navigated to is the source of truth for this code path.
|
|
138
|
+
* - All other pipeline steps run unchanged: SAME_STATES check, FSM
|
|
139
|
+
* transition, guards, `subscribeLeave`, `completeTransition`,
|
|
140
|
+
* plugin lifecycle hooks.
|
|
141
|
+
*/
|
|
142
|
+
navigateToState(state: State, opts: NavigationOptions): Promise<State> {
|
|
143
|
+
this.lastSyncResolved = false;
|
|
144
|
+
const deps = this.#deps;
|
|
145
|
+
|
|
146
|
+
if (!deps.canNavigate()) {
|
|
147
|
+
this.lastSyncRejected = true;
|
|
118
148
|
|
|
149
|
+
return CACHED_NOT_STARTED_REJECTION;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Reject states whose route no longer exists (e.g. the route tree was
|
|
153
|
+
// mutated between matchPath and navigateToState). UNKNOWN_ROUTE is
|
|
154
|
+
// structurally legal — it is the navigateToNotFound output shape.
|
|
155
|
+
if (state.name !== constants.UNKNOWN_ROUTE && !deps.hasRoute(state.name)) {
|
|
156
|
+
const err = new RouterError(errorCodes.ROUTE_NOT_FOUND, {
|
|
157
|
+
routeName: state.name,
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
deps.emitTransitionError(undefined, deps.getState(), err);
|
|
161
|
+
this.lastSyncRejected = true;
|
|
162
|
+
|
|
163
|
+
return Promise.reject(err);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// States from `matchPath` are deeply frozen (`freezeStateInPlace`).
|
|
167
|
+
// `completeTransition` mutates `toState.transition` and `context` is
|
|
168
|
+
// intentionally extensible for plugin claim writes, so we hand the
|
|
169
|
+
// pipeline a writable shell — same shape `makeState(skipFreeze=true)`
|
|
170
|
+
// produces. `params` stays referentially shared (already frozen).
|
|
171
|
+
// `transition` is omitted so completeTransition can assign it.
|
|
172
|
+
const writableState = {
|
|
173
|
+
name: state.name,
|
|
174
|
+
params: state.params,
|
|
175
|
+
path: state.path,
|
|
176
|
+
context: { ...state.context },
|
|
177
|
+
} as State;
|
|
178
|
+
|
|
179
|
+
return this.#executeNavigation(writableState, opts);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
navigateToDefault(opts: NavigationOptions): Promise<State> {
|
|
183
|
+
const deps = this.#deps;
|
|
184
|
+
const options = deps.getOptions();
|
|
185
|
+
|
|
186
|
+
if (!options.defaultRoute) {
|
|
187
|
+
return Promise.reject(
|
|
188
|
+
new RouterError(errorCodes.ROUTE_NOT_FOUND, {
|
|
189
|
+
routeName: "defaultRoute not configured",
|
|
190
|
+
}),
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
let route: string;
|
|
195
|
+
let params: Params;
|
|
196
|
+
|
|
197
|
+
try {
|
|
198
|
+
({ route, params } = deps.resolveDefault());
|
|
199
|
+
} catch (error) {
|
|
200
|
+
return Promise.reject(error as Error);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (!route) {
|
|
204
|
+
return Promise.reject(
|
|
205
|
+
new RouterError(errorCodes.ROUTE_NOT_FOUND, {
|
|
206
|
+
routeName: "defaultRoute resolved to empty",
|
|
207
|
+
}),
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return this.navigate(route, params, opts);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
navigateToNotFound(path: string): State {
|
|
215
|
+
this.#abortPreviousNavigation();
|
|
216
|
+
|
|
217
|
+
const fromState = this.#deps.getState();
|
|
218
|
+
const deactivated: string[] = fromState
|
|
219
|
+
? nameToIDs(fromState.name).toReversed()
|
|
220
|
+
: [];
|
|
221
|
+
|
|
222
|
+
Object.freeze(deactivated);
|
|
223
|
+
|
|
224
|
+
const segments: TransitionMeta["segments"] = {
|
|
225
|
+
deactivated,
|
|
226
|
+
activated: FROZEN_ACTIVATED,
|
|
227
|
+
intersection: "",
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
Object.freeze(segments);
|
|
231
|
+
|
|
232
|
+
const transitionMeta: TransitionMeta = {
|
|
233
|
+
phase: "activating",
|
|
234
|
+
...(fromState && { from: fromState.name }),
|
|
235
|
+
reason: "success",
|
|
236
|
+
segments,
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
Object.freeze(transitionMeta);
|
|
240
|
+
|
|
241
|
+
const state: State = {
|
|
242
|
+
name: constants.UNKNOWN_ROUTE,
|
|
243
|
+
params: EMPTY_PARAMS as Params,
|
|
244
|
+
path,
|
|
245
|
+
transition: transitionMeta,
|
|
246
|
+
context: {},
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
Object.freeze(state);
|
|
250
|
+
|
|
251
|
+
this.#deps.setState(state);
|
|
252
|
+
this.#deps.emitTransitionSuccess(state, fromState, FROZEN_REPLACE_OPTS);
|
|
253
|
+
|
|
254
|
+
return state;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
abortCurrentNavigation(): void {
|
|
258
|
+
this.#currentController?.abort(
|
|
259
|
+
new RouterError(errorCodes.TRANSITION_CANCELLED),
|
|
260
|
+
);
|
|
261
|
+
this.#currentController = null;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
#executeNavigation(toState: State, opts: NavigationOptions): Promise<State> {
|
|
265
|
+
const deps = this.#deps;
|
|
266
|
+
let fromState: State | undefined;
|
|
267
|
+
let transitionStarted = false;
|
|
268
|
+
let controller: AbortController | null = null;
|
|
269
|
+
|
|
270
|
+
try {
|
|
119
271
|
fromState = deps.getState();
|
|
120
272
|
opts = forceReplaceFromUnknown(opts, fromState);
|
|
121
273
|
|
|
@@ -256,88 +408,6 @@ export class NavigationNamespace {
|
|
|
256
408
|
}
|
|
257
409
|
}
|
|
258
410
|
|
|
259
|
-
navigateToDefault(opts: NavigationOptions): Promise<State> {
|
|
260
|
-
const deps = this.#deps;
|
|
261
|
-
const options = deps.getOptions();
|
|
262
|
-
|
|
263
|
-
if (!options.defaultRoute) {
|
|
264
|
-
return Promise.reject(
|
|
265
|
-
new RouterError(errorCodes.ROUTE_NOT_FOUND, {
|
|
266
|
-
routeName: "defaultRoute not configured",
|
|
267
|
-
}),
|
|
268
|
-
);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
let route: string;
|
|
272
|
-
let params: Params;
|
|
273
|
-
|
|
274
|
-
try {
|
|
275
|
-
({ route, params } = deps.resolveDefault());
|
|
276
|
-
} catch (error) {
|
|
277
|
-
return Promise.reject(error as Error);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
if (!route) {
|
|
281
|
-
return Promise.reject(
|
|
282
|
-
new RouterError(errorCodes.ROUTE_NOT_FOUND, {
|
|
283
|
-
routeName: "defaultRoute resolved to empty",
|
|
284
|
-
}),
|
|
285
|
-
);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
return this.navigate(route, params, opts);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
navigateToNotFound(path: string): State {
|
|
292
|
-
this.#abortPreviousNavigation();
|
|
293
|
-
|
|
294
|
-
const fromState = this.#deps.getState();
|
|
295
|
-
const deactivated: string[] = fromState
|
|
296
|
-
? nameToIDs(fromState.name).toReversed()
|
|
297
|
-
: [];
|
|
298
|
-
|
|
299
|
-
Object.freeze(deactivated);
|
|
300
|
-
|
|
301
|
-
const segments: TransitionMeta["segments"] = {
|
|
302
|
-
deactivated,
|
|
303
|
-
activated: FROZEN_ACTIVATED,
|
|
304
|
-
intersection: "",
|
|
305
|
-
};
|
|
306
|
-
|
|
307
|
-
Object.freeze(segments);
|
|
308
|
-
|
|
309
|
-
const transitionMeta: TransitionMeta = {
|
|
310
|
-
phase: "activating",
|
|
311
|
-
...(fromState && { from: fromState.name }),
|
|
312
|
-
reason: "success",
|
|
313
|
-
segments,
|
|
314
|
-
};
|
|
315
|
-
|
|
316
|
-
Object.freeze(transitionMeta);
|
|
317
|
-
|
|
318
|
-
const state: State = {
|
|
319
|
-
name: constants.UNKNOWN_ROUTE,
|
|
320
|
-
params: EMPTY_PARAMS as Params,
|
|
321
|
-
path,
|
|
322
|
-
transition: transitionMeta,
|
|
323
|
-
context: {},
|
|
324
|
-
};
|
|
325
|
-
|
|
326
|
-
Object.freeze(state);
|
|
327
|
-
|
|
328
|
-
this.#deps.setState(state);
|
|
329
|
-
this.#deps.emitTransitionSuccess(state, fromState, FROZEN_REPLACE_OPTS);
|
|
330
|
-
|
|
331
|
-
return state;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
abortCurrentNavigation(): void {
|
|
335
|
-
this.#currentController?.abort(
|
|
336
|
-
new RouterError(errorCodes.TRANSITION_CANCELLED),
|
|
337
|
-
);
|
|
338
|
-
this.#currentController = null;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
411
|
async #finishAsyncNavigation(
|
|
342
412
|
guardCompletion: Promise<void>,
|
|
343
413
|
nav: NavigationContext,
|
|
@@ -60,11 +60,11 @@ export class RouterLifecycleNamespace {
|
|
|
60
60
|
deps.completeStart();
|
|
61
61
|
|
|
62
62
|
if (matchedState) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
);
|
|
63
|
+
// navigateToState commits matchedState verbatim — same primitive URL
|
|
64
|
+
// plugins use on popstate / navigate-event (#525). Keeps trailing-slash
|
|
65
|
+
// and any other source-URL flavor that matchPath produced; skips the
|
|
66
|
+
// redundant forwardState+buildPath round-trip in buildNavigateState.
|
|
67
|
+
return deps.navigateToState(matchedState, REPLACE_OPTS);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
return deps.navigateToNotFound(startPath);
|
|
@@ -9,11 +9,15 @@ import type {
|
|
|
9
9
|
|
|
10
10
|
export interface RouterLifecycleDependencies {
|
|
11
11
|
getOptions: () => Options;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Commit a fully-resolved State without re-running `forwardState`/`buildPath`.
|
|
14
|
+
* `start(path)` uses this to commit `matchPath(path)` directly — the same
|
|
15
|
+
* primitive URL plugins use on popstate / navigate-event (#525). Keeps
|
|
16
|
+
* `state.path` identical to the source URL (preserves trailing slash in
|
|
17
|
+
* `trailingSlash:"preserve"` mode) and avoids the redundant
|
|
18
|
+
* forwardState+buildPath round-trip in `buildNavigateState`.
|
|
19
|
+
*/
|
|
20
|
+
navigateToState: (state: State, opts: NavigationOptions) => Promise<State>;
|
|
17
21
|
navigateToNotFound: (path: string) => State;
|
|
18
22
|
clearState: () => void;
|
|
19
23
|
matchPath: <P extends Params = Params>(path: string) => State<P> | undefined;
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
matchSourceTrailingSlash,
|
|
6
6
|
paramsMatch,
|
|
7
7
|
paramsMatchExcluding,
|
|
8
|
+
stripQueryDefaults,
|
|
8
9
|
} from "./helpers";
|
|
9
10
|
import {
|
|
10
11
|
createRoutesStore,
|
|
@@ -430,6 +431,15 @@ export class RoutesNamespace<
|
|
|
430
431
|
);
|
|
431
432
|
}
|
|
432
433
|
|
|
434
|
+
// The fast path above lets through three relations: exact (handled in
|
|
435
|
+
// the previous block), `activeName` descendant of `name`, and `name`
|
|
436
|
+
// descendant of `activeName`. Only the first two count as "active" —
|
|
437
|
+
// a link pointing DEEPER than the current state is a navigation option,
|
|
438
|
+
// not an active state. Reject the descendant-of-active case explicitly.
|
|
439
|
+
if (!activeName.startsWith(`${name}.`)) {
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
|
|
433
443
|
// Hierarchical check: activeState is a descendant of target (name)
|
|
434
444
|
const activeParams = activeState.params;
|
|
435
445
|
|
|
@@ -437,11 +447,30 @@ export class RoutesNamespace<
|
|
|
437
447
|
return false;
|
|
438
448
|
}
|
|
439
449
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
450
|
+
if (!defaultParams) {
|
|
451
|
+
return true;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Honor `ignoreQueryParams` symmetrically with the exact-match branch
|
|
455
|
+
// above: query-only param differences (e.g. parent has
|
|
456
|
+
// `defaultParams: { sort: "asc" }` while the active descendant is
|
|
457
|
+
// `products.detail` with `params: { id: "6" }` and no sort) must not
|
|
458
|
+
// disqualify an ancestor link from being active. Strip query-typed
|
|
459
|
+
// keys of `name` from the defaults before comparison; URL-typed keys
|
|
460
|
+
// (`:id`, `:role`, etc.) are still enforced.
|
|
461
|
+
// `name` reaches this point only after the fast-path established a valid
|
|
462
|
+
// hierarchical relation AND `defaultParams` is non-null — both imply the
|
|
463
|
+
// matcher has registered the route, so `getMetaByName(name)![name]` is
|
|
464
|
+
// always defined here. Non-null assertions trade a defensive guard for
|
|
465
|
+
// honest 100% coverage.
|
|
466
|
+
const defaultsToCheck = ignoreQueryParams
|
|
467
|
+
? stripQueryDefaults(
|
|
468
|
+
defaultParams,
|
|
469
|
+
this.#store.matcher.getMetaByName(name)?.[name],
|
|
470
|
+
)
|
|
471
|
+
: defaultParams;
|
|
472
|
+
|
|
473
|
+
return paramsMatchExcluding(defaultsToCheck, activeParams, params);
|
|
445
474
|
}
|
|
446
475
|
|
|
447
476
|
getMetaForState(
|
|
@@ -61,6 +61,48 @@ export function paramsMatchExcluding(
|
|
|
61
61
|
return true;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
/**
|
|
65
|
+
* Returns a copy of `defaultParams` with query-typed keys removed, based on
|
|
66
|
+
* `ownMeta` (the per-route paramTypeMap from the matcher). When no query keys
|
|
67
|
+
* are present, returns the input by reference (zero-allocation fast path).
|
|
68
|
+
*
|
|
69
|
+
* `ownMeta` may be `undefined` for non-registered route names — this is the
|
|
70
|
+
* caller's escape hatch (e.g. `getMetaByName(name)?.[name]`); a missing meta
|
|
71
|
+
* means no query type information is available, so defaults pass through
|
|
72
|
+
* unchanged.
|
|
73
|
+
*/
|
|
74
|
+
export function stripQueryDefaults(
|
|
75
|
+
defaultParams: Params,
|
|
76
|
+
ownMeta: Record<string, "url" | "query"> | undefined,
|
|
77
|
+
): Params {
|
|
78
|
+
if (!ownMeta || !hasQueryDefault(defaultParams, ownMeta)) {
|
|
79
|
+
return defaultParams;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const filtered: Params = {};
|
|
83
|
+
|
|
84
|
+
for (const key in defaultParams) {
|
|
85
|
+
if (ownMeta[key] !== "query") {
|
|
86
|
+
filtered[key] = defaultParams[key];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return filtered;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function hasQueryDefault(
|
|
94
|
+
defaultParams: Params,
|
|
95
|
+
ownMeta: Record<string, "url" | "query">,
|
|
96
|
+
): boolean {
|
|
97
|
+
for (const key in defaultParams) {
|
|
98
|
+
if (ownMeta[key] === "query") {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
|
|
64
106
|
/**
|
|
65
107
|
* Sanitizes a route by keeping only essential properties.
|
|
66
108
|
*/
|
|
@@ -124,6 +124,7 @@ export interface RouterValidator {
|
|
|
124
124
|
navigation: {
|
|
125
125
|
validateNavigateArgs: (name: unknown) => void;
|
|
126
126
|
validateNavigateToDefaultArgs: (options: unknown) => void;
|
|
127
|
+
validateNavigateToStateArgs: (state: unknown) => void;
|
|
127
128
|
validateNavigationOptions: (options: unknown, caller: string) => void;
|
|
128
129
|
validateParams: (params: unknown, methodName: string) => void;
|
|
129
130
|
validateStartArgs: (path: unknown) => void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Router, State } from "@real-router/types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hydrate a fresh router from server-serialized State (#563).
|
|
5
|
+
*
|
|
6
|
+
* Accepts either a JSON string (parsed via `JSON.parse`) or a State-shaped
|
|
7
|
+
* object. Extracts `state.path` and delegates to `router.start(state.path)` —
|
|
8
|
+
* the canonical URL is the source of truth for the router on hydration.
|
|
9
|
+
*
|
|
10
|
+
* The serialized State (produced by `serializeRouterState`) is still useful
|
|
11
|
+
* for application-level concerns: `state.context.<namespace>` payloads (e.g.
|
|
12
|
+
* server-side data from `ssr-data-plugin`) can be read separately by app code
|
|
13
|
+
* before or after `hydrateRouter` resolves.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Client
|
|
18
|
+
* const router = createAppRouter();
|
|
19
|
+
* router.usePlugin(browserPluginFactory());
|
|
20
|
+
* await hydrateRouter(router, window.__SSR_STATE__);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function hydrateRouter(
|
|
24
|
+
router: Router,
|
|
25
|
+
source: string | { path: string },
|
|
26
|
+
): Promise<State> {
|
|
27
|
+
const parsed =
|
|
28
|
+
typeof source === "string"
|
|
29
|
+
? (JSON.parse(source) as { path: string })
|
|
30
|
+
: source;
|
|
31
|
+
|
|
32
|
+
return router.start(parsed.path);
|
|
33
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export { getStaticPaths } from "./getStaticPaths";
|
|
2
2
|
|
|
3
|
+
export { hydrateRouter } from "./hydrateRouter";
|
|
4
|
+
|
|
5
|
+
export { serializeRouterState } from "./serializeRouterState";
|
|
6
|
+
|
|
3
7
|
export { serializeState } from "./serializeState";
|
|
4
8
|
|
|
5
9
|
export type { StaticPathEntries } from "./getStaticPaths";
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { serializeState } from "./serializeState";
|
|
2
|
+
|
|
3
|
+
import type { State } from "@real-router/types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* XSS-safe JSON serialization of router State for SSR → client transport (#563).
|
|
7
|
+
*
|
|
8
|
+
* Strips `state.transition` (per-navigation `TransitionMeta` — meaningless after
|
|
9
|
+
* hydration; the client's hydration commit produces its own `transition`).
|
|
10
|
+
* Keeps `name`, `params`, `path`, and `context` (plugin context namespaces are
|
|
11
|
+
* preserved as-is — server's `state.context.data` from `ssr-data-plugin` and
|
|
12
|
+
* any other plugin claims travel to the client untouched).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* // Server
|
|
17
|
+
* const state = await router.start(req.url);
|
|
18
|
+
* const html = `<script>window.__SSR_STATE__=${serializeRouterState(state)}</script>`;
|
|
19
|
+
*
|
|
20
|
+
* // Client
|
|
21
|
+
* await hydrateRouter(router, window.__SSR_STATE__);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function serializeRouterState(state: State): string {
|
|
25
|
+
return serializeState({
|
|
26
|
+
name: state.name,
|
|
27
|
+
params: state.params,
|
|
28
|
+
path: state.path,
|
|
29
|
+
context: state.context,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
@@ -225,8 +225,8 @@ export class RouterWiringBuilder<
|
|
|
225
225
|
wireLifecycleDeps(): void {
|
|
226
226
|
const lifecycleDeps: RouterLifecycleDependencies = {
|
|
227
227
|
getOptions: () => this.options.get(),
|
|
228
|
-
|
|
229
|
-
this.navigation.
|
|
228
|
+
navigateToState: (state, opts) =>
|
|
229
|
+
this.navigation.navigateToState(state, opts),
|
|
230
230
|
navigateToNotFound: (path) => this.navigation.navigateToNotFound(path),
|
|
231
231
|
clearState: () => {
|
|
232
232
|
this.state.set(undefined);
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
const e=require(`./RouterError-BmvAyBlx.js`),t=require(`./internals-na15rxo_.js`);let n=require(`@real-router/logger`),r=require(`@real-router/fsm`);const i={maxListeners:0,warnListeners:0,maxEventDepth:0};var a=class extends Error{},o=class{#e=new Map;#t=null;#n=i;#r;#i;constructor(e){e?.limits&&(this.#n=e.limits),this.#r=e?.onListenerError??null,this.#i=e?.onListenerWarn??null}static validateCallback(e,t){if(typeof e!=`function`)throw TypeError(`Expected callback to be a function for event ${t}`)}setLimits(e){this.#n=e}on(e,t){let n=this.#c(e);if(n.has(t))throw Error(`Duplicate listener for "${e}"`);let{maxListeners:r,warnListeners:i}=this.#n;if(i!==0&&n.size===i&&this.#i?.(e,i),r!==0&&n.size>=r)throw Error(`Listener limit (${r}) reached for "${e}"`);return n.add(t),()=>{this.off(e,t)}}off(e,t){this.#e.get(e)?.delete(t)}emit(e,t,n,r,i){let a=this.#e.get(e);if(!a||a.size===0)return;let o=arguments.length-1;if(this.#n.maxEventDepth===0){this.#a(a,e,o,t,n,r,i);return}this.#s(a,e,o,t,n,r,i)}clearAll(){this.#e.clear(),this.#t=null}listenerCount(e){return this.#e.get(e)?.size??0}#a(e,t,n,r,i,a,o){if(e.size===1){let[s]=e;try{this.#o(s,n,r,i,a,o)}catch(e){this.#r?.(t,e)}return}let s=[...e];for(let e of s)try{this.#o(e,n,r,i,a,o)}catch(e){this.#r?.(t,e)}}#o(e,t,n,r,i,a){switch(t){case 0:e();break;case 1:e(n);break;case 2:e(n,r);break;case 3:e(n,r,i);break;default:e(n,r,i,a)}}#s(e,t,n,r,i,o,s){this.#t??=new Map;let c=this.#t,l=c.get(t)??0;if(l>=this.#n.maxEventDepth)throw new a(`Maximum recursion depth (${this.#n.maxEventDepth}) exceeded for event: ${t}`);try{c.set(t,l+1);let u=e.size===1?e:[...e];for(let e of u)try{this.#o(e,n,r,i,o,s)}catch(e){if(e instanceof a)throw e;this.#r?.(t,e)}}finally{c.set(t,c.get(t)-1)}}#c(e){let t=this.#e.get(e);if(t)return t;let n=new Set;return this.#e.set(e,n),n}};const s={IDLE:`IDLE`,STARTING:`STARTING`,READY:`READY`,TRANSITION_STARTED:`TRANSITION_STARTED`,LEAVE_APPROVED:`LEAVE_APPROVED`,DISPOSED:`DISPOSED`},c={START:`START`,STARTED:`STARTED`,NAVIGATE:`NAVIGATE`,LEAVE_APPROVE:`LEAVE_APPROVE`,COMPLETE:`COMPLETE`,FAIL:`FAIL`,CANCEL:`CANCEL`,STOP:`STOP`,DISPOSE:`DISPOSE`},l={initial:s.IDLE,context:null,transitions:{[s.IDLE]:{[c.START]:s.STARTING,[c.DISPOSE]:s.DISPOSED},[s.STARTING]:{[c.STARTED]:s.READY,[c.FAIL]:s.IDLE},[s.READY]:{[c.NAVIGATE]:s.TRANSITION_STARTED,[c.FAIL]:s.READY,[c.STOP]:s.IDLE},[s.TRANSITION_STARTED]:{[c.NAVIGATE]:s.TRANSITION_STARTED,[c.LEAVE_APPROVE]:s.LEAVE_APPROVED,[c.CANCEL]:s.READY,[c.FAIL]:s.READY},[s.LEAVE_APPROVED]:{[c.NAVIGATE]:s.TRANSITION_STARTED,[c.COMPLETE]:s.READY,[c.CANCEL]:s.READY,[c.FAIL]:s.READY},[s.DISPOSED]:{}}};function u(){return new r.FSM(l)}function d(e){if(!e||typeof e!=`object`||e.constructor!==Object)throw TypeError(`dependencies must be a plain object`);for(let t in e)if(Object.getOwnPropertyDescriptor(e,t)?.get)throw TypeError(`dependencies cannot contain getters: "${t}"`)}function f(e,t){for(let n of e){let e=n;if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(`route must be a non-array object`);t?.routes.guardRouteCallbacks(n),t?.routes.guardNoAsyncCallbacks(n);let r=n.children;r&&f(r,t)}}function p(t={}){let n=Object.create(null);for(let e in t)t[e]!==void 0&&(n[e]=t[e]);return{dependencies:n,limits:e.a}}function m(e){return`(${e.replaceAll(/(^<|>$)/g,``)})`}const h=/([:*])([^/?<]+)(<[^>]+>)?(\?)?/g,g=/([:*][^/?<]+(?:<[^>]+>)?)\?(?=\/|$)/g,ee=/\?(.+)$/;function te(e){let t=[],n=[],r=[],i={},a=new Map,o=e.replaceAll(g,`$1`),s=ee.exec(o);if(s!==null){let t=s[1].split(`&`);for(let e of t){let t=e.trim();t.length>0&&(n.push(t),i[t]=`query`)}e=e.slice(0,s.index)}let c;for(;(c=h.exec(e))!==null;){let e=c[1],n=c[2],o=c[3];if(e===`*`)r.push(n),t.push(n),i[n]=`url`;else if(t.push(n),i[n]=`url`,o){let e=`^${m(o)}$`;a.set(n,{pattern:new RegExp(e),constraint:o})}}return{urlParams:t,queryParams:n,spatParams:r,paramTypeMap:i,constraintPatterns:a,pathPattern:e}}const _=/[^\w!$'()*+,.:;|~-]/gu,v=/[^\w!$'()*+,.:;|~-]/u,ne={default:e=>v.test(e)?e.replaceAll(_,e=>encodeURIComponent(e)):e,uri:encodeURI,uriComponent:encodeURIComponent,none:e=>e},re={default:decodeURIComponent,uri:decodeURI,uriComponent:decodeURIComponent,none:e=>e};function y(){return{staticChildren:Object.create(null),hasChildren:!1,paramChild:void 0,splatChild:void 0,route:void 0,slashChildRoute:void 0}}function b(e){return e.length>1&&e.endsWith(`/`)?e.slice(0,-1):e}function ie(e,t){return e===``?t:t===``?e:e+t}function x(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function ae(e){let t=0;for(;t<e.length;)if(e.codePointAt(t)===37){if(t+2>=e.length)return!1;let n=e.codePointAt(t+1)??0,r=e.codePointAt(t+2)??0;if(!x(n)||!x(r))return!1;t+=3}else t++;return!0}const S=/<[^>]*>/g;function oe(e,t,n,r,i){let a=t.fullName===``;a||r.push(t);let o=t.absolute,s=t.paramMeta.pathPattern,c=o&&s.startsWith(`~`)?s.slice(1):s,l=(o?c:s).replaceAll(S,``),u=o?l:ie(n,l),d=i;a||(d=se(e,t,u,o?``:n,r,i));for(let n of t.children.values())oe(e,n,u,r,d);a||r.pop()}function se(e,t,n,r,i,a){let o=de(n,r),s=Object.freeze([...i]),c=ce(s),l=b(n),u=ve(e.rootQueryParams,i),d=ye(i),{buildStaticParts:f,buildParamSlots:p}=_e(o?b(r):l,o?i.slice(0,-1):i,e.options.urlParamsEncoding),m={name:t.fullName,parent:a,depth:i.length-1,matchSegments:s,meta:c,declaredQueryParams:u,declaredQueryParamsSet:new Set(u),hasTrailingSlash:n.length>1&&n.endsWith(`/`),constraintPatterns:d,hasConstraints:d.size>0,buildStaticParts:f,buildParamSlots:p,buildParamNamesSet:new Set(p.map(e=>e.paramName))};return t.paramMeta.urlParams.length===0&&(m.cachedResult=Object.freeze({segments:m.matchSegments,params:Object.freeze({}),meta:m.meta})),e.routesByName.set(t.fullName,m),e.segmentsByName.set(t.fullName,s),e.metaByName.set(t.fullName,c),o?le(e,m,r):ue(e,m,n,l,t),m}function ce(e){let t={};for(let n of e)t[n.fullName]=n.paramTypeMap;return Object.freeze(t)}function le(e,t,n){pe(e,t,n);let r=b(n),i=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.has(i)&&e.staticCache.set(i,t)}function ue(e,t,n,r,i){if(fe(e,t,n),i.paramMeta.urlParams.length===0){let n=e.options.caseSensitive?r:r.toLowerCase();e.staticCache.set(n,t)}}function de(e,t){return b(e)===b(t)}function fe(e,t,n){let r=b(n);if(r===`/`){e.root.route=t;return}C(e,e.root,r,1,t)}function C(e,t,n,r,i){let a=n.length;for(;r<=a;){let o=n.indexOf(`/`,r),s=o===-1?a:o,c=n.slice(r,s);if(c.endsWith(`?`)){let r=c.slice(1).replaceAll(S,``).replace(/\?$/,``);t.paramChild??={node:y(),name:r},C(e,t.paramChild.node,n,s+1,i),s>=a?t.route??=i:C(e,t,n,s+1,i);return}t=ge(e,t,c),r=s+1}t.route=i}function pe(e,t,n){let r=me(e,n);r.slashChildRoute=t}function me(e,t){return he(e,e.root,t)}function he(e,t,n){let r=b(n);if(r===`/`||r===``)return t;let i=t,a=1,o=r.length;for(;a<=o;){let t=r.indexOf(`/`,a),n=t===-1?o:t;if(n<=a)break;let s=r.slice(a,n);i=ge(e,i,s),a=n+1}return i}function ge(e,t,n){if(n.startsWith(`*`)){let e=n.slice(1);return t.splatChild??={node:y(),name:e},t.hasChildren=!0,t.splatChild.node}if(n.startsWith(`:`)){let e=n.slice(1).replaceAll(S,``).replace(/\?$/,``);return t.paramChild??={node:y(),name:e},t.hasChildren=!0,t.paramChild.node}let r=e.options.caseSensitive?n:n.toLowerCase();return r in t.staticChildren||(t.staticChildren[r]=y(),t.hasChildren=!0),t.staticChildren[r]}function _e(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=ne[n],r=e.split(`/`),i=t(r[0]);for(let e=1;e<r.length;e++)i+=`/${t(r[e])}`;return i}:ne[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 ve(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 ye(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 be=class{get options(){return this.#e}#e;#t=y();#n=new Map;#r=new Map;#i=new Map;#a=new Map;#o={cleanPath:``,normalized:``,queryString:void 0};#s=``;#c=[];#l=``;#u;#d;constructor(e){this.#e={caseSensitive:e.caseSensitive??!0,strictTrailingSlash:e.strictTrailingSlash??!1,strictQueryParams:e.strictQueryParams??!1,urlParamsEncoding:e.urlParamsEncoding??`default`,parseQueryString:e.parseQueryString,buildQueryString:e.buildQueryString},this.#u=this.#e.caseSensitive,this.#d=this.#e.urlParamsEncoding===`none`?null:re[this.#e.urlParamsEncoding]}registerTree(e){this.#c=e.paramMeta.queryParams,oe({root:this.#t,options:this.#e,routesByName:this.#n,segmentsByName:this.#r,metaByName:this.#i,staticCache:this.#a,rootQueryParams:this.#c},e,``,[],null)}match(e){if(!this.#g(e))return;let{cleanPath:t,normalized:n,queryString:r}=this.#o,i=this.#u?n:n.toLowerCase(),a=this.#a.get(i);if(a)return this.#e.strictTrailingSlash&&!this.#y(t,a)?void 0:r===void 0&&a.cachedResult?a.cachedResult:this.#v(a,{},r);let o={},s=this.#b(n,o);if(s&&!(this.#e.strictTrailingSlash&&!this.#y(t,s))&&!(s.hasConstraints&&!this.#w(o,s))&&this.#C(o))return this.#v(s,o,r)}buildPath(e,t,n){let r=this.#n.get(e);if(!r)throw Error(`[SegmentMatcher.buildPath] '${e}' is not defined`);r.hasConstraints&&t&&this.#f(r,e,t);let i=this.#p(r,t),a=this.#m(i,n?.trailingSlash),o=this.#h(r,t,n?.queryParamsMode);return a+(o?`?${o}`:``)}getSegmentsByName(e){return this.#r.get(e)}getMetaByName(e){return this.#i.get(e)}hasRoute(e){return this.#n.has(e)}setRootPath(e){this.#s=e}#f(e,t,n){for(let[r,i]of e.constraintPatterns){let e=n[r];if(e!=null){let n=typeof e==`object`?JSON.stringify(e):String(e);if(!i.pattern.test(n))throw Error(`[SegmentMatcher.buildPath] '${t}' — param '${r}' value '${n}' does not match constraint '${i.constraint}'`)}}}#p(e,t){let n=e.buildStaticParts,r=e.buildParamSlots;if(r.length===0)return this.#s+n[0];let i=this.#s+n[0];for(let[e,a]of r.entries()){let r=t?.[a.paramName];if(r==null){if(!a.isOptional)throw Error(`[SegmentMatcher.buildPath] Missing required param '${a.paramName}'`);i.length>1&&i.endsWith(`/`)&&(i=i.slice(0,-1)),i+=n[e+1];continue}let o;o=typeof r==`string`?r:typeof r==`object`?JSON.stringify(r):String(r);let s=a.encoder(o);i+=s+n[e+1]}return i}#m(e,t){return t===`always`&&!e.endsWith(`/`)?`${e}/`:t===`never`&&e!==`/`&&e.endsWith(`/`)?e.slice(0,-1):e}#h(e,t,n){if(!t||e.declaredQueryParams.length===0&&n!==`loose`)return``;let r={},i=!1;for(let n of e.declaredQueryParams)n in t&&(r[n]=t[n],i=!0);if(n===`loose`)for(let n in t)Object.hasOwn(t,n)&&!e.declaredQueryParamsSet.has(n)&&!e.buildParamNamesSet.has(n)&&(r[n]=t[n],i=!0);return i?this.#e.buildQueryString(r):``}#g(e){if(e===``&&(e=`/`),e.codePointAt(0)!==47)return!1;let t=this.#s.length;if(t>0){if(e.length<t||!e.startsWith(this.#s))return!1;e=e.length===t?`/`:e.slice(t)}let n=this.#_(e);if(n===-2)return!1;n===-3&&(e=this.#l);let r=n>=0?e.slice(0,n):e,i=n>=0?e.slice(n+1):void 0,a=b(r);return this.#o.cleanPath=r,this.#o.normalized=a,this.#o.queryString=i,!0}#_(e){let t=!1;for(let n=0;n<e.length;n++){let r=e.codePointAt(n);if(r===35)return this.#l=e.slice(0,n),-3;if(r===63)return n;if(r>=128)return-2;if(r===47){if(t)return-2;t=!0}else t=!1}return-1}#v(e,t,n){if(n!==void 0){let r=this.#e.parseQueryString(n);if(this.#e.strictQueryParams){let n=e.declaredQueryParamsSet;for(let e in r){if(!n.has(e))return;t[e]=r[e]}}else for(let e in r)t[e]=r[e]}return{segments:e.matchSegments,params:t,meta:e.meta}}#y(e,t){return(e.length>1&&e.endsWith(`/`))===t.hasTrailingSlash}#b(e,t){return e.length===1?this.#t.slashChildRoute??this.#t.route:this.#x(this.#t,e,1,t)}#x(e,t,n,r){let i=e,a=t.length,o=this.#u;for(;n<=a;){let e=t.indexOf(`/`,n),s=e===-1?a:e,c=t.slice(n,s),l=o?c:c.toLowerCase(),u;if(l in i.staticChildren)u=i.staticChildren[l];else if(i.paramChild)u=i.paramChild.node,r[i.paramChild.name]=c;else if(i.splatChild)return this.#S(i.splatChild,t,n,r);else return;i=u,n=s+1}return i.slashChildRoute??i.route}#S(e,t,n,r){let i=e.node;if(!i.hasChildren)return r[e.name]=t.slice(n),i.route;let a={},o=this.#x(i,t,n,a);return o?(Object.assign(r,a),o):(r[e.name]=t.slice(n),i.route)}#C(e){let t=this.#d;if(!t)return!0;for(let n in e){let r=e[n];if(r.includes(`%`)){if(!ae(r))return!1;e[n]=t(r)}}return!0}#w(e,t){for(let[n,r]of t.constraintPatterns)if(!r.pattern.test(e[n]))return!1;return!0}};const w=e=>{let t=e.indexOf(`%`),n=e.indexOf(`+`);if(t===-1&&n===-1)return e;let r=n===-1?e:e.replaceAll(`+`,` `);return t===-1?r:decodeURIComponent(r)},xe=(e,t)=>{if(e===void 0)return t.boolean.decodeUndefined();let n=t.boolean.decodeRaw(e);if(n!==null)return n;let r=w(e),i=t.number.decode(r);return i===null?t.boolean.decodeValue(r):i},T=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)},Se={none:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}=${T(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}=${T(t[r])}`;return n}},brackets:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}[]=${T(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}[]=${T(t[r])}`;return n}},index:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}[0]=${T(t[0])}`;for(let r=1;r<t.length;r++)n+=`&${e}[${r}]=${T(t[r])}`;return n}},comma:{encodeArray:(e,t)=>{if(t.length===0)return``;let n=`${e}=${T(t[0])}`;for(let e=1;e<t.length;e++)n+=`,${T(t[e])}`;return n},decodeValue:e=>e.includes(`,`)?e.split(`,`):null}},Ce={encode:(e,t)=>`${e}=${t}`,decodeUndefined:()=>null,decodeRaw:()=>null,decodeValue:e=>e},we={encode:(e,t)=>`${e}=${t}`,decodeUndefined:()=>null,decodeRaw:e=>e===`true`?!0:e===`false`?!1:null,decodeValue:e=>e},Te={encode:(e,t)=>t?e:`${e}=false`,decodeUndefined:()=>!0,decodeRaw:()=>null,decodeValue:e=>e},E={none:Ce,auto:we,"empty-true":Te},D={default:{encode:e=>e},hidden:{encode:()=>``}},O={auto:{decode:e=>{let t=e.length;if(t===0||t>1&&e.codePointAt(0)===48&&e.codePointAt(1)!==46)return null;let n=!1;for(let r=0;r<t;r++){let i=e.codePointAt(r);if(!(i!==void 0&&i>=48&&i<=57)){if(i===46&&!n&&r!==0&&r!==t-1){n=!0;continue}return null}}let r=Number(e);return!Number.isSafeInteger(r)&&!n?null:r}},none:{decode:()=>null}},Ee=(e,t,n,r)=>({boolean:E[t],null:D[n],number:O[r],array:Se[e]}),De={boolean:E.auto,null:D.default,number:O.auto,array:Se.none},k={arrayFormat:`none`,booleanFormat:`auto`,nullFormat:`default`,numberFormat:`auto`},Oe={...k,strategies:De},A=e=>{if(!e||e.arrayFormat===void 0&&e.booleanFormat===void 0&&e.nullFormat===void 0&&e.numberFormat===void 0)return Oe;let t=e.arrayFormat??k.arrayFormat,n=e.booleanFormat??k.booleanFormat,r=e.nullFormat??k.nullFormat,i=e.numberFormat??k.numberFormat;return{arrayFormat:t,booleanFormat:n,nullFormat:r,numberFormat:i,strategies:Ee(t,n,r,i)}},j=e=>encodeURIComponent(e),ke=(e,t,n)=>{let r=j(e);switch(typeof t){case`string`:case`number`:return`${r}=${j(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}=${j(t)}`;default:return`${r}=${j(t)}`}},Ae=e=>{let t=e.indexOf(`?`);return t===-1?e:e.slice(t+1)};function M(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 je(e,t,n,r,i){return i?xe(r?e.slice(t+1,n):void 0,i):r?w(e.slice(t+1,n)):null}function Me(e,t,n,r,i){let a=e.indexOf(`=`,t),o=a!==-1&&a<n,s=o?a:n,c=s,l=!1;for(let n=t;n<s;n++)if(e.codePointAt(n)===91){c=n,l=!0;break}let u=w(e.slice(t,c));if(!l&&o&&i?.array.decodeValue){let t=e.slice(a+1,n),o=i.array.decodeValue(t);if(o){for(let e of o)M(r,u,xe(e,i),!0);return}}M(r,u,je(e,a,n,o,i),l)}const Ne=(e,t)=>{let n=Ae(e);if(n===``||n===`?`)return{};if(!t)return Pe(n);let r=A(t),i={},a=0,o=n.length;for(;a<o;){let e=n.indexOf(`&`,a);e===-1&&(e=o),Me(n,a,e,i,r.strategies),a=e+1}return i};function Pe(e){let t={};return Fe(e,t),t}function Fe(e,t){let n=0,r=e.length;for(;n<r;){let i=e.indexOf(`&`,n);i===-1&&(i=r),Me(e,n,i,t),n=i+1}}const Ie=(e,t)=>{let n=Object.keys(e);if(n.length===0)return``;let r=A(t),i=[];for(let t of n){let n=e[t];if(n===void 0)continue;let a=ke(t,n,r);a&&i.push(a)}return i.join(`&`)};function N(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=N(t,a);a.children.push(e)}return a}function Le(e,t,n){let r=N({name:e,path:t},null);for(let e of n){let t=N(e,r);r.children.push(t)}return r}const Re=Object.freeze(new Map),ze=Object.freeze([]);function Be(e){return e.parent?.name?`${e.parent.fullName}.${e.name}`:e.name}function Ve(e,t){return e.endsWith(`/`)&&t.startsWith(`/`)?e+t.slice(1):e+t}function He(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:Ve(i.staticPath,e.path):e.path}function Ue(e){let t=new Map;for(let n of e)t.set(n.name,n);return t}function We(e,t,n){let r=[],i=[];for(let a of e){let e=Ge(a,t,n);r.push(e),e.absolute||i.push(e)}return{childrenMap:Ue(r),nonAbsoluteChildren:i}}function Ge(e,t,n){let r=te(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=Be(a),a.staticPath=He(a),e.children.length===0)a.children=Re,a.nonAbsoluteChildren=ze;else{let{childrenMap:t,nonAbsoluteChildren:r}=We(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 Ke(e,t=!0){return Ge(e,null,t)}function qe(e,t){let n=[];return{add(e){return n.push(e),this},addMany(e){return n.push(...e),this},build(r){return Ke(Le(e,t,n),!r?.skipFreeze)}}}function Je(e,t,n,r){return qe(e,t).addMany(n).build(r)}function P(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(),P)),n}function Ye(e){return Array.from(e.children.values(),P)}function Xe(e){let t=e?.queryParams;return new be({...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=>Ne(e,t),buildQueryString:e=>Ie(e,t)})}const Ze={defaultRoute:``,defaultParams:{},trailingSlash:`preserve`,queryParamsMode:`loose`,queryParams:k,urlParamsEncoding:`default`,allowNotFound:!0,rewritePathOnMatch:!0};function Qe(e){Object.freeze(e);for(let t of Object.keys(e)){let n=e[t];n&&typeof n==`object`&&n.constructor===Object&&Qe(n)}return e}function F(e,t){return typeof e==`function`?e(t):e}function $e(e){if(!e||typeof e!=`object`||Array.isArray(e))throw TypeError(`[router.constructor] options must be a plain object`)}var et=class{#e;constructor(e={}){this.#e=Qe({...Ze,...e})}static validateOptionsIsObject(e){$e(e)}get(){return this.#e}};function I(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(!I(e[n],t[n]))return!1;return!0}return!1}const tt=new WeakMap;function nt(e){return tt.get(e)}function rt(e,t){tt.set(e,t)}var it=class{#e=void 0;#t=void 0;#n;#r=new Map;get(){return this.#e}set(t){this.#t=this.#e,this.#e=t?e.r(t):void 0}getPrevious(){return this.#t}reset(){this.#e=void 0,this.#t=void 0,this.#r.clear()}setDependencies(e){this.#n=e}makeState(t,n,r,i,a){let o=this.#n.getDefaultParams(),s=Object.hasOwn(o,t),c;c=s?Object.freeze({...o[t],...n}):!n||n===e.s?e.s:Object.freeze({...n});let l={name:t,params:c,path:r??this.#n.buildPath(t,n),context:{},...!a&&{transition:e.o}};return i&&rt(l,i),a?l:e.r(l)}areStatesEqual(e,t,n=!0){if(!e||!t)return!!e==!!t;if(e.name!==t.name)return!1;if(n){let n=this.#i(e.name);for(let r of n)if(!I(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)||!I(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 at={[e.f.ROUTER_START]:e.d.ROUTER_START,[e.f.ROUTER_STOP]:e.d.ROUTER_STOP,[e.f.TRANSITION_SUCCESS]:e.d.TRANSITION_SUCCESS,[e.f.TRANSITION_START]:e.d.TRANSITION_START,[e.f.TRANSITION_LEAVE_APPROVE]:e.d.TRANSITION_LEAVE_APPROVE,[e.f.TRANSITION_ERROR]:e.d.TRANSITION_ERROR,[e.f.TRANSITION_CANCEL]:e.d.TRANSITION_CANCEL},ot=Object.keys(at),L=`router.usePlugin`;function st(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 ct=class t{#e=new Set;#t=new Set;#n;#r=e.a;#i=null;static validatePlugin(e){st(e)}static validateNoDuplicatePlugins(e,t){for(let n of e)if(t(n))throw Error(`[router.usePlugin] Plugin factory already registered. To re-register, first unsubscribe the existing plugin.`)}setDependencies(e){this.#n=e}setLimits(e){
|
|
2
|
-
// eslint-disable-next-line sonarjs/void-use -- @preserve: limits passed to validator via RouterInternals; void suppresses TS6133 until plugin implements validateCountThresholds
|
|
3
|
-
this.#r=e,this.#r}setValidatorGetter(e){this.#i=e}count(){return this.#e.size}use(...e){if(this.#i?.()?.plugins.validateCountThresholds(this.#e.size+e.length),e.length===1){let t=e[0],r=this.#o(t);this.#e.add(t);let i=!1,a=()=>{if(!i){i=!0,this.#e.delete(t),this.#t.delete(a);try{r()}catch(e){n.logger.error(L,`Error during cleanup:`,e)}}};return this.#t.add(a),a}let t=this.#a(e),r=[];try{for(let e of t){let t=this.#o(e);r.push({factory:e,cleanup:t})}}catch(e){for(let{cleanup:e}of r)try{e()}catch(e){n.logger.error(L,`Cleanup error:`,e)}throw e}for(let{factory:e}of r)this.#e.add(e);let i=!1,a=()=>{if(!i){i=!0,this.#t.delete(a);for(let{factory:e}of r)this.#e.delete(e);for(let{cleanup:e}of r)try{e()}catch(e){n.logger.error(L,`Error during cleanup:`,e)}}};return this.#t.add(a),a}getAll(){return[...this.#e]}has(e){return this.#e.has(e)}disposeAll(){for(let e of this.#t)e();this.#e.clear(),this.#t.clear()}#a(e){let t=new Set;for(let n of e)t.has(n)?this.#i?.()?.plugins.warnBatchDuplicates(e):t.add(n);return t}#o(e){let n=this.#n.compileFactory(e);t.validatePlugin(n),this.#i?.()?.plugins.validatePluginKeys(n),Object.freeze(n);let r=[];for(let e of ot)e in n&&(typeof n[e]==`function`?(r.push(this.#n.addEventListener(at[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 lt(e){let t=()=>e;return()=>t}var ut=class{#e=new Map;#t=new Map;#n=new Map;#r=new Map;#i=[this.#n,this.#r];#a=new Set;#o=new Set;#s=new Set;#c;#l=e.a;#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`?lt(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 dt(){return{decoders:Object.create(null),encoders:Object.create(null),defaultParams:Object.create(null),forwardMap:Object.create(null),forwardFnMap:Object.create(null)}}function ft(e,t){for(let n in e)if(e[n]!==t[n])return!1;return!0}function pt(e,t,n){for(let r in e)if(!(r in n)&&e[r]!==t[r])return!1;return!0}function R(e){let t={name:e.name,path:e.path};return e.children&&(t.children=e.children.map(e=>R(e))),t}function mt(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}.`)&&mt(i.children,t,a))return!0}return!1}function ht(e,t){for(let n of Object.keys(e))t(n)&&delete e[n]}function gt(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 _t(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 vt(e,t,n){let r=Je(``,t,e),i=Xe(n);return i.registerTree(r),{tree:r,matcher:i}}function z(e){let t=vt(e.definitions,e.rootPath,e.matcherOptions);e.tree=t.tree,e.matcher=t.matcher}function yt(e){z(e),e.resolvedForwardMap=B(e.config)}function bt(e){xt(e),z(e)}function xt(e){e.definitions.length=0,Object.assign(e.config,dt()),e.resolvedForwardMap=Object.create(null),e.routeCustomFields=Object.create(null)}function B(e){let t=Object.create(null);for(let n of Object.keys(e.forwardMap))t[n]=_t(n,e.forwardMap);return t}function St(e,t,r){if(e.canActivate){let r=typeof e.forwardTo==`string`?e.forwardTo:`[dynamic]`;n.logger.warn(`real-router`,`Route "${t}" has both forwardTo and canActivate. canActivate will be ignored because forwardTo creates a redirect (industry standard). Move canActivate to the target route "${r}".`)}if(e.canDeactivate){let r=typeof e.forwardTo==`string`?e.forwardTo:`[dynamic]`;n.logger.warn(`real-router`,`Route "${t}" has both forwardTo and canDeactivate. canDeactivate will be ignored because forwardTo creates a redirect (industry standard). Move canDeactivate to the target route "${r}".`)}if(typeof e.forwardTo==`function`){let n=e.forwardTo.constructor.name===`AsyncFunction`,r=e.forwardTo.toString().includes(`__awaiter`);if(n||r)throw TypeError(`forwardTo callback cannot be async for route "${t}". Async functions break matchPath/buildPath.`)}typeof e.forwardTo==`string`?r.forwardMap[t]=e.forwardTo:r.forwardFnMap[t]=e.forwardTo}function Ct(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&&St(e,t,n),e.decodeParams&&(n.decoders[t]=t=>e.decodeParams?.(t)??t),e.encodeParams&&(n.encoders[t]=t=>e.encodeParams?.(t)??t),e.defaultParams&&(n.defaultParams[t]=e.defaultParams)}function V(e,t,n,r,i,a,o=``){for(let s of e){let e=o?`${o}.${s.name}`:s.name;Ct(s,e,t,n,r,i,a),s.children&&V(s.children,t,n,r,i,a,e)}}function wt(e,t){let n=[],r=dt(),i=Object.create(null),a=new Map,o=new Map;for(let t of e)n.push(R(t));let{tree:s,matcher:c}=vt(n,``,t);return V(e,r,i,a,o,void 0,``),{definitions:n,config:r,tree:s,matcher:c,resolvedForwardMap:B(r),routeCustomFields:i,rootPath:``,matcherOptions:t,depsStore:void 0,lifecycleNamespace:void 0,pendingCanActivate:a,pendingCanDeactivate:o,treeOperations:{commitTreeChanges:yt,resetStore:bt,nodeToDefinition:P}}}const H=[];Object.freeze(H);function Tt(e){let t=e.length,n=[];for(let r=t-1;r>=0;r--)n.push(e[r]);return n}function Et(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 Dt(e){let t=typeof e;return t===`string`||t===`number`||t===`boolean`}function Ot(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(Dt(t)&&Dt(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]||!Ot(a,e,t,n))return o}return a}const At=new Map;function U(e){let t=At.get(e);if(t)return t;let n=jt(e);return Object.freeze(n),At.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]:Et(e)}let W,G,K=null,Mt,Nt,q=null;function Pt(e,t){if(!t)return{intersection:``,toActivate:U(e.name),toDeactivate:H};let n=nt(e),r=nt(t);if(!n&&!r)return{intersection:``,toActivate:U(e.name),toDeactivate:Tt(U(t.name))};let i=U(e.name),a=U(t.name),o=Math.min(a.length,i.length),s=kt(n??r,e,t,i,a,o),c;if(s>=a.length)c=H;else if(s===0&&a.length===1)c=a;else{c=[];for(let e=a.length-1;e>=s;e--)c.push(a[e])}let l=s===0?i:i.slice(s);return{intersection:s>0?a[s-1]:``,toDeactivate:c,toActivate:l}}function J(e,t){if(K!==null&&e===W&&t===G)return K;if(q!==null&&e===Mt&&t===Nt)return q;let n=Pt(e,t);return Mt=W,Nt=G,q=K,W=e,G=t,K=n,n}function Ft(e){let t=[];for(let n of e)for(let e of n.paramMeta.urlParams)t.push(e);return t}function It(e){return e.at(-1)?.fullName??``}function Lt(e,t){return{name:t??It(e.segments),params:e.params,meta:e.meta}}var Rt=class{#e;#t;get#n(){return this.#e.depsStore}constructor(e=[],t){this.#e=wt(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}=J(t,n);return e===r||i.includes(e)?!0:a.includes(e)}}setDependencies(e){this.#e.depsStore=e;for(let[t,n]of this.#e.pendingCanActivate)e.addActivateGuard(t,n);this.#e.pendingCanActivate.clear();for(let[t,n]of this.#e.pendingCanDeactivate)e.addDeactivateGuard(t,n);this.#e.pendingCanDeactivate.clear()}setLifecycleNamespace(e){this.#e.lifecycleNamespace=e}setRootPath(e){this.#e.rootPath=e,z(this.#e)}hasRoute(e){return this.#e.matcher.hasRoute(e)}clearRoutes(){bt(this.#e)}buildPath(t,n,r){if(t===e.l.UNKNOWN_ROUTE)return typeof n?.path==`string`?n.path:``;let i=Object.hasOwn(this.#e.config.defaultParams,t)?{...this.#e.config.defaultParams[t],...n}:n??{},a=typeof this.#e.config.encoders[t]==`function`?this.#e.config.encoders[t]({...i}):i;return this.#e.matcher.buildPath(t,a,this.#i(r))}matchPath(e,t){let n=t,r=this.#e.matcher.match(e);if(!r)return;let{name:i,params:a,meta:o}=Lt(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=gt(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 Lt({segments:n,params:t,meta:this.#e.matcher.getMetaByName(e)},e)}isActiveRoute(t,n={},r=!1,i=!0){let a=this.#n.getState();if(!a)return!1;let o=a.name;if(o!==t&&!o.startsWith(`${t}.`)&&!t.startsWith(`${o}.`))return!1;let s=this.#e.config.defaultParams[t];if(r||o===t){let r={name:t,params:s?{...s,...n}:n,path:``,transition:e.o,context:{}};return this.#n.areStatesEqual(r,a,i)}let c=a.params;return ft(n,c)?!s||pt(s,c,n):!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?Ft(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 zt=new e.t(e.u.ROUTER_NOT_STARTED),Bt=new e.t(e.u.ROUTE_NOT_FOUND),Vt=new e.t(e.u.SAME_STATES),Ht=Promise.reject(zt),Ut=Promise.reject(Bt),Wt=Promise.reject(Vt);Ht.catch(()=>{}),Ut.catch(()=>{}),Wt.catch(()=>{});function Gt(e,t,n,r,i){Object.freeze(n),Object.freeze(r);let a={phase:`activating`,reason:`success`,segments:Object.freeze({deactivated:n,activated:r,intersection:i})};return e?.name!==void 0&&(a.from=e.name),t.reload!==void 0&&(a.reload=t.reload),t.redirected!==void 0&&(a.redirected=t.redirected),Object.freeze(a)}function Kt({signal:e,...t}){return t}function qt(t,n){let{toState:r,fromState:i,opts:a,toDeactivate:o,toActivate:s,intersection:c}=n;if(r.name!==e.l.UNKNOWN_ROUTE&&!t.hasRoute(r.name)){let n=new e.t(e.u.ROUTE_NOT_FOUND,{routeName:r.name});throw t.sendTransitionFail(r,i,n),n}if(i)for(let e of o)!s.includes(e)&&n.canDeactivateFunctions.has(e)&&t.clearCanDeactivate(e);r.transition=Gt(i,a,o,s,c);let l=Object.freeze(r);t.setState(l);let u=a.signal===void 0?a:Kt(a);return t.sendTransitionDone(l,i,u),l}function Jt(t,n,r,i){let a=n;a.code===e.u.TRANSITION_CANCELLED||a.code===e.u.ROUTE_NOT_FOUND||t.sendTransitionFail(r,i,a)}function Y(t,n,r){if(t instanceof DOMException&&t.name===`AbortError`)throw new e.t(e.u.TRANSITION_CANCELLED);Yt(t,n,r)}function Yt(t,n,r){throw t instanceof e.t?(t.setCode(n),t):new e.t(n,Zt(t,r))}const Xt=new Set([`code`,`segment`,`path`,`redirect`]);function Zt(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))Xt.has(n)||(t[n]=r);return{...n,...t}}return n}async function Qt(t,n,r){let i;try{i=await t}catch(e){Y(e,n,r);return}if(!i)throw new e.t(n,{segment:r})}async function $t(t,n,r,i,a,o,s,c,l,u){await Qt(l,r,u);for(let l=c;l<n.length;l++){if(!s())throw new e.t(e.u.TRANSITION_CANCELLED);let c=n[l],u=t.get(c);if(!u)continue;let d=!1;try{d=u(i,a,o)}catch(e){Y(e,r,c)}if(d instanceof Promise){await Qt(d,r,c);continue}if(!d)throw new e.t(r,{segment:c})}}async function en(t,n,r,i,a,o,s,c,l){if(await t,!c())throw new e.t(e.u.TRANSITION_CANCELLED);let u=l();if(u!==void 0&&(await u,!c()))throw new e.t(e.u.TRANSITION_CANCELLED);if(i){let t=X(n,r,e.u.CANNOT_ACTIVATE,a,o,s,c);if(t!==void 0&&await t,!c())throw new e.t(e.u.TRANSITION_CANCELLED)}}function tn(t,n,r,i,a,o,s,c,l,u,d){if(a){let a=X(t,r,e.u.CANNOT_DEACTIVATE,s,c,l,u);if(a!==void 0)return en(a,n,i,o,s,c,l,u,d)}if(!u())throw new e.t(e.u.TRANSITION_CANCELLED);let f=d();if(f!==void 0)return nn(f,o?n:void 0,i,s,c,l,u);if(o)return X(n,i,e.u.CANNOT_ACTIVATE,s,c,l,u)}async function nn(t,n,r,i,a,o,s){if(await t,!s())throw new e.t(e.u.TRANSITION_CANCELLED);if(n!==void 0){let t=X(n,r,e.u.CANNOT_ACTIVATE,i,a,o,s);if(t!==void 0&&await t,!s())throw new e.t(e.u.TRANSITION_CANCELLED)}}function X(t,n,r,i,a,o,s){for(let[c,l]of n.entries()){if(!s())throw new e.t(e.u.TRANSITION_CANCELLED);let u=t.get(l);if(!u)continue;let d=!1;try{d=u(i,a,o)}catch(e){Y(e,r,l)}if(d instanceof Promise)return $t(t,n,r,i,a,o,s,c+1,d,l);if(!d)throw new e.t(r,{segment:l})}}const rn=[e.l.UNKNOWN_ROUTE];Object.freeze(rn);const an={replace:!0};Object.freeze(an);function on(t,n){return n?.name===e.l.UNKNOWN_ROUTE&&!t.replace?{...t,replace:!0}:t}function sn(e,t,n){return!!e&&!t.reload&&!t.force&&e.path===n.path}var cn=class{lastSyncResolved=!1;lastSyncRejected=!1;#e;#t=null;#n=0;setDependencies(e){this.#e=e}navigate(t,n,r){this.lastSyncResolved=!1;let i=this.#e;if(!i.canNavigate())return this.lastSyncRejected=!0,Ht;let a,o,s=!1,c=null;try{if(a=i.buildNavigateState(t,n),!a)return i.emitTransitionError(void 0,i.getState(),Bt),this.lastSyncRejected=!0,Ut;if(o=i.getState(),r=on(r,o),sn(o,r,a))return i.emitTransitionError(a,o,Vt),this.lastSyncRejected=!0,Wt;this.#s(r.signal);let l=++this.#n;if(i.startTransition(a,o),s=!0,this.#n!==l)throw new e.t(e.u.TRANSITION_CANCELLED);let[u,d]=i.getLifecycleFunctions(),f=a.name===e.l.UNKNOWN_ROUTE,p=J(a,o),{toDeactivate:m,toActivate:h,intersection:g}=p,ee=o&&!r.forceDeactivate&&m.length>0,te=!f&&h.length>0,_=u.size>0||d.size>0,v=a;if(!_){let e=this.#a(v,o,l,r,p,u);if(e!==void 0)return e}if(_){c=new AbortController,this.#t=c;let t=()=>this.#n===l&&i.isActive(),n=c.signal,s=tn(u,d,m,h,!!ee,te,a,o,n,t,()=>{if(i.sendLeaveApprove(v,o),i.hasLeaveListeners())return i.awaitLeaveListeners(v,o,n)});if(s!==void 0)return this.#r(s,{toState:a,fromState:o,opts:r,toDeactivate:m,toActivate:h,intersection:g,canDeactivateFunctions:u},c,l);if(!t())throw new e.t(e.u.TRANSITION_CANCELLED);this.#o(c)}return this.lastSyncResolved=!0,Promise.resolve(qt(i,{toState:a,fromState:o,opts:r,toDeactivate:m,toActivate:h,intersection:g,canDeactivateFunctions:u}))}catch(e){return this.#i(e,c,s,a,o),Promise.reject(e)}}navigateToDefault(t){let n=this.#e;if(!n.getOptions().defaultRoute)return Promise.reject(new e.t(e.u.ROUTE_NOT_FOUND,{routeName:`defaultRoute not configured`}));let r,i;try{({route:r,params:i}=n.resolveDefault())}catch(e){return Promise.reject(e)}return r?this.navigate(r,i,t):Promise.reject(new e.t(e.u.ROUTE_NOT_FOUND,{routeName:`defaultRoute resolved to empty`}))}navigateToNotFound(t){this.#s();let n=this.#e.getState(),r=n?U(n.name).toReversed():[];Object.freeze(r);let i={deactivated:r,activated:rn,intersection:``};Object.freeze(i);let a={phase:`activating`,...n&&{from:n.name},reason:`success`,segments:i};Object.freeze(a);let o={name:e.l.UNKNOWN_ROUTE,params:e.s,path:t,transition:a,context:{}};return Object.freeze(o),this.#e.setState(o),this.#e.emitTransitionSuccess(o,n,an),o}abortCurrentNavigation(){this.#t?.abort(new e.t(e.u.TRANSITION_CANCELLED)),this.#t=null}async#r(t,n,r,i){let a=this.#e,o=()=>this.#n===i&&!r.signal.aborted&&a.isActive();try{if(n.opts.signal){if(n.opts.signal.aborted)throw new e.t(e.u.TRANSITION_CANCELLED,{reason:n.opts.signal.reason});n.opts.signal.addEventListener(`abort`,()=>{r.abort(n.opts.signal?.reason)},{once:!0,signal:r.signal})}if(await t,!o())throw new e.t(e.u.TRANSITION_CANCELLED);return qt(a,n)}catch(e){throw Jt(a,e,n.toState,n.fromState),e}finally{this.#o(r)}}#i(e,t,n,r,i){t&&this.#o(t),n&&r&&Jt(this.#e,e,r,i)}#a(t,n,r,i,a,o){let s=this.#e;if(s.sendLeaveApprove(t,n),s.hasLeaveListeners()){let e=new AbortController,c=s.awaitLeaveListeners(t,n,e.signal);if(c!==void 0)return this.#t=e,this.#r(c,{toState:t,fromState:n,opts:i,toDeactivate:a.toDeactivate,toActivate:a.toActivate,intersection:a.intersection,canDeactivateFunctions:o},e,r)}if(this.#n!==r)throw new e.t(e.u.TRANSITION_CANCELLED)}#o(e){e.abort(),this.#t===e&&(this.#t=null)}#s(t){if(this.#e.isTransitioning()&&(n.logger.warn(`router.navigate`,`Concurrent navigation detected on shared router instance. For SSR, use cloneRouter() to create isolated instance per request.`),this.#t?.abort(new e.t(e.u.TRANSITION_CANCELLED)),this.#e.cancelNavigation()),t?.aborted)throw new e.t(e.u.TRANSITION_CANCELLED,{reason:t.reason})}};const ln={replace:!0};Object.freeze(ln);var un=class{#e;setDependencies(e){this.#e=e}async start(t){let n=this.#e,r=n.getOptions(),i=n.matchPath(t);if(!i&&!r.allowNotFound){let r=new e.t(e.u.ROUTE_NOT_FOUND,{path:t});throw n.emitTransitionError(void 0,void 0,r),r}return n.completeStart(),i?n.navigate(i.name,i.params,ln):n.navigateToNotFound(t)}stop(){this.#e.clearState()}};function Z(e){return e instanceof Error?e:Error(String(e))}function dn(e,t){return Promise.allSettled(e).then(e=>{if(t!==void 0)throw Z(t);let n=e.find(e=>e.status===`rejected`);if(n!==void 0)throw Z(n.reason)})}var Q=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(e.d.ROUTER_START)}emitRouterStop(){this.#t.emit(e.d.ROUTER_STOP)}emitTransitionStart(t,n){this.#t.emit(e.d.TRANSITION_START,t,n)}emitTransitionSuccess(t,n,r){this.#t.emit(e.d.TRANSITION_SUCCESS,t,n,r)}emitTransitionError(t,n,r){this.#t.emit(e.d.TRANSITION_ERROR,t,n,r)}emitTransitionCancel(t,n){this.#t.emit(e.d.TRANSITION_CANCEL,t,n)}emitTransitionLeaveApprove(t,n){this.#t.emit(e.d.TRANSITION_LEAVE_APPROVE,t,n)}sendStart(){this.#e.send(c.START)}sendStop(){this.#e.send(c.STOP)}sendDispose(){this.#e.send(c.DISPOSE)}sendStarted(){this.#e.send(c.STARTED)}sendNavigate(e,t){this.#r=e,this.#e.forceState(s.TRANSITION_STARTED),this.emitTransitionStart(e,t)}sendComplete(e,t,n={}){this.#e.forceState(s.READY),this.emitTransitionSuccess(e,t,n),this.#r===e&&(this.#r=void 0)}sendLeaveApprove(e,t){this.#e.forceState(s.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(c.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(c.CANCEL),this.#r===n&&(this.#r=void 0)}canBeginTransition(){return this.#e.canSend(c.NAVIGATE)}canStart(){return this.#e.canSend(c.START)}canCancel(){return this.#e.canSend(c.CANCEL)}isActive(){let e=this.#e.getState();return e!==s.IDLE&&e!==s.DISPOSED}isDisposed(){return this.#e.getState()===s.DISPOSED}isTransitioning(){let e=this.#e.getState();return e===s.TRANSITION_STARTED||e===s.LEAVE_APPROVED}isLeaveApproved(){return this.#e.getState()===s.LEAVE_APPROVED}isReady(){return this.#e.getState()===s.READY}getCurrentToState(){return this.#r}addEventListener(e,t){return this.#t.on(e,t)}subscribe(t){return this.#t.on(e.d.TRANSITION_SUCCESS,(e,n)=>{t({route:e,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 Z(a);return}return dn(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(s.STARTING,c.STARTED,()=>{this.emitRouterStart()}),e.on(s.READY,c.STOP,()=>{this.emitRouterStop()});let t=()=>{let e=this.#i;e!==void 0&&this.emitTransitionCancel(e,this.#a)};e.on(s.TRANSITION_STARTED,c.CANCEL,t),e.on(s.LEAVE_APPROVED,c.CANCEL,t),e.on(s.LEAVE_APPROVED,c.FAIL,()=>{this.#s()}),e.on(s.STARTING,c.FAIL,()=>{this.#s()}),e.on(s.READY,c.FAIL,()=>{this.#s()}),e.on(s.TRANSITION_STARTED,c.FAIL,()=>{this.#s()})}};const fn=new e.t(e.u.ROUTER_ALREADY_STARTED),pn=new Set([`all`,`warn-error`,`error-only`]);function mn(e){return typeof e==`string`&&pn.has(e)}function hn(e){return typeof e==`string`?`"${e}"`:typeof e==`object`?JSON.stringify(e):String(e)}function gn(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: ${hn(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 _n=class{router;options;limits;dependenciesStore;state;routes;routeLifecycle;plugins;navigation;lifecycle;eventBus;constructor(e){this.router=e.router,this.options=e.options,this.limits=e.limits,this.dependenciesStore=e.dependenciesStore,this.state=e.state,this.routes=e.routes,this.routeLifecycle=e.routeLifecycle,this.plugins=e.plugins,this.navigation=e.navigation,this.lifecycle=e.lifecycle,this.eventBus=e.eventBus}wireLimits(){this.dependenciesStore.limits=this.limits,this.plugins.setLimits(this.limits),this.eventBus.setLimits({maxListeners:this.limits.maxListeners,warnListeners:this.limits.warnListeners,maxEventDepth:this.limits.maxEventDepth}),this.routeLifecycle.setLimits(this.limits)}wireRouteLifecycleDeps(){let e={compileFactory:this.createCompileFactory()};this.routeLifecycle.setDependencies(e),this.routeLifecycle.setValidatorGetter(()=>{try{return t.r(this.router).validator}catch{return null}})}wireRoutesDeps(){this.routes.setDependencies({addActivateGuard:(e,t)=>{this.routeLifecycle.addCanActivate(e,t,!0)},addDeactivateGuard:(e,t)=>{this.routeLifecycle.addCanDeactivate(e,t,!0)},makeState:(e,t,n,r)=>this.state.makeState(e,t,n,r),getState:()=>this.state.get(),areStatesEqual:(e,t,n)=>this.state.areStatesEqual(e,t,n),getDependency:e=>this.dependenciesStore.dependencies[e],forwardState:(e,n)=>{let r=t.r(this.router);return r.validator?.routes.validateStateBuilderArgs(e,n,`forwardState`),r.forwardState(e,n)}}),this.routes.setLifecycleNamespace(this.routeLifecycle)}wirePluginsDeps(){let e={addEventListener:(e,t)=>this.eventBus.addEventListener(e,t),canNavigate:()=>this.eventBus.canBeginTransition(),compileFactory:this.createCompileFactory()};this.plugins.setDependencies(e),this.plugins.setValidatorGetter(()=>{try{return t.r(this.router).validator}catch{return null}})}wireNavigationDeps(){this.navigation.setDependencies({getOptions:()=>this.options.get(),hasRoute:e=>this.routes.hasRoute(e),getState:()=>this.state.get(),setState:e=>{this.state.set(e)},buildNavigateState:(n,r)=>{let i=t.r(this.router);i.validator?.routes.validateStateBuilderArgs(n,r,`navigate`);let a=i.forwardState(n,r),o=a.name,s=e.i(a.params),c=this.routes.getMetaForState(o);if(c===void 0)return;let l=i.buildPath(o,s);return this.state.makeState(o,s,l,c,!0)},resolveDefault:()=>{let e=this.options.get(),n=t.r(this.router),r=F(e.defaultRoute,e=>this.dependenciesStore.dependencies[e]),i=F(e.defaultParams,e=>this.dependenciesStore.dependencies[e]);return typeof e.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(),navigate:(e,t,n)=>this.navigation.navigate(e,t,n),navigateToNotFound:e=>this.navigation.navigateToNotFound(e),clearState:()=>{this.state.set(void 0)},matchPath:e=>this.routes.matchPath(e,this.options.get()),completeStart:()=>{this.eventBus.sendStarted()},emitTransitionError:(e,t,n)=>{this.eventBus.sendFail(e,t,n)}})}wireStateDeps(){this.state.setDependencies({getDefaultParams:()=>this.routes.getStore().config.defaultParams,buildPath:(e,n)=>t.r(this.router).buildPath(e,n),getUrlParams:e=>this.routes.getUrlParams(e)})}createCompileFactory(){let{router:e,dependenciesStore:t}=this;return n=>n(e,e=>t.dependencies[e])}};function vn(e){e.wireLimits(),e.wireRouteLifecycleDeps(),e.wireRoutesDeps(),e.wirePluginsDeps(),e.wireNavigationDeps(),e.wireLifecycleDeps(),e.wireStateDeps()}const yn=Object.freeze({});var bn=class r{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;constructor(r=[],i={},a={}){i.logger&&gn(i.logger)&&(n.logger.configure(i.logger),delete i.logger),et.validateOptionsIsObject(i),d(a),r.length>0&&f(r),this.#e=new et(i),this.#t=e.n(i.limits),this.#n=p(a),this.#r=new it,this.#i=new Rt(r,xn(this.#e.get())),this.#a=new ut,this.#o=new ct,this.#s=new cn,this.#c=new un,this.#l=new Q({routerFSM:u(),emitter:new o({onListenerError:(e,t)=>{n.logger.error(`Router`,`Error in listener for ${e}:`,t)},onListenerWarn:(e,t)=>{n.logger.warn(`router.addEventListener`,`Event "${e}" has ${t} listeners — possible memory leak`)}})}),vn(new _n({router:this,options:this.#e,limits:this.#t,dependenciesStore:this.#n,state:this.#r,routes:this.#i,routeLifecycle:this.#a,plugins:this.#o,navigation:this.#s,lifecycle:this.#c,eventBus:this.#l}));let s=new Map;t.i(this,{makeState:(e,t,n,r)=>this.#r.makeState(e,t,n,r),forwardState:t.n(`forwardState`,(e,t)=>this.#i.forwardState(e,t),s),buildStateResolved:(e,t)=>this.#i.buildStateResolved(e,t),matchPath:(e,t)=>this.#i.matchPath(e,t),getOptions:()=>this.#e.get(),addEventListener:(e,t)=>this.#l.addEventListener(e,t),buildPath:t.n(`buildPath`,(t,n)=>this.#i.buildPath(t,n??e.s,this.#e.get()),s),emitTransitionError:e=>{this.#l.sendFailSafe(void 0,this.#r.get(),e)},start:t.t(`start`,e=>this.#c.start(e),s),interceptors:s,setRootPath:e=>{this.#i.setRootPath(e)},getRootPath:()=>this.#i.getStore().rootPath,getTree:()=>this.#i.getStore().tree,isDisposed:()=>this.#l.isDisposed(),validator:null,dependenciesGetStore:()=>this.#n,cloneOptions:()=>({...this.#e.get()}),cloneDependencies:()=>({...this.#n.dependencies}),getLifecycleFactories:()=>this.#a.getFactories(),getPluginFactories:()=>this.#o.getAll(),routeGetStore:()=>this.#i.getStore(),getStateName:()=>this.#r.get()?.name,isTransitioning:()=>this.#l.isTransitioning(),clearState:()=>{this.#r.set(void 0)},setState:e=>{this.#r.set(e)},routerExtensions:[],contextClaimRecords:new Set}),this.isActiveRoute=this.isActiveRoute.bind(this),this.buildPath=this.buildPath.bind(this),this.getState=this.getState.bind(this),this.getPreviousState=this.getPreviousState.bind(this),this.areStatesEqual=this.areStatesEqual.bind(this),this.shouldUpdateNode=this.shouldUpdateNode.bind(this),this.isActive=this.isActive.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.dispose=this.dispose.bind(this),this.canNavigateTo=this.canNavigateTo.bind(this),this.usePlugin=this.usePlugin.bind(this),this.navigate=this.navigate.bind(this),this.navigateToDefault=this.navigateToDefault.bind(this),this.navigateToNotFound=this.navigateToNotFound.bind(this),this.subscribe=this.subscribe.bind(this),this.subscribeLeave=this.subscribeLeave.bind(this),this.isLeaveApproved=this.isLeaveApproved.bind(this)}isActiveRoute(e,r,i,a){return t.r(this).validator?.routes.validateIsActiveRouteArgs(e,r,i,a),t.r(this).validator?.routes.validateRouteName(e,`isActiveRoute`),e===``?(n.logger.warn(`real-router`,`isActiveRoute("") called with empty string. Root node is not considered a parent of any route.`),!1):this.#i.isActiveRoute(e,r,i,a)}buildPath(n,r){let i=t.r(this);return i.validator?.routes.validateBuildPathArgs(n),i.validator?.navigation.validateParams(r,`buildPath`),i.buildPath(n,e.i(r))}getState(){return this.#r.get()}getPreviousState(){return this.#r.getPrevious()}areStatesEqual(e,n,r=!0){return t.r(this).validator?.state.validateAreStatesEqualArgs(e,n,r),this.#r.areStatesEqual(e,n,r)}shouldUpdateNode(e){return t.r(this).validator?.routes.validateShouldUpdateNodeArgs(e),Rt.shouldUpdateNode(e)}isActive(){return this.#l.isActive()}start(e){if(!this.#l.canStart())return Promise.reject(fn);t.r(this).validator?.navigation.validateStartArgs(e),this.#l.sendStart();let n=t.r(this).start(e).catch(e=>{throw this.#l.isReady()&&(this.#c.stop(),this.#l.sendStop()),e});return r.#d(n),n}stop(){return this.#s.abortCurrentNavigation(),this.#l.sendCancelIfPossible(this.#r.get()),!this.#l.isReady()&&!this.#l.isTransitioning()?this:(this.#c.stop(),this.#l.sendStop(),this)}dispose(){if(this.#l.isDisposed())return;this.#s.abortCurrentNavigation(),this.#l.sendCancelIfPossible(this.#r.get()),(this.#l.isReady()||this.#l.isTransitioning())&&(this.#c.stop(),this.#l.sendStop()),this.#l.sendDispose(),this.#l.clearAll(),this.#o.disposeAll();let e=t.r(this);for(let t of e.routerExtensions)for(let e of t.keys)delete this[e];e.routerExtensions.length=0,e.contextClaimRecords.clear(),this.#i.clearRoutes(),this.#a.clearAll(),this.#r.reset(),this.#n.dependencies=Object.create(null),this.#f()}canNavigateTo(e,n){let r=t.r(this);if(r.validator?.routes.validateRouteName(e,`canNavigateTo`),r.validator?.navigation.validateParams(n,`canNavigateTo`),!this.#i.hasRoute(e))return!1;let{name:i,params:a}=r.forwardState(e,n??{}),o=this.#r.makeState(i,a),s=this.#r.get(),{toDeactivate:c,toActivate:l}=J(o,s);return this.#a.canNavigateTo(c,l,o,s)}usePlugin(...e){let n=e.filter(Boolean);if(n.length===0)return()=>{};let r=t.r(this);r.validator?.plugins.validatePluginLimit(this.#o.count(),this.#t);for(let e of n)r.validator?.plugins.validateNoDuplicatePlugins(e,this.#o.getAll());return this.#o.use(...n)}subscribe(e){return Q.validateSubscribeListener(e),this.#l.subscribe(e)}subscribeLeave(e){return Q.validateSubscribeLeaveListener(e),this.#l.subscribeLeave(e)}isLeaveApproved(){return this.#l.isLeaveApproved()}navigate(n,i,a){let o=t.r(this);o.validator?.navigation.validateNavigateArgs(n),o.validator?.navigation.validateParams(i,`navigate`);let s=a??yn;o.validator?.navigation.validateNavigationOptions(s,`navigate`);let c=this.#s.navigate(n,i??e.s,s);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:r.#d(c),c}navigateToDefault(e){let n=t.r(this);n.validator?.navigation.validateNavigateToDefaultArgs(e);let i=e??yn;n.validator?.navigation.validateNavigationOptions(i,`navigateToDefault`);let a=this.#s.navigateToDefault(i);return this.#s.lastSyncResolved?this.#s.lastSyncResolved=!1:this.#s.lastSyncRejected?this.#s.lastSyncRejected=!1:r.#d(a),a}navigateToNotFound(t){if(!this.#l.isActive())throw new e.t(e.u.ROUTER_NOT_STARTED);if(t!==void 0&&typeof t!=`string`)throw TypeError(`[router.navigateToNotFound] path must be a string, got ${typeof t}`);let n=t??this.#r.get().path;return this.#s.navigateToNotFound(n)}static#u=t=>{t instanceof e.t&&(t.code===e.u.SAME_STATES||t.code===e.u.TRANSITION_CANCELLED||t.code===e.u.ROUTER_NOT_STARTED||t.code===e.u.ROUTE_NOT_FOUND)||n.logger.error(`router.navigate`,`Unexpected navigation error`,t)};static#d(e){e.catch(r.#u)}#f(){this.navigate=$,this.navigateToDefault=$,this.navigateToNotFound=$,this.start=$,this.stop=$,this.usePlugin=$,this.subscribe=$,this.subscribeLeave=$,this.canNavigateTo=$}};function $(){throw new e.t(e.u.ROUTER_DISPOSED)}function xn(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 _t}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return Ye}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return xt}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return ht}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return mt}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return bn}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return f}});
|
|
6
|
-
//# sourceMappingURL=Router-n8xC-aPB.js.map
|