@flight-framework/core 0.3.1 → 0.3.2

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.
Files changed (142) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +541 -541
  3. package/dist/actions/index.js +1 -1
  4. package/dist/adapters/index.js +1 -1
  5. package/dist/cache/index.js +1 -1
  6. package/dist/{chunk-FSJNOPYE.js → chunk-2JVEH76V.js} +3 -3
  7. package/dist/chunk-2JVEH76V.js.map +1 -0
  8. package/dist/{chunk-VPFMHGEV.js → chunk-3N5ZBVZJ.js} +2 -2
  9. package/dist/chunk-3N5ZBVZJ.js.map +1 -0
  10. package/dist/{chunk-2F2QU6RC.js → chunk-3UQJE3XZ.js} +2 -2
  11. package/dist/chunk-3UQJE3XZ.js.map +1 -0
  12. package/dist/{chunk-3KRBRSRJ.js → chunk-4U7CJVNQ.js} +2 -2
  13. package/dist/chunk-4U7CJVNQ.js.map +1 -0
  14. package/dist/{chunk-PDW5WCMW.js → chunk-5XHOLZBJ.js} +2 -2
  15. package/dist/chunk-5XHOLZBJ.js.map +1 -0
  16. package/dist/{chunk-MDQNNIHH.js → chunk-65JYF3DJ.js} +2 -2
  17. package/dist/chunk-65JYF3DJ.js.map +1 -0
  18. package/dist/{chunk-K2CQZPCG.js → chunk-6GI6HFSQ.js} +2 -2
  19. package/dist/chunk-6GI6HFSQ.js.map +1 -0
  20. package/dist/{chunk-3ZSSRE6M.js → chunk-6IG6XIXU.js} +29 -3
  21. package/dist/chunk-6IG6XIXU.js.map +1 -0
  22. package/dist/{chunk-PVUMB632.js → chunk-A2QRUBVE.js} +2 -2
  23. package/dist/chunk-A2QRUBVE.js.map +1 -0
  24. package/dist/{chunk-W6D62JCI.js → chunk-A4TKWQBU.js} +2 -2
  25. package/dist/chunk-A4TKWQBU.js.map +1 -0
  26. package/dist/{chunk-GCQZ4FHI.js → chunk-ARBKF6VI.js} +2 -2
  27. package/dist/{chunk-GCQZ4FHI.js.map → chunk-ARBKF6VI.js.map} +1 -1
  28. package/dist/{chunk-ZVC3ZWLM.js → chunk-B2LPSCES.js} +2 -2
  29. package/dist/chunk-B2LPSCES.js.map +1 -0
  30. package/dist/{chunk-62C7LX2E.js → chunk-CKJHJPKQ.js} +2 -2
  31. package/dist/chunk-CKJHJPKQ.js.map +1 -0
  32. package/dist/{chunk-RSVA2EYO.js → chunk-CNY3ZUVG.js} +2 -2
  33. package/dist/chunk-CNY3ZUVG.js.map +1 -0
  34. package/dist/{chunk-IXMD5QH2.js → chunk-EHVUAFNH.js} +2 -2
  35. package/dist/chunk-EHVUAFNH.js.map +1 -0
  36. package/dist/{chunk-P6WSBVDT.js → chunk-FRAH5QNY.js} +4 -4
  37. package/dist/chunk-FRAH5QNY.js.map +1 -0
  38. package/dist/{chunk-MQQLYWZZ.js → chunk-GNS2FGPC.js} +2 -2
  39. package/dist/chunk-GNS2FGPC.js.map +1 -0
  40. package/dist/{chunk-TASAT7KB.js → chunk-HNPO6LFW.js} +2 -2
  41. package/dist/chunk-HNPO6LFW.js.map +1 -0
  42. package/dist/{chunk-ROJFQCGV.js → chunk-KDEA64UX.js} +5 -5
  43. package/dist/chunk-KDEA64UX.js.map +1 -0
  44. package/dist/{chunk-NWMJYTMB.js → chunk-LAKHYTHL.js} +3 -3
  45. package/dist/chunk-LAKHYTHL.js.map +1 -0
  46. package/dist/{chunk-R7SQAREQ.js → chunk-LKOPJ3GS.js} +2 -2
  47. package/dist/chunk-LKOPJ3GS.js.map +1 -0
  48. package/dist/{chunk-WOEIJWGJ.js → chunk-NZS2YJ43.js} +2 -2
  49. package/dist/chunk-NZS2YJ43.js.map +1 -0
  50. package/dist/{chunk-3QP3E7HS.js → chunk-OZ3EXPLE.js} +2 -2
  51. package/dist/chunk-OZ3EXPLE.js.map +1 -0
  52. package/dist/{chunk-YHEVHRLH.js → chunk-OZBPR27I.js} +2 -2
  53. package/dist/chunk-OZBPR27I.js.map +1 -0
  54. package/dist/{chunk-T4Z4HM4W.js → chunk-PAVI5W6M.js} +3 -3
  55. package/dist/chunk-PAVI5W6M.js.map +1 -0
  56. package/dist/{chunk-XSY5AAXT.js → chunk-PO7IHPFF.js} +2 -2
  57. package/dist/chunk-PO7IHPFF.js.map +1 -0
  58. package/dist/{chunk-SUILH4ID.js → chunk-QK6UEQ75.js} +2 -2
  59. package/dist/chunk-QK6UEQ75.js.map +1 -0
  60. package/dist/{chunk-OYF2OAKS.js → chunk-R7MEVVA4.js} +2 -2
  61. package/dist/chunk-R7MEVVA4.js.map +1 -0
  62. package/dist/{chunk-WFAWAHJH.js → chunk-UFWGOJL7.js} +2 -2
  63. package/dist/chunk-UFWGOJL7.js.map +1 -0
  64. package/dist/{chunk-XOIYNY4I.js → chunk-VNO2YUVD.js} +2 -2
  65. package/dist/chunk-VNO2YUVD.js.map +1 -0
  66. package/dist/{chunk-ZIE56LCA.js → chunk-XU6MRYG2.js} +3 -3
  67. package/dist/chunk-XU6MRYG2.js.map +1 -0
  68. package/dist/{chunk-6BDCTUQY.js → chunk-YNTMYL36.js} +3 -3
  69. package/dist/chunk-YNTMYL36.js.map +1 -0
  70. package/dist/client.d.ts +25 -0
  71. package/dist/client.js +16 -0
  72. package/dist/client.js.map +1 -0
  73. package/dist/config/index.js +1 -1
  74. package/dist/errors/index.js +2 -2
  75. package/dist/file-router/index.js +1 -1
  76. package/dist/file-router/streaming-hints.js +1 -1
  77. package/dist/handlers/index.js +1 -1
  78. package/dist/index.js +30 -30
  79. package/dist/index.js.map +1 -1
  80. package/dist/islands/index.js +1 -1
  81. package/dist/middleware/index.js +1 -1
  82. package/dist/react/index.js +2 -2
  83. package/dist/react/index.js.map +1 -1
  84. package/dist/render/index.js +1 -1
  85. package/dist/router/index.js +1 -1
  86. package/dist/rsc/adapters/index.js +4 -4
  87. package/dist/rsc/adapters/preact.js +1 -1
  88. package/dist/rsc/adapters/react.js +1 -1
  89. package/dist/rsc/adapters/solid.js +1 -1
  90. package/dist/rsc/adapters/vue.js +1 -1
  91. package/dist/rsc/boundaries.js +1 -1
  92. package/dist/rsc/context.js +1 -1
  93. package/dist/rsc/index.d.ts +211 -6
  94. package/dist/rsc/index.js +11 -11
  95. package/dist/rsc/legacy.d.ts +26 -2
  96. package/dist/rsc/legacy.js +1 -1
  97. package/dist/rsc/payload.js +1 -1
  98. package/dist/rsc/plugins/esbuild.js +2 -2
  99. package/dist/rsc/plugins/index.js +4 -4
  100. package/dist/rsc/plugins/rollup.js +2 -2
  101. package/dist/rsc/renderer.js +3 -3
  102. package/dist/rsc/stream.js +1 -1
  103. package/dist/rsc/vite-plugin.js +2 -2
  104. package/dist/server/index.js +4 -4
  105. package/dist/streaming/adapters/index.js +1 -1
  106. package/dist/streaming/conditional.js +1 -1
  107. package/dist/streaming/index.js +1 -1
  108. package/dist/streaming/observability.js +2 -2
  109. package/dist/streaming/priority.js +1 -1
  110. package/dist/utils/index.js +1 -1
  111. package/package.json +228 -222
  112. package/dist/chunk-2F2QU6RC.js.map +0 -1
  113. package/dist/chunk-3KRBRSRJ.js.map +0 -1
  114. package/dist/chunk-3QP3E7HS.js.map +0 -1
  115. package/dist/chunk-3ZSSRE6M.js.map +0 -1
  116. package/dist/chunk-62C7LX2E.js.map +0 -1
  117. package/dist/chunk-6BDCTUQY.js.map +0 -1
  118. package/dist/chunk-FSJNOPYE.js.map +0 -1
  119. package/dist/chunk-IXMD5QH2.js.map +0 -1
  120. package/dist/chunk-K2CQZPCG.js.map +0 -1
  121. package/dist/chunk-MDQNNIHH.js.map +0 -1
  122. package/dist/chunk-MQQLYWZZ.js.map +0 -1
  123. package/dist/chunk-NWMJYTMB.js.map +0 -1
  124. package/dist/chunk-OYF2OAKS.js.map +0 -1
  125. package/dist/chunk-P6WSBVDT.js.map +0 -1
  126. package/dist/chunk-PDW5WCMW.js.map +0 -1
  127. package/dist/chunk-PVUMB632.js.map +0 -1
  128. package/dist/chunk-R7SQAREQ.js.map +0 -1
  129. package/dist/chunk-ROJFQCGV.js.map +0 -1
  130. package/dist/chunk-RSVA2EYO.js.map +0 -1
  131. package/dist/chunk-SUILH4ID.js.map +0 -1
  132. package/dist/chunk-T4Z4HM4W.js.map +0 -1
  133. package/dist/chunk-TASAT7KB.js.map +0 -1
  134. package/dist/chunk-VPFMHGEV.js.map +0 -1
  135. package/dist/chunk-W6D62JCI.js.map +0 -1
  136. package/dist/chunk-WFAWAHJH.js.map +0 -1
  137. package/dist/chunk-WOEIJWGJ.js.map +0 -1
  138. package/dist/chunk-XOIYNY4I.js.map +0 -1
  139. package/dist/chunk-XSY5AAXT.js.map +0 -1
  140. package/dist/chunk-YHEVHRLH.js.map +0 -1
  141. package/dist/chunk-ZIE56LCA.js.map +0 -1
  142. package/dist/chunk-ZVC3ZWLM.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/actions/middleware.ts","../src/actions/streaming.ts","../src/actions/queue.ts","../src/actions/index.ts"],"names":[],"mappings":"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","file":"chunk-OZ3EXPLE.js","sourcesContent":["/**\n * @flight-framework/core - Action Middleware\n * \n * Agnostic middleware system for Server Actions.\n * Flight provides the PRIMITIVES, you build YOUR solution.\n * \n * @example\n * ```typescript\n * // Create your own auth middleware (Flight doesn't impose any auth provider)\n * const withAuth = createActionMiddleware(async (ctx, next) => {\n * const session = await yourAuthProvider.getSession(ctx.headers);\n * if (!session) {\n * return { success: false, error: 'UNAUTHORIZED' };\n * }\n * ctx.set('session', session);\n * return next();\n * });\n * \n * // Create your own rate limiter (Flight doesn't impose any rate limit provider)\n * const withRateLimit = createActionMiddleware(async (ctx, next) => {\n * const allowed = await yourRateLimiter.check(ctx.get('session').userId);\n * if (!allowed) {\n * return { success: false, error: 'RATE_LIMITED' };\n * }\n * return next();\n * });\n * \n * // Compose them\n * const protectedAction = pipeline(withAuth, withRateLimit)(myAction);\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Action context - holds request data and middleware-set values\n */\nexport interface ActionContext {\n /** Original request (if available) */\n readonly request?: Request;\n /** Request headers */\n readonly headers: Headers;\n /** Action ID being executed */\n readonly actionId: string;\n /** Action arguments */\n readonly args: unknown[];\n /** Abort signal for cancellation */\n readonly signal?: AbortSignal;\n\n /** Get a value set by previous middleware */\n get<T = unknown>(key: string): T | undefined;\n /** Set a value for subsequent middleware/action */\n set<T = unknown>(key: string, value: T): void;\n}\n\n/**\n * Action result following Flight conventions\n */\nexport interface ActionResult<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n code?: string;\n}\n\n/**\n * Next function to call the next middleware or action\n */\nexport type ActionNext<T = unknown> = () => Promise<ActionResult<T>>;\n\n/**\n * Middleware handler function\n */\nexport type ActionMiddlewareHandler<TContext extends ActionContext = ActionContext> = (\n ctx: TContext,\n next: ActionNext\n) => Promise<ActionResult> | ActionResult;\n\n/**\n * A middleware instance\n */\nexport interface ActionMiddleware {\n /** Unique name for debugging */\n readonly name: string;\n /** The handler function */\n readonly handler: ActionMiddlewareHandler;\n}\n\n/**\n * An action function\n */\nexport type Action<TInput = unknown, TOutput = unknown> = (\n ...args: TInput extends unknown[] ? TInput : [TInput]\n) => Promise<ActionResult<TOutput>>;\n\n/**\n * Options for creating middleware\n */\nexport interface CreateMiddlewareOptions {\n /** Name for debugging/logging */\n name?: string;\n}\n\n// ============================================================================\n// Action Context Implementation\n// ============================================================================\n\n/**\n * Create an action context from request or minimal data\n */\nexport function createActionContext(options: {\n request?: Request;\n headers?: Headers;\n actionId: string;\n args: unknown[];\n signal?: AbortSignal;\n}): ActionContext {\n const store = new Map<string, unknown>();\n\n return {\n request: options.request,\n headers: options.headers ?? options.request?.headers ?? new Headers(),\n actionId: options.actionId,\n args: options.args,\n signal: options.signal,\n\n get<T = unknown>(key: string): T | undefined {\n return store.get(key) as T | undefined;\n },\n\n set<T = unknown>(key: string, value: T): void {\n store.set(key, value);\n },\n };\n}\n\n// ============================================================================\n// Middleware Creation\n// ============================================================================\n\nlet middlewareCounter = 0;\n\n/**\n * Create a reusable action middleware.\n * \n * Flight provides this PRIMITIVE - you define WHAT the middleware does.\n * \n * @example\n * ```typescript\n * // Authentication middleware (you choose the auth provider)\n * const withAuth = createActionMiddleware(async (ctx, next) => {\n * const token = ctx.headers.get('Authorization');\n * const user = await myAuthLib.verify(token); // YOUR auth library\n * \n * if (!user) {\n * return { success: false, error: 'Unauthorized', code: 'AUTH_ERROR' };\n * }\n * \n * ctx.set('user', user);\n * return next();\n * });\n * \n * // Validation middleware (you choose the validator)\n * const withValidation = (schema: ZodSchema) => createActionMiddleware(\n * async (ctx, next) => {\n * const result = schema.safeParse(ctx.args[0]);\n * if (!result.success) {\n * return { success: false, error: 'Validation failed', code: 'VALIDATION_ERROR' };\n * }\n * return next();\n * },\n * { name: 'validation' }\n * );\n * ```\n */\nexport function createActionMiddleware(\n handler: ActionMiddlewareHandler,\n options: CreateMiddlewareOptions = {}\n): ActionMiddleware {\n const name = options.name ?? `middleware_${++middlewareCounter}`;\n\n return {\n name,\n handler,\n };\n}\n\n// ============================================================================\n// Pipeline Composition\n// ============================================================================\n\n/**\n * Compose multiple middleware into a pipeline that wraps an action.\n * \n * Middleware executes in order: first middleware runs first.\n * Each middleware can:\n * - Short-circuit by returning a result without calling next()\n * - Transform context for subsequent middleware\n * - Wrap the next() call for timing/logging\n * \n * @example\n * ```typescript\n * const protectedAction = pipeline(\n * withAuth,\n * withRateLimit,\n * withValidation(UserSchema),\n * )(createUserAction);\n * \n * // Now protectedAction has auth, rate-limit, and validation\n * const result = await protectedAction(userData);\n * ```\n */\nexport function pipeline<TInput, TOutput>(\n ...middlewares: ActionMiddleware[]\n): (action: Action<TInput, TOutput>) => Action<TInput, TOutput> {\n return (action: Action<TInput, TOutput>): Action<TInput, TOutput> => {\n return async (...args: TInput extends unknown[] ? TInput : [TInput]): Promise<ActionResult<TOutput>> => {\n // Create context for this execution\n const ctx = createActionContext({\n actionId: action.name || 'anonymous',\n args: args as unknown[],\n });\n\n // Build the middleware chain\n let index = -1;\n\n const dispatch = async (i: number): Promise<ActionResult<TOutput>> => {\n if (i <= index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n\n if (i < middlewares.length) {\n // Execute middleware\n const middleware = middlewares[i]!;\n return middleware.handler(ctx, () => dispatch(i + 1)) as Promise<ActionResult<TOutput>>;\n } else {\n // Execute the actual action\n return action(...args);\n }\n };\n\n return dispatch(0);\n };\n };\n}\n\n/**\n * Execute an action with middleware, providing custom context.\n * \n * Use this when you need to provide request context (headers, etc.)\n * \n * @example\n * ```typescript\n * const result = await executeWithMiddleware(\n * myAction,\n * [arg1, arg2],\n * [withAuth, withRateLimit],\n * { request: incomingRequest }\n * );\n * ```\n */\nexport async function executeWithMiddleware<TInput extends unknown[], TOutput>(\n action: (...args: TInput) => Promise<ActionResult<TOutput>>,\n args: TInput,\n middlewares: ActionMiddleware[],\n options: {\n request?: Request;\n headers?: Headers;\n signal?: AbortSignal;\n } = {}\n): Promise<ActionResult<TOutput>> {\n // Create context with request info\n const ctx = createActionContext({\n request: options.request,\n headers: options.headers,\n actionId: action.name || 'anonymous',\n args: args as unknown[],\n signal: options.signal,\n });\n\n // Build the middleware chain\n let index = -1;\n\n const dispatch = async (i: number): Promise<ActionResult<TOutput>> => {\n // Check for abort\n if (options.signal?.aborted) {\n return { success: false, error: 'Aborted', code: 'ABORTED' };\n }\n\n if (i <= index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n\n if (i < middlewares.length) {\n const middleware = middlewares[i]!;\n return middleware.handler(ctx, () => dispatch(i + 1)) as Promise<ActionResult<TOutput>>;\n } else {\n return action(...args);\n }\n };\n\n return dispatch(0);\n}\n\n// ============================================================================\n// Utility Middleware Factories\n// ============================================================================\n\n/**\n * Create a timing middleware for observability.\n * \n * You provide the reporter - Flight doesn't impose any observability provider.\n * \n * @example\n * ```typescript\n * const withTiming = createTimingMiddleware((actionId, durationMs) => {\n * myMetricsService.histogram('action.duration', durationMs, { actionId });\n * });\n * ```\n */\nexport function createTimingMiddleware(\n reporter: (actionId: string, durationMs: number, result: ActionResult) => void\n): ActionMiddleware {\n return createActionMiddleware(\n async (ctx, next) => {\n const start = performance.now();\n const result = await next();\n const duration = performance.now() - start;\n reporter(ctx.actionId, duration, result);\n return result;\n },\n { name: 'timing' }\n );\n}\n\n/**\n * Create a logging middleware.\n * \n * You provide the logger - Flight doesn't impose any logging library.\n * \n * @example\n * ```typescript\n * const withLogging = createLoggingMiddleware({\n * onStart: (ctx) => console.log(`[${ctx.actionId}] Starting...`),\n * onComplete: (ctx, result, ms) => console.log(`[${ctx.actionId}] ${result.success ? 'OK' : 'FAIL'} in ${ms}ms`),\n * });\n * ```\n */\nexport function createLoggingMiddleware(options: {\n onStart?: (ctx: ActionContext) => void;\n onComplete?: (ctx: ActionContext, result: ActionResult, durationMs: number) => void;\n onError?: (ctx: ActionContext, error: Error) => void;\n}): ActionMiddleware {\n return createActionMiddleware(\n async (ctx, next) => {\n options.onStart?.(ctx);\n const start = performance.now();\n\n try {\n const result = await next();\n const duration = performance.now() - start;\n options.onComplete?.(ctx, result, duration);\n return result;\n } catch (error) {\n options.onError?.(ctx, error as Error);\n throw error;\n }\n },\n { name: 'logging' }\n );\n}\n\n/**\n * Create a retry middleware.\n * \n * @example\n * ```typescript\n * const withRetry = createRetryMiddleware({\n * maxAttempts: 3,\n * delay: (attempt) => Math.pow(2, attempt) * 100, // Exponential backoff\n * shouldRetry: (result) => result.code === 'TEMPORARY_ERROR',\n * });\n * ```\n */\nexport function createRetryMiddleware(options: {\n maxAttempts: number;\n delay?: (attempt: number) => number;\n shouldRetry?: (result: ActionResult) => boolean;\n}): ActionMiddleware {\n const {\n maxAttempts,\n delay = () => 0,\n shouldRetry = (result) => !result.success,\n } = options;\n\n return createActionMiddleware(\n async (ctx, next) => {\n let lastResult: ActionResult = { success: false, error: 'No attempts made' };\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const delayMs = delay(attempt);\n if (delayMs > 0) {\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n\n lastResult = await next();\n\n if (!shouldRetry(lastResult)) {\n return lastResult;\n }\n }\n\n return lastResult;\n },\n { name: 'retry' }\n );\n}\n","/**\n * @flight-framework/core - Action Streaming\n * \n * Streamable actions using async generators.\n * Flight provides the PRIMITIVES, you choose the transport.\n * \n * @example\n * ```typescript\n * // Create a streamable action for long-running operations\n * const generateReport = createStreamableAction(async function* (params: ReportParams) {\n * yield { type: 'progress', message: 'Fetching data...', progress: 0 };\n * const data = await fetchData(params);\n * \n * yield { type: 'progress', message: 'Processing...', progress: 33 };\n * const processed = await processData(data);\n * \n * yield { type: 'progress', message: 'Generating PDF...', progress: 66 };\n * const pdf = await generatePDF(processed);\n * \n * yield { type: 'progress', message: 'Complete!', progress: 100 };\n * return { success: true, data: pdf };\n * });\n * \n * // Client consumption\n * for await (const update of generateReport(params)) {\n * if (update.type === 'progress') {\n * setProgress(update.progress);\n * } else if (update.type === 'result') {\n * handleResult(update.data);\n * }\n * }\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Progress update yielded during streaming\n */\nexport interface StreamProgress<TYield = unknown> {\n type: 'progress';\n data: TYield;\n}\n\n/**\n * Final result of a streaming action\n */\nexport interface StreamResult<TReturn = unknown> {\n type: 'result';\n success: boolean;\n data?: TReturn;\n error?: string;\n}\n\n/**\n * Union type for stream items\n */\nexport type StreamItem<TYield, TReturn> = StreamProgress<TYield> | StreamResult<TReturn>;\n\n/**\n * Streamable action generator function\n */\nexport type StreamableGenerator<TInput, TYield, TReturn> = (\n input: TInput,\n signal?: AbortSignal\n) => AsyncGenerator<TYield, TReturn>;\n\n/**\n * Options for creating a streamable action\n */\nexport interface StreamableActionOptions {\n /** Name for debugging */\n name?: string;\n /** Timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Controller for a running stream\n */\nexport interface StreamController<TYield, TReturn> {\n /** Async iterator for consuming the stream */\n [Symbol.asyncIterator](): AsyncIterator<StreamItem<TYield, TReturn>>;\n /** Abort the stream */\n abort(): void;\n /** Promise that resolves when stream completes */\n done: Promise<StreamResult<TReturn>>;\n}\n\n/**\n * A streamable action function\n */\nexport type StreamableAction<TInput, TYield, TReturn> = (\n input: TInput\n) => StreamController<TYield, TReturn>;\n\n// ============================================================================\n// Streamable Action Creation\n// ============================================================================\n\n/**\n * Create a streamable action from an async generator.\n * \n * Flight provides this PRIMITIVE - you define the generator logic\n * and choose how to transport the stream (HTTP, WebSocket, etc.)\n * \n * @example\n * ```typescript\n * // AI streaming response\n * const streamChat = createStreamableAction(async function* (message: string) {\n * const stream = await openai.chat.completions.create({\n * model: 'gpt-4',\n * messages: [{ role: 'user', content: message }],\n * stream: true,\n * });\n * \n * let fullResponse = '';\n * for await (const chunk of stream) {\n * const text = chunk.choices[0]?.delta?.content || '';\n * fullResponse += text;\n * yield { text, partial: true };\n * }\n * \n * return { text: fullResponse, partial: false };\n * });\n * ```\n */\nexport function createStreamableAction<TInput, TYield, TReturn>(\n generator: StreamableGenerator<TInput, TYield, TReturn>,\n options: StreamableActionOptions = {}\n): StreamableAction<TInput, TYield, TReturn> {\n const actionName = options.name ?? generator.name ?? 'streamable_action';\n\n return (input: TInput): StreamController<TYield, TReturn> => {\n const abortController = new AbortController();\n let completed = false;\n let finalResult: StreamResult<TReturn> | null = null;\n\n // Create done promise\n let resolveDone: (result: StreamResult<TReturn>) => void;\n const done = new Promise<StreamResult<TReturn>>((resolve) => {\n resolveDone = resolve;\n });\n\n // Setup timeout if specified\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (options.timeout) {\n timeoutId = setTimeout(() => {\n abortController.abort();\n }, options.timeout);\n }\n\n // Create the async iterator\n async function* iterate(): AsyncGenerator<StreamItem<TYield, TReturn>> {\n try {\n const gen = generator(input, abortController.signal);\n\n while (true) {\n if (abortController.signal.aborted) {\n const abortResult: StreamResult<TReturn> = {\n type: 'result',\n success: false,\n error: 'Stream aborted',\n };\n finalResult = abortResult;\n resolveDone!(abortResult);\n yield abortResult;\n return;\n }\n\n const next = await gen.next();\n\n if (next.done) {\n // Generator returned - this is the final value\n const successResult: StreamResult<TReturn> = {\n type: 'result',\n success: true,\n data: next.value,\n };\n finalResult = successResult;\n completed = true;\n resolveDone!(successResult);\n yield successResult;\n return;\n } else {\n // Generator yielded - this is a progress update\n yield {\n type: 'progress',\n data: next.value,\n };\n }\n }\n } catch (error) {\n const errorResult: StreamResult<TReturn> = {\n type: 'result',\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n finalResult = errorResult;\n resolveDone!(errorResult);\n yield errorResult;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n const iterator = iterate();\n\n return {\n [Symbol.asyncIterator]() {\n return iterator;\n },\n abort() {\n abortController.abort();\n },\n done,\n };\n };\n}\n\n// ============================================================================\n// HTTP Transport Adapter\n// ============================================================================\n\n/**\n * Convert a streamable action result to an HTTP streaming response.\n * \n * This is ONE transport option - you can create others (WebSocket, SSE, etc.)\n * \n * @example\n * ```typescript\n * // In your API route\n * export async function POST(request: Request) {\n * const body = await request.json();\n * const stream = generateReport(body);\n * return streamToResponse(stream);\n * }\n * ```\n */\nexport function streamToResponse<TYield, TReturn>(\n controller: StreamController<TYield, TReturn>,\n options: {\n headers?: Record<string, string>;\n } = {}\n): Response {\n const encoder = new TextEncoder();\n\n const stream = new ReadableStream({\n async start(streamController) {\n try {\n for await (const item of controller) {\n const chunk = JSON.stringify(item) + '\\n';\n streamController.enqueue(encoder.encode(chunk));\n\n if (item.type === 'result') {\n break;\n }\n }\n } catch (error) {\n const errorChunk = JSON.stringify({\n type: 'result',\n success: false,\n error: error instanceof Error ? error.message : 'Stream error',\n }) + '\\n';\n streamController.enqueue(encoder.encode(errorChunk));\n } finally {\n streamController.close();\n }\n },\n cancel() {\n controller.abort();\n },\n });\n\n return new Response(stream, {\n status: 200,\n headers: {\n 'Content-Type': 'application/x-ndjson',\n 'Transfer-Encoding': 'chunked',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n ...options.headers,\n },\n });\n}\n\n/**\n * Parse an HTTP streaming response back to a stream controller (client-side).\n * \n * @example\n * ```typescript\n * // Client-side consumption\n * const response = await fetch('/api/generate-report', {\n * method: 'POST',\n * body: JSON.stringify(params),\n * });\n * \n * const stream = responseToStream<Progress, Report>(response);\n * \n * for await (const item of stream) {\n * if (item.type === 'progress') {\n * setProgress(item.data);\n * } else {\n * setReport(item.data);\n * }\n * }\n * ```\n */\nexport function responseToStream<TYield, TReturn>(\n response: Response\n): AsyncGenerator<StreamItem<TYield, TReturn>> {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n return (async function* () {\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n const item = JSON.parse(line) as StreamItem<TYield, TReturn>;\n yield item;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n // Process remaining buffer\n if (buffer.trim()) {\n try {\n const item = JSON.parse(buffer) as StreamItem<TYield, TReturn>;\n yield item;\n } catch {\n // Skip malformed JSON\n }\n }\n } finally {\n reader.releaseLock();\n }\n })();\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Collect all items from a stream into an array.\n * \n * Useful for testing or when you want to wait for completion.\n */\nexport async function collectStream<TYield, TReturn>(\n controller: StreamController<TYield, TReturn>\n): Promise<{ items: StreamItem<TYield, TReturn>[]; result: StreamResult<TReturn> }> {\n const items: StreamItem<TYield, TReturn>[] = [];\n let result: StreamResult<TReturn> | null = null;\n\n for await (const item of controller) {\n items.push(item);\n if (item.type === 'result') {\n result = item;\n }\n }\n\n if (!result) {\n result = { type: 'result', success: false, error: 'No result received' };\n }\n\n return { items, result };\n}\n\n/**\n * Create a simple progress reporter for streams.\n * \n * @example\n * ```typescript\n * const onProgress = createProgressReporter<MyProgress>((data) => {\n * console.log(`Progress: ${data.percent}%`);\n * });\n * \n * for await (const item of myStream) {\n * onProgress(item);\n * }\n * ```\n */\nexport function createProgressReporter<TYield, TReturn = unknown>(\n onProgress: (data: TYield) => void,\n onComplete?: (result: StreamResult<TReturn>) => void\n): (item: StreamItem<TYield, TReturn>) => void {\n return (item: StreamItem<TYield, TReturn>) => {\n if (item.type === 'progress') {\n onProgress(item.data);\n } else {\n onComplete?.(item);\n }\n };\n}\n","/**\n * @flight-framework/core - Action Queue\n * \n * Offline-first action queuing with pluggable storage.\n * Flight provides the PRIMITIVES and INTERFACE, you choose the storage.\n * \n * @example\n * ```typescript\n * // 1. Use a storage adapter (install separately or create your own)\n * import { indexedDBAdapter } from '@flight-framework/queue-indexeddb';\n * // OR create your own:\n * const myAdapter: QueueStorageAdapter = { ... };\n * \n * // 2. Create a queued action\n * const saveNote = createQueuedAction(\n * async (note: Note) => {\n * await api.saveNote(note);\n * return { success: true };\n * },\n * {\n * storage: indexedDBAdapter({ dbName: 'myapp' }),\n * retryStrategy: exponentialBackoff({ maxAttempts: 5 }),\n * onStatusChange: (status) => console.log('Queue status:', status),\n * }\n * );\n * \n * // 3. Use it - works offline!\n * await saveNote({ title: 'My Note', content: '...' });\n * // If offline: queued and synced later\n * // If online: executed immediately\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A queued action entry\n */\nexport interface QueuedActionEntry<TInput = unknown> {\n /** Unique ID for this entry */\n id: string;\n /** Action identifier */\n actionId: string;\n /** Action arguments */\n input: TInput;\n /** When the action was queued */\n queuedAt: number;\n /** Number of execution attempts */\n attempts: number;\n /** Last error message if failed */\n lastError?: string;\n /** Status */\n status: 'pending' | 'processing' | 'failed';\n /** Optional metadata */\n meta?: Record<string, unknown>;\n}\n\n/**\n * Queue storage adapter interface.\n * \n * Flight does NOT provide storage implementations - you choose:\n * - @flight-framework/queue-indexeddb (browser)\n * - @flight-framework/queue-sqlite (mobile/desktop)\n * - @flight-framework/queue-memory (testing)\n * - Your own implementation\n */\nexport interface QueueStorageAdapter {\n /** Add an action to the queue */\n enqueue<TInput>(entry: QueuedActionEntry<TInput>): Promise<void>;\n\n /** Get and remove the next pending action */\n dequeue(): Promise<QueuedActionEntry | null>;\n\n /** Get all pending actions without removing */\n peek(): Promise<QueuedActionEntry[]>;\n\n /** Update an existing entry */\n update(id: string, updates: Partial<QueuedActionEntry>): Promise<void>;\n\n /** Remove an entry by ID */\n remove(id: string): Promise<void>;\n\n /** Clear all entries */\n clear(): Promise<void>;\n\n /** Get queue length */\n length(): Promise<number>;\n}\n\n/**\n * Retry strategy function\n */\nexport type RetryStrategy = (\n entry: QueuedActionEntry,\n error: Error\n) => { shouldRetry: boolean; delayMs: number };\n\n/**\n * Queue status for observability\n */\nexport interface QueueStatus {\n /** Whether the queue processor is running */\n isProcessing: boolean;\n /** Number of pending actions */\n pendingCount: number;\n /** Number of failed actions */\n failedCount: number;\n /** Whether online */\n isOnline: boolean;\n}\n\n/**\n * Options for creating a queued action\n */\nexport interface QueuedActionOptions {\n /** Storage adapter (required - Flight doesn't provide default) */\n storage: QueueStorageAdapter;\n /** Custom action ID */\n actionId?: string;\n /** Retry strategy */\n retryStrategy?: RetryStrategy;\n /** Check if online (default: navigator.onLine on browser) */\n isOnline?: () => boolean | Promise<boolean>;\n /** Called when queue status changes */\n onStatusChange?: (status: QueueStatus) => void;\n /** Called when an action is successfully processed */\n onSuccess?: (entry: QueuedActionEntry, result: unknown) => void;\n /** Called when an action fails permanently */\n onFailure?: (entry: QueuedActionEntry, error: Error) => void;\n}\n\n/**\n * Action result for queued actions\n */\nexport interface QueuedActionResult<TOutput = unknown> {\n /** Whether immediately executed or queued */\n queued: boolean;\n /** Queue entry ID if queued */\n entryId?: string;\n /** Result if immediately executed */\n result?: { success: boolean; data?: TOutput; error?: string };\n}\n\n/**\n * A queued action function\n */\nexport type QueuedAction<TInput, TOutput> = (\n input: TInput\n) => Promise<QueuedActionResult<TOutput>>;\n\n// ============================================================================\n// Queue Creation\n// ============================================================================\n\nlet entryCounter = 0;\n\nfunction generateEntryId(): string {\n return `${Date.now()}_${++entryCounter}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Create an offline-capable queued action.\n * \n * Flight provides this PRIMITIVE - you provide the storage adapter.\n * \n * @example\n * ```typescript\n * // Create with your storage adapter\n * const syncData = createQueuedAction(\n * async (data: MyData) => {\n * await api.sync(data);\n * return { success: true };\n * },\n * {\n * storage: myStorageAdapter,\n * retryStrategy: exponentialBackoff(),\n * }\n * );\n * \n * // Use it - works offline automatically\n * const result = await syncData({ items: [...] });\n * \n * if (result.queued) {\n * console.log('Queued for later sync:', result.entryId);\n * } else {\n * console.log('Synced immediately:', result.result);\n * }\n * ```\n */\nexport function createQueuedAction<TInput, TOutput>(\n action: (input: TInput) => Promise<{ success: boolean; data?: TOutput; error?: string }>,\n options: QueuedActionOptions\n): QueuedAction<TInput, TOutput> {\n const {\n storage,\n actionId = action.name || `action_${Date.now()}`,\n retryStrategy = defaultRetryStrategy,\n isOnline = defaultIsOnline,\n onStatusChange,\n onSuccess,\n onFailure,\n } = options;\n\n // Queue processor state\n let isProcessing = false;\n let processorRunning = false;\n\n // Start background processor\n startProcessor();\n\n async function startProcessor() {\n if (processorRunning) return;\n processorRunning = true;\n\n // Process queue periodically\n while (processorRunning) {\n await processQueue();\n await sleep(1000); // Check every second\n }\n }\n\n async function processQueue() {\n // Check if online\n const online = await isOnline();\n if (!online) {\n return;\n }\n\n // Get next entry\n const entry = await storage.dequeue();\n if (!entry) {\n if (isProcessing) {\n isProcessing = false;\n await notifyStatus();\n }\n return;\n }\n\n isProcessing = true;\n await notifyStatus();\n\n // Update status to processing\n await storage.update(entry.id, { status: 'processing' });\n\n try {\n // Execute the action\n const result = await action(entry.input as TInput);\n\n // Success - remove from queue\n await storage.remove(entry.id);\n onSuccess?.(entry, result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Check retry strategy\n const { shouldRetry, delayMs } = retryStrategy(entry, err);\n\n if (shouldRetry) {\n // Re-queue with updated attempts\n await storage.update(entry.id, {\n status: 'pending',\n attempts: entry.attempts + 1,\n lastError: err.message,\n });\n\n // Wait before next attempt\n if (delayMs > 0) {\n await sleep(delayMs);\n }\n } else {\n // Mark as failed\n await storage.update(entry.id, {\n status: 'failed',\n lastError: err.message,\n });\n onFailure?.(entry, err);\n }\n }\n }\n\n async function notifyStatus() {\n if (!onStatusChange) return;\n\n const entries = await storage.peek();\n const status: QueueStatus = {\n isProcessing,\n pendingCount: entries.filter(e => e.status === 'pending').length,\n failedCount: entries.filter(e => e.status === 'failed').length,\n isOnline: await isOnline(),\n };\n onStatusChange(status);\n }\n\n // Return the queued action function\n return async (input: TInput): Promise<QueuedActionResult<TOutput>> => {\n const online = await isOnline();\n\n if (online) {\n // Try to execute immediately\n try {\n const result = await action(input);\n return { queued: false, result };\n } catch {\n // Fall through to queue\n }\n }\n\n // Queue for later\n const entry: QueuedActionEntry<TInput> = {\n id: generateEntryId(),\n actionId,\n input,\n queuedAt: Date.now(),\n attempts: 0,\n status: 'pending',\n };\n\n await storage.enqueue(entry);\n await notifyStatus();\n\n return { queued: true, entryId: entry.id };\n };\n}\n\n// ============================================================================\n// Built-in Retry Strategies\n// ============================================================================\n\n/**\n * Default retry strategy: 3 attempts with 1 second delay\n */\nexport const defaultRetryStrategy: RetryStrategy = (entry) => ({\n shouldRetry: entry.attempts < 3,\n delayMs: 1000,\n});\n\n/**\n * Create an exponential backoff retry strategy.\n * \n * @example\n * ```typescript\n * const retry = exponentialBackoff({\n * maxAttempts: 5,\n * baseDelayMs: 1000,\n * maxDelayMs: 30000,\n * });\n * ```\n */\nexport function exponentialBackoff(options: {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n} = {}): RetryStrategy {\n const {\n maxAttempts = 5,\n baseDelayMs = 1000,\n maxDelayMs = 30000,\n } = options;\n\n return (entry) => {\n const shouldRetry = entry.attempts < maxAttempts;\n const delayMs = Math.min(\n baseDelayMs * Math.pow(2, entry.attempts),\n maxDelayMs\n );\n\n return { shouldRetry, delayMs };\n };\n}\n\n/**\n * Create a fixed delay retry strategy.\n */\nexport function fixedDelay(options: {\n maxAttempts?: number;\n delayMs?: number;\n} = {}): RetryStrategy {\n const { maxAttempts = 3, delayMs = 1000 } = options;\n\n return (entry) => ({\n shouldRetry: entry.attempts < maxAttempts,\n delayMs,\n });\n}\n\n// ============================================================================\n// In-Memory Storage Adapter (for testing only)\n// ============================================================================\n\n/**\n * In-memory queue storage adapter.\n * \n * ⚠️ FOR TESTING ONLY - data is lost on page refresh.\n * \n * For production, use:\n * - @flight-framework/queue-indexeddb (browser)\n * - @flight-framework/queue-sqlite (native apps)\n * - Your own implementation\n */\nexport function createMemoryAdapter(): QueueStorageAdapter {\n const store = new Map<string, QueuedActionEntry>();\n\n return {\n async enqueue(entry) {\n store.set(entry.id, entry);\n },\n\n async dequeue() {\n for (const [id, entry] of store.entries()) {\n if (entry.status === 'pending') {\n store.delete(id);\n return entry;\n }\n }\n return null;\n },\n\n async peek() {\n return Array.from(store.values());\n },\n\n async update(id, updates) {\n const entry = store.get(id);\n if (entry) {\n store.set(id, { ...entry, ...updates });\n }\n },\n\n async remove(id) {\n store.delete(id);\n },\n\n async clear() {\n store.clear();\n },\n\n async length() {\n return store.size;\n },\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nfunction defaultIsOnline(): boolean {\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n return navigator.onLine;\n }\n // Assume online in non-browser environments\n return true;\n}\n\n/**\n * Create a queue manager to control multiple queued actions.\n * \n * @example\n * ```typescript\n * const queueManager = createQueueManager({\n * storage: myStorageAdapter,\n * });\n * \n * // Pause all processing\n * queueManager.pause();\n * \n * // Resume\n * queueManager.resume();\n * \n * // Get status\n * const status = await queueManager.getStatus();\n * ```\n */\nexport function createQueueManager(options: {\n storage: QueueStorageAdapter;\n}): {\n pause: () => void;\n resume: () => void;\n getStatus: () => Promise<QueueStatus>;\n clearFailed: () => Promise<void>;\n retryFailed: () => Promise<void>;\n} {\n let paused = false;\n\n return {\n pause() {\n paused = true;\n },\n\n resume() {\n paused = false;\n },\n\n async getStatus() {\n const entries = await options.storage.peek();\n return {\n isProcessing: !paused,\n pendingCount: entries.filter(e => e.status === 'pending').length,\n failedCount: entries.filter(e => e.status === 'failed').length,\n isOnline: defaultIsOnline(),\n };\n },\n\n async clearFailed() {\n const entries = await options.storage.peek();\n for (const entry of entries) {\n if (entry.status === 'failed') {\n await options.storage.remove(entry.id);\n }\n }\n },\n\n async retryFailed() {\n const entries = await options.storage.peek();\n for (const entry of entries) {\n if (entry.status === 'failed') {\n await options.storage.update(entry.id, {\n status: 'pending',\n attempts: 0,\n lastError: undefined,\n });\n }\n }\n },\n };\n}\n","/**\n * @flight-framework/core - Server Actions\n * \n * Implementation of React 19 style Server Actions.\n * Functions marked with 'use server' run on the server.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Server action metadata\n */\nexport interface ServerAction {\n /** Unique action ID */\n id: string;\n /** Original function name */\n name: string;\n /** File path where action is defined */\n filePath: string;\n /** The actual action function */\n fn: (...args: unknown[]) => Promise<unknown>;\n}\n\n/**\n * Server action result\n */\nexport interface ActionResult<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\n/**\n * Form action data\n */\nexport interface FormActionData {\n actionId: string;\n formData: FormData;\n}\n\n// ============================================================================\n// Action Registry\n// ============================================================================\n\nconst actionRegistry = new Map<string, ServerAction>();\n\n/**\n * Register a server action\n */\nexport function registerAction(action: ServerAction): void {\n actionRegistry.set(action.id, action);\n}\n\n/**\n * Get a registered action by ID\n */\nexport function getAction(id: string): ServerAction | undefined {\n return actionRegistry.get(id);\n}\n\n/**\n * Get all registered actions\n */\nexport function getAllActions(): ServerAction[] {\n return Array.from(actionRegistry.values());\n}\n\n/**\n * Clear all registered actions (useful for testing)\n */\nexport function clearActions(): void {\n actionRegistry.clear();\n}\n\n// ============================================================================\n// Action Execution\n// ============================================================================\n\n/**\n * Execute a server action\n */\nexport async function executeAction<T = unknown>(\n actionId: string,\n args: unknown[]\n): Promise<ActionResult<T>> {\n const action = getAction(actionId);\n\n if (!action) {\n return {\n success: false,\n error: `Action not found: ${actionId}`,\n };\n }\n\n try {\n const result = await action.fn(...args);\n return {\n success: true,\n data: result as T,\n };\n } catch (error) {\n // Re-throw RedirectError so handleActionRequest can return 303\n if (isRedirectError(error)) {\n throw error;\n }\n console.error(`[Flight] Action error (${actionId}):`, error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Execute a form action\n */\nexport async function executeFormAction<T = unknown>(\n actionId: string,\n formData: FormData\n): Promise<ActionResult<T>> {\n return executeAction<T>(actionId, [formData]);\n}\n\n// ============================================================================\n// Action ID Generation\n// ============================================================================\n\nlet actionCounter = 0;\n\n/**\n * Generate a unique action ID\n */\nexport function generateActionId(name: string, filePath: string): string {\n const hash = simpleHash(`${filePath}:${name}`);\n return `action_${hash}_${actionCounter++}`;\n}\n\n/**\n * Simple hash function for action IDs\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36);\n}\n\n// ============================================================================\n// Action Helpers (for use inside actions)\n// ============================================================================\n\n/**\n * Get cookies in server action context\n */\nexport function cookies(): {\n get: (name: string) => string | undefined;\n set: (name: string, value: string, options?: CookieOptions) => void;\n delete: (name: string) => void;\n} {\n // This will be populated by the runtime\n const cookieStore = (globalThis as any).__flightCookies;\n\n if (!cookieStore) {\n console.warn('[Flight] Cookies not available outside of action context');\n return {\n get: () => undefined,\n set: () => { },\n delete: () => { },\n };\n }\n\n return cookieStore;\n}\n\nexport interface CookieOptions {\n maxAge?: number;\n expires?: Date;\n path?: string;\n domain?: string;\n secure?: boolean;\n httpOnly?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\n/**\n * Redirect in server action context\n */\nexport function redirect(url: string): never {\n throw new RedirectError(url);\n}\n\n/**\n * Special error for redirects\n */\nexport class RedirectError extends Error {\n public readonly url: string;\n\n constructor(url: string) {\n super(`Redirect to ${url}`);\n this.name = 'RedirectError';\n this.url = url;\n }\n}\n\n/**\n * Check if error is a redirect\n */\nexport function isRedirectError(error: unknown): error is RedirectError {\n return error instanceof RedirectError;\n}\n\n// ============================================================================\n// Form Helpers\n// ============================================================================\n\n/**\n * Parse form data to typed object\n */\nexport function parseFormData<T extends Record<string, string>>(\n formData: FormData\n): T {\n const result: Record<string, string> = {};\n\n formData.forEach((value, key) => {\n result[key] = String(value);\n });\n\n return result as T;\n}\n\n/**\n * Create action reference for form action attribute\n */\nexport function createActionReference(actionId: string): string {\n return `/__flight_action/${actionId}`;\n}\n\n// ============================================================================\n// Action Handler (for HTTP endpoint)\n// ============================================================================\n\n/**\n * Handle action request from client\n */\nexport async function handleActionRequest(\n request: Request\n): Promise<Response> {\n const url = new URL(request.url);\n const actionPath = url.pathname;\n\n // Extract action ID from path: /__flight_action/{actionId}\n const match = actionPath.match(/^\\/__flight_action\\/(.+)$/);\n\n if (!match) {\n return new Response(JSON.stringify({ error: 'Invalid action path' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n const actionId = match[1];\n\n if (!actionId) {\n return new Response(JSON.stringify({ error: 'Missing action ID' }), {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n try {\n let result: ActionResult;\n\n // Check content type for form vs JSON\n const contentType = request.headers.get('content-type') || '';\n\n if (contentType.includes('application/x-www-form-urlencoded') ||\n contentType.includes('multipart/form-data')) {\n const formData = await request.formData();\n result = await executeFormAction(actionId, formData);\n } else {\n const args = await request.json();\n result = await executeAction(actionId, Array.isArray(args) ? args : [args]);\n }\n\n return new Response(JSON.stringify(result), {\n status: result.success ? 200 : 400,\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n if (isRedirectError(error)) {\n return new Response(null, {\n status: 303,\n headers: { Location: error.url },\n });\n }\n\n return new Response(JSON.stringify({\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n\n// ============================================================================\n// Re-export New Modules\n// ============================================================================\n\n// Action Middleware - composable middleware for actions\nexport * from './middleware.js';\n\n// Action Streaming - async generator-based streaming actions\nexport * from './streaming.js';\n\n// Action Queue - offline-first action queuing\nexport * from './queue.js';\n\n"]}
