@real-router/core 0.38.0 → 0.40.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 (89) hide show
  1. package/README.md +27 -5
  2. package/dist/cjs/Router-B-Pev7K2.d.ts +46 -0
  3. package/dist/cjs/RouterValidator-mx2Zooya.d.ts +136 -0
  4. package/dist/cjs/api.d.ts +2 -1
  5. package/dist/cjs/api.js +1 -1
  6. package/dist/cjs/api.js.map +1 -1
  7. package/dist/cjs/index.d-y2b-8_3Y.d.ts +236 -0
  8. package/dist/cjs/index.d.ts +7 -24
  9. package/dist/cjs/index.js +1 -1
  10. package/dist/cjs/index.js.map +1 -1
  11. package/dist/cjs/metafile-cjs.json +1 -1
  12. package/dist/cjs/utils.d.ts +6 -1
  13. package/dist/cjs/utils.js +1 -1
  14. package/dist/cjs/utils.js.map +1 -1
  15. package/dist/cjs/validation.d.ts +184 -0
  16. package/dist/cjs/validation.js +1 -0
  17. package/dist/cjs/validation.js.map +1 -0
  18. package/dist/esm/Router-B-Pev7K2.d.mts +46 -0
  19. package/dist/esm/RouterValidator-mx2Zooya.d.mts +136 -0
  20. package/dist/esm/api.d.mts +2 -1
  21. package/dist/esm/api.mjs +1 -1
  22. package/dist/esm/api.mjs.map +1 -1
  23. package/dist/esm/chunk-5QXFUUDL.mjs +1 -0
  24. package/dist/esm/chunk-5QXFUUDL.mjs.map +1 -0
  25. package/dist/esm/chunk-HHIXK5UM.mjs +1 -0
  26. package/dist/esm/chunk-HHIXK5UM.mjs.map +1 -0
  27. package/dist/esm/chunk-QUUNDESP.mjs +1 -0
  28. package/dist/esm/chunk-QUUNDESP.mjs.map +1 -0
  29. package/dist/esm/chunk-RA5VYM7M.mjs +1 -0
  30. package/dist/esm/chunk-RA5VYM7M.mjs.map +1 -0
  31. package/dist/esm/index.d-y2b-8_3Y.d.mts +236 -0
  32. package/dist/esm/index.d.mts +7 -24
  33. package/dist/esm/index.mjs +1 -1
  34. package/dist/esm/metafile-esm.json +1 -1
  35. package/dist/esm/utils.d.mts +6 -1
  36. package/dist/esm/utils.mjs +1 -1
  37. package/dist/esm/utils.mjs.map +1 -1
  38. package/dist/esm/validation.d.mts +184 -0
  39. package/dist/esm/validation.mjs +1 -0
  40. package/dist/esm/validation.mjs.map +1 -0
  41. package/package.json +18 -5
  42. package/src/Router.ts +73 -99
  43. package/src/api/cloneRouter.ts +1 -30
  44. package/src/api/getDependenciesApi.ts +45 -86
  45. package/src/api/getLifecycleApi.ts +24 -19
  46. package/src/api/getPluginApi.ts +20 -28
  47. package/src/api/getRoutesApi.ts +49 -106
  48. package/src/constants.ts +0 -30
  49. package/src/guards.ts +46 -0
  50. package/src/helpers.ts +0 -17
  51. package/src/index.ts +4 -0
  52. package/src/internals.ts +6 -5
  53. package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +2 -2
  54. package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +0 -25
  55. package/src/namespaces/OptionsNamespace/OptionsNamespace.ts +4 -26
  56. package/src/namespaces/OptionsNamespace/constants.ts +0 -20
  57. package/src/namespaces/OptionsNamespace/index.ts +1 -5
  58. package/src/namespaces/OptionsNamespace/validators.ts +6 -245
  59. package/src/namespaces/PluginsNamespace/PluginsNamespace.ts +18 -59
  60. package/src/namespaces/PluginsNamespace/constants.ts +3 -6
  61. package/src/namespaces/PluginsNamespace/validators.ts +2 -57
  62. package/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts +27 -84
  63. package/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts +0 -16
  64. package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +3 -12
  65. package/src/namespaces/RoutesNamespace/constants.ts +0 -8
  66. package/src/namespaces/RoutesNamespace/forwardChain.ts +34 -0
  67. package/src/namespaces/RoutesNamespace/index.ts +1 -1
  68. package/src/namespaces/RoutesNamespace/routeGuards.ts +62 -0
  69. package/src/namespaces/RoutesNamespace/routesStore.ts +7 -51
  70. package/src/namespaces/StateNamespace/StateNamespace.ts +0 -33
  71. package/src/namespaces/StateNamespace/helpers.ts +1 -1
  72. package/src/namespaces/index.ts +0 -3
  73. package/src/typeGuards.ts +1 -15
  74. package/src/types/RouterValidator.ts +155 -0
  75. package/src/utils/getStaticPaths.ts +50 -0
  76. package/src/utils/index.ts +4 -0
  77. package/src/validation.ts +12 -0
  78. package/src/wiring/RouterWiringBuilder.ts +32 -9
  79. package/dist/cjs/index.d-DDimDpYc.d.ts +0 -165
  80. package/dist/esm/chunk-CG7TKDP3.mjs +0 -1
  81. package/dist/esm/chunk-CG7TKDP3.mjs.map +0 -1
  82. package/dist/esm/index.d-DDimDpYc.d.mts +0 -165
  83. package/src/namespaces/DependenciesNamespace/validators.ts +0 -103
  84. package/src/namespaces/EventBusNamespace/validators.ts +0 -36
  85. package/src/namespaces/NavigationNamespace/validators.ts +0 -47
  86. package/src/namespaces/RouteLifecycleNamespace/validators.ts +0 -65
  87. package/src/namespaces/RoutesNamespace/forwardToValidation.ts +0 -408
  88. package/src/namespaces/RoutesNamespace/validators.ts +0 -566
  89. package/src/namespaces/StateNamespace/validators.ts +0 -46
