stx-router 0.2.48 → 0.2.53
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/client.js +783 -0
- package/dist/client.js.map +10 -0
- package/dist/codegen.js +53 -0
- package/dist/codegen.js.map +10 -0
- package/dist/file-router.js +262 -0
- package/dist/file-router.js.map +13 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1025 -956
- package/dist/index.js.map +6 -5
- package/dist/layout-metadata.d.ts +6 -0
- package/dist/layout-metadata.js +27 -0
- package/dist/layout-metadata.js.map +10 -0
- package/dist/matcher.js +57 -0
- package/dist/matcher.js.map +10 -0
- package/dist/middleware.js +290 -0
- package/dist/middleware.js.map +10 -0
- package/dist/named-routes.js +58 -0
- package/dist/named-routes.js.map +10 -0
- package/dist/nested-layouts.js +23 -0
- package/dist/nested-layouts.js.map +10 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +9 -0
- package/package.json +3 -2
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/middleware.ts
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
function navigateTo(navPath, options = {}) {
|
|
6
|
+
return {
|
|
7
|
+
type: "redirect",
|
|
8
|
+
path: navPath,
|
|
9
|
+
options: {
|
|
10
|
+
replace: options.replace ?? false,
|
|
11
|
+
external: options.external ?? false,
|
|
12
|
+
redirectCode: options.redirectCode ?? 302
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function abortNavigation(error) {
|
|
17
|
+
const normalizedError = typeof error === "string" ? { statusCode: 500, message: error } : error;
|
|
18
|
+
return {
|
|
19
|
+
type: "abort",
|
|
20
|
+
error: normalizedError
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function defineMiddleware(handler, options = {}) {
|
|
24
|
+
return {
|
|
25
|
+
handler,
|
|
26
|
+
mode: options.mode ?? "universal"
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function parseCookies(cookieHeader) {
|
|
30
|
+
const cookies = {};
|
|
31
|
+
if (!cookieHeader)
|
|
32
|
+
return cookies;
|
|
33
|
+
const pairs = cookieHeader.split(";");
|
|
34
|
+
for (const pair of pairs) {
|
|
35
|
+
const [name, ...rest] = pair.split("=");
|
|
36
|
+
if (name) {
|
|
37
|
+
const key = name.trim();
|
|
38
|
+
const value = rest.join("=").trim();
|
|
39
|
+
if (key) {
|
|
40
|
+
cookies[key] = decodeURIComponent(value);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return cookies;
|
|
45
|
+
}
|
|
46
|
+
function serializeCookie(name, value, options = {}) {
|
|
47
|
+
let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
48
|
+
if (options.expires) {
|
|
49
|
+
const expires = typeof options.expires === "number" ? new Date(Date.now() + options.expires * 1000) : options.expires;
|
|
50
|
+
cookie += `; Expires=${expires.toUTCString()}`;
|
|
51
|
+
}
|
|
52
|
+
if (options.path)
|
|
53
|
+
cookie += `; Path=${options.path}`;
|
|
54
|
+
if (options.domain)
|
|
55
|
+
cookie += `; Domain=${options.domain}`;
|
|
56
|
+
if (options.secure)
|
|
57
|
+
cookie += "; Secure";
|
|
58
|
+
if (options.httpOnly)
|
|
59
|
+
cookie += "; HttpOnly";
|
|
60
|
+
if (options.sameSite)
|
|
61
|
+
cookie += `; SameSite=${options.sameSite}`;
|
|
62
|
+
return cookie;
|
|
63
|
+
}
|
|
64
|
+
function createServerCookieManager(request, responseHeaders) {
|
|
65
|
+
const cookieHeader = request.headers.get("cookie") || "";
|
|
66
|
+
const cookies = parseCookies(cookieHeader);
|
|
67
|
+
return {
|
|
68
|
+
get(name) {
|
|
69
|
+
return cookies[name];
|
|
70
|
+
},
|
|
71
|
+
set(name, value, options = {}) {
|
|
72
|
+
cookies[name] = value;
|
|
73
|
+
responseHeaders.append("Set-Cookie", serializeCookie(name, value, options));
|
|
74
|
+
},
|
|
75
|
+
delete(name) {
|
|
76
|
+
delete cookies[name];
|
|
77
|
+
responseHeaders.append("Set-Cookie", serializeCookie(name, "", { expires: new Date(0), path: "/" }));
|
|
78
|
+
},
|
|
79
|
+
getAll() {
|
|
80
|
+
return { ...cookies };
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function createClientCookieManager() {
|
|
85
|
+
return {
|
|
86
|
+
get(name) {
|
|
87
|
+
if (typeof document === "undefined")
|
|
88
|
+
return;
|
|
89
|
+
const cookies = parseCookies(document.cookie);
|
|
90
|
+
return cookies[name];
|
|
91
|
+
},
|
|
92
|
+
set(name, value, options = {}) {
|
|
93
|
+
if (typeof document === "undefined")
|
|
94
|
+
return;
|
|
95
|
+
document.cookie = serializeCookie(name, value, options);
|
|
96
|
+
},
|
|
97
|
+
delete(name) {
|
|
98
|
+
if (typeof document === "undefined")
|
|
99
|
+
return;
|
|
100
|
+
document.cookie = serializeCookie(name, "", { expires: new Date(0), path: "/" });
|
|
101
|
+
},
|
|
102
|
+
getAll() {
|
|
103
|
+
if (typeof document === "undefined")
|
|
104
|
+
return {};
|
|
105
|
+
return parseCookies(document.cookie);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function createStorageManager() {
|
|
110
|
+
const available = typeof window !== "undefined" && typeof window.localStorage !== "undefined";
|
|
111
|
+
return {
|
|
112
|
+
get(key) {
|
|
113
|
+
if (!available)
|
|
114
|
+
return null;
|
|
115
|
+
try {
|
|
116
|
+
return window.localStorage.getItem(key);
|
|
117
|
+
} catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
set(key, value) {
|
|
122
|
+
if (!available)
|
|
123
|
+
return;
|
|
124
|
+
try {
|
|
125
|
+
window.localStorage.setItem(key, value);
|
|
126
|
+
} catch {}
|
|
127
|
+
},
|
|
128
|
+
remove(key) {
|
|
129
|
+
if (!available)
|
|
130
|
+
return;
|
|
131
|
+
try {
|
|
132
|
+
window.localStorage.removeItem(key);
|
|
133
|
+
} catch {}
|
|
134
|
+
},
|
|
135
|
+
isAvailable() {
|
|
136
|
+
return available;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
var middlewareRegistry = new Map;
|
|
141
|
+
function registerMiddleware(name, middleware) {
|
|
142
|
+
middlewareRegistry.set(name, middleware);
|
|
143
|
+
}
|
|
144
|
+
function getMiddleware(name) {
|
|
145
|
+
return middlewareRegistry.get(name);
|
|
146
|
+
}
|
|
147
|
+
function hasMiddleware(name) {
|
|
148
|
+
return middlewareRegistry.has(name);
|
|
149
|
+
}
|
|
150
|
+
function clearMiddleware() {
|
|
151
|
+
middlewareRegistry.clear();
|
|
152
|
+
}
|
|
153
|
+
function getMiddlewareNames() {
|
|
154
|
+
return Array.from(middlewareRegistry.keys());
|
|
155
|
+
}
|
|
156
|
+
async function loadMiddlewareFromDirectory(baseDir, middlewareDir = "middleware") {
|
|
157
|
+
const fullPath = path.resolve(baseDir, middlewareDir);
|
|
158
|
+
if (!fs.existsSync(fullPath)) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const files = fs.readdirSync(fullPath);
|
|
162
|
+
for (const file of files) {
|
|
163
|
+
if (!file.endsWith(".ts") && !file.endsWith(".js"))
|
|
164
|
+
continue;
|
|
165
|
+
if (file.includes(".test.") || file.includes(".spec."))
|
|
166
|
+
continue;
|
|
167
|
+
const name = file.replace(/\.(ts|js)$/, "");
|
|
168
|
+
const filePath = path.join(fullPath, file);
|
|
169
|
+
try {
|
|
170
|
+
const mod = await import(filePath);
|
|
171
|
+
const mw = mod.default;
|
|
172
|
+
if (mw && typeof mw.handler === "function") {
|
|
173
|
+
registerMiddleware(name, mw);
|
|
174
|
+
} else if (typeof mw === "function") {
|
|
175
|
+
registerMiddleware(name, { handler: mw, mode: "universal" });
|
|
176
|
+
}
|
|
177
|
+
} catch (error) {
|
|
178
|
+
console.warn(`Failed to load middleware '${name}' from ${filePath}:`, error);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function parseQuery(search) {
|
|
183
|
+
const query = {};
|
|
184
|
+
if (!search)
|
|
185
|
+
return query;
|
|
186
|
+
const params = new URLSearchParams(search);
|
|
187
|
+
for (const [key, value] of params) {
|
|
188
|
+
query[key] = value;
|
|
189
|
+
}
|
|
190
|
+
return query;
|
|
191
|
+
}
|
|
192
|
+
function createRouteLocation(pathname, params, meta, search = "") {
|
|
193
|
+
return {
|
|
194
|
+
path: pathname,
|
|
195
|
+
params,
|
|
196
|
+
query: parseQuery(search),
|
|
197
|
+
fullPath: search ? `${pathname}?${search}` : pathname,
|
|
198
|
+
meta
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function createMiddlewareContext(to, from, request) {
|
|
202
|
+
const isServer = typeof window === "undefined";
|
|
203
|
+
const isClient = !isServer;
|
|
204
|
+
const responseHeaders = new Headers;
|
|
205
|
+
return {
|
|
206
|
+
to,
|
|
207
|
+
from,
|
|
208
|
+
isClient,
|
|
209
|
+
isServer,
|
|
210
|
+
cookies: isServer && request ? createServerCookieManager(request, responseHeaders) : createClientCookieManager(),
|
|
211
|
+
storage: createStorageManager(),
|
|
212
|
+
state: {},
|
|
213
|
+
request,
|
|
214
|
+
responseHeaders
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
async function runMiddleware(middlewareNames, context) {
|
|
218
|
+
const names = Array.isArray(middlewareNames) ? middlewareNames : [middlewareNames];
|
|
219
|
+
const isServer = context.isServer;
|
|
220
|
+
for (const name of names) {
|
|
221
|
+
const middleware = getMiddleware(name);
|
|
222
|
+
if (!middleware) {
|
|
223
|
+
console.warn(`Middleware '${name}' not found`);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (middleware.mode === "server" && !isServer)
|
|
227
|
+
continue;
|
|
228
|
+
if (middleware.mode === "client" && isServer)
|
|
229
|
+
continue;
|
|
230
|
+
try {
|
|
231
|
+
const result = await middleware.handler(context);
|
|
232
|
+
if (result) {
|
|
233
|
+
if (result.type === "redirect") {
|
|
234
|
+
return {
|
|
235
|
+
passed: false,
|
|
236
|
+
redirect: result,
|
|
237
|
+
state: context.state,
|
|
238
|
+
responseHeaders: context.responseHeaders
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
if (result.type === "abort") {
|
|
242
|
+
return {
|
|
243
|
+
passed: false,
|
|
244
|
+
abort: result,
|
|
245
|
+
state: context.state,
|
|
246
|
+
responseHeaders: context.responseHeaders
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
} catch (error) {
|
|
251
|
+
console.error(`Error in middleware '${name}':`, error);
|
|
252
|
+
return {
|
|
253
|
+
passed: false,
|
|
254
|
+
abort: {
|
|
255
|
+
type: "abort",
|
|
256
|
+
error: {
|
|
257
|
+
statusCode: 500,
|
|
258
|
+
message: error instanceof Error ? error.message : "Middleware error"
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
state: context.state,
|
|
262
|
+
responseHeaders: context.responseHeaders
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
passed: true,
|
|
268
|
+
state: context.state,
|
|
269
|
+
responseHeaders: context.responseHeaders
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
export {
|
|
273
|
+
runMiddleware,
|
|
274
|
+
registerMiddleware,
|
|
275
|
+
navigateTo,
|
|
276
|
+
loadMiddlewareFromDirectory,
|
|
277
|
+
hasMiddleware,
|
|
278
|
+
getMiddlewareNames,
|
|
279
|
+
getMiddleware,
|
|
280
|
+
defineMiddleware,
|
|
281
|
+
createStorageManager,
|
|
282
|
+
createServerCookieManager,
|
|
283
|
+
createRouteLocation,
|
|
284
|
+
createMiddlewareContext,
|
|
285
|
+
createClientCookieManager,
|
|
286
|
+
clearMiddleware,
|
|
287
|
+
abortNavigation
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
//# debugId=2F078381FE718BF864756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/middleware.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import fs from 'node:fs'\nimport path from 'node:path'\nimport type {\n AbortNavigationResult,\n CookieManager,\n CookieOptions,\n MiddlewareContext,\n MiddlewareMode,\n MiddlewareOptions,\n MiddlewareResult,\n NavigateToOptions,\n NavigateToResult,\n NavigationError,\n NavigationResult,\n RouteLocation,\n RouteMiddlewareDefinition,\n RouteMiddlewareHandler,\n StorageManager,\n} from './types'\n\n// =============================================================================\n// Navigation Helpers\n// =============================================================================\n\nexport function navigateTo(navPath: string, options: NavigateToOptions = {}): NavigateToResult {\n return {\n type: 'redirect',\n path: navPath,\n options: {\n replace: options.replace ?? false,\n external: options.external ?? false,\n redirectCode: options.redirectCode ?? 302,\n },\n }\n}\n\nexport function abortNavigation(error: string | NavigationError): AbortNavigationResult {\n const normalizedError: NavigationError\n = typeof error === 'string' ? { statusCode: 500, message: error } : error\n\n return {\n type: 'abort',\n error: normalizedError,\n }\n}\n\n// =============================================================================\n// Middleware Definition\n// =============================================================================\n\nexport function defineMiddleware(\n handler: RouteMiddlewareHandler,\n options: MiddlewareOptions = {},\n): RouteMiddlewareDefinition {\n return {\n handler,\n mode: options.mode ?? 'universal',\n }\n}\n\n// =============================================================================\n// Cookie Manager\n// =============================================================================\n\nfunction parseCookies(cookieHeader: string): Record<string, string> {\n const cookies: Record<string, string> = {}\n if (!cookieHeader) return cookies\n\n const pairs = cookieHeader.split(';')\n for (const pair of pairs) {\n const [name, ...rest] = pair.split('=')\n if (name) {\n const key = name.trim()\n const value = rest.join('=').trim()\n if (key) {\n cookies[key] = decodeURIComponent(value)\n }\n }\n }\n return cookies\n}\n\nfunction serializeCookie(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`\n\n if (options.expires) {\n const expires\n = typeof options.expires === 'number'\n ? new Date(Date.now() + options.expires * 1000)\n : options.expires\n cookie += `; Expires=${expires.toUTCString()}`\n }\n\n if (options.path) cookie += `; Path=${options.path}`\n if (options.domain) cookie += `; Domain=${options.domain}`\n if (options.secure) cookie += '; Secure'\n if (options.httpOnly) cookie += '; HttpOnly'\n if (options.sameSite) cookie += `; SameSite=${options.sameSite}`\n\n return cookie\n}\n\nexport function createServerCookieManager(\n request: Request,\n responseHeaders: Headers,\n): CookieManager {\n const cookieHeader = request.headers.get('cookie') || ''\n const cookies = parseCookies(cookieHeader)\n\n return {\n get(name: string): string | undefined {\n return cookies[name]\n },\n set(name: string, value: string, options: CookieOptions = {}): void {\n cookies[name] = value\n responseHeaders.append('Set-Cookie', serializeCookie(name, value, options))\n },\n delete(name: string): void {\n delete cookies[name]\n responseHeaders.append(\n 'Set-Cookie',\n serializeCookie(name, '', { expires: new Date(0), path: '/' }),\n )\n },\n getAll(): Record<string, string> {\n return { ...cookies }\n },\n }\n}\n\nexport function createClientCookieManager(): CookieManager {\n return {\n get(name: string): string | undefined {\n if (typeof document === 'undefined') return undefined\n const cookies = parseCookies(document.cookie)\n return cookies[name]\n },\n set(name: string, value: string, options: CookieOptions = {}): void {\n if (typeof document === 'undefined') return\n document.cookie = serializeCookie(name, value, options)\n },\n delete(name: string): void {\n if (typeof document === 'undefined') return\n document.cookie = serializeCookie(name, '', { expires: new Date(0), path: '/' })\n },\n getAll(): Record<string, string> {\n if (typeof document === 'undefined') return {}\n return parseCookies(document.cookie)\n },\n }\n}\n\n// =============================================================================\n// Storage Manager\n// =============================================================================\n\nexport function createStorageManager(): StorageManager {\n const available\n = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined'\n\n return {\n get(key: string): string | null {\n if (!available) return null\n try { return window.localStorage.getItem(key) }\n catch { return null }\n },\n set(key: string, value: string): void {\n if (!available) return\n try { window.localStorage.setItem(key, value) }\n catch { /* storage full or blocked */ }\n },\n remove(key: string): void {\n if (!available) return\n try { window.localStorage.removeItem(key) }\n catch { /* ignore */ }\n },\n isAvailable(): boolean {\n return available\n },\n }\n}\n\n// =============================================================================\n// Middleware Registry\n// =============================================================================\n\nconst middlewareRegistry = new Map<string, RouteMiddlewareDefinition>()\n\nexport function registerMiddleware(name: string, middleware: RouteMiddlewareDefinition): void {\n middlewareRegistry.set(name, middleware)\n}\n\nexport function getMiddleware(name: string): RouteMiddlewareDefinition | undefined {\n return middlewareRegistry.get(name)\n}\n\nexport function hasMiddleware(name: string): boolean {\n return middlewareRegistry.has(name)\n}\n\nexport function clearMiddleware(): void {\n middlewareRegistry.clear()\n}\n\nexport function getMiddlewareNames(): string[] {\n return Array.from(middlewareRegistry.keys())\n}\n\n// =============================================================================\n// Middleware Loading\n// =============================================================================\n\nexport async function loadMiddlewareFromDirectory(\n baseDir: string,\n middlewareDir: string = 'middleware',\n): Promise<void> {\n const fullPath = path.resolve(baseDir, middlewareDir)\n\n if (!fs.existsSync(fullPath)) {\n return\n }\n\n const files = fs.readdirSync(fullPath)\n\n for (const file of files) {\n if (!file.endsWith('.ts') && !file.endsWith('.js')) continue\n if (file.includes('.test.') || file.includes('.spec.')) continue\n\n const name = file.replace(/\\.(ts|js)$/, '')\n const filePath = path.join(fullPath, file)\n\n try {\n const mod = await import(filePath)\n const mw = mod.default\n\n if (mw && typeof mw.handler === 'function') {\n registerMiddleware(name, mw)\n }\n else if (typeof mw === 'function') {\n registerMiddleware(name, { handler: mw, mode: 'universal' })\n }\n }\n catch (error) {\n console.warn(`Failed to load middleware '${name}' from ${filePath}:`, error)\n }\n }\n}\n\n// =============================================================================\n// Middleware Context & Execution\n// =============================================================================\n\nfunction parseQuery(search: string): Record<string, string> {\n const query: Record<string, string> = {}\n if (!search) return query\n\n const params = new URLSearchParams(search)\n for (const [key, value] of params) {\n query[key] = value\n }\n return query\n}\n\nexport function createRouteLocation(\n pathname: string,\n params: Record<string, string>,\n meta: Record<string, unknown>,\n search: string = '',\n): RouteLocation {\n return {\n path: pathname,\n params,\n query: parseQuery(search),\n fullPath: search ? `${pathname}?${search}` : pathname,\n meta,\n }\n}\n\nexport function createMiddlewareContext(\n to: RouteLocation,\n from: RouteLocation | null,\n request?: Request,\n): MiddlewareContext {\n const isServer = typeof window === 'undefined'\n const isClient = !isServer\n const responseHeaders = new Headers()\n\n return {\n to,\n from,\n isClient,\n isServer,\n cookies: isServer && request\n ? createServerCookieManager(request, responseHeaders)\n : createClientCookieManager(),\n storage: createStorageManager(),\n state: {},\n request,\n responseHeaders,\n }\n}\n\nexport async function runMiddleware(\n middlewareNames: string | string[],\n context: MiddlewareContext,\n): Promise<MiddlewareResult> {\n const names = Array.isArray(middlewareNames) ? middlewareNames : [middlewareNames]\n const isServer = context.isServer\n\n for (const name of names) {\n const middleware = getMiddleware(name)\n\n if (!middleware) {\n console.warn(`Middleware '${name}' not found`)\n continue\n }\n\n if (middleware.mode === 'server' && !isServer) continue\n if (middleware.mode === 'client' && isServer) continue\n\n try {\n const result = await middleware.handler(context)\n\n if (result) {\n if (result.type === 'redirect') {\n return {\n passed: false,\n redirect: result,\n state: context.state,\n responseHeaders: context.responseHeaders,\n }\n }\n\n if (result.type === 'abort') {\n return {\n passed: false,\n abort: result,\n state: context.state,\n responseHeaders: context.responseHeaders,\n }\n }\n }\n }\n catch (error) {\n console.error(`Error in middleware '${name}':`, error)\n return {\n passed: false,\n abort: {\n type: 'abort',\n error: {\n statusCode: 500,\n message: error instanceof Error ? error.message : 'Middleware error',\n },\n },\n state: context.state,\n responseHeaders: context.responseHeaders,\n }\n }\n }\n\n return {\n passed: true,\n state: context.state,\n responseHeaders: context.responseHeaders,\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "2F078381FE718BF864756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/named-routes.ts
|
|
3
|
+
var routes = {};
|
|
4
|
+
var appUrl = "";
|
|
5
|
+
function setAppUrl(url) {
|
|
6
|
+
appUrl = url.replace(/\/$/, "");
|
|
7
|
+
}
|
|
8
|
+
function defineRoute(name, routePath, params = {}) {
|
|
9
|
+
routes[name] = { path: routePath, name, params };
|
|
10
|
+
}
|
|
11
|
+
function defineRoutes(routeDefinitions) {
|
|
12
|
+
for (const [name, definition] of Object.entries(routeDefinitions)) {
|
|
13
|
+
if (typeof definition === "string") {
|
|
14
|
+
routes[name] = { path: definition, name };
|
|
15
|
+
} else {
|
|
16
|
+
routes[name] = { ...definition, name };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function route(name, params = {}, absolute = false) {
|
|
21
|
+
const r = routes[name];
|
|
22
|
+
if (!r) {
|
|
23
|
+
console.warn(`Route [${name}] not defined.`);
|
|
24
|
+
return "#undefined-route";
|
|
25
|
+
}
|
|
26
|
+
const mergedParams = { ...r.params, ...params };
|
|
27
|
+
let routePath = r.path;
|
|
28
|
+
routePath = routePath.replace(/:(\w+)/g, (_, paramName) => {
|
|
29
|
+
const value = mergedParams[paramName];
|
|
30
|
+
if (value === undefined) {
|
|
31
|
+
console.warn(`Missing parameter [${paramName}] for route [${name}].`);
|
|
32
|
+
return `:${paramName}`;
|
|
33
|
+
}
|
|
34
|
+
delete mergedParams[paramName];
|
|
35
|
+
return encodeURIComponent(String(value));
|
|
36
|
+
});
|
|
37
|
+
const remainingParams = Object.entries(mergedParams);
|
|
38
|
+
if (remainingParams.length > 0) {
|
|
39
|
+
const queryString = remainingParams.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
|
|
40
|
+
routePath += (routePath.includes("?") ? "&" : "?") + queryString;
|
|
41
|
+
}
|
|
42
|
+
return absolute && appUrl ? `${appUrl}${routePath}` : routePath;
|
|
43
|
+
}
|
|
44
|
+
function resetRoutes() {
|
|
45
|
+
for (const key of Object.keys(routes)) {
|
|
46
|
+
delete routes[key];
|
|
47
|
+
}
|
|
48
|
+
appUrl = "";
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
setAppUrl,
|
|
52
|
+
route,
|
|
53
|
+
resetRoutes,
|
|
54
|
+
defineRoutes,
|
|
55
|
+
defineRoute
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//# debugId=7C705CA1193613B164756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/named-routes.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"interface RouteDefinition {\n path: string\n name?: string\n params?: Record<string, any>\n}\n\nconst routes: Record<string, RouteDefinition> = {}\nlet appUrl: string = ''\n\nexport function setAppUrl(url: string): void {\n appUrl = url.replace(/\\/$/, '')\n}\n\nexport function defineRoute(name: string, routePath: string, params: Record<string, any> = {}): void {\n routes[name] = { path: routePath, name, params }\n}\n\nexport function defineRoutes(routeDefinitions: Record<string, string | RouteDefinition>): void {\n for (const [name, definition] of Object.entries(routeDefinitions)) {\n if (typeof definition === 'string') {\n routes[name] = { path: definition, name }\n }\n else {\n routes[name] = { ...definition, name }\n }\n }\n}\n\nexport function route(\n name: string,\n params: Record<string, any> = {},\n absolute = false,\n): string {\n const r = routes[name]\n\n if (!r) {\n console.warn(`Route [${name}] not defined.`)\n return '#undefined-route'\n }\n\n const mergedParams = { ...r.params, ...params }\n let routePath = r.path\n\n routePath = routePath.replace(/:(\\w+)/g, (_, paramName) => {\n const value = mergedParams[paramName]\n\n if (value === undefined) {\n console.warn(`Missing parameter [${paramName}] for route [${name}].`)\n return `:${paramName}`\n }\n\n delete mergedParams[paramName]\n return encodeURIComponent(String(value))\n })\n\n const remainingParams = Object.entries(mergedParams)\n if (remainingParams.length > 0) {\n const queryString = remainingParams\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&')\n\n routePath += (routePath.includes('?') ? '&' : '?') + queryString\n }\n\n return absolute && appUrl ? `${appUrl}${routePath}` : routePath\n}\n\nexport function resetRoutes(): void {\n for (const key of Object.keys(routes)) {\n delete routes[key]\n }\n appUrl = ''\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;AAMA,IAAM,SAA0C,CAAC;AACjD,IAAI,SAAiB;AAEd,SAAS,SAAS,CAAC,KAAmB;AAAA,EAC3C,SAAS,IAAI,QAAQ,OAAO,EAAE;AAAA;AAGzB,SAAS,WAAW,CAAC,MAAc,WAAmB,SAA8B,CAAC,GAAS;AAAA,EACnG,OAAO,QAAQ,EAAE,MAAM,WAAW,MAAM,OAAO;AAAA;AAG1C,SAAS,YAAY,CAAC,kBAAkE;AAAA,EAC7F,YAAY,MAAM,eAAe,OAAO,QAAQ,gBAAgB,GAAG;AAAA,IACjE,IAAI,OAAO,eAAe,UAAU;AAAA,MAClC,OAAO,QAAQ,EAAE,MAAM,YAAY,KAAK;AAAA,IAC1C,EACK;AAAA,MACH,OAAO,QAAQ,KAAK,YAAY,KAAK;AAAA;AAAA,EAEzC;AAAA;AAGK,SAAS,KAAK,CACnB,MACA,SAA8B,CAAC,GAC/B,WAAW,OACH;AAAA,EACR,MAAM,IAAI,OAAO;AAAA,EAEjB,IAAI,CAAC,GAAG;AAAA,IACN,QAAQ,KAAK,UAAU,oBAAoB;AAAA,IAC3C,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,KAAK,EAAE,WAAW,OAAO;AAAA,EAC9C,IAAI,YAAY,EAAE;AAAA,EAElB,YAAY,UAAU,QAAQ,WAAW,CAAC,GAAG,cAAc;AAAA,IACzD,MAAM,QAAQ,aAAa;AAAA,IAE3B,IAAI,UAAU,WAAW;AAAA,MACvB,QAAQ,KAAK,sBAAsB,yBAAyB,QAAQ;AAAA,MACpE,OAAO,IAAI;AAAA,IACb;AAAA,IAEA,OAAO,aAAa;AAAA,IACpB,OAAO,mBAAmB,OAAO,KAAK,CAAC;AAAA,GACxC;AAAA,EAED,MAAM,kBAAkB,OAAO,QAAQ,YAAY;AAAA,EACnD,IAAI,gBAAgB,SAAS,GAAG;AAAA,IAC9B,MAAM,cAAc,gBACjB,IAAI,EAAE,KAAK,WAAW,GAAG,mBAAmB,GAAG,KAAK,mBAAmB,OAAO,KAAK,CAAC,GAAG,EACvF,KAAK,GAAG;AAAA,IAEX,cAAc,UAAU,SAAS,GAAG,IAAI,MAAM,OAAO;AAAA,EACvD;AAAA,EAEA,OAAO,YAAY,SAAS,GAAG,SAAS,cAAc;AAAA;AAGjD,SAAS,WAAW,GAAS;AAAA,EAClC,WAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AAAA,IACrC,OAAO,OAAO;AAAA,EAChB;AAAA,EACA,SAAS;AAAA;",
|
|
8
|
+
"debugId": "7C705CA1193613B164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/nested-layouts.ts
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
function resolveLayoutChain(routeFilePath, pagesDir) {
|
|
6
|
+
const layouts = [];
|
|
7
|
+
let dir = path.dirname(routeFilePath);
|
|
8
|
+
while (dir.startsWith(pagesDir) || dir === pagesDir) {
|
|
9
|
+
const layoutFile = path.join(dir, "_layout.stx");
|
|
10
|
+
if (fs.existsSync(layoutFile)) {
|
|
11
|
+
layouts.unshift(layoutFile);
|
|
12
|
+
}
|
|
13
|
+
if (dir === pagesDir)
|
|
14
|
+
break;
|
|
15
|
+
dir = path.dirname(dir);
|
|
16
|
+
}
|
|
17
|
+
return layouts;
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
resolveLayoutChain
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
//# debugId=04BAC85420BADB4464756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/nested-layouts.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import fs from 'node:fs'\nimport path from 'node:path'\n\nexport function resolveLayoutChain(routeFilePath: string, pagesDir: string): string[] {\n const layouts: string[] = []\n let dir = path.dirname(routeFilePath)\n\n // Walk up from the route's directory to the pages root, collecting _layout.stx files\n while (dir.startsWith(pagesDir) || dir === pagesDir) {\n const layoutFile = path.join(dir, '_layout.stx')\n if (fs.existsSync(layoutFile)) {\n layouts.unshift(layoutFile) // Prepend so root layout is first\n }\n\n if (dir === pagesDir) break\n dir = path.dirname(dir)\n }\n\n return layouts\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;AAAA;AACA;AAEO,SAAS,kBAAkB,CAAC,eAAuB,UAA4B;AAAA,EACpF,MAAM,UAAoB,CAAC;AAAA,EAC3B,IAAI,MAAM,KAAK,QAAQ,aAAa;AAAA,EAGpC,OAAO,IAAI,WAAW,QAAQ,KAAK,QAAQ,UAAU;AAAA,IACnD,MAAM,aAAa,KAAK,KAAK,KAAK,aAAa;AAAA,IAC/C,IAAI,GAAG,WAAW,UAAU,GAAG;AAAA,MAC7B,QAAQ,QAAQ,UAAU;AAAA,IAC5B;AAAA,IAEA,IAAI,QAAQ;AAAA,MAAU;AAAA,IACtB,MAAM,KAAK,QAAQ,GAAG;AAAA,EACxB;AAAA,EAEA,OAAO;AAAA;",
|
|
8
|
+
"debugId": "04BAC85420BADB4464756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/dist/types.js
ADDED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stx-router",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.53",
|
|
5
5
|
"description": "File-based router for STX — .stx template discovery, nested layouts, typed route params, middleware, and client-side SPA navigation.",
|
|
6
6
|
"author": "Chris Breuer <chris@stacksjs.org>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"import": "./dist/index.js"
|
|
30
30
|
},
|
|
31
31
|
"./*": {
|
|
32
|
-
"
|
|
32
|
+
"types": "./dist/*.d.ts",
|
|
33
|
+
"import": "./dist/*.js"
|
|
33
34
|
}
|
|
34
35
|
},
|
|
35
36
|
"module": "./dist/index.js",
|