@real-router/core 0.56.0 → 0.57.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 (108) hide show
  1. package/dist/cjs/Router-BSGzVINO.js +6 -0
  2. package/dist/cjs/Router-BSGzVINO.js.map +1 -0
  3. package/dist/cjs/api.d.ts +1 -1
  4. package/dist/cjs/api.js +1 -1
  5. package/dist/cjs/{cloneRouter-DRieJvam.js → cloneRouter-7z-60z_f.js} +2 -2
  6. package/dist/cjs/{cloneRouter-DRieJvam.js.map → cloneRouter-7z-60z_f.js.map} +1 -1
  7. package/dist/cjs/{index-C-i6vx5Y.d.ts → index-BWUmnecT.d.ts} +1 -2
  8. package/dist/cjs/index-BWUmnecT.d.ts.map +1 -0
  9. package/dist/cjs/index.d.ts +1 -1
  10. package/dist/cjs/index.js +1 -1
  11. package/dist/cjs/utils.js +1 -1
  12. package/dist/cjs/validation.d.ts +1 -1
  13. package/dist/esm/Router-B7txWo9N.mjs +6 -0
  14. package/dist/esm/Router-B7txWo9N.mjs.map +1 -0
  15. package/dist/esm/api.d.mts +1 -1
  16. package/dist/esm/api.mjs +1 -1
  17. package/dist/esm/{cloneRouter-DHrH6D_z.mjs → cloneRouter-BNCQ7tIa.mjs} +2 -2
  18. package/dist/esm/{cloneRouter-DHrH6D_z.mjs.map → cloneRouter-BNCQ7tIa.mjs.map} +1 -1
  19. package/dist/esm/{index-C-i6vx5Y.d.mts → index-BWUmnecT.d.mts} +1 -2
  20. package/dist/esm/index-BWUmnecT.d.mts.map +1 -0
  21. package/dist/esm/index.d.mts +1 -1
  22. package/dist/esm/index.mjs +1 -1
  23. package/dist/esm/utils.mjs +1 -1
  24. package/dist/esm/validation.d.mts +1 -1
  25. package/package.json +2 -3
  26. package/dist/cjs/Router-IEGavTKk.js +0 -6
  27. package/dist/cjs/Router-IEGavTKk.js.map +0 -1
  28. package/dist/cjs/index-C-i6vx5Y.d.ts.map +0 -1
  29. package/dist/esm/Router-B3aeavRb.mjs +0 -6
  30. package/dist/esm/Router-B3aeavRb.mjs.map +0 -1
  31. package/dist/esm/index-C-i6vx5Y.d.mts.map +0 -1
  32. package/src/Router.ts +0 -737
  33. package/src/RouterError.ts +0 -324
  34. package/src/api/cloneRouter.ts +0 -159
  35. package/src/api/getDependenciesApi.ts +0 -160
  36. package/src/api/getLifecycleApi.ts +0 -65
  37. package/src/api/getPluginApi.ts +0 -228
  38. package/src/api/getRoutesApi.ts +0 -831
  39. package/src/api/helpers.ts +0 -10
  40. package/src/api/index.ts +0 -16
  41. package/src/api/types.ts +0 -12
  42. package/src/constants.ts +0 -101
  43. package/src/createRouter.ts +0 -32
  44. package/src/fsm/index.ts +0 -5
  45. package/src/fsm/routerFSM.ts +0 -130
  46. package/src/getNavigator.ts +0 -30
  47. package/src/guards.ts +0 -46
  48. package/src/helpers.ts +0 -197
  49. package/src/index.ts +0 -66
  50. package/src/internals.ts +0 -228
  51. package/src/namespaces/DependenciesNamespace/dependenciesStore.ts +0 -30
  52. package/src/namespaces/DependenciesNamespace/index.ts +0 -5
  53. package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +0 -522
  54. package/src/namespaces/EventBusNamespace/index.ts +0 -5
  55. package/src/namespaces/EventBusNamespace/types.ts +0 -11
  56. package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +0 -552
  57. package/src/namespaces/NavigationNamespace/constants.ts +0 -55
  58. package/src/namespaces/NavigationNamespace/index.ts +0 -5
  59. package/src/namespaces/NavigationNamespace/transition/completeTransition.ts +0 -108
  60. package/src/namespaces/NavigationNamespace/transition/errorHandling.ts +0 -124
  61. package/src/namespaces/NavigationNamespace/transition/guardPhase.ts +0 -283
  62. package/src/namespaces/NavigationNamespace/types.ts +0 -110
  63. package/src/namespaces/OptionsNamespace/OptionsNamespace.ts +0 -28
  64. package/src/namespaces/OptionsNamespace/constants.ts +0 -19
  65. package/src/namespaces/OptionsNamespace/helpers.ts +0 -50
  66. package/src/namespaces/OptionsNamespace/index.ts +0 -7
  67. package/src/namespaces/OptionsNamespace/validators.ts +0 -13
  68. package/src/namespaces/PluginsNamespace/PluginsNamespace.ts +0 -291
  69. package/src/namespaces/PluginsNamespace/constants.ts +0 -34
  70. package/src/namespaces/PluginsNamespace/index.ts +0 -7
  71. package/src/namespaces/PluginsNamespace/types.ts +0 -22
  72. package/src/namespaces/PluginsNamespace/validators.ts +0 -28
  73. package/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts +0 -558
  74. package/src/namespaces/RouteLifecycleNamespace/index.ts +0 -5
  75. package/src/namespaces/RouteLifecycleNamespace/types.ts +0 -10
  76. package/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts +0 -81
  77. package/src/namespaces/RouterLifecycleNamespace/constants.ts +0 -25
  78. package/src/namespaces/RouterLifecycleNamespace/index.ts +0 -5
  79. package/src/namespaces/RouterLifecycleNamespace/types.ts +0 -30
  80. package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +0 -582
  81. package/src/namespaces/RoutesNamespace/constants.ts +0 -6
  82. package/src/namespaces/RoutesNamespace/forwardChain.ts +0 -34
  83. package/src/namespaces/RoutesNamespace/helpers.ts +0 -204
  84. package/src/namespaces/RoutesNamespace/index.ts +0 -11
  85. package/src/namespaces/RoutesNamespace/routeGuards.ts +0 -62
  86. package/src/namespaces/RoutesNamespace/routesStore.ts +0 -566
  87. package/src/namespaces/RoutesNamespace/types.ts +0 -81
  88. package/src/namespaces/StateNamespace/StateNamespace.ts +0 -224
  89. package/src/namespaces/StateNamespace/helpers.ts +0 -24
  90. package/src/namespaces/StateNamespace/index.ts +0 -5
  91. package/src/namespaces/StateNamespace/types.ts +0 -15
  92. package/src/namespaces/index.ts +0 -35
  93. package/src/stateMetaStore.ts +0 -15
  94. package/src/transitionPath.ts +0 -440
  95. package/src/typeGuards.ts +0 -59
  96. package/src/types/RouterValidator.ts +0 -156
  97. package/src/types.ts +0 -77
  98. package/src/utils/createRequestScope.ts +0 -174
  99. package/src/utils/getStaticPaths.ts +0 -50
  100. package/src/utils/hydrateRouter.ts +0 -89
  101. package/src/utils/index.ts +0 -27
  102. package/src/utils/serializeRouterState.ts +0 -120
  103. package/src/utils/serializeState.ts +0 -63
  104. package/src/validation.ts +0 -12
  105. package/src/wiring/RouterWiringBuilder.ts +0 -275
  106. package/src/wiring/index.ts +0 -7
  107. package/src/wiring/types.ts +0 -47
  108. package/src/wiring/wireRouter.ts +0 -26
