@liteforge/router 0.1.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/dist/guards.js ADDED
@@ -0,0 +1,268 @@
1
+ import { emitGuardRun } from '@liteforge/core';
2
+ // =============================================================================
3
+ // Guard Definition
4
+ // =============================================================================
5
+ /**
6
+ * Define a named route guard
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const authGuard = defineGuard('auth', ({ to, from, use }) => {
11
+ * const auth = use('auth');
12
+ * if (!auth.isAuthenticated()) {
13
+ * return `/login?redirect=${encodeURIComponent(to.path)}`;
14
+ * }
15
+ * return true;
16
+ * });
17
+ *
18
+ * // Parameterized guard
19
+ * const roleGuard = defineGuard('role', ({ use, param }) => {
20
+ * return use('auth').hasRole(param) || '/unauthorized';
21
+ * });
22
+ * ```
23
+ */
24
+ export function defineGuard(name, handler) {
25
+ return { name, handler };
26
+ }
27
+ // =============================================================================
28
+ // Guard Registry
29
+ // =============================================================================
30
+ /**
31
+ * Guard registry for managing named guards
32
+ */
33
+ export class GuardRegistry {
34
+ constructor() {
35
+ this.guards = new Map();
36
+ }
37
+ /**
38
+ * Register a guard
39
+ */
40
+ register(guard) {
41
+ if (this.guards.has(guard.name)) {
42
+ console.warn(`Guard "${guard.name}" is being overwritten`);
43
+ }
44
+ this.guards.set(guard.name, guard);
45
+ }
46
+ /**
47
+ * Register multiple guards
48
+ */
49
+ registerAll(guards) {
50
+ for (const guard of guards) {
51
+ this.register(guard);
52
+ }
53
+ }
54
+ /**
55
+ * Get a guard by name
56
+ */
57
+ get(name) {
58
+ return this.guards.get(name);
59
+ }
60
+ /**
61
+ * Check if a guard exists
62
+ */
63
+ has(name) {
64
+ return this.guards.has(name);
65
+ }
66
+ /**
67
+ * Unregister a guard
68
+ */
69
+ unregister(name) {
70
+ return this.guards.delete(name);
71
+ }
72
+ /**
73
+ * Get all guard names
74
+ */
75
+ names() {
76
+ return Array.from(this.guards.keys());
77
+ }
78
+ /**
79
+ * Clear all guards
80
+ */
81
+ clear() {
82
+ this.guards.clear();
83
+ }
84
+ /**
85
+ * Get the internal map (for route compilation)
86
+ */
87
+ getMap() {
88
+ return this.guards;
89
+ }
90
+ }
91
+ // =============================================================================
92
+ // Guard Execution
93
+ // =============================================================================
94
+ /**
95
+ * Execute a single guard and normalize the result
96
+ */
97
+ async function executeGuard(guard, context) {
98
+ const startTime = performance.now();
99
+ try {
100
+ const result = await guard.handler(context);
101
+ const normalized = normalizeGuardResult(result);
102
+ const duration = performance.now() - startTime;
103
+ // Emit guard run event (zero cost if debug not enabled)
104
+ emitGuardRun(guard.name, context.to.path, normalized.allowed, duration);
105
+ return normalized;
106
+ }
107
+ catch (error) {
108
+ const duration = performance.now() - startTime;
109
+ // Emit guard run event with failure (zero cost if debug not enabled)
110
+ emitGuardRun(guard.name, context.to.path, false, duration);
111
+ console.error(`Guard "${guard.name}" threw an error:`, error);
112
+ // Treat errors as blocking navigation
113
+ return { allowed: false };
114
+ }
115
+ }
116
+ /**
117
+ * Normalize guard result to a consistent format
118
+ */
119
+ export function normalizeGuardResult(result) {
120
+ if (result === true) {
121
+ return { allowed: true };
122
+ }
123
+ if (result === false) {
124
+ return { allowed: false };
125
+ }
126
+ // String or NavigationTarget - redirect
127
+ return { allowed: false, redirect: result };
128
+ }
129
+ /**
130
+ * Run all guards for a route match
131
+ * Guards are run in order; first failing guard stops execution
132
+ */
133
+ export async function runGuards(guards, context) {
134
+ for (const guard of guards) {
135
+ const result = await executeGuard(guard, context);
136
+ if (!result.allowed) {
137
+ return result;
138
+ }
139
+ }
140
+ return { allowed: true };
141
+ }
142
+ /**
143
+ * Resolve guards from guard specification using the registry
144
+ * This is called at navigation time to support dynamic guard registration
145
+ */
146
+ export function resolveGuardsFromSpec(guardSpec, registry) {
147
+ if (!guardSpec)
148
+ return [];
149
+ const guards = [];
150
+ const guardList = Array.isArray(guardSpec) ? guardSpec : [guardSpec];
151
+ for (const g of guardList) {
152
+ if (typeof g === 'string') {
153
+ // Parse parameterized guard (e.g., 'role:admin')
154
+ const colonIndex = g.indexOf(':');
155
+ const guardName = colonIndex >= 0 ? g.slice(0, colonIndex) : g;
156
+ const param = colonIndex >= 0 ? g.slice(colonIndex + 1) : undefined;
157
+ const registered = registry.get(guardName);
158
+ if (registered) {
159
+ // Create a wrapper that passes the param
160
+ if (param !== undefined) {
161
+ guards.push({
162
+ name: g,
163
+ handler: (ctx) => registered.handler({ ...ctx, param }),
164
+ });
165
+ }
166
+ else {
167
+ guards.push(registered);
168
+ }
169
+ }
170
+ // If guard not found, skip it (allows dynamic registration)
171
+ }
172
+ else {
173
+ // Direct guard object
174
+ guards.push(g);
175
+ }
176
+ }
177
+ return guards;
178
+ }
179
+ /**
180
+ * Collect all guards for a matched route chain
181
+ * (including parent route guards for nested routes)
182
+ * Resolves string guards from the registry at runtime
183
+ */
184
+ export function collectRouteGuards(route, registry) {
185
+ const guards = [];
186
+ // Walk up the parent chain and collect guards (parents first)
187
+ let current = route;
188
+ const chain = [];
189
+ while (current) {
190
+ chain.unshift(current);
191
+ current = current.parent;
192
+ }
193
+ // Add guards from each route in the chain
194
+ for (const r of chain) {
195
+ // First add inline guards (RouteGuard objects defined directly)
196
+ guards.push(...r.guards);
197
+ // Then resolve string guards from the registry (if registry provided)
198
+ if (registry && r.guardSpec) {
199
+ const resolvedGuards = resolveGuardsFromSpec(r.guardSpec, registry);
200
+ // Filter out guards that are already in the inline guards (by reference comparison)
201
+ // and filter out object guards since those are already in r.guards
202
+ for (const g of resolvedGuards) {
203
+ // Only add if it's not already present (comparing by name for string-resolved guards)
204
+ if (!r.guards.some(existing => existing === g || existing.name === g.name)) {
205
+ guards.push(g);
206
+ }
207
+ }
208
+ }
209
+ }
210
+ return guards;
211
+ }
212
+ // =============================================================================
213
+ // Built-in Guards
214
+ // =============================================================================
215
+ /**
216
+ * Create a simple authentication guard
217
+ */
218
+ export function createAuthGuard(isAuthenticated, loginPath = '/login') {
219
+ return defineGuard('auth', ({ to }) => {
220
+ if (isAuthenticated()) {
221
+ return true;
222
+ }
223
+ // Redirect to login with return URL
224
+ const redirectTo = encodeURIComponent(to.path + to.search);
225
+ return `${loginPath}?redirect=${redirectTo}`;
226
+ });
227
+ }
228
+ /**
229
+ * Create a role-based guard
230
+ * Usage: guard: 'role:admin' or guard: 'role:editor'
231
+ */
232
+ export function createRoleGuard(hasRole, unauthorizedPath = '/unauthorized') {
233
+ return defineGuard('role', ({ param }) => {
234
+ if (!param) {
235
+ console.warn('Role guard requires a role parameter (e.g., "role:admin")');
236
+ return false;
237
+ }
238
+ return hasRole(param) || unauthorizedPath;
239
+ });
240
+ }
241
+ /**
242
+ * Create a confirmation guard that can be used for unsaved changes
243
+ */
244
+ export function createConfirmGuard(shouldConfirm, message = 'You have unsaved changes. Are you sure you want to leave?') {
245
+ return defineGuard('confirm', () => {
246
+ if (!shouldConfirm()) {
247
+ return true;
248
+ }
249
+ // In browser environment, use confirm dialog
250
+ if (typeof window !== 'undefined' && window.confirm) {
251
+ return window.confirm(message);
252
+ }
253
+ // In non-browser environment, allow navigation
254
+ return true;
255
+ });
256
+ }
257
+ /**
258
+ * Create a guest-only guard (redirects authenticated users)
259
+ */
260
+ export function createGuestGuard(isAuthenticated, homePath = '/') {
261
+ return defineGuard('guest', () => {
262
+ if (!isAuthenticated()) {
263
+ return true;
264
+ }
265
+ return homePath;
266
+ });
267
+ }
268
+ //# sourceMappingURL=guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../src/guards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU/C,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAsB;IAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,OAAO,aAAa;IAA1B;QACU,WAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IA8DjD,CAAC;IA5DC;;OAEG;IACH,QAAQ,CAAC,KAAiB;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,wBAAwB,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAoB;QAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,KAAiB,EACjB,OAAqB;IAErB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE/C,wDAAwD;QACxD,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAExE,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE/C,qEAAqE;QACrE,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAE3D,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC9D,sCAAsC;QACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAmB;IAEnB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,wCAAwC;IACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAoB,EACpB,OAAoC;IAEpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,OAAuB,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAqC,EACrC,QAAuB;IAEvB,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAErE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,iDAAiD;YACjD,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEpE,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,UAAU,EAAE,CAAC;gBACf,yCAAyC;gBACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,CAAC;wBACP,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC;qBACxD,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YACD,4DAA4D;QAC9D,CAAC;aAAM,CAAC;YACN,sBAAsB;YACtB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAoB,EAAE,QAAwB;IAC/E,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,8DAA8D;IAC9D,IAAI,OAAO,GAAyB,KAAK,CAAC;IAC1C,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,OAAO,OAAO,EAAE,CAAC;QACf,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,gEAAgE;QAChE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAEzB,sEAAsE;QACtE,IAAI,QAAQ,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,qBAAqB,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACpE,oFAAoF;YACpF,mEAAmE;YACnE,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;gBAC/B,sFAAsF;gBACtF,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3E,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,eAA8B,EAC9B,YAAoB,QAAQ;IAE5B,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;QACpC,IAAI,eAAe,EAAE,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,oCAAoC;QACpC,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3D,OAAO,GAAG,SAAS,aAAa,UAAU,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAkC,EAClC,mBAA2B,eAAe;IAE1C,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,aAA4B,EAC5B,UAAkB,2DAA2D;IAE7E,OAAO,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE;QACjC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,6CAA6C;QAC7C,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpD,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,+CAA+C;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,eAA8B,EAC9B,WAAmB,GAAG;IAEtB,OAAO,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE;QAC/B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { History, NavigationTarget } from './types.js';
2
+ /**
3
+ * Convert NavigationTarget to a href string
4
+ */
5
+ export declare function targetToHref(target: NavigationTarget, base?: string): string;
6
+ export interface MemoryHistoryOptions {
7
+ /** Initial entries (defaults to ['/']) */
8
+ initialEntries?: string[];
9
+ /** Initial index (defaults to last entry) */
10
+ initialIndex?: number;
11
+ }
12
+ /**
13
+ * Create a memory-based history for testing and SSR
14
+ */
15
+ export declare function createMemoryHistory(options?: MemoryHistoryOptions): History;
16
+ export interface BrowserHistoryOptions {
17
+ /** Base path for all routes (e.g., '/app') */
18
+ base?: string;
19
+ }
20
+ /**
21
+ * Create a browser-based history using the History API
22
+ */
23
+ export declare function createBrowserHistory(options?: BrowserHistoryOptions): History;
24
+ export interface HashHistoryOptions {
25
+ /** Hash prefix (defaults to '#') */
26
+ hashPrefix?: string;
27
+ }
28
+ /**
29
+ * Create a hash-based history using the URL hash
30
+ * Useful for environments where you can't configure the server
31
+ */
32
+ export declare function createHashHistory(options?: HashHistoryOptions): History;
33
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAIP,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAcpB;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,CAkBhF;AAMD,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CA2I/E;AAQD,MAAM,WAAW,qBAAqB;IACpC,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAoGjF;AAMD,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAiG3E"}
@@ -0,0 +1,315 @@
1
+ import { createLocation, normalizePath, stringifyQuery } from './route-matcher.js';
2
+ // =============================================================================
3
+ // Utility Functions
4
+ // =============================================================================
5
+ /**
6
+ * Generate a unique key for history entries
7
+ */
8
+ function createKey() {
9
+ return Math.random().toString(36).substring(2, 10);
10
+ }
11
+ /**
12
+ * Convert NavigationTarget to a href string
13
+ */
14
+ export function targetToHref(target, base = '') {
15
+ if (typeof target === 'string') {
16
+ // If already absolute, return as is
17
+ if (target.startsWith('/')) {
18
+ return target;
19
+ }
20
+ // Relative path - join with base
21
+ return normalizePath(base + '/' + target);
22
+ }
23
+ let href = target.path;
24
+ if (target.query && Object.keys(target.query).length > 0) {
25
+ href += '?' + stringifyQuery(target.query);
26
+ }
27
+ if (target.hash) {
28
+ href += '#' + target.hash;
29
+ }
30
+ return href;
31
+ }
32
+ /**
33
+ * Create a memory-based history for testing and SSR
34
+ */
35
+ export function createMemoryHistory(options = {}) {
36
+ const { initialEntries = ['/'], initialIndex } = options;
37
+ // Initialize entries
38
+ const entries = initialEntries.map((path) => {
39
+ const questionIndex = path.indexOf('?');
40
+ const hashIndex = path.indexOf('#');
41
+ let pathname = path;
42
+ let search = '';
43
+ let hash = '';
44
+ if (hashIndex >= 0) {
45
+ hash = path.slice(hashIndex + 1);
46
+ pathname = path.slice(0, hashIndex);
47
+ }
48
+ if (questionIndex >= 0 && (hashIndex < 0 || questionIndex < hashIndex)) {
49
+ const searchEnd = hashIndex >= 0 ? hashIndex : path.length;
50
+ search = path.slice(questionIndex + 1, searchEnd);
51
+ pathname = path.slice(0, questionIndex);
52
+ }
53
+ return {
54
+ path: normalizePath(pathname),
55
+ search,
56
+ hash,
57
+ state: null,
58
+ key: createKey(),
59
+ };
60
+ });
61
+ // Current index in the history stack
62
+ let index = initialIndex ?? entries.length - 1;
63
+ // Listeners for location changes
64
+ const listeners = new Set();
65
+ // Get current location from entry
66
+ function getLocation() {
67
+ const entry = entries[index];
68
+ let href = entry.path;
69
+ if (entry.search)
70
+ href += '?' + entry.search;
71
+ if (entry.hash)
72
+ href += '#' + entry.hash;
73
+ return createLocation(href, entry.state);
74
+ }
75
+ // Notify all listeners
76
+ function notifyListeners(action) {
77
+ const location = getLocation();
78
+ for (const listener of listeners) {
79
+ listener(location, action);
80
+ }
81
+ }
82
+ // Parse target into entry components
83
+ function parseTarget(target) {
84
+ const location = createLocation(target);
85
+ return {
86
+ path: location.path,
87
+ search: location.search,
88
+ hash: location.hash,
89
+ state: location.state,
90
+ };
91
+ }
92
+ const history = {
93
+ get location() {
94
+ return getLocation();
95
+ },
96
+ push(target) {
97
+ const parsed = parseTarget(target);
98
+ const entry = {
99
+ ...parsed,
100
+ key: createKey(),
101
+ };
102
+ // Remove any forward entries
103
+ entries.splice(index + 1);
104
+ // Add new entry
105
+ entries.push(entry);
106
+ index = entries.length - 1;
107
+ notifyListeners('push');
108
+ },
109
+ replace(target) {
110
+ const parsed = parseTarget(target);
111
+ const entry = {
112
+ ...parsed,
113
+ key: createKey(),
114
+ };
115
+ // Replace current entry
116
+ entries[index] = entry;
117
+ notifyListeners('replace');
118
+ },
119
+ back() {
120
+ this.go(-1);
121
+ },
122
+ forward() {
123
+ this.go(1);
124
+ },
125
+ go(delta) {
126
+ const newIndex = index + delta;
127
+ // Bounds check
128
+ if (newIndex < 0 || newIndex >= entries.length) {
129
+ return;
130
+ }
131
+ index = newIndex;
132
+ notifyListeners('pop');
133
+ },
134
+ listen(listener) {
135
+ listeners.add(listener);
136
+ return () => {
137
+ listeners.delete(listener);
138
+ };
139
+ },
140
+ createHref(target) {
141
+ return targetToHref(target);
142
+ },
143
+ destroy() {
144
+ listeners.clear();
145
+ },
146
+ };
147
+ return history;
148
+ }
149
+ /**
150
+ * Create a browser-based history using the History API
151
+ */
152
+ export function createBrowserHistory(options = {}) {
153
+ const { base = '' } = options;
154
+ const normalizedBase = base ? normalizePath(base) : '';
155
+ // Listeners for location changes
156
+ const listeners = new Set();
157
+ // Get current location from window.location
158
+ function getLocation() {
159
+ let path = window.location.pathname;
160
+ // Remove base from path
161
+ if (normalizedBase && path.startsWith(normalizedBase)) {
162
+ path = path.slice(normalizedBase.length) || '/';
163
+ }
164
+ const href = path + window.location.search + window.location.hash;
165
+ return createLocation(href, window.history.state);
166
+ }
167
+ // Notify all listeners
168
+ function notifyListeners(action) {
169
+ const location = getLocation();
170
+ for (const listener of listeners) {
171
+ listener(location, action);
172
+ }
173
+ }
174
+ // Handle popstate events (back/forward navigation)
175
+ function handlePopState() {
176
+ notifyListeners('pop');
177
+ }
178
+ // Add popstate listener
179
+ window.addEventListener('popstate', handlePopState);
180
+ // Build full URL with base
181
+ function buildUrl(target) {
182
+ const href = targetToHref(target);
183
+ if (normalizedBase) {
184
+ // Don't double-add base
185
+ if (href.startsWith(normalizedBase)) {
186
+ return href;
187
+ }
188
+ return normalizedBase + (href.startsWith('/') ? href : '/' + href);
189
+ }
190
+ return href;
191
+ }
192
+ const history = {
193
+ get location() {
194
+ return getLocation();
195
+ },
196
+ push(target) {
197
+ const url = buildUrl(target);
198
+ const state = typeof target === 'object' ? target.state : undefined;
199
+ window.history.pushState(state ?? null, '', url);
200
+ notifyListeners('push');
201
+ },
202
+ replace(target) {
203
+ const url = buildUrl(target);
204
+ const state = typeof target === 'object' ? target.state : undefined;
205
+ window.history.replaceState(state ?? null, '', url);
206
+ notifyListeners('replace');
207
+ },
208
+ back() {
209
+ window.history.back();
210
+ },
211
+ forward() {
212
+ window.history.forward();
213
+ },
214
+ go(delta) {
215
+ window.history.go(delta);
216
+ },
217
+ listen(listener) {
218
+ listeners.add(listener);
219
+ return () => {
220
+ listeners.delete(listener);
221
+ };
222
+ },
223
+ createHref(target) {
224
+ return buildUrl(target);
225
+ },
226
+ destroy() {
227
+ window.removeEventListener('popstate', handlePopState);
228
+ listeners.clear();
229
+ },
230
+ };
231
+ return history;
232
+ }
233
+ /**
234
+ * Create a hash-based history using the URL hash
235
+ * Useful for environments where you can't configure the server
236
+ */
237
+ export function createHashHistory(options = {}) {
238
+ const { hashPrefix = '#' } = options;
239
+ // Listeners for location changes
240
+ const listeners = new Set();
241
+ // Get current location from hash
242
+ function getLocation() {
243
+ let hash = window.location.hash;
244
+ // Remove hash prefix
245
+ if (hash.startsWith(hashPrefix)) {
246
+ hash = hash.slice(hashPrefix.length);
247
+ }
248
+ // Ensure leading slash
249
+ if (!hash.startsWith('/')) {
250
+ hash = '/' + hash;
251
+ }
252
+ return createLocation(hash, window.history.state);
253
+ }
254
+ // Notify all listeners
255
+ function notifyListeners(action) {
256
+ const location = getLocation();
257
+ for (const listener of listeners) {
258
+ listener(location, action);
259
+ }
260
+ }
261
+ // Handle hashchange events
262
+ function handleHashChange() {
263
+ notifyListeners('pop');
264
+ }
265
+ // Add hashchange listener
266
+ window.addEventListener('hashchange', handleHashChange);
267
+ // Build hash URL
268
+ function buildHashUrl(target) {
269
+ const href = targetToHref(target);
270
+ return hashPrefix + href;
271
+ }
272
+ const history = {
273
+ get location() {
274
+ return getLocation();
275
+ },
276
+ push(target) {
277
+ const url = buildHashUrl(target);
278
+ const state = typeof target === 'object' ? target.state : undefined;
279
+ // Use pushState to enable state while still using hash
280
+ window.history.pushState(state ?? null, '', url);
281
+ notifyListeners('push');
282
+ },
283
+ replace(target) {
284
+ const url = buildHashUrl(target);
285
+ const state = typeof target === 'object' ? target.state : undefined;
286
+ window.history.replaceState(state ?? null, '', url);
287
+ notifyListeners('replace');
288
+ },
289
+ back() {
290
+ window.history.back();
291
+ },
292
+ forward() {
293
+ window.history.forward();
294
+ },
295
+ go(delta) {
296
+ window.history.go(delta);
297
+ },
298
+ listen(listener) {
299
+ listeners.add(listener);
300
+ return () => {
301
+ listeners.delete(listener);
302
+ };
303
+ },
304
+ createHref(target) {
305
+ return buildHashUrl(target);
306
+ },
307
+ destroy() {
308
+ window.removeEventListener('hashchange', handleHashChange);
309
+ listeners.clear();
310
+ },
311
+ };
312
+ return history;
313
+ }
314
+ /* v8 ignore stop */
315
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEnF,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;GAEG;AACH,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAwB,EAAE,OAAe,EAAE;IACtE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,oCAAoC;QACpC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,iCAAiC;QACjC,OAAO,aAAa,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACvB,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,IAAI,IAAI,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAaD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAgC,EAAE;IACpE,MAAM,EAAE,cAAc,GAAG,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEzD,qBAAqB;IACrB,MAAM,OAAO,GAAmB,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,IAAI,GAAG,EAAE,CAAC;QAEd,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACjC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,aAAa,GAAG,SAAS,CAAC,EAAE,CAAC;YACvE,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;YAClD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO;YACL,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC;YAC7B,MAAM;YACN,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,SAAS,EAAE;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,IAAI,KAAK,GAAG,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAE/C,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE7C,kCAAkC;IAClC,SAAS,WAAW;QAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAE,CAAC;QAC9B,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACtB,IAAI,KAAK,CAAC,MAAM;YAAE,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QAC7C,IAAI,KAAK,CAAC,IAAI;YAAE,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;QAEzC,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,uBAAuB;IACvB,SAAS,eAAe,CAAC,MAAkC;QACzD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,SAAS,WAAW,CAAC,MAAwB;QAC3C,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAY;QACvB,IAAI,QAAQ;YACV,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,MAAwB;YAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,KAAK,GAAiB;gBAC1B,GAAG,MAAM;gBACT,GAAG,EAAE,SAAS,EAAE;aACjB,CAAC;YAEF,6BAA6B;YAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAE1B,gBAAgB;YAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YAE3B,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,CAAC,MAAwB;YAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,KAAK,GAAiB;gBAC1B,GAAG,MAAM;gBACT,GAAG,EAAE,SAAS,EAAE;aACjB,CAAC;YAEF,wBAAwB;YACxB,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;YAEvB,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI;YACF,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;QAED,OAAO;YACL,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,CAAC;QAED,EAAE,CAAC,KAAa;YACd,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;YAE/B,eAAe;YACf,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,KAAK,GAAG,QAAQ,CAAC;YACjB,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,CAAC,QAAyB;YAC9B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,MAAwB;YACjC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO;YACL,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAaD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAiC,EAAE;IACtE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvD,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE7C,4CAA4C;IAC5C,SAAS,WAAW;QAClB,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAEpC,wBAAwB;QACxB,IAAI,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACtD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QAClD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClE,OAAO,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,uBAAuB;IACvB,SAAS,eAAe,CAAC,MAAkC;QACzD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,SAAS,cAAc;QACrB,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,wBAAwB;IACxB,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAEpD,2BAA2B;IAC3B,SAAS,QAAQ,CAAC,MAAwB;QACxC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,cAAc,EAAE,CAAC;YACnB,wBAAwB;YACxB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,cAAc,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAY;QACvB,IAAI,QAAQ;YACV,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,MAAwB;YAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YAEpE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACjD,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,CAAC,MAAwB;YAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YAEpE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACpD,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI;YACF,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,OAAO;YACL,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,EAAE,CAAC,KAAa;YACd,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,CAAC,QAAyB;YAC9B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,MAAwB;YACjC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO;YACL,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YACvD,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAA8B,EAAE;IAChE,MAAM,EAAE,UAAU,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAErC,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE7C,iCAAiC;IACjC,SAAS,WAAW;QAClB,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAEhC,qBAAqB;QACrB,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,OAAO,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,uBAAuB;IACvB,SAAS,eAAe,CAAC,MAAkC;QACzD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,SAAS,gBAAgB;QACvB,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,0BAA0B;IAC1B,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAExD,iBAAiB;IACjB,SAAS,YAAY,CAAC,MAAwB;QAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,UAAU,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAY;QACvB,IAAI,QAAQ;YACV,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,MAAwB;YAC3B,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YAEpE,uDAAuD;YACvD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACjD,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,CAAC,MAAwB;YAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YAEpE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACpD,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI;YACF,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,OAAO;YACL,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,EAAE,CAAC,KAAa;YACd,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,CAAC,QAAyB;YAC9B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,MAAwB;YACjC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO;YACL,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;YAC3D,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oBAAoB"}
@@ -0,0 +1,14 @@
1
+ export type { Location, QueryParams, RouteParams, NavigationTarget, RouteDefinition, RouteComponent, LazyComponent, LazyImportFn, RouteLazyConfig, RouteMeta, CompiledRoute, MatchedRoute, RouteMatch, GuardContext, GuardResult, GuardFunction, RouteGuard, MiddlewareContext, MiddlewareFunction, RouteMiddleware, PreloadContext, PreloadFunction, TransitionContext, TransitionHooks, History, HistoryEntry, HistoryListener, RouterOptions, NavigateOptions, Router, ScrollBehavior, LazyDefaults, LinkProps, RouterOutletProps, ExtractParams, TypedParams, } from './types.js';
2
+ export { parsePath, parseQuery, stringifyQuery, createLocation, normalizePath, joinPaths, compilePath, compileRoute, compileRoutes, matchRoute, matchRoutes, findRouteByName, generatePath, isPathActive, flattenRoutes, } from './route-matcher.js';
3
+ export { createMemoryHistory, createBrowserHistory, createHashHistory, targetToHref, } from './history.js';
4
+ export type { MemoryHistoryOptions, BrowserHistoryOptions, HashHistoryOptions, } from './history.js';
5
+ export { defineGuard, GuardRegistry, runGuards, collectRouteGuards, normalizeGuardResult, createAuthGuard, createRoleGuard, createConfirmGuard, createGuestGuard, } from './guards.js';
6
+ export { defineMiddleware, composeMiddleware, runMiddleware, createLoggerMiddleware, createScrollMiddleware, createTitleMiddleware, createAnalyticsMiddleware, createLoadingMiddleware, } from './middleware.js';
7
+ export { createRouter, setActiveRouter, getActiveRouter, getActiveRouterOrNull, } from './router.js';
8
+ export type { RouterInternal } from './router.js';
9
+ export { RouterOutlet, Link, NavLink } from './components.js';
10
+ export type { RouterOutletConfig, LinkConfig } from './components.js';
11
+ export { lazy, prefetchAll, isLazyComponent, getLazyDelay, getLazyLoading, getLazyError, createPreloadOnHover, createPreloadOnVisible, resolveModuleExport, isWrappedLazyComponent, detectInlineLazyImport, wrapInlineLazy, processRouteComponent, } from './lazy.js';
12
+ export type { LazyOptions, LazyComponentWithMethods } from './lazy.js';
13
+ export type { CompileRouteOptions } from './route-matcher.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,YAAY,EAEV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,gBAAgB,EAGhB,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,EACT,aAAa,EACb,YAAY,EACZ,UAAU,EAGV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,UAAU,EAGV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EAGf,cAAc,EACd,eAAe,EAGf,iBAAiB,EACjB,eAAe,EAGf,OAAO,EACP,YAAY,EACZ,eAAe,EAGf,aAAa,EACb,eAAe,EACf,MAAM,EACN,cAAc,EACd,YAAY,EAGZ,SAAS,EACT,iBAAiB,EAGjB,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC;AAMpB,OAAO,EAEL,SAAS,EACT,UAAU,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,SAAS,EAGT,WAAW,EACX,YAAY,EACZ,aAAa,EAGb,UAAU,EACV,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAMtB,OAAO,EACL,WAAW,EACX,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EAGpB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EAGb,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE9D,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMtE,OAAO,EACL,IAAI,EACJ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EAEtB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,EACd,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAEvE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}