@flight-framework/core 0.3.2 → 0.4.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/LICENSE +21 -21
- package/README.md +541 -541
- package/dist/actions/index.js +1 -1
- package/dist/adapters/index.d.ts +138 -1
- package/dist/adapters/index.js +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-3UQJE3XZ.js → chunk-2F2QU6RC.js} +2 -2
- package/dist/chunk-2F2QU6RC.js.map +1 -0
- package/dist/{chunk-4U7CJVNQ.js → chunk-3KRBRSRJ.js} +2 -2
- package/dist/chunk-3KRBRSRJ.js.map +1 -0
- package/dist/{chunk-OZ3EXPLE.js → chunk-3QP3E7HS.js} +2 -2
- package/dist/chunk-3QP3E7HS.js.map +1 -0
- package/dist/{chunk-CKJHJPKQ.js → chunk-62C7LX2E.js} +2 -2
- package/dist/chunk-62C7LX2E.js.map +1 -0
- package/dist/{chunk-YNTMYL36.js → chunk-6BDCTUQY.js} +3 -3
- package/dist/chunk-6BDCTUQY.js.map +1 -0
- package/dist/{chunk-KDEA64UX.js → chunk-EGB7C73X.js} +5 -5
- package/dist/chunk-EGB7C73X.js.map +1 -0
- package/dist/{chunk-2JVEH76V.js → chunk-FSJNOPYE.js} +3 -3
- package/dist/chunk-FSJNOPYE.js.map +1 -0
- package/dist/{chunk-ARBKF6VI.js → chunk-GCQZ4FHI.js} +2 -2
- package/dist/{chunk-ARBKF6VI.js.map → chunk-GCQZ4FHI.js.map} +1 -1
- package/dist/{chunk-EHVUAFNH.js → chunk-IXMD5QH2.js} +2 -2
- package/dist/chunk-IXMD5QH2.js.map +1 -0
- package/dist/{chunk-6GI6HFSQ.js → chunk-K2CQZPCG.js} +2 -2
- package/dist/chunk-K2CQZPCG.js.map +1 -0
- package/dist/chunk-K5NYYNFS.js +311 -0
- package/dist/chunk-K5NYYNFS.js.map +1 -0
- package/dist/{chunk-6IG6XIXU.js → chunk-LNV47HGV.js} +2 -2
- package/dist/chunk-LNV47HGV.js.map +1 -0
- package/dist/{chunk-65JYF3DJ.js → chunk-MDQNNIHH.js} +2 -2
- package/dist/chunk-MDQNNIHH.js.map +1 -0
- package/dist/{chunk-GNS2FGPC.js → chunk-MQQLYWZZ.js} +2 -2
- package/dist/chunk-MQQLYWZZ.js.map +1 -0
- package/dist/{chunk-LAKHYTHL.js → chunk-NWMJYTMB.js} +3 -3
- package/dist/chunk-NWMJYTMB.js.map +1 -0
- package/dist/{chunk-R7MEVVA4.js → chunk-OYF2OAKS.js} +2 -2
- package/dist/chunk-OYF2OAKS.js.map +1 -0
- package/dist/{chunk-FRAH5QNY.js → chunk-P6WSBVDT.js} +4 -4
- package/dist/chunk-P6WSBVDT.js.map +1 -0
- package/dist/{chunk-5XHOLZBJ.js → chunk-PDW5WCMW.js} +2 -2
- package/dist/chunk-PDW5WCMW.js.map +1 -0
- package/dist/{chunk-A2QRUBVE.js → chunk-PVUMB632.js} +2 -2
- package/dist/chunk-PVUMB632.js.map +1 -0
- package/dist/{chunk-LKOPJ3GS.js → chunk-R7SQAREQ.js} +2 -2
- package/dist/chunk-R7SQAREQ.js.map +1 -0
- package/dist/{chunk-CNY3ZUVG.js → chunk-RSVA2EYO.js} +2 -2
- package/dist/chunk-RSVA2EYO.js.map +1 -0
- package/dist/{chunk-PAVI5W6M.js → chunk-T4Z4HM4W.js} +3 -3
- package/dist/chunk-T4Z4HM4W.js.map +1 -0
- package/dist/{chunk-HNPO6LFW.js → chunk-TASAT7KB.js} +2 -2
- package/dist/chunk-TASAT7KB.js.map +1 -0
- package/dist/{chunk-3N5ZBVZJ.js → chunk-VPFMHGEV.js} +2 -2
- package/dist/chunk-VPFMHGEV.js.map +1 -0
- package/dist/{chunk-A4TKWQBU.js → chunk-W6D62JCI.js} +2 -2
- package/dist/chunk-W6D62JCI.js.map +1 -0
- package/dist/{chunk-UFWGOJL7.js → chunk-WFAWAHJH.js} +2 -2
- package/dist/chunk-WFAWAHJH.js.map +1 -0
- package/dist/{chunk-NZS2YJ43.js → chunk-WOEIJWGJ.js} +2 -2
- package/dist/chunk-WOEIJWGJ.js.map +1 -0
- package/dist/{chunk-VNO2YUVD.js → chunk-XOIYNY4I.js} +2 -2
- package/dist/chunk-XOIYNY4I.js.map +1 -0
- package/dist/{chunk-PO7IHPFF.js → chunk-XSY5AAXT.js} +2 -2
- package/dist/chunk-XSY5AAXT.js.map +1 -0
- package/dist/{chunk-OZBPR27I.js → chunk-YHEVHRLH.js} +2 -2
- package/dist/chunk-YHEVHRLH.js.map +1 -0
- package/dist/{chunk-XU6MRYG2.js → chunk-ZIE56LCA.js} +3 -3
- package/dist/chunk-ZIE56LCA.js.map +1 -0
- package/dist/{chunk-B2LPSCES.js → chunk-ZVC3ZWLM.js} +2 -2
- package/dist/chunk-ZVC3ZWLM.js.map +1 -0
- package/dist/client.js +8 -8
- package/dist/client.js.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/errors/index.js +2 -2
- package/dist/file-router/index.js +1 -1
- package/dist/file-router/streaming-hints.js +1 -1
- package/dist/handlers/index.js +1 -1
- package/dist/index.js +30 -30
- package/dist/index.js.map +1 -1
- package/dist/islands/index.js +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/react/index.js +2 -2
- package/dist/react/index.js.map +1 -1
- package/dist/render/index.js +1 -1
- package/dist/router/index.js +1 -1
- package/dist/rsc/adapters/index.js +4 -4
- package/dist/rsc/adapters/preact.js +1 -1
- package/dist/rsc/adapters/react.js +1 -1
- package/dist/rsc/adapters/solid.js +1 -1
- package/dist/rsc/adapters/vue.js +1 -1
- package/dist/rsc/boundaries.js +1 -1
- package/dist/rsc/context.js +1 -1
- package/dist/rsc/index.js +11 -11
- package/dist/rsc/legacy.js +1 -1
- package/dist/rsc/payload.js +1 -1
- package/dist/rsc/plugins/esbuild.js +2 -2
- package/dist/rsc/plugins/index.js +4 -4
- package/dist/rsc/plugins/rollup.js +2 -2
- package/dist/rsc/renderer.js +3 -3
- package/dist/rsc/stream.js +1 -1
- package/dist/rsc/vite-plugin.js +2 -2
- package/dist/server/index.js +4 -4
- package/dist/streaming/adapters/index.js +1 -1
- package/dist/streaming/conditional.js +1 -1
- package/dist/streaming/index.js +1 -1
- package/dist/streaming/observability.js +2 -2
- package/dist/streaming/priority.js +1 -1
- package/dist/utils/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2JVEH76V.js.map +0 -1
- package/dist/chunk-3N5ZBVZJ.js.map +0 -1
- package/dist/chunk-3UQJE3XZ.js.map +0 -1
- package/dist/chunk-4U7CJVNQ.js.map +0 -1
- package/dist/chunk-5XHOLZBJ.js.map +0 -1
- package/dist/chunk-65JYF3DJ.js.map +0 -1
- package/dist/chunk-6GI6HFSQ.js.map +0 -1
- package/dist/chunk-6IG6XIXU.js.map +0 -1
- package/dist/chunk-A2QRUBVE.js.map +0 -1
- package/dist/chunk-A4TKWQBU.js.map +0 -1
- package/dist/chunk-B2LPSCES.js.map +0 -1
- package/dist/chunk-CKJHJPKQ.js.map +0 -1
- package/dist/chunk-CNY3ZUVG.js.map +0 -1
- package/dist/chunk-EHVUAFNH.js.map +0 -1
- package/dist/chunk-FRAH5QNY.js.map +0 -1
- package/dist/chunk-GNS2FGPC.js.map +0 -1
- package/dist/chunk-HNPO6LFW.js.map +0 -1
- package/dist/chunk-KDEA64UX.js.map +0 -1
- package/dist/chunk-LAKHYTHL.js.map +0 -1
- package/dist/chunk-LKOPJ3GS.js.map +0 -1
- package/dist/chunk-NZS2YJ43.js.map +0 -1
- package/dist/chunk-OZ3EXPLE.js.map +0 -1
- package/dist/chunk-OZBPR27I.js.map +0 -1
- package/dist/chunk-PAVI5W6M.js.map +0 -1
- package/dist/chunk-PO7IHPFF.js.map +0 -1
- package/dist/chunk-QK6UEQ75.js +0 -13
- package/dist/chunk-QK6UEQ75.js.map +0 -1
- package/dist/chunk-R7MEVVA4.js.map +0 -1
- package/dist/chunk-UFWGOJL7.js.map +0 -1
- package/dist/chunk-VNO2YUVD.js.map +0 -1
- package/dist/chunk-XU6MRYG2.js.map +0 -1
- package/dist/chunk-YNTMYL36.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/context.ts"],"names":[],"mappings":"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","file":"chunk-62C7LX2E.js","sourcesContent":["/**\r\n * @flight-framework/core - Server Context\r\n * \r\n * API de contexto para Server Components.\r\n * Provee acceso a datos del request de forma explícita y type-safe.\r\n * \r\n * Filosofía Flight:\r\n * - Contexto EXPLÍCITO (no magia con AsyncLocalStorage)\r\n * - Pasado como argumento (testeable, predecible)\r\n * - Extensible con adapters custom\r\n * - Inmutable por defecto\r\n * \r\n * @module @flight-framework/core/rsc/context\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Contexto del servidor disponible en Server Components\r\n */\r\nexport interface ServerContext {\r\n /** Request actual (Web API Request) */\r\n readonly request: Request;\r\n\r\n /** Parámetros de ruta */\r\n readonly params: Readonly<Record<string, string>>;\r\n\r\n /** Search params de la URL */\r\n readonly searchParams: URLSearchParams;\r\n\r\n /** Headers del request */\r\n readonly headers: Headers;\r\n\r\n /** Accessor de cookies */\r\n readonly cookies: CookieAccessor;\r\n\r\n /** Headers de respuesta (mutables) */\r\n readonly responseHeaders: Headers;\r\n\r\n /** Signal para cancelación */\r\n readonly signal: AbortSignal;\r\n\r\n /** URL parseada */\r\n readonly url: URL;\r\n\r\n /** Método HTTP */\r\n readonly method: string;\r\n\r\n /** Context extensions (para adapters) */\r\n readonly extensions: ContextExtensions;\r\n}\r\n\r\n/**\r\n * Accessor para cookies con lazy parsing\r\n */\r\nexport interface CookieAccessor {\r\n /** Obtiene el valor de una cookie */\r\n get(name: string): string | undefined;\r\n\r\n /** Obtiene todas las cookies */\r\n getAll(): Readonly<Record<string, string>>;\r\n\r\n /** Verifica si existe una cookie */\r\n has(name: string): boolean;\r\n}\r\n\r\n/**\r\n * Extensiones del contexto para adapters\r\n */\r\nexport interface ContextExtensions {\r\n /** Obtiene una extensión */\r\n get<T>(key: string): T | undefined;\r\n\r\n /** Verifica si existe una extensión */\r\n has(key: string): boolean;\r\n}\r\n\r\n/**\r\n * Opciones para crear ServerContext\r\n */\r\nexport interface ServerContextOptions {\r\n /** Parámetros de ruta */\r\n params?: Record<string, string>;\r\n\r\n /** Extensiones custom */\r\n extensions?: Record<string, unknown>;\r\n\r\n /** Headers de respuesta iniciales */\r\n responseHeaders?: HeadersInit;\r\n}\r\n\r\n// ============================================================================\r\n// Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Crea un ServerContext a partir de un Request\r\n * \r\n * @example\r\n * ```typescript\r\n * const ctx = createServerContext(request, { \r\n * params: { id: '123' } \r\n * });\r\n * \r\n * // En un Server Component\r\n * async function UserPage(props, ctx: ServerContext) {\r\n * const userId = ctx.params.id;\r\n * const user = await db.users.get(userId);\r\n * return <UserProfile user={user} />;\r\n * }\r\n * ```\r\n */\r\nexport function createServerContext(\r\n request: Request,\r\n options: ServerContextOptions = {}\r\n): ServerContext {\r\n const { params = {}, extensions = {}, responseHeaders: initHeaders } = options;\r\n\r\n // Parse URL\r\n const url = new URL(request.url);\r\n\r\n // Lazy cookie parsing\r\n let parsedCookies: Record<string, string> | null = null;\r\n\r\n const parseCookies = (): Record<string, string> => {\r\n if (parsedCookies !== null) return parsedCookies;\r\n\r\n parsedCookies = {};\r\n const cookieHeader = request.headers.get('cookie');\r\n\r\n if (cookieHeader) {\r\n for (const cookie of cookieHeader.split(';')) {\r\n const trimmed = cookie.trim();\r\n const eqIndex = trimmed.indexOf('=');\r\n\r\n if (eqIndex > 0) {\r\n const key = trimmed.slice(0, eqIndex).trim();\r\n const value = trimmed.slice(eqIndex + 1).trim();\r\n\r\n // Decode URL-encoded values\r\n try {\r\n parsedCookies[key] = decodeURIComponent(value);\r\n } catch {\r\n parsedCookies[key] = value;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return parsedCookies;\r\n };\r\n\r\n // Cookie accessor\r\n const cookies: CookieAccessor = {\r\n get(name: string): string | undefined {\r\n return parseCookies()[name];\r\n },\r\n getAll(): Readonly<Record<string, string>> {\r\n return Object.freeze({ ...parseCookies() });\r\n },\r\n has(name: string): boolean {\r\n return name in parseCookies();\r\n },\r\n };\r\n\r\n // Extensions accessor\r\n const contextExtensions: ContextExtensions = {\r\n get<T>(key: string): T | undefined {\r\n return extensions[key] as T | undefined;\r\n },\r\n has(key: string): boolean {\r\n return key in extensions;\r\n },\r\n };\r\n\r\n // Response headers (mutable)\r\n const responseHeaders = new Headers(initHeaders);\r\n\r\n return Object.freeze({\r\n request,\r\n params: Object.freeze({ ...params }),\r\n searchParams: url.searchParams,\r\n headers: request.headers,\r\n cookies,\r\n responseHeaders,\r\n signal: request.signal,\r\n url,\r\n method: request.method,\r\n extensions: contextExtensions,\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Context Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Obtiene un header del request\r\n */\r\nexport function getHeader(ctx: ServerContext, name: string): string | null {\r\n return ctx.headers.get(name);\r\n}\r\n\r\n/**\r\n * Obtiene todos los headers como objeto\r\n */\r\nexport function getHeaders(ctx: ServerContext): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n ctx.headers.forEach((value, key) => {\r\n headers[key] = value;\r\n });\r\n return headers;\r\n}\r\n\r\n/**\r\n * Verifica si el request es un POST/PUT/PATCH/DELETE (mutation request)\r\n */\r\nexport function isMutationRequest(ctx: ServerContext): boolean {\r\n return ['POST', 'PUT', 'PATCH', 'DELETE'].includes(ctx.method);\r\n}\r\n\r\n/**\r\n * Verifica si el request acepta JSON\r\n */\r\nexport function acceptsJson(ctx: ServerContext): boolean {\r\n const accept = ctx.headers.get('accept') || '';\r\n return accept.includes('application/json') || accept.includes('*/*');\r\n}\r\n\r\n/**\r\n * Verifica si el request es AJAX/fetch\r\n */\r\nexport function isAjaxRequest(ctx: ServerContext): boolean {\r\n return ctx.headers.get('x-requested-with')?.toLowerCase() === 'xmlhttprequest' ||\r\n ctx.headers.has('x-flight-action');\r\n}\r\n\r\n/**\r\n * Verifica si el request viene de un bot\r\n */\r\nexport function isBotRequest(ctx: ServerContext): boolean {\r\n const ua = ctx.headers.get('user-agent')?.toLowerCase() || '';\r\n const botPatterns = [\r\n 'bot', 'crawler', 'spider', 'scraper',\r\n 'googlebot', 'bingbot', 'yandexbot', 'duckduckbot',\r\n 'slurp', 'baiduspider', 'facebookexternalhit',\r\n 'twitterbot', 'linkedinbot', 'embedly', 'quora',\r\n 'outbrain', 'pinterest', 'slack', 'vkshare',\r\n 'w3c_validator', 'lighthouse', 'pagespeed',\r\n ];\r\n return botPatterns.some(pattern => ua.includes(pattern));\r\n}\r\n\r\n/**\r\n * Verifica si el cliente soporta streaming\r\n */\r\nexport function supportsStreaming(ctx: ServerContext): boolean {\r\n // Check for no-stream preference\r\n const noStream = ctx.searchParams.get('_nostream');\r\n if (noStream === '1' || noStream === 'true') return false;\r\n\r\n // Bots typically don't support streaming well\r\n if (isBotRequest(ctx)) return false;\r\n\r\n // Check for slow connection hints\r\n const connection = ctx.headers.get('downlink') || ctx.headers.get('ect');\r\n if (connection === 'slow-2g' || connection === '2g') return false;\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Obtiene el idioma preferido del cliente\r\n */\r\nexport function getPreferredLanguage(ctx: ServerContext, available: string[]): string | undefined {\r\n const acceptLang = ctx.headers.get('accept-language');\r\n if (!acceptLang) return available[0];\r\n\r\n // Parse Accept-Language header\r\n const languages = acceptLang\r\n .split(',')\r\n .map(lang => {\r\n const [code, q = 'q=1'] = lang.trim().split(';');\r\n const quality = parseFloat(q.replace('q=', '')) || 1;\r\n return { code: code!.trim().toLowerCase(), quality };\r\n })\r\n .sort((a, b) => b.quality - a.quality);\r\n\r\n // Find best match\r\n for (const { code } of languages) {\r\n // Exact match\r\n const exact = available.find(a => a.toLowerCase() === code);\r\n if (exact) return exact;\r\n\r\n // Language-only match (e.g., 'es' matches 'es-AR')\r\n const baseCode = code.split('-')[0];\r\n const partial = available.find(a => a.toLowerCase().startsWith(baseCode!));\r\n if (partial) return partial;\r\n }\r\n\r\n return available[0];\r\n}\r\n\r\n// ============================================================================\r\n// Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Sets a cookie in the response\r\n */\r\nexport function setCookie(\r\n ctx: ServerContext,\r\n name: string,\r\n value: string,\r\n options: CookieOptions = {}\r\n): void {\r\n const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];\r\n\r\n if (options.maxAge !== undefined) {\r\n parts.push(`Max-Age=${options.maxAge}`);\r\n }\r\n if (options.expires) {\r\n parts.push(`Expires=${options.expires.toUTCString()}`);\r\n }\r\n if (options.path) {\r\n parts.push(`Path=${options.path}`);\r\n }\r\n if (options.domain) {\r\n parts.push(`Domain=${options.domain}`);\r\n }\r\n if (options.secure) {\r\n parts.push('Secure');\r\n }\r\n if (options.httpOnly) {\r\n parts.push('HttpOnly');\r\n }\r\n if (options.sameSite) {\r\n parts.push(`SameSite=${options.sameSite}`);\r\n }\r\n\r\n ctx.responseHeaders.append('Set-Cookie', parts.join('; '));\r\n}\r\n\r\n/**\r\n * Deletes a cookie\r\n */\r\nexport function deleteCookie(ctx: ServerContext, name: string, options: Pick<CookieOptions, 'path' | 'domain'> = {}): void {\r\n setCookie(ctx, name, '', {\r\n ...options,\r\n maxAge: 0,\r\n expires: new Date(0),\r\n });\r\n}\r\n\r\n/**\r\n * Cookie options\r\n */\r\nexport interface CookieOptions {\r\n /** Max age in seconds */\r\n maxAge?: number;\r\n /** Expiration date */\r\n expires?: Date;\r\n /** Cookie path */\r\n path?: string;\r\n /** Cookie domain */\r\n domain?: string;\r\n /** HTTPS only */\r\n secure?: boolean;\r\n /** Not accessible via JavaScript */\r\n httpOnly?: boolean;\r\n /** SameSite attribute */\r\n sameSite?: 'Strict' | 'Lax' | 'None';\r\n}\r\n\r\n/**\r\n * Sets cache control headers\r\n */\r\nexport function setCacheControl(ctx: ServerContext, options: CacheControlOptions): void {\r\n const parts: string[] = [];\r\n\r\n if (options.public) parts.push('public');\r\n if (options.private) parts.push('private');\r\n if (options.noCache) parts.push('no-cache');\r\n if (options.noStore) parts.push('no-store');\r\n if (options.maxAge !== undefined) parts.push(`max-age=${options.maxAge}`);\r\n if (options.sMaxAge !== undefined) parts.push(`s-maxage=${options.sMaxAge}`);\r\n if (options.staleWhileRevalidate !== undefined) {\r\n parts.push(`stale-while-revalidate=${options.staleWhileRevalidate}`);\r\n }\r\n if (options.staleIfError !== undefined) {\r\n parts.push(`stale-if-error=${options.staleIfError}`);\r\n }\r\n if (options.mustRevalidate) parts.push('must-revalidate');\r\n if (options.immutable) parts.push('immutable');\r\n\r\n ctx.responseHeaders.set('Cache-Control', parts.join(', '));\r\n}\r\n\r\n/**\r\n * Cache control options\r\n */\r\nexport interface CacheControlOptions {\r\n public?: boolean;\r\n private?: boolean;\r\n noCache?: boolean;\r\n noStore?: boolean;\r\n maxAge?: number;\r\n sMaxAge?: number;\r\n staleWhileRevalidate?: number;\r\n staleIfError?: number;\r\n mustRevalidate?: boolean;\r\n immutable?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Error Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Not found error - triggers 404 handling\r\n */\r\nexport function notFound(message = 'Not Found'): never {\r\n const error = new Error(message) as Error & { __flight_not_found: true };\r\n error.__flight_not_found = true;\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is a not found error\r\n */\r\nexport function isNotFoundError(error: unknown): boolean {\r\n return error instanceof Error && '__flight_not_found' in error;\r\n}\r\n\r\n/**\r\n * Redirect error - triggers redirect handling\r\n */\r\nexport function redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 307): never {\r\n const error = new Error(`Redirect: ${url}`) as Error & {\r\n __flight_redirect: { url: string; status: number }\r\n };\r\n error.__flight_redirect = { url, status };\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is a redirect error\r\n */\r\nexport function isRedirectError(error: unknown): error is Error & {\r\n __flight_redirect: { url: string; status: number }\r\n} {\r\n return error instanceof Error && '__flight_redirect' in error;\r\n}\r\n\r\n/**\r\n * Get redirect info from error\r\n */\r\nexport function getRedirectInfo(error: Error & { __flight_redirect: { url: string; status: number } }): { url: string; status: number } {\r\n return error.__flight_redirect;\r\n}\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createStreamingSSR } from './chunk-
|
|
1
|
+
import { createStreamingSSR } from './chunk-RSVA2EYO.js';
|
|
2
2
|
|
|
3
3
|
// src/streaming/observability.ts
|
|
4
4
|
function generateStreamId() {
|
|
@@ -278,5 +278,5 @@ function createHttpObserver(endpoint, options) {
|
|
|
278
278
|
}
|
|
279
279
|
|
|
280
280
|
export { MetricsAggregator, createHttpObserver, createInstrumentedStream, createLoggerObserver };
|
|
281
|
-
//# sourceMappingURL=chunk-
|
|
282
|
-
//# sourceMappingURL=chunk-
|
|
281
|
+
//# sourceMappingURL=chunk-6BDCTUQY.js.map
|
|
282
|
+
//# sourceMappingURL=chunk-6BDCTUQY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/streaming/observability.ts"],"names":[],"mappings":"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","file":"chunk-6BDCTUQY.js","sourcesContent":["/**\r\n * @flight-framework/core - Streaming Observability\r\n * \r\n * Zero-telemetry metrics and instrumentation for streaming SSR.\r\n * All data stays on YOUR infrastructure - never sent anywhere.\r\n * \r\n * Best Practices 2026:\r\n * - Comprehensive timing metrics for each boundary\r\n * - Hook-based observability for custom integrations\r\n * - Performance insights without vendor lock-in\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createInstrumentedStream } from '@flight-framework/core/streaming';\r\n * \r\n * const { stream, metrics } = await createInstrumentedStream({\r\n * shell: '<html>...',\r\n * boundaries: [...],\r\n * onMetrics: (m) => myAnalytics.track(m), // YOUR system\r\n * });\r\n * ```\r\n */\r\n\r\nimport type { StreamingRenderOptions, SuspenseBoundaryConfig } from './index.js';\r\nimport { createStreamingSSR } from './index.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Timing information for a single boundary\r\n */\r\nexport interface BoundaryTiming {\r\n /** Boundary identifier */\r\n id: string;\r\n /** When the boundary started resolving (ms since stream start) */\r\n startTime: number;\r\n /** When the boundary finished resolving */\r\n endTime: number;\r\n /** Total duration in milliseconds */\r\n duration: number;\r\n /** Whether it resolved successfully */\r\n success: boolean;\r\n /** Size of content in bytes (if successful) */\r\n contentSize?: number;\r\n /** Error message if failed */\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Overall streaming metrics\r\n */\r\nexport interface StreamingMetrics {\r\n /** Unique ID for this stream session */\r\n streamId: string;\r\n /** When streaming started */\r\n startTime: number;\r\n /** Time to shell ready (TTFB improvement) */\r\n shellTime: number;\r\n /** Time until all boundaries resolved */\r\n totalStreamTime: number;\r\n /** Individual boundary timings */\r\n boundaries: BoundaryTiming[];\r\n /** Number of boundaries that resolved successfully */\r\n successCount: number;\r\n /** Number of boundaries that failed */\r\n errorCount: number;\r\n /** Total bytes streamed */\r\n totalBytes: number;\r\n /** Strategy used (if priority streaming) */\r\n strategy?: string;\r\n /** Custom metadata you can add */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Observability hooks for streaming events\r\n */\r\nexport interface StreamingObserver {\r\n /** Called when streaming starts */\r\n onStreamStart?: (streamId: string) => void;\r\n /** Called when shell is sent */\r\n onShellReady?: (timing: { streamId: string; duration: number }) => void;\r\n /** Called when a boundary starts resolving */\r\n onBoundaryStart?: (info: { streamId: string; boundaryId: string; startTime: number }) => void;\r\n /** Called when a boundary finishes */\r\n onBoundaryEnd?: (timing: BoundaryTiming & { streamId: string }) => void;\r\n /** Called when streaming completes */\r\n onStreamEnd?: (metrics: StreamingMetrics) => void;\r\n /** Called on any error */\r\n onError?: (error: { streamId: string; boundaryId?: string; error: Error }) => void;\r\n}\r\n\r\n/**\r\n * Configuration for instrumented streaming\r\n */\r\nexport interface InstrumentedStreamConfig {\r\n /** Initial HTML shell */\r\n shell: string;\r\n /** Closing HTML */\r\n shellEnd: string;\r\n /** Suspense boundaries */\r\n suspenseBoundaries: SuspenseBoundaryConfig[];\r\n /** Streaming options */\r\n options?: StreamingRenderOptions;\r\n /** Observer hooks */\r\n observer?: StreamingObserver;\r\n /** Callback when all metrics are ready */\r\n onMetrics?: (metrics: StreamingMetrics) => void;\r\n /** Custom metadata to include in metrics */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Result of instrumented streaming\r\n */\r\nexport interface InstrumentedStreamResult {\r\n /** The readable stream */\r\n stream: ReadableStream<Uint8Array>;\r\n /** Abort the stream */\r\n abort: () => void;\r\n /** Shell ready promise */\r\n shellReady: Promise<void>;\r\n /** All content ready promise */\r\n allReady: Promise<void>;\r\n /** Final metrics (resolves when stream completes) */\r\n metrics: Promise<StreamingMetrics>;\r\n /** Stream ID for correlation */\r\n streamId: string;\r\n}\r\n\r\n// ============================================================================\r\n// Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Generate a unique stream ID\r\n */\r\nfunction generateStreamId(): string {\r\n return `stream_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\n/**\r\n * Create an instrumented streaming SSR response with full observability\r\n */\r\nexport async function createInstrumentedStream(\r\n config: InstrumentedStreamConfig\r\n): Promise<InstrumentedStreamResult> {\r\n const {\r\n shell,\r\n shellEnd,\r\n suspenseBoundaries,\r\n options = {},\r\n observer,\r\n onMetrics,\r\n meta,\r\n } = config;\r\n\r\n const streamId = generateStreamId();\r\n const startTime = Date.now();\r\n const boundaryTimings: BoundaryTiming[] = [];\r\n const boundaryStarts = new Map<string, number>();\r\n let shellTime = 0;\r\n let totalBytes = 0;\r\n\r\n // Metrics promise\r\n let resolveMetrics: (m: StreamingMetrics) => void;\r\n const metricsPromise = new Promise<StreamingMetrics>((r) => { resolveMetrics = r; });\r\n\r\n // Notify stream start\r\n observer?.onStreamStart?.(streamId);\r\n\r\n // Wrap boundaries with instrumentation\r\n const instrumentedBoundaries: SuspenseBoundaryConfig[] = suspenseBoundaries.map(boundary => {\r\n const boundaryStart = Date.now();\r\n boundaryStarts.set(boundary.id, boundaryStart);\r\n\r\n observer?.onBoundaryStart?.({\r\n streamId,\r\n boundaryId: boundary.id,\r\n startTime: boundaryStart - startTime,\r\n });\r\n\r\n return {\r\n ...boundary,\r\n contentPromise: boundary.contentPromise.then(\r\n (content) => {\r\n const endTime = Date.now();\r\n const timing: BoundaryTiming = {\r\n id: boundary.id,\r\n startTime: boundaryStarts.get(boundary.id)! - startTime,\r\n endTime: endTime - startTime,\r\n duration: endTime - boundaryStarts.get(boundary.id)!,\r\n success: true,\r\n contentSize: new TextEncoder().encode(content).length,\r\n };\r\n boundaryTimings.push(timing);\r\n observer?.onBoundaryEnd?.({ ...timing, streamId });\r\n return content;\r\n },\r\n (error) => {\r\n const endTime = Date.now();\r\n const timing: BoundaryTiming = {\r\n id: boundary.id,\r\n startTime: boundaryStarts.get(boundary.id)! - startTime,\r\n endTime: endTime - startTime,\r\n duration: endTime - boundaryStarts.get(boundary.id)!,\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n boundaryTimings.push(timing);\r\n observer?.onBoundaryEnd?.({ ...timing, streamId });\r\n observer?.onError?.({ streamId, boundaryId: boundary.id, error: error as Error });\r\n throw error;\r\n }\r\n ),\r\n };\r\n });\r\n\r\n // Create the underlying stream with instrumented callbacks\r\n const result = await createStreamingSSR({\r\n shell,\r\n shellEnd,\r\n suspenseBoundaries: instrumentedBoundaries,\r\n options: {\r\n ...options,\r\n onShellReady: () => {\r\n shellTime = Date.now() - startTime;\r\n observer?.onShellReady?.({ streamId, duration: shellTime });\r\n options.onShellReady?.();\r\n },\r\n onAllReady: () => {\r\n const totalStreamTime = Date.now() - startTime;\r\n\r\n const metrics: StreamingMetrics = {\r\n streamId,\r\n startTime,\r\n shellTime,\r\n totalStreamTime,\r\n boundaries: boundaryTimings,\r\n successCount: boundaryTimings.filter(b => b.success).length,\r\n errorCount: boundaryTimings.filter(b => !b.success).length,\r\n totalBytes,\r\n meta,\r\n };\r\n\r\n observer?.onStreamEnd?.(metrics);\r\n onMetrics?.(metrics);\r\n resolveMetrics!(metrics);\r\n options.onAllReady?.();\r\n },\r\n onError: (error) => {\r\n observer?.onError?.({ streamId, error });\r\n options.onError?.(error);\r\n },\r\n },\r\n });\r\n\r\n // Wrap stream to count bytes\r\n const countingStream = result.stream.pipeThrough(\r\n new TransformStream<Uint8Array, Uint8Array>({\r\n transform(chunk, controller) {\r\n totalBytes += chunk.length;\r\n controller.enqueue(chunk);\r\n },\r\n })\r\n );\r\n\r\n return {\r\n stream: countingStream,\r\n abort: result.abort,\r\n shellReady: result.shellReady,\r\n allReady: result.allReady,\r\n metrics: metricsPromise,\r\n streamId,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility: Metrics Aggregator\r\n// ============================================================================\r\n\r\n/**\r\n * Aggregate metrics from multiple streams for analysis\r\n */\r\nexport class MetricsAggregator {\r\n private metrics: StreamingMetrics[] = [];\r\n private maxSamples: number;\r\n\r\n constructor(maxSamples = 1000) {\r\n this.maxSamples = maxSamples;\r\n }\r\n\r\n /**\r\n * Add metrics from a stream\r\n */\r\n add(metrics: StreamingMetrics): void {\r\n this.metrics.push(metrics);\r\n if (this.metrics.length > this.maxSamples) {\r\n this.metrics.shift();\r\n }\r\n }\r\n\r\n /**\r\n * Get average shell time\r\n */\r\n getAverageShellTime(): number {\r\n if (this.metrics.length === 0) return 0;\r\n return this.metrics.reduce((sum, m) => sum + m.shellTime, 0) / this.metrics.length;\r\n }\r\n\r\n /**\r\n * Get average total stream time\r\n */\r\n getAverageTotalTime(): number {\r\n if (this.metrics.length === 0) return 0;\r\n return this.metrics.reduce((sum, m) => sum + m.totalStreamTime, 0) / this.metrics.length;\r\n }\r\n\r\n /**\r\n * Get slowest boundaries (by average duration)\r\n */\r\n getSlowestBoundaries(limit = 5): { id: string; avgDuration: number; errorRate: number }[] {\r\n const boundaryStats = new Map<string, { totalDuration: number; count: number; errors: number }>();\r\n\r\n for (const m of this.metrics) {\r\n for (const b of m.boundaries) {\r\n const stats = boundaryStats.get(b.id) || { totalDuration: 0, count: 0, errors: 0 };\r\n stats.totalDuration += b.duration;\r\n stats.count++;\r\n if (!b.success) stats.errors++;\r\n boundaryStats.set(b.id, stats);\r\n }\r\n }\r\n\r\n return [...boundaryStats.entries()]\r\n .map(([id, stats]) => ({\r\n id,\r\n avgDuration: stats.totalDuration / stats.count,\r\n errorRate: stats.errors / stats.count,\r\n }))\r\n .sort((a, b) => b.avgDuration - a.avgDuration)\r\n .slice(0, limit);\r\n }\r\n\r\n /**\r\n * Get overall error rate\r\n */\r\n getErrorRate(): number {\r\n const total = this.metrics.reduce((sum, m) => sum + m.boundaries.length, 0);\r\n const errors = this.metrics.reduce((sum, m) => sum + m.errorCount, 0);\r\n return total > 0 ? errors / total : 0;\r\n }\r\n\r\n /**\r\n * Get percentiles for shell time\r\n */\r\n getShellTimePercentiles(): { p50: number; p90: number; p99: number } {\r\n const sorted = [...this.metrics].map(m => m.shellTime).sort((a, b) => a - b);\r\n const len = sorted.length;\r\n if (len === 0) return { p50: 0, p90: 0, p99: 0 };\r\n\r\n return {\r\n p50: sorted[Math.floor(len * 0.5)] ?? 0,\r\n p90: sorted[Math.floor(len * 0.9)] ?? 0,\r\n p99: sorted[Math.floor(len * 0.99)] ?? 0,\r\n };\r\n }\r\n\r\n /**\r\n * Export all metrics for external analysis\r\n */\r\n export(): StreamingMetrics[] {\r\n return [...this.metrics];\r\n }\r\n\r\n /**\r\n * Clear all metrics\r\n */\r\n clear(): void {\r\n this.metrics = [];\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Utility: Create Observer from Logger\r\n// ============================================================================\r\n\r\n/**\r\n * Create a streaming observer from a simple logger function\r\n */\r\nexport function createLoggerObserver(\r\n log: (message: string, data?: Record<string, unknown>) => void\r\n): StreamingObserver {\r\n return {\r\n onStreamStart: (streamId) => {\r\n log('[Flight] Stream started', { streamId });\r\n },\r\n onShellReady: ({ streamId, duration }) => {\r\n log('[Flight] Shell ready', { streamId, duration: `${duration}ms` });\r\n },\r\n onBoundaryStart: ({ streamId, boundaryId, startTime }) => {\r\n log('[Flight] Boundary started', { streamId, boundaryId, startTime: `${startTime}ms` });\r\n },\r\n onBoundaryEnd: (timing) => {\r\n log('[Flight] Boundary completed', {\r\n streamId: (timing as any).streamId,\r\n boundaryId: timing.id,\r\n duration: `${timing.duration}ms`,\r\n success: timing.success,\r\n size: timing.contentSize ? `${timing.contentSize}b` : undefined,\r\n });\r\n },\r\n onStreamEnd: (metrics) => {\r\n log('[Flight] Stream completed', {\r\n streamId: metrics.streamId,\r\n totalTime: `${metrics.totalStreamTime}ms`,\r\n shellTime: `${metrics.shellTime}ms`,\r\n boundaries: metrics.boundaries.length,\r\n errors: metrics.errorCount,\r\n });\r\n },\r\n onError: ({ streamId, boundaryId, error }) => {\r\n log('[Flight] Stream error', { streamId, boundaryId, error: error.message });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Create observer that sends metrics to a custom endpoint (YOUR infrastructure)\r\n */\r\nexport function createHttpObserver(endpoint: string, options?: {\r\n headers?: Record<string, string>;\r\n batchSize?: number;\r\n flushInterval?: number;\r\n}): StreamingObserver {\r\n const { headers = {}, batchSize = 10, flushInterval = 5000 } = options || {};\r\n const buffer: StreamingMetrics[] = [];\r\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n const flush = async () => {\r\n if (buffer.length === 0) return;\r\n const batch = buffer.splice(0, buffer.length);\r\n\r\n try {\r\n await fetch(endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: JSON.stringify({ metrics: batch, timestamp: Date.now() }),\r\n });\r\n } catch (error) {\r\n console.error('[Flight] Failed to send metrics:', error);\r\n // Re-add to buffer for retry\r\n buffer.unshift(...batch);\r\n }\r\n };\r\n\r\n const scheduleFlush = () => {\r\n if (flushTimer) return;\r\n flushTimer = setTimeout(() => {\r\n flushTimer = null;\r\n flush();\r\n }, flushInterval);\r\n };\r\n\r\n return {\r\n onStreamEnd: (metrics) => {\r\n buffer.push(metrics);\r\n if (buffer.length >= batchSize) {\r\n flush();\r\n } else {\r\n scheduleFlush();\r\n }\r\n },\r\n };\r\n}\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createMiddlewareChain, createContextFromRequest, createResponseFromContext } from './chunk-
|
|
2
|
-
import { resolveConfig } from './chunk-
|
|
3
|
-
import { createRouter } from './chunk-
|
|
1
|
+
import { createMiddlewareChain, createContextFromRequest, createResponseFromContext } from './chunk-OYF2OAKS.js';
|
|
2
|
+
import { resolveConfig } from './chunk-IXMD5QH2.js';
|
|
3
|
+
import { createRouter } from './chunk-GCQZ4FHI.js';
|
|
4
4
|
|
|
5
5
|
// src/server/index.ts
|
|
6
6
|
function detectRuntime() {
|
|
@@ -219,5 +219,5 @@ function getRuntime() {
|
|
|
219
219
|
}
|
|
220
220
|
|
|
221
221
|
export { createServer, getRuntime, isFlightServer };
|
|
222
|
-
//# sourceMappingURL=chunk-
|
|
223
|
-
//# sourceMappingURL=chunk-
|
|
222
|
+
//# sourceMappingURL=chunk-EGB7C73X.js.map
|
|
223
|
+
//# sourceMappingURL=chunk-EGB7C73X.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/index.ts"],"names":[],"mappings":";;;;;AAuIA,SAAS,aAAA,GAAyB;AAE9B,EAAA,IAAI,OAAO,GAAA,KAAQ,WAAA,EAAa,OAAO,KAAA;AAEvC,EAAA,IAAI,OAAO,IAAA,KAAS,WAAA,EAAa,OAAO,MAAA;AACxC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,QAAA,EAAU,MAAM,OAAO,MAAA;AACrE,EAAA,OAAO,SAAA;AACX;AA6BO,SAAS,YAAA,CAAa,OAAA,GAAyB,EAAC,EAAiB;AACpE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA;AACjD,EAAA,MAAM,SAAS,YAAA,EAAyB;AACxC,EAAA,MAAM,kBAAkB,qBAAA,EAAsB;AAG9C,EAAA,MAAM,IAAA,GAAO;AAAA,IACT,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAO,OAAA,CAAQ;AAAA,GACnB;AAEA,EAAA,SAAS,QAAA,CAAS,MAAA,EAA2B,IAAA,EAAc,OAAA,EAAqC;AAC5F,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA;AACxD,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAG3D,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,KAAA,CAAM,IAAA,KAAS,IAAA,EAAM;AAEpD,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACvB,QAAA,aAAA,CAAc,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA;AAAA,MAC7C;AACA,MAAA,aAAA,CAAc,KAAA,CAAM,QAAQ,OAAA,GAAU,OAAA;AAAA,IAC1C,CAAA,MAAO;AACH,MAAA,MAAA,CAAO,GAAA,CAAI;AAAA,QACP,IAAA;AAAA,QACA,OAAA,EAAS,EAAE,OAAA,EAAS,SAAA,EAAW,OAAA;AAAQ,OAC1C,CAAA;AAAA,IACL;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,SAAS,aAAA,CACL,kBACA,eAAA,EACY;AACZ,IAAA,IAAI,OAAO,gBAAA,KAAqB,QAAA,IAAY,eAAA,EAAiB;AACzD,MAAA,eAAA,CAAgB,GAAA,CAAI,kBAAkB,eAAe,CAAA;AAAA,IACzD,CAAA,MAAA,IAAW,OAAO,gBAAA,KAAqB,UAAA,EAAY;AAC/C,MAAA,eAAA,CAAgB,IAAI,gBAAgB,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,eAAe,OAAO,OAAA,EAAqC;AACvD,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAY;AAG1C,IAAA,MAAM,GAAA,GAAM,yBAAyB,OAAO,CAAA;AAC5C,IAAA,MAAM,eAAA,CAAgB,QAAQ,GAAG,CAAA;AAGjC,IAAA,IAAI,GAAA,CAAI,iBAAiB,MAAA,EAAW;AAChC,MAAA,OAAO,0BAA0B,GAAG,CAAA;AAAA,IACxC;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,OAAO,IAAI,QAAA,CAAS,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IACpD;AAGA,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,QAAQ,GAAA,CAAI,MAAM,CAAA,IAAK,CAAC,MAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACnF,MAAA,OAAO,IAAI,QAAA,CAAS,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC7D;AAGA,IAAA,MAAM,cAAA,GAAsC;AAAA,MACxC,OAAA;AAAA,MACA,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,OAAO,GAAA,CAAI,YAAA;AAAA,MACX,GAAA;AAAA,MACA,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,GAAG;AAAA,KACP;AAEA,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,QAAQ,cAAc,CAAA;AAAA,IAC3D,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,MAAA,OAAO,IAAI,QAAA,CAAS,uBAAA,EAAyB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IAChE;AAAA,EACJ;AAMA,EAAA,eAAe,OAAO,aAAA,EAAuD;AACzE,IAAA,MAAM,IAAA,GAAsB,OAAO,aAAA,KAAkB,QAAA,GAC/C,EAAE,IAAA,EAAM,aAAA,EAAc,GACtB,aAAA,IAAiB,EAAC;AAExB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,MAAA,CAAO,IAAI,IAAA,IAAQ,GAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,WAAA;AAGlC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,MAAA,CAAO,OAAA;AAC1C,IAAA,IAAI,SAAS,MAAA,EAAQ;AACjB,MAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AACjC,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,UAAU,aAAA,EAAc;AAE9B,IAAA,QAAQ,OAAA;AAAS,MACb,KAAK,KAAA;AACD,QAAA,MAAM,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AAClD,QAAA;AAAA,MACJ,KAAK,MAAA;AACD,QAAA,MAAM,eAAA,CAAgB,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AACnD,QAAA;AAAA,MACJ,KAAK,MAAA;AAAA,MACL;AACI,QAAA,MAAM,eAAA,CAAgB,IAAA,EAAM,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AACnD,QAAA;AAAA;AACR,EACJ;AAKA,EAAA,eAAe,eAAA,CAAgB,IAAA,EAAc,QAAA,EAAkB,QAAA,EAAqD;AAChH,IAAA,MAAM,EAAE,YAAA,EAAc,gBAAA,EAAiB,GAAI,MAAM,OAAO,MAAW,CAAA;AAEnE,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,OAAO,GAAA,EAAK,GAAA,KAAQ;AACpD,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAA,IAAO,KAAK,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAGhE,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACpD,QAAA,IAAI,KAAA,EAAO;AACP,UAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AACtD,UAAA,IAAI,WAAA,EAAa,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,WAAW,CAAA;AAAA,QACjD;AAAA,MACJ;AAGA,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,CAAC,QAAQ,KAAA,EAAO,OAAO,EAAE,QAAA,CAAS,GAAA,CAAI,MAAA,IAAU,EAAE,CAAA,EAAG;AACrD,QAAA,IAAA,GAAO,MAAM,IAAI,OAAA,CAAgB,CAAC,OAAA,KAAY;AAC1C,UAAA,IAAI,IAAA,GAAO,EAAA;AACX,UAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,KAAA,KAAS,IAAA,IAAQ,KAAK,CAAA;AACrC,UAAA,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,MAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,QACrC,CAAC,CAAA;AAAA,MACL;AAEA,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,GAAA,CAAI,UAAS,EAAG;AAAA,QACxC,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA;AAAA,QACA,MAAM,IAAA,IAAQ;AAAA,OACjB,CAAA;AAED,MAAA,IAAI;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,OAAO,CAAA;AAErC,QAAA,GAAA,CAAI,aAAa,QAAA,CAAS,MAAA;AAC1B,QAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,UAAA,GAAA,CAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,QAC5B,CAAC,CAAA;AAED,QAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AACzC,QAAA,GAAA,CAAI,IAAI,YAAY,CAAA;AAAA,MACxB,SAAS,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,QAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,QAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,kBAAkB,CAAA;AAChD,QAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,uBAAA,EAAyB,CAAC,CAAA;AAAA,MAC9D;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU,MAAM;AACpC,QAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAC9B,QAAA,IAAI,QAAA,EAAU;AACV,UAAA,QAAA,CAAS,IAAI,CAAA;AAAA,QACjB,CAAA,MAAO;AACH,UAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA;AAAA;AAAA,uBAAA,EAIZ,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,UAAS,CAAE,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA;AAAA,CAEzD,CAAA;AAAA,QACe;AACA,QAAA,OAAA,EAAQ;AAAA,MACZ,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACL;AAKA,EAAA,eAAe,cAAA,CAAe,IAAA,EAAc,QAAA,EAAkB,QAAA,EAAqD;AAE/G,IAAA,GAAA,CAAI,KAAA,CAAM;AAAA,MACN,IAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACV,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAC9B,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB,CAAA,MAAO;AACH,MAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA;AAAA;AAAA,uBAAA,EAIJ,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,UAAS,CAAE,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA;AAAA,CAEzD,CAAA;AAAA,IACO;AAAA,EACJ;AAKA,EAAA,eAAe,eAAA,CAAgB,IAAA,EAAc,QAAA,EAAkB,QAAA,EAAqD;AAEhH,IAAA,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,EAAM,QAAA,IAAY,MAAM,CAAA;AAErC,IAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAC9B,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB,CAAA,MAAO;AACH,MAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA;AAAA;AAAA,uBAAA,EAIJ,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,UAAS,CAAE,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA;AAAA,CAEzD,CAAA;AAAA,IACO;AAAA,EACJ;AAEA,EAAA,MAAM,MAAA,GAAuB;AAAA,IACzB,KAAA,EAAO,QAAA;AAAA,IACP,KAAK,CAAC,IAAA,EAAM,YAAY,QAAA,CAAS,KAAA,EAAO,MAAM,OAAO,CAAA;AAAA,IACrD,MAAM,CAAC,IAAA,EAAM,YAAY,QAAA,CAAS,MAAA,EAAQ,MAAM,OAAO,CAAA;AAAA,IACvD,KAAK,CAAC,IAAA,EAAM,YAAY,QAAA,CAAS,KAAA,EAAO,MAAM,OAAO,CAAA;AAAA,IACrD,QAAQ,CAAC,IAAA,EAAM,YAAY,QAAA,CAAS,QAAA,EAAU,MAAM,OAAO,CAAA;AAAA,IAC3D,OAAO,CAAC,IAAA,EAAM,YAAY,QAAA,CAAS,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,IACzD,GAAA,EAAK,aAAA;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA,EAAO,MAAA;AAAA;AAAA,IACP,IAAI,MAAA,GAAS;AAAE,MAAA,OAAO,MAAA;AAAA,IAAQ,CAAA;AAAA,IAC9B,IAAI,MAAA,GAAS;AAAE,MAAA,OAAO,MAAA;AAAA,IAA2C,CAAA;AAAA,IACjE,IAAI,UAAA,GAAa;AAAE,MAAA,OAAO,eAAA;AAAA,IAAiB;AAAA,GAC/C;AAEA,EAAA,OAAO,MAAA;AACX;AAOO,SAAS,eAAe,GAAA,EAAmC;AAC9D,EAAA,OACI,OAAO,GAAA,KAAQ,QAAA,IACf,GAAA,KAAQ,IAAA,IACR,QAAA,IAAY,GAAA,IACZ,OAAA,IAAW,GAAA,IACX,OAAQ,GAAA,CAAqB,MAAA,KAAW,UAAA;AAEhD;AAGO,SAAS,UAAA,GAAsB;AAClC,EAAA,OAAO,aAAA,EAAc;AACzB","file":"chunk-EGB7C73X.js","sourcesContent":["/**\r\n * Flight Server - Main server factory\r\n * \r\n * Creates a Flight server instance that handles routing, middleware, and rendering.\r\n * This is the primary entry point for Flight applications.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight-framework/core';\r\n * \r\n * const server = createServer();\r\n * \r\n * server.get('/api/health', () => Response.json({ status: 'ok' }));\r\n * \r\n * // Just works! Auto-detects Node.js, Bun, or Deno\r\n * server.listen(3000);\r\n * ```\r\n */\r\n\r\nimport { createRouter, type Router } from '../router/index.js';\r\nimport {\r\n createMiddlewareChain,\r\n createContextFromRequest,\r\n createResponseFromContext,\r\n type MiddlewareChain,\r\n type Middleware,\r\n} from '../middleware/index.js';\r\nimport { type FlightConfig, type FlightUserConfig, resolveConfig } from '../config/index.js';\r\nimport type { FlightAdapter } from '../adapters/index.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** Route handler function signature */\r\nexport type RouteHandler = (context: RouteHandlerContext) => Promise<Response> | Response;\r\n\r\n/** Context passed to route handlers */\r\nexport interface RouteHandlerContext {\r\n /** The incoming request */\r\n request: Request;\r\n /** URL parameters from routing */\r\n params: Record<string, string | string[]>;\r\n /** Query parameters */\r\n query: URLSearchParams;\r\n /** Parsed URL */\r\n url: URL;\r\n /** Local data from middleware */\r\n locals: Record<string, unknown>;\r\n /** Database instance (if configured) */\r\n db?: unknown;\r\n /** Auth instance (if configured) */\r\n auth?: unknown;\r\n /** Email instance (if configured) */\r\n email?: unknown;\r\n}\r\n\r\n/** Server options */\r\nexport interface ServerOptions {\r\n /** Server configuration */\r\n config?: FlightUserConfig;\r\n /** Deployment adapter */\r\n adapter?: FlightAdapter;\r\n /** Database instance */\r\n db?: unknown;\r\n /** Auth instance */\r\n auth?: unknown;\r\n /** Email instance */\r\n email?: unknown;\r\n}\r\n\r\n/** Route definition for the server */\r\nexport interface ServerRoute {\r\n /** HTTP method (GET, POST, etc.) */\r\n method: string | string[];\r\n /** Route path pattern */\r\n path: string;\r\n /** Route handler */\r\n handler: RouteHandler;\r\n}\r\n\r\n/** Listen options */\r\nexport interface ListenOptions {\r\n /** Port to listen on (default: 3000) */\r\n port?: number;\r\n /** Hostname to bind to (default: 'localhost') */\r\n hostname?: string;\r\n /** Callback when server starts */\r\n onListen?: (info: { port: number; hostname: string }) => void;\r\n}\r\n\r\n/** Flight Server instance */\r\nexport interface FlightServer {\r\n /** Add a route */\r\n route(method: string | string[], path: string, handler: RouteHandler): FlightServer;\r\n\r\n /** Convenience methods for common HTTP methods */\r\n get(path: string, handler: RouteHandler): FlightServer;\r\n post(path: string, handler: RouteHandler): FlightServer;\r\n put(path: string, handler: RouteHandler): FlightServer;\r\n delete(path: string, handler: RouteHandler): FlightServer;\r\n patch(path: string, handler: RouteHandler): FlightServer;\r\n\r\n /** Add middleware */\r\n use(middleware: Middleware): FlightServer;\r\n use(path: string, middleware: Middleware): FlightServer;\r\n\r\n /** Handle incoming request (Web standard Request/Response) */\r\n handle(request: Request): Promise<Response>;\r\n\r\n /** \r\n * Start the HTTP server\r\n * Auto-detects runtime: Node.js, Bun, or Deno\r\n */\r\n listen(port?: number | ListenOptions): Promise<void>;\r\n\r\n /** Fetch handler for Bun.serve() and Deno.serve() */\r\n fetch(request: Request): Promise<Response>;\r\n\r\n /** Get the resolved configuration */\r\n readonly config: FlightConfig;\r\n\r\n /** Get the router instance */\r\n readonly router: Router<RouteHandler>;\r\n\r\n /** Get the middleware chain */\r\n readonly middleware: MiddlewareChain;\r\n}\r\n\r\n// ============================================================================\r\n// Runtime Detection\r\n// ============================================================================\r\n\r\ntype Runtime = 'node' | 'bun' | 'deno' | 'unknown';\r\n\r\nfunction detectRuntime(): Runtime {\r\n // @ts-expect-error - Bun global\r\n if (typeof Bun !== 'undefined') return 'bun';\r\n // @ts-expect-error - Deno global \r\n if (typeof Deno !== 'undefined') return 'deno';\r\n if (typeof process !== 'undefined' && process.versions?.node) return 'node';\r\n return 'unknown';\r\n}\r\n\r\n// ============================================================================\r\n// Server Implementation\r\n// ============================================================================\r\n\r\ninterface RouteEntry {\r\n methods: Set<string>;\r\n handler: RouteHandler;\r\n}\r\n\r\n/**\r\n * Create a new Flight server instance\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight-framework/core';\r\n * \r\n * const server = createServer();\r\n * \r\n * server.get('/api/users', async ({ db }) => {\r\n * const users = await db.query('SELECT * FROM users');\r\n * return Response.json(users);\r\n * });\r\n * \r\n * // Works on Node.js, Bun, and Deno!\r\n * server.listen(3000);\r\n * ```\r\n */\r\nexport function createServer(options: ServerOptions = {}): FlightServer {\r\n const config = resolveConfig(options.config ?? {});\r\n const router = createRouter<RouteEntry>();\r\n const middlewareChain = createMiddlewareChain();\r\n\r\n // Store dependencies\r\n const deps = {\r\n db: options.db,\r\n auth: options.auth,\r\n email: options.email,\r\n };\r\n\r\n function addRoute(method: string | string[], path: string, handler: RouteHandler): FlightServer {\r\n const methods = Array.isArray(method) ? method : [method];\r\n const methodSet = new Set(methods.map(m => m.toUpperCase()));\r\n\r\n // Check if route already exists\r\n const existingMatch = router.match(path);\r\n if (existingMatch && existingMatch.route.path === path) {\r\n // Merge methods\r\n for (const m of methodSet) {\r\n existingMatch.route.handler.methods.add(m);\r\n }\r\n existingMatch.route.handler.handler = handler;\r\n } else {\r\n router.add({\r\n path,\r\n handler: { methods: methodSet, handler },\r\n });\r\n }\r\n\r\n return server;\r\n }\r\n\r\n function useMiddleware(\r\n pathOrMiddleware: string | Middleware,\r\n maybeMiddleware?: Middleware\r\n ): FlightServer {\r\n if (typeof pathOrMiddleware === 'string' && maybeMiddleware) {\r\n middlewareChain.use(pathOrMiddleware, maybeMiddleware);\r\n } else if (typeof pathOrMiddleware === 'function') {\r\n middlewareChain.use(pathOrMiddleware);\r\n }\r\n return server;\r\n }\r\n\r\n async function handle(request: Request): Promise<Response> {\r\n const url = new URL(request.url);\r\n const method = request.method.toUpperCase();\r\n\r\n // Run middleware\r\n const ctx = createContextFromRequest(request);\r\n await middlewareChain.execute(ctx);\r\n\r\n // If middleware already set a response, return it\r\n if (ctx.responseBody !== undefined) {\r\n return createResponseFromContext(ctx);\r\n }\r\n\r\n // Match route\r\n const match = router.match(url.pathname);\r\n if (!match) {\r\n return new Response('Not Found', { status: 404 });\r\n }\r\n\r\n // Check method\r\n if (!match.route.handler.methods.has(method) && !match.route.handler.methods.has('*')) {\r\n return new Response('Method Not Allowed', { status: 405 });\r\n }\r\n\r\n // Build handler context\r\n const handlerContext: RouteHandlerContext = {\r\n request,\r\n params: match.params,\r\n query: url.searchParams,\r\n url,\r\n locals: ctx.locals,\r\n ...deps,\r\n };\r\n\r\n try {\r\n return await match.route.handler.handler(handlerContext);\r\n } catch (error) {\r\n console.error('Route handler error:', error);\r\n return new Response('Internal Server Error', { status: 500 });\r\n }\r\n }\r\n\r\n /**\r\n * Start the HTTP server\r\n * Auto-detects the runtime and uses the appropriate server\r\n */\r\n async function listen(portOrOptions?: number | ListenOptions): Promise<void> {\r\n const opts: ListenOptions = typeof portOrOptions === 'number'\r\n ? { port: portOrOptions }\r\n : portOrOptions ?? {};\r\n\r\n const port = opts.port ?? config.dev.port ?? 3000;\r\n const hostname = opts.hostname ?? 'localhost';\r\n\r\n // Check for custom adapter first\r\n const adapter = options.adapter ?? config.adapter;\r\n if (adapter?.listen) {\r\n await adapter.listen(server, port);\r\n return;\r\n }\r\n\r\n const runtime = detectRuntime();\r\n\r\n switch (runtime) {\r\n case 'bun':\r\n await startBunServer(port, hostname, opts.onListen);\r\n break;\r\n case 'deno':\r\n await startDenoServer(port, hostname, opts.onListen);\r\n break;\r\n case 'node':\r\n default:\r\n await startNodeServer(port, hostname, opts.onListen);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Start Node.js HTTP server\r\n */\r\n async function startNodeServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n const httpServer = createHttpServer(async (req, res) => {\r\n const url = new URL(req.url || '/', `http://${hostname}:${port}`);\r\n\r\n // Build headers\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n const headerValue = Array.isArray(value) ? value[0] : value;\r\n if (headerValue) headers.set(key, headerValue);\r\n }\r\n }\r\n\r\n // Read body for POST/PUT/PATCH\r\n let body: string | undefined;\r\n if (['POST', 'PUT', 'PATCH'].includes(req.method || '')) {\r\n body = await new Promise<string>((resolve) => {\r\n let data = '';\r\n req.on('data', chunk => data += chunk);\r\n req.on('end', () => resolve(data));\r\n });\r\n }\r\n\r\n const request = new Request(url.toString(), {\r\n method: req.method,\r\n headers,\r\n body: body || undefined,\r\n });\r\n\r\n try {\r\n const response = await handle(request);\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value, key) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const responseBody = await response.text();\r\n res.end(responseBody);\r\n } catch (error) {\r\n console.error('Server error:', error);\r\n res.statusCode = 500;\r\n res.setHeader('Content-Type', 'application/json');\r\n res.end(JSON.stringify({ error: 'Internal Server Error' }));\r\n }\r\n });\r\n\r\n return new Promise((resolve) => {\r\n httpServer.listen(port, hostname, () => {\r\n const info = { port, hostname };\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n╔═══════════════════════════════════════════════════════════╗\r\n║ Flight Server (Node.js) ║\r\n╠═══════════════════════════════════════════════════════════╣\r\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\r\n╚═══════════════════════════════════════════════════════════╝\r\n`);\r\n }\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Start Bun server\r\n */\r\n async function startBunServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\r\n // @ts-expect-error - Bun types\r\n Bun.serve({\r\n port,\r\n hostname,\r\n fetch: handle,\r\n });\r\n\r\n const info = { port, hostname };\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n╔═══════════════════════════════════════════════════════════╗\r\n║ Flight Server (Bun) ║\r\n╠═══════════════════════════════════════════════════════════╣\r\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\r\n╚═══════════════════════════════════════════════════════════╝\r\n`);\r\n }\r\n }\r\n\r\n /**\r\n * Start Deno server\r\n */\r\n async function startDenoServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\r\n // @ts-expect-error - Deno types\r\n Deno.serve({ port, hostname }, handle);\r\n\r\n const info = { port, hostname };\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n╔═══════════════════════════════════════════════════════════╗\r\n║ Flight Server (Deno) ║\r\n╠═══════════════════════════════════════════════════════════╣\r\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\r\n╚═══════════════════════════════════════════════════════════╝\r\n`);\r\n }\r\n }\r\n\r\n const server: FlightServer = {\r\n route: addRoute,\r\n get: (path, handler) => addRoute('GET', path, handler),\r\n post: (path, handler) => addRoute('POST', path, handler),\r\n put: (path, handler) => addRoute('PUT', path, handler),\r\n delete: (path, handler) => addRoute('DELETE', path, handler),\r\n patch: (path, handler) => addRoute('PATCH', path, handler),\r\n use: useMiddleware as FlightServer['use'],\r\n handle,\r\n listen,\r\n fetch: handle, // Alias for Bun/Deno compatibility\r\n get config() { return config; },\r\n get router() { return router as unknown as Router<RouteHandler>; },\r\n get middleware() { return middlewareChain; },\r\n };\r\n\r\n return server;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Exports\r\n// ============================================================================\r\n\r\n/** Type guard to check if an object is a FlightServer */\r\nexport function isFlightServer(obj: unknown): obj is FlightServer {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'handle' in obj &&\r\n 'route' in obj &&\r\n typeof (obj as FlightServer).handle === 'function'\r\n );\r\n}\r\n\r\n/** Get current runtime */\r\nexport function getRuntime(): Runtime {\r\n return detectRuntime();\r\n}\r\n\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isProduction, isDevelopment } from './chunk-
|
|
1
|
+
import { isProduction, isDevelopment } from './chunk-YHEVHRLH.js';
|
|
2
2
|
|
|
3
3
|
// src/errors/index.ts
|
|
4
4
|
var FlightError = class extends Error {
|
|
@@ -193,5 +193,5 @@ function wrapWithDigest(error) {
|
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden, getError, getErrorStatusCode, isFlightError, isForbiddenError, isNotFoundError, isUnauthorizedError, notFound, showError, unauthorized, wrapWithDigest };
|
|
196
|
-
//# sourceMappingURL=chunk-
|
|
197
|
-
//# sourceMappingURL=chunk-
|
|
196
|
+
//# sourceMappingURL=chunk-FSJNOPYE.js.map
|
|
197
|
+
//# sourceMappingURL=chunk-FSJNOPYE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts"],"names":[],"mappings":"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","file":"chunk-FSJNOPYE.js","sourcesContent":["/**\r\n * @flight-framework/core - Error Handling\r\n * \r\n * Comprehensive error handling utilities for Flight applications.\r\n * All utilities are OPTIONAL - developers can use their own error handling.\r\n * \r\n * Philosophy: Flight OFFERS these utilities, but never IMPOSES them.\r\n * Using throw new Error() works perfectly fine - this is your choice.\r\n */\r\n\r\nimport { isProduction, isDevelopment } from '../utils/env.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for creating a Flight error\r\n */\r\nexport interface FlightErrorOptions {\r\n /** HTTP status code */\r\n statusCode: number;\r\n /** Short status message (e.g., \"Not Found\") */\r\n statusMessage?: string;\r\n /** Detailed error message */\r\n message?: string;\r\n /** Additional data to include with the error */\r\n data?: Record<string, unknown>;\r\n /** If true, shows full-screen error page instead of error boundary */\r\n fatal?: boolean;\r\n /** Original error that caused this error */\r\n cause?: Error;\r\n}\r\n\r\n/**\r\n * Extended error props with digest for production error correlation\r\n */\r\nexport interface FlightErrorProps {\r\n /** The error object */\r\n error: Error & { digest?: string };\r\n /** Function to attempt recovery by re-rendering */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * Reset details provided to onReset callback\r\n */\r\nexport interface ResetDetails {\r\n /** Reason for the reset */\r\n reason: 'imperative-api' | 'keys';\r\n /** Arguments passed to resetErrorBoundary (if imperative) */\r\n args?: unknown[];\r\n /** Previous resetKeys values (if keys changed) */\r\n prev?: unknown[];\r\n /** New resetKeys values (if keys changed) */\r\n next?: unknown[];\r\n}\r\n\r\n/**\r\n * Options for error boundary behavior\r\n */\r\nexport interface ErrorBoundaryOptions {\r\n /** Keys that trigger automatic reset when changed */\r\n resetKeys?: unknown[];\r\n /** Callback when error boundary resets */\r\n onReset?: (details: ResetDetails) => void;\r\n /** Callback when error is caught */\r\n onError?: (error: Error, info: { componentStack?: string }) => void;\r\n}\r\n\r\n// ============================================================================\r\n// FlightError Class\r\n// ============================================================================\r\n\r\n/**\r\n * Custom error class with status code and metadata support.\r\n * \r\n * You can use this class or regular Error - Flight handles both.\r\n * \r\n * @example\r\n * ```typescript\r\n * throw new FlightError({\r\n * statusCode: 404,\r\n * message: 'User not found',\r\n * data: { userId: '123' }\r\n * });\r\n * ```\r\n */\r\nexport class FlightError extends Error {\r\n /** HTTP status code */\r\n readonly statusCode: number;\r\n /** Short status message */\r\n readonly statusMessage: string;\r\n /** Additional error data */\r\n readonly data?: Record<string, unknown>;\r\n /** Whether this is a fatal error (shows full-screen) */\r\n readonly fatal: boolean;\r\n /** Unique digest for production error correlation */\r\n readonly digest?: string;\r\n\r\n constructor(options: FlightErrorOptions) {\r\n super(options.message || options.statusMessage || 'An error occurred');\r\n\r\n this.name = 'FlightError';\r\n this.statusCode = options.statusCode;\r\n this.statusMessage = options.statusMessage || getDefaultStatusMessage(options.statusCode);\r\n this.data = options.data;\r\n this.fatal = options.fatal ?? false;\r\n\r\n // Generate digest in production for error correlation\r\n // Using typeof check for SSR/browser compatibility\r\n if (isProduction()) {\r\n this.digest = generateDigest();\r\n }\r\n\r\n // Preserve original error stack if cause provided\r\n if (options.cause) {\r\n this.cause = options.cause;\r\n if (options.cause.stack) {\r\n this.stack = `${this.stack}\\nCaused by: ${options.cause.stack}`;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Convert to plain object for serialization\r\n */\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n statusCode: this.statusCode,\r\n statusMessage: this.statusMessage,\r\n data: this.data,\r\n fatal: this.fatal,\r\n digest: this.digest,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// HTTP Error Classes (Convenience)\r\n// ============================================================================\r\n\r\n/**\r\n * 400 Bad Request error\r\n */\r\nexport class BadRequestError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 400, message, data });\r\n this.name = 'BadRequestError';\r\n }\r\n}\r\n\r\n/**\r\n * 401 Unauthorized error\r\n */\r\nexport class UnauthorizedError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 401, message: message || 'Unauthorized', data });\r\n this.name = 'UnauthorizedError';\r\n }\r\n}\r\n\r\n/**\r\n * 403 Forbidden error\r\n */\r\nexport class ForbiddenError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 403, message: message || 'Forbidden', data });\r\n this.name = 'ForbiddenError';\r\n }\r\n}\r\n\r\n/**\r\n * 404 Not Found error\r\n */\r\nexport class NotFoundError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 404, message: message || 'Not Found', data });\r\n this.name = 'NotFoundError';\r\n }\r\n}\r\n\r\n/**\r\n * 500 Internal Server Error\r\n */\r\nexport class InternalError extends FlightError {\r\n constructor(message?: string, data?: Record<string, unknown>) {\r\n super({ statusCode: 500, message: message || 'Internal Server Error', data });\r\n this.name = 'InternalError';\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Factory Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a FlightError with the specified options.\r\n * \r\n * This is a convenience function - you can also use `new FlightError()` directly\r\n * or just `throw new Error()` - Flight handles all cases.\r\n * \r\n * @example\r\n * ```typescript\r\n * // With full options\r\n * throw createError({\r\n * statusCode: 404,\r\n * message: 'Product not found',\r\n * data: { productId: 'abc123' }\r\n * });\r\n * \r\n * // Simple string shorthand (becomes 500 error)\r\n * throw createError('Something went wrong');\r\n * ```\r\n */\r\nexport function createError(options: FlightErrorOptions | string): FlightError {\r\n if (typeof options === 'string') {\r\n return new FlightError({ statusCode: 500, message: options });\r\n }\r\n return new FlightError(options);\r\n}\r\n\r\n/**\r\n * Create a 404 Not Found error.\r\n * Convenience function equivalent to `createError({ statusCode: 404, ... })`.\r\n * \r\n * @example\r\n * ```typescript\r\n * if (!user) {\r\n * throw notFound('User not found');\r\n * }\r\n * ```\r\n */\r\nexport function notFound(message?: string, data?: Record<string, unknown>): never {\r\n throw new NotFoundError(message, data);\r\n}\r\n\r\n/**\r\n * Create a 403 Forbidden error.\r\n * \r\n * @example\r\n * ```typescript\r\n * if (!user.isAdmin) {\r\n * throw forbidden('Admin access required');\r\n * }\r\n * ```\r\n */\r\nexport function forbidden(message?: string, data?: Record<string, unknown>): never {\r\n throw new ForbiddenError(message, data);\r\n}\r\n\r\n/**\r\n * Create a 401 Unauthorized error.\r\n * \r\n * @example\r\n * ```typescript\r\n * if (!session) {\r\n * throw unauthorized('Please log in to continue');\r\n * }\r\n * ```\r\n */\r\nexport function unauthorized(message?: string, data?: Record<string, unknown>): never {\r\n throw new UnauthorizedError(message, data);\r\n}\r\n\r\n// ============================================================================\r\n// Error State Management (Client-Side)\r\n// ============================================================================\r\n\r\n// Global error state for client-side\r\ndeclare global {\r\n interface Window {\r\n __FLIGHT_ERROR__?: FlightError | null;\r\n }\r\n}\r\n\r\n/**\r\n * Programmatically show an error page.\r\n * \r\n * This triggers the nearest error boundary or navigates to the error page.\r\n * Only works on the client side.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Show error with full options\r\n * showError({\r\n * statusCode: 500,\r\n * message: 'Connection lost'\r\n * });\r\n * \r\n * // Simple string shorthand\r\n * showError('Something went wrong');\r\n * ```\r\n */\r\nexport function showError(error: FlightErrorOptions | FlightError | string): void {\r\n let flightError: FlightError;\r\n\r\n if (typeof error === 'string') {\r\n flightError = new FlightError({ statusCode: 500, message: error });\r\n } else if (error instanceof FlightError) {\r\n flightError = error;\r\n } else {\r\n flightError = new FlightError(error);\r\n }\r\n\r\n // Client-side: dispatch custom event for error boundaries\r\n if (typeof window !== 'undefined') {\r\n window.__FLIGHT_ERROR__ = flightError;\r\n window.dispatchEvent(new CustomEvent('flight:error', {\r\n detail: flightError,\r\n bubbles: true\r\n }));\r\n }\r\n}\r\n\r\n/**\r\n * Clear the current error state and optionally redirect.\r\n * \r\n * Use this to dismiss an error and return to normal state.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Just clear the error\r\n * clearError();\r\n * \r\n * // Clear and redirect to home\r\n * clearError({ redirect: '/' });\r\n * ```\r\n */\r\nexport function clearError(options?: { redirect?: string }): void {\r\n if (typeof window !== 'undefined') {\r\n window.__FLIGHT_ERROR__ = null;\r\n window.dispatchEvent(new CustomEvent('flight:error-clear', { bubbles: true }));\r\n\r\n if (options?.redirect) {\r\n window.location.href = options.redirect;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get the current error from global state.\r\n * Returns null if no error is active.\r\n */\r\nexport function getError(): FlightError | null {\r\n if (typeof window !== 'undefined') {\r\n return window.__FLIGHT_ERROR__ ?? null;\r\n }\r\n return null;\r\n}\r\n\r\n// ============================================================================\r\n// Type Guards\r\n// ============================================================================\r\n\r\n/**\r\n * Check if an error is a FlightError\r\n */\r\nexport function isFlightError(error: unknown): error is FlightError {\r\n return error instanceof FlightError;\r\n}\r\n\r\n/**\r\n * Check if an error is a NotFoundError (404)\r\n */\r\nexport function isNotFoundError(error: unknown): error is NotFoundError {\r\n return error instanceof NotFoundError ||\r\n (isFlightError(error) && error.statusCode === 404);\r\n}\r\n\r\n/**\r\n * Check if an error is a ForbiddenError (403)\r\n */\r\nexport function isForbiddenError(error: unknown): error is ForbiddenError {\r\n return error instanceof ForbiddenError ||\r\n (isFlightError(error) && error.statusCode === 403);\r\n}\r\n\r\n/**\r\n * Check if an error is an UnauthorizedError (401)\r\n */\r\nexport function isUnauthorizedError(error: unknown): error is UnauthorizedError {\r\n return error instanceof UnauthorizedError ||\r\n (isFlightError(error) && error.statusCode === 401);\r\n}\r\n\r\n/**\r\n * Get the status code from any error.\r\n * Returns 500 for non-FlightError errors.\r\n */\r\nexport function getErrorStatusCode(error: unknown): number {\r\n if (isFlightError(error)) {\r\n return error.statusCode;\r\n }\r\n return 500;\r\n}\r\n\r\n// ============================================================================\r\n// Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Create an error Response from a FlightError.\r\n * \r\n * @example\r\n * ```typescript\r\n * try {\r\n * // ... some operation\r\n * } catch (error) {\r\n * return createErrorResponse(error);\r\n * }\r\n * ```\r\n */\r\nexport function createErrorResponse(error: unknown): Response {\r\n const flightError = isFlightError(error)\r\n ? error\r\n : new InternalError(error instanceof Error ? error.message : 'Unknown error');\r\n\r\n return new Response(\r\n JSON.stringify({\r\n error: flightError.statusMessage,\r\n message: flightError.message,\r\n statusCode: flightError.statusCode,\r\n digest: flightError.digest,\r\n ...(isDevelopment() && flightError.data\r\n ? { data: flightError.data }\r\n : {}),\r\n }),\r\n {\r\n status: flightError.statusCode,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n }\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Get default status message for HTTP status code\r\n */\r\nfunction getDefaultStatusMessage(statusCode: number): string {\r\n const messages: Record<number, string> = {\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 405: 'Method Not Allowed',\r\n 408: 'Request Timeout',\r\n 409: 'Conflict',\r\n 410: 'Gone',\r\n 422: 'Unprocessable Entity',\r\n 429: 'Too Many Requests',\r\n 500: 'Internal Server Error',\r\n 501: 'Not Implemented',\r\n 502: 'Bad Gateway',\r\n 503: 'Service Unavailable',\r\n 504: 'Gateway Timeout',\r\n };\r\n return messages[statusCode] || 'Error';\r\n}\r\n\r\n/**\r\n * Generate a short digest for error correlation.\r\n * Used in production to correlate client errors with server logs\r\n * without exposing stack traces.\r\n */\r\nfunction generateDigest(): string {\r\n // Use crypto if available (Node.js, modern browsers)\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID().slice(0, 8);\r\n }\r\n // Fallback for older environments\r\n return Math.random().toString(36).slice(2, 10);\r\n}\r\n\r\n/**\r\n * Wrap an error with a digest if it doesn't have one.\r\n * Useful for adding correlation IDs to third-party errors.\r\n */\r\nexport function wrapWithDigest<T extends Error>(error: T): T & { digest: string } {\r\n const wrapped = error as T & { digest: string };\r\n if (!wrapped.digest) {\r\n wrapped.digest = generateDigest();\r\n }\r\n return wrapped;\r\n}\r\n"]}
|
|
@@ -241,5 +241,5 @@ function sortRoutes(routes) {
|
|
|
241
241
|
}
|
|
242
242
|
|
|
243
243
|
export { createRouter2 as createRouter, filePathToRoutePath, sortRoutes };
|
|
244
|
-
//# sourceMappingURL=chunk-
|
|
245
|
-
//# sourceMappingURL=chunk-
|
|
244
|
+
//# sourceMappingURL=chunk-GCQZ4FHI.js.map
|
|
245
|
+
//# sourceMappingURL=chunk-GCQZ4FHI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/radix3@1.1.2/node_modules/radix3/dist/index.mjs","../src/router/index.ts"],"names":["createRouter"],"mappings":"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","file":"chunk-ARBKF6VI.js","sourcesContent":["const NODE_TYPES = {\n NORMAL: 0,\n WILDCARD: 1,\n PLACEHOLDER: 2\n};\n\nfunction createRouter(options = {}) {\n const ctx = {\n options,\n rootNode: createRadixNode(),\n staticRoutesMap: {}\n };\n const normalizeTrailingSlash = (p) => options.strictTrailingSlash ? p : p.replace(/\\/$/, \"\") || \"/\";\n if (options.routes) {\n for (const path in options.routes) {\n insert(ctx, normalizeTrailingSlash(path), options.routes[path]);\n }\n }\n return {\n ctx,\n lookup: (path) => lookup(ctx, normalizeTrailingSlash(path)),\n insert: (path, data) => insert(ctx, normalizeTrailingSlash(path), data),\n remove: (path) => remove(ctx, normalizeTrailingSlash(path))\n };\n}\nfunction lookup(ctx, path) {\n const staticPathNode = ctx.staticRoutesMap[path];\n if (staticPathNode) {\n return staticPathNode.data;\n }\n const sections = path.split(\"/\");\n const params = {};\n let paramsFound = false;\n let wildcardNode = null;\n let node = ctx.rootNode;\n let wildCardParam = null;\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i];\n if (node.wildcardChildNode !== null) {\n wildcardNode = node.wildcardChildNode;\n wildCardParam = sections.slice(i).join(\"/\");\n }\n const nextNode = node.children.get(section);\n if (nextNode === void 0) {\n if (node && node.placeholderChildren.length > 1) {\n const remaining = sections.length - i;\n node = node.placeholderChildren.find((c) => c.maxDepth === remaining) || null;\n } else {\n node = node.placeholderChildren[0] || null;\n }\n if (!node) {\n break;\n }\n if (node.paramName) {\n params[node.paramName] = section;\n }\n paramsFound = true;\n } else {\n node = nextNode;\n }\n }\n if ((node === null || node.data === null) && wildcardNode !== null) {\n node = wildcardNode;\n params[node.paramName || \"_\"] = wildCardParam;\n paramsFound = true;\n }\n if (!node) {\n return null;\n }\n if (paramsFound) {\n return {\n ...node.data,\n params: paramsFound ? params : void 0\n };\n }\n return node.data;\n}\nfunction insert(ctx, path, data) {\n let isStaticRoute = true;\n const sections = path.split(\"/\");\n let node = ctx.rootNode;\n let _unnamedPlaceholderCtr = 0;\n const matchedNodes = [node];\n for (const section of sections) {\n let childNode;\n if (childNode = node.children.get(section)) {\n node = childNode;\n } else {\n const type = getNodeType(section);\n childNode = createRadixNode({ type, parent: node });\n node.children.set(section, childNode);\n if (type === NODE_TYPES.PLACEHOLDER) {\n childNode.paramName = section === \"*\" ? `_${_unnamedPlaceholderCtr++}` : section.slice(1);\n node.placeholderChildren.push(childNode);\n isStaticRoute = false;\n } else if (type === NODE_TYPES.WILDCARD) {\n node.wildcardChildNode = childNode;\n childNode.paramName = section.slice(\n 3\n /* \"**:\" */\n ) || \"_\";\n isStaticRoute = false;\n }\n matchedNodes.push(childNode);\n node = childNode;\n }\n }\n for (const [depth, node2] of matchedNodes.entries()) {\n node2.maxDepth = Math.max(matchedNodes.length - depth, node2.maxDepth || 0);\n }\n node.data = data;\n if (isStaticRoute === true) {\n ctx.staticRoutesMap[path] = node;\n }\n return node;\n}\nfunction remove(ctx, path) {\n let success = false;\n const sections = path.split(\"/\");\n let node = ctx.rootNode;\n for (const section of sections) {\n node = node.children.get(section);\n if (!node) {\n return success;\n }\n }\n if (node.data) {\n const lastSection = sections.at(-1) || \"\";\n node.data = null;\n if (Object.keys(node.children).length === 0 && node.parent) {\n node.parent.children.delete(lastSection);\n node.parent.wildcardChildNode = null;\n node.parent.placeholderChildren = [];\n }\n success = true;\n }\n return success;\n}\nfunction createRadixNode(options = {}) {\n return {\n type: options.type || NODE_TYPES.NORMAL,\n maxDepth: 0,\n parent: options.parent || null,\n children: /* @__PURE__ */ new Map(),\n data: options.data || null,\n paramName: options.paramName || null,\n wildcardChildNode: null,\n placeholderChildren: []\n };\n}\nfunction getNodeType(str) {\n if (str.startsWith(\"**\")) {\n return NODE_TYPES.WILDCARD;\n }\n if (str[0] === \":\" || str === \"*\") {\n return NODE_TYPES.PLACEHOLDER;\n }\n return NODE_TYPES.NORMAL;\n}\n\nfunction toRouteMatcher(router) {\n const table = _routerNodeToTable(\"\", router.ctx.rootNode);\n return _createMatcher(table, router.ctx.options.strictTrailingSlash);\n}\nfunction _createMatcher(table, strictTrailingSlash) {\n return {\n ctx: { table },\n matchAll: (path) => _matchRoutes(path, table, strictTrailingSlash)\n };\n}\nfunction _createRouteTable() {\n return {\n static: /* @__PURE__ */ new Map(),\n wildcard: /* @__PURE__ */ new Map(),\n dynamic: /* @__PURE__ */ new Map()\n };\n}\nfunction _exportMatcherFromTable(table) {\n const obj = /* @__PURE__ */ Object.create(null);\n for (const property in table) {\n obj[property] = property === \"dynamic\" ? Object.fromEntries(\n [...table[property].entries()].map(([key, value]) => [\n key,\n _exportMatcherFromTable(value)\n ])\n ) : Object.fromEntries(table[property].entries());\n }\n return obj;\n}\nfunction exportMatcher(matcher) {\n return _exportMatcherFromTable(matcher.ctx.table);\n}\nfunction _createTableFromExport(matcherExport) {\n const table = {};\n for (const property in matcherExport) {\n table[property] = property === \"dynamic\" ? new Map(\n Object.entries(matcherExport[property]).map(([key, value]) => [\n key,\n _createTableFromExport(value)\n ])\n ) : new Map(\n Object.entries(matcherExport[property])\n );\n }\n return table;\n}\nfunction createMatcherFromExport(matcherExport) {\n return _createMatcher(_createTableFromExport(matcherExport));\n}\nfunction _matchRoutes(path, table, strictTrailingSlash) {\n if (strictTrailingSlash !== true && path.endsWith(\"/\")) {\n path = path.slice(0, -1) || \"/\";\n }\n const matches = [];\n for (const [key, value] of _sortRoutesMap(table.wildcard)) {\n if (path === key || path.startsWith(key + \"/\")) {\n matches.push(value);\n }\n }\n for (const [key, value] of _sortRoutesMap(table.dynamic)) {\n if (path.startsWith(key + \"/\")) {\n const subPath = \"/\" + path.slice(key.length).split(\"/\").splice(2).join(\"/\");\n matches.push(..._matchRoutes(subPath, value));\n }\n }\n const staticMatch = table.static.get(path);\n if (staticMatch) {\n matches.push(staticMatch);\n }\n return matches.filter(Boolean);\n}\nfunction _sortRoutesMap(m) {\n return [...m.entries()].sort((a, b) => a[0].length - b[0].length);\n}\nfunction _routerNodeToTable(initialPath, initialNode) {\n const table = _createRouteTable();\n function _addNode(path, node) {\n if (path) {\n if (node.type === NODE_TYPES.NORMAL && !(path.includes(\"*\") || path.includes(\":\"))) {\n if (node.data) {\n table.static.set(path, node.data);\n }\n } else if (node.type === NODE_TYPES.WILDCARD) {\n table.wildcard.set(path.replace(\"/**\", \"\"), node.data);\n } else if (node.type === NODE_TYPES.PLACEHOLDER) {\n const subTable = _routerNodeToTable(\"\", node);\n if (node.data) {\n subTable.static.set(\"/\", node.data);\n }\n table.dynamic.set(path.replace(/\\/\\*|\\/:\\w+/, \"\"), subTable);\n return;\n }\n }\n for (const [childPath, child] of node.children.entries()) {\n _addNode(`${path}/${childPath}`.replace(\"//\", \"/\"), child);\n }\n }\n _addNode(initialPath, initialNode);\n return table;\n}\n\nexport { NODE_TYPES, createMatcherFromExport, createRouter, exportMatcher, toRouteMatcher };\n","/**\n * Flight Router - File-based routing with dynamic patterns\n */\n\nimport { createRouter as createRadixRouter, type RadixRouter } from 'radix3';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RouteParams {\n [key: string]: string | string[];\n}\n\nexport interface Route<T = unknown> {\n /** Route path pattern (e.g., '/blog/[slug]', '/api/[...path]') */\n path: string;\n /** Handler or component for this route */\n handler: T;\n /** Rendering mode for this route */\n mode?: 'ssr' | 'ssg' | 'csr' | 'isr';\n /** Metadata for the route */\n meta?: Record<string, unknown>;\n}\n\nexport interface RouteMatch<T = unknown> {\n /** The matched route */\n route: Route<T>;\n /** Extracted parameters from the URL */\n params: RouteParams;\n /** The original path that was matched */\n path: string;\n}\n\nexport interface Router<T = unknown> {\n /** Add a route to the router */\n add(route: Route<T>): void;\n /** Add multiple routes */\n addAll(routes: Route<T>[]): void;\n /** Match a path against registered routes */\n match(path: string): RouteMatch<T> | null;\n /** Get all registered routes */\n routes(): Route<T>[];\n /** Remove a route by path */\n remove(path: string): boolean;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Convert Flight route pattern to radix3 pattern\n * Flight: /blog/[slug] -> radix3: /blog/:slug\n * Flight: /api/[...path] -> radix3: /api/**:path\n */\nfunction convertPattern(pattern: string): string {\n return pattern\n // Convert catch-all [...param] to **:param\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '**:$1')\n // Convert dynamic [param] to :param\n .replace(/\\[(\\w+)\\]/g, ':$1');\n}\n\n/**\n * Create a new Flight router instance\n */\nexport function createRouter<T = unknown>(): Router<T> {\n const radix: RadixRouter<Route<T>> = createRadixRouter();\n const routeMap = new Map<string, Route<T>>();\n\n return {\n add(route: Route<T>): void {\n const radixPath = convertPattern(route.path);\n radix.insert(radixPath, route);\n routeMap.set(route.path, route);\n },\n\n addAll(routes: Route<T>[]): void {\n for (const route of routes) {\n this.add(route);\n }\n },\n\n match(path: string): RouteMatch<T> | null {\n const result = radix.lookup(path);\n\n if (!result) {\n return null;\n }\n\n // Extract params from radix3 result\n const params: RouteParams = {};\n if (result.params) {\n for (const [key, value] of Object.entries(result.params)) {\n if (value !== undefined) {\n params[key] = value as string | string[];\n }\n }\n }\n\n return {\n route: result,\n params,\n path,\n };\n },\n\n routes(): Route<T>[] {\n return Array.from(routeMap.values());\n },\n\n remove(path: string): boolean {\n if (routeMap.has(path)) {\n const radixPath = convertPattern(path);\n radix.remove(radixPath);\n routeMap.delete(path);\n return true;\n }\n return false;\n },\n };\n}\n\n// ============================================================================\n// File System Router Utilities\n// ============================================================================\n\nexport interface FileRoute {\n /** File path relative to routes directory */\n filePath: string;\n /** Generated route path */\n routePath: string;\n}\n\n/**\n * Convert a file path to a route path\n * \n * Examples:\n * - index.tsx -> /\n * - about.tsx -> /about\n * - blog/index.tsx -> /blog\n * - blog/[slug].tsx -> /blog/[slug]\n * - api/[...path].ts -> /api/[...path]\n * - (group)/settings.tsx -> /settings (groups are ignored)\n */\nexport function filePathToRoutePath(filePath: string): string {\n let routePath = filePath\n // Remove file extension\n .replace(/\\.(tsx?|jsx?|vue|svelte|astro)$/, '')\n // Remove index files\n .replace(/\\/index$/, '')\n .replace(/^index$/, '')\n // Remove route groups (parentheses)\n .replace(/\\([^)]+\\)\\//g, '')\n .replace(/\\/\\([^)]+\\)/g, '');\n\n // Ensure path starts with /\n if (!routePath.startsWith('/')) {\n routePath = '/' + routePath;\n }\n\n // Handle root\n if (routePath === '/') {\n return '/';\n }\n\n // Remove trailing slash\n return routePath.replace(/\\/$/, '');\n}\n\n/**\n * Sort routes by specificity (most specific first)\n * Static routes come before dynamic routes\n */\nexport function sortRoutes<T>(routes: Route<T>[]): Route<T>[] {\n return [...routes].sort((a, b) => {\n const aSegments = a.path.split('/');\n const bSegments = b.path.split('/');\n\n // Count dynamic segments\n const aDynamic = aSegments.filter(s => s.startsWith('[') || s.startsWith(':')).length;\n const bDynamic = bSegments.filter(s => s.startsWith('[') || s.startsWith(':')).length;\n\n // More segments = more specific\n if (aSegments.length !== bSegments.length) {\n return bSegments.length - aSegments.length;\n }\n\n // Fewer dynamic segments = more specific\n if (aDynamic !== bDynamic) {\n return aDynamic - bDynamic;\n }\n\n // Catch-all routes are less specific\n const aCatchAll = a.path.includes('[...');\n const bCatchAll = b.path.includes('[...');\n if (aCatchAll !== bCatchAll) {\n return aCatchAll ? 1 : -1;\n }\n\n // Alphabetical for consistency\n return a.path.localeCompare(b.path);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/radix3@1.1.2/node_modules/radix3/dist/index.mjs","../src/router/index.ts"],"names":["createRouter"],"mappings":"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","file":"chunk-GCQZ4FHI.js","sourcesContent":["const NODE_TYPES = {\n NORMAL: 0,\n WILDCARD: 1,\n PLACEHOLDER: 2\n};\n\nfunction createRouter(options = {}) {\n const ctx = {\n options,\n rootNode: createRadixNode(),\n staticRoutesMap: {}\n };\n const normalizeTrailingSlash = (p) => options.strictTrailingSlash ? p : p.replace(/\\/$/, \"\") || \"/\";\n if (options.routes) {\n for (const path in options.routes) {\n insert(ctx, normalizeTrailingSlash(path), options.routes[path]);\n }\n }\n return {\n ctx,\n lookup: (path) => lookup(ctx, normalizeTrailingSlash(path)),\n insert: (path, data) => insert(ctx, normalizeTrailingSlash(path), data),\n remove: (path) => remove(ctx, normalizeTrailingSlash(path))\n };\n}\nfunction lookup(ctx, path) {\n const staticPathNode = ctx.staticRoutesMap[path];\n if (staticPathNode) {\n return staticPathNode.data;\n }\n const sections = path.split(\"/\");\n const params = {};\n let paramsFound = false;\n let wildcardNode = null;\n let node = ctx.rootNode;\n let wildCardParam = null;\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i];\n if (node.wildcardChildNode !== null) {\n wildcardNode = node.wildcardChildNode;\n wildCardParam = sections.slice(i).join(\"/\");\n }\n const nextNode = node.children.get(section);\n if (nextNode === void 0) {\n if (node && node.placeholderChildren.length > 1) {\n const remaining = sections.length - i;\n node = node.placeholderChildren.find((c) => c.maxDepth === remaining) || null;\n } else {\n node = node.placeholderChildren[0] || null;\n }\n if (!node) {\n break;\n }\n if (node.paramName) {\n params[node.paramName] = section;\n }\n paramsFound = true;\n } else {\n node = nextNode;\n }\n }\n if ((node === null || node.data === null) && wildcardNode !== null) {\n node = wildcardNode;\n params[node.paramName || \"_\"] = wildCardParam;\n paramsFound = true;\n }\n if (!node) {\n return null;\n }\n if (paramsFound) {\n return {\n ...node.data,\n params: paramsFound ? params : void 0\n };\n }\n return node.data;\n}\nfunction insert(ctx, path, data) {\n let isStaticRoute = true;\n const sections = path.split(\"/\");\n let node = ctx.rootNode;\n let _unnamedPlaceholderCtr = 0;\n const matchedNodes = [node];\n for (const section of sections) {\n let childNode;\n if (childNode = node.children.get(section)) {\n node = childNode;\n } else {\n const type = getNodeType(section);\n childNode = createRadixNode({ type, parent: node });\n node.children.set(section, childNode);\n if (type === NODE_TYPES.PLACEHOLDER) {\n childNode.paramName = section === \"*\" ? `_${_unnamedPlaceholderCtr++}` : section.slice(1);\n node.placeholderChildren.push(childNode);\n isStaticRoute = false;\n } else if (type === NODE_TYPES.WILDCARD) {\n node.wildcardChildNode = childNode;\n childNode.paramName = section.slice(\n 3\n /* \"**:\" */\n ) || \"_\";\n isStaticRoute = false;\n }\n matchedNodes.push(childNode);\n node = childNode;\n }\n }\n for (const [depth, node2] of matchedNodes.entries()) {\n node2.maxDepth = Math.max(matchedNodes.length - depth, node2.maxDepth || 0);\n }\n node.data = data;\n if (isStaticRoute === true) {\n ctx.staticRoutesMap[path] = node;\n }\n return node;\n}\nfunction remove(ctx, path) {\n let success = false;\n const sections = path.split(\"/\");\n let node = ctx.rootNode;\n for (const section of sections) {\n node = node.children.get(section);\n if (!node) {\n return success;\n }\n }\n if (node.data) {\n const lastSection = sections.at(-1) || \"\";\n node.data = null;\n if (Object.keys(node.children).length === 0 && node.parent) {\n node.parent.children.delete(lastSection);\n node.parent.wildcardChildNode = null;\n node.parent.placeholderChildren = [];\n }\n success = true;\n }\n return success;\n}\nfunction createRadixNode(options = {}) {\n return {\n type: options.type || NODE_TYPES.NORMAL,\n maxDepth: 0,\n parent: options.parent || null,\n children: /* @__PURE__ */ new Map(),\n data: options.data || null,\n paramName: options.paramName || null,\n wildcardChildNode: null,\n placeholderChildren: []\n };\n}\nfunction getNodeType(str) {\n if (str.startsWith(\"**\")) {\n return NODE_TYPES.WILDCARD;\n }\n if (str[0] === \":\" || str === \"*\") {\n return NODE_TYPES.PLACEHOLDER;\n }\n return NODE_TYPES.NORMAL;\n}\n\nfunction toRouteMatcher(router) {\n const table = _routerNodeToTable(\"\", router.ctx.rootNode);\n return _createMatcher(table, router.ctx.options.strictTrailingSlash);\n}\nfunction _createMatcher(table, strictTrailingSlash) {\n return {\n ctx: { table },\n matchAll: (path) => _matchRoutes(path, table, strictTrailingSlash)\n };\n}\nfunction _createRouteTable() {\n return {\n static: /* @__PURE__ */ new Map(),\n wildcard: /* @__PURE__ */ new Map(),\n dynamic: /* @__PURE__ */ new Map()\n };\n}\nfunction _exportMatcherFromTable(table) {\n const obj = /* @__PURE__ */ Object.create(null);\n for (const property in table) {\n obj[property] = property === \"dynamic\" ? Object.fromEntries(\n [...table[property].entries()].map(([key, value]) => [\n key,\n _exportMatcherFromTable(value)\n ])\n ) : Object.fromEntries(table[property].entries());\n }\n return obj;\n}\nfunction exportMatcher(matcher) {\n return _exportMatcherFromTable(matcher.ctx.table);\n}\nfunction _createTableFromExport(matcherExport) {\n const table = {};\n for (const property in matcherExport) {\n table[property] = property === \"dynamic\" ? new Map(\n Object.entries(matcherExport[property]).map(([key, value]) => [\n key,\n _createTableFromExport(value)\n ])\n ) : new Map(\n Object.entries(matcherExport[property])\n );\n }\n return table;\n}\nfunction createMatcherFromExport(matcherExport) {\n return _createMatcher(_createTableFromExport(matcherExport));\n}\nfunction _matchRoutes(path, table, strictTrailingSlash) {\n if (strictTrailingSlash !== true && path.endsWith(\"/\")) {\n path = path.slice(0, -1) || \"/\";\n }\n const matches = [];\n for (const [key, value] of _sortRoutesMap(table.wildcard)) {\n if (path === key || path.startsWith(key + \"/\")) {\n matches.push(value);\n }\n }\n for (const [key, value] of _sortRoutesMap(table.dynamic)) {\n if (path.startsWith(key + \"/\")) {\n const subPath = \"/\" + path.slice(key.length).split(\"/\").splice(2).join(\"/\");\n matches.push(..._matchRoutes(subPath, value));\n }\n }\n const staticMatch = table.static.get(path);\n if (staticMatch) {\n matches.push(staticMatch);\n }\n return matches.filter(Boolean);\n}\nfunction _sortRoutesMap(m) {\n return [...m.entries()].sort((a, b) => a[0].length - b[0].length);\n}\nfunction _routerNodeToTable(initialPath, initialNode) {\n const table = _createRouteTable();\n function _addNode(path, node) {\n if (path) {\n if (node.type === NODE_TYPES.NORMAL && !(path.includes(\"*\") || path.includes(\":\"))) {\n if (node.data) {\n table.static.set(path, node.data);\n }\n } else if (node.type === NODE_TYPES.WILDCARD) {\n table.wildcard.set(path.replace(\"/**\", \"\"), node.data);\n } else if (node.type === NODE_TYPES.PLACEHOLDER) {\n const subTable = _routerNodeToTable(\"\", node);\n if (node.data) {\n subTable.static.set(\"/\", node.data);\n }\n table.dynamic.set(path.replace(/\\/\\*|\\/:\\w+/, \"\"), subTable);\n return;\n }\n }\n for (const [childPath, child] of node.children.entries()) {\n _addNode(`${path}/${childPath}`.replace(\"//\", \"/\"), child);\n }\n }\n _addNode(initialPath, initialNode);\n return table;\n}\n\nexport { NODE_TYPES, createMatcherFromExport, createRouter, exportMatcher, toRouteMatcher };\n","/**\r\n * Flight Router - File-based routing with dynamic patterns\r\n */\r\n\r\nimport { createRouter as createRadixRouter, type RadixRouter } from 'radix3';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface RouteParams {\r\n [key: string]: string | string[];\r\n}\r\n\r\nexport interface Route<T = unknown> {\r\n /** Route path pattern (e.g., '/blog/[slug]', '/api/[...path]') */\r\n path: string;\r\n /** Handler or component for this route */\r\n handler: T;\r\n /** Rendering mode for this route */\r\n mode?: 'ssr' | 'ssg' | 'csr' | 'isr';\r\n /** Metadata for the route */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\nexport interface RouteMatch<T = unknown> {\r\n /** The matched route */\r\n route: Route<T>;\r\n /** Extracted parameters from the URL */\r\n params: RouteParams;\r\n /** The original path that was matched */\r\n path: string;\r\n}\r\n\r\nexport interface Router<T = unknown> {\r\n /** Add a route to the router */\r\n add(route: Route<T>): void;\r\n /** Add multiple routes */\r\n addAll(routes: Route<T>[]): void;\r\n /** Match a path against registered routes */\r\n match(path: string): RouteMatch<T> | null;\r\n /** Get all registered routes */\r\n routes(): Route<T>[];\r\n /** Remove a route by path */\r\n remove(path: string): boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Convert Flight route pattern to radix3 pattern\r\n * Flight: /blog/[slug] -> radix3: /blog/:slug\r\n * Flight: /api/[...path] -> radix3: /api/**:path\r\n */\r\nfunction convertPattern(pattern: string): string {\r\n return pattern\r\n // Convert catch-all [...param] to **:param\r\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '**:$1')\r\n // Convert dynamic [param] to :param\r\n .replace(/\\[(\\w+)\\]/g, ':$1');\r\n}\r\n\r\n/**\r\n * Create a new Flight router instance\r\n */\r\nexport function createRouter<T = unknown>(): Router<T> {\r\n const radix: RadixRouter<Route<T>> = createRadixRouter();\r\n const routeMap = new Map<string, Route<T>>();\r\n\r\n return {\r\n add(route: Route<T>): void {\r\n const radixPath = convertPattern(route.path);\r\n radix.insert(radixPath, route);\r\n routeMap.set(route.path, route);\r\n },\r\n\r\n addAll(routes: Route<T>[]): void {\r\n for (const route of routes) {\r\n this.add(route);\r\n }\r\n },\r\n\r\n match(path: string): RouteMatch<T> | null {\r\n const result = radix.lookup(path);\r\n\r\n if (!result) {\r\n return null;\r\n }\r\n\r\n // Extract params from radix3 result\r\n const params: RouteParams = {};\r\n if (result.params) {\r\n for (const [key, value] of Object.entries(result.params)) {\r\n if (value !== undefined) {\r\n params[key] = value as string | string[];\r\n }\r\n }\r\n }\r\n\r\n return {\r\n route: result,\r\n params,\r\n path,\r\n };\r\n },\r\n\r\n routes(): Route<T>[] {\r\n return Array.from(routeMap.values());\r\n },\r\n\r\n remove(path: string): boolean {\r\n if (routeMap.has(path)) {\r\n const radixPath = convertPattern(path);\r\n radix.remove(radixPath);\r\n routeMap.delete(path);\r\n return true;\r\n }\r\n return false;\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// File System Router Utilities\r\n// ============================================================================\r\n\r\nexport interface FileRoute {\r\n /** File path relative to routes directory */\r\n filePath: string;\r\n /** Generated route path */\r\n routePath: string;\r\n}\r\n\r\n/**\r\n * Convert a file path to a route path\r\n * \r\n * Examples:\r\n * - index.tsx -> /\r\n * - about.tsx -> /about\r\n * - blog/index.tsx -> /blog\r\n * - blog/[slug].tsx -> /blog/[slug]\r\n * - api/[...path].ts -> /api/[...path]\r\n * - (group)/settings.tsx -> /settings (groups are ignored)\r\n */\r\nexport function filePathToRoutePath(filePath: string): string {\r\n let routePath = filePath\r\n // Remove file extension\r\n .replace(/\\.(tsx?|jsx?|vue|svelte|astro)$/, '')\r\n // Remove index files\r\n .replace(/\\/index$/, '')\r\n .replace(/^index$/, '')\r\n // Remove route groups (parentheses)\r\n .replace(/\\([^)]+\\)\\//g, '')\r\n .replace(/\\/\\([^)]+\\)/g, '');\r\n\r\n // Ensure path starts with /\r\n if (!routePath.startsWith('/')) {\r\n routePath = '/' + routePath;\r\n }\r\n\r\n // Handle root\r\n if (routePath === '/') {\r\n return '/';\r\n }\r\n\r\n // Remove trailing slash\r\n return routePath.replace(/\\/$/, '');\r\n}\r\n\r\n/**\r\n * Sort routes by specificity (most specific first)\r\n * Static routes come before dynamic routes\r\n */\r\nexport function sortRoutes<T>(routes: Route<T>[]): Route<T>[] {\r\n return [...routes].sort((a, b) => {\r\n const aSegments = a.path.split('/');\r\n const bSegments = b.path.split('/');\r\n\r\n // Count dynamic segments\r\n const aDynamic = aSegments.filter(s => s.startsWith('[') || s.startsWith(':')).length;\r\n const bDynamic = bSegments.filter(s => s.startsWith('[') || s.startsWith(':')).length;\r\n\r\n // More segments = more specific\r\n if (aSegments.length !== bSegments.length) {\r\n return bSegments.length - aSegments.length;\r\n }\r\n\r\n // Fewer dynamic segments = more specific\r\n if (aDynamic !== bDynamic) {\r\n return aDynamic - bDynamic;\r\n }\r\n\r\n // Catch-all routes are less specific\r\n const aCatchAll = a.path.includes('[...');\r\n const bCatchAll = b.path.includes('[...');\r\n if (aCatchAll !== bCatchAll) {\r\n return aCatchAll ? 1 : -1;\r\n }\r\n\r\n // Alphabetical for consistency\r\n return a.path.localeCompare(b.path);\r\n });\r\n}\r\n"]}
|
|
@@ -92,5 +92,5 @@ async function loadConfig(root = process.cwd()) {
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
export { defineConfig, findConfigFile, loadConfig, resolveConfig };
|
|
95
|
-
//# sourceMappingURL=chunk-
|
|
96
|
-
//# sourceMappingURL=chunk-
|
|
95
|
+
//# sourceMappingURL=chunk-IXMD5QH2.js.map
|
|
96
|
+
//# sourceMappingURL=chunk-IXMD5QH2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/index.ts"],"names":[],"mappings":"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","file":"chunk-IXMD5QH2.js","sourcesContent":["/**\r\n * Flight Configuration - User configuration system\r\n */\r\n\r\nimport type { RenderMode } from '../render/index.js';\r\nimport type { FlightAdapter } from '../adapters/index.js';\r\n\r\n// ============================================================================\r\n// Bundler Types (from @flight-framework/bundler)\r\n// ============================================================================\r\n\r\n/**\r\n * Bundler adapter interface.\r\n * Import the full type from @flight-framework/bundler for implementation.\r\n */\r\nexport interface BundlerAdapter {\r\n /** Adapter identifier */\r\n name: string;\r\n /** Bundler name (vite, esbuild, rolldown, etc.) */\r\n bundler: string;\r\n /** Bundler-specific options */\r\n options?: Record<string, unknown>;\r\n /** Create dev server */\r\n createDevServer(config: FlightConfig): Promise<unknown>;\r\n /** Build for production */\r\n build(config: FlightConfig): Promise<unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** UI Framework configuration */\r\nexport interface UIConfig {\r\n /** The UI framework to use */\r\n framework?: 'react' | 'vue' | 'svelte' | 'solid' | 'preact' | 'vanilla' | string;\r\n /** Framework-specific options */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/** Rendering configuration */\r\nexport interface RenderConfig {\r\n /** Default render mode */\r\n default?: RenderMode;\r\n /** Per-route render mode overrides */\r\n routes?: Record<string, RenderMode>;\r\n}\r\n\r\n/** Development server options */\r\nexport interface DevConfig {\r\n /** Port to run dev server on */\r\n port?: number;\r\n /** Host to bind to */\r\n host?: string | boolean;\r\n /** Open browser on start */\r\n open?: boolean;\r\n /** HTTPS configuration */\r\n https?: boolean | {\r\n key?: string;\r\n cert?: string;\r\n };\r\n /** Proxy configuration */\r\n proxy?: Record<string, string | {\r\n target: string;\r\n changeOrigin?: boolean;\r\n rewrite?: (path: string) => string;\r\n }>;\r\n}\r\n\r\n/** Build configuration */\r\nexport interface BuildConfig {\r\n /** Output directory */\r\n outDir?: string;\r\n /** Source directory */\r\n srcDir?: string;\r\n /** Public assets directory */\r\n publicDir?: string;\r\n /** Routes directory */\r\n routesDir?: string;\r\n /** Generate sourcemaps */\r\n sourcemap?: boolean | 'inline' | 'hidden';\r\n /** Minify output */\r\n minify?: boolean | 'terser' | 'esbuild';\r\n /** Target environments */\r\n target?: string | string[];\r\n}\r\n\r\n/** Full Flight configuration (resolved) */\r\nexport interface FlightConfig {\r\n /** Root directory */\r\n root: string;\r\n /** Deployment adapter */\r\n adapter: FlightAdapter | null;\r\n /** Bundler adapter (Vite, esbuild, Rolldown, etc.) */\r\n bundler: BundlerAdapter | null;\r\n /** UI framework configuration */\r\n ui: UIConfig;\r\n /** Rendering configuration */\r\n rendering: RenderConfig;\r\n /** Development server options */\r\n dev: Required<DevConfig>;\r\n /** Build configuration */\r\n build: Required<BuildConfig>;\r\n /** Bundler-specific configuration (passed to adapter) */\r\n bundlerOptions?: Record<string, unknown>;\r\n /** @deprecated Use bundler adapter instead */\r\n vite?: Record<string, unknown>;\r\n /** Plugin configurations */\r\n plugins: FlightPlugin[];\r\n}\r\n\r\n/** Flight plugin interface */\r\nexport interface FlightPlugin {\r\n /** Plugin name */\r\n name: string;\r\n /** Hook into config resolution */\r\n config?: (config: FlightConfig) => FlightConfig | void | Promise<FlightConfig | void>;\r\n /** Hook into build start */\r\n buildStart?: () => void | Promise<void>;\r\n /** Hook into build end */\r\n buildEnd?: () => void | Promise<void>;\r\n /** Hook into dev server start */\r\n devStart?: () => void | Promise<void>;\r\n}\r\n\r\n/** User-provided configuration (partial) */\r\nexport interface FlightUserConfig {\r\n /** Root directory (defaults to process.cwd()) */\r\n root?: string;\r\n /** Deployment adapter */\r\n adapter?: FlightAdapter;\r\n /** Bundler adapter (Vite, esbuild, Rolldown, etc.) */\r\n bundler?: BundlerAdapter;\r\n /** UI framework configuration */\r\n ui?: UIConfig;\r\n /** Rendering configuration */\r\n rendering?: RenderConfig;\r\n /** Development server options */\r\n dev?: DevConfig;\r\n /** Build configuration */\r\n build?: BuildConfig;\r\n /** Bundler-specific configuration */\r\n bundlerOptions?: Record<string, unknown>;\r\n /** @deprecated Use bundler adapter instead */\r\n vite?: Record<string, unknown>;\r\n /** Plugins */\r\n plugins?: FlightPlugin[];\r\n}\r\n\r\n// ============================================================================\r\n// Configuration Factory\r\n// ============================================================================\r\n\r\n/** Default configuration values */\r\nconst DEFAULT_CONFIG: Omit<FlightConfig, 'root'> = {\r\n adapter: null,\r\n bundler: null,\r\n ui: {\r\n framework: 'vanilla',\r\n },\r\n rendering: {\r\n default: 'ssr',\r\n routes: {},\r\n },\r\n dev: {\r\n port: 5173,\r\n host: 'localhost',\r\n open: false,\r\n https: false,\r\n proxy: {},\r\n },\r\n build: {\r\n outDir: 'dist',\r\n srcDir: 'src',\r\n publicDir: 'public',\r\n routesDir: 'src/routes',\r\n sourcemap: false,\r\n minify: true,\r\n target: 'es2022',\r\n },\r\n plugins: [],\r\n};\r\n\r\n/**\r\n * Define Flight configuration\r\n * \r\n * @example\r\n * ```typescript\r\n * // flight.config.ts\r\n * import { defineConfig } from '@flight-framework/core';\r\n * import node from '@flight-framework/adapter-node';\r\n * \r\n * export default defineConfig({\r\n * adapter: node(),\r\n * ui: { framework: 'react' },\r\n * rendering: {\r\n * default: 'ssr',\r\n * routes: {\r\n * '/blog/*': 'ssg',\r\n * '/app/*': 'csr',\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport function defineConfig(config: FlightUserConfig): FlightUserConfig {\r\n return config;\r\n}\r\n\r\n/**\r\n * Resolve user config to full config with defaults\r\n */\r\nexport function resolveConfig(userConfig: FlightUserConfig = {}): FlightConfig {\r\n return {\r\n root: userConfig.root ?? process.cwd(),\r\n adapter: userConfig.adapter ?? DEFAULT_CONFIG.adapter,\r\n bundler: userConfig.bundler ?? DEFAULT_CONFIG.bundler,\r\n ui: {\r\n ...DEFAULT_CONFIG.ui,\r\n ...userConfig.ui,\r\n },\r\n rendering: {\r\n ...DEFAULT_CONFIG.rendering,\r\n ...userConfig.rendering,\r\n },\r\n dev: {\r\n ...DEFAULT_CONFIG.dev,\r\n ...userConfig.dev,\r\n } as Required<DevConfig>,\r\n build: {\r\n ...DEFAULT_CONFIG.build,\r\n ...userConfig.build,\r\n } as Required<BuildConfig>,\r\n bundlerOptions: userConfig.bundlerOptions,\r\n vite: userConfig.vite,\r\n plugins: userConfig.plugins ?? [],\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Config Loading\r\n// ============================================================================\r\n\r\nconst CONFIG_FILES = [\r\n 'flight.config.ts',\r\n 'flight.config.js',\r\n 'flight.config.mjs',\r\n 'flight.config.mts',\r\n];\r\n\r\n/**\r\n * Find the config file in a directory\r\n */\r\nexport async function findConfigFile(root: string): Promise<string | null> {\r\n // Dynamic import for Node.js fs\r\n const { existsSync } = await import('node:fs');\r\n const { join } = await import('node:path');\r\n\r\n for (const file of CONFIG_FILES) {\r\n const path = join(root, file);\r\n if (existsSync(path)) {\r\n return path;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Load configuration from file\r\n */\r\nexport async function loadConfig(root: string = process.cwd()): Promise<FlightConfig> {\r\n const configFile = await findConfigFile(root);\r\n\r\n if (!configFile) {\r\n return resolveConfig({ root });\r\n }\r\n\r\n try {\r\n // Use dynamic import for the config file\r\n // On Windows, we need to convert the path to a file:// URL\r\n const { pathToFileURL } = await import('node:url');\r\n const configUrl = pathToFileURL(configFile).href;\r\n const module = await import(configUrl);\r\n const userConfig = module.default as FlightUserConfig;\r\n\r\n return resolveConfig({\r\n ...userConfig,\r\n root,\r\n });\r\n } catch (error) {\r\n console.error(`Failed to load config from ${configFile}:`, error);\r\n return resolveConfig({ root });\r\n }\r\n}\r\n"]}
|
|
@@ -253,5 +253,5 @@ var FlightPayloadError = class extends Error {
|
|
|
253
253
|
};
|
|
254
254
|
|
|
255
255
|
export { FlightPayloadError, FlightSerializationError, clientRef, createActionChunk, createClientChunk, createErrorChunk, createHintChunk, createServerChunk, deserialize, fragment, generateChunkId, h, isFlightElement, resetChunkIdCounter, serialize, suspense, text, toFlightElement };
|
|
256
|
-
//# sourceMappingURL=chunk-
|
|
257
|
-
//# sourceMappingURL=chunk-
|
|
256
|
+
//# sourceMappingURL=chunk-K2CQZPCG.js.map
|
|
257
|
+
//# sourceMappingURL=chunk-K2CQZPCG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rsc/payload.ts"],"names":[],"mappings":"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","file":"chunk-K2CQZPCG.js","sourcesContent":["/**\r\n * @flight-framework/core - Flight Payload System\r\n * \r\n * Formato de serialización agnóstico para Server Components.\r\n * Diseñado para máxima debuggabilidad y compatibilidad multi-framework.\r\n * \r\n * Filosofía Flight:\r\n * - Formato documentado y abierto (NDJSON)\r\n * - No depende de internals de React\r\n * - Extensible para cualquier UI framework\r\n * - Zero vendor lock-in\r\n * \r\n * @module @flight-framework/core/rsc/payload\r\n */\r\n\r\n// ============================================================================\r\n// Chunk Types - El corazón del streaming protocol\r\n// ============================================================================\r\n\r\n/**\r\n * Union type de todos los chunks que pueden enviarse en un FlightStream\r\n */\r\nexport type FlightChunk =\r\n | ServerComponentChunk\r\n | ClientReferenceChunk\r\n | ServerReferenceChunk\r\n | ErrorBoundaryChunk\r\n | HintChunk\r\n | MetaChunk;\r\n\r\n/**\r\n * Chunk de Server Component renderizado\r\n * Contiene el árbol virtual de elementos\r\n */\r\nexport interface ServerComponentChunk {\r\n /** Discriminator */\r\n readonly type: 'S';\r\n /** Unique chunk ID */\r\n readonly id: string;\r\n /** Virtual element tree */\r\n readonly tree: FlightElement;\r\n /** IDs de chunks que este depende (para streaming ordenado) */\r\n readonly awaiting?: readonly string[];\r\n /** Timestamp para debugging/observability */\r\n readonly ts?: number;\r\n}\r\n\r\n/**\r\n * Referencia a un Client Component\r\n * El cliente cargará el módulo y lo hidratará\r\n */\r\nexport interface ClientReferenceChunk {\r\n /** Discriminator */\r\n readonly type: 'C';\r\n /** Reference ID */\r\n readonly id: string;\r\n /** Module specifier (relativo al manifest) */\r\n readonly module: string;\r\n /** Export name */\r\n readonly export: string;\r\n /** Serialized props */\r\n readonly props: SerializedValue;\r\n /** Fallback HTML para SSR (opcional) */\r\n readonly fallback?: string;\r\n}\r\n\r\n/**\r\n * Referencia a una Server Function (Action)\r\n * El cliente la invocará via RPC\r\n */\r\nexport interface ServerReferenceChunk {\r\n /** Discriminator */\r\n readonly type: 'A';\r\n /** Action ID */\r\n readonly id: string;\r\n /** Bound arguments (pre-bound via .bind()) */\r\n readonly bound?: readonly SerializedValue[];\r\n}\r\n\r\n/**\r\n * Error en un boundary específico\r\n */\r\nexport interface ErrorBoundaryChunk {\r\n /** Discriminator */\r\n readonly type: 'E';\r\n /** Boundary ID where error occurred */\r\n readonly boundary: string;\r\n /** Safe error message for client */\r\n readonly message: string;\r\n /** Error digest for server-side correlation */\r\n readonly digest: string;\r\n /** Component stack for development */\r\n readonly stack?: string;\r\n}\r\n\r\n/**\r\n * Hints para el cliente (preload, prefetch, etc.)\r\n */\r\nexport interface HintChunk {\r\n /** Discriminator */\r\n readonly type: 'H';\r\n /** Hint type */\r\n readonly hint: 'preload' | 'prefetch' | 'dns-prefetch' | 'preconnect' | 'modulepreload';\r\n /** Resource URL */\r\n readonly href: string;\r\n /** Resource type (for preload) */\r\n readonly as?: 'script' | 'style' | 'image' | 'font' | 'fetch';\r\n /** Crossorigin attribute */\r\n readonly crossorigin?: 'anonymous' | 'use-credentials';\r\n}\r\n\r\n/**\r\n * Metadata chunk (para SSR head injection)\r\n */\r\nexport interface MetaChunk {\r\n /** Discriminator */\r\n readonly type: 'M';\r\n /** Meta type */\r\n readonly meta: 'title' | 'description' | 'og' | 'twitter' | 'link' | 'script';\r\n /** Content */\r\n readonly content: string | Record<string, string>;\r\n}\r\n\r\n// ============================================================================\r\n// Flight Element - Virtual DOM agnóstico\r\n// ============================================================================\r\n\r\n/**\r\n * Virtual element que puede representar cualquier UI framework\r\n */\r\nexport type FlightElement =\r\n | FlightHostElement\r\n | FlightTextElement\r\n | FlightFragmentElement\r\n | FlightSuspenseElement\r\n | FlightClientElement\r\n | FlightLazyElement\r\n | FlightNullElement;\r\n\r\n/**\r\n * Host element (div, span, etc.)\r\n */\r\nexport interface FlightHostElement {\r\n readonly $$type: 'host';\r\n readonly tag: string;\r\n readonly key?: string | number;\r\n readonly props: Readonly<Record<string, SerializedValue>>;\r\n readonly children: readonly FlightElement[];\r\n}\r\n\r\n/**\r\n * Text node\r\n */\r\nexport interface FlightTextElement {\r\n readonly $$type: 'text';\r\n readonly value: string;\r\n}\r\n\r\n/**\r\n * Fragment (multiple children, no wrapper)\r\n */\r\nexport interface FlightFragmentElement {\r\n readonly $$type: 'fragment';\r\n readonly children: readonly FlightElement[];\r\n}\r\n\r\n/**\r\n * Suspense boundary\r\n */\r\nexport interface FlightSuspenseElement {\r\n readonly $$type: 'suspense';\r\n readonly id: string;\r\n readonly fallback: FlightElement;\r\n readonly children: readonly FlightElement[];\r\n}\r\n\r\n/**\r\n * Client component reference\r\n */\r\nexport interface FlightClientElement {\r\n readonly $$type: 'client';\r\n /** Reference to ClientReferenceChunk ID */\r\n readonly ref: string;\r\n /** Pre-rendered fallback HTML */\r\n readonly ssr?: string;\r\n}\r\n\r\n/**\r\n * Lazy/async element (pending resolution)\r\n */\r\nexport interface FlightLazyElement {\r\n readonly $$type: 'lazy';\r\n readonly id: string;\r\n readonly fallback?: FlightElement;\r\n}\r\n\r\n/**\r\n * Null/empty element\r\n */\r\nexport interface FlightNullElement {\r\n readonly $$type: 'null';\r\n}\r\n\r\n// ============================================================================\r\n// Serializable Values\r\n// ============================================================================\r\n\r\n/**\r\n * Valores que pueden cruzar el boundary server/client\r\n */\r\nexport type SerializedValue =\r\n | string\r\n | number\r\n | boolean\r\n | null\r\n | undefined\r\n | readonly SerializedValue[]\r\n | { readonly [key: string]: SerializedValue }\r\n | SerializedSpecialValue;\r\n\r\n/**\r\n * Tipos especiales que requieren serialización custom\r\n */\r\nexport interface SerializedSpecialValue {\r\n readonly $$flight: SpecialValueType;\r\n readonly value: string | readonly unknown[];\r\n}\r\n\r\nexport type SpecialValueType =\r\n | 'date'\r\n | 'bigint'\r\n | 'map'\r\n | 'set'\r\n | 'undefined'\r\n | 'symbol'\r\n | 'regexp'\r\n | 'url'\r\n | 'error'\r\n | 'formdata'\r\n | 'blob'\r\n | 'arraybuffer';\r\n\r\n// ============================================================================\r\n// Serialization Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Serializa un valor para transmisión a través de FlightStream\r\n */\r\nexport function serialize(value: unknown): SerializedValue {\r\n return serializeValue(value, new WeakSet());\r\n}\r\n\r\nfunction serializeValue(value: unknown, seen: WeakSet<object>): SerializedValue {\r\n // Primitives\r\n if (value === null) return null;\r\n if (value === undefined) return { $$flight: 'undefined', value: '' };\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number') {\r\n if (Number.isNaN(value)) return { $$flight: 'undefined', value: 'NaN' };\r\n if (!Number.isFinite(value)) return { $$flight: 'undefined', value: value > 0 ? 'Infinity' : '-Infinity' };\r\n return value;\r\n }\r\n if (typeof value === 'boolean') return value;\r\n if (typeof value === 'bigint') return { $$flight: 'bigint', value: value.toString() };\r\n if (typeof value === 'symbol') return { $$flight: 'symbol', value: value.description ?? '' };\r\n\r\n // Functions cannot be serialized\r\n if (typeof value === 'function') {\r\n throw new FlightSerializationError(\r\n 'Functions cannot be passed from Server to Client Components. ' +\r\n 'If you need to pass a function, use a Server Action instead.'\r\n );\r\n }\r\n\r\n // Circular reference detection\r\n if (typeof value === 'object') {\r\n if (seen.has(value)) {\r\n throw new FlightSerializationError('Circular references are not supported in Flight payloads.');\r\n }\r\n seen.add(value);\r\n }\r\n\r\n // Special objects\r\n if (value instanceof Date) {\r\n return { $$flight: 'date', value: value.toISOString() };\r\n }\r\n if (value instanceof RegExp) {\r\n return { $$flight: 'regexp', value: value.toString() };\r\n }\r\n if (value instanceof URL) {\r\n return { $$flight: 'url', value: value.href };\r\n }\r\n if (value instanceof Map) {\r\n const entries: [SerializedValue, SerializedValue][] = [];\r\n for (const [k, v] of value) {\r\n entries.push([serializeValue(k, seen), serializeValue(v, seen)]);\r\n }\r\n return { $$flight: 'map', value: entries as unknown as string };\r\n }\r\n if (value instanceof Set) {\r\n const items: SerializedValue[] = [];\r\n for (const v of value) {\r\n items.push(serializeValue(v, seen));\r\n }\r\n return { $$flight: 'set', value: items as unknown as string };\r\n }\r\n if (value instanceof Error) {\r\n return {\r\n $$flight: 'error',\r\n value: JSON.stringify({ name: value.name, message: value.message })\r\n };\r\n }\r\n\r\n // Arrays\r\n if (Array.isArray(value)) {\r\n return value.map(v => serializeValue(v, seen));\r\n }\r\n\r\n // Plain objects\r\n if (isPlainObject(value)) {\r\n const result: Record<string, SerializedValue> = {};\r\n for (const [k, v] of Object.entries(value)) {\r\n result[k] = serializeValue(v, seen);\r\n }\r\n return result;\r\n }\r\n\r\n // Unknown object type - try JSON serialization\r\n try {\r\n return JSON.parse(JSON.stringify(value)) as SerializedValue;\r\n } catch {\r\n throw new FlightSerializationError(\r\n `Cannot serialize value of type ${value?.constructor?.name ?? typeof value}. ` +\r\n 'Only serializable values can be passed to Client Components.'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Deserializa un valor recibido de FlightStream\r\n */\r\nexport function deserialize<T = unknown>(value: SerializedValue): T {\r\n return deserializeValue(value) as T;\r\n}\r\n\r\nfunction deserializeValue(value: SerializedValue): unknown {\r\n if (value === null || value === undefined) return value;\r\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\r\n return value;\r\n }\r\n\r\n // Special values\r\n if (isSpecialValue(value)) {\r\n switch (value.$$flight) {\r\n case 'undefined':\r\n if (value.value === 'NaN') return NaN;\r\n if (value.value === 'Infinity') return Infinity;\r\n if (value.value === '-Infinity') return -Infinity;\r\n return undefined;\r\n case 'date':\r\n return new Date(value.value as string);\r\n case 'bigint':\r\n return BigInt(value.value as string);\r\n case 'symbol':\r\n return Symbol(value.value as string);\r\n case 'regexp': {\r\n const match = (value.value as string).match(/^\\/(.*)\\/([gimsuy]*)$/);\r\n if (match) return new RegExp(match[1]!, match[2]);\r\n return new RegExp(value.value as string);\r\n }\r\n case 'url':\r\n return new URL(value.value as string);\r\n case 'map':\r\n return new Map((value.value as unknown as [SerializedValue, SerializedValue][])\r\n .map(([k, v]) => [deserializeValue(k), deserializeValue(v)]));\r\n case 'set':\r\n return new Set((value.value as unknown as SerializedValue[])\r\n .map(v => deserializeValue(v)));\r\n case 'error': {\r\n const { name, message } = JSON.parse(value.value as string);\r\n const error = new Error(message);\r\n error.name = name;\r\n return error;\r\n }\r\n }\r\n }\r\n\r\n // Arrays\r\n if (Array.isArray(value)) {\r\n return value.map(deserializeValue);\r\n }\r\n\r\n // Objects\r\n if (typeof value === 'object') {\r\n const result: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(value)) {\r\n result[k] = deserializeValue(v);\r\n }\r\n return result;\r\n }\r\n\r\n return value;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (typeof value !== 'object' || value === null) return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === null || proto === Object.prototype;\r\n}\r\n\r\nfunction isSpecialValue(value: unknown): value is SerializedSpecialValue {\r\n return typeof value === 'object' && value !== null && '$$flight' in value;\r\n}\r\n\r\n// ============================================================================\r\n// Flight Element Builders\r\n// ============================================================================\r\n\r\n/**\r\n * Create a host element\r\n */\r\nexport function h(\r\n tag: string,\r\n props: Record<string, unknown> | null,\r\n ...children: unknown[]\r\n): FlightHostElement {\r\n const serializedProps: Record<string, SerializedValue> = {};\r\n\r\n if (props) {\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key !== 'children') {\r\n serializedProps[key] = serialize(value);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n $$type: 'host',\r\n tag,\r\n props: serializedProps,\r\n children: children.flat().map(child => toFlightElement(child)),\r\n };\r\n}\r\n\r\n/**\r\n * Create a text element\r\n */\r\nexport function text(value: string): FlightTextElement {\r\n return { $$type: 'text', value };\r\n}\r\n\r\n/**\r\n * Create a fragment\r\n */\r\nexport function fragment(...children: unknown[]): FlightFragmentElement {\r\n return {\r\n $$type: 'fragment',\r\n children: children.flat().map(child => toFlightElement(child)),\r\n };\r\n}\r\n\r\n/**\r\n * Create a suspense boundary\r\n */\r\nexport function suspense(\r\n id: string,\r\n fallback: FlightElement,\r\n children: FlightElement[]\r\n): FlightSuspenseElement {\r\n return { $$type: 'suspense', id, fallback, children };\r\n}\r\n\r\n/**\r\n * Create a client component reference\r\n */\r\nexport function clientRef(refId: string, ssrHtml?: string): FlightClientElement {\r\n return { $$type: 'client', ref: refId, ssr: ssrHtml };\r\n}\r\n\r\n/**\r\n * Convert any value to a FlightElement\r\n */\r\nexport function toFlightElement(value: unknown): FlightElement {\r\n if (value === null || value === undefined || typeof value === 'boolean') {\r\n return { $$type: 'null' };\r\n }\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n return { $$type: 'text', value: String(value) };\r\n }\r\n if (isFlightElement(value)) {\r\n return value;\r\n }\r\n // Unknown - render as null\r\n return { $$type: 'null' };\r\n}\r\n\r\n/**\r\n * Type guard for FlightElement\r\n */\r\nexport function isFlightElement(value: unknown): value is FlightElement {\r\n return typeof value === 'object' && value !== null && '$$type' in value;\r\n}\r\n\r\n// ============================================================================\r\n// Chunk Builders\r\n// ============================================================================\r\n\r\nlet chunkIdCounter = 0;\r\n\r\n/**\r\n * Generate unique chunk ID\r\n */\r\nexport function generateChunkId(prefix = 'c'): string {\r\n return `${prefix}${chunkIdCounter++}`;\r\n}\r\n\r\n/**\r\n * Reset chunk ID counter (for testing)\r\n */\r\nexport function resetChunkIdCounter(): void {\r\n chunkIdCounter = 0;\r\n}\r\n\r\n/**\r\n * Create a server component chunk\r\n */\r\nexport function createServerChunk(\r\n id: string,\r\n tree: FlightElement,\r\n awaiting?: string[]\r\n): ServerComponentChunk {\r\n return {\r\n type: 'S',\r\n id,\r\n tree,\r\n awaiting,\r\n ts: Date.now(),\r\n };\r\n}\r\n\r\n/**\r\n * Create a client reference chunk\r\n */\r\nexport function createClientChunk(\r\n id: string,\r\n module: string,\r\n exportName: string,\r\n props: unknown,\r\n fallback?: string\r\n): ClientReferenceChunk {\r\n return {\r\n type: 'C',\r\n id,\r\n module,\r\n export: exportName,\r\n props: serialize(props),\r\n fallback,\r\n };\r\n}\r\n\r\n/**\r\n * Create a server reference (action) chunk\r\n */\r\nexport function createActionChunk(\r\n id: string,\r\n boundArgs?: unknown[]\r\n): ServerReferenceChunk {\r\n return {\r\n type: 'A',\r\n id,\r\n bound: boundArgs?.map(serialize),\r\n };\r\n}\r\n\r\n/**\r\n * Create an error chunk\r\n */\r\nexport function createErrorChunk(\r\n boundary: string,\r\n error: Error,\r\n includeStack = false\r\n): ErrorBoundaryChunk {\r\n return {\r\n type: 'E',\r\n boundary,\r\n message: error.message,\r\n digest: generateErrorDigest(error),\r\n stack: includeStack ? error.stack : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * Create a hint chunk\r\n */\r\nexport function createHintChunk(\r\n hint: HintChunk['hint'],\r\n href: string,\r\n options?: { as?: HintChunk['as']; crossorigin?: HintChunk['crossorigin'] }\r\n): HintChunk {\r\n return {\r\n type: 'H',\r\n hint,\r\n href,\r\n ...options,\r\n };\r\n}\r\n\r\n/**\r\n * Generate error digest for correlation\r\n */\r\nfunction generateErrorDigest(error: Error): string {\r\n const str = `${error.name}:${error.message}:${Date.now()}`;\r\n // Simple hash for digest\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return Math.abs(hash).toString(36);\r\n}\r\n\r\n// ============================================================================\r\n// Custom Errors\r\n// ============================================================================\r\n\r\n/**\r\n * Error thrown during serialization\r\n */\r\nexport class FlightSerializationError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'FlightSerializationError';\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown during payload processing\r\n */\r\nexport class FlightPayloadError extends Error {\r\n constructor(message: string, public readonly chunk?: FlightChunk) {\r\n super(message);\r\n this.name = 'FlightPayloadError';\r\n }\r\n}\r\n"]}
|