@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/router.js ADDED
@@ -0,0 +1,393 @@
1
+ import { signal, batch, emitNavigationStart, emitNavigationEnd, } from '@liteforge/core';
2
+ import { compileRoutes, matchRoutes, findRouteByName, createLocation, } from './route-matcher.js';
3
+ import { createMemoryHistory } from './history.js';
4
+ import { GuardRegistry, runGuards, collectRouteGuards, normalizeGuardResult } from './guards.js';
5
+ import { runMiddleware } from './middleware.js';
6
+ // =============================================================================
7
+ // Router Creation
8
+ // =============================================================================
9
+ /**
10
+ * Create a router instance
11
+ */
12
+ export function createRouter(options) {
13
+ const { routes: routeDefinitions, middleware = [], guards = [], history = createMemoryHistory(),
14
+ // base = '', // Reserved for future use
15
+ onError, lazyDefaults, } = options;
16
+ // Initialize guard registry
17
+ const guardRegistry = new GuardRegistry();
18
+ guardRegistry.registerAll(guards);
19
+ // Compile routes with guard registry and lazy defaults
20
+ const compiledRoutes = compileRoutes(routeDefinitions, guardRegistry.getMap(), lazyDefaults);
21
+ // Context accessor - will be set when router is attached to app
22
+ let contextAccessor = () => {
23
+ throw new Error('Router not attached to an app context');
24
+ };
25
+ // Reactive state signals
26
+ const pathSignal = signal(history.location.path);
27
+ const paramsSignal = signal({});
28
+ const querySignal = signal(history.location.query);
29
+ const hashSignal = signal(history.location.hash);
30
+ const matchedSignal = signal([]);
31
+ const locationSignal = signal(history.location);
32
+ const isNavigatingSignal = signal(false);
33
+ const preloadedDataSignal = signal(null);
34
+ // Navigation hooks
35
+ const beforeEachCallbacks = new Set();
36
+ const afterEachCallbacks = new Set();
37
+ // Track current location for from reference
38
+ let currentLocation = null;
39
+ // Navigation lock to prevent concurrent navigations
40
+ let navigationLock = false;
41
+ let pendingNavigation = null;
42
+ /**
43
+ * Update reactive state from location
44
+ */
45
+ function updateState(location, matched, preloadedData = null) {
46
+ batch(() => {
47
+ pathSignal.set(location.path);
48
+ querySignal.set(location.query);
49
+ hashSignal.set(location.hash);
50
+ locationSignal.set(location);
51
+ matchedSignal.set(matched);
52
+ preloadedDataSignal.set(preloadedData);
53
+ // Extract params from all matched routes
54
+ const combinedParams = {};
55
+ for (const m of matched) {
56
+ Object.assign(combinedParams, m.params);
57
+ }
58
+ paramsSignal.set(combinedParams);
59
+ });
60
+ }
61
+ /**
62
+ * Attempt a single navigation step (may result in redirect)
63
+ */
64
+ async function attemptNavigation(target, state) {
65
+ // Create target location
66
+ const targetLocation = createLocation(target, state);
67
+ // Match routes
68
+ const matched = matchRoutes(targetLocation.path, compiledRoutes);
69
+ if (!matched || matched.length === 0) {
70
+ // No route matched - update location anyway for 404 handling
71
+ return { type: 'success', preloadedData: null };
72
+ }
73
+ // Get the deepest matched route
74
+ const leafMatch = matched[matched.length - 1];
75
+ // Check for redirect
76
+ if (leafMatch.route.redirect) {
77
+ return { type: 'redirect', target: leafMatch.route.redirect };
78
+ }
79
+ // Build middleware context
80
+ const middlewareContext = {
81
+ to: targetLocation,
82
+ from: currentLocation,
83
+ params: leafMatch.params,
84
+ matched,
85
+ use: contextAccessor,
86
+ };
87
+ // Run beforeEach hooks (treated as guards)
88
+ for (const callback of beforeEachCallbacks) {
89
+ const result = await callback(middlewareContext);
90
+ const normalized = normalizeGuardResult(result);
91
+ if (!normalized.allowed) {
92
+ if (normalized.redirect) {
93
+ return { type: 'redirect', target: normalized.redirect };
94
+ }
95
+ return { type: 'blocked' };
96
+ }
97
+ }
98
+ // Run global middleware
99
+ const middlewareResult = await runMiddleware(middleware, middlewareContext);
100
+ if (!middlewareResult.completed) {
101
+ if (middlewareResult.redirect) {
102
+ return { type: 'redirect', target: middlewareResult.redirect };
103
+ }
104
+ return { type: 'blocked' };
105
+ }
106
+ // Collect and run route guards (pass registry for dynamic guard resolution)
107
+ const routeGuards = collectRouteGuards(leafMatch.route, guardRegistry);
108
+ if (routeGuards.length > 0) {
109
+ const guardContext = {
110
+ to: targetLocation,
111
+ from: currentLocation,
112
+ params: leafMatch.params,
113
+ route: leafMatch.route,
114
+ use: contextAccessor,
115
+ };
116
+ const guardResult = await runGuards(routeGuards, guardContext);
117
+ if (!guardResult.allowed) {
118
+ if (guardResult.redirect) {
119
+ return { type: 'redirect', target: guardResult.redirect };
120
+ }
121
+ return { type: 'blocked' };
122
+ }
123
+ }
124
+ // Run preload if defined
125
+ let preloadedData = null;
126
+ if (leafMatch.route.preload) {
127
+ try {
128
+ preloadedData = await leafMatch.route.preload({
129
+ to: targetLocation,
130
+ params: leafMatch.params,
131
+ use: contextAccessor,
132
+ });
133
+ }
134
+ catch (error) {
135
+ return { type: 'error', error: error instanceof Error ? error : new Error(String(error)) };
136
+ }
137
+ }
138
+ return { type: 'success', preloadedData };
139
+ }
140
+ /**
141
+ * Core navigation logic
142
+ */
143
+ async function performNavigation(target, options = {}) {
144
+ const { replace = false, state } = options;
145
+ // Prevent concurrent navigations
146
+ if (navigationLock) {
147
+ pendingNavigation = target;
148
+ return false;
149
+ }
150
+ navigationLock = true;
151
+ isNavigatingSignal.set(true);
152
+ // Capture from path for debug events
153
+ const fromPath = currentLocation?.path ?? '';
154
+ // Compute toPath from target (string or object)
155
+ // Extract path without query string and hash
156
+ const toPath = typeof target === 'string'
157
+ ? (target.split('?')[0]?.split('#')[0] ?? '/')
158
+ : target.path;
159
+ // Emit navigation start (zero cost if debug not enabled)
160
+ const navStartTime = performance.now();
161
+ emitNavigationStart(fromPath, toPath);
162
+ // Note: Individual guard results are emitted by executeGuard in guards.ts
163
+ // The NavigationEnd event receives an empty array since guards emit separately
164
+ const guardResults = [];
165
+ try {
166
+ let currentTarget = target;
167
+ let currentState = state;
168
+ let redirectCount = 0;
169
+ const maxRedirects = 10;
170
+ // Follow redirects until we reach a final destination
171
+ while (redirectCount < maxRedirects) {
172
+ const result = await attemptNavigation(currentTarget, currentState);
173
+ if (result.type === 'redirect') {
174
+ currentTarget = result.target;
175
+ currentState = undefined; // Clear state on redirect
176
+ redirectCount++;
177
+ continue;
178
+ }
179
+ if (result.type === 'blocked') {
180
+ // Emit navigation end with blocked status
181
+ const duration = performance.now() - navStartTime;
182
+ emitNavigationEnd(fromPath, toPath, duration, guardResults);
183
+ return false;
184
+ }
185
+ if (result.type === 'error') {
186
+ // Emit navigation end with error status
187
+ const duration = performance.now() - navStartTime;
188
+ emitNavigationEnd(fromPath, toPath, duration, guardResults);
189
+ if (onError) {
190
+ onError(result.error);
191
+ }
192
+ return false;
193
+ }
194
+ // Success - finalize navigation
195
+ const finalTargetLocation = createLocation(currentTarget, currentState);
196
+ const matched = matchRoutes(finalTargetLocation.path, compiledRoutes) ?? [];
197
+ // Update history (use replace for redirects or if explicitly requested)
198
+ if (replace || redirectCount > 0) {
199
+ history.replace(currentTarget);
200
+ }
201
+ else {
202
+ history.push(currentTarget);
203
+ }
204
+ // Update reactive state
205
+ const previousLocation = currentLocation;
206
+ currentLocation = finalTargetLocation;
207
+ updateState(finalTargetLocation, matched, result.preloadedData);
208
+ // Run afterEach hooks
209
+ for (const callback of afterEachCallbacks) {
210
+ try {
211
+ callback({ to: finalTargetLocation, from: previousLocation });
212
+ }
213
+ catch (error) {
214
+ console.error('afterEach hook error:', error);
215
+ }
216
+ }
217
+ // Emit navigation end with success
218
+ const duration = performance.now() - navStartTime;
219
+ emitNavigationEnd(fromPath, finalTargetLocation.path, duration, guardResults);
220
+ return true;
221
+ }
222
+ // Too many redirects
223
+ const duration = performance.now() - navStartTime;
224
+ emitNavigationEnd(fromPath, toPath, duration, guardResults);
225
+ if (onError) {
226
+ onError(new Error(`Too many redirects (max ${maxRedirects})`));
227
+ }
228
+ return false;
229
+ }
230
+ catch (error) {
231
+ // Emit navigation end with error
232
+ const duration = performance.now() - navStartTime;
233
+ emitNavigationEnd(fromPath, toPath, duration, guardResults);
234
+ if (onError) {
235
+ onError(error instanceof Error ? error : new Error(String(error)));
236
+ }
237
+ return false;
238
+ }
239
+ finally {
240
+ navigationLock = false;
241
+ isNavigatingSignal.set(false);
242
+ // Process pending navigation if any
243
+ if (pendingNavigation) {
244
+ const pending = pendingNavigation;
245
+ pendingNavigation = null;
246
+ // Use setTimeout to avoid stack overflow
247
+ setTimeout(() => navigate(pending), 0);
248
+ }
249
+ }
250
+ }
251
+ /**
252
+ * Navigate to a path or location
253
+ */
254
+ async function navigate(target, options = {}) {
255
+ return performNavigation(target, options);
256
+ }
257
+ /**
258
+ * Listen to history changes (back/forward)
259
+ */
260
+ const unlistenHistory = history.listen((location, action) => {
261
+ if (action === 'pop') {
262
+ // User pressed back/forward - sync state
263
+ const matched = matchRoutes(location.path, compiledRoutes);
264
+ currentLocation = location;
265
+ updateState(location, matched ?? []);
266
+ }
267
+ });
268
+ // Initialize with current location
269
+ const initialMatched = matchRoutes(history.location.path, compiledRoutes);
270
+ currentLocation = history.location;
271
+ updateState(history.location, initialMatched ?? []);
272
+ // Router instance
273
+ const router = {
274
+ // Reactive signals (read-only access)
275
+ get path() {
276
+ return pathSignal;
277
+ },
278
+ get params() {
279
+ return paramsSignal;
280
+ },
281
+ get query() {
282
+ return querySignal;
283
+ },
284
+ get hash() {
285
+ return hashSignal;
286
+ },
287
+ get matched() {
288
+ return matchedSignal;
289
+ },
290
+ get location() {
291
+ return locationSignal;
292
+ },
293
+ get isNavigating() {
294
+ return isNavigatingSignal;
295
+ },
296
+ get preloadedData() {
297
+ return preloadedDataSignal;
298
+ },
299
+ // Navigation methods
300
+ navigate,
301
+ replace(target, options = {}) {
302
+ return navigate(target, { ...options, replace: true });
303
+ },
304
+ back() {
305
+ history.back();
306
+ },
307
+ forward() {
308
+ history.forward();
309
+ },
310
+ go(delta) {
311
+ history.go(delta);
312
+ },
313
+ // Guard management
314
+ registerGuard(guard) {
315
+ guardRegistry.register(guard);
316
+ },
317
+ unregisterGuard(name) {
318
+ guardRegistry.unregister(name);
319
+ },
320
+ // Navigation hooks
321
+ beforeEach(callback) {
322
+ beforeEachCallbacks.add(callback);
323
+ return () => {
324
+ beforeEachCallbacks.delete(callback);
325
+ };
326
+ },
327
+ afterEach(callback) {
328
+ afterEachCallbacks.add(callback);
329
+ return () => {
330
+ afterEachCallbacks.delete(callback);
331
+ };
332
+ },
333
+ // Route utilities
334
+ getRoute(name) {
335
+ return findRouteByName(name, compiledRoutes);
336
+ },
337
+ resolve(target) {
338
+ const location = createLocation(target);
339
+ const matched = matchRoutes(location.path, compiledRoutes);
340
+ const route = matched?.[matched.length - 1]?.route;
341
+ const params = matched?.[matched.length - 1]?.params ?? {};
342
+ return {
343
+ href: history.createHref(target),
344
+ route,
345
+ params,
346
+ };
347
+ },
348
+ // Cleanup
349
+ destroy() {
350
+ unlistenHistory();
351
+ history.destroy();
352
+ beforeEachCallbacks.clear();
353
+ afterEachCallbacks.clear();
354
+ guardRegistry.clear();
355
+ },
356
+ };
357
+ // Attach method to set context accessor (called by createApp)
358
+ router._setContextAccessor = (accessor) => {
359
+ contextAccessor = accessor;
360
+ };
361
+ // Expose compiled routes for RouterOutlet
362
+ router._compiledRoutes = compiledRoutes;
363
+ // Expose history for testing
364
+ router._history = history;
365
+ return router;
366
+ }
367
+ // =============================================================================
368
+ // Router Context
369
+ // =============================================================================
370
+ // Global router reference for components
371
+ let activeRouter = null;
372
+ /**
373
+ * Set the active router (called by createApp)
374
+ */
375
+ export function setActiveRouter(router) {
376
+ activeRouter = router;
377
+ }
378
+ /**
379
+ * Get the active router
380
+ */
381
+ export function getActiveRouter() {
382
+ if (!activeRouter) {
383
+ throw new Error('No active router. Make sure to create a router and attach it to the app.');
384
+ }
385
+ return activeRouter;
386
+ }
387
+ /**
388
+ * Get the active router or null
389
+ */
390
+ export function getActiveRouterOrNull() {
391
+ return activeRouter;
392
+ }
393
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}