@real-router/core 0.56.0 → 0.57.1

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 (112) hide show
  1. package/dist/cjs/Router-Brp6_4FE.js +6 -0
  2. package/dist/cjs/Router-Brp6_4FE.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-CZx0T0RQ.js} +2 -2
  6. package/dist/cjs/{cloneRouter-DRieJvam.js.map → cloneRouter-CZx0T0RQ.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-CYpAZCoc.d.ts.map +1 -1
  10. package/dist/cjs/index.d.ts +1 -1
  11. package/dist/cjs/index.js +1 -1
  12. package/dist/cjs/utils.js +1 -1
  13. package/dist/cjs/utils.js.map +1 -1
  14. package/dist/cjs/validation.d.ts +1 -1
  15. package/dist/esm/Router-LT61erYH.mjs +6 -0
  16. package/dist/esm/Router-LT61erYH.mjs.map +1 -0
  17. package/dist/esm/api.d.mts +1 -1
  18. package/dist/esm/api.mjs +1 -1
  19. package/dist/esm/{cloneRouter-DHrH6D_z.mjs → cloneRouter-DAscsmmF.mjs} +2 -2
  20. package/dist/esm/{cloneRouter-DHrH6D_z.mjs.map → cloneRouter-DAscsmmF.mjs.map} +1 -1
  21. package/dist/esm/{index-C-i6vx5Y.d.mts → index-BWUmnecT.d.mts} +1 -2
  22. package/dist/esm/index-BWUmnecT.d.mts.map +1 -0
  23. package/dist/esm/index-CYpAZCoc.d.mts.map +1 -1
  24. package/dist/esm/index.d.mts +1 -1
  25. package/dist/esm/index.mjs +1 -1
  26. package/dist/esm/utils.mjs +1 -1
  27. package/dist/esm/utils.mjs.map +1 -1
  28. package/dist/esm/validation.d.mts +1 -1
  29. package/package.json +4 -5
  30. package/dist/cjs/Router-IEGavTKk.js +0 -6
  31. package/dist/cjs/Router-IEGavTKk.js.map +0 -1
  32. package/dist/cjs/index-C-i6vx5Y.d.ts.map +0 -1
  33. package/dist/esm/Router-B3aeavRb.mjs +0 -6
  34. package/dist/esm/Router-B3aeavRb.mjs.map +0 -1
  35. package/dist/esm/index-C-i6vx5Y.d.mts.map +0 -1
  36. package/src/Router.ts +0 -737
  37. package/src/RouterError.ts +0 -324
  38. package/src/api/cloneRouter.ts +0 -159
  39. package/src/api/getDependenciesApi.ts +0 -160
  40. package/src/api/getLifecycleApi.ts +0 -65
  41. package/src/api/getPluginApi.ts +0 -228
  42. package/src/api/getRoutesApi.ts +0 -831
  43. package/src/api/helpers.ts +0 -10
  44. package/src/api/index.ts +0 -16
  45. package/src/api/types.ts +0 -12
  46. package/src/constants.ts +0 -101
  47. package/src/createRouter.ts +0 -32
  48. package/src/fsm/index.ts +0 -5
  49. package/src/fsm/routerFSM.ts +0 -130
  50. package/src/getNavigator.ts +0 -30
  51. package/src/guards.ts +0 -46
  52. package/src/helpers.ts +0 -197
  53. package/src/index.ts +0 -66
  54. package/src/internals.ts +0 -228
  55. package/src/namespaces/DependenciesNamespace/dependenciesStore.ts +0 -30
  56. package/src/namespaces/DependenciesNamespace/index.ts +0 -5
  57. package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +0 -522
  58. package/src/namespaces/EventBusNamespace/index.ts +0 -5
  59. package/src/namespaces/EventBusNamespace/types.ts +0 -11
  60. package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +0 -552
  61. package/src/namespaces/NavigationNamespace/constants.ts +0 -55
  62. package/src/namespaces/NavigationNamespace/index.ts +0 -5
  63. package/src/namespaces/NavigationNamespace/transition/completeTransition.ts +0 -108
  64. package/src/namespaces/NavigationNamespace/transition/errorHandling.ts +0 -124
  65. package/src/namespaces/NavigationNamespace/transition/guardPhase.ts +0 -283
  66. package/src/namespaces/NavigationNamespace/types.ts +0 -110
  67. package/src/namespaces/OptionsNamespace/OptionsNamespace.ts +0 -28
  68. package/src/namespaces/OptionsNamespace/constants.ts +0 -19
  69. package/src/namespaces/OptionsNamespace/helpers.ts +0 -50
  70. package/src/namespaces/OptionsNamespace/index.ts +0 -7
  71. package/src/namespaces/OptionsNamespace/validators.ts +0 -13
  72. package/src/namespaces/PluginsNamespace/PluginsNamespace.ts +0 -291
  73. package/src/namespaces/PluginsNamespace/constants.ts +0 -34
  74. package/src/namespaces/PluginsNamespace/index.ts +0 -7
  75. package/src/namespaces/PluginsNamespace/types.ts +0 -22
  76. package/src/namespaces/PluginsNamespace/validators.ts +0 -28
  77. package/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts +0 -558
  78. package/src/namespaces/RouteLifecycleNamespace/index.ts +0 -5
  79. package/src/namespaces/RouteLifecycleNamespace/types.ts +0 -10
  80. package/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts +0 -81
  81. package/src/namespaces/RouterLifecycleNamespace/constants.ts +0 -25
  82. package/src/namespaces/RouterLifecycleNamespace/index.ts +0 -5
  83. package/src/namespaces/RouterLifecycleNamespace/types.ts +0 -30
  84. package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +0 -582
  85. package/src/namespaces/RoutesNamespace/constants.ts +0 -6
  86. package/src/namespaces/RoutesNamespace/forwardChain.ts +0 -34
  87. package/src/namespaces/RoutesNamespace/helpers.ts +0 -204
  88. package/src/namespaces/RoutesNamespace/index.ts +0 -11
  89. package/src/namespaces/RoutesNamespace/routeGuards.ts +0 -62
  90. package/src/namespaces/RoutesNamespace/routesStore.ts +0 -566
  91. package/src/namespaces/RoutesNamespace/types.ts +0 -81
  92. package/src/namespaces/StateNamespace/StateNamespace.ts +0 -224
  93. package/src/namespaces/StateNamespace/helpers.ts +0 -24
  94. package/src/namespaces/StateNamespace/index.ts +0 -5
  95. package/src/namespaces/StateNamespace/types.ts +0 -15
  96. package/src/namespaces/index.ts +0 -35
  97. package/src/stateMetaStore.ts +0 -15
  98. package/src/transitionPath.ts +0 -440
  99. package/src/typeGuards.ts +0 -59
  100. package/src/types/RouterValidator.ts +0 -156
  101. package/src/types.ts +0 -77
  102. package/src/utils/createRequestScope.ts +0 -174
  103. package/src/utils/getStaticPaths.ts +0 -50
  104. package/src/utils/hydrateRouter.ts +0 -89
  105. package/src/utils/index.ts +0 -27
  106. package/src/utils/serializeRouterState.ts +0 -120
  107. package/src/utils/serializeState.ts +0 -63
  108. package/src/validation.ts +0 -12
  109. package/src/wiring/RouterWiringBuilder.ts +0 -275
  110. package/src/wiring/index.ts +0 -7
  111. package/src/wiring/types.ts +0 -47
  112. 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
- }