@real-router/core 0.77.4 → 0.79.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 +1 -1
- package/dist/cjs/{Router-Bm2qafJA.d.ts → Router-BG5yNYUG.d.ts} +4 -10
- package/dist/cjs/Router-BG5yNYUG.d.ts.map +1 -0
- package/dist/cjs/Router-BRuC-daj.js +2 -0
- package/dist/cjs/Router-BRuC-daj.js.map +1 -0
- package/dist/cjs/RouterValidator-CZ8kPkrI.d.ts +107 -0
- package/dist/cjs/RouterValidator-CZ8kPkrI.d.ts.map +1 -0
- package/dist/cjs/api.d.ts +20 -4
- package/dist/cjs/api.d.ts.map +1 -1
- package/dist/cjs/api.js +1 -1
- package/dist/cjs/api.js.map +1 -1
- package/dist/cjs/buildParamMeta-DniluAIV.js +2 -0
- package/dist/cjs/buildParamMeta-DniluAIV.js.map +1 -0
- package/dist/cjs/cloneRouter-3AOUeQ8M.js +2 -0
- package/dist/cjs/cloneRouter-3AOUeQ8M.js.map +1 -0
- package/dist/cjs/index-CAnGQpnz.d.ts +974 -0
- package/dist/cjs/index-CAnGQpnz.d.ts.map +1 -0
- package/dist/{esm/index-Cwd11Hun.d.mts → cjs/index-DDrryY2U.d.ts} +3 -3
- package/dist/cjs/{index-A1sdfTRT.d.ts.map → index-DDrryY2U.d.ts.map} +1 -1
- package/dist/cjs/index.d.ts +192 -7
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types-DaXCTxi1.d.ts +138 -0
- package/dist/cjs/types-DaXCTxi1.d.ts.map +1 -0
- package/dist/cjs/types.d.ts +2 -0
- package/dist/cjs/types.js +0 -0
- package/dist/cjs/utils.d.ts +1 -1
- package/dist/cjs/utils.js +1 -1
- package/dist/cjs/utils.js.map +1 -1
- package/dist/cjs/validation.d.ts +163 -8
- package/dist/cjs/validation.d.ts.map +1 -1
- package/dist/cjs/validation.js +2 -1
- package/dist/cjs/validation.js.map +1 -0
- package/dist/esm/{Router-Bm2qafJA.d.mts → Router-Cy75qbgU.d.mts} +4 -10
- package/dist/{cjs/Router-Bm2qafJA.d.ts.map → esm/Router-Cy75qbgU.d.mts.map} +1 -1
- package/dist/esm/Router-DikzugaD.mjs +2 -0
- package/dist/esm/Router-DikzugaD.mjs.map +1 -0
- package/dist/esm/RouterValidator-CZ8kPkrI.d.mts +107 -0
- package/dist/esm/RouterValidator-CZ8kPkrI.d.mts.map +1 -0
- package/dist/esm/api.d.mts +20 -4
- package/dist/esm/api.d.mts.map +1 -1
- package/dist/esm/api.mjs +1 -1
- package/dist/esm/api.mjs.map +1 -1
- package/dist/esm/buildParamMeta-bOLhLF9h.mjs +2 -0
- package/dist/esm/buildParamMeta-bOLhLF9h.mjs.map +1 -0
- package/dist/esm/cloneRouter-CAh5vA3l.mjs +2 -0
- package/dist/esm/cloneRouter-CAh5vA3l.mjs.map +1 -0
- package/dist/esm/index-CAnGQpnz.d.mts +974 -0
- package/dist/esm/index-CAnGQpnz.d.mts.map +1 -0
- package/dist/{cjs/index-A1sdfTRT.d.ts → esm/index-DnSU6huX.d.mts} +3 -3
- package/dist/esm/{index-Cwd11Hun.d.mts.map → index-DnSU6huX.d.mts.map} +1 -1
- package/dist/esm/index.d.mts +192 -7
- package/dist/esm/index.d.mts.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/types-DaXCTxi1.d.mts +138 -0
- package/dist/esm/types-DaXCTxi1.d.mts.map +1 -0
- package/dist/esm/types.d.mts +2 -0
- package/dist/esm/types.mjs +0 -0
- package/dist/esm/utils.d.mts +1 -1
- package/dist/esm/utils.mjs +1 -1
- package/dist/esm/utils.mjs.map +1 -1
- package/dist/esm/validation.d.mts +162 -9
- package/dist/esm/validation.d.mts.map +1 -1
- package/dist/esm/validation.mjs +2 -1
- package/dist/esm/validation.mjs.map +1 -0
- package/package.json +15 -12
- package/dist/cjs/Router-27ftBmfo.js +0 -2
- package/dist/cjs/Router-27ftBmfo.js.map +0 -1
- package/dist/cjs/RouterError-OKaEXSBZ.d.ts +0 -292
- package/dist/cjs/RouterError-OKaEXSBZ.d.ts.map +0 -1
- package/dist/cjs/cloneRouter-B1tPtpNE.js +0 -2
- package/dist/cjs/cloneRouter-B1tPtpNE.js.map +0 -1
- package/dist/cjs/esm-egdCFOaS.js +0 -2
- package/dist/cjs/esm-egdCFOaS.js.map +0 -1
- package/dist/cjs/index-0GKsQ2r9.d.ts +0 -336
- package/dist/cjs/index-0GKsQ2r9.d.ts.map +0 -1
- package/dist/esm/Router-Bm2qafJA.d.mts.map +0 -1
- package/dist/esm/Router-CTGJBKd7.mjs +0 -2
- package/dist/esm/Router-CTGJBKd7.mjs.map +0 -1
- package/dist/esm/RouterError-OKaEXSBZ.d.mts +0 -292
- package/dist/esm/RouterError-OKaEXSBZ.d.mts.map +0 -1
- package/dist/esm/cloneRouter-C4v9Xl2F.mjs +0 -2
- package/dist/esm/cloneRouter-C4v9Xl2F.mjs.map +0 -1
- package/dist/esm/esm-Cnywzxys.mjs +0 -2
- package/dist/esm/esm-Cnywzxys.mjs.map +0 -1
- package/dist/esm/index-0GKsQ2r9.d.mts +0 -336
- package/dist/esm/index-0GKsQ2r9.d.mts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CAnGQpnz.d.mts","names":[],"sources":["../../src/types/route-node-types.ts","../../src/types/base.ts","../../src/types/limits.ts","../../src/types/router.ts","../../src/types/constants.ts","../../src/types/tree-changed.ts","../../src/types/api.ts"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { $ as State, U as Router, X as Params, w as DefaultDependencies } from "./index-CAnGQpnz.mjs";
|
|
2
|
+
import { t as Router$1 } from "./Router-Cy75qbgU.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/createRequestScope.d.ts
|
|
5
5
|
/**
|
|
@@ -306,4 +306,4 @@ interface SerializeRouterStateOptions {
|
|
|
306
306
|
declare function serializeRouterState(state: State, options?: SerializeRouterStateOptions): string;
|
|
307
307
|
//#endregion
|
|
308
308
|
export { SerializeStateOptions as a, HydrateRouterOptions as c, getStaticPaths as d, IncomingMessageLike as f, createRequestScope as g, RequestScopeSource as h, Serialize as i, hydrateRouter as l, RequestScope as m, SerializedRouterState as n, serializeState as o, RequestLike as p, serializeRouterState as r, Deserialize as s, SerializeRouterStateOptions as t, StaticPathEntries as u };
|
|
309
|
-
//# sourceMappingURL=index-
|
|
309
|
+
//# sourceMappingURL=index-DnSU6huX.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-DnSU6huX.d.mts","names":[],"sources":["../../src/utils/createRequestScope.ts","../../src/utils/getStaticPaths.ts","../../src/utils/hydrateRouter.ts","../../src/utils/serializeState.ts","../../src/utils/serializeRouterState.ts"],"mappings":";;;;;;AAUA;;;UAAiB,mBAAA;EACf,EAAA,GAAK,KAAA,WAAgB,QAAA;EACrB,cAAA,IAAkB,KAAA,WAAgB,QAAA;AAAA;;;;;AAAoB;UAQvC,WAAA;EACf,MAAA,EAAQ,WAAW;AAAA;AAAA,KAGT,kBAAA,GAAqB,mBAAA,GAAsB,WAAW;AAAA,UAEjD,YAAA,sBACM,mBAAA,GAAsB,mBAAA,UACnC,eAAA;EAJE;;;;AAAsD;EAAtD,SAUD,MAAA,EAAQ,QAAA,CAAY,YAAA;EARF;;;;EAAA,SAclB,MAAA,EAAQ,WAAA;EANA;;;;;EAajB,OAAA,QAAe,OAAA;AAAA;;;;;;;;;;;;AAAO;AA+ExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAM4B;;;;AC/H5B;;;;;;;;;;;;AAEsB;AA2BtB;;;;;;;;;;iBD4FgB,kBAAA,sBACO,mBAAA,GAAsB,mBAAA,EAE3C,OAAA,EAAS,kBAAA,EACT,IAAA,EAAM,MAAA,CAAO,YAAA,GACb,IAAA,GAAO,OAAA,CAAQ,YAAA,IACd,YAAA,CAAa,YAAA;;;KC/HJ,iBAAA,GAAoB,MAAA,eAExB,OAAA,CAAQ,MAAA;AAAA,iBA2BM,cAAA,sBACC,mBAAA,GAAsB,mBAAA,EAE3C,MAAA,EAAQ,MAAA,CAAO,YAAA,GACf,OAAA,GAAU,iBAAA,GACT,OAAA;;;;;;AD7BH;;KEAY,WAAA,IAAe,IAAY;AAAA,UAEtB,oBAAA;EFDf;;;;;;;AACsD;AAQxD;;;;AACqB;EEKnB,WAAA,GAAc,WAAW;AAAA;;;AFFuC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;AAqBwB;AA+ExB;;;;;;;;;;iBE3DsB,aAAA,CACpB,MAAA,EAAQ,MAAA,EACR,MAAA;EAAmB,IAAA;AAAA,GACnB,OAAA,GAAU,oBAAA,GACT,OAAA,CAAQ,KAAA;;;;;;;AF7DX;;;;KGFY,SAAA,IAAa,IAAa;AAAA,UAErB,qBAAA;EHCM;;;;;AACiC;AAQxD;EGFE,SAAA,GAAY,SAAS;AAAA;;AHGF;AAGrB;;;;AAAkE;AAElE;;;;;;;;;;;;;;;;;;;iBGqBgB,cAAA,CACd,IAAA,WACA,OAAA,GAAU,qBAAqB;;;;;AHvCjC;;;;;;KIGY,qBAAA,WAAgC,MAAA,GAAS,MAAA,IAAU,IAAA,CAC7D,KAAA,CAAM,CAAA;AAAA,UAIS,2BAAA;EJNG;;;AAAoC;AAQxD;;;EIME,cAAA;EJLmB;AAGrB;;;;AAAkE;AAElE;;;;;;;;;;;EImBE,SAAA,GAAY,SAAS;AAAA;;;;;;;;;;;;AJEC;AA+ExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBItCgB,oBAAA,CACd,KAAA,EAAO,KAAA,EACP,OAAA,GAAU,2BAA2B"}
|
package/dist/esm/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { n as RouteTree } from "./types-DaXCTxi1.mjs";
|
|
2
|
+
import { $ as State, A as LeaveFn, B as PluginFactory, C as PluginMethod, D as ForwardToCallback, E as DefaultRouteCallback, F as LogLevelConfig, G as SubscribeFn, H as RouteConfigUpdate, I as LoggerConfig, J as LimitsConfig, K as SubscribeState, L as Navigator, M as Listener, N as LogCallback, O as GuardFn, P as LogLevel, Q as SimpleState, R as Options, S as EventsKeys, T as DefaultParamsCallback, U as Router$1, V as Route, W as RouterLogger, X as Params, Y as NavigationOptions, _ as ErrorCodeValues, a as LifecycleApi, at as Unsubscribe, b as EventToNameMap, c as TreeChangedAdd, ct as RouteParams, d as TreeChangedRemove, et as StateContext, f as TreeChangedReplace, g as ErrorCodeToValueMap, h as ErrorCodeKeys, i as InterceptorFn, it as TransitionReason, j as LeaveState, k as GuardFnFactory, l as TreeChangedClear, lt as RouteTreeState, m as TreeStructuralPatch, n as DependenciesApi, nt as TransitionMeta, o as PluginApi, ot as QueryParamsMode, p as TreeChangedUpdate, q as Subscription, r as InterceptableMethodMap, rt as TransitionPhase, s as RoutesApi, st as QueryParamsOptions, t as ContextNamespaceClaim, tt as StateMetaInput, u as TreeChangedEvent, v as EventMethodMap, w as DefaultDependencies, x as EventToPluginMap, y as EventName, z as Plugin } from "./index-CAnGQpnz.mjs";
|
|
3
|
+
import { t as Router } from "./Router-Cy75qbgU.mjs";
|
|
4
|
+
import { t as RouterValidator } from "./RouterValidator-CZ8kPkrI.mjs";
|
|
5
5
|
|
|
6
6
|
//#region src/constants.d.ts
|
|
7
7
|
type ConstantsKeys = "UNKNOWN_ROUTE";
|
|
@@ -25,6 +25,191 @@ declare const constants: Constants;
|
|
|
25
25
|
*/
|
|
26
26
|
declare const events: EventToNameMap;
|
|
27
27
|
//#endregion
|
|
28
|
+
//#region src/RouterError.d.ts
|
|
29
|
+
declare class RouterError extends Error {
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
readonly segment: string | undefined;
|
|
32
|
+
readonly path: string | undefined;
|
|
33
|
+
code: string;
|
|
34
|
+
/**
|
|
35
|
+
* Creates a new RouterError instance.
|
|
36
|
+
*
|
|
37
|
+
* The options object accepts built-in fields (message, segment, path)
|
|
38
|
+
* and any additional custom fields, which will all be attached to the error instance.
|
|
39
|
+
*
|
|
40
|
+
* @param code - The error code (e.g., "ROUTE_NOT_FOUND", "CANNOT_ACTIVATE")
|
|
41
|
+
* @param options - Optional configuration object
|
|
42
|
+
* @param options.message - Custom error message (defaults to code if not provided)
|
|
43
|
+
* @param options.segment - The route segment where the error occurred
|
|
44
|
+
* @param options.path - The full path where the error occurred
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* // Basic error
|
|
49
|
+
* const err1 = new RouterError("ROUTE_NOT_FOUND");
|
|
50
|
+
*
|
|
51
|
+
* // Error with custom message
|
|
52
|
+
* const err2 = new RouterError("ERR", { message: "Something went wrong" });
|
|
53
|
+
*
|
|
54
|
+
* // Error with context and custom fields
|
|
55
|
+
* const err3 = new RouterError("CANNOT_ACTIVATE", {
|
|
56
|
+
* message: "Insufficient permissions",
|
|
57
|
+
* segment: "admin",
|
|
58
|
+
* path: "/admin/users",
|
|
59
|
+
* userId: "123" // custom field
|
|
60
|
+
* });
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
constructor(code: string, {
|
|
64
|
+
message,
|
|
65
|
+
segment,
|
|
66
|
+
path,
|
|
67
|
+
...rest
|
|
68
|
+
}?: {
|
|
69
|
+
[key: string]: unknown;
|
|
70
|
+
message?: string | undefined;
|
|
71
|
+
segment?: string | undefined;
|
|
72
|
+
path?: string | undefined;
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* Updates the error code and conditionally updates the message.
|
|
76
|
+
*
|
|
77
|
+
* If the current message is one of the standard error code values
|
|
78
|
+
* (e.g., "ROUTE_NOT_FOUND", "SAME_STATES"), it will be replaced with the new code.
|
|
79
|
+
* This allows keeping error messages in sync with codes when using standard error codes.
|
|
80
|
+
*
|
|
81
|
+
* If the message is custom (not a standard error code), it will be preserved.
|
|
82
|
+
*
|
|
83
|
+
* @param newCode - The new error code to set
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* // Message follows code (standard error code as message)
|
|
87
|
+
* const err = new RouterError("ROUTE_NOT_FOUND", { message: "ROUTE_NOT_FOUND" });
|
|
88
|
+
* err.setCode("CUSTOM_ERROR"); // message becomes "CUSTOM_ERROR"
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* // Custom message is preserved
|
|
92
|
+
* const err = new RouterError("ERR", { message: "Custom error message" });
|
|
93
|
+
* err.setCode("NEW_CODE"); // message stays "Custom error message"
|
|
94
|
+
*/
|
|
95
|
+
setCode(newCode: string): void;
|
|
96
|
+
/**
|
|
97
|
+
* Copies properties from another Error instance to this RouterError.
|
|
98
|
+
*
|
|
99
|
+
* This method updates the message, cause, and stack trace from the provided error.
|
|
100
|
+
* Useful for wrapping native errors while preserving error context.
|
|
101
|
+
*
|
|
102
|
+
* @param err - The Error instance to copy properties from
|
|
103
|
+
* @throws {TypeError} If err is null or undefined
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* const routerErr = new RouterError("TRANSITION_ERR");
|
|
108
|
+
* try {
|
|
109
|
+
* // some operation that might fail
|
|
110
|
+
* } catch (nativeErr) {
|
|
111
|
+
* routerErr.setErrorInstance(nativeErr);
|
|
112
|
+
* throw routerErr;
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
setErrorInstance(err: Error): void;
|
|
117
|
+
/**
|
|
118
|
+
* Adds custom fields to the error object.
|
|
119
|
+
*
|
|
120
|
+
* This method allows attaching arbitrary data to the error for debugging or logging purposes.
|
|
121
|
+
* All fields become accessible as properties on the error instance and are included in JSON serialization.
|
|
122
|
+
*
|
|
123
|
+
* Reserved method names (setCode, setErrorInstance, setAdditionalFields, hasField, getField, toJSON)
|
|
124
|
+
* are automatically filtered out to prevent accidental overwriting of class methods.
|
|
125
|
+
*
|
|
126
|
+
* @param fields - Object containing custom fields to add to the error
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const err = new RouterError("CANNOT_ACTIVATE");
|
|
131
|
+
* err.setAdditionalFields({
|
|
132
|
+
* userId: "123",
|
|
133
|
+
* attemptedRoute: "/admin",
|
|
134
|
+
* reason: "insufficient permissions"
|
|
135
|
+
* });
|
|
136
|
+
*
|
|
137
|
+
* console.log(err.userId); // "123"
|
|
138
|
+
* console.log(JSON.stringify(err)); // includes all custom fields
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
setAdditionalFields(fields: Record<string, unknown>): void;
|
|
142
|
+
/**
|
|
143
|
+
* Checks if a custom field exists on the error object.
|
|
144
|
+
*
|
|
145
|
+
* This method checks for both custom fields added via setAdditionalFields()
|
|
146
|
+
* and built-in fields (code, message, segment, etc.).
|
|
147
|
+
*
|
|
148
|
+
* @param key - The field name to check
|
|
149
|
+
* @returns `true` if the field exists, `false` otherwise
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* const err = new RouterError("ERR", { segment: "users" });
|
|
154
|
+
* err.setAdditionalFields({ userId: "123" });
|
|
155
|
+
*
|
|
156
|
+
* err.hasField("userId"); // true
|
|
157
|
+
* err.hasField("segment"); // true
|
|
158
|
+
* err.hasField("unknown"); // false
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
hasField(key: string): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Retrieves a custom field value from the error object.
|
|
164
|
+
*
|
|
165
|
+
* This method can access both custom fields and built-in fields.
|
|
166
|
+
* Returns `undefined` if the field doesn't exist.
|
|
167
|
+
*
|
|
168
|
+
* @param key - The field name to retrieve
|
|
169
|
+
* @returns The field value, or `undefined` if it doesn't exist
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```typescript
|
|
173
|
+
* const err = new RouterError("ERR");
|
|
174
|
+
* err.setAdditionalFields({ userId: "123", role: "admin" });
|
|
175
|
+
*
|
|
176
|
+
* err.getField("userId"); // "123"
|
|
177
|
+
* err.getField("role"); // "admin"
|
|
178
|
+
* err.getField("code"); // "ERR" (built-in field)
|
|
179
|
+
* err.getField("unknown"); // undefined
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
getField(key: string): unknown;
|
|
183
|
+
/**
|
|
184
|
+
* Serializes the error to a JSON-compatible object.
|
|
185
|
+
*
|
|
186
|
+
* This method is automatically called by JSON.stringify() and includes:
|
|
187
|
+
* - Built-in fields: code, message, segment (if set), path (if set)
|
|
188
|
+
* - All custom fields added via setAdditionalFields() or constructor
|
|
189
|
+
* - Excludes: stack trace (for security/cleanliness)
|
|
190
|
+
*
|
|
191
|
+
* @returns A plain object representation of the error, suitable for JSON serialization
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* const err = new RouterError("ROUTE_NOT_FOUND", {
|
|
196
|
+
* message: "Route not found",
|
|
197
|
+
* path: "/admin/users/123"
|
|
198
|
+
* });
|
|
199
|
+
* err.setAdditionalFields({ userId: "123" });
|
|
200
|
+
*
|
|
201
|
+
* JSON.stringify(err);
|
|
202
|
+
* // {
|
|
203
|
+
* // "code": "ROUTE_NOT_FOUND",
|
|
204
|
+
* // "message": "Route not found",
|
|
205
|
+
* // "path": "/admin/users/123",
|
|
206
|
+
* // "userId": "123"
|
|
207
|
+
* // }
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
toJSON(): Record<string, unknown>;
|
|
211
|
+
}
|
|
212
|
+
//#endregion
|
|
28
213
|
//#region src/createRouter.d.ts
|
|
29
214
|
/**
|
|
30
215
|
* Creates a new router instance.
|
|
@@ -42,13 +227,13 @@ declare const events: EventToNameMap;
|
|
|
42
227
|
*
|
|
43
228
|
* router.start('/');
|
|
44
229
|
*/
|
|
45
|
-
declare const createRouter: <Dependencies extends DefaultDependencies
|
|
230
|
+
declare const createRouter: <Dependencies extends DefaultDependencies = DefaultDependencies>(routes?: Route<Dependencies>[], options?: Partial<Options>, dependencies?: Dependencies) => Router<Dependencies>;
|
|
46
231
|
//#endregion
|
|
47
232
|
//#region src/getNavigator.d.ts
|
|
48
|
-
declare const getNavigator: <Dependencies extends DefaultDependencies
|
|
233
|
+
declare const getNavigator: <Dependencies extends DefaultDependencies = DefaultDependencies>(router: Router$1<Dependencies>) => Navigator;
|
|
49
234
|
//#endregion
|
|
50
235
|
//#region src/namespaces/RoutesNamespace/forwardChain.d.ts
|
|
51
236
|
declare function resolveForwardChain(startRoute: string, forwardMap: Record<string, string>, maxDepth?: number): string;
|
|
52
237
|
//#endregion
|
|
53
|
-
export { type
|
|
238
|
+
export { type Constants, type ContextNamespaceClaim, type DefaultDependencies, type DefaultParamsCallback, type DefaultRouteCallback, type DependenciesApi, type ErrorCodeKeys, type ErrorCodeToValueMap, type ErrorCodeValues, type ErrorCodes, type EventMethodMap, type EventName, type EventToNameMap, type EventToPluginMap, type EventsKeys, type ForwardToCallback, type GuardFn, type GuardFnFactory, type InterceptableMethodMap, type InterceptorFn, type LeaveFn, type LeaveState, type LifecycleApi, type LimitsConfig, type Listener, type LogCallback, type LogLevel, type LogLevelConfig, type LoggerConfig, type NavigationOptions, type Navigator, type Options, type Params, type Plugin, type PluginApi, type PluginFactory, type PluginMethod, type QueryParamsMode, type QueryParamsOptions, type Route, type RouteConfigUpdate, type RouteParams, type RouteTree, type RouteTreeState, Router, RouterError, type RouterLogger, type RouterValidator, type RoutesApi, type SimpleState, type State, type StateContext, type StateMetaInput, type SubscribeFn, type SubscribeState, type Subscription, type TransitionMeta, type TransitionPhase, type TransitionReason, type TreeChangedAdd, type TreeChangedClear, type TreeChangedEvent, type TreeChangedRemove, type TreeChangedReplace, type TreeChangedUpdate, type TreeStructuralPatch, UNKNOWN_ROUTE, type Unsubscribe, constants, createRouter, errorCodes, events, getNavigator, resolveForwardChain };
|
|
54
239
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/esm/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/constants.ts","../../src/createRouter.ts","../../src/getNavigator.ts","../../src/namespaces/RoutesNamespace/forwardChain.ts"],"mappings":";;;;;;KAWY,aAAA;AAAA,KAEA,SAAA,GAAY,MAAM,CAAC,aAAA;AAAA,KAMnB,UAAA,GAAa,MAAA,CAAO,aAAA,EAAe,eAAA;;;AAR/C;;;cAea,UAAA,EAAY,mBAevB;AA9BuB;AAEzB;;;AAFyB,cAoCZ,aAAA;AAAA,cAEA,SAAA,EAAW,SAEvB;;;;;cAoBY,MAAA,EAAQ,cAQpB
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/constants.ts","../../src/RouterError.ts","../../src/createRouter.ts","../../src/getNavigator.ts","../../src/namespaces/RoutesNamespace/forwardChain.ts"],"mappings":";;;;;;KAWY,aAAA;AAAA,KAEA,SAAA,GAAY,MAAM,CAAC,aAAA;AAAA,KAMnB,UAAA,GAAa,MAAA,CAAO,aAAA,EAAe,eAAA;;;AAR/C;;;cAea,UAAA,EAAY,mBAevB;AA9BuB;AAEzB;;;AAFyB,cAoCZ,aAAA;AAAA,cAEA,SAAA,EAAW,SAEvB;;;;;cAoBY,MAAA,EAAQ,cAQpB;;;cC1DY,WAAA,SAAoB,KAAA;EAAA,CAC9B,GAAA;EAAA,SAIQ,OAAA;EAAA,SACA,IAAA;EAIT,IAAA;;ADpBF;;;;AAAyB;AAEzB;;;;AAA4C;AAM5C;;;;;;;;;;;;AAA8D;AAO9D;;;;AAeE;cCsBE,IAAA;IAEE,OAAA;IACA,OAAA;IACA,IAAA;IAAA,GACG;EAAA;IAAA,CAEF,GAAA;IACD,OAAA;IACA,OAAA;IACA,IAAA;EAAA;EDtBL;;;AAAA;AAoBD;;;;AAQC;;;;AC1DD;;;;;;;;;EAsGE,OAAA,CAAQ,OAAA;EAtG4B;;;;;;;;;;;;;;;;;;;;EAmIpC,gBAAA,CAAiB,GAAA,EAAK,KAAA;EA7Bd;;;;;;;;;;;;;;AA2JQ;;;;AChQlB;;;;;;EDuKE,mBAAA,CAAoB,MAAA,EAAQ,MAAA;ECnKX;;;;;;;;;;;;;;;;;;;EDqMjB,QAAA,CAAS,GAAA;ECnMW;AAAA;;;;ACxBtB;;;;;;;;;;;;;;;EFmPE,QAAA,CAAS,GAAA;EE/OR;;AAiBF;;;;ACvBD;;;;;;;;;AAGgB;;;;;;;;;;;;EHiRd,MAAA,IAAU,MAAA;AAAA;;;;;;;AD3QZ;;;;AAAyB;AAEzB;;;;AAA4C;AAM5C;;cEGa,YAAA,wBACU,mBAAA,GAAsB,mBAAA,EAE3C,MAAA,GAAQ,KAAA,CAAM,YAAA,KACd,OAAA,GAAS,OAAA,CAAQ,OAAA,GACjB,YAAA,GAAc,YAAA,KACb,MAAA,CAAO,YAAA;;;cCxBG,YAAA,wBACU,mBAAA,GAAsB,mBAAA,EAE3C,MAAA,EAAQ,QAAA,CAAO,YAAA,MACd,SAAA;;;iBCNa,mBAAA,CACd,UAAA,UACA,UAAA,EAAY,MAAM,kBAClB,QAAA"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,
|
|
1
|
+
import{C as e,E as t,T as n,g as r,n as i,t as a,w as o}from"./Router-DikzugaD.mjs";const s=(e=[],t={},n={})=>new a(e,t,n),c=new WeakMap,l=e=>{let t=c.get(e);return t||(t=Object.freeze({navigate:e.navigate,getState:e.getState,isActiveRoute:e.isActiveRoute,canNavigateTo:e.canNavigateTo,subscribe:e.subscribe,subscribeLeave:e.subscribeLeave,isLeaveApproved:e.isLeaveApproved}),c.set(e,t)),t};export{a as Router,i as RouterError,e as UNKNOWN_ROUTE,o as constants,s as createRouter,n as errorCodes,t as events,l as getNavigator,r as resolveForwardChain};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/createRouter.ts","../../src/getNavigator.ts"],"sourcesContent":["// packages/core/src/createRouter.ts\n\nimport { Router } from \"./Router\";\n\nimport type {
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/createRouter.ts","../../src/getNavigator.ts"],"sourcesContent":["// packages/core/src/createRouter.ts\n\nimport { Router } from \"./Router\";\n\nimport type { DefaultDependencies, Options, Route } from \"./types\";\n\n/**\n * Creates a new router instance.\n *\n * @param routes - Array of route definitions\n * @param options - Router configuration options\n * @param dependencies - Dependencies to inject into the router\n * @returns A new Router instance\n *\n * @example\n * const router = createRouter([\n * { name: 'home', path: '/' },\n * { name: 'users', path: '/users' },\n * ]);\n *\n * router.start('/');\n */\nexport const createRouter = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n routes: Route<Dependencies>[] = [],\n options: Partial<Options> = {},\n dependencies: Dependencies = {} as Dependencies,\n): Router<Dependencies> => {\n return new Router<Dependencies>(routes, options, dependencies);\n};\n","import type { Navigator, DefaultDependencies, Router } from \"./types\";\n\nconst cache = new WeakMap<Router, Navigator>();\n\nexport const getNavigator = <\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n): Navigator => {\n let nav = cache.get(router);\n\n if (!nav) {\n nav = Object.freeze({\n navigate: router.navigate,\n getState: router.getState,\n isActiveRoute: router.isActiveRoute,\n canNavigateTo: router.canNavigateTo,\n subscribe: router.subscribe,\n subscribeLeave: router.subscribeLeave,\n isLeaveApproved: router.isLeaveApproved,\n } as Navigator);\n cache.set(router, nav);\n }\n\n return nav;\n};\n"],"mappings":"oFAsBA,MAAa,GAGX,EAAgC,CAAC,EACjC,EAA4B,CAAC,EAC7B,EAA6B,CAAC,IAEvB,IAAI,EAAqB,EAAQ,EAAS,CAAY,EC3BzD,EAAQ,IAAI,QAEL,EAGX,GACc,CACd,IAAI,EAAM,EAAM,IAAI,CAAM,EAe1B,OAbK,IACH,EAAM,OAAO,OAAO,CAClB,SAAU,EAAO,SACjB,SAAU,EAAO,SACjB,cAAe,EAAO,cACtB,cAAe,EAAO,cACtB,UAAW,EAAO,UAClB,eAAgB,EAAO,eACvB,gBAAiB,EAAO,eAC1B,CAAc,EACd,EAAM,IAAI,EAAQ,CAAG,GAGhB,CACT"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
//#region src/engine/path-matcher/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Path Matcher Type Definitions.
|
|
4
|
+
*
|
|
5
|
+
* Core types for path matching and parameter extraction.
|
|
6
|
+
*
|
|
7
|
+
* @module path-matcher/types
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Parameter metadata extracted from a route path pattern.
|
|
11
|
+
*/
|
|
12
|
+
interface ParamMeta {
|
|
13
|
+
/**
|
|
14
|
+
* URL parameter names extracted from the path pattern.
|
|
15
|
+
*
|
|
16
|
+
* @example [":id", ":postId"] from "/users/:id/posts/:postId"
|
|
17
|
+
*/
|
|
18
|
+
readonly urlParams: readonly string[];
|
|
19
|
+
/**
|
|
20
|
+
* Query parameter names extracted from the path pattern.
|
|
21
|
+
*
|
|
22
|
+
* @example ["q", "page"] from "/search?q&page"
|
|
23
|
+
*/
|
|
24
|
+
readonly queryParams: readonly string[];
|
|
25
|
+
/**
|
|
26
|
+
* Splat parameter names extracted from the path pattern.
|
|
27
|
+
*
|
|
28
|
+
* @example ["path"] from "/files/*path"
|
|
29
|
+
*/
|
|
30
|
+
readonly spatParams: readonly string[];
|
|
31
|
+
/**
|
|
32
|
+
* Map of parameter names to their type (url or query).
|
|
33
|
+
*
|
|
34
|
+
* @example { id: "url", q: "query" }
|
|
35
|
+
*/
|
|
36
|
+
readonly paramTypeMap: Readonly<Record<string, "url" | "query">>;
|
|
37
|
+
/**
|
|
38
|
+
* Path pattern without query string, pre-computed for buildPath.
|
|
39
|
+
*
|
|
40
|
+
* @example "/users/:id" from "/users/:id?q&page"
|
|
41
|
+
*/
|
|
42
|
+
readonly pathPattern: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* URL parameter encoding strategies.
|
|
46
|
+
*
|
|
47
|
+
* - `default` - encodeURIComponent preserving sub-delimiters (+, :, ', !, ,, ;, *)
|
|
48
|
+
* - `uri` - encodeURI/decodeURI
|
|
49
|
+
* - `uriComponent` - encodeURIComponent/decodeURIComponent
|
|
50
|
+
* - `none` - no encoding/decoding
|
|
51
|
+
*/
|
|
52
|
+
type URLParamsEncodingType = "default" | "uri" | "uriComponent" | "none";
|
|
53
|
+
interface MatcherInputNode {
|
|
54
|
+
readonly name: string;
|
|
55
|
+
readonly path: string;
|
|
56
|
+
readonly fullName: string;
|
|
57
|
+
readonly absolute: boolean;
|
|
58
|
+
readonly children: ReadonlyMap<string, MatcherInputNode>;
|
|
59
|
+
readonly nonAbsoluteChildren: readonly MatcherInputNode[];
|
|
60
|
+
readonly paramMeta: ParamMeta;
|
|
61
|
+
readonly paramTypeMap: Readonly<Record<string, "url" | "query">>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Per-call options for buildPath.
|
|
65
|
+
*/
|
|
66
|
+
interface BuildPathOptions {
|
|
67
|
+
readonly queryParamsMode?: "default" | "strict" | "loose" | undefined;
|
|
68
|
+
readonly trailingSlash?: "default" | "always" | "never" | undefined;
|
|
69
|
+
}
|
|
70
|
+
interface MatchResult {
|
|
71
|
+
readonly segments: readonly MatcherInputNode[];
|
|
72
|
+
readonly params: Readonly<Record<string, unknown>>;
|
|
73
|
+
readonly meta: Readonly<Record<string, Record<string, "url" | "query">>>;
|
|
74
|
+
}
|
|
75
|
+
interface SegmentMatcherOptions {
|
|
76
|
+
caseSensitive?: boolean;
|
|
77
|
+
strictTrailingSlash?: boolean;
|
|
78
|
+
strictQueryParams?: boolean;
|
|
79
|
+
urlParamsEncoding?: URLParamsEncodingType;
|
|
80
|
+
parseQueryString: (queryString: string) => Record<string, unknown>;
|
|
81
|
+
buildQueryString: (params: Record<string, unknown>) => string;
|
|
82
|
+
}
|
|
83
|
+
interface ResolvedMatcherOptions {
|
|
84
|
+
readonly caseSensitive: boolean;
|
|
85
|
+
readonly strictTrailingSlash: boolean;
|
|
86
|
+
readonly strictQueryParams: boolean;
|
|
87
|
+
readonly urlParamsEncoding: URLParamsEncodingType;
|
|
88
|
+
readonly parseQueryString: (queryString: string) => Record<string, unknown>;
|
|
89
|
+
readonly buildQueryString: (params: Record<string, unknown>) => string;
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
//#region src/engine/builder/types.d.ts
|
|
93
|
+
/**
|
|
94
|
+
* Definition of a route for configuration.
|
|
95
|
+
*/
|
|
96
|
+
interface RouteDefinition {
|
|
97
|
+
[key: string]: unknown;
|
|
98
|
+
name: string;
|
|
99
|
+
path: string;
|
|
100
|
+
children?: RouteDefinition[] | undefined;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Immutable route tree node.
|
|
104
|
+
*
|
|
105
|
+
* This is the core data structure of the new route-tree architecture.
|
|
106
|
+
* It contains only data (no methods) and is created by the builder.
|
|
107
|
+
*
|
|
108
|
+
* All caches are pre-computed at build time:
|
|
109
|
+
* - nonAbsoluteChildren: filtered children without absolute paths
|
|
110
|
+
* - fullName: pre-computed "users.profile" instead of runtime join
|
|
111
|
+
*/
|
|
112
|
+
interface RouteTree {
|
|
113
|
+
/** Route segment name (e.g., "users" in "users.profile") */
|
|
114
|
+
readonly name: string;
|
|
115
|
+
/** Route path pattern (e.g., "/users/:id") */
|
|
116
|
+
readonly path: string;
|
|
117
|
+
/** Whether this route uses absolute path matching (path starts with "~") */
|
|
118
|
+
readonly absolute: boolean;
|
|
119
|
+
/** Child route nodes (Map for O(1) lookup by name) */
|
|
120
|
+
readonly children: ReadonlyMap<string, RouteTree>;
|
|
121
|
+
/** Parameter metadata extracted from path pattern (replaces parser dependency) */
|
|
122
|
+
readonly paramMeta: ParamMeta;
|
|
123
|
+
/** Parent node (null for root) */
|
|
124
|
+
readonly parent: RouteTree | null;
|
|
125
|
+
/** Children without absolute paths (for regular matching) */
|
|
126
|
+
readonly nonAbsoluteChildren: readonly RouteTree[];
|
|
127
|
+
/** Pre-computed full name (e.g., "users.profile") */
|
|
128
|
+
readonly fullName: string;
|
|
129
|
+
/**
|
|
130
|
+
* Pre-computed parameter type map for this segment.
|
|
131
|
+
* Cached to avoid recomputing on every navigation.
|
|
132
|
+
* Maps param name → "url" | "query".
|
|
133
|
+
*/
|
|
134
|
+
readonly paramTypeMap: Readonly<Record<string, "url" | "query">>;
|
|
135
|
+
}
|
|
136
|
+
//#endregion
|
|
137
|
+
export { MatcherInputNode as a, MatchResult as i, RouteTree as n, ResolvedMatcherOptions as o, BuildPathOptions as r, SegmentMatcherOptions as s, RouteDefinition as t };
|
|
138
|
+
//# sourceMappingURL=types-DaXCTxi1.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-DaXCTxi1.d.mts","names":[],"sources":["../../src/engine/path-matcher/types.ts","../../src/engine/builder/types.ts"],"mappings":";;AAWA;;;;;;;;;UAAiB,SAAA;EAkCN;;AAAW;AAetB;;EAfW,SA5BA,SAAA;EA2CsB;AAAA;AAMjC;;;EANiC,SApCtB,WAAA;EA+CU;;;;;EAAA,SAxCV,UAAA;EA2CsB;;;;;EAAA,SApCtB,YAAA,EAAc,QAAQ,CAAC,MAAA;EAiCb;;;;;EAAA,SA1BV,WAAA;AAAA;;;;AA6B6B;AAqCxC;;;;KAnDY,qBAAA;AAAA,UAMK,gBAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,QAAA;EAAA,SACA,QAAA;EAAA,SACA,QAAA,EAAU,WAAA,SAAoB,gBAAA;EAAA,SAC9B,mBAAA,WAA8B,gBAAA;EAAA,SAC9B,SAAA,EAAW,SAAA;EAAA,SACX,YAAA,EAAc,QAAA,CAAS,MAAA;AAAA;;;;UAqCjB,gBAAA;EAAA,SACN,eAAA;EAAA,SACA,aAAa;AAAA;AAAA,UA0BP,WAAA;EAAA,SACN,QAAA,WAAmB,gBAAA;EAAA,SACnB,MAAA,EAAQ,QAAA,CAAS,MAAA;EAAA,SACjB,IAAA,EAAM,QAAA,CAAS,MAAA,SAAe,MAAA;AAAA;AAAA,UAOxB,qBAAA;EACf,aAAA;EACA,mBAAA;EACA,iBAAA;EACA,iBAAA,GAAoB,qBAAA;EACpB,gBAAA,GAAmB,WAAA,aAAwB,MAAA;EAC3C,gBAAA,GAAmB,MAAA,EAAQ,MAAA;AAAA;AAAA,UAGZ,sBAAA;EAAA,SACN,aAAA;EAAA,SACA,mBAAA;EAAA,SACA,iBAAA;EAAA,SACA,iBAAA,EAAmB,qBAAA;EAAA,SACnB,gBAAA,GAAmB,WAAA,aAAwB,MAAA;EAAA,SAC3C,gBAAA,GAAmB,MAAA,EAAQ,MAAA;AAAA;;;;;;UCnJrB,eAAA;EAAA,CACd,GAAA;EACD,IAAA;EACA,IAAA;EACA,QAAA,GAAW,eAAe;AAAA;;ADuCK;AAMjC;;;;;;;;UC5BiB,SAAA;EDoCgB;EAAA,SChCtB,IAAA;EDyBA;EAAA,SCtBA,IAAA;EDwBA;EAAA,SCrBA,QAAA;EDuBA;EAAA,SCpBA,QAAA,EAAU,WAAA,SAAoB,SAAA;EDoBA;EAAA,SCjB9B,SAAA,EAAW,SAAA;EDkBmB;EAAA,SCb9B,MAAA,EAAQ,SAAA;EDcG;EAAA,SCXX,mBAAA,WAA8B,SAAA;EDYhB;EAAA,SCTd,QAAA;EDS6B;AAAA;AAqCxC;;;EArCwC,SCF7B,YAAA,EAAc,QAAA,CAAS,MAAA;AAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { $ as State, A as LeaveFn, B as PluginFactory, C as PluginMethod, D as ForwardToCallback, E as DefaultRouteCallback, F as LogLevelConfig, G as SubscribeFn, H as RouteConfigUpdate, I as LoggerConfig, J as LimitsConfig, K as SubscribeState, L as Navigator, M as Listener, N as LogCallback, O as GuardFn, P as LogLevel, Q as SimpleState, R as Options, S as EventsKeys, T as DefaultParamsCallback, U as Router, V as Route, W as RouterLogger, X as Params, Y as NavigationOptions, Z as RouterError, _ as ErrorCodeValues, a as LifecycleApi, at as Unsubscribe, b as EventToNameMap, c as TreeChangedAdd, ct as RouteParams, d as TreeChangedRemove, et as StateContext, f as TreeChangedReplace, g as ErrorCodeToValueMap, h as ErrorCodeKeys, i as InterceptorFn, it as TransitionReason, j as LeaveState, k as GuardFnFactory, l as TreeChangedClear, lt as RouteTreeState, m as TreeStructuralPatch, n as DependenciesApi, nt as TransitionMeta, o as PluginApi, ot as QueryParamsMode, p as TreeChangedUpdate, q as Subscription, r as InterceptableMethodMap, rt as TransitionPhase, s as RoutesApi, st as QueryParamsOptions, t as ContextNamespaceClaim, tt as StateMetaInput, u as TreeChangedEvent, v as EventMethodMap, w as DefaultDependencies, x as EventToPluginMap, y as EventName, z as Plugin } from "./index-CAnGQpnz.mjs";
|
|
2
|
+
export type { ContextNamespaceClaim, DefaultDependencies, DefaultParamsCallback, DefaultRouteCallback, DependenciesApi, ErrorCodeKeys, ErrorCodeToValueMap, ErrorCodeValues, EventMethodMap, EventName, EventToNameMap, EventToPluginMap, EventsKeys, ForwardToCallback, GuardFn, GuardFnFactory, InterceptableMethodMap, InterceptorFn, LeaveFn, LeaveState, LifecycleApi, LimitsConfig, Listener, LogCallback, LogLevel, LogLevelConfig, LoggerConfig, NavigationOptions, Navigator, Options, Params, Plugin, PluginApi, PluginFactory, PluginMethod, QueryParamsMode, QueryParamsOptions, Route, RouteConfigUpdate, RouteParams, RouteTreeState, Router, RouterError, RouterLogger, RoutesApi, SimpleState, State, StateContext, StateMetaInput, SubscribeFn, SubscribeState, Subscription, TransitionMeta, TransitionPhase, TransitionReason, TreeChangedAdd, TreeChangedClear, TreeChangedEvent, TreeChangedRemove, TreeChangedReplace, TreeChangedUpdate, TreeStructuralPatch, Unsubscribe };
|
|
File without changes
|
package/dist/esm/utils.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as SerializeStateOptions, c as HydrateRouterOptions, d as getStaticPaths, f as IncomingMessageLike, g as createRequestScope, h as RequestScopeSource, i as Serialize, l as hydrateRouter, m as RequestScope, n as SerializedRouterState, o as serializeState, p as RequestLike, r as serializeRouterState, s as Deserialize, t as SerializeRouterStateOptions, u as StaticPathEntries } from "./index-
|
|
1
|
+
import { a as SerializeStateOptions, c as HydrateRouterOptions, d as getStaticPaths, f as IncomingMessageLike, g as createRequestScope, h as RequestScopeSource, i as Serialize, l as hydrateRouter, m as RequestScope, n as SerializedRouterState, o as serializeState, p as RequestLike, r as serializeRouterState, s as Deserialize, t as SerializeRouterStateOptions, u as StaticPathEntries } from "./index-DnSU6huX.mjs";
|
|
2
2
|
export { type Deserialize, type HydrateRouterOptions, type IncomingMessageLike, type RequestLike, type RequestScope, type RequestScopeSource, type Serialize, type SerializeRouterStateOptions, type SerializeStateOptions, type SerializedRouterState, type StaticPathEntries, createRequestScope, getStaticPaths, hydrateRouter, serializeRouterState, serializeState };
|
package/dist/esm/utils.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{u as e}from"./buildParamMeta-bOLhLF9h.mjs";import{r as t,t as n}from"./cloneRouter-CAh5vA3l.mjs";function r(e){return`signal`in e&&typeof e.signal==`object`&&e.signal!==void 0&&typeof e.signal.aborted==`boolean`}function i(e,t,i){let a,o,s;if(r(e))s=e.signal;else{let t=new AbortController,n=()=>{t.abort()};s=t.signal,o=()=>{e.on(`close`,n)},a=()=>{e.removeListener?.(`close`,n)}}let c=n(t,{...i,abortSignal:s});o?.();let l=!1,u=()=>l?Promise.resolve():(l=!0,a?.(),c.dispose(),Promise.resolve());return{router:c,signal:s,dispose:u,[Symbol.asyncDispose]:u}}function a(e,t){for(let n of e.children.values())n.children.size===0?t.push(n.fullName):a(n,t)}function o(e){let t=[];return a(e,t),t}async function s(e,n){let r=o(t(e).getTree()),i=[];for(let t of r){let r=n?.[t];if(r){let n=await r();for(let r of n)i.push(e.buildPath(t,r))}else i.push(e.buildPath(t,{}))}return i}async function c(t,n,r){let i=r?.deserialize??JSON.parse,a=typeof n==`string`?i(n):n,o=e(t),s=o.hydrationState;o.hydrationState=a;try{return await t.start(a.path)}finally{o.hydrationState=s}}function l(e,t){return((t?.serialize??JSON.stringify)(e)??`null`).replaceAll(`<`,String.raw`\u003c`).replaceAll(`>`,String.raw`\u003e`).replaceAll(`&`,String.raw`\u0026`)}function u(e,t){let n=t?.excludeContext,r=e.context;if(n?.length){let t=Object.create(null),i=e.context;for(let[e,r]of Object.entries(i))n.includes(e)||(t[e]=r);r=t}let i={name:e.name,params:e.params,path:e.path,context:r};return t?.serialize?l(i,{serialize:t.serialize}):l(i)}export{i as createRequestScope,s as getStaticPaths,c as hydrateRouter,u as serializeRouterState,l as serializeState};
|
|
2
2
|
//# sourceMappingURL=utils.mjs.map
|
package/dist/esm/utils.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","names":[],"sources":["../../src/utils/createRequestScope.ts","../../src/utils/getStaticPaths.ts","../../src/utils/hydrateRouter.ts","../../src/utils/serializeState.ts","../../src/utils/serializeRouterState.ts"],"sourcesContent":["import { cloneRouter } from \"../api/cloneRouter\";\n\nimport type { Router as RouterClass } from \"../Router\";\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\n\n/**\n * Subset of Node's `http.IncomingMessage` that `createRequestScope` relies on:\n * a `\"close\"` event indicating that the client disconnected (or the response\n * was fully sent) and the standard `removeListener` cleanup hook.\n */\nexport interface IncomingMessageLike {\n on: (event: \"close\", listener: () => void) => unknown;\n removeListener?: (event: \"close\", listener: () => void) => unknown;\n}\n\n/**\n * Web `Request`-shaped object — anything carrying an `AbortSignal`. Web\n * runtimes (Bun, Cloudflare Workers, Vite RSC) surface client-disconnect via\n * `request.signal` directly, so no listener attachment is needed.\n */\nexport interface RequestLike {\n signal: AbortSignal;\n}\n\nexport type RequestScopeSource = IncomingMessageLike | RequestLike;\n\nexport interface RequestScope<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> extends AsyncDisposable {\n /**\n * Per-request router clone. Carries `abortSignal` injected into its\n * dependencies — loaders can `getDep(\"abortSignal\")` and pass it to fetch /\n * `withTimeout` for cooperative cancellation when the client disconnects.\n */\n readonly router: RouterClass<Dependencies>;\n\n /**\n * Aborts when the request closes (Node `IncomingMessage`'s `\"close\"` event)\n * or when the upstream Web `Request.signal` aborts.\n */\n readonly signal: AbortSignal;\n\n /**\n * Detach the close listener (if attached to a Node `IncomingMessage`) and\n * dispose the cloned router. Idempotent — safe to call multiple times or in\n * combination with `Symbol.asyncDispose`.\n */\n dispose: () => Promise<void>;\n}\n\nfunction isRequestLike(request: RequestScopeSource): request is RequestLike {\n return (\n \"signal\" in request &&\n typeof (request as Partial<RequestLike>).signal === \"object\" &&\n (request as Partial<RequestLike>).signal !== undefined &&\n typeof request.signal.aborted === \"boolean\"\n );\n}\n\n/**\n * Build a per-request router scope: clones `base`, attaches an `AbortSignal`\n * tied to the request's lifetime, and exposes `dispose()` (plus\n * `Symbol.asyncDispose` for `await using` declarations).\n *\n * Replaces the four-step boilerplate that every server entry repeats:\n *\n * 1. `new AbortController()` per request\n * 2. `req.on(\"close\", () => controller.abort())`\n * 3. `cloneRouter(base, { ...deps, abortSignal: signal })`\n * 4. `try { ... } finally { router.dispose() }`\n *\n * The signal is injected into the router clone under `abortSignal` so existing\n * loaders that read `getDep(\"abortSignal\")` keep working without changes. If\n * `deps` already carries an `abortSignal`, the request-tied signal **wins** (it\n * is spread last) — a caller-supplied `abortSignal` is intentionally overridden,\n * since the scope's purpose is to own the request-lifecycle signal.\n *\n * ## `await using` compatibility\n *\n * The scope implements `Symbol.asyncDispose`, so `await using scope = …` is\n * supported on runtimes that ship the well-known `Symbol.asyncDispose`:\n *\n * - **Node.js 24+** (full support; partial in 20.4–20.17 only for `fs`/`stream`)\n * - **Bun 1.0.23+**, **Deno 1.37+**\n * - **Chrome / Edge 127+**, **Firefox 141+**\n * - **Safari**: not yet supported (irrelevant in practice — this helper is\n * server-side only and never reaches the browser)\n *\n * On Node.js 22 LTS the well-known symbol is unavailable, so `await using`\n * fails. **The bundled SSR examples therefore use the explicit\n * `try/finally` + `await scope.dispose()` form**, which works on every\n * runtime. Use `await using` only when you control the deployment target and\n * know it ships the symbol.\n *\n * @example\n * ```typescript\n * // Explicit dispose — works on Node 18+, all browsers, every CI image\n * export async function render(url: string, req: IncomingMessage) {\n * const scope = createRequestScope(req, baseRouter, { currentUser });\n * try {\n * scope.router.usePlugin(ssrDataPluginFactory(loaders));\n * return await renderShell(scope.router, url);\n * } finally {\n * await scope.dispose();\n * }\n * }\n *\n * // `await using` — Node 24+, Bun, Deno, modern browsers\n * export async function render(url: string, req: IncomingMessage) {\n * await using scope = createRequestScope(req, baseRouter, { currentUser });\n * scope.router.usePlugin(ssrDataPluginFactory(loaders));\n * return await renderShell(scope.router, url);\n * }\n *\n * // Web runtime (signal already on the request)\n * async function handler(request: Request) {\n * const scope = createRequestScope(request, baseRouter, { db });\n * try {\n * scope.router.usePlugin(rscServerPluginFactory(loaders));\n * return await render(scope.router, request.url);\n * } finally {\n * await scope.dispose();\n * }\n * }\n * ```\n */\nexport function createRequestScope<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n request: RequestScopeSource,\n base: Router<Dependencies>,\n deps?: Partial<Dependencies>,\n): RequestScope<Dependencies> {\n let detach: (() => void) | undefined;\n let attach: (() => void) | undefined;\n let signal: AbortSignal;\n\n if (isRequestLike(request)) {\n signal = request.signal;\n } else {\n const controller = new AbortController();\n const onClose = (): void => {\n controller.abort();\n };\n\n signal = controller.signal;\n // Clone-before-attach (#969): defer attaching the \"close\" listener until\n // after cloneRouter succeeds. cloneRouter is synchronous, so no \"close\"\n // macrotask can fire in the gap; and if it throws (e.g. ROUTER_DISPOSED on\n // an already-disposed base) the helper exits without returning a scope\n // handle — so a listener attached here would strand on the request with no\n // way to detach it.\n attach = () => {\n request.on(\"close\", onClose);\n };\n detach = () => {\n request.removeListener?.(\"close\", onClose);\n };\n }\n\n const router = cloneRouter(base, {\n ...deps,\n abortSignal: signal,\n } as Dependencies);\n\n // The clone exists — now it is safe to attach the close listener (Node path\n // only; `attach` is undefined for the Web path).\n attach?.();\n\n let disposed = false;\n\n const dispose = (): Promise<void> => {\n if (disposed) {\n return Promise.resolve();\n }\n\n disposed = true;\n detach?.();\n router.dispose();\n\n return Promise.resolve();\n };\n\n return {\n router,\n signal,\n dispose,\n // eslint-disable-next-line unicorn/no-nonstandard-builtin-properties -- Symbol.asyncDispose is a standard ES2023 well-known symbol (`await using`)\n [Symbol.asyncDispose]: dispose,\n };\n}\n","import { getPluginApi } from \"../api/getPluginApi\";\n\nimport type { DefaultDependencies, Router } from \"@real-router/types\";\nimport type { RouteTree } from \"engine\";\n\nexport type StaticPathEntries = Record<\n string,\n () => Promise<Record<string, string>[]>\n>;\n\nfunction collectLeafRouteNames(node: RouteTree, result: string[]): void {\n for (const child of node.children.values()) {\n if (child.children.size === 0) {\n result.push(child.fullName);\n } else {\n // Accumulate into the shared array rather than\n // `result.push(...getLeafRouteNames(child))`: the spread passes one\n // argument per leaf, and V8 caps spread/apply arguments (~124k on Node 24),\n // so a section with that many static leaf routes threw\n // `RangeError: Maximum call stack size exceeded`. Accumulating also drops\n // the per-subtree intermediate-array allocation.\n collectLeafRouteNames(child, result);\n }\n }\n}\n\nfunction getLeafRouteNames(node: RouteTree): string[] {\n const result: string[] = [];\n\n collectLeafRouteNames(node, result);\n\n return result;\n}\n\nexport async function getStaticPaths<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n entries?: StaticPathEntries,\n): Promise<string[]> {\n const tree = getPluginApi(router).getTree();\n const leafRoutes = getLeafRouteNames(tree);\n const paths: string[] = [];\n\n for (const routeName of leafRoutes) {\n const entryFn = entries?.[routeName];\n\n if (entryFn) {\n const paramSets = await entryFn();\n\n for (const params of paramSets) {\n paths.push(router.buildPath(routeName, params));\n }\n } else {\n paths.push(router.buildPath(routeName, {}));\n }\n }\n\n return paths;\n}\n","import { getInternals } from \"../internals\";\n\nimport type { SerializedRouterState } from \"./serializeRouterState\";\nimport type { Router, State } from \"@real-router/types\";\n\n/**\n * Custom deserializer signature for {@link hydrateRouter} (#606). Compatible\n * with `JSON.parse` (default), `devalue.parse`, `superjson.parse`, or any\n * user-supplied function.\n */\nexport type Deserialize = (json: string) => unknown;\n\nexport interface HydrateRouterOptions {\n /**\n * Custom deserializer (e.g., `devalue.parse` / `superjson.parse`) for\n * matching the `serialize` passed to {@link serializeRouterState}. Defaults\n * to `JSON.parse`. Ignored when `source` is already an object.\n *\n * @default JSON.parse\n *\n * @example\n * ```typescript\n * import * as devalue from \"devalue\";\n * await hydrateRouter(router, ssrJson, { deserialize: devalue.parse });\n * ```\n */\n deserialize?: Deserialize;\n}\n\n/**\n * Hydrate a fresh router from server-serialized State (#563, #596).\n *\n * Accepts either a JSON string (parsed via `JSON.parse` by default, or\n * `options.deserialize` when provided) or a State-shaped object. Extracts\n * `state.path` and delegates to `router.start(state.path)` — the canonical\n * URL is the source of truth for the router on hydration.\n *\n * The full parsed state (incl. `state.context.<namespace>` payloads) is\n * deposited into a one-shot scratchpad on `RouterInternals.hydrationState`\n * before `start()` is invoked and cleared in the matching `finally`. SSR\n * loader plugins (`@real-router/ssr-data-plugin`,\n * `@real-router/rsc-server-plugin`) read this scratchpad to skip their loader\n * call when the server-resolved namespace value is already present — avoiding\n * the post-hydration loader re-run on first paint.\n *\n * Single-shot semantics: the scratchpad is consumed during the first `start()`\n * triggered by `hydrateRouter` regardless of route mismatch; subsequent\n * `start()` calls run loaders normally.\n *\n * @example\n * ```typescript\n * // Client\n * const router = createAppRouter();\n * router.usePlugin(browserPluginFactory());\n * await hydrateRouter(router, window.__SSR_STATE__);\n * ```\n *\n * @example\n * ```typescript\n * // With non-JSON types (Date / Map / Set / RegExp / BigInt) via devalue (#606)\n * import * as devalue from \"devalue\";\n *\n * await hydrateRouter(router, window.__SSR_STATE__, {\n * deserialize: devalue.parse,\n * });\n * ```\n */\nexport async function hydrateRouter(\n router: Router,\n source: string | { path: string },\n options?: HydrateRouterOptions,\n): Promise<State> {\n const deserialize: Deserialize = options?.deserialize ?? JSON.parse;\n const parsed =\n typeof source === \"string\"\n ? (deserialize(source) as SerializedRouterState)\n : (source as SerializedRouterState);\n\n const ctx = getInternals(router);\n const previous = ctx.hydrationState;\n\n ctx.hydrationState = parsed;\n\n try {\n return await router.start(parsed.path);\n } finally {\n ctx.hydrationState = previous;\n }\n}\n","/**\n * Custom serializer signature for {@link serializeState} (#606).\n *\n * Compatible with `JSON.stringify` (default) as well as `devalue.stringify`,\n * `superjson.stringify`, or any user-supplied function that returns a JSON\n * string. The output is run through XSS-safe character escapes regardless\n * of which serializer produced it.\n */\nexport type Serialize = (data: unknown) => string;\n\nexport interface SerializeStateOptions {\n /**\n * Custom serializer (e.g., `devalue.stringify` / `superjson.stringify`) to\n * support non-JSON types (Date / Map / Set / RegExp / BigInt). Defaults to\n * `JSON.stringify`. Output is still XSS-escaped.\n *\n * @default JSON.stringify\n */\n serialize?: Serialize;\n}\n\n/**\n * XSS-safe JSON serialization for embedding data in HTML `<script>` tags.\n *\n * Escapes `<`, `>`, and `&` to their Unicode equivalents to prevent\n * injection via `</script>` or HTML entities inside inline scripts.\n *\n * Pass `options.serialize` to use a custom serializer such as `devalue` or\n * `superjson` for non-JSON types (Date/Map/Set/RegExp/BigInt). The serializer\n * must return a string; XSS-escape is applied to its output.\n *\n * @example\n * ```typescript\n * const json = serializeState({ name: \"home\", path: \"/\" });\n * const html = `<script>window.__STATE__=${json}</script>`;\n * ```\n *\n * @example\n * ```typescript\n * import * as devalue from \"devalue\";\n *\n * const json = serializeState(\n * { date: new Date(), tags: new Set([\"a\", \"b\"]) },\n * { serialize: devalue.stringify },\n * );\n * ```\n */\nexport function serializeState(\n data: unknown,\n options?: SerializeStateOptions,\n): string {\n const serialize = options?.serialize ?? JSON.stringify;\n // JSON.stringify returns undefined for top-level `undefined`, Symbol,\n // function, and other non-serializable values (lib.d.ts types it as\n // `string` but the runtime can return undefined). A custom serializer\n // that returns undefined for unsupported input is normalized the same way.\n const serialized = (serialize(data) as string | undefined) ?? \"null\";\n\n return serialized\n .replaceAll(\"<\", String.raw`\\u003c`)\n .replaceAll(\">\", String.raw`\\u003e`)\n .replaceAll(\"&\", String.raw`\\u0026`);\n}\n","import { serializeState } from \"./serializeState\";\n\nimport type { Serialize } from \"./serializeState\";\nimport type { Params, State } from \"@real-router/types\";\n\n/**\n * Parsed shape produced by {@link serializeRouterState} (after `JSON.parse`).\n *\n * Identical to {@link State} minus `transition` (per-navigation `TransitionMeta`\n * is meaningless after hydration; the client builds its own on commit). Used as\n * the input shape for {@link hydrateRouter} and as the type of the one-shot\n * hydration scratchpad consumed by SSR loader plugins.\n */\nexport type SerializedRouterState<P extends Params = Params> = Omit<\n State<P>,\n \"transition\"\n>;\n\nexport interface SerializeRouterStateOptions {\n /**\n * Plugin context namespaces to strip from the serialized output.\n * Use when a plugin populates `state.context.<ns>` with non-JSON-serializable\n * values (e.g., RSC payload: ReactNode trees containing functions/symbols).\n *\n * @default []\n */\n excludeContext?: readonly string[];\n\n /**\n * Custom serializer (e.g., `devalue.stringify` / `superjson.stringify`) to\n * support non-JSON types in `state.params` and `state.context.<ns>` payloads\n * (Date / Map / Set / RegExp / BigInt). Defaults to `JSON.stringify`.\n *\n * Pair with the matching `deserialize` on `hydrateRouter` to round-trip the\n * extended types on the client.\n *\n * @default JSON.stringify\n *\n * @example\n * ```typescript\n * import * as devalue from \"devalue\";\n *\n * const json = serializeRouterState(state, { serialize: devalue.stringify });\n * ```\n */\n serialize?: Serialize;\n}\n\n/**\n * XSS-safe JSON serialization of router State for SSR → client transport (#563).\n *\n * Strips `state.transition` (per-navigation `TransitionMeta` — meaningless after\n * hydration; the client's hydration commit produces its own `transition`).\n * Keeps `name`, `params`, `path`, and `context` (plugin context namespaces are\n * preserved as-is — server's `state.context.data` from `ssr-data-plugin` and\n * any other plugin claims travel to the client untouched).\n *\n * Pass `options.excludeContext` to strip specific namespaces from the output —\n * required for plugins that publish non-JSON-serializable values (e.g., RSC\n * `ReactNode` trees from `@real-router/rsc-server-plugin`).\n *\n * @example\n * ```typescript\n * // Server\n * const state = await router.start(req.url);\n * const html = `<script>window.__SSR_STATE__=${serializeRouterState(state)}</script>`;\n *\n * // Client\n * await hydrateRouter(router, window.__SSR_STATE__);\n * ```\n *\n * @example\n * ```typescript\n * // With RSC plugin: strip the \"rsc\" namespace before transport\n * const state = await router.start(url);\n * const json = serializeRouterState(state, { excludeContext: [\"rsc\"] });\n * ```\n *\n * @example\n * ```typescript\n * // Non-JSON types (Date / Map / Set / RegExp / BigInt) via devalue (#606)\n * import * as devalue from \"devalue\";\n *\n * const json = serializeRouterState(state, { serialize: devalue.stringify });\n * // On the client:\n * await hydrateRouter(router, json, { deserialize: devalue.parse });\n * ```\n */\nexport function serializeRouterState(\n state: State,\n options?: SerializeRouterStateOptions,\n): string {\n const exclude = options?.excludeContext;\n\n let context = state.context;\n\n if (exclude?.length) {\n // Null-proto target so a literal \"__proto__\" namespace (a real own key on\n // state.context, e.g. written by claimContextNamespace) is copied as a\n // genuine own entry by the plain assignment below — a `{}` target would\n // instead dispatch into the inherited Object.prototype.__proto__ setter and\n // silently drop the data (#1191, same hazard the write path guards).\n const filtered: Record<string, unknown> = Object.create(null) as Record<\n string,\n unknown\n >;\n const source = state.context;\n\n for (const [key, value] of Object.entries(source)) {\n if (!exclude.includes(key)) {\n filtered[key] = value;\n }\n }\n\n context = filtered;\n }\n\n const payload = {\n name: state.name,\n params: state.params,\n path: state.path,\n context,\n };\n\n return options?.serialize\n ? serializeState(payload, { serialize: options.serialize })\n : serializeState(payload);\n}\n"],"mappings":"6FAkDA,SAAS,EAAc,EAAqD,CAC1E,MACE,WAAY,GACZ,OAAQ,EAAiC,QAAW,UACnD,EAAiC,SAAW,IAAA,IAC7C,OAAO,EAAQ,OAAO,SAAY,SAEtC,CAqEA,SAAgB,EAGd,EACA,EACA,EAC4B,CAC5B,IAAI,EACA,EACA,EAEJ,GAAI,EAAc,CAAO,EACvB,EAAS,EAAQ,WACZ,CACL,IAAM,EAAa,IAAI,gBACjB,MAAsB,CAC1B,EAAW,MAAM,CACnB,EAEA,EAAS,EAAW,OAOpB,MAAe,CACb,EAAQ,GAAG,QAAS,CAAO,CAC7B,EACA,MAAe,CACb,EAAQ,iBAAiB,QAAS,CAAO,CAC3C,CACF,CAEA,IAAM,EAAS,EAAY,EAAM,CAC/B,GAAG,EACH,YAAa,CACf,CAAiB,EAIjB,IAAS,EAET,IAAI,EAAW,GAET,MACA,EACK,QAAQ,QAAQ,GAGzB,EAAW,GACX,IAAS,EACT,EAAO,QAAQ,EAER,QAAQ,QAAQ,GAGzB,MAAO,CACL,SACA,SACA,WAEC,OAAO,cAAe,CACzB,CACF,CCpLA,SAAS,EAAsB,EAAiB,EAAwB,CACtE,IAAK,IAAM,KAAS,EAAK,SAAS,OAAO,EACnC,EAAM,SAAS,OAAS,EAC1B,EAAO,KAAK,EAAM,QAAQ,EAQ1B,EAAsB,EAAO,CAAM,CAGzC,CAEA,SAAS,EAAkB,EAA2B,CACpD,IAAM,EAAmB,CAAC,EAI1B,OAFA,EAAsB,EAAM,CAAM,EAE3B,CACT,CAEA,eAAsB,EAGpB,EACA,EACmB,CAEnB,IAAM,EAAa,EADN,EAAa,CAAM,CAAC,CAAC,QACM,CAAC,EACnC,EAAkB,CAAC,EAEzB,IAAK,IAAM,KAAa,EAAY,CAClC,IAAM,EAAU,IAAU,GAE1B,GAAI,EAAS,CACX,IAAM,EAAY,MAAM,EAAQ,EAEhC,IAAK,IAAM,KAAU,EACnB,EAAM,KAAK,EAAO,UAAU,EAAW,CAAM,CAAC,CAElD,MACE,EAAM,KAAK,EAAO,UAAU,EAAW,CAAC,CAAC,CAAC,CAE9C,CAEA,OAAO,CACT,CCQA,eAAsB,EACpB,EACA,EACA,EACgB,CAChB,IAAM,EAA2B,GAAS,aAAe,KAAK,MACxD,EACJ,OAAO,GAAW,SACb,EAAY,CAAM,EAClB,EAED,EAAM,EAAa,CAAM,EACzB,EAAW,EAAI,eAErB,EAAI,eAAiB,EAErB,GAAI,CACF,OAAO,MAAM,EAAO,MAAM,EAAO,IAAI,CACvC,QAAU,CACR,EAAI,eAAiB,CACvB,CACF,CCzCA,SAAgB,EACd,EACA,EACQ,CAQR,QAPkB,GAAS,WAAa,KAAK,UAAA,CAKf,CAAI,GAA4B,OAAA,CAG3D,WAAW,IAAK,OAAO,GAAG,QAAQ,CAAC,CACnC,WAAW,IAAK,OAAO,GAAG,QAAQ,CAAC,CACnC,WAAW,IAAK,OAAO,GAAG,QAAQ,CACvC,CC0BA,SAAgB,EACd,EACA,EACQ,CACR,IAAM,EAAU,GAAS,eAErB,EAAU,EAAM,QAEpB,GAAI,GAAS,OAAQ,CAMnB,IAAM,EAAoC,OAAO,OAAO,IAAI,EAItD,EAAS,EAAM,QAErB,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAM,EACzC,EAAQ,SAAS,CAAG,IACvB,EAAS,GAAO,GAIpB,EAAU,CACZ,CAEA,IAAM,EAAU,CACd,KAAM,EAAM,KACZ,OAAQ,EAAM,OACd,KAAM,EAAM,KACZ,SACF,EAEA,OAAO,GAAS,UACZ,EAAe,EAAS,CAAE,UAAW,EAAQ,SAAU,CAAC,EACxD,EAAe,CAAO,CAC5B"}
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../src/utils/createRequestScope.ts","../../src/utils/getStaticPaths.ts","../../src/utils/hydrateRouter.ts","../../src/utils/serializeState.ts","../../src/utils/serializeRouterState.ts"],"sourcesContent":["import { cloneRouter } from \"../api/cloneRouter\";\n\nimport type { Router as RouterClass } from \"../Router\";\nimport type { DefaultDependencies, Router } from \"../types\";\n\n/**\n * Subset of Node's `http.IncomingMessage` that `createRequestScope` relies on:\n * a `\"close\"` event indicating that the client disconnected (or the response\n * was fully sent) and the standard `removeListener` cleanup hook.\n */\nexport interface IncomingMessageLike {\n on: (event: \"close\", listener: () => void) => unknown;\n removeListener?: (event: \"close\", listener: () => void) => unknown;\n}\n\n/**\n * Web `Request`-shaped object — anything carrying an `AbortSignal`. Web\n * runtimes (Bun, Cloudflare Workers, Vite RSC) surface client-disconnect via\n * `request.signal` directly, so no listener attachment is needed.\n */\nexport interface RequestLike {\n signal: AbortSignal;\n}\n\nexport type RequestScopeSource = IncomingMessageLike | RequestLike;\n\nexport interface RequestScope<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n> extends AsyncDisposable {\n /**\n * Per-request router clone. Carries `abortSignal` injected into its\n * dependencies — loaders can `getDep(\"abortSignal\")` and pass it to fetch /\n * `withTimeout` for cooperative cancellation when the client disconnects.\n */\n readonly router: RouterClass<Dependencies>;\n\n /**\n * Aborts when the request closes (Node `IncomingMessage`'s `\"close\"` event)\n * or when the upstream Web `Request.signal` aborts.\n */\n readonly signal: AbortSignal;\n\n /**\n * Detach the close listener (if attached to a Node `IncomingMessage`) and\n * dispose the cloned router. Idempotent — safe to call multiple times or in\n * combination with `Symbol.asyncDispose`.\n */\n dispose: () => Promise<void>;\n}\n\nfunction isRequestLike(request: RequestScopeSource): request is RequestLike {\n return (\n \"signal\" in request &&\n typeof (request as Partial<RequestLike>).signal === \"object\" &&\n (request as Partial<RequestLike>).signal !== undefined &&\n typeof request.signal.aborted === \"boolean\"\n );\n}\n\n/**\n * Build a per-request router scope: clones `base`, attaches an `AbortSignal`\n * tied to the request's lifetime, and exposes `dispose()` (plus\n * `Symbol.asyncDispose` for `await using` declarations).\n *\n * Replaces the four-step boilerplate that every server entry repeats:\n *\n * 1. `new AbortController()` per request\n * 2. `req.on(\"close\", () => controller.abort())`\n * 3. `cloneRouter(base, { ...deps, abortSignal: signal })`\n * 4. `try { ... } finally { router.dispose() }`\n *\n * The signal is injected into the router clone under `abortSignal` so existing\n * loaders that read `getDep(\"abortSignal\")` keep working without changes. If\n * `deps` already carries an `abortSignal`, the request-tied signal **wins** (it\n * is spread last) — a caller-supplied `abortSignal` is intentionally overridden,\n * since the scope's purpose is to own the request-lifecycle signal.\n *\n * ## `await using` compatibility\n *\n * The scope implements `Symbol.asyncDispose`, so `await using scope = …` is\n * supported on runtimes that ship the well-known `Symbol.asyncDispose`:\n *\n * - **Node.js 24+** (full support; partial in 20.4–20.17 only for `fs`/`stream`)\n * - **Bun 1.0.23+**, **Deno 1.37+**\n * - **Chrome / Edge 127+**, **Firefox 141+**\n * - **Safari**: not yet supported (irrelevant in practice — this helper is\n * server-side only and never reaches the browser)\n *\n * On Node.js 22 LTS the well-known symbol is unavailable, so `await using`\n * fails. **The bundled SSR examples therefore use the explicit\n * `try/finally` + `await scope.dispose()` form**, which works on every\n * runtime. Use `await using` only when you control the deployment target and\n * know it ships the symbol.\n *\n * @example\n * ```typescript\n * // Explicit dispose — works on Node 18+, all browsers, every CI image\n * export async function render(url: string, req: IncomingMessage) {\n * const scope = createRequestScope(req, baseRouter, { currentUser });\n * try {\n * scope.router.usePlugin(ssrDataPluginFactory(loaders));\n * return await renderShell(scope.router, url);\n * } finally {\n * await scope.dispose();\n * }\n * }\n *\n * // `await using` — Node 24+, Bun, Deno, modern browsers\n * export async function render(url: string, req: IncomingMessage) {\n * await using scope = createRequestScope(req, baseRouter, { currentUser });\n * scope.router.usePlugin(ssrDataPluginFactory(loaders));\n * return await renderShell(scope.router, url);\n * }\n *\n * // Web runtime (signal already on the request)\n * async function handler(request: Request) {\n * const scope = createRequestScope(request, baseRouter, { db });\n * try {\n * scope.router.usePlugin(rscServerPluginFactory(loaders));\n * return await render(scope.router, request.url);\n * } finally {\n * await scope.dispose();\n * }\n * }\n * ```\n */\nexport function createRequestScope<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n request: RequestScopeSource,\n base: Router<Dependencies>,\n deps?: Partial<Dependencies>,\n): RequestScope<Dependencies> {\n let detach: (() => void) | undefined;\n let attach: (() => void) | undefined;\n let signal: AbortSignal;\n\n if (isRequestLike(request)) {\n signal = request.signal;\n } else {\n const controller = new AbortController();\n const onClose = (): void => {\n controller.abort();\n };\n\n signal = controller.signal;\n // Clone-before-attach (#969): defer attaching the \"close\" listener until\n // after cloneRouter succeeds. cloneRouter is synchronous, so no \"close\"\n // macrotask can fire in the gap; and if it throws (e.g. ROUTER_DISPOSED on\n // an already-disposed base) the helper exits without returning a scope\n // handle — so a listener attached here would strand on the request with no\n // way to detach it.\n attach = () => {\n request.on(\"close\", onClose);\n };\n detach = () => {\n request.removeListener?.(\"close\", onClose);\n };\n }\n\n const router = cloneRouter(base, {\n ...deps,\n abortSignal: signal,\n } as Dependencies);\n\n // The clone exists — now it is safe to attach the close listener (Node path\n // only; `attach` is undefined for the Web path).\n attach?.();\n\n let disposed = false;\n\n const dispose = (): Promise<void> => {\n if (disposed) {\n return Promise.resolve();\n }\n\n disposed = true;\n detach?.();\n router.dispose();\n\n return Promise.resolve();\n };\n\n return {\n router,\n signal,\n dispose,\n // eslint-disable-next-line unicorn/no-nonstandard-builtin-properties -- Symbol.asyncDispose is a standard ES2023 well-known symbol (`await using`)\n [Symbol.asyncDispose]: dispose,\n };\n}\n","import { getPluginApi } from \"../api/getPluginApi\";\n\nimport type { RouteTree } from \"../engine\";\nimport type { DefaultDependencies, Router } from \"../types\";\n\nexport type StaticPathEntries = Record<\n string,\n () => Promise<Record<string, string>[]>\n>;\n\nfunction collectLeafRouteNames(node: RouteTree, result: string[]): void {\n for (const child of node.children.values()) {\n if (child.children.size === 0) {\n result.push(child.fullName);\n } else {\n // Accumulate into the shared array rather than\n // `result.push(...getLeafRouteNames(child))`: the spread passes one\n // argument per leaf, and V8 caps spread/apply arguments (~124k on Node 24),\n // so a section with that many static leaf routes threw\n // `RangeError: Maximum call stack size exceeded`. Accumulating also drops\n // the per-subtree intermediate-array allocation.\n collectLeafRouteNames(child, result);\n }\n }\n}\n\nfunction getLeafRouteNames(node: RouteTree): string[] {\n const result: string[] = [];\n\n collectLeafRouteNames(node, result);\n\n return result;\n}\n\nexport async function getStaticPaths<\n Dependencies extends DefaultDependencies = DefaultDependencies,\n>(\n router: Router<Dependencies>,\n entries?: StaticPathEntries,\n): Promise<string[]> {\n const tree = getPluginApi(router).getTree();\n const leafRoutes = getLeafRouteNames(tree);\n const paths: string[] = [];\n\n for (const routeName of leafRoutes) {\n const entryFn = entries?.[routeName];\n\n if (entryFn) {\n const paramSets = await entryFn();\n\n for (const params of paramSets) {\n paths.push(router.buildPath(routeName, params));\n }\n } else {\n paths.push(router.buildPath(routeName, {}));\n }\n }\n\n return paths;\n}\n","import { getInternals } from \"../internals\";\n\nimport type { SerializedRouterState } from \"./serializeRouterState\";\nimport type { Router, State } from \"../types\";\n\n/**\n * Custom deserializer signature for {@link hydrateRouter} (#606). Compatible\n * with `JSON.parse` (default), `devalue.parse`, `superjson.parse`, or any\n * user-supplied function.\n */\nexport type Deserialize = (json: string) => unknown;\n\nexport interface HydrateRouterOptions {\n /**\n * Custom deserializer (e.g., `devalue.parse` / `superjson.parse`) for\n * matching the `serialize` passed to {@link serializeRouterState}. Defaults\n * to `JSON.parse`. Ignored when `source` is already an object.\n *\n * @default JSON.parse\n *\n * @example\n * ```typescript\n * import * as devalue from \"devalue\";\n * await hydrateRouter(router, ssrJson, { deserialize: devalue.parse });\n * ```\n */\n deserialize?: Deserialize;\n}\n\n/**\n * Hydrate a fresh router from server-serialized State (#563, #596).\n *\n * Accepts either a JSON string (parsed via `JSON.parse` by default, or\n * `options.deserialize` when provided) or a State-shaped object. Extracts\n * `state.path` and delegates to `router.start(state.path)` — the canonical\n * URL is the source of truth for the router on hydration.\n *\n * The full parsed state (incl. `state.context.<namespace>` payloads) is\n * deposited into a one-shot scratchpad on `RouterInternals.hydrationState`\n * before `start()` is invoked and cleared in the matching `finally`. SSR\n * loader plugins (`@real-router/ssr-data-plugin`,\n * `@real-router/rsc-server-plugin`) read this scratchpad to skip their loader\n * call when the server-resolved namespace value is already present — avoiding\n * the post-hydration loader re-run on first paint.\n *\n * Single-shot semantics: the scratchpad is consumed during the first `start()`\n * triggered by `hydrateRouter` regardless of route mismatch; subsequent\n * `start()` calls run loaders normally.\n *\n * @example\n * ```typescript\n * // Client\n * const router = createAppRouter();\n * router.usePlugin(browserPluginFactory());\n * await hydrateRouter(router, window.__SSR_STATE__);\n * ```\n *\n * @example\n * ```typescript\n * // With non-JSON types (Date / Map / Set / RegExp / BigInt) via devalue (#606)\n * import * as devalue from \"devalue\";\n *\n * await hydrateRouter(router, window.__SSR_STATE__, {\n * deserialize: devalue.parse,\n * });\n * ```\n */\nexport async function hydrateRouter(\n router: Router,\n source: string | { path: string },\n options?: HydrateRouterOptions,\n): Promise<State> {\n const deserialize: Deserialize = options?.deserialize ?? JSON.parse;\n const parsed =\n typeof source === \"string\"\n ? (deserialize(source) as SerializedRouterState)\n : (source as SerializedRouterState);\n\n const ctx = getInternals(router);\n const previous = ctx.hydrationState;\n\n ctx.hydrationState = parsed;\n\n try {\n return await router.start(parsed.path);\n } finally {\n ctx.hydrationState = previous;\n }\n}\n","/**\n * Custom serializer signature for {@link serializeState} (#606).\n *\n * Compatible with `JSON.stringify` (default) as well as `devalue.stringify`,\n * `superjson.stringify`, or any user-supplied function that returns a JSON\n * string. The output is run through XSS-safe character escapes regardless\n * of which serializer produced it.\n */\nexport type Serialize = (data: unknown) => string;\n\nexport interface SerializeStateOptions {\n /**\n * Custom serializer (e.g., `devalue.stringify` / `superjson.stringify`) to\n * support non-JSON types (Date / Map / Set / RegExp / BigInt). Defaults to\n * `JSON.stringify`. Output is still XSS-escaped.\n *\n * @default JSON.stringify\n */\n serialize?: Serialize;\n}\n\n/**\n * XSS-safe JSON serialization for embedding data in HTML `<script>` tags.\n *\n * Escapes `<`, `>`, and `&` to their Unicode equivalents to prevent\n * injection via `</script>` or HTML entities inside inline scripts.\n *\n * Pass `options.serialize` to use a custom serializer such as `devalue` or\n * `superjson` for non-JSON types (Date/Map/Set/RegExp/BigInt). The serializer\n * must return a string; XSS-escape is applied to its output.\n *\n * @example\n * ```typescript\n * const json = serializeState({ name: \"home\", path: \"/\" });\n * const html = `<script>window.__STATE__=${json}</script>`;\n * ```\n *\n * @example\n * ```typescript\n * import * as devalue from \"devalue\";\n *\n * const json = serializeState(\n * { date: new Date(), tags: new Set([\"a\", \"b\"]) },\n * { serialize: devalue.stringify },\n * );\n * ```\n */\nexport function serializeState(\n data: unknown,\n options?: SerializeStateOptions,\n): string {\n const serialize = options?.serialize ?? JSON.stringify;\n // JSON.stringify returns undefined for top-level `undefined`, Symbol,\n // function, and other non-serializable values (lib.d.ts types it as\n // `string` but the runtime can return undefined). A custom serializer\n // that returns undefined for unsupported input is normalized the same way.\n const serialized = (serialize(data) as string | undefined) ?? \"null\";\n\n return serialized\n .replaceAll(\"<\", String.raw`\\u003c`)\n .replaceAll(\">\", String.raw`\\u003e`)\n .replaceAll(\"&\", String.raw`\\u0026`);\n}\n","import { serializeState } from \"./serializeState\";\n\nimport type { Serialize } from \"./serializeState\";\nimport type { Params, State } from \"../types\";\n\n/**\n * Parsed shape produced by {@link serializeRouterState} (after `JSON.parse`).\n *\n * Identical to {@link State} minus `transition` (per-navigation `TransitionMeta`\n * is meaningless after hydration; the client builds its own on commit). Used as\n * the input shape for {@link hydrateRouter} and as the type of the one-shot\n * hydration scratchpad consumed by SSR loader plugins.\n */\nexport type SerializedRouterState<P extends Params = Params> = Omit<\n State<P>,\n \"transition\"\n>;\n\nexport interface SerializeRouterStateOptions {\n /**\n * Plugin context namespaces to strip from the serialized output.\n * Use when a plugin populates `state.context.<ns>` with non-JSON-serializable\n * values (e.g., RSC payload: ReactNode trees containing functions/symbols).\n *\n * @default []\n */\n excludeContext?: readonly string[];\n\n /**\n * Custom serializer (e.g., `devalue.stringify` / `superjson.stringify`) to\n * support non-JSON types in `state.params` and `state.context.<ns>` payloads\n * (Date / Map / Set / RegExp / BigInt). Defaults to `JSON.stringify`.\n *\n * Pair with the matching `deserialize` on `hydrateRouter` to round-trip the\n * extended types on the client.\n *\n * @default JSON.stringify\n *\n * @example\n * ```typescript\n * import * as devalue from \"devalue\";\n *\n * const json = serializeRouterState(state, { serialize: devalue.stringify });\n * ```\n */\n serialize?: Serialize;\n}\n\n/**\n * XSS-safe JSON serialization of router State for SSR → client transport (#563).\n *\n * Strips `state.transition` (per-navigation `TransitionMeta` — meaningless after\n * hydration; the client's hydration commit produces its own `transition`).\n * Keeps `name`, `params`, `path`, and `context` (plugin context namespaces are\n * preserved as-is — server's `state.context.data` from `ssr-data-plugin` and\n * any other plugin claims travel to the client untouched).\n *\n * Pass `options.excludeContext` to strip specific namespaces from the output —\n * required for plugins that publish non-JSON-serializable values (e.g., RSC\n * `ReactNode` trees from `@real-router/rsc-server-plugin`).\n *\n * @example\n * ```typescript\n * // Server\n * const state = await router.start(req.url);\n * const html = `<script>window.__SSR_STATE__=${serializeRouterState(state)}</script>`;\n *\n * // Client\n * await hydrateRouter(router, window.__SSR_STATE__);\n * ```\n *\n * @example\n * ```typescript\n * // With RSC plugin: strip the \"rsc\" namespace before transport\n * const state = await router.start(url);\n * const json = serializeRouterState(state, { excludeContext: [\"rsc\"] });\n * ```\n *\n * @example\n * ```typescript\n * // Non-JSON types (Date / Map / Set / RegExp / BigInt) via devalue (#606)\n * import * as devalue from \"devalue\";\n *\n * const json = serializeRouterState(state, { serialize: devalue.stringify });\n * // On the client:\n * await hydrateRouter(router, json, { deserialize: devalue.parse });\n * ```\n */\nexport function serializeRouterState(\n state: State,\n options?: SerializeRouterStateOptions,\n): string {\n const exclude = options?.excludeContext;\n\n let context = state.context;\n\n if (exclude?.length) {\n // Null-proto target so a literal \"__proto__\" namespace (a real own key on\n // state.context, e.g. written by claimContextNamespace) is copied as a\n // genuine own entry by the plain assignment below — a `{}` target would\n // instead dispatch into the inherited Object.prototype.__proto__ setter and\n // silently drop the data (#1191, same hazard the write path guards).\n const filtered: Record<string, unknown> = Object.create(null) as Record<\n string,\n unknown\n >;\n const source = state.context;\n\n for (const [key, value] of Object.entries(source)) {\n if (!exclude.includes(key)) {\n filtered[key] = value;\n }\n }\n\n context = filtered;\n }\n\n const payload = {\n name: state.name,\n params: state.params,\n path: state.path,\n context,\n };\n\n return options?.serialize\n ? serializeState(payload, { serialize: options.serialize })\n : serializeState(payload);\n}\n"],"mappings":"wGAkDA,SAAS,EAAc,EAAqD,CAC1E,MACE,WAAY,GACZ,OAAQ,EAAiC,QAAW,UACnD,EAAiC,SAAW,IAAA,IAC7C,OAAO,EAAQ,OAAO,SAAY,SAEtC,CAqEA,SAAgB,EAGd,EACA,EACA,EAC4B,CAC5B,IAAI,EACA,EACA,EAEJ,GAAI,EAAc,CAAO,EACvB,EAAS,EAAQ,WACZ,CACL,IAAM,EAAa,IAAI,gBACjB,MAAsB,CAC1B,EAAW,MAAM,CACnB,EAEA,EAAS,EAAW,OAOpB,MAAe,CACb,EAAQ,GAAG,QAAS,CAAO,CAC7B,EACA,MAAe,CACb,EAAQ,iBAAiB,QAAS,CAAO,CAC3C,CACF,CAEA,IAAM,EAAS,EAAY,EAAM,CAC/B,GAAG,EACH,YAAa,CACf,CAAiB,EAIjB,IAAS,EAET,IAAI,EAAW,GAET,MACA,EACK,QAAQ,QAAQ,GAGzB,EAAW,GACX,IAAS,EACT,EAAO,QAAQ,EAER,QAAQ,QAAQ,GAGzB,MAAO,CACL,SACA,SACA,WAEC,OAAO,cAAe,CACzB,CACF,CCpLA,SAAS,EAAsB,EAAiB,EAAwB,CACtE,IAAK,IAAM,KAAS,EAAK,SAAS,OAAO,EACnC,EAAM,SAAS,OAAS,EAC1B,EAAO,KAAK,EAAM,QAAQ,EAQ1B,EAAsB,EAAO,CAAM,CAGzC,CAEA,SAAS,EAAkB,EAA2B,CACpD,IAAM,EAAmB,CAAC,EAI1B,OAFA,EAAsB,EAAM,CAAM,EAE3B,CACT,CAEA,eAAsB,EAGpB,EACA,EACmB,CAEnB,IAAM,EAAa,EADN,EAAa,CAAM,CAAC,CAAC,QACM,CAAC,EACnC,EAAkB,CAAC,EAEzB,IAAK,IAAM,KAAa,EAAY,CAClC,IAAM,EAAU,IAAU,GAE1B,GAAI,EAAS,CACX,IAAM,EAAY,MAAM,EAAQ,EAEhC,IAAK,IAAM,KAAU,EACnB,EAAM,KAAK,EAAO,UAAU,EAAW,CAAM,CAAC,CAElD,MACE,EAAM,KAAK,EAAO,UAAU,EAAW,CAAC,CAAC,CAAC,CAE9C,CAEA,OAAO,CACT,CCQA,eAAsB,EACpB,EACA,EACA,EACgB,CAChB,IAAM,EAA2B,GAAS,aAAe,KAAK,MACxD,EACJ,OAAO,GAAW,SACb,EAAY,CAAM,EAClB,EAED,EAAM,EAAa,CAAM,EACzB,EAAW,EAAI,eAErB,EAAI,eAAiB,EAErB,GAAI,CACF,OAAO,MAAM,EAAO,MAAM,EAAO,IAAI,CACvC,QAAU,CACR,EAAI,eAAiB,CACvB,CACF,CCzCA,SAAgB,EACd,EACA,EACQ,CAQR,QAPkB,GAAS,WAAa,KAAK,UAAA,CAKf,CAAI,GAA4B,OAAA,CAG3D,WAAW,IAAK,OAAO,GAAG,QAAQ,CAAC,CACnC,WAAW,IAAK,OAAO,GAAG,QAAQ,CAAC,CACnC,WAAW,IAAK,OAAO,GAAG,QAAQ,CACvC,CC0BA,SAAgB,EACd,EACA,EACQ,CACR,IAAM,EAAU,GAAS,eAErB,EAAU,EAAM,QAEpB,GAAI,GAAS,OAAQ,CAMnB,IAAM,EAAoC,OAAO,OAAO,IAAI,EAItD,EAAS,EAAM,QAErB,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAM,EACzC,EAAQ,SAAS,CAAG,IACvB,EAAS,GAAO,GAIpB,EAAU,CACZ,CAEA,IAAM,EAAU,CACd,KAAM,EAAM,KACZ,OAAQ,EAAM,OACd,KAAM,EAAM,KACZ,SACF,EAEA,OAAO,GAAS,UACZ,EAAe,EAAS,CAAE,UAAW,EAAQ,SAAU,CAAC,EACxD,EAAe,CAAO,CAC5B"}
|