@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.
Files changed (77) hide show
  1. package/dist/cjs/Router-B2tmtNiM.d.ts +353 -0
  2. package/dist/cjs/Router-CVNR-dug.js +6 -0
  3. package/dist/cjs/Router-CVNR-dug.js.map +1 -0
  4. package/dist/cjs/RouterError-BkgjTHQg.js +2 -0
  5. package/dist/cjs/RouterError-BkgjTHQg.js.map +1 -0
  6. package/dist/cjs/RouterValidator-TUi8eT8Q.d.ts +112 -0
  7. package/dist/cjs/api.d.ts +17 -12
  8. package/dist/cjs/api.js +2 -1
  9. package/dist/cjs/api.js.map +1 -1
  10. package/dist/cjs/getPluginApi-BXrM_Nwv.js +2 -0
  11. package/dist/cjs/getPluginApi-BXrM_Nwv.js.map +1 -0
  12. package/dist/cjs/index.d.ts +206 -196
  13. package/dist/cjs/index.js +2 -1
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/internals-na15rxo_.js +2 -0
  16. package/dist/cjs/internals-na15rxo_.js.map +1 -0
  17. package/dist/cjs/utils.d.ts +6 -3
  18. package/dist/cjs/utils.js +2 -1
  19. package/dist/cjs/utils.js.map +1 -1
  20. package/dist/cjs/validation.d.ts +153 -152
  21. package/dist/cjs/validation.js +1 -1
  22. package/dist/esm/Router-4JRfQLMM.d.mts +353 -0
  23. package/dist/esm/Router-C_k70gHi.mjs +6 -0
  24. package/dist/esm/Router-C_k70gHi.mjs.map +1 -0
  25. package/dist/esm/RouterError-D0RlQE_5.mjs +2 -0
  26. package/dist/esm/RouterError-D0RlQE_5.mjs.map +1 -0
  27. package/dist/esm/RouterValidator-DphcVMEp.d.mts +112 -0
  28. package/dist/esm/api.d.mts +17 -12
  29. package/dist/esm/api.mjs +2 -1
  30. package/dist/esm/api.mjs.map +1 -1
  31. package/dist/esm/getPluginApi-D0bBPuLp.mjs +2 -0
  32. package/dist/esm/getPluginApi-D0bBPuLp.mjs.map +1 -0
  33. package/dist/esm/index.d.mts +206 -196
  34. package/dist/esm/index.mjs +2 -1
  35. package/dist/esm/index.mjs.map +1 -1
  36. package/dist/esm/internals-CCymabFj.mjs +2 -0
  37. package/dist/{cjs/validation.js.map → esm/internals-CCymabFj.mjs.map} +1 -1
  38. package/dist/esm/utils.d.mts +6 -3
  39. package/dist/esm/utils.mjs +2 -1
  40. package/dist/esm/utils.mjs.map +1 -1
  41. package/dist/esm/validation.d.mts +153 -152
  42. package/dist/esm/validation.mjs +1 -1
  43. package/package.json +5 -7
  44. package/src/Router.ts +4 -6
  45. package/src/api/getPluginApi.ts +2 -3
  46. package/src/helpers.ts +9 -7
  47. package/src/index.ts +0 -1
  48. package/src/internals.ts +4 -5
  49. package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +0 -1
  50. package/src/namespaces/OptionsNamespace/constants.ts +1 -0
  51. package/src/namespaces/OptionsNamespace/helpers.ts +0 -1
  52. package/src/namespaces/RouterLifecycleNamespace/types.ts +1 -3
  53. package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +3 -3
  54. package/src/namespaces/RoutesNamespace/types.ts +2 -2
  55. package/src/namespaces/StateNamespace/StateNamespace.ts +30 -34
  56. package/src/namespaces/StateNamespace/helpers.ts +8 -27
  57. package/src/stateMetaStore.ts +15 -0
  58. package/src/transitionPath.ts +13 -16
  59. package/src/types/RouterValidator.ts +0 -1
  60. package/src/wiring/RouterWiringBuilder.ts +1 -1
  61. package/dist/cjs/Router-B-Pev7K2.d.ts +0 -46
  62. package/dist/cjs/RouterValidator-mx2Zooya.d.ts +0 -136
  63. package/dist/cjs/index.d-y2b-8_3Y.d.ts +0 -236
  64. package/dist/cjs/metafile-cjs.json +0 -1
  65. package/dist/esm/Router-B-Pev7K2.d.mts +0 -46
  66. package/dist/esm/RouterValidator-mx2Zooya.d.mts +0 -136
  67. package/dist/esm/chunk-5QXFUUDL.mjs +0 -1
  68. package/dist/esm/chunk-5QXFUUDL.mjs.map +0 -1
  69. package/dist/esm/chunk-HHIXK5UM.mjs +0 -1
  70. package/dist/esm/chunk-HHIXK5UM.mjs.map +0 -1
  71. package/dist/esm/chunk-MNRZAE7T.mjs +0 -1
  72. package/dist/esm/chunk-MNRZAE7T.mjs.map +0 -1
  73. package/dist/esm/chunk-QUUNDESP.mjs +0 -1
  74. package/dist/esm/chunk-QUUNDESP.mjs.map +0 -1
  75. package/dist/esm/index.d-y2b-8_3Y.d.mts +0 -236
  76. package/dist/esm/metafile-esm.json +0 -1
  77. 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, getUrlParamsFromMeta } from "./helpers";
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, MP extends Params = Params>():
54
- | State<P, MP>
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, MP 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, MP> {
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, MP> = {
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 stateMeta = (state1.meta?.params ?? state2.meta?.params) as // NOSONAR -- narrowing from Params to RouteTreeStateMeta
169
- | RouteTreeStateMeta
170
- | undefined;
159
+ const urlParams = this.#getUrlParams(state1.name);
171
160
 
172
- const urlParams = stateMeta
173
- ? getUrlParamsFromMeta(stateMeta)
174
- : this.#getUrlParams(state1.name);
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 urlParams.every((param) =>
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
- return state1Keys.every(
189
- (param) =>
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
- return val1.every((value, i) => areParamValuesEqual(value, val2[i]));
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
+ }
@@ -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 = toState.meta?.params[name];
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 or meta.params requires full reload =====
343
- // Check if meta or meta.params is actually missing (not just empty)
344
- const toHasMeta = toState.meta?.params !== undefined;
345
- const fromHasMeta = fromState.meta?.params !== undefined;
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 (!toHasMeta && !fromHasMeta) {
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 &&
@@ -136,7 +136,6 @@ export interface RouterValidator {
136
136
  name: unknown,
137
137
  params: unknown,
138
138
  path: unknown,
139
- forceId: unknown,
140
139
  ) => void;
141
140
  validateAreStatesEqualArgs: (
142
141
  s1: unknown,
@@ -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, undefined, true);
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 };