@real-router/core 0.40.1 → 0.42.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-B2tmtNiM.d.ts +353 -0
- package/dist/cjs/Router-CVNR-dug.js +6 -0
- package/dist/cjs/Router-CVNR-dug.js.map +1 -0
- package/dist/cjs/RouterError-BkgjTHQg.js +2 -0
- package/dist/cjs/RouterError-BkgjTHQg.js.map +1 -0
- package/dist/cjs/RouterValidator-TUi8eT8Q.d.ts +112 -0
- package/dist/cjs/api.d.ts +17 -12
- package/dist/cjs/api.js +2 -1
- package/dist/cjs/api.js.map +1 -1
- package/dist/cjs/getPluginApi-BXrM_Nwv.js +2 -0
- package/dist/cjs/getPluginApi-BXrM_Nwv.js.map +1 -0
- package/dist/cjs/index.d.ts +206 -196
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internals-na15rxo_.js +2 -0
- package/dist/cjs/internals-na15rxo_.js.map +1 -0
- package/dist/cjs/utils.d.ts +6 -3
- package/dist/cjs/utils.js +2 -1
- package/dist/cjs/utils.js.map +1 -1
- package/dist/cjs/validation.d.ts +153 -152
- package/dist/cjs/validation.js +1 -1
- package/dist/esm/Router-4JRfQLMM.d.mts +353 -0
- package/dist/esm/Router-C_k70gHi.mjs +6 -0
- package/dist/esm/Router-C_k70gHi.mjs.map +1 -0
- package/dist/esm/RouterError-D0RlQE_5.mjs +2 -0
- package/dist/esm/RouterError-D0RlQE_5.mjs.map +1 -0
- package/dist/esm/RouterValidator-DphcVMEp.d.mts +112 -0
- package/dist/esm/api.d.mts +17 -12
- package/dist/esm/api.mjs +2 -1
- package/dist/esm/api.mjs.map +1 -1
- package/dist/esm/getPluginApi-D0bBPuLp.mjs +2 -0
- package/dist/esm/getPluginApi-D0bBPuLp.mjs.map +1 -0
- package/dist/esm/index.d.mts +206 -196
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/internals-CCymabFj.mjs +2 -0
- package/dist/{cjs/validation.js.map → esm/internals-CCymabFj.mjs.map} +1 -1
- package/dist/esm/utils.d.mts +6 -3
- package/dist/esm/utils.mjs +2 -1
- package/dist/esm/utils.mjs.map +1 -1
- package/dist/esm/validation.d.mts +153 -152
- package/dist/esm/validation.mjs +1 -1
- package/package.json +5 -7
- package/src/Router.ts +4 -6
- package/src/api/getPluginApi.ts +2 -3
- package/src/helpers.ts +9 -7
- package/src/index.ts +0 -1
- package/src/internals.ts +4 -5
- package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +0 -1
- package/src/namespaces/OptionsNamespace/constants.ts +1 -0
- package/src/namespaces/OptionsNamespace/helpers.ts +0 -1
- package/src/namespaces/RouterLifecycleNamespace/types.ts +1 -3
- package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +3 -3
- package/src/namespaces/RoutesNamespace/types.ts +2 -2
- package/src/namespaces/StateNamespace/StateNamespace.ts +30 -34
- package/src/namespaces/StateNamespace/helpers.ts +8 -27
- package/src/stateMetaStore.ts +15 -0
- package/src/transitionPath.ts +13 -16
- package/src/types/RouterValidator.ts +0 -1
- package/src/wiring/RouterWiringBuilder.ts +1 -1
- package/dist/cjs/Router-B-Pev7K2.d.ts +0 -46
- package/dist/cjs/RouterValidator-mx2Zooya.d.ts +0 -136
- package/dist/cjs/index.d-y2b-8_3Y.d.ts +0 -236
- package/dist/cjs/metafile-cjs.json +0 -1
- package/dist/esm/Router-B-Pev7K2.d.mts +0 -46
- package/dist/esm/RouterValidator-mx2Zooya.d.mts +0 -136
- package/dist/esm/chunk-5QXFUUDL.mjs +0 -1
- package/dist/esm/chunk-5QXFUUDL.mjs.map +0 -1
- package/dist/esm/chunk-HHIXK5UM.mjs +0 -1
- package/dist/esm/chunk-HHIXK5UM.mjs.map +0 -1
- package/dist/esm/chunk-MNRZAE7T.mjs +0 -1
- package/dist/esm/chunk-MNRZAE7T.mjs.map +0 -1
- package/dist/esm/chunk-QUUNDESP.mjs +0 -1
- package/dist/esm/chunk-QUUNDESP.mjs.map +0 -1
- package/dist/esm/index.d-y2b-8_3Y.d.mts +0 -236
- package/dist/esm/metafile-esm.json +0 -1
- package/dist/esm/validation.mjs.map +0 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// packages/core/src/namespaces/StateNamespace/StateNamespace.ts
|
|
2
2
|
|
|
3
|
-
import { areParamValuesEqual
|
|
3
|
+
import { areParamValuesEqual } from "./helpers";
|
|
4
4
|
import { EMPTY_PARAMS } from "../../constants";
|
|
5
5
|
import { freezeStateInPlace } from "../../helpers";
|
|
6
|
+
import { setStateMetaParams } from "../../stateMetaStore";
|
|
6
7
|
|
|
7
8
|
import type { StateNamespaceDependencies } from "./types";
|
|
8
9
|
import type { Params, State } from "@real-router/types";
|
|
@@ -15,11 +16,6 @@ import type { RouteTreeStateMeta } from "route-tree";
|
|
|
15
16
|
* Instance methods handle state storage, freezing, and creation.
|
|
16
17
|
*/
|
|
17
18
|
export class StateNamespace {
|
|
18
|
-
/**
|
|
19
|
-
* Auto-incrementing state ID for tracking navigation history.
|
|
20
|
-
*/
|
|
21
|
-
#stateId = 0;
|
|
22
|
-
|
|
23
19
|
/**
|
|
24
20
|
* Cached frozen state - avoids structuredClone on every getState() call.
|
|
25
21
|
*/
|
|
@@ -50,10 +46,8 @@ export class StateNamespace {
|
|
|
50
46
|
* The returned state is deeply frozen (immutable) for safety.
|
|
51
47
|
* Returns `undefined` if the router has not been started or has been stopped.
|
|
52
48
|
*/
|
|
53
|
-
get<P extends Params = Params
|
|
54
|
-
|
|
55
|
-
| undefined {
|
|
56
|
-
return this.#frozenState as State<P, MP> | undefined; // NOSONAR -- generic narrowing needed for public API
|
|
49
|
+
get<P extends Params = Params>(): State<P> | undefined {
|
|
50
|
+
return this.#frozenState as State<P> | undefined; // NOSONAR -- generic narrowing needed for public API
|
|
57
51
|
}
|
|
58
52
|
|
|
59
53
|
/**
|
|
@@ -84,7 +78,6 @@ export class StateNamespace {
|
|
|
84
78
|
this.#frozenState = undefined;
|
|
85
79
|
this.#previousState = undefined;
|
|
86
80
|
this.#urlParamsCache.clear();
|
|
87
|
-
this.#stateId = 0;
|
|
88
81
|
}
|
|
89
82
|
|
|
90
83
|
// =========================================================================
|
|
@@ -106,18 +99,13 @@ export class StateNamespace {
|
|
|
106
99
|
/**
|
|
107
100
|
* Creates a frozen state object for a route.
|
|
108
101
|
*/
|
|
109
|
-
makeState<P extends Params = Params
|
|
102
|
+
makeState<P extends Params = Params>(
|
|
110
103
|
name: string,
|
|
111
104
|
params?: P,
|
|
112
105
|
path?: string,
|
|
113
106
|
meta?: RouteTreeStateMeta,
|
|
114
|
-
forceId?: number,
|
|
115
107
|
skipFreeze?: boolean,
|
|
116
|
-
): State<P
|
|
117
|
-
const madeMeta = meta
|
|
118
|
-
? { id: forceId ?? ++this.#stateId, params: meta as unknown as MP }
|
|
119
|
-
: undefined;
|
|
120
|
-
|
|
108
|
+
): State<P> {
|
|
121
109
|
// Optimization: O(1) lookup instead of O(depth) ancestor iteration
|
|
122
110
|
const defaultParamsConfig = this.#deps.getDefaultParams();
|
|
123
111
|
const hasDefaultParams = Object.hasOwn(defaultParamsConfig, name);
|
|
@@ -133,13 +121,16 @@ export class StateNamespace {
|
|
|
133
121
|
mergedParams = { ...params };
|
|
134
122
|
}
|
|
135
123
|
|
|
136
|
-
const state: State<P
|
|
124
|
+
const state: State<P> = {
|
|
137
125
|
name,
|
|
138
126
|
params: mergedParams,
|
|
139
127
|
path: path ?? this.#deps.buildPath(name, params),
|
|
140
|
-
meta: madeMeta,
|
|
141
128
|
};
|
|
142
129
|
|
|
130
|
+
if (meta) {
|
|
131
|
+
setStateMetaParams(state, meta as unknown as Params);
|
|
132
|
+
}
|
|
133
|
+
|
|
143
134
|
return skipFreeze ? state : freezeStateInPlace(state);
|
|
144
135
|
}
|
|
145
136
|
|
|
@@ -165,17 +156,17 @@ export class StateNamespace {
|
|
|
165
156
|
}
|
|
166
157
|
|
|
167
158
|
if (ignoreQueryParams) {
|
|
168
|
-
const
|
|
169
|
-
| RouteTreeStateMeta
|
|
170
|
-
| undefined;
|
|
159
|
+
const urlParams = this.#getUrlParams(state1.name);
|
|
171
160
|
|
|
172
|
-
const urlParams
|
|
173
|
-
|
|
174
|
-
|
|
161
|
+
for (const urlParam of urlParams) {
|
|
162
|
+
if (
|
|
163
|
+
!areParamValuesEqual(state1.params[urlParam], state2.params[urlParam])
|
|
164
|
+
) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
175
168
|
|
|
176
|
-
return
|
|
177
|
-
areParamValuesEqual(state1.params[param], state2.params[param]),
|
|
178
|
-
);
|
|
169
|
+
return true;
|
|
179
170
|
}
|
|
180
171
|
|
|
181
172
|
const state1Keys = Object.keys(state1.params);
|
|
@@ -185,11 +176,16 @@ export class StateNamespace {
|
|
|
185
176
|
return false;
|
|
186
177
|
}
|
|
187
178
|
|
|
188
|
-
|
|
189
|
-
(
|
|
190
|
-
param in state2.params
|
|
191
|
-
areParamValuesEqual(state1.params[param], state2.params[param])
|
|
192
|
-
|
|
179
|
+
for (const param of state1Keys) {
|
|
180
|
+
if (
|
|
181
|
+
!(param in state2.params) ||
|
|
182
|
+
!areParamValuesEqual(state1.params[param], state2.params[param])
|
|
183
|
+
) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return true;
|
|
193
189
|
}
|
|
194
190
|
|
|
195
191
|
// =========================================================================
|
|
@@ -1,31 +1,5 @@
|
|
|
1
1
|
// packages/core/src/namespaces/StateNamespace/helpers.ts
|
|
2
2
|
|
|
3
|
-
import type { RouteTreeStateMeta } from "route-tree";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Extracts URL param names from RouteTreeStateMeta.
|
|
7
|
-
* This is an O(segments × params) operation but avoids tree traversal.
|
|
8
|
-
*/
|
|
9
|
-
export function getUrlParamsFromMeta(meta: RouteTreeStateMeta): string[] {
|
|
10
|
-
const urlParams: string[] = [];
|
|
11
|
-
|
|
12
|
-
for (const segmentName in meta) {
|
|
13
|
-
const paramMap = meta[segmentName];
|
|
14
|
-
|
|
15
|
-
for (const param in paramMap) {
|
|
16
|
-
if (paramMap[param] === "url") {
|
|
17
|
-
urlParams.push(param);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return urlParams;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Compares two parameter values for equality.
|
|
27
|
-
* Supports deep equality for arrays (common in route params like tags, ids).
|
|
28
|
-
*/
|
|
29
3
|
export function areParamValuesEqual(val1: unknown, val2: unknown): boolean {
|
|
30
4
|
if (val1 === val2) {
|
|
31
5
|
return true;
|
|
@@ -36,7 +10,14 @@ export function areParamValuesEqual(val1: unknown, val2: unknown): boolean {
|
|
|
36
10
|
return false;
|
|
37
11
|
}
|
|
38
12
|
|
|
39
|
-
|
|
13
|
+
// eslint-disable-next-line unicorn/no-for-loop -- hot path: for-of entries() allocates iterator per recursive call
|
|
14
|
+
for (let i = 0; i < val1.length; i++) {
|
|
15
|
+
if (!areParamValuesEqual(val1[i], val2[i])) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return true;
|
|
40
21
|
}
|
|
41
22
|
|
|
42
23
|
return false;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// packages/core/src/stateMetaStore.ts
|
|
2
|
+
|
|
3
|
+
import type { Params, State } from "@real-router/types";
|
|
4
|
+
|
|
5
|
+
const store = new WeakMap<State, Params>();
|
|
6
|
+
|
|
7
|
+
/** @internal */
|
|
8
|
+
export function getStateMetaParams(state: State): Params | undefined {
|
|
9
|
+
return store.get(state);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** @internal */
|
|
13
|
+
export function setStateMetaParams(state: State, params: Params): void {
|
|
14
|
+
store.set(state, params);
|
|
15
|
+
}
|
package/src/transitionPath.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// packages/core/src/transitionPath.ts
|
|
2
2
|
|
|
3
|
+
import { getStateMetaParams } from "./stateMetaStore";
|
|
4
|
+
|
|
3
5
|
import type { State } from "@real-router/types";
|
|
4
6
|
|
|
5
7
|
/**
|
|
@@ -96,10 +98,11 @@ function isPrimitive(value: unknown): value is PrimitiveParam {
|
|
|
96
98
|
*/
|
|
97
99
|
function segmentParamsEqual(
|
|
98
100
|
name: string,
|
|
101
|
+
toMetaParams: Record<string, unknown>,
|
|
99
102
|
toState: State,
|
|
100
103
|
fromState: State,
|
|
101
104
|
): boolean {
|
|
102
|
-
const keys =
|
|
105
|
+
const keys = toMetaParams[name];
|
|
103
106
|
|
|
104
107
|
if (!keys || typeof keys !== "object") {
|
|
105
108
|
return true;
|
|
@@ -125,6 +128,7 @@ function segmentParamsEqual(
|
|
|
125
128
|
* Finds the point where two state paths diverge based on segments and parameters.
|
|
126
129
|
* Compares both segment names and their parameters to find the first difference.
|
|
127
130
|
*
|
|
131
|
+
* @param toMetaParams - Cached meta.params from toState (avoids per-segment WeakMap lookup)
|
|
128
132
|
* @param toState - Target state
|
|
129
133
|
* @param fromState - Source state
|
|
130
134
|
* @param toStateIds - Segment IDs for target state
|
|
@@ -133,6 +137,7 @@ function segmentParamsEqual(
|
|
|
133
137
|
* @returns Index of first difference, or maxI if all checked segments match
|
|
134
138
|
*/
|
|
135
139
|
function pointOfDifference(
|
|
140
|
+
toMetaParams: Record<string, unknown>,
|
|
136
141
|
toState: State,
|
|
137
142
|
fromState: State,
|
|
138
143
|
toStateIds: string[],
|
|
@@ -148,7 +153,7 @@ function pointOfDifference(
|
|
|
148
153
|
return i;
|
|
149
154
|
}
|
|
150
155
|
|
|
151
|
-
if (!segmentParamsEqual(toSegment, toState, fromState)) {
|
|
156
|
+
if (!segmentParamsEqual(toSegment, toMetaParams, toState, fromState)) {
|
|
152
157
|
return i;
|
|
153
158
|
}
|
|
154
159
|
}
|
|
@@ -339,13 +344,12 @@ function computeTransitionPath(
|
|
|
339
344
|
};
|
|
340
345
|
}
|
|
341
346
|
|
|
342
|
-
// ===== FAST PATH 3: Missing meta
|
|
343
|
-
//
|
|
344
|
-
const
|
|
345
|
-
const
|
|
347
|
+
// ===== FAST PATH 3: Missing meta requires full reload =====
|
|
348
|
+
// Single WeakMap lookup per state, reused in pointOfDifference/segmentParamsEqual
|
|
349
|
+
const toMetaParams = getStateMetaParams(toState);
|
|
350
|
+
const fromMetaParams = getStateMetaParams(fromState);
|
|
346
351
|
|
|
347
|
-
if (!
|
|
348
|
-
// Both states missing meta.params - require full reload
|
|
352
|
+
if (!toMetaParams && !fromMetaParams) {
|
|
349
353
|
return {
|
|
350
354
|
intersection: EMPTY_INTERSECTION,
|
|
351
355
|
toActivate: nameToIDs(toState.name),
|
|
@@ -354,14 +358,12 @@ function computeTransitionPath(
|
|
|
354
358
|
}
|
|
355
359
|
|
|
356
360
|
// ===== STANDARD PATH: Routes with parameters =====
|
|
357
|
-
// Use original algorithm for complex cases with parameters
|
|
358
361
|
const toStateIds = nameToIDs(toState.name);
|
|
359
362
|
const fromStateIds = nameToIDs(fromState.name);
|
|
360
363
|
const maxI = Math.min(fromStateIds.length, toStateIds.length);
|
|
361
364
|
|
|
362
|
-
// Find where paths diverge based on segments and parameters
|
|
363
|
-
// not obvious validate toState and fromState
|
|
364
365
|
const i = pointOfDifference(
|
|
366
|
+
(toMetaParams ?? fromMetaParams) as Record<string, unknown>,
|
|
365
367
|
toState,
|
|
366
368
|
fromState,
|
|
367
369
|
toStateIds,
|
|
@@ -402,12 +404,7 @@ function computeTransitionPath(
|
|
|
402
404
|
export function getTransitionPath(
|
|
403
405
|
toState: State,
|
|
404
406
|
fromState?: State,
|
|
405
|
-
reload?: boolean,
|
|
406
407
|
): TransitionPath {
|
|
407
|
-
if (reload) {
|
|
408
|
-
return computeTransitionPath(toState, fromState);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
408
|
if (
|
|
412
409
|
cached1Result !== null &&
|
|
413
410
|
toState === cached1To &&
|
|
@@ -149,7 +149,7 @@ export class RouterWiringBuilder<
|
|
|
149
149
|
|
|
150
150
|
const path = ctx.buildPath(name, params);
|
|
151
151
|
|
|
152
|
-
return this.state.makeState(name, params, path, meta,
|
|
152
|
+
return this.state.makeState(name, params, path, meta, true);
|
|
153
153
|
},
|
|
154
154
|
resolveDefault: () => {
|
|
155
155
|
const options = this.options.get();
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { DefaultDependencies, Router as Router$1, Route, Options, Params, State, PluginFactory, Unsubscribe, SubscribeFn, NavigationOptions } from '@real-router/types';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Router class with integrated namespace architecture.
|
|
5
|
-
*
|
|
6
|
-
* All functionality is provided by namespace classes:
|
|
7
|
-
* - OptionsNamespace: getOptions (immutable)
|
|
8
|
-
* - DependenciesStore: get/set/remove dependencies
|
|
9
|
-
* - EventEmitter: subscribe
|
|
10
|
-
* - StateNamespace: state storage (getState, setState, getPreviousState)
|
|
11
|
-
* - RoutesNamespace: route tree operations
|
|
12
|
-
* - RouteLifecycleNamespace: canActivate/canDeactivate guards
|
|
13
|
-
* - PluginsNamespace: plugin lifecycle
|
|
14
|
-
* - NavigationNamespace: navigate
|
|
15
|
-
* - RouterLifecycleNamespace: start, stop, isStarted
|
|
16
|
-
*
|
|
17
|
-
* @internal This class implementation is internal. Use createRouter() instead.
|
|
18
|
-
*/
|
|
19
|
-
declare class Router<Dependencies extends DefaultDependencies = DefaultDependencies> implements Router$1<Dependencies> {
|
|
20
|
-
#private;
|
|
21
|
-
[key: string]: unknown;
|
|
22
|
-
/**
|
|
23
|
-
* @param routes - Route definitions
|
|
24
|
-
* @param options - Router options
|
|
25
|
-
* @param dependencies - DI dependencies
|
|
26
|
-
*/
|
|
27
|
-
constructor(routes?: Route<Dependencies>[], options?: Partial<Options>, dependencies?: Dependencies);
|
|
28
|
-
isActiveRoute(name: string, params?: Params, strictEquality?: boolean, ignoreQueryParams?: boolean): boolean;
|
|
29
|
-
buildPath(route: string, params?: Params): string;
|
|
30
|
-
getState<P extends Params = Params, MP extends Params = Params>(): State<P, MP> | undefined;
|
|
31
|
-
getPreviousState(): State | undefined;
|
|
32
|
-
areStatesEqual(state1: State | undefined, state2: State | undefined, ignoreQueryParams?: boolean): boolean;
|
|
33
|
-
shouldUpdateNode(nodeName: string): (toState: State, fromState?: State) => boolean;
|
|
34
|
-
isActive(): boolean;
|
|
35
|
-
start(startPath: string): Promise<State>;
|
|
36
|
-
stop(): this;
|
|
37
|
-
dispose(): void;
|
|
38
|
-
canNavigateTo(name: string, params?: Params): boolean;
|
|
39
|
-
usePlugin(...plugins: (PluginFactory<Dependencies> | false | null | undefined)[]): Unsubscribe;
|
|
40
|
-
subscribe(listener: SubscribeFn): Unsubscribe;
|
|
41
|
-
navigate(routeName: string, routeParams?: Params, options?: NavigationOptions): Promise<State>;
|
|
42
|
-
navigateToDefault(options?: NavigationOptions): Promise<State>;
|
|
43
|
-
navigateToNotFound(path?: string): State;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export { Router as R };
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { Params, RouteTreeState, LimitsConfig } from '@real-router/types';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Core-internal types + re-exports from @real-router/types.
|
|
5
|
-
*
|
|
6
|
-
* Factory types (PluginFactory, GuardFnFactory) and
|
|
7
|
-
* route config types (Route, RouteConfigUpdate) are canonical in @real-router/types
|
|
8
|
-
* and re-exported here for backward compatibility.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Immutable limits configuration type.
|
|
13
|
-
*/
|
|
14
|
-
type Limits = Readonly<LimitsConfig>;
|
|
15
|
-
/**
|
|
16
|
-
* Extended build result that includes segments for path building.
|
|
17
|
-
* Used internally to avoid duplicate getSegmentsByName calls.
|
|
18
|
-
*
|
|
19
|
-
* @param segments - Route segments from getSegmentsByName (typed as unknown[] for cross-package compatibility)
|
|
20
|
-
* @internal
|
|
21
|
-
*/
|
|
22
|
-
interface BuildStateResultWithSegments<P extends Params = Params> {
|
|
23
|
-
readonly state: RouteTreeState<P>;
|
|
24
|
-
readonly segments: readonly unknown[];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* RouterValidator interface - defines all validation methods used by the router.
|
|
29
|
-
*
|
|
30
|
-
* This interface is implemented by the validation plugin and injected into RouterInternals.
|
|
31
|
-
* When ctx.validator is null (default), validation is skipped.
|
|
32
|
-
* When ctx.validator is set (by validation plugin), all methods are called.
|
|
33
|
-
*
|
|
34
|
-
* All parameters use `unknown` type to avoid coupling to internal type names.
|
|
35
|
-
*/
|
|
36
|
-
interface RouterValidator {
|
|
37
|
-
/**
|
|
38
|
-
* Route validation methods
|
|
39
|
-
*/
|
|
40
|
-
routes: {
|
|
41
|
-
validateBuildPathArgs: (route: unknown) => void;
|
|
42
|
-
validateMatchPathArgs: (path: unknown) => void;
|
|
43
|
-
validateIsActiveRouteArgs: (name: unknown, params: unknown, strict: unknown, ignoreQP: unknown) => void;
|
|
44
|
-
validateShouldUpdateNodeArgs: (name: unknown) => void;
|
|
45
|
-
validateStateBuilderArgs: (name: unknown, params: unknown, caller: string) => void;
|
|
46
|
-
validateAddRouteArgs: (routes: unknown) => void;
|
|
47
|
-
validateRoutes: (routes: unknown[], tree: unknown) => void;
|
|
48
|
-
validateRemoveRouteArgs: (name: unknown) => void;
|
|
49
|
-
validateUpdateRouteBasicArgs: (name: unknown, updates: unknown) => void;
|
|
50
|
-
validateUpdateRoutePropertyTypes: (name: string, updates: unknown) => void;
|
|
51
|
-
validateUpdateRoute: (name: string, updates: unknown, tree: unknown) => void;
|
|
52
|
-
validateParentOption: (parent: unknown, tree: unknown) => void;
|
|
53
|
-
validateRouteName: (name: unknown, caller: string) => void;
|
|
54
|
-
throwIfInternalRoute: (name: unknown, caller: string) => void;
|
|
55
|
-
throwIfInternalRouteInArray: (routes: unknown[], caller: string) => void;
|
|
56
|
-
validateExistingRoutes: (store: unknown) => void;
|
|
57
|
-
validateForwardToConsistency: (store: unknown) => void;
|
|
58
|
-
validateSetRootPathArgs: (rootPath: unknown) => void;
|
|
59
|
-
guardRouteCallbacks: (route: unknown) => void;
|
|
60
|
-
guardNoAsyncCallbacks: (route: unknown) => void;
|
|
61
|
-
};
|
|
62
|
-
/**
|
|
63
|
-
* Options validation methods
|
|
64
|
-
*/
|
|
65
|
-
options: {
|
|
66
|
-
validateLimitValue: (name: string, value: unknown) => void;
|
|
67
|
-
validateLimits: (limits: unknown) => void;
|
|
68
|
-
validateOptions: (options: unknown, methodName: string) => void;
|
|
69
|
-
};
|
|
70
|
-
/**
|
|
71
|
-
* Dependencies validation methods
|
|
72
|
-
*/
|
|
73
|
-
dependencies: {
|
|
74
|
-
validateDependencyName: (name: unknown, caller: string) => void;
|
|
75
|
-
validateSetDependencyArgs: (name: unknown, value: unknown, caller: string) => void;
|
|
76
|
-
validateDependenciesObject: (deps: unknown, caller: string) => void;
|
|
77
|
-
validateDependencyExists: (name: string, store: unknown) => void;
|
|
78
|
-
validateDependencyLimit: (store: unknown, limits: unknown) => void;
|
|
79
|
-
validateDependenciesStructure: (store: unknown) => void;
|
|
80
|
-
validateDependencyCount: (store: unknown, methodName: string) => void;
|
|
81
|
-
validateCloneArgs: (dependencies: unknown) => void;
|
|
82
|
-
warnOverwrite: (name: string, methodName: string) => void;
|
|
83
|
-
warnBatchOverwrite: (keys: string[], methodName: string) => void;
|
|
84
|
-
warnRemoveNonExistent: (name: unknown) => void;
|
|
85
|
-
};
|
|
86
|
-
/**
|
|
87
|
-
* Plugin validation methods
|
|
88
|
-
*/
|
|
89
|
-
plugins: {
|
|
90
|
-
validatePluginLimit: (count: number, limits: unknown) => void;
|
|
91
|
-
validateNoDuplicatePlugins: (factory: unknown, factories: unknown[]) => void;
|
|
92
|
-
validatePluginKeys: (plugin: unknown) => void;
|
|
93
|
-
validateCountThresholds: (count: number) => void;
|
|
94
|
-
warnBatchDuplicates: (plugins: unknown[]) => void;
|
|
95
|
-
warnPluginMethodType: (methodName: string) => void;
|
|
96
|
-
warnPluginAfterStart: (methodName: string) => void;
|
|
97
|
-
validateAddInterceptorArgs: (method: unknown, fn: unknown) => void;
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* Lifecycle guard validation methods
|
|
101
|
-
*/
|
|
102
|
-
lifecycle: {
|
|
103
|
-
validateHandler: (handler: unknown, caller: string) => void;
|
|
104
|
-
validateNotRegistering: (name: string, guards: unknown, caller: string) => void;
|
|
105
|
-
validateHandlerLimit: (count: number, limits: unknown, caller: string) => void;
|
|
106
|
-
validateCountThresholds: (count: number, methodName: string) => void;
|
|
107
|
-
warnOverwrite: (name: string, type: string, methodName: string) => void;
|
|
108
|
-
warnAsyncGuardSync: (name: string, methodName: string) => void;
|
|
109
|
-
};
|
|
110
|
-
/**
|
|
111
|
-
* Navigation validation methods
|
|
112
|
-
*/
|
|
113
|
-
navigation: {
|
|
114
|
-
validateNavigateArgs: (name: unknown) => void;
|
|
115
|
-
validateNavigateToDefaultArgs: (options: unknown) => void;
|
|
116
|
-
validateNavigationOptions: (options: unknown, caller: string) => void;
|
|
117
|
-
validateParams: (params: unknown, methodName: string) => void;
|
|
118
|
-
validateStartArgs: (path: unknown) => void;
|
|
119
|
-
};
|
|
120
|
-
/**
|
|
121
|
-
* State validation methods
|
|
122
|
-
*/
|
|
123
|
-
state: {
|
|
124
|
-
validateMakeStateArgs: (name: unknown, params: unknown, path: unknown, forceId: unknown) => void;
|
|
125
|
-
validateAreStatesEqualArgs: (s1: unknown, s2: unknown, ignoreQP: unknown) => void;
|
|
126
|
-
};
|
|
127
|
-
/**
|
|
128
|
-
* Event bus validation methods
|
|
129
|
-
*/
|
|
130
|
-
eventBus: {
|
|
131
|
-
validateEventName: (name: unknown) => void;
|
|
132
|
-
validateListenerArgs: (name: unknown, cb: unknown) => void;
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export type { BuildStateResultWithSegments as B, Limits as L, RouterValidator as R };
|