@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.
@@ -0,0 +1,215 @@
1
+ // =============================================================================
2
+ // Middleware Definition
3
+ // =============================================================================
4
+ /**
5
+ * Define a named route middleware
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const loggerMiddleware = defineMiddleware('logger', async (ctx, next) => {
10
+ * console.log(`Navigating from ${ctx.from?.path} to ${ctx.to.path}`);
11
+ * await next();
12
+ * console.log(`Navigation complete to ${ctx.to.path}`);
13
+ * });
14
+ *
15
+ * const analyticsMiddleware = defineMiddleware('analytics', async (ctx, next) => {
16
+ * const analytics = ctx.use('analytics');
17
+ * analytics.track('page_view', { path: ctx.to.path });
18
+ * await next();
19
+ * });
20
+ * ```
21
+ */
22
+ export function defineMiddleware(name, handler) {
23
+ return { name, handler };
24
+ }
25
+ // =============================================================================
26
+ // Middleware Execution
27
+ // =============================================================================
28
+ /**
29
+ * Compose multiple middleware into a single function
30
+ * Uses an onion-style execution model (like Koa)
31
+ */
32
+ export function composeMiddleware(middleware) {
33
+ return async function composed(context) {
34
+ let index = -1;
35
+ let redirectResult;
36
+ async function dispatch(i) {
37
+ if (i <= index) {
38
+ throw new Error('next() called multiple times in middleware');
39
+ }
40
+ index = i;
41
+ if (i >= middleware.length) {
42
+ // All middleware executed
43
+ return;
44
+ }
45
+ const mw = middleware[i];
46
+ try {
47
+ const result = await mw.handler(context, () => dispatch(i + 1));
48
+ // Check if middleware returned a redirect
49
+ if (result !== undefined && result !== null) {
50
+ // Middleware wants to redirect
51
+ redirectResult = result;
52
+ // Don't continue to next middleware
53
+ return;
54
+ }
55
+ }
56
+ catch (error) {
57
+ console.error(`Middleware "${mw.name}" threw an error:`, error);
58
+ throw error;
59
+ }
60
+ }
61
+ await dispatch(0);
62
+ return redirectResult !== undefined ? { redirect: redirectResult } : {};
63
+ };
64
+ }
65
+ /**
66
+ * Run middleware chain with abort capability
67
+ */
68
+ export async function runMiddleware(middleware, context) {
69
+ if (middleware.length === 0) {
70
+ return { completed: true };
71
+ }
72
+ try {
73
+ const composed = composeMiddleware(middleware);
74
+ const result = await composed(context);
75
+ if (result.redirect) {
76
+ return { completed: false, redirect: result.redirect };
77
+ }
78
+ return { completed: true };
79
+ }
80
+ catch (error) {
81
+ console.error('Middleware chain error:', error);
82
+ return { completed: false };
83
+ }
84
+ }
85
+ // =============================================================================
86
+ // Built-in Middleware
87
+ // =============================================================================
88
+ /**
89
+ * Create a logger middleware
90
+ */
91
+ export function createLoggerMiddleware(options = {}) {
92
+ const { prefix = '[Router]', logTiming = false } = options;
93
+ return defineMiddleware('logger', async (ctx, next) => {
94
+ const fromPath = ctx.from?.path ?? '(initial)';
95
+ const toPath = ctx.to.path;
96
+ if (logTiming) {
97
+ const start = performance.now();
98
+ console.log(`${prefix} ${fromPath} → ${toPath}`);
99
+ await next();
100
+ const duration = (performance.now() - start).toFixed(2);
101
+ console.log(`${prefix} Navigation complete (${duration}ms)`);
102
+ }
103
+ else {
104
+ console.log(`${prefix} ${fromPath} → ${toPath}`);
105
+ await next();
106
+ }
107
+ });
108
+ }
109
+ /* v8 ignore start - DOM-dependent middlewares, tested with Playwright */
110
+ /**
111
+ * Create a scroll restoration middleware
112
+ */
113
+ export function createScrollMiddleware(options = {}) {
114
+ const { behavior = 'auto', scrollToHash = true } = options;
115
+ const scrollPositions = new Map();
116
+ return defineMiddleware('scroll', async (ctx, next) => {
117
+ // Save current scroll position before navigation
118
+ if (ctx.from) {
119
+ scrollPositions.set(ctx.from.path, {
120
+ x: window.scrollX,
121
+ y: window.scrollY,
122
+ });
123
+ }
124
+ await next();
125
+ // Scroll to hash if present
126
+ if (scrollToHash && ctx.to.hash) {
127
+ const element = document.getElementById(ctx.to.hash);
128
+ if (element) {
129
+ element.scrollIntoView({ behavior });
130
+ return;
131
+ }
132
+ }
133
+ // Check for saved position (back/forward navigation)
134
+ const savedPosition = scrollPositions.get(ctx.to.path);
135
+ if (savedPosition) {
136
+ window.scrollTo({
137
+ left: savedPosition.x,
138
+ top: savedPosition.y,
139
+ behavior,
140
+ });
141
+ }
142
+ else {
143
+ // New navigation - scroll to top
144
+ window.scrollTo({ top: 0, left: 0, behavior });
145
+ }
146
+ });
147
+ }
148
+ /**
149
+ * Create a page title middleware
150
+ */
151
+ export function createTitleMiddleware(options = {}) {
152
+ const { suffix = '', separator = ' | ', defaultTitle = 'Page', } = options;
153
+ return defineMiddleware('title', async (ctx, next) => {
154
+ await next();
155
+ // Get title from route meta
156
+ const lastMatch = ctx.matched[ctx.matched.length - 1];
157
+ const meta = lastMatch?.route.meta ?? {};
158
+ const pageTitle = meta.title ?? defaultTitle;
159
+ // Build full title
160
+ let fullTitle = pageTitle;
161
+ if (suffix) {
162
+ fullTitle += separator + suffix;
163
+ }
164
+ document.title = fullTitle;
165
+ });
166
+ }
167
+ /* v8 ignore stop */
168
+ /**
169
+ * Create an analytics middleware
170
+ */
171
+ export function createAnalyticsMiddleware(trackFn) {
172
+ return defineMiddleware('analytics', async (ctx, next) => {
173
+ await next();
174
+ // Track page view after navigation completes
175
+ trackFn('page_view', {
176
+ path: ctx.to.path,
177
+ query: ctx.to.query,
178
+ from: ctx.from?.path,
179
+ });
180
+ });
181
+ }
182
+ /**
183
+ * Create a loading indicator middleware
184
+ */
185
+ export function createLoadingMiddleware(options = {}) {
186
+ const { onStart, onEnd, delay = 0 } = options;
187
+ let timeoutId = null;
188
+ return defineMiddleware('loading', async (_ctx, next) => {
189
+ // Clear any existing timeout
190
+ if (timeoutId !== null) {
191
+ clearTimeout(timeoutId);
192
+ }
193
+ // Start loading after delay (to avoid flashing for fast navigations)
194
+ if (delay > 0) {
195
+ timeoutId = setTimeout(() => {
196
+ onStart?.();
197
+ }, delay);
198
+ }
199
+ else {
200
+ onStart?.();
201
+ }
202
+ try {
203
+ await next();
204
+ }
205
+ finally {
206
+ // Cancel delayed start if navigation was fast
207
+ if (timeoutId !== null) {
208
+ clearTimeout(timeoutId);
209
+ timeoutId = null;
210
+ }
211
+ onEnd?.();
212
+ }
213
+ });
214
+ }
215
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { RouteDefinition, CompiledRoute, RouteParams, MatchedRoute, RouteMatch, RouteGuard, Location, QueryParams, NavigationTarget, LazyDefaults } from './types.js';
2
+ /**
3
+ * Parse a URL path into its components
4
+ */
5
+ export declare function parsePath(path: string): {
6
+ path: string;
7
+ search: string;
8
+ hash: string;
9
+ };
10
+ /**
11
+ * Parse query string into key-value pairs
12
+ */
13
+ export declare function parseQuery(search: string): QueryParams;
14
+ /**
15
+ * Stringify query params back to a query string
16
+ */
17
+ export declare function stringifyQuery(query: QueryParams): string;
18
+ /**
19
+ * Create a Location object from various inputs
20
+ */
21
+ export declare function createLocation(target: NavigationTarget, state?: unknown): Location;
22
+ /**
23
+ * Normalize a path - ensures leading slash, removes trailing slash (except for root)
24
+ */
25
+ export declare function normalizePath(path: string): string;
26
+ /**
27
+ * Join parent and child paths
28
+ */
29
+ export declare function joinPaths(parent: string, child: string): string;
30
+ /**
31
+ * Compile a path pattern into a regex and extract param names
32
+ */
33
+ export declare function compilePath(path: string): {
34
+ regex: RegExp;
35
+ paramNames: string[];
36
+ isCatchAll: boolean;
37
+ };
38
+ /**
39
+ * Options for route compilation
40
+ */
41
+ export interface CompileRouteOptions {
42
+ /** Guard registry for resolving named guards */
43
+ guardRegistry: Map<string, RouteGuard>;
44
+ /** Global lazy loading defaults */
45
+ lazyDefaults: LazyDefaults | undefined;
46
+ }
47
+ /**
48
+ * Compile a route definition into a CompiledRoute
49
+ */
50
+ export declare function compileRoute(definition: RouteDefinition, parent: CompiledRoute | null, options: CompileRouteOptions): CompiledRoute;
51
+ /**
52
+ * Compile all route definitions
53
+ */
54
+ export declare function compileRoutes(definitions: RouteDefinition[], guardRegistry?: Map<string, RouteGuard>, lazyDefaults?: LazyDefaults): CompiledRoute[];
55
+ /**
56
+ * Match a path against a single compiled route
57
+ */
58
+ export declare function matchRoute(path: string, route: CompiledRoute): MatchedRoute | null;
59
+ /**
60
+ * Match a path against compiled routes
61
+ * Returns array of matched routes (for nested routes) or null if no match
62
+ */
63
+ export declare function matchRoutes(path: string, routes: CompiledRoute[]): RouteMatch | null;
64
+ /**
65
+ * Find a route by name in the route tree
66
+ */
67
+ export declare function findRouteByName(name: string, routes: CompiledRoute[]): CompiledRoute | undefined;
68
+ /**
69
+ * Generate a path from a route and params
70
+ */
71
+ export declare function generatePath(route: CompiledRoute, params?: RouteParams): string;
72
+ /**
73
+ * Check if a path is active (matches current location)
74
+ */
75
+ export declare function isPathActive(currentPath: string, targetPath: string, exact?: boolean): boolean;
76
+ /**
77
+ * Flatten route tree into a list of all routes
78
+ */
79
+ export declare function flattenRoutes(routes: CompiledRoute[]): CompiledRoute[];
80
+ //# sourceMappingURL=route-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-matcher.d.ts","sourceRoot":"","sources":["../src/route-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,YAAY,EACb,MAAM,YAAY,CAAC;AAOpB;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAoBtF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAkBtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAezD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CA2BlF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAelD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAa/D;AAaD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CA6DtG;AAyBD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvC,mCAAmC;IACnC,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,aAAa,GAAG,IAAI,EAC5B,OAAO,EAAE,mBAAmB,GAC3B,aAAa,CAiEf;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,eAAe,EAAE,EAC9B,aAAa,GAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAa,EAClD,YAAY,CAAC,EAAE,YAAY,GAC1B,aAAa,EAAE,CAGjB;AA2DD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI,CAiBlF;AA8DD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,GAAG,IAAI,CAGpF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,aAAa,GAAG,SAAS,CAShG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,GAAE,WAAgB,GAAG,MAAM,CAyBnF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,OAAe,GACrB,OAAO,CAiBT;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CActE"}