package/README.md CHANGED
@@ -114,18 +114,27 @@ import {
114
114
 
115
115
  ## Utilities
116
116
 
117
- SSR helpers imported from `@real-router/core/utils`.
117
+ SSR/SSG helpers imported from `@real-router/core/utils`.
118
118
 
119
119
  ```typescript
120
- import { serializeState } from "@real-router/core/utils";
120
+ import { getStaticPaths, serializeState } from "@real-router/core/utils";
121
121
 
122
+ // SSR: XSS-safe data embedding
122
123
  const json = serializeState({ name: "home", path: "/" });
123
124
  const html = `<script>window.__STATE__=${json}</script>`;
125
+
126
+ // SSG: enumerate all URLs for pre-rendering
127
+ const paths = await getStaticPaths(router, {
128
+ "users.profile": async () => [{ id: "1" }, { id: "2" }],
129
+ });
130
+ // → ["/", "/users", "/users/1", "/users/2"]
124
131
  ```
125
132
 
126
- | Function | Purpose |
127
- | ---------------------- | ----------------------------------------------------------------- |
128
- | `serializeState(data)` | XSS-safe JSON serialization for embedding in HTML `<script>` tags |
133
+ | Function | Purpose |
134
+ | ---------------------------------- | ------------------------------------------------------------------------------------------- |
135
+ | `serializeState(data)` | XSS-safe JSON serialization for embedding in HTML `<script>` tags |
136
+ | `getStaticPaths(router, entries?)` | Enumerate leaf routes and build URLs for SSG pre-rendering |
137
+ | `StaticPathEntries` (type) | Type for the `entries` parameter: `Record<string, () => Promise<Record<string, string>[]>>` |
129
138
 
130
139
  ### `getNavigator(router)` (main entry)
131
140
 
@@ -209,6 +218,19 @@ try {
209
218
 
210
219
  See [RouterError](https://github.com/greydragon888/real-router/wiki/RouterError) and [Error Codes](https://github.com/greydragon888/real-router/wiki/error-codes) for the full reference.
211
220
 
221
+ ## Validation
222
+
223
+ Runtime argument validation is available via [@real-router/validation-plugin](https://www.npmjs.com/package/@real-router/validation-plugin):
224
+
225
+ ```typescript
226
+ import { validationPlugin } from "@real-router/validation-plugin";
227
+
228
+ router.usePlugin(validationPlugin()); // register before start()
229
+ await router.start("/");
230
+ ```
231
+
232
+ The plugin adds descriptive error messages for every public API call. Register it in development, skip in production.
233
+
212
234
  ## Documentation
213
235
 
214
236
  Full documentation: [Wiki](https://github.com/greydragon888/real-router/wiki)
@@ -0,0 +1,46 @@
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 };
@@ -0,0 +1,136 @@
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 };
package/dist/cjs/api.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { PluginApi as PluginApi$1, DefaultDependencies, Router, RoutesApi, DependenciesApi, LifecycleApi } from '@real-router/types';
2
2
  export { DependenciesApi, LifecycleApi, RoutesApi } from '@real-router/types';
3
- import { a as RouteTree, R as Router$1 } from './index.d-DDimDpYc.js';
3
+ import { R as RouteTree } from './index.d-y2b-8_3Y.js';
4
+ import { R as Router$1 } from './Router-B-Pev7K2.js';
4
5
 
5
6
  interface PluginApi extends Omit<PluginApi$1, "getTree"> {
6
7
  getTree: () => RouteTree;