@@ -1,224 +0,0 @@
1
- // packages/core/src/namespaces/StateNamespace/StateNamespace.ts
2
-
3
- import { areParamValuesEqual } from "./helpers";
4
- import { DEFAULT_TRANSITION, EMPTY_PARAMS } from "../../constants";
5
- import { freezeStateInPlace } from "../../helpers";
6
- import { setStateMetaParams } from "../../stateMetaStore";
7
-
8
- import type { StateNamespaceDependencies } from "./types";
9
- import type { Params, State } from "@real-router/types";
10
- import type { RouteTreeStateMeta } from "route-tree";
11
-
12
- /**
13
- * Independent namespace for managing router state storage and creation.
14
- *
15
- * Static methods handle validation (called by facade).
16
- * Instance methods handle state storage, freezing, and creation.
17
- */
18
- export class StateNamespace {
19
- /**
20
- * Cached frozen state - avoids structuredClone on every getState() call.
21
- */
22
- #frozenState: State | undefined = undefined;
23
-
24
- /**
25
- * Previous state before the last setState call.
26
- */
27
- #previousState: State | undefined = undefined;
28
-
29
- /**
30
- * Dependencies injected from Router.
31
- */
32
- #deps!: StateNamespaceDependencies;
33
-
34
- /**
35
- * Cache for URL params by route name.
36
- */
37
- readonly #urlParamsCache = new Map<string, string[]>();
38
-
39
- // =========================================================================
40
- // Instance methods (trust input - already validated by facade)
41
- // =========================================================================
42
-
43
- /**
44
- * Returns the current router state.
45
- *
46
- * The returned state is deeply frozen (immutable) for safety.
47
- * Returns `undefined` if the router has not been started or has been stopped.
48
- */
49
- get<P extends Params = Params>(): State<P> | undefined {
50
- return this.#frozenState as State<P> | undefined; // NOSONAR -- generic narrowing needed for public API
51
- }
52
-
53
- /**
54
- * Sets the current router state.
55
- *
56
- * The state is deeply frozen before storage to ensure immutability.
57
- * The previous state is preserved and accessible via `getPrevious()`.
58
- *
59
- * @param state - Already validated by facade, or undefined to clear
60
- */
61
- set(state: State | undefined): void {
62
- // Preserve current state as previous before updating
63
- this.#previousState = this.#frozenState;
64
-
65
- // If state is already frozen (from makeState()), use it directly.
66
- // For external states, freeze in place without cloning.
67
- this.#frozenState = state ? freezeStateInPlace(state) : undefined;
68
- }
69
-
70
- /**
71
- * Returns the previous router state (before the last navigation).
72
- */
73
- getPrevious(): State | undefined {
74
- return this.#previousState;
75
- }
76
-
77
- reset(): void {
78
- this.#frozenState = undefined;
79
- this.#previousState = undefined;
80
- this.#urlParamsCache.clear();
81
- }
82
-
83
- // =========================================================================
84
- // Dependency Injection
85
- // =========================================================================
86
-
87
- /**
88
- * Sets dependencies for state creation methods.
89
- * Must be called before using makeState, areStatesEqual, etc.
90
- */
91
- setDependencies(deps: StateNamespaceDependencies): void {
92
- this.#deps = deps;
93
- }
94
-
95
- // =========================================================================
96
- // State Creation Methods
97
- // =========================================================================
98
-
99
- /**
100
- * Creates a state object for a route.
101
- *
102
- * `params` is frozen at creation so it is always immutable, even when
103
- * `skipFreeze=true` is passed to defer the outer `Object.freeze(state)` call.
104
- * This keeps params-freezing invariants independent of transition-pipeline
105
- * mutation (e.g. `completeTransition` attaching `state.transition`).
106
- *
107
- * `context` is initialized as a fresh empty object — intentionally NOT frozen
108
- * so plugins can publish data via `claim.write(state, value)` after creation.
109
- */
110
- makeState<P extends Params = Params>(
111
- name: string,
112
- params?: P,
113
- path?: string,
114
- meta?: RouteTreeStateMeta,
115
- skipFreeze?: boolean,
116
- ): State<P> {
117
- // Optimization: O(1) lookup instead of O(depth) ancestor iteration
118
- const defaultParamsConfig = this.#deps.getDefaultParams();
119
- const hasDefaultParams = Object.hasOwn(defaultParamsConfig, name);
120
-
121
- // Conditional allocation: avoid spreading when no defaultParams exist
122
- let mergedParams: P;
123
-
124
- if (hasDefaultParams) {
125
- mergedParams = Object.freeze({
126
- ...defaultParamsConfig[name],
127
- ...params,
128
- }) as P;
129
- } else if (!params || params === EMPTY_PARAMS) {
130
- mergedParams = EMPTY_PARAMS as P;
131
- } else {
132
- mergedParams = Object.freeze({ ...params });
133
- }
134
-
135
- const state = {
136
- name,
137
- params: mergedParams,
138
- path: path ?? this.#deps.buildPath(name, params),
139
- context: {},
140
- ...(!skipFreeze && { transition: DEFAULT_TRANSITION }),
141
- } as State<P>;
142
-
143
- if (meta) {
144
- setStateMetaParams(state, meta);
145
- }
146
-
147
- return skipFreeze ? state : freezeStateInPlace(state);
148
- }
149
-
150
- // =========================================================================
151
- // State Comparison Methods
152
- // =========================================================================
153
-
154
- /**
155
- * Compares two states for equality.
156
- * By default, ignores query params (only compares URL params).
157
- */
158
- areStatesEqual(
159
- state1: State | undefined,
160
- state2: State | undefined,
161
- ignoreQueryParams = true,
162
- ): boolean {
163
- if (!state1 || !state2) {
164
- return !!state1 === !!state2;
165
- }
166
-
167
- if (state1.name !== state2.name) {
168
- return false;
169
- }
170
-
171
- if (ignoreQueryParams) {
172
- const urlParams = this.#getUrlParams(state1.name);
173
-
174
- for (const urlParam of urlParams) {
175
- if (
176
- !areParamValuesEqual(state1.params[urlParam], state2.params[urlParam])
177
- ) {
178
- return false;
179
- }
180
- }
181
-
182
- return true;
183
- }
184
-
185
- const state1Keys = Object.keys(state1.params);
186
- const state2Keys = Object.keys(state2.params);
187
-
188
- if (state1Keys.length !== state2Keys.length) {
189
- return false;
190
- }
191
-
192
- for (const param of state1Keys) {
193
- if (
194
- !(param in state2.params) ||
195
- !areParamValuesEqual(state1.params[param], state2.params[param])
196
- ) {
197
- return false;
198
- }
199
- }
200
-
201
- return true;
202
- }
203
-
204
- // =========================================================================
205
- // Private Helpers
206
- // =========================================================================
207
-
208
- /**
209
- * Gets URL params for a route name, using cache for performance.
210
- */
211
- #getUrlParams(name: string): string[] {
212
- const cached = this.#urlParamsCache.get(name);
213
-
214
- if (cached !== undefined) {
215
- return cached;
216
- }
217
-
218
- const result = this.#deps.getUrlParams(name);
219
-
220
- this.#urlParamsCache.set(name, result);
221
-
222
- return result;
223
- }
224
- }
@@ -1,24 +0,0 @@
1
- // packages/core/src/namespaces/StateNamespace/helpers.ts
2
-
3
- export function areParamValuesEqual(val1: unknown, val2: unknown): boolean {
4
- if (val1 === val2) {
5
- return true;
6
- }
7
-
8
- if (Array.isArray(val1) && Array.isArray(val2)) {
9
- if (val1.length !== val2.length) {
10
- return false;
11
- }
12
-
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;
21
- }
22
-
23
- return false;
24
- }
@@ -1,5 +0,0 @@
1
- // packages/core/src/namespaces/StateNamespace/index.ts
2
-
3
- export { StateNamespace } from "./StateNamespace";
4
-
5
- export type { StateNamespaceDependencies } from "./types";
@@ -1,15 +0,0 @@
1
- // packages/core/src/namespaces/StateNamespace/types.ts
2
-
3
- import type { Params } from "@real-router/types";
4
-
5
- /**
6
- * Dependencies injected from Router for state creation.
7
- */
8
- export interface StateNamespaceDependencies {
9
- /** Get defaultParams config for a route */
10
- getDefaultParams: () => Record<string, Params>;
11
- /** Build URL path for a route */
12
- buildPath: (name: string, params?: Params) => string;
13
- /** Get URL params for a route (for areStatesEqual) */
14
- getUrlParams: (name: string) => string[];
15
- }
@@ -1,35 +0,0 @@
1
- // packages/core/src/namespaces/index.ts
2
-
3
- export { createDependenciesStore } from "./DependenciesNamespace";
4
-
5
- export type { DependenciesStore } from "./DependenciesNamespace";
6
-
7
- export {
8
- deepFreeze,
9
- defaultOptions,
10
- OptionsNamespace,
11
- } from "./OptionsNamespace";
12
-
13
- export { StateNamespace } from "./StateNamespace";
14
-
15
- export {
16
- PluginsNamespace,
17
- EVENTS_MAP,
18
- EVENT_METHOD_NAMES,
19
- } from "./PluginsNamespace";
20
-
21
- export { RouteLifecycleNamespace } from "./RouteLifecycleNamespace";
22
-
23
- export {
24
- RoutesNamespace,
25
- DEFAULT_ROUTE_NAME,
26
- createEmptyConfig,
27
- } from "./RoutesNamespace";
28
-
29
- export type { RouteConfig } from "./RoutesNamespace";
30
-
31
- export { NavigationNamespace } from "./NavigationNamespace";
32
-
33
- export { RouterLifecycleNamespace } from "./RouterLifecycleNamespace";
34
-
35
- export { EventBusNamespace } from "./EventBusNamespace";
@@ -1,15 +0,0 @@
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
- }