@@ -42,5 +42,5 @@ function getEnvironment() {
42
42
  }
43
43
 
44
44
  export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest };
45
- //# sourceMappingURL=chunk-YHEVHRLH.js.map
46
- //# sourceMappingURL=chunk-YHEVHRLH.js.map
45
+ //# sourceMappingURL=chunk-OZBPR27I.js.map
46
+ //# sourceMappingURL=chunk-OZBPR27I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/env.ts"],"names":[],"mappings":";AAmBO,SAAS,YAAA,GAAwB;AAEpC,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAe,SAAA,IAAa,UAAA,EAAY;AAC9D,IAAA,MAAM,OAAQ,UAAA,CAA6D,OAAA;AAC3E,IAAA,OAAO,IAAA,EAAM,KAAK,QAAA,KAAa,YAAA;AAAA,EACnC;AAEA,EAAA,IAAI,OAAO,MAAA,CAAA,IAAA,KAAgB,WAAA,IAAe,KAAA,IAAS,MAAA,CAAA,IAAA,EAAa;AAC5D,IAAA,MAAM,MAAO,MAAA,CAAA,IAAA,CAA4D,GAAA;AACzE,IAAA,OAAO,GAAA,EAAK,IAAA,KAAS,YAAA,IAAgB,GAAA,EAAK,IAAA,KAAS,IAAA;AAAA,EACvD;AACA,EAAA,OAAO,KAAA;AACX;AAUO,SAAS,aAAA,GAAyB;AAErC,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAe,SAAA,IAAa,UAAA,EAAY;AAC9D,IAAA,MAAM,OAAQ,UAAA,CAA6D,OAAA;AAC3E,IAAA,OAAO,IAAA,EAAM,KAAK,QAAA,KAAa,aAAA;AAAA,EACnC;AAEA,EAAA,IAAI,OAAO,MAAA,CAAA,IAAA,KAAgB,WAAA,IAAe,KAAA,IAAS,MAAA,CAAA,IAAA,EAAa;AAC5D,IAAA,MAAM,MAAO,MAAA,CAAA,IAAA,CAA2D,GAAA;AACxE,IAAA,OAAO,GAAA,EAAK,IAAA,KAAS,aAAA,IAAiB,GAAA,EAAK,GAAA,KAAQ,IAAA;AAAA,EACvD;AAEA,EAAA,OAAO,IAAA;AACX;AAKO,SAAS,MAAA,GAAkB;AAC9B,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAe,SAAA,IAAa,UAAA,EAAY;AAC9D,IAAA,MAAM,OAAQ,UAAA,CAA6D,OAAA;AAC3E,IAAA,OAAO,IAAA,EAAM,KAAK,QAAA,KAAa,MAAA;AAAA,EACnC;AACA,EAAA,OAAO,KAAA;AACX;AAKO,SAAS,QAAA,GAAoB;AAChC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC7B;AAKO,SAAS,SAAA,GAAqB;AACjC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC7B;AAKO,SAAS,cAAA,GAAoE;AAChF,EAAA,IAAI,YAAA,IAAgB,OAAO,YAAA;AAC3B,EAAA,IAAI,aAAA,IAAiB,OAAO,aAAA;AAC5B,EAAA,IAAI,MAAA,IAAU,OAAO,MAAA;AACrB,EAAA,OAAO,SAAA;AACX","file":"chunk-OZBPR27I.js","sourcesContent":["/**\n * @flight-framework/core - Environment Utilities\n * \n * Environment detection utilities that work across Node.js, browsers, and edge runtimes.\n * No hardcoded values - detects environment dynamically.\n */\n\n// ============================================================================\n// Environment Detection\n// ============================================================================\n\n/**\n * Check if running in production environment.\n * \n * Detection order:\n * 1. Node.js process.env.NODE_ENV\n * 2. Vite/modern bundlers import.meta.env.MODE or import.meta.env.PROD\n * 3. Default: false (not production)\n */\nexport function isProduction(): boolean {\n // Check for Node.js environment via globalThis (universal)\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n return proc?.env?.NODE_ENV === 'production';\n }\n // Check for import.meta.env (Vite, modern bundlers)\n if (typeof import.meta !== 'undefined' && 'env' in import.meta) {\n const env = (import.meta as { env?: { MODE?: string; PROD?: boolean } }).env;\n return env?.MODE === 'production' || env?.PROD === true;\n }\n return false;\n}\n\n/**\n * Check if running in development environment.\n * \n * Detection order:\n * 1. Node.js process.env.NODE_ENV\n * 2. Vite/modern bundlers import.meta.env.MODE or import.meta.env.DEV\n * 3. Default: true (assume development if unknown)\n */\nexport function isDevelopment(): boolean {\n // Check for Node.js environment via globalThis (universal)\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n return proc?.env?.NODE_ENV === 'development';\n }\n // Check for import.meta.env (Vite, modern bundlers)\n if (typeof import.meta !== 'undefined' && 'env' in import.meta) {\n const env = (import.meta as { env?: { MODE?: string; DEV?: boolean } }).env;\n return env?.MODE === 'development' || env?.DEV === true;\n }\n // Default to development if we can't detect\n return true;\n}\n\n/**\n * Check if running in test environment.\n */\nexport function isTest(): boolean {\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n return proc?.env?.NODE_ENV === 'test';\n }\n return false;\n}\n\n/**\n * Check if running on the server (not browser).\n */\nexport function isServer(): boolean {\n return typeof window === 'undefined';\n}\n\n/**\n * Check if running in the browser.\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * Get the current environment name.\n */\nexport function getEnvironment(): 'production' | 'development' | 'test' | 'unknown' {\n if (isProduction()) return 'production';\n if (isDevelopment()) return 'development';\n if (isTest()) return 'test';\n return 'unknown';\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-PDW5WCMW.js';
1
+ import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-5XHOLZBJ.js';
2
2
 
