@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.
- package/README.md +27 -5
- package/dist/cjs/Router-B-Pev7K2.d.ts +46 -0
- package/dist/cjs/RouterValidator-mx2Zooya.d.ts +136 -0
- package/dist/cjs/api.d.ts +2 -1
- package/dist/cjs/api.js +1 -1
- package/dist/cjs/api.js.map +1 -1
- package/dist/cjs/index.d-y2b-8_3Y.d.ts +236 -0
- package/dist/cjs/index.d.ts +7 -24
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/metafile-cjs.json +1 -1
- package/dist/cjs/utils.d.ts +6 -1
- package/dist/cjs/utils.js +1 -1
- package/dist/cjs/utils.js.map +1 -1
- package/dist/cjs/validation.d.ts +184 -0
- package/dist/cjs/validation.js +1 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/esm/Router-B-Pev7K2.d.mts +46 -0
- package/dist/esm/RouterValidator-mx2Zooya.d.mts +136 -0
- package/dist/esm/api.d.mts +2 -1
- package/dist/esm/api.mjs +1 -1
- package/dist/esm/api.mjs.map +1 -1
- package/dist/esm/chunk-5QXFUUDL.mjs +1 -0
- package/dist/esm/chunk-5QXFUUDL.mjs.map +1 -0
- package/dist/esm/chunk-HHIXK5UM.mjs +1 -0
- package/dist/esm/chunk-HHIXK5UM.mjs.map +1 -0
- package/dist/esm/chunk-QUUNDESP.mjs +1 -0
- package/dist/esm/chunk-QUUNDESP.mjs.map +1 -0
- package/dist/esm/chunk-RA5VYM7M.mjs +1 -0
- package/dist/esm/chunk-RA5VYM7M.mjs.map +1 -0
- package/dist/esm/index.d-y2b-8_3Y.d.mts +236 -0
- package/dist/esm/index.d.mts +7 -24
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/metafile-esm.json +1 -1
- package/dist/esm/utils.d.mts +6 -1
- package/dist/esm/utils.mjs +1 -1
- package/dist/esm/utils.mjs.map +1 -1
- package/dist/esm/validation.d.mts +184 -0
- package/dist/esm/validation.mjs +1 -0
- package/dist/esm/validation.mjs.map +1 -0
- package/package.json +18 -5
- package/src/Router.ts +73 -99
- package/src/api/cloneRouter.ts +1 -30
- package/src/api/getDependenciesApi.ts +45 -86
- package/src/api/getLifecycleApi.ts +24 -19
- package/src/api/getPluginApi.ts +20 -28
- package/src/api/getRoutesApi.ts +49 -106
- package/src/constants.ts +0 -30
- package/src/guards.ts +46 -0
- package/src/helpers.ts +0 -17
- package/src/index.ts +4 -0
- package/src/internals.ts +6 -5
- package/src/namespaces/EventBusNamespace/EventBusNamespace.ts +2 -2
- package/src/namespaces/NavigationNamespace/NavigationNamespace.ts +0 -25
- package/src/namespaces/OptionsNamespace/OptionsNamespace.ts +4 -26
- package/src/namespaces/OptionsNamespace/constants.ts +0 -20
- package/src/namespaces/OptionsNamespace/index.ts +1 -5
- package/src/namespaces/OptionsNamespace/validators.ts +6 -245
- package/src/namespaces/PluginsNamespace/PluginsNamespace.ts +18 -59
- package/src/namespaces/PluginsNamespace/constants.ts +3 -6
- package/src/namespaces/PluginsNamespace/validators.ts +2 -57
- package/src/namespaces/RouteLifecycleNamespace/RouteLifecycleNamespace.ts +27 -84
- package/src/namespaces/RouterLifecycleNamespace/RouterLifecycleNamespace.ts +0 -16
- package/src/namespaces/RoutesNamespace/RoutesNamespace.ts +3 -12
- package/src/namespaces/RoutesNamespace/constants.ts +0 -8
- package/src/namespaces/RoutesNamespace/forwardChain.ts +34 -0
- package/src/namespaces/RoutesNamespace/index.ts +1 -1
- package/src/namespaces/RoutesNamespace/routeGuards.ts +62 -0
- package/src/namespaces/RoutesNamespace/routesStore.ts +7 -51
- package/src/namespaces/StateNamespace/StateNamespace.ts +0 -33
- package/src/namespaces/StateNamespace/helpers.ts +1 -1
- package/src/namespaces/index.ts +0 -3
- package/src/typeGuards.ts +1 -15
- package/src/types/RouterValidator.ts +155 -0
- package/src/utils/getStaticPaths.ts +50 -0
- package/src/utils/index.ts +4 -0
- package/src/validation.ts +12 -0
- package/src/wiring/RouterWiringBuilder.ts +32 -9
- package/dist/cjs/index.d-DDimDpYc.d.ts +0 -165
- package/dist/esm/chunk-CG7TKDP3.mjs +0 -1
- package/dist/esm/chunk-CG7TKDP3.mjs.map +0 -1
- package/dist/esm/index.d-DDimDpYc.d.mts +0 -165
- package/src/namespaces/DependenciesNamespace/validators.ts +0 -103
- package/src/namespaces/EventBusNamespace/validators.ts +0 -36
- package/src/namespaces/NavigationNamespace/validators.ts +0 -47
- package/src/namespaces/RouteLifecycleNamespace/validators.ts +0 -65
- package/src/namespaces/RoutesNamespace/forwardToValidation.ts +0 -408
- package/src/namespaces/RoutesNamespace/validators.ts +0 -566
- 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
|
|
127
|
-
|
|
|
128
|
-
| `serializeState(data)`
|
|
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 {
|
|
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;
|