3
3
  // src/rsc/plugins/esbuild.ts
4
4
  function flightRSCEsbuild(options = {}) {
@@ -281,5 +281,5 @@ function extractExportNames(code) {
281
281
  var esbuild_default = flightRSCEsbuild;
282
282
 
283
283
  export { esbuild_default, flightRSCEsbuild };
284
- //# sourceMappingURL=chunk-T4Z4HM4W.js.map
285
- //# sourceMappingURL=chunk-T4Z4HM4W.js.map
284
+ //# sourceMappingURL=chunk-PAVI5W6M.js.map
285
+ //# sourceMappingURL=chunk-PAVI5W6M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/plugins/esbuild.ts"],"names":["exports"],"mappings":"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","file":"chunk-PAVI5W6M.js","sourcesContent":["/**\n * @flight-framework/core - esbuild Plugin for RSC\n * \n * esbuild plugin for Flight Server Components.\n * Transforms 'use client' and 'use server' directives at build time.\n * \n * Philosophy: Zero lock-in - esbuild is optional, user decides bundler.\n * \n * @module @flight-framework/core/rsc/plugins/esbuild\n */\n\nimport {\n analyzeModule,\n hasUseClientDirective,\n hasUseServerDirective,\n detectInlineServerActions,\n} from '../boundaries.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * esbuild Plugin interface (minimal)\n * We define our own to avoid requiring esbuild as dependency\n */\nexport interface EsbuildPlugin {\n name: string;\n setup: (build: EsbuildBuild) => void | Promise<void>;\n}\n\nexport interface EsbuildBuild {\n initialOptions: EsbuildBuildOptions;\n onStart: (callback: () => void | Promise<void>) => void;\n onEnd: (callback: (result: EsbuildResult) => void | Promise<void>) => void;\n onResolve: (\n options: { filter: RegExp; namespace?: string },\n callback: (args: EsbuildResolveArgs) => EsbuildResolveResult | null | undefined | Promise<EsbuildResolveResult | null | undefined>\n ) => void;\n onLoad: (\n options: { filter: RegExp; namespace?: string },\n callback: (args: EsbuildLoadArgs) => EsbuildLoadResult | null | undefined | Promise<EsbuildLoadResult | null | undefined>\n ) => void;\n}\n\nexport interface EsbuildBuildOptions {\n outdir?: string;\n write?: boolean;\n metafile?: boolean;\n}\n\nexport interface EsbuildResult {\n errors: unknown[];\n warnings: unknown[];\n metafile?: unknown;\n}\n\nexport interface EsbuildResolveArgs {\n path: string;\n importer: string;\n namespace: string;\n resolveDir: string;\n kind: string;\n}\n\nexport interface EsbuildResolveResult {\n path?: string;\n external?: boolean;\n namespace?: string;\n suffix?: string;\n pluginData?: unknown;\n errors?: unknown[];\n warnings?: unknown[];\n watchFiles?: string[];\n watchDirs?: string[];\n}\n\nexport interface EsbuildLoadArgs {\n path: string;\n namespace: string;\n suffix: string;\n pluginData: unknown;\n}\n\nexport interface EsbuildLoadResult {\n contents?: string;\n loader?: 'js' | 'jsx' | 'ts' | 'tsx' | 'json' | 'text' | 'css';\n resolveDir?: string;\n errors?: unknown[];\n warnings?: unknown[];\n watchFiles?: string[];\n watchDirs?: string[];\n}\n\n/**\n * Plugin configuration\n */\nexport interface FlightEsbuildPluginOptions {\n /** Include patterns (regex) */\n include?: RegExp;\n\n /** Exclude patterns (regex) */\n exclude?: RegExp;\n\n /** Server actions endpoint */\n actionsEndpoint?: string;\n\n /** Output directory for manifests */\n manifestDir?: string;\n\n /** Is this for SSR build? */\n ssr?: boolean;\n\n /** Dev mode (include extra debug info) */\n dev?: boolean;\n}\n\n/**\n * Manifest entry\n */\nexport interface ManifestEntry {\n id: string;\n file: string;\n exports: string[];\n}\n\n// ============================================================================\n// Plugin State\n// ============================================================================\n\ninterface PluginState {\n clientModules: Map<string, ManifestEntry>;\n serverActions: Map<string, ManifestEntry>;\n isSSR: boolean;\n}\n\n// ============================================================================\n// Plugin Implementation\n// ============================================================================\n\n/**\n * Flight RSC esbuild Plugin\n * \n * @example\n * ```typescript\n * // build.js\n * import * as esbuild from 'esbuild';\n * import { flightRSCEsbuild } from '@flight-framework/core/rsc/plugins/esbuild';\n * \n * await esbuild.build({\n * entryPoints: ['src/index.tsx'],\n * bundle: true,\n * outdir: 'dist',\n * plugins: [\n * flightRSCEsbuild({\n * actionsEndpoint: '/_flight/action',\n * ssr: true,\n * }),\n * ],\n * });\n * ```\n */\nexport function flightRSCEsbuild(options: FlightEsbuildPluginOptions = {}): EsbuildPlugin {\n const {\n include = /\\.(tsx?|jsx?)$/,\n exclude = /node_modules/,\n actionsEndpoint = '/_flight/action',\n manifestDir = '.flight',\n ssr = false,\n dev = false,\n } = options;\n\n const state: PluginState = {\n clientModules: new Map(),\n serverActions: new Map(),\n isSSR: ssr,\n };\n\n return {\n name: 'flight-rsc',\n\n setup(build) {\n const outdir = build.initialOptions.outdir || 'dist';\n\n // ============================================================\n // onStart: Reset state\n // ============================================================\n build.onStart(() => {\n state.clientModules.clear();\n state.serverActions.clear();\n });\n\n // ============================================================\n // onLoad: Transform client/server modules\n // ============================================================\n build.onLoad({ filter: include }, async (args) => {\n // Skip excluded\n if (exclude.test(args.path)) {\n return null;\n }\n\n // Read file\n const fs = await import('fs/promises');\n const code = await fs.readFile(args.path, 'utf-8');\n\n // Analyze module\n const analysis = analyzeModule(code, args.path);\n const moduleId = createModuleId(args.path);\n\n // Track client modules\n if (analysis.fileDirective === 'client') {\n state.clientModules.set(args.path, {\n id: moduleId,\n file: args.path,\n exports: analysis.clientComponents,\n });\n }\n\n // Track server actions\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\n state.serverActions.set(args.path, {\n id: moduleId,\n file: args.path,\n exports: analysis.serverActions,\n });\n }\n\n // Transform based on build type\n if (ssr) {\n // SSR build: Transform 'use client' to references\n if (hasUseClientDirective(code)) {\n return {\n contents: transformClientForSSR(code, moduleId),\n loader: getLoader(args.path),\n };\n }\n } else {\n // Client build: Transform 'use server' to RPC calls\n if (hasUseServerDirective(code)) {\n return {\n contents: transformServerForClient(code, moduleId, actionsEndpoint),\n loader: getLoader(args.path),\n };\n }\n\n // Transform inline server actions\n const inlineActions = detectInlineServerActions(code);\n if (inlineActions.length > 0) {\n return {\n contents: transformInlineActions(code, moduleId, inlineActions, actionsEndpoint),\n loader: getLoader(args.path),\n };\n }\n }\n\n return null;\n });\n\n // ============================================================\n // onEnd: Write manifests\n // ============================================================\n build.onEnd(async () => {\n const fs = await import('fs/promises');\n const path = await import('path');\n\n const manifestPath = path.join(outdir, manifestDir);\n\n // Ensure directory exists\n await fs.mkdir(manifestPath, { recursive: true });\n\n // Write client manifest\n if (state.clientModules.size > 0) {\n const clientManifest = Object.fromEntries(state.clientModules);\n await fs.writeFile(\n path.join(manifestPath, 'client-manifest.json'),\n JSON.stringify(clientManifest, null, 2)\n );\n }\n\n // Write server manifest\n if (state.serverActions.size > 0) {\n const serverManifest = Object.fromEntries(state.serverActions);\n await fs.writeFile(\n path.join(manifestPath, 'server-manifest.json'),\n JSON.stringify(serverManifest, null, 2)\n );\n }\n\n if (dev) {\n console.log(`[Flight RSC] Client modules: ${state.clientModules.size}`);\n console.log(`[Flight RSC] Server actions: ${state.serverActions.size}`);\n }\n });\n },\n };\n}\n\n// ============================================================================\n// Transform Functions\n// ============================================================================\n\n/**\n * Transform 'use client' module for SSR build\n */\nfunction transformClientForSSR(code: string, moduleId: string): string {\n const exports = extractExportNames(code);\n\n let transformed = `\n// Flight RSC: Client Component Reference (esbuild)\n// Original module: ${moduleId}\n\nconst __flight_module_id = ${JSON.stringify(moduleId)};\n\n`;\n\n for (const exportName of exports) {\n if (exportName === 'default') {\n transformed += `\nconst __flight_default = Object.assign(\n function() {\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\n },\n {\n $$typeof: Symbol.for('flight.client.reference'),\n $$id: __flight_module_id + '#default',\n $$async: false,\n __flight_client: true,\n __flight_module: __flight_module_id,\n __flight_export: 'default',\n }\n);\nexport default __flight_default;\n`;\n } else {\n transformed += `\nexport const ${exportName} = Object.assign(\n function() {\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_module_id);\n },\n {\n $$typeof: Symbol.for('flight.client.reference'),\n $$id: __flight_module_id + '#${exportName}',\n $$async: false,\n __flight_client: true,\n __flight_module: __flight_module_id,\n __flight_export: '${exportName}',\n }\n);\n`;\n }\n }\n\n return transformed;\n}\n\n/**\n * Transform 'use server' module for client build\n */\nfunction transformServerForClient(code: string, moduleId: string, endpoint: string): string {\n const exports = extractExportNames(code);\n\n let transformed = `\n// Flight RSC: Server Actions RPC Proxies (esbuild)\n// Original module: ${moduleId}\n\nconst __flight_endpoint = ${JSON.stringify(endpoint)};\nconst __flight_module_id = ${JSON.stringify(moduleId)};\n\nasync function __flight_rpc(actionId, args) {\n const response = await fetch(__flight_endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Flight-Action': actionId,\n },\n body: JSON.stringify({ actionId, args }),\n });\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\n throw new Error(error.message || 'Server action failed');\n }\n \n return response.json();\n}\n\n`;\n\n for (const exportName of exports) {\n const actionId = `${moduleId}#${exportName}`;\n if (exportName === 'default') {\n transformed += `\nexport default async function(...args) {\n return __flight_rpc(${JSON.stringify(actionId)}, args);\n}\n`;\n } else {\n transformed += `\nexport async function ${exportName}(...args) {\n return __flight_rpc(${JSON.stringify(actionId)}, args);\n}\n`;\n }\n }\n\n return transformed;\n}\n\n/**\n * Transform inline server actions\n */\nfunction transformInlineActions(\n code: string,\n moduleId: string,\n actions: string[],\n endpoint: string\n): string {\n let transformed = code;\n\n // Add RPC helper at the top (after any imports)\n const rpcHelper = `\n// Flight RSC: Inline Server Action Helpers\nconst __flight_endpoint_inline = ${JSON.stringify(endpoint)};\nasync function __flight_rpc_inline(actionId, args) {\n const response = await fetch(__flight_endpoint_inline, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Flight-Action': actionId },\n body: JSON.stringify({ actionId, args }),\n });\n if (!response.ok) throw new Error('Server action failed');\n return response.json();\n}\n`;\n\n // Find last import statement\n const lastImportMatch = code.match(/^import\\s.+$/gm);\n if (lastImportMatch) {\n const lastImport = lastImportMatch[lastImportMatch.length - 1] || '';\n const insertPos = code.indexOf(lastImport) + lastImport.length;\n transformed = code.slice(0, insertPos) + '\\n' + rpcHelper + code.slice(insertPos);\n } else {\n transformed = rpcHelper + code;\n }\n\n // Transform each action function\n for (const actionName of actions) {\n const actionId = `${moduleId}#${actionName}`;\n\n // Replace async function with RPC call\n // This is simplified - production would use proper AST transformation\n const patterns = [\n // async function name() { 'use server'; ... }\n new RegExp(\n `async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\n 'g'\n ),\n // const name = async () => { 'use server'; ... }\n new RegExp(\n `const\\\\s+${actionName}\\\\s*=\\\\s*async\\\\s*\\\\([^)]*\\\\)\\\\s*=>\\\\s*\\\\{[\\\\s\\\\S]*?['\"]use server['\"][\\\\s\\\\S]*?\\\\}`,\n 'g'\n ),\n ];\n\n for (const pattern of patterns) {\n transformed = transformed.replace(\n pattern,\n `async function ${actionName}(...args) { return __flight_rpc_inline(${JSON.stringify(actionId)}, args); }`\n );\n }\n }\n\n return transformed;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create module ID from file path\n */\nfunction createModuleId(filePath: string): string {\n // Normalize and create relative path\n let id = filePath.replace(/\\\\/g, '/');\n\n // Remove common prefixes\n const prefixes = ['/src/', 'src/'];\n for (const prefix of prefixes) {\n const idx = id.indexOf(prefix);\n if (idx !== -1) {\n id = id.slice(idx + prefix.length);\n break;\n }\n }\n\n if (!id.startsWith('/')) {\n id = '/' + id;\n }\n\n return id;\n}\n\n/**\n * Get esbuild loader from file extension\n */\nfunction getLoader(filePath: string): 'tsx' | 'ts' | 'jsx' | 'js' {\n if (filePath.endsWith('.tsx')) return 'tsx';\n if (filePath.endsWith('.ts')) return 'ts';\n if (filePath.endsWith('.jsx')) return 'jsx';\n return 'js';\n}\n\n/**\n * Extract export names from source code\n */\nfunction extractExportNames(code: string): string[] {\n const exports: string[] = [];\n\n // export default\n if (/export\\s+default\\s+/.test(code)) {\n exports.push('default');\n }\n\n // export function/const/let/class Name\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\n let match;\n while ((match = namedPattern.exec(code)) !== null) {\n if (match[1] && match[1] !== 'default') {\n exports.push(match[1]);\n }\n }\n\n // export { a, b, c }\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\n while ((match = bracketPattern.exec(code)) !== null) {\n if (match[1]) {\n const names = match[1].split(',').map(n => {\n const parts = n.trim().split(/\\s+as\\s+/);\n return parts[parts.length - 1]?.trim() || '';\n });\n exports.push(...names.filter(n => n && n !== 'default'));\n }\n }\n\n return [...new Set(exports)];\n}\n\nexport default flightRSCEsbuild;\n"]}
@@ -121,5 +121,5 @@ function isValidStreamingHints(obj) {
121
121
  }
122
122
 
123
123
  export { DEFAULT_STREAMING_HINTS, createStreamingController, generateCacheKey, getStreamingCacheHeaders, hasStreamingConfig, isValidStreamingHints, loadRouteWithStreaming, resolveStreamingConfig, shouldStream };
124
- //# sourceMappingURL=chunk-XSY5AAXT.js.map
125
- //# sourceMappingURL=chunk-XSY5AAXT.js.map
124
+ //# sourceMappingURL=chunk-PO7IHPFF.js.map
125
+ //# sourceMappingURL=chunk-PO7IHPFF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/file-router/streaming-hints.ts"],"names":[],"mappings":"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","file":"chunk-PO7IHPFF.js","sourcesContent":["/**\n * @flight-framework/core - File Router Streaming Hints\n * \n * Per-route streaming configuration through exports.\n * The user defines streaming behavior at the route level.\n * \n * @example\n * ```typescript\n * // src/routes/products/[id].page.tsx\n * \n * // Static export for streaming hints\n * export const streaming = {\n * enabled: true,\n * timeout: 5000,\n * priority: 'high',\n * };\n * \n * // Or dynamic function based on params\n * export function getStreamingConfig(params: { id: string }) {\n * return {\n * enabled: params.id !== 'preview',\n * timeout: 3000,\n * };\n * }\n * \n * export default function ProductPage({ params }) {\n * return <Product id={params.id} />;\n * }\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Static streaming configuration export\n */\nexport interface StreamingHints {\n /** Whether streaming is enabled for this route (default: true) */\n enabled?: boolean;\n /** Timeout before aborting streaming (ms) */\n timeout?: number;\n /** Priority hint for streaming scheduler */\n priority?: 'high' | 'normal' | 'low';\n /** Expected suspense boundary IDs */\n boundaries?: string[];\n /** Force static rendering (no streaming) */\n forceStatic?: boolean;\n /** Cache the static version */\n cache?: {\n /** Time to cache in seconds */\n ttl?: number;\n /** Stale-while-revalidate time in seconds */\n swr?: number;\n /** Cache tags for invalidation */\n tags?: string[];\n };\n}\n\n/**\n * Dynamic streaming configuration function\n */\nexport type GetStreamingConfig<TParams = Record<string, string>> = (\n params: TParams,\n request?: Request\n) => StreamingHints | Promise<StreamingHints>;\n\n/**\n * Route module with streaming exports\n */\nexport interface StreamingRouteModule {\n /** Default component/handler */\n default: unknown;\n /** Static streaming configuration */\n streaming?: StreamingHints;\n /** Dynamic streaming configuration function */\n getStreamingConfig?: GetStreamingConfig;\n /** Other route exports (metadata, generateStaticParams, etc.) */\n [key: string]: unknown;\n}\n\n/**\n * Resolved streaming configuration for a request\n */\nexport interface ResolvedStreamingConfig extends StreamingHints {\n /** Source of the configuration */\n source: 'static' | 'dynamic' | 'default';\n /** Route path */\n routePath: string;\n}\n\n// ============================================================================\n// Default Configuration\n// ============================================================================\n\n/**\n * Default streaming hints when none are specified\n */\nexport const DEFAULT_STREAMING_HINTS: Required<StreamingHints> = {\n enabled: true,\n timeout: 10000, // 10 seconds\n priority: 'normal',\n boundaries: [],\n forceStatic: false,\n cache: {\n ttl: undefined as unknown as number,\n swr: undefined as unknown as number,\n tags: [],\n },\n};\n\n// ============================================================================\n// Configuration Resolution\n// ============================================================================\n\n/**\n * Resolve streaming configuration for a route request\n */\nexport async function resolveStreamingConfig(\n module: StreamingRouteModule,\n params: Record<string, string>,\n request?: Request,\n routePath: string = '/'\n): Promise<ResolvedStreamingConfig> {\n // Check for dynamic config first (takes precedence)\n if (typeof module.getStreamingConfig === 'function') {\n try {\n const dynamicConfig = await module.getStreamingConfig(params, request);\n return {\n ...DEFAULT_STREAMING_HINTS,\n ...dynamicConfig,\n source: 'dynamic',\n routePath,\n };\n } catch (error) {\n console.warn(`[Flight] Error in getStreamingConfig for ${routePath}:`, error);\n // Fall through to static config\n }\n }\n\n // Check for static config\n if (module.streaming) {\n return {\n ...DEFAULT_STREAMING_HINTS,\n ...module.streaming,\n source: 'static',\n routePath,\n };\n }\n\n // Return defaults\n return {\n ...DEFAULT_STREAMING_HINTS,\n source: 'default',\n routePath,\n };\n}\n\n// ============================================================================\n// Route Loader Enhancement\n// ============================================================================\n\n/**\n * Load route module and extract streaming configuration\n */\nexport async function loadRouteWithStreaming(\n filePath: string,\n moduleLoader?: (path: string) => Promise<StreamingRouteModule>\n): Promise<{\n module: StreamingRouteModule;\n hasStreamingConfig: boolean;\n hasGetStreamingConfig: boolean;\n}> {\n // Use custom loader or native import\n let module: StreamingRouteModule;\n if (moduleLoader) {\n module = await moduleLoader(filePath);\n } else {\n const { pathToFileURL } = await import('node:url');\n const fileUrl = pathToFileURL(filePath).href;\n module = await import(fileUrl);\n }\n\n return {\n module,\n hasStreamingConfig: 'streaming' in module,\n hasGetStreamingConfig: typeof module.getStreamingConfig === 'function',\n };\n}\n\n// ============================================================================\n// Streaming Decision Helper\n// ============================================================================\n\n/**\n * Determine if streaming should be used based on config and request\n */\nexport function shouldStream(\n config: ResolvedStreamingConfig,\n request?: Request\n): { stream: boolean; reason: string } {\n // Force static always wins\n if (config.forceStatic) {\n return { stream: false, reason: 'forceStatic enabled' };\n }\n\n // Check enabled flag\n if (config.enabled === false) {\n return { stream: false, reason: 'streaming disabled in config' };\n }\n\n // Check for bot user agents (optional, user can also use conditional.ts)\n if (request) {\n // userAgent could be used here for bot detection if needed\n\n // Check for explicit no-stream header\n if (request.headers.get('x-no-stream') === 'true') {\n return { stream: false, reason: 'x-no-stream header' };\n }\n\n // Check for low priority and slow connection\n if (config.priority === 'low') {\n const ect = request.headers.get('ect');\n if (ect && ['slow-2g', '2g'].includes(ect)) {\n return { stream: false, reason: 'low priority + slow connection' };\n }\n }\n }\n\n return { stream: true, reason: 'streaming enabled' };\n}\n\n// ============================================================================\n// Timeout Controller\n// ============================================================================\n\n/**\n * Create an abort controller with timeout\n */\nexport function createStreamingController(\n timeout: number\n): {\n controller: AbortController;\n signal: AbortSignal;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort(new Error(`Streaming timeout after ${timeout}ms`));\n }, timeout);\n\n return {\n controller,\n signal: controller.signal,\n cleanup: () => clearTimeout(timeoutId),\n };\n}\n\n// ============================================================================\n// Caching Integration\n// ============================================================================\n\n/**\n * Generate cache key for a streaming route\n */\nexport function generateCacheKey(\n routePath: string,\n params: Record<string, string>,\n _config: StreamingHints\n): string {\n const paramString = Object.entries(params)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join('&');\n\n return `streaming:${routePath}:${paramString}`;\n}\n\n/**\n * Cache headers for static streaming fallback\n */\nexport function getStreamingCacheHeaders(config: StreamingHints): Record<string, string> {\n if (!config.cache) return {};\n\n const headers: Record<string, string> = {};\n\n if (config.cache.ttl) {\n if (config.cache.swr) {\n headers['Cache-Control'] = `s-maxage=${config.cache.ttl}, stale-while-revalidate=${config.cache.swr}`;\n } else {\n headers['Cache-Control'] = `s-maxage=${config.cache.ttl}`;\n }\n }\n\n if (config.cache.tags && config.cache.tags.length > 0) {\n headers['X-Cache-Tags'] = config.cache.tags.join(',');\n }\n\n return headers;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if a module has streaming configuration\n */\nexport function hasStreamingConfig(module: unknown): module is StreamingRouteModule {\n if (!module || typeof module !== 'object') return false;\n return 'streaming' in module || 'getStreamingConfig' in module;\n}\n\n/**\n * Validate streaming hints object\n */\nexport function isValidStreamingHints(obj: unknown): obj is StreamingHints {\n if (!obj || typeof obj !== 'object') return false;\n const hints = obj as StreamingHints;\n\n if (hints.enabled !== undefined && typeof hints.enabled !== 'boolean') return false;\n if (hints.timeout !== undefined && typeof hints.timeout !== 'number') return false;\n if (hints.priority !== undefined && !['high', 'normal', 'low'].includes(hints.priority)) return false;\n if (hints.boundaries !== undefined && !Array.isArray(hints.boundaries)) return false;\n if (hints.forceStatic !== undefined && typeof hints.forceStatic !== 'boolean') return false;\n\n return true;\n}\n"]}
@@ -9,5 +9,5 @@ function createAdapter(options) {
9
9
  }
10
10
 
11
11
  export { createAdapter };
12
- //# sourceMappingURL=chunk-SUILH4ID.js.map
13
- //# sourceMappingURL=chunk-SUILH4ID.js.map
12
+ //# sourceMappingURL=chunk-QK6UEQ75.js.map
13
+ //# sourceMappingURL=chunk-QK6UEQ75.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/index.ts"],"names":[],"mappings":";AA2IO,SAAS,cAAc,OAAA,EAAwC;AAClE,EAAA,OAAO;AAAA,IACH,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,UAAU,OAAA,CAAQ;AAAA,GACtB;AACJ","file":"chunk-QK6UEQ75.js","sourcesContent":["/**\n * Flight Adapters - Universal deployment adapters\n * \n * Adapters transform Flight's output for different deployment targets.\n * The user chooses where to deploy - Flight provides the adapters.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Build manifest containing all generated assets */\nexport interface BuildManifest {\n /** Entry points by name */\n entries: Record<string, string>;\n /** All generated files */\n files: string[];\n /** Route information */\n routes: RouteManifestEntry[];\n /** Server entry point (if applicable) */\n serverEntry?: string;\n /** Client entry point */\n clientEntry?: string;\n}\n\n/** Route information in manifest */\nexport interface RouteManifestEntry {\n /** Route path pattern */\n path: string;\n /** Render mode for this route */\n mode: 'ssr' | 'ssg' | 'csr' | 'isr';\n /** Component/handler file path */\n component: string;\n /** Pre-rendered paths (for SSG/ISR) */\n prerendered?: string[];\n}\n\n/** Builder utilities passed to adapters */\nexport interface AdapterBuilder {\n /** Build manifest */\n manifest: BuildManifest;\n /** Project root directory */\n root: string;\n /** Build output directory */\n outDir: string;\n\n /** Read a file from the build output */\n readFile(path: string): Promise<string>;\n /** Write a file to the adapter output */\n writeFile(path: string, content: string): Promise<void>;\n /** Copy files from build to adapter output */\n copy(from: string, to: string): Promise<void>;\n /** Get all files matching a pattern */\n glob(pattern: string): Promise<string[]>;\n /** Compress files for production */\n compress?(files: string[]): Promise<void>;\n\n /** Log info message */\n log: {\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n };\n}\n\n/** Flight adapter interface */\nexport interface FlightAdapter {\n /** Adapter name */\n name: string;\n\n /** \n * Transform the build output for the target platform\n * This is called after Flight's build process completes\n */\n adapt(builder: AdapterBuilder): Promise<void>;\n\n /**\n * Optional: Start listening for requests (for Node.js/Bun adapters)\n */\n listen?(server: unknown, port: number): Promise<void>;\n\n /**\n * Optional: Emulate the platform during development\n * Useful for testing platform-specific behavior locally\n */\n emulate?(): {\n /** Platform-specific env vars */\n env?: Record<string, string>;\n /** Custom middleware for dev server */\n middleware?: unknown[];\n };\n\n /**\n * Optional: Declare what this adapter supports\n * Flight uses this to warn about incompatible features\n */\n supports?: {\n /** Can read files at runtime (for dynamic content) */\n read?: () => boolean;\n /** Supports streaming responses */\n streaming?: () => boolean;\n /** Supports WebSockets */\n websockets?: () => boolean;\n /** Supports edge runtime */\n edge?: () => boolean;\n /** Supports Node.js runtime */\n node?: () => boolean;\n };\n}\n\n\n// ============================================================================\n// Adapter Factory Helper\n// ============================================================================\n\nexport interface AdapterOptions {\n name: string;\n adapt: (builder: AdapterBuilder) => Promise<void>;\n emulate?: FlightAdapter['emulate'];\n supports?: FlightAdapter['supports'];\n}\n\n/**\n * Create a Flight adapter\n * \n * @example\n * ```typescript\n * import { createAdapter } from '@flight-framework/core/adapters';\n * \n * export default function myAdapter(options = {}) {\n * return createAdapter({\n * name: 'my-adapter',\n * async adapt(builder) {\n * // Transform build output for your platform\n * },\n * });\n * }\n * ```\n */\nexport function createAdapter(options: AdapterOptions): FlightAdapter {\n return {\n name: options.name,\n adapt: options.adapt,\n emulate: options.emulate,\n supports: options.supports,\n };\n}\n\n// ============================================================================\n// Agnostic Service Adapters (Interfaces)\n// ============================================================================\n\n/**\n * Storage Adapter Interface\n * \n * Implement this to use any storage provider:\n * S3, Supabase Storage, Cloudflare R2, local filesystem, etc.\n */\nexport interface StorageAdapter {\n name: string;\n\n /** Upload a file */\n upload(path: string, data: Buffer | Uint8Array | string, options?: {\n contentType?: string;\n metadata?: Record<string, string>;\n }): Promise<{ url: string; path: string }>;\n\n /** Download a file */\n download(path: string): Promise<Buffer>;\n\n /** Delete a file */\n delete(path: string): Promise<void>;\n\n /** List files with optional prefix */\n list(prefix?: string): Promise<string[]>;\n\n /** Get a signed URL for direct access */\n getSignedUrl?(path: string, options?: {\n expiresIn?: number;\n operation?: 'read' | 'write';\n }): Promise<string>;\n}\n\n/**\n * Auth Adapter Interface\n * \n * Implement this to use any auth provider:\n * Better Auth, Supabase Auth, Lucia, Auth.js, etc.\n */\nexport interface AuthAdapter {\n name: string;\n\n /** Get the current user from a request */\n getUser(request: Request): Promise<AuthUser | null>;\n\n /** Verify a session token */\n verifySession(token: string): Promise<AuthSession | null>;\n\n /** Optional middleware for handling auth-specific routes (e.g., /api/auth/*) */\n middleware?: (req: Request) => Promise<Response | null>;\n}\n\nexport interface AuthUser {\n id: string;\n email?: string;\n name?: string;\n avatar?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AuthSession {\n user: AuthUser;\n expiresAt: Date;\n token: string;\n}\n\n/**\n * Email Adapter Interface\n * \n * Implement this to use any email provider:\n * Resend, SendGrid, Postmark, SMTP, etc.\n */\nexport interface EmailAdapter {\n name: string;\n\n /** Send an email */\n send(options: {\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n from?: string;\n replyTo?: string;\n attachments?: Array<{\n filename: string;\n content: Buffer | string;\n contentType?: string;\n }>;\n }): Promise<{ id: string; success: boolean }>;\n}\n\n/**\n * Queue/Jobs Adapter Interface\n * \n * Implement this to use any job queue:\n * BullMQ, Quirrel, Inngest, custom, etc.\n */\nexport interface JobsAdapter {\n name: string;\n\n /** Add a job to the queue */\n enqueue<T>(jobName: string, data: T, options?: {\n delay?: number;\n priority?: number;\n retries?: number;\n }): Promise<{ id: string }>;\n\n /** Schedule a recurring job */\n schedule?(jobName: string, cron: string, data?: unknown): Promise<{ id: string }>;\n\n /** Cancel a job */\n cancel?(jobId: string): Promise<void>;\n}\n\n/**\n * Database Adapter Interface\n * \n * Note: This is intentionally minimal. \n * For databases, use your preferred ORM/query builder directly.\n * This interface is for Flight's internal use (sessions, cache, etc.)\n */\nexport interface DatabaseAdapter {\n name: string;\n\n /** Raw query execution */\n query<T = unknown>(sql: string, params?: unknown[]): Promise<T[]>;\n\n /** Execute a mutation */\n execute(sql: string, params?: unknown[]): Promise<{ rowsAffected: number }>;\n\n /** Transaction support */\n transaction?<T>(fn: (tx: DatabaseAdapter) => Promise<T>): Promise<T>;\n}\n"]}
@@ -390,5 +390,5 @@ function compose(...middlewares) {
390
390
  }
391
391
 
392
392
  export { compose, compress, cors, createContextFromRequest, createMiddlewareChain, createResponseFromContext, errorHandler, logger, securityHeaders };
393
- //# sourceMappingURL=chunk-OYF2OAKS.js.map
394
- //# sourceMappingURL=chunk-OYF2OAKS.js.map
393
+ //# sourceMappingURL=chunk-R7MEVVA4.js.map
394
+ //# sourceMappingURL=chunk-R7MEVVA4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware/index.ts"],"names":[],"mappings":"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","file":"chunk-R7MEVVA4.js","sourcesContent":["/**\n * Flight Middleware - Composable request/response handlers\n * \n * Framework-agnostic middleware system inspired by Koa/Hono.\n * Provides primitives for building your own middleware solutions.\n * \n * @example\n * ```typescript\n * // Type-safe middleware with custom variables (Hono pattern)\n * interface MyLocals {\n * user: { id: string; role: string };\n * requestId: string;\n * }\n * \n * const authMiddleware: Middleware<MyLocals> = async (ctx, next) => {\n * ctx.locals.user = { id: '123', role: 'admin' };\n * await next();\n * };\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Request context passed through middleware chain.\n * \n * Supports generic type parameter for type-safe locals (like Hono Variables).\n * \n * @typeParam TLocals - Type of the locals object for type-safe middleware data sharing\n * \n * @example\n * ```typescript\n * interface AppLocals {\n * user: User;\n * db: DatabaseClient;\n * }\n * \n * const ctx: MiddlewareContext<AppLocals> = createContextFromRequest(request);\n * ctx.locals.user = currentUser; // Type-safe!\n * ```\n */\nexport interface MiddlewareContext<TLocals extends Record<string, unknown> = Record<string, unknown>> {\n /** Request URL */\n url: URL;\n /** Request method */\n method: string;\n /** Request headers */\n headers: Headers;\n /** URL parameters from routing */\n params: Record<string, string | string[]>;\n /** Query parameters */\n query: URLSearchParams;\n /** Parsed request body (if any) */\n body?: unknown;\n /** Local data shared between middleware - type-safe with generics */\n locals: TLocals;\n /** Original request (platform-specific) */\n request?: Request;\n\n // Response building\n /** Response status code */\n status: number;\n /** Response headers */\n responseHeaders: Headers;\n /** Response body */\n responseBody?: BodyInit | null;\n}\n\n/** Next function to call the next middleware */\nexport type MiddlewareNext = () => Promise<void>;\n\n/**\n * Middleware function signature with optional typed locals.\n * \n * @typeParam TLocals - Type of the locals object for type-safe data sharing\n */\nexport type Middleware<TLocals extends Record<string, unknown> = Record<string, unknown>> = (\n ctx: MiddlewareContext<TLocals>,\n next: MiddlewareNext\n) => Promise<void> | void;\n\n/** Middleware with optional path matching */\nexport interface MiddlewareDefinition {\n /** Path pattern to match (undefined = match all) */\n path?: string | RegExp;\n /** HTTP methods to match (undefined = match all) */\n methods?: string[];\n /** The middleware function */\n handler: Middleware;\n}\n\n// ============================================================================\n// Middleware Chain\n// ============================================================================\n\nexport interface MiddlewareChain {\n /** Add middleware to the chain */\n use(middleware: Middleware): MiddlewareChain;\n use(path: string, middleware: Middleware): MiddlewareChain;\n use(definition: MiddlewareDefinition): MiddlewareChain;\n\n /** Execute the middleware chain */\n execute(ctx: MiddlewareContext): Promise<void>;\n\n /** Get all middleware definitions */\n middlewares(): MiddlewareDefinition[];\n}\n\n/**\n * Create a new middleware chain\n */\nexport function createMiddlewareChain(): MiddlewareChain {\n const stack: MiddlewareDefinition[] = [];\n\n function use(\n pathOrMiddleware: string | Middleware | MiddlewareDefinition,\n maybeMiddleware?: Middleware\n ): MiddlewareChain {\n if (typeof pathOrMiddleware === 'function') {\n // use(middleware)\n stack.push({ handler: pathOrMiddleware });\n } else if (typeof pathOrMiddleware === 'string' && maybeMiddleware) {\n // use(path, middleware)\n stack.push({ path: pathOrMiddleware, handler: maybeMiddleware });\n } else if (typeof pathOrMiddleware === 'object') {\n // use(definition)\n stack.push(pathOrMiddleware);\n }\n return chain;\n }\n\n async function execute(ctx: MiddlewareContext): Promise<void> {\n let index = -1;\n\n async function dispatch(i: number): Promise<void> {\n if (i <= index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n\n if (i >= stack.length) {\n return;\n }\n\n const definition = stack[i];\n if (!definition) {\n return dispatch(i + 1);\n }\n\n // Check if middleware should run\n if (!shouldRun(definition, ctx)) {\n return dispatch(i + 1);\n }\n\n await definition.handler(ctx, () => dispatch(i + 1));\n }\n\n await dispatch(0);\n }\n\n const chain: MiddlewareChain = {\n use: use as MiddlewareChain['use'],\n execute,\n middlewares: () => [...stack],\n };\n\n return chain;\n}\n\n/**\n * Check if a middleware should run for the given context\n */\nfunction shouldRun(def: MiddlewareDefinition, ctx: MiddlewareContext): boolean {\n // Check method\n if (def.methods && !def.methods.includes(ctx.method.toUpperCase())) {\n return false;\n }\n\n // Check path\n if (def.path) {\n const path = ctx.url.pathname;\n\n if (typeof def.path === 'string') {\n // Simple path matching (supports wildcards)\n if (def.path.endsWith('*')) {\n const prefix = def.path.slice(0, -1);\n if (!path.startsWith(prefix)) {\n return false;\n }\n } else if (def.path !== path) {\n return false;\n }\n } else if (def.path instanceof RegExp) {\n if (!def.path.test(path)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n// ============================================================================\n// Built-in Middleware Factories\n// ============================================================================\n\n/**\n * CORS middleware factory\n */\n/**\n * CORS options for configuring cross-origin requests.\n */\nexport interface CorsOptions {\n /** \n * Allowed origins. Can be:\n * - '*' for any origin\n * - A specific origin string\n * - An array of allowed origins\n * - A function that returns true if origin is allowed\n * - An async function for dynamic origin validation\n */\n origin?: string | string[] | ((origin: string) => boolean | Promise<boolean>);\n /** Allowed HTTP methods */\n methods?: string[];\n /** Allowed headers */\n headers?: string[];\n /** Whether to include credentials */\n credentials?: boolean;\n /** Preflight cache duration in seconds */\n maxAge?: number;\n /** Exposed headers that can be accessed from the response */\n exposeHeaders?: string[];\n}\n\n/**\n * CORS middleware factory.\n * \n * Handles cross-origin resource sharing with best practices:\n * - Adds Vary: Origin for dynamic origins (CDN compatibility)\n * - Supports async origin validation\n * - Proper preflight handling\n * \n * @example\n * ```typescript\n * // Allow specific origins\n * chain.use(cors({ origin: ['https://app.example.com'] }));\n * \n * // Dynamic validation\n * chain.use(cors({\n * origin: async (origin) => {\n * return await db.allowedOrigins.exists(origin);\n * }\n * }));\n * ```\n */\nexport function cors(options: CorsOptions = {}): Middleware {\n const {\n origin = '*',\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n headers = ['Content-Type', 'Authorization'],\n credentials = false,\n maxAge = 86400,\n exposeHeaders = [],\n } = options;\n\n // Track if origin is dynamic (requires Vary header)\n const isDynamicOrigin = typeof origin === 'function' || Array.isArray(origin);\n\n return async (ctx, next) => {\n const requestOrigin = ctx.headers.get('Origin') || '';\n\n // Add Vary: Origin for dynamic origins (CDN/cache compatibility)\n if (isDynamicOrigin) {\n const existingVary = ctx.responseHeaders.get('Vary');\n if (existingVary) {\n if (!existingVary.includes('Origin')) {\n ctx.responseHeaders.set('Vary', `${existingVary}, Origin`);\n }\n } else {\n ctx.responseHeaders.set('Vary', 'Origin');\n }\n }\n\n // Determine allowed origin\n let allowedOrigin: string | null = null;\n if (origin === '*') {\n allowedOrigin = '*';\n } else if (typeof origin === 'string') {\n allowedOrigin = origin;\n } else if (Array.isArray(origin)) {\n if (origin.includes(requestOrigin)) {\n allowedOrigin = requestOrigin;\n }\n } else if (typeof origin === 'function') {\n const isAllowed = await origin(requestOrigin);\n if (isAllowed) {\n allowedOrigin = requestOrigin;\n }\n }\n\n if (allowedOrigin) {\n ctx.responseHeaders.set('Access-Control-Allow-Origin', allowedOrigin);\n ctx.responseHeaders.set('Access-Control-Allow-Methods', methods.join(', '));\n ctx.responseHeaders.set('Access-Control-Allow-Headers', headers.join(', '));\n\n if (credentials) {\n ctx.responseHeaders.set('Access-Control-Allow-Credentials', 'true');\n }\n\n if (maxAge) {\n ctx.responseHeaders.set('Access-Control-Max-Age', String(maxAge));\n }\n\n if (exposeHeaders.length > 0) {\n ctx.responseHeaders.set('Access-Control-Expose-Headers', exposeHeaders.join(', '));\n }\n }\n\n // Handle preflight\n if (ctx.method === 'OPTIONS') {\n ctx.status = 204;\n ctx.responseBody = null;\n return;\n }\n\n await next();\n };\n}\n// ============================================================================\n// Logger Types and Constants\n// ============================================================================\n\n/** Log levels in order of verbosity */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\n/** Log format types */\nexport type LogFormat = 'pretty' | 'json' | 'combined' | 'common' | 'short' | 'tiny';\n\n/** Log entry structure for JSON format */\nexport interface LogEntry {\n timestamp: string;\n level: LogLevel;\n method: string;\n path: string;\n status: number;\n duration: number;\n userAgent?: string;\n ip?: string;\n [key: string]: unknown;\n}\n\n/** Custom log writer function */\nexport type LogWriter = (entry: LogEntry, formatted: string) => void;\n\n/** Logger options */\nexport interface LoggerOptions {\n /** Minimum log level (default: 'info') */\n level?: LogLevel;\n /** Output format (default: 'pretty') */\n format?: LogFormat;\n /** Skip logging for certain requests */\n skip?: (ctx: MiddlewareContext) => boolean;\n /** Custom log writer (replaces console output) */\n writer?: LogWriter;\n /** Include request headers in logs */\n includeHeaders?: boolean;\n /** Colorize output (only for 'pretty' format, default: true) */\n colorize?: boolean;\n}\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n};\n\nconst LOG_LEVEL_COLORS: Record<LogLevel, string> = {\n debug: '\\x1b[36m', // Cyan\n info: '\\x1b[32m', // Green\n warn: '\\x1b[33m', // Yellow\n error: '\\x1b[31m', // Red\n silent: '',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n '2': '\\x1b[32m', // Green for 2xx\n '3': '\\x1b[36m', // Cyan for 3xx\n '4': '\\x1b[33m', // Yellow for 4xx\n '5': '\\x1b[31m', // Red for 5xx\n};\n\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\n\n/**\n * Professional logger middleware with configurable levels\n * \n * @example\n * ```typescript\n * // Basic usage\n * server.use(logger());\n * \n * // With level control\n * server.use(logger({ level: 'warn' })); // Only warn and error\n * \n * // JSON format for production/observability\n * server.use(logger({ format: 'json', level: 'info' }));\n * \n * // Custom writer (e.g., for external logging service)\n * server.use(logger({\n * writer: (entry) => myLoggingService.log(entry)\n * }));\n * \n * // Silent in production\n * server.use(logger({ level: process.env.NODE_ENV === 'production' ? 'error' : 'debug' }));\n * ```\n */\nexport function logger(options: LoggerOptions = {}): Middleware {\n const {\n level = 'info',\n format = 'pretty',\n skip,\n writer,\n includeHeaders = false,\n colorize = true,\n } = options;\n\n // Helper to format and output log\n const outputLog = (\n ctx: MiddlewareContext,\n logLevel: LogLevel,\n startTime: string,\n duration: number,\n error?: Error\n ): void => {\n const status = error ? 500 : ctx.status;\n const userAgent = ctx.headers.get('user-agent');\n const forwardedFor = ctx.headers.get('x-forwarded-for');\n const ip = forwardedFor || 'unknown';\n\n // Build log entry\n const entry: LogEntry = {\n timestamp: startTime,\n level: logLevel,\n method: ctx.method,\n path: ctx.url.pathname,\n status,\n duration,\n };\n\n if (userAgent) entry.userAgent = userAgent;\n entry.ip = ip;\n\n if (error) {\n entry.error = error.message;\n entry.stack = error.stack;\n }\n\n if (includeHeaders) {\n const headers: Record<string, string> = {};\n ctx.headers.forEach((value, key) => {\n if (!key.toLowerCase().includes('authorization')) {\n headers[key] = value;\n }\n });\n entry.headers = headers;\n }\n\n // Format the log line\n let formatted: string;\n\n switch (format) {\n case 'json':\n formatted = JSON.stringify(entry);\n break;\n\n case 'combined':\n formatted = `${ip} - - [${startTime}] \"${ctx.method} ${ctx.url.pathname}\" ${status} - \"${userAgent || '-'}\"`;\n break;\n\n case 'common':\n formatted = `${ip} - - [${startTime}] \"${ctx.method} ${ctx.url.pathname}\" ${status}`;\n break;\n\n case 'short':\n formatted = `${ctx.method} ${ctx.url.pathname} ${status} ${duration}ms`;\n break;\n\n case 'tiny':\n formatted = `${ctx.method} ${ctx.url.pathname} ${status}`;\n break;\n\n case 'pretty':\n default:\n if (colorize) {\n const statusFirstChar = String(status).charAt(0) || '2';\n const statusColor = STATUS_COLORS[statusFirstChar] ?? '';\n const levelColor = LOG_LEVEL_COLORS[logLevel];\n const errorSuffix = error ? ` ${LOG_LEVEL_COLORS.error}[${error.message}]${RESET}` : '';\n formatted = `${DIM}${startTime}${RESET} ${levelColor}${logLevel.toUpperCase().padEnd(5)}${RESET} ${ctx.method.padEnd(7)} ${ctx.url.pathname} ${statusColor}${status}${RESET} ${DIM}${duration}ms${RESET}${errorSuffix}`;\n } else {\n const errorSuffix = error ? ` [${error.message}]` : '';\n formatted = `${startTime} ${logLevel.toUpperCase().padEnd(5)} ${ctx.method.padEnd(7)} ${ctx.url.pathname} ${status} ${duration}ms${errorSuffix}`;\n }\n break;\n }\n\n // Output\n if (writer) {\n writer(entry, formatted);\n } else {\n switch (logLevel) {\n case 'error':\n console.error(formatted);\n break;\n case 'warn':\n console.warn(formatted);\n break;\n case 'debug':\n console.debug(formatted);\n break;\n default:\n console.log(formatted);\n }\n }\n };\n\n return async (ctx, next) => {\n // Skip if configured\n if (skip?.(ctx)) {\n return next();\n }\n\n const start = Date.now();\n const startTime = new Date().toISOString();\n\n try {\n await next();\n\n const duration = Date.now() - start;\n const status = ctx.status;\n\n // Determine log level based on status\n let logLevel: LogLevel = 'info';\n if (status >= 500) {\n logLevel = 'error';\n } else if (status >= 400) {\n logLevel = 'warn';\n } else if (status >= 300) {\n logLevel = 'info';\n } else {\n logLevel = 'debug';\n }\n\n // Check if we should log based on level\n if (LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[level]) {\n outputLog(ctx, logLevel, startTime, duration);\n }\n } catch (error) {\n // Always log errors, then re-throw\n const duration = Date.now() - start;\n if (LOG_LEVEL_PRIORITY.error >= LOG_LEVEL_PRIORITY[level]) {\n outputLog(ctx, 'error', startTime, duration, error as Error);\n }\n throw error;\n }\n };\n}\n\n/**\n * Security headers middleware\n */\nexport function securityHeaders(options: {\n contentSecurityPolicy?: string | false;\n xFrameOptions?: 'DENY' | 'SAMEORIGIN' | false;\n xContentTypeOptions?: boolean;\n referrerPolicy?: string;\n permissionsPolicy?: string;\n} = {}): Middleware {\n const {\n contentSecurityPolicy = \"default-src 'self'\",\n xFrameOptions = 'DENY',\n xContentTypeOptions = true,\n referrerPolicy = 'strict-origin-when-cross-origin',\n permissionsPolicy,\n } = options;\n\n return async (ctx, next) => {\n if (contentSecurityPolicy) {\n ctx.responseHeaders.set('Content-Security-Policy', contentSecurityPolicy);\n }\n if (xFrameOptions) {\n ctx.responseHeaders.set('X-Frame-Options', xFrameOptions);\n }\n if (xContentTypeOptions) {\n ctx.responseHeaders.set('X-Content-Type-Options', 'nosniff');\n }\n if (referrerPolicy) {\n ctx.responseHeaders.set('Referrer-Policy', referrerPolicy);\n }\n if (permissionsPolicy) {\n ctx.responseHeaders.set('Permissions-Policy', permissionsPolicy);\n }\n\n await next();\n };\n}\n\n/**\n * Compression middleware (requires implementation in adapter)\n */\nexport function compress(): Middleware {\n return async (ctx, next) => {\n // Mark that compression is desired\n ctx.locals['flight:compress'] = true;\n await next();\n };\n}\n\n// ============================================================================\n// Error Handler Middleware\n// ============================================================================\n\n/**\n * Error information passed to error handlers.\n */\nexport interface ErrorInfo {\n /** The original error */\n error: Error;\n /** HTTP status code (derived from error or default 500) */\n status: number;\n /** Error code for categorization */\n code?: string;\n /** Request context */\n ctx: MiddlewareContext;\n /** Request timestamp */\n timestamp: string;\n}\n\n/**\n * Error handler options.\n */\nexport interface ErrorHandlerOptions {\n /**\n * Custom error handler function.\n * Called when an error is caught. Can modify ctx to set response.\n * If not provided, a default JSON response is sent.\n */\n onError?: (info: ErrorInfo) => void | Promise<void>;\n\n /**\n * Whether to expose error details in response.\n * Set to false in production to hide internal error messages.\n * @default false\n */\n expose?: boolean;\n\n /**\n * Default status code for errors without a status property.\n * @default 500\n */\n defaultStatus?: number;\n\n /**\n * Emit error events for centralized logging (Koa pattern).\n * Provide a function to receive error events.\n */\n emit?: (error: Error, ctx: MiddlewareContext) => void;\n}\n\n/**\n * Error handler middleware factory.\n * \n * Provides centralized error handling following Koa best practices:\n * - Catches all downstream errors\n * - Sets appropriate status codes\n * - Supports custom error handlers\n * - Supports error event emission for logging\n * \n * Place this as one of the FIRST middleware in your chain.\n * \n * @example\n * ```typescript\n * // Basic usage - default JSON error response\n * chain.use(errorHandler());\n * \n * // With custom handler\n * chain.use(errorHandler({\n * onError: ({ error, status, ctx }) => {\n * ctx.status = status;\n * ctx.responseBody = JSON.stringify({\n * error: error.message,\n * code: 'SERVER_ERROR'\n * });\n * },\n * emit: (error, ctx) => {\n * logger.error('Request error:', error);\n * errorTracker.capture(error);\n * }\n * }));\n * \n * // Production-safe (hide error details)\n * chain.use(errorHandler({ expose: false }));\n * ```\n */\nexport function errorHandler(options: ErrorHandlerOptions = {}): Middleware {\n const {\n onError,\n expose = false,\n defaultStatus = 500,\n emit,\n } = options;\n\n return async (ctx, next) => {\n try {\n await next();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n\n // Extract status from error if available\n const status = (error as Error & { status?: number; statusCode?: number }).status\n ?? (error as Error & { status?: number; statusCode?: number }).statusCode\n ?? defaultStatus;\n\n // Extract error code if available\n const code = (error as Error & { code?: string }).code;\n\n const timestamp = new Date().toISOString();\n\n const errorInfo: ErrorInfo = {\n error,\n status,\n code,\n ctx,\n timestamp,\n };\n\n // Emit error event for centralized logging (Koa pattern)\n if (emit) {\n try {\n emit(error, ctx);\n } catch {\n // Ignore emission errors to prevent infinite loops\n }\n }\n\n // Call custom error handler if provided\n if (onError) {\n await onError(errorInfo);\n } else {\n // Default error response\n ctx.status = status;\n ctx.responseHeaders.set('Content-Type', 'application/json');\n\n const body = expose\n ? {\n error: error.message,\n code,\n status,\n timestamp,\n stack: error.stack,\n }\n : {\n error: status >= 500 ? 'Internal Server Error' : error.message,\n code,\n status,\n timestamp,\n };\n\n ctx.responseBody = JSON.stringify(body);\n }\n }\n };\n}\n\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Create a middleware context from a Web Request\n */\nexport function createContextFromRequest(\n request: Request,\n params: Record<string, string | string[]> = {}\n): MiddlewareContext {\n const url = new URL(request.url);\n\n return {\n url,\n method: request.method,\n headers: request.headers,\n params,\n query: url.searchParams,\n locals: {},\n request,\n status: 200,\n responseHeaders: new Headers(),\n };\n}\n\n/**\n * Create a Web Response from middleware context\n */\nexport function createResponseFromContext(ctx: MiddlewareContext): Response {\n return new Response(ctx.responseBody, {\n status: ctx.status,\n headers: ctx.responseHeaders,\n });\n}\n\n/**\n * Compose multiple middleware into one\n */\nexport function compose(...middlewares: Middleware[]): Middleware {\n return async (ctx, next) => {\n let index = -1;\n\n async function dispatch(i: number): Promise<void> {\n if (i <= index) {\n throw new Error('next() called multiple times');\n }\n index = i;\n\n const fn = i === middlewares.length ? next : middlewares[i];\n\n if (fn) {\n await fn(ctx, () => dispatch(i + 1));\n }\n }\n\n await dispatch(0);\n };\n}\n"]}
@@ -263,5 +263,5 @@ function registerFlightIslandElement() {
263
263
  }
264
264
 
265
265
  export { createIslandRegistry, createPreactIslandAdapter, createReactIslandAdapter, createSolidIslandAdapter, createVueIslandAdapter, defineIsland, hydrateIslands, registerFlightIslandElement, registerIsland, renderIsland, renderIslands, setIslandAdapter };
266
- //# sourceMappingURL=chunk-WFAWAHJH.js.map
267
- //# sourceMappingURL=chunk-WFAWAHJH.js.map
266
+ //# sourceMappingURL=chunk-UFWGOJL7.js.map
267
+ //# sourceMappingURL=chunk-UFWGOJL7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/islands/index.ts"],"names":[],"mappings":"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","file":"chunk-UFWGOJL7.js","sourcesContent":["/**\n * @flight-framework/core - Islands Architecture\n * \n * Selective hydration with fine-grained control over when and how\n * components become interactive. Framework-agnostic islands primitives.\n * \n * Best Practices 2026:\n * - Minimal JavaScript: Only hydrate what needs interactivity\n * - Lazy hydration: Load JS when actually needed\n * - Progressive enhancement: Works without JS\n * - Performance: Reduce main thread work\n * \n * @example\n * ```typescript\n * import { defineIsland, renderIsland, hydrateIslands } from '@flight-framework/core/islands';\n * \n * // Server: Define an interactive island\n * const Counter = defineIsland({\n * id: 'counter',\n * component: CounterComponent,\n * hydrate: 'visible', // Only hydrate when scrolled into view\n * });\n * \n * // Server: Render to HTML with island markers\n * const html = await renderIsland(Counter, { initial: 0 });\n * \n * // Client: Hydrate all islands on the page\n * hydrateIslands();\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * When to hydrate the island\n */\nexport type HydrationTrigger =\n | 'load' // Immediate: hydrate as soon as JS loads\n | 'idle' // When browser is idle (requestIdleCallback)\n | 'visible' // When island enters viewport (IntersectionObserver)\n | 'interaction' // On first user interaction (click, focus, hover)\n | 'media' // When media query matches\n | 'never' // Never hydrate (static HTML only)\n | CustomHydrationTrigger;\n\n/**\n * Custom hydration trigger function\n */\nexport interface CustomHydrationTrigger {\n type: 'custom';\n /** Name for debugging */\n name: string;\n /** Function that returns a promise resolving when hydration should occur */\n when: (element: HTMLElement) => Promise<void>;\n}\n\n/**\n * Island configuration\n */\nexport interface IslandConfig<P = Record<string, unknown>> {\n /** Unique identifier for this island type */\n id: string;\n /** The component to render (framework-specific) */\n component: unknown;\n /** When to hydrate on client */\n hydrate: HydrationTrigger;\n /** Default props */\n defaultProps?: P;\n /** Media query for 'media' trigger */\n mediaQuery?: string;\n /** Path to client-side component bundle */\n clientEntry?: string;\n /** Fallback HTML while not hydrated (optional override) */\n fallback?: string;\n /** Loading priority hint */\n priority?: 'high' | 'low';\n}\n\n/**\n * Island instance with props\n */\nexport interface Island<P = Record<string, unknown>> {\n /** Island configuration */\n config: IslandConfig<P>;\n /** Instance props */\n props: P;\n /** Unique instance ID (for multiple instances of same island type) */\n instanceId: string;\n}\n\n/**\n * Rendered island HTML with metadata\n */\nexport interface RenderedIsland {\n /** The HTML string */\n html: string;\n /** Island ID */\n id: string;\n /** Instance ID */\n instanceId: string;\n /** Serialized props for hydration */\n propsScript: string;\n /** CSS if any */\n css?: string;\n}\n\n/**\n * Island registry for client-side hydration\n */\nexport interface IslandRegistry {\n /** Register a component for an island ID */\n register(id: string, loader: () => Promise<unknown>): void;\n /** Get registered loader */\n get(id: string): (() => Promise<unknown>) | undefined;\n /** Check if island is registered */\n has(id: string): boolean;\n}\n\n/**\n * Client-side hydration options\n */\nexport interface HydrateOptions {\n /** Root element to scan for islands */\n root?: HTMLElement;\n /** Custom island registry */\n registry?: IslandRegistry;\n /** Callback when an island is hydrated */\n onHydrate?: (id: string, instanceId: string, duration: number) => void;\n /** Callback on hydration error */\n onError?: (id: string, error: Error) => void;\n}\n\n// ============================================================================\n// Server-Side: Island Definition\n// ============================================================================\n\nlet instanceCounter = 0;\n\n/**\n * Generate a unique instance ID\n */\nfunction generateInstanceId(islandId: string): string {\n return `${islandId}:${++instanceCounter}:${Math.random().toString(36).slice(2, 7)}`;\n}\n\n/**\n * Define an island component\n */\nexport function defineIsland<P = Record<string, unknown>>(\n config: IslandConfig<P>\n): (props?: P) => Island<P> {\n return (props?: P) => ({\n config,\n props: { ...config.defaultProps, ...props } as P,\n instanceId: generateInstanceId(config.id),\n });\n}\n\n/**\n * Serialize props for client-side hydration\n */\nfunction serializeProps(props: Record<string, unknown>): string {\n try {\n return JSON.stringify(props);\n } catch {\n console.warn('[Flight Islands] Props are not serializable, using empty object');\n return '{}';\n }\n}\n\n/**\n * Get hydration trigger attribute value\n */\nfunction getHydrateAttr(trigger: HydrationTrigger): string {\n if (typeof trigger === 'object' && trigger.type === 'custom') {\n return `custom:${trigger.name}`;\n }\n return trigger as string;\n}\n\n// ============================================================================\n// Server-Side: Island Rendering\n// ============================================================================\n\n/**\n * UI framework adapter for island rendering\n */\nexport interface IslandRenderAdapter {\n /** Framework name */\n name: string;\n /** Render component to HTML */\n renderToString(component: unknown, props: Record<string, unknown>): Promise<string>;\n /** Get CSS if any */\n getCSS?(component: unknown): string;\n}\n\nlet globalAdapter: IslandRenderAdapter | null = null;\n\n/**\n * Set the global island render adapter\n */\nexport function setIslandAdapter(adapter: IslandRenderAdapter): void {\n globalAdapter = adapter;\n}\n\n/**\n * Render an island to HTML with hydration markers\n */\nexport async function renderIsland<P extends Record<string, unknown>>(\n island: Island<P>,\n adapter?: IslandRenderAdapter\n): Promise<RenderedIsland> {\n const renderAdapter = adapter || globalAdapter;\n\n if (!renderAdapter) {\n throw new Error(\n '[Flight Islands] No render adapter set. Call setIslandAdapter() or pass adapter to renderIsland().'\n );\n }\n\n const { config, props, instanceId } = island;\n\n // Render component to HTML\n const componentHtml = await renderAdapter.renderToString(config.component, props);\n const css = renderAdapter.getCSS?.(config.component);\n\n // Build island wrapper with data attributes\n const hydrateAttr = getHydrateAttr(config.hydrate);\n const propsJson = serializeProps(props);\n\n const html = `\n<flight-island \n data-island=\"${config.id}\"\n data-instance=\"${instanceId}\"\n data-hydrate=\"${hydrateAttr}\"\n ${config.mediaQuery ? `data-media=\"${config.mediaQuery}\"` : ''}\n ${config.clientEntry ? `data-entry=\"${config.clientEntry}\"` : ''}\n ${config.priority ? `data-priority=\"${config.priority}\"` : ''}\n>\n ${componentHtml}\n</flight-island>`;\n\n // Props script (inline for hydration)\n const propsScript = `<script type=\"application/json\" data-island-props=\"${instanceId}\">${propsJson}</script>`;\n\n return {\n html,\n id: config.id,\n instanceId,\n propsScript,\n css,\n };\n}\n\n/**\n * Render multiple islands and collect their outputs\n */\nexport async function renderIslands<P extends Record<string, unknown>>(\n islands: Island<P>[],\n adapter?: IslandRenderAdapter\n): Promise<{\n html: string;\n propsScripts: string;\n css: string;\n}> {\n const rendered = await Promise.all(\n islands.map(island => renderIsland(island, adapter))\n );\n\n return {\n html: rendered.map(r => r.html).join('\\n'),\n propsScripts: rendered.map(r => r.propsScript).join('\\n'),\n css: rendered.filter(r => r.css).map(r => r.css).join('\\n'),\n };\n}\n\n// ============================================================================\n// Client-Side: Island Hydration\n// ============================================================================\n\n/**\n * Create an island registry for client-side hydration\n */\nexport function createIslandRegistry(): IslandRegistry {\n const loaders = new Map<string, () => Promise<unknown>>();\n\n return {\n register(id: string, loader: () => Promise<unknown>) {\n loaders.set(id, loader);\n },\n get(id: string) {\n return loaders.get(id);\n },\n has(id: string) {\n return loaders.has(id);\n },\n };\n}\n\n// Global registry for convenience\nconst globalRegistry = createIslandRegistry();\n\n/**\n * Register an island component for client-side hydration\n */\nexport function registerIsland(id: string, loader: () => Promise<unknown>): void {\n globalRegistry.register(id, loader);\n}\n\n/**\n * Client-side hydration bootstrapper\n * Call this in your client entry point\n */\nexport function hydrateIslands(options?: HydrateOptions): void {\n const {\n root = typeof document !== 'undefined' ? document.body : null,\n registry = globalRegistry,\n onHydrate,\n onError,\n } = options || {};\n\n if (!root || typeof document === 'undefined') {\n console.warn('[Flight Islands] hydrateIslands called in non-browser environment');\n return;\n }\n\n // Find all island elements\n const islands = root.querySelectorAll<HTMLElement>('flight-island[data-island]');\n\n islands.forEach((element) => {\n const islandId = element.dataset.island!;\n const instanceId = element.dataset.instance!;\n const hydrateTrigger = element.dataset.hydrate as string;\n const mediaQuery = element.dataset.media;\n\n // Check if component is registered\n if (!registry.has(islandId)) {\n console.warn(`[Flight Islands] No component registered for island: ${islandId}`);\n return;\n }\n\n // Setup hydration based on trigger\n setupHydration(\n element,\n islandId,\n instanceId,\n hydrateTrigger,\n mediaQuery,\n registry,\n onHydrate,\n onError\n );\n });\n}\n\n/**\n * Setup hydration trigger for an island element\n */\nfunction setupHydration(\n element: HTMLElement,\n islandId: string,\n instanceId: string,\n trigger: string,\n mediaQuery: string | undefined,\n registry: IslandRegistry,\n onHydrate?: (id: string, instanceId: string, duration: number) => void,\n onError?: (id: string, error: Error) => void\n): void {\n const hydrate = async () => {\n const startTime = performance.now();\n\n try {\n // Load component\n const loader = registry.get(islandId)!;\n const module = await loader() as { default?: unknown };\n const Component = module.default || module;\n\n // Get props\n const propsScript = document.querySelector(`[data-island-props=\"${instanceId}\"]`);\n const props = propsScript ? JSON.parse(propsScript.textContent || '{}') : {};\n\n // Hydrate (framework-specific, emit event for now)\n element.dispatchEvent(new CustomEvent('flight:hydrate', {\n detail: { Component, props, islandId, instanceId },\n bubbles: true,\n }));\n\n // Mark as hydrated\n element.setAttribute('data-hydrated', 'true');\n\n const duration = performance.now() - startTime;\n onHydrate?.(islandId, instanceId, duration);\n\n } catch (error) {\n console.error(`[Flight Islands] Failed to hydrate ${islandId}:`, error);\n element.setAttribute('data-hydrate-error', 'true');\n onError?.(islandId, error as Error);\n }\n };\n\n // Skip if already hydrated\n if (element.hasAttribute('data-hydrated')) return;\n\n switch (trigger) {\n case 'load':\n // Immediate hydration\n hydrate();\n break;\n\n case 'idle':\n // When browser is idle\n if ('requestIdleCallback' in window) {\n (window as unknown as { requestIdleCallback: (cb: () => void, opts?: { timeout: number }) => void })\n .requestIdleCallback(() => hydrate(), { timeout: 2000 });\n } else {\n setTimeout(hydrate, 200);\n }\n break;\n\n case 'visible': {\n // When element enters viewport\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n observer.disconnect();\n hydrate();\n }\n });\n },\n { rootMargin: '50px' }\n );\n observer.observe(element);\n break;\n }\n\n case 'interaction': {\n // On first user interaction\n const events = ['click', 'focus', 'touchstart', 'mouseenter'];\n const onInteraction = () => {\n events.forEach(e => element.removeEventListener(e, onInteraction));\n hydrate();\n };\n events.forEach(e => element.addEventListener(e, onInteraction, { once: true, passive: true }));\n break;\n }\n\n case 'media':\n // When media query matches\n if (mediaQuery) {\n const mql = window.matchMedia(mediaQuery);\n const check = () => {\n if (mql.matches) {\n mql.removeEventListener('change', check);\n hydrate();\n }\n };\n if (mql.matches) {\n hydrate();\n } else {\n mql.addEventListener('change', check);\n }\n }\n break;\n\n case 'never':\n // Never hydrate\n break;\n\n default:\n // Custom trigger\n if (trigger.startsWith('custom:')) {\n // Custom triggers need manual setup\n element.dispatchEvent(new CustomEvent('flight:custom-hydrate', {\n detail: { hydrate, trigger: trigger.replace('custom:', '') },\n bubbles: true,\n }));\n }\n }\n}\n\n// ============================================================================\n// Utility: Framework-Specific Adapter Factories\n// These return adapters that users configure with their own framework imports\n// ============================================================================\n\n/**\n * Create a React island render adapter\n * \n * @example\n * ```typescript\n * import { renderToString } from 'react-dom/server';\n * import { createElement } from 'react';\n * \n * const reactAdapter = createReactIslandAdapter({\n * renderToString,\n * createElement,\n * });\n * ```\n */\nexport function createReactIslandAdapter(deps: {\n renderToString: (element: unknown) => string;\n createElement: (type: unknown, props?: unknown) => unknown;\n}): IslandRenderAdapter {\n return {\n name: 'react',\n async renderToString(component, props) {\n const element = deps.createElement(component, props);\n return deps.renderToString(element);\n },\n };\n}\n\n/**\n * Create a Preact island render adapter\n * \n * @example\n * ```typescript\n * import { renderToString } from 'preact-render-to-string';\n * import { h } from 'preact';\n * \n * const preactAdapter = createPreactIslandAdapter({\n * renderToString,\n * h,\n * });\n * ```\n */\nexport function createPreactIslandAdapter(deps: {\n renderToString: (element: unknown) => string;\n h: (type: unknown, props?: unknown) => unknown;\n}): IslandRenderAdapter {\n return {\n name: 'preact',\n async renderToString(component, props) {\n const element = deps.h(component, props);\n return deps.renderToString(element);\n },\n };\n}\n\n/**\n * Create a Vue island render adapter\n * \n * @example\n * ```typescript\n * import { renderToString, createSSRApp } from 'vue/server-renderer';\n * \n * const vueAdapter = createVueIslandAdapter({\n * renderToString,\n * createSSRApp,\n * });\n * ```\n */\nexport function createVueIslandAdapter(deps: {\n renderToString: (app: unknown) => Promise<string>;\n createSSRApp: (component: unknown, props?: unknown) => unknown;\n}): IslandRenderAdapter {\n return {\n name: 'vue',\n async renderToString(component, props) {\n const app = deps.createSSRApp(component, props);\n return deps.renderToString(app);\n },\n };\n}\n\n/**\n * Create a Solid island render adapter\n * \n * @example\n * ```typescript\n * import { renderToString } from 'solid-js/web';\n * \n * const solidAdapter = createSolidIslandAdapter({\n * renderToString,\n * });\n * ```\n */\nexport function createSolidIslandAdapter(deps: {\n renderToString: (fn: () => unknown) => string;\n}): IslandRenderAdapter {\n return {\n name: 'solid',\n async renderToString(component, props) {\n // Solid uses a function component pattern\n return deps.renderToString(() => (component as (p: unknown) => unknown)(props));\n },\n };\n}\n\n// ============================================================================\n// Custom Element Registration (optional)\n// ============================================================================\n\n/**\n * Register the flight-island custom element\n * This provides additional functionality like slot support\n */\nexport function registerFlightIslandElement(): void {\n if (typeof customElements === 'undefined') return;\n if (customElements.get('flight-island')) return;\n\n class FlightIsland extends HTMLElement {\n static get observedAttributes() {\n return ['data-hydrated', 'data-hydrate-error'];\n }\n\n connectedCallback() {\n // Could add loading indicator logic here\n }\n\n attributeChangedCallback(name: string, _oldValue: string, newValue: string) {\n if (name === 'data-hydrated' && newValue === 'true') {\n this.classList.add('hydrated');\n }\n if (name === 'data-hydrate-error' && newValue === 'true') {\n this.classList.add('hydrate-error');\n }\n }\n }\n\n customElements.define('flight-island', FlightIsland);\n}\n"]}
@@ -160,5 +160,5 @@ function createStaticResponse(html, options) {
160
160
  }
161
161
 
162
162
  export { DEFAULT_BOT_PATTERNS, addStreamingHeaders, createConditionalStreamer, createStaticResponse, createStreamingResponse, isBot, isSlowConnection, prefersNoStream, streamIf, supportsStreaming };
163
- //# sourceMappingURL=chunk-XOIYNY4I.js.map
164
- //# sourceMappingURL=chunk-XOIYNY4I.js.map
163
+ //# sourceMappingURL=chunk-VNO2YUVD.js.map
164
+ //# sourceMappingURL=chunk-VNO2YUVD.js.map