@flight-framework/core 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +541 -541
  3. package/dist/actions/index.js +1 -1
  4. package/dist/adapters/index.d.ts +138 -1
  5. package/dist/adapters/index.js +1 -1
  6. package/dist/cache/index.js +1 -1
  7. package/dist/{chunk-3UQJE3XZ.js → chunk-2F2QU6RC.js} +2 -2
  8. package/dist/chunk-2F2QU6RC.js.map +1 -0
  9. package/dist/{chunk-4U7CJVNQ.js → chunk-3KRBRSRJ.js} +2 -2
  10. package/dist/chunk-3KRBRSRJ.js.map +1 -0
  11. package/dist/{chunk-OZ3EXPLE.js → chunk-3QP3E7HS.js} +2 -2
  12. package/dist/chunk-3QP3E7HS.js.map +1 -0
  13. package/dist/{chunk-CKJHJPKQ.js → chunk-62C7LX2E.js} +2 -2
  14. package/dist/chunk-62C7LX2E.js.map +1 -0
  15. package/dist/{chunk-YNTMYL36.js → chunk-6BDCTUQY.js} +3 -3
  16. package/dist/chunk-6BDCTUQY.js.map +1 -0
  17. package/dist/{chunk-KDEA64UX.js → chunk-EGB7C73X.js} +5 -5
  18. package/dist/chunk-EGB7C73X.js.map +1 -0
  19. package/dist/{chunk-2JVEH76V.js → chunk-FSJNOPYE.js} +3 -3
  20. package/dist/chunk-FSJNOPYE.js.map +1 -0
  21. package/dist/{chunk-ARBKF6VI.js → chunk-GCQZ4FHI.js} +2 -2
  22. package/dist/{chunk-ARBKF6VI.js.map → chunk-GCQZ4FHI.js.map} +1 -1
  23. package/dist/{chunk-EHVUAFNH.js → chunk-IXMD5QH2.js} +2 -2
  24. package/dist/chunk-IXMD5QH2.js.map +1 -0
  25. package/dist/{chunk-6GI6HFSQ.js → chunk-K2CQZPCG.js} +2 -2
  26. package/dist/chunk-K2CQZPCG.js.map +1 -0
  27. package/dist/chunk-K5NYYNFS.js +311 -0
  28. package/dist/chunk-K5NYYNFS.js.map +1 -0
  29. package/dist/{chunk-6IG6XIXU.js → chunk-LNV47HGV.js} +2 -2
  30. package/dist/chunk-LNV47HGV.js.map +1 -0
  31. package/dist/{chunk-65JYF3DJ.js → chunk-MDQNNIHH.js} +2 -2
  32. package/dist/chunk-MDQNNIHH.js.map +1 -0
  33. package/dist/{chunk-GNS2FGPC.js → chunk-MQQLYWZZ.js} +2 -2
  34. package/dist/chunk-MQQLYWZZ.js.map +1 -0
  35. package/dist/{chunk-LAKHYTHL.js → chunk-NWMJYTMB.js} +3 -3
  36. package/dist/chunk-NWMJYTMB.js.map +1 -0
  37. package/dist/{chunk-R7MEVVA4.js → chunk-OYF2OAKS.js} +2 -2
  38. package/dist/chunk-OYF2OAKS.js.map +1 -0
  39. package/dist/{chunk-FRAH5QNY.js → chunk-P6WSBVDT.js} +4 -4
  40. package/dist/chunk-P6WSBVDT.js.map +1 -0
  41. package/dist/{chunk-5XHOLZBJ.js → chunk-PDW5WCMW.js} +2 -2
  42. package/dist/chunk-PDW5WCMW.js.map +1 -0
  43. package/dist/{chunk-A2QRUBVE.js → chunk-PVUMB632.js} +2 -2
  44. package/dist/chunk-PVUMB632.js.map +1 -0
  45. package/dist/{chunk-LKOPJ3GS.js → chunk-R7SQAREQ.js} +2 -2
  46. package/dist/chunk-R7SQAREQ.js.map +1 -0
  47. package/dist/{chunk-CNY3ZUVG.js → chunk-RSVA2EYO.js} +2 -2
  48. package/dist/chunk-RSVA2EYO.js.map +1 -0
  49. package/dist/{chunk-PAVI5W6M.js → chunk-T4Z4HM4W.js} +3 -3
  50. package/dist/chunk-T4Z4HM4W.js.map +1 -0
  51. package/dist/{chunk-HNPO6LFW.js → chunk-TASAT7KB.js} +2 -2
  52. package/dist/chunk-TASAT7KB.js.map +1 -0
  53. package/dist/{chunk-3N5ZBVZJ.js → chunk-VPFMHGEV.js} +2 -2
  54. package/dist/chunk-VPFMHGEV.js.map +1 -0
  55. package/dist/{chunk-A4TKWQBU.js → chunk-W6D62JCI.js} +2 -2
  56. package/dist/chunk-W6D62JCI.js.map +1 -0
  57. package/dist/{chunk-UFWGOJL7.js → chunk-WFAWAHJH.js} +2 -2
  58. package/dist/chunk-WFAWAHJH.js.map +1 -0
  59. package/dist/{chunk-NZS2YJ43.js → chunk-WOEIJWGJ.js} +2 -2
  60. package/dist/chunk-WOEIJWGJ.js.map +1 -0
  61. package/dist/{chunk-VNO2YUVD.js → chunk-XOIYNY4I.js} +2 -2
  62. package/dist/chunk-XOIYNY4I.js.map +1 -0
  63. package/dist/{chunk-PO7IHPFF.js → chunk-XSY5AAXT.js} +2 -2
  64. package/dist/chunk-XSY5AAXT.js.map +1 -0
  65. package/dist/{chunk-OZBPR27I.js → chunk-YHEVHRLH.js} +2 -2
  66. package/dist/chunk-YHEVHRLH.js.map +1 -0
  67. package/dist/{chunk-XU6MRYG2.js → chunk-ZIE56LCA.js} +3 -3
  68. package/dist/chunk-ZIE56LCA.js.map +1 -0
  69. package/dist/{chunk-B2LPSCES.js → chunk-ZVC3ZWLM.js} +2 -2
  70. package/dist/chunk-ZVC3ZWLM.js.map +1 -0
  71. package/dist/client.js +8 -8
  72. package/dist/client.js.map +1 -1
  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.js +11 -11
  94. package/dist/rsc/legacy.js +1 -1
  95. package/dist/rsc/payload.js +1 -1
  96. package/dist/rsc/plugins/esbuild.js +2 -2
  97. package/dist/rsc/plugins/index.js +4 -4
  98. package/dist/rsc/plugins/rollup.js +2 -2
  99. package/dist/rsc/renderer.js +3 -3
  100. package/dist/rsc/stream.js +1 -1
  101. package/dist/rsc/vite-plugin.js +2 -2
  102. package/dist/server/index.js +4 -4
  103. package/dist/streaming/adapters/index.js +1 -1
  104. package/dist/streaming/conditional.js +1 -1
  105. package/dist/streaming/index.js +1 -1
  106. package/dist/streaming/observability.js +2 -2
  107. package/dist/streaming/priority.js +1 -1
  108. package/dist/utils/index.js +1 -1
  109. package/package.json +1 -1
  110. package/dist/chunk-2JVEH76V.js.map +0 -1
  111. package/dist/chunk-3N5ZBVZJ.js.map +0 -1
  112. package/dist/chunk-3UQJE3XZ.js.map +0 -1
  113. package/dist/chunk-4U7CJVNQ.js.map +0 -1
  114. package/dist/chunk-5XHOLZBJ.js.map +0 -1
  115. package/dist/chunk-65JYF3DJ.js.map +0 -1
  116. package/dist/chunk-6GI6HFSQ.js.map +0 -1
  117. package/dist/chunk-6IG6XIXU.js.map +0 -1
  118. package/dist/chunk-A2QRUBVE.js.map +0 -1
  119. package/dist/chunk-A4TKWQBU.js.map +0 -1
  120. package/dist/chunk-B2LPSCES.js.map +0 -1
  121. package/dist/chunk-CKJHJPKQ.js.map +0 -1
  122. package/dist/chunk-CNY3ZUVG.js.map +0 -1
  123. package/dist/chunk-EHVUAFNH.js.map +0 -1
  124. package/dist/chunk-FRAH5QNY.js.map +0 -1
  125. package/dist/chunk-GNS2FGPC.js.map +0 -1
  126. package/dist/chunk-HNPO6LFW.js.map +0 -1
  127. package/dist/chunk-KDEA64UX.js.map +0 -1
  128. package/dist/chunk-LAKHYTHL.js.map +0 -1
  129. package/dist/chunk-LKOPJ3GS.js.map +0 -1
  130. package/dist/chunk-NZS2YJ43.js.map +0 -1
  131. package/dist/chunk-OZ3EXPLE.js.map +0 -1
  132. package/dist/chunk-OZBPR27I.js.map +0 -1
  133. package/dist/chunk-PAVI5W6M.js.map +0 -1
  134. package/dist/chunk-PO7IHPFF.js.map +0 -1
  135. package/dist/chunk-QK6UEQ75.js +0 -13
  136. package/dist/chunk-QK6UEQ75.js.map +0 -1
  137. package/dist/chunk-R7MEVVA4.js.map +0 -1
  138. package/dist/chunk-UFWGOJL7.js.map +0 -1
  139. package/dist/chunk-VNO2YUVD.js.map +0 -1
  140. package/dist/chunk-XU6MRYG2.js.map +0 -1
  141. package/dist/chunk-YNTMYL36.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rsc/payload.ts"],"names":[],"mappings":"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","file":"chunk-6GI6HFSQ.js","sourcesContent":["/**\n * @flight-framework/core - Flight Payload System\n * \n * Formato de serialización agnóstico para Server Components.\n * Diseñado para máxima debuggabilidad y compatibilidad multi-framework.\n * \n * Filosofía Flight:\n * - Formato documentado y abierto (NDJSON)\n * - No depende de internals de React\n * - Extensible para cualquier UI framework\n * - Zero vendor lock-in\n * \n * @module @flight-framework/core/rsc/payload\n */\n\n// ============================================================================\n// Chunk Types - El corazón del streaming protocol\n// ============================================================================\n\n/**\n * Union type de todos los chunks que pueden enviarse en un FlightStream\n */\nexport type FlightChunk =\n | ServerComponentChunk\n | ClientReferenceChunk\n | ServerReferenceChunk\n | ErrorBoundaryChunk\n | HintChunk\n | MetaChunk;\n\n/**\n * Chunk de Server Component renderizado\n * Contiene el árbol virtual de elementos\n */\nexport interface ServerComponentChunk {\n /** Discriminator */\n readonly type: 'S';\n /** Unique chunk ID */\n readonly id: string;\n /** Virtual element tree */\n readonly tree: FlightElement;\n /** IDs de chunks que este depende (para streaming ordenado) */\n readonly awaiting?: readonly string[];\n /** Timestamp para debugging/observability */\n readonly ts?: number;\n}\n\n/**\n * Referencia a un Client Component\n * El cliente cargará el módulo y lo hidratará\n */\nexport interface ClientReferenceChunk {\n /** Discriminator */\n readonly type: 'C';\n /** Reference ID */\n readonly id: string;\n /** Module specifier (relativo al manifest) */\n readonly module: string;\n /** Export name */\n readonly export: string;\n /** Serialized props */\n readonly props: SerializedValue;\n /** Fallback HTML para SSR (opcional) */\n readonly fallback?: string;\n}\n\n/**\n * Referencia a una Server Function (Action)\n * El cliente la invocará via RPC\n */\nexport interface ServerReferenceChunk {\n /** Discriminator */\n readonly type: 'A';\n /** Action ID */\n readonly id: string;\n /** Bound arguments (pre-bound via .bind()) */\n readonly bound?: readonly SerializedValue[];\n}\n\n/**\n * Error en un boundary específico\n */\nexport interface ErrorBoundaryChunk {\n /** Discriminator */\n readonly type: 'E';\n /** Boundary ID where error occurred */\n readonly boundary: string;\n /** Safe error message for client */\n readonly message: string;\n /** Error digest for server-side correlation */\n readonly digest: string;\n /** Component stack for development */\n readonly stack?: string;\n}\n\n/**\n * Hints para el cliente (preload, prefetch, etc.)\n */\nexport interface HintChunk {\n /** Discriminator */\n readonly type: 'H';\n /** Hint type */\n readonly hint: 'preload' | 'prefetch' | 'dns-prefetch' | 'preconnect' | 'modulepreload';\n /** Resource URL */\n readonly href: string;\n /** Resource type (for preload) */\n readonly as?: 'script' | 'style' | 'image' | 'font' | 'fetch';\n /** Crossorigin attribute */\n readonly crossorigin?: 'anonymous' | 'use-credentials';\n}\n\n/**\n * Metadata chunk (para SSR head injection)\n */\nexport interface MetaChunk {\n /** Discriminator */\n readonly type: 'M';\n /** Meta type */\n readonly meta: 'title' | 'description' | 'og' | 'twitter' | 'link' | 'script';\n /** Content */\n readonly content: string | Record<string, string>;\n}\n\n// ============================================================================\n// Flight Element - Virtual DOM agnóstico\n// ============================================================================\n\n/**\n * Virtual element que puede representar cualquier UI framework\n */\nexport type FlightElement =\n | FlightHostElement\n | FlightTextElement\n | FlightFragmentElement\n | FlightSuspenseElement\n | FlightClientElement\n | FlightLazyElement\n | FlightNullElement;\n\n/**\n * Host element (div, span, etc.)\n */\nexport interface FlightHostElement {\n readonly $$type: 'host';\n readonly tag: string;\n readonly key?: string | number;\n readonly props: Readonly<Record<string, SerializedValue>>;\n readonly children: readonly FlightElement[];\n}\n\n/**\n * Text node\n */\nexport interface FlightTextElement {\n readonly $$type: 'text';\n readonly value: string;\n}\n\n/**\n * Fragment (multiple children, no wrapper)\n */\nexport interface FlightFragmentElement {\n readonly $$type: 'fragment';\n readonly children: readonly FlightElement[];\n}\n\n/**\n * Suspense boundary\n */\nexport interface FlightSuspenseElement {\n readonly $$type: 'suspense';\n readonly id: string;\n readonly fallback: FlightElement;\n readonly children: readonly FlightElement[];\n}\n\n/**\n * Client component reference\n */\nexport interface FlightClientElement {\n readonly $$type: 'client';\n /** Reference to ClientReferenceChunk ID */\n readonly ref: string;\n /** Pre-rendered fallback HTML */\n readonly ssr?: string;\n}\n\n/**\n * Lazy/async element (pending resolution)\n */\nexport interface FlightLazyElement {\n readonly $$type: 'lazy';\n readonly id: string;\n readonly fallback?: FlightElement;\n}\n\n/**\n * Null/empty element\n */\nexport interface FlightNullElement {\n readonly $$type: 'null';\n}\n\n// ============================================================================\n// Serializable Values\n// ============================================================================\n\n/**\n * Valores que pueden cruzar el boundary server/client\n */\nexport type SerializedValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | readonly SerializedValue[]\n | { readonly [key: string]: SerializedValue }\n | SerializedSpecialValue;\n\n/**\n * Tipos especiales que requieren serialización custom\n */\nexport interface SerializedSpecialValue {\n readonly $$flight: SpecialValueType;\n readonly value: string | readonly unknown[];\n}\n\nexport type SpecialValueType =\n | 'date'\n | 'bigint'\n | 'map'\n | 'set'\n | 'undefined'\n | 'symbol'\n | 'regexp'\n | 'url'\n | 'error'\n | 'formdata'\n | 'blob'\n | 'arraybuffer';\n\n// ============================================================================\n// Serialization Functions\n// ============================================================================\n\n/**\n * Serializa un valor para transmisión a través de FlightStream\n */\nexport function serialize(value: unknown): SerializedValue {\n return serializeValue(value, new WeakSet());\n}\n\nfunction serializeValue(value: unknown, seen: WeakSet<object>): SerializedValue {\n // Primitives\n if (value === null) return null;\n if (value === undefined) return { $$flight: 'undefined', value: '' };\n if (typeof value === 'string') return value;\n if (typeof value === 'number') {\n if (Number.isNaN(value)) return { $$flight: 'undefined', value: 'NaN' };\n if (!Number.isFinite(value)) return { $$flight: 'undefined', value: value > 0 ? 'Infinity' : '-Infinity' };\n return value;\n }\n if (typeof value === 'boolean') return value;\n if (typeof value === 'bigint') return { $$flight: 'bigint', value: value.toString() };\n if (typeof value === 'symbol') return { $$flight: 'symbol', value: value.description ?? '' };\n\n // Functions cannot be serialized\n if (typeof value === 'function') {\n throw new FlightSerializationError(\n 'Functions cannot be passed from Server to Client Components. ' +\n 'If you need to pass a function, use a Server Action instead.'\n );\n }\n\n // Circular reference detection\n if (typeof value === 'object') {\n if (seen.has(value)) {\n throw new FlightSerializationError('Circular references are not supported in Flight payloads.');\n }\n seen.add(value);\n }\n\n // Special objects\n if (value instanceof Date) {\n return { $$flight: 'date', value: value.toISOString() };\n }\n if (value instanceof RegExp) {\n return { $$flight: 'regexp', value: value.toString() };\n }\n if (value instanceof URL) {\n return { $$flight: 'url', value: value.href };\n }\n if (value instanceof Map) {\n const entries: [SerializedValue, SerializedValue][] = [];\n for (const [k, v] of value) {\n entries.push([serializeValue(k, seen), serializeValue(v, seen)]);\n }\n return { $$flight: 'map', value: entries as unknown as string };\n }\n if (value instanceof Set) {\n const items: SerializedValue[] = [];\n for (const v of value) {\n items.push(serializeValue(v, seen));\n }\n return { $$flight: 'set', value: items as unknown as string };\n }\n if (value instanceof Error) {\n return {\n $$flight: 'error',\n value: JSON.stringify({ name: value.name, message: value.message })\n };\n }\n\n // Arrays\n if (Array.isArray(value)) {\n return value.map(v => serializeValue(v, seen));\n }\n\n // Plain objects\n if (isPlainObject(value)) {\n const result: Record<string, SerializedValue> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = serializeValue(v, seen);\n }\n return result;\n }\n\n // Unknown object type - try JSON serialization\n try {\n return JSON.parse(JSON.stringify(value)) as SerializedValue;\n } catch {\n throw new FlightSerializationError(\n `Cannot serialize value of type ${value?.constructor?.name ?? typeof value}. ` +\n 'Only serializable values can be passed to Client Components.'\n );\n }\n}\n\n/**\n * Deserializa un valor recibido de FlightStream\n */\nexport function deserialize<T = unknown>(value: SerializedValue): T {\n return deserializeValue(value) as T;\n}\n\nfunction deserializeValue(value: SerializedValue): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n // Special values\n if (isSpecialValue(value)) {\n switch (value.$$flight) {\n case 'undefined':\n if (value.value === 'NaN') return NaN;\n if (value.value === 'Infinity') return Infinity;\n if (value.value === '-Infinity') return -Infinity;\n return undefined;\n case 'date':\n return new Date(value.value as string);\n case 'bigint':\n return BigInt(value.value as string);\n case 'symbol':\n return Symbol(value.value as string);\n case 'regexp': {\n const match = (value.value as string).match(/^\\/(.*)\\/([gimsuy]*)$/);\n if (match) return new RegExp(match[1]!, match[2]);\n return new RegExp(value.value as string);\n }\n case 'url':\n return new URL(value.value as string);\n case 'map':\n return new Map((value.value as unknown as [SerializedValue, SerializedValue][])\n .map(([k, v]) => [deserializeValue(k), deserializeValue(v)]));\n case 'set':\n return new Set((value.value as unknown as SerializedValue[])\n .map(v => deserializeValue(v)));\n case 'error': {\n const { name, message } = JSON.parse(value.value as string);\n const error = new Error(message);\n error.name = name;\n return error;\n }\n }\n }\n\n // Arrays\n if (Array.isArray(value)) {\n return value.map(deserializeValue);\n }\n\n // Objects\n if (typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = deserializeValue(v);\n }\n return result;\n }\n\n return value;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === null || proto === Object.prototype;\n}\n\nfunction isSpecialValue(value: unknown): value is SerializedSpecialValue {\n return typeof value === 'object' && value !== null && '$$flight' in value;\n}\n\n// ============================================================================\n// Flight Element Builders\n// ============================================================================\n\n/**\n * Create a host element\n */\nexport function h(\n tag: string,\n props: Record<string, unknown> | null,\n ...children: unknown[]\n): FlightHostElement {\n const serializedProps: Record<string, SerializedValue> = {};\n\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n if (key !== 'children') {\n serializedProps[key] = serialize(value);\n }\n }\n }\n\n return {\n $$type: 'host',\n tag,\n props: serializedProps,\n children: children.flat().map(child => toFlightElement(child)),\n };\n}\n\n/**\n * Create a text element\n */\nexport function text(value: string): FlightTextElement {\n return { $$type: 'text', value };\n}\n\n/**\n * Create a fragment\n */\nexport function fragment(...children: unknown[]): FlightFragmentElement {\n return {\n $$type: 'fragment',\n children: children.flat().map(child => toFlightElement(child)),\n };\n}\n\n/**\n * Create a suspense boundary\n */\nexport function suspense(\n id: string,\n fallback: FlightElement,\n children: FlightElement[]\n): FlightSuspenseElement {\n return { $$type: 'suspense', id, fallback, children };\n}\n\n/**\n * Create a client component reference\n */\nexport function clientRef(refId: string, ssrHtml?: string): FlightClientElement {\n return { $$type: 'client', ref: refId, ssr: ssrHtml };\n}\n\n/**\n * Convert any value to a FlightElement\n */\nexport function toFlightElement(value: unknown): FlightElement {\n if (value === null || value === undefined || typeof value === 'boolean') {\n return { $$type: 'null' };\n }\n if (typeof value === 'string' || typeof value === 'number') {\n return { $$type: 'text', value: String(value) };\n }\n if (isFlightElement(value)) {\n return value;\n }\n // Unknown - render as null\n return { $$type: 'null' };\n}\n\n/**\n * Type guard for FlightElement\n */\nexport function isFlightElement(value: unknown): value is FlightElement {\n return typeof value === 'object' && value !== null && '$$type' in value;\n}\n\n// ============================================================================\n// Chunk Builders\n// ============================================================================\n\nlet chunkIdCounter = 0;\n\n/**\n * Generate unique chunk ID\n */\nexport function generateChunkId(prefix = 'c'): string {\n return `${prefix}${chunkIdCounter++}`;\n}\n\n/**\n * Reset chunk ID counter (for testing)\n */\nexport function resetChunkIdCounter(): void {\n chunkIdCounter = 0;\n}\n\n/**\n * Create a server component chunk\n */\nexport function createServerChunk(\n id: string,\n tree: FlightElement,\n awaiting?: string[]\n): ServerComponentChunk {\n return {\n type: 'S',\n id,\n tree,\n awaiting,\n ts: Date.now(),\n };\n}\n\n/**\n * Create a client reference chunk\n */\nexport function createClientChunk(\n id: string,\n module: string,\n exportName: string,\n props: unknown,\n fallback?: string\n): ClientReferenceChunk {\n return {\n type: 'C',\n id,\n module,\n export: exportName,\n props: serialize(props),\n fallback,\n };\n}\n\n/**\n * Create a server reference (action) chunk\n */\nexport function createActionChunk(\n id: string,\n boundArgs?: unknown[]\n): ServerReferenceChunk {\n return {\n type: 'A',\n id,\n bound: boundArgs?.map(serialize),\n };\n}\n\n/**\n * Create an error chunk\n */\nexport function createErrorChunk(\n boundary: string,\n error: Error,\n includeStack = false\n): ErrorBoundaryChunk {\n return {\n type: 'E',\n boundary,\n message: error.message,\n digest: generateErrorDigest(error),\n stack: includeStack ? error.stack : undefined,\n };\n}\n\n/**\n * Create a hint chunk\n */\nexport function createHintChunk(\n hint: HintChunk['hint'],\n href: string,\n options?: { as?: HintChunk['as']; crossorigin?: HintChunk['crossorigin'] }\n): HintChunk {\n return {\n type: 'H',\n hint,\n href,\n ...options,\n };\n}\n\n/**\n * Generate error digest for correlation\n */\nfunction generateErrorDigest(error: Error): string {\n const str = `${error.name}:${error.message}:${Date.now()}`;\n // Simple hash for digest\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;\n }\n return Math.abs(hash).toString(36);\n}\n\n// ============================================================================\n// Custom Errors\n// ============================================================================\n\n/**\n * Error thrown during serialization\n */\nexport class FlightSerializationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FlightSerializationError';\n }\n}\n\n/**\n * Error thrown during payload processing\n */\nexport class FlightPayloadError extends Error {\n constructor(message: string, public readonly chunk?: FlightChunk) {\n super(message);\n this.name = 'FlightPayloadError';\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rsc/legacy.ts"],"names":[],"mappings":"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","file":"chunk-6IG6XIXU.js","sourcesContent":["/**\n * @flight-framework/core - Legacy RSC Support\n * \n * Backward compatibility module for the original RSC implementation.\n * Use the new API from './index.js' for new features.\n * \n * @deprecated Use the new RSC API instead\n * @module @flight-framework/core/rsc/legacy\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Component rendering context\n * @deprecated Use ServerContext from './context.js' instead\n */\nexport interface RenderContext {\n /** Current request */\n request: Request;\n /** Route params */\n params: Record<string, string>;\n /** Search params */\n searchParams: URLSearchParams;\n /** Request headers */\n headers: Headers;\n /** Cookies */\n cookies: Map<string, string>;\n}\n\n/**\n * Server component definition\n * @deprecated Use ServerComponentFn from './index.js' instead\n */\nexport interface ServerComponent<P = unknown> {\n (props: P, context: RenderContext): Promise<string> | string;\n /** Mark as server component */\n __flight_server?: true;\n /** Dependencies for hydration */\n __flight_deps?: string[];\n}\n\n/**\n * Client component definition\n * @deprecated Use ClientReference from './boundaries.js' instead\n */\nexport interface ClientComponent<P = unknown> {\n (props: P): unknown;\n /** Mark as client component */\n __flight_client?: true;\n /** Client bundle path */\n __flight_bundle?: string;\n}\n\n/**\n * Component type detection\n */\nexport type ComponentType = 'server' | 'client' | 'hybrid';\n\n// ============================================================================\n// Server Component Execution\n// ============================================================================\n\n/**\n * Execute an async server component\n * @deprecated Use the new rendering pipeline instead\n */\nexport async function executeServerComponent<P>(\n component: ServerComponent<P>,\n props: P,\n context: RenderContext\n): Promise<string> {\n try {\n const result = await component(props, context);\n return result;\n } catch (error) {\n console.error('[Flight] Server component error:', error);\n throw error;\n }\n}\n\n/**\n * Create a render context from a Request\n * @deprecated Use createServerContext from './context.js' instead\n */\nexport function createRenderContext(request: Request, params: Record<string, string> = {}): RenderContext {\n const url = new URL(request.url);\n\n // Parse cookies\n const cookies = new Map<string, string>();\n const cookieHeader = request.headers.get('cookie') || '';\n cookieHeader.split(';').forEach(cookie => {\n const [key, value] = cookie.trim().split('=');\n if (key && value) cookies.set(key, value);\n });\n\n return {\n request,\n params,\n searchParams: url.searchParams,\n headers: request.headers,\n cookies,\n };\n}\n\n// ============================================================================\n// Data Fetching Helpers\n// ============================================================================\n\n/**\n * Cache for server-side fetch requests\n */\nconst fetchCache = new Map<string, { data: unknown; timestamp: number }>();\n\n/**\n * Server-side fetch with automatic caching\n */\nexport async function serverFetch<T>(\n url: string,\n options: RequestInit & {\n revalidate?: number | false;\n tags?: string[];\n } = {}\n): Promise<T> {\n const { revalidate = 60, ...fetchOptions } = options;\n const cacheKey = `${url}:${JSON.stringify(fetchOptions)}`;\n\n // Check cache\n const cached = fetchCache.get(cacheKey);\n if (cached) {\n const age = Date.now() - cached.timestamp;\n if (revalidate === false || age < (revalidate * 1000)) {\n return cached.data as T;\n }\n }\n\n // Fetch fresh data\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n throw new Error(`Fetch failed: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Cache the result\n if (revalidate !== false) {\n fetchCache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n });\n }\n\n return data as T;\n}\n\n/**\n * Invalidate cache by tag\n */\nexport function revalidateTag(tag: string): void {\n console.log(`[Flight] Revalidating tag: ${tag}`);\n}\n\n/**\n * Invalidate cache by path\n */\nexport function revalidatePath(path: string): void {\n console.log(`[Flight] Revalidating path: ${path}`);\n}\n\n// ============================================================================\n// Component Serialization\n// ============================================================================\n\n/**\n * Serialize props for transmission to client\n * @deprecated Use serialize from './payload.js' instead\n */\nexport function serializeProps(props: unknown): string {\n function preProcess(value: unknown): unknown {\n if (value instanceof Date) {\n return { __type: 'Date', value: value.toISOString() };\n }\n if (value instanceof Map) {\n return { __type: 'Map', value: Array.from(value.entries()).map(([k, v]) => [preProcess(k), preProcess(v)]) };\n }\n if (value instanceof Set) {\n return { __type: 'Set', value: Array.from(value).map(preProcess) };\n }\n if (typeof value === 'bigint') {\n return { __type: 'BigInt', value: value.toString() };\n }\n if (typeof value === 'function') {\n return undefined;\n }\n if (Array.isArray(value)) {\n return value.map(preProcess);\n }\n if (value && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = preProcess(v);\n }\n return result;\n }\n return value;\n }\n\n return JSON.stringify(preProcess(props));\n}\n\n/**\n * Deserialize props on client\n * @deprecated Use deserialize from './payload.js' instead\n */\nexport function deserializeProps<T>(serialized: string): T {\n return JSON.parse(serialized, (_key, value) => {\n if (value && typeof value === 'object' && '__type' in value) {\n switch (value.__type) {\n case 'Date':\n return new Date(value.value);\n case 'Map':\n return new Map(value.value);\n case 'Set':\n return new Set(value.value);\n case 'BigInt':\n return BigInt(value.value);\n }\n }\n return value;\n });\n}\n\n// ============================================================================\n// Client Component Boundary\n// ============================================================================\n\n/**\n * Create a client boundary placeholder\n * @deprecated Use clientRef from './payload.js' instead\n */\nexport function createClientBoundary(\n componentId: string,\n props: unknown,\n fallback?: string\n): string {\n const serializedProps = serializeProps(props);\n\n return `\n<!--flight-client:${componentId}-->\n<div data-flight-component=\"${componentId}\" data-flight-props='${serializedProps.replace(/'/g, \"&#39;\")}'>\n ${fallback || '<div>Loading...</div>'}\n</div>\n<!--/flight-client-->\n<script type=\"module\">\n(async function() {\n const component = await import('/_flight/components/${componentId}.js');\n const props = JSON.parse('${serializedProps.replace(/'/g, \"\\\\'\")}');\n const container = document.querySelector('[data-flight-component=\"${componentId}\"]');\n if (container && component.default) {\n if (typeof component.hydrate === 'function') {\n component.hydrate(container, props);\n }\n }\n})();\n</script>`;\n}\n\n// ============================================================================\n// Async Component Helpers\n// ============================================================================\n\n/**\n * Helper to create an async server component\n * @deprecated Use async Server Components directly\n */\nexport function createAsyncComponent<P, T>(\n fetcher: (props: P, context: RenderContext) => Promise<T>,\n renderer: (data: T, props: P) => string\n): ServerComponent<P> {\n const component: ServerComponent<P> = async (props, context) => {\n const data = await fetcher(props, context);\n return renderer(data, props);\n };\n component.__flight_server = true;\n return component;\n}\n\n/**\n * Compose multiple server components\n * @deprecated Use Promise.all with async components\n */\nexport function composeComponents(\n ...components: Array<() => Promise<string> | string>\n): () => Promise<string> {\n return async () => {\n const results = await Promise.all(\n components.map(async (comp) => await comp())\n );\n return results.join('');\n };\n}\n\n// ============================================================================\n// Error Boundary for Server Components\n// ============================================================================\n\n/**\n * Options for async error boundary\n */\nexport interface AsyncErrorBoundaryOptions<P, R> {\n /** Fallback to render on error */\n fallback: (error: Error, props: P) => R;\n /** Optional callback when error occurs */\n onError?: (error: Error, props: P, context: RenderContext) => void;\n /** Whether to rethrow certain errors (e.g., redirects, not found) */\n rethrowNavigation?: boolean;\n}\n\n/**\n * Wrap an async server component with comprehensive error handling.\n *\n * @example\n * ```typescript\n * const SafeUserPage = withAsyncErrorBoundary(UserPage, {\n * fallback: (error, props) => `<div>Error loading user ${props.id}</div>`,\n * onError: (error, props) => console.error(`Failed to load user ${props.id}:`, error),\n * rethrowNavigation: true,\n * });\n * ```\n */\nexport function withAsyncErrorBoundary<P, R = string>(\n component: (props: P, context: RenderContext) => Promise<R> | R,\n options: AsyncErrorBoundaryOptions<P, R>\n): (props: P, context: RenderContext) => Promise<R> {\n const { fallback, onError, rethrowNavigation = true } = options;\n\n return async (props: P, context: RenderContext): Promise<R> => {\n try {\n return await component(props, context);\n } catch (error) {\n // Rethrow navigation errors if configured\n if (rethrowNavigation) {\n if (isNotFoundError(error)) {\n throw error;\n }\n if (isRedirectError(error)) {\n throw error;\n }\n }\n\n // Call error callback if provided\n if (onError) {\n try {\n onError(error as Error, props, context);\n } catch (callbackError) {\n console.error('[Flight] Error in onError callback:', callbackError);\n }\n }\n\n // Log error\n console.error('[Flight] Async component error:', error);\n\n // Return fallback\n return fallback(error as Error, props);\n }\n };\n}\n\n/**\n * Wrap a server component with error handling\n * @deprecated Use withAsyncErrorBoundary instead\n */\nexport function withErrorBoundary<P>(\n component: ServerComponent<P>,\n errorFallback: (error: Error) => string\n): ServerComponent<P> {\n return async (props: P, context: RenderContext) => {\n try {\n return await component(props, context);\n } catch (error) {\n console.error('[Flight] Server component error:', error);\n return errorFallback(error as Error);\n }\n };\n}\n\n// ============================================================================\n// Not Found / Redirect Helpers\n// ============================================================================\n\n/**\n * Throw a not found error\n * @deprecated Use notFound from './context.js' instead\n */\nexport function notFound(): never {\n const error = new Error('Not Found');\n (error as Error & { __flight_not_found: boolean }).__flight_not_found = true;\n throw error;\n}\n\n/**\n * Check if error is not found\n * @deprecated Use isNotFoundError from './context.js' instead\n */\nexport function isNotFoundError(error: unknown): boolean {\n return error instanceof Error && (error as Error & { __flight_not_found?: boolean }).__flight_not_found === true;\n}\n\n/**\n * Server-side redirect\n * @deprecated Use redirect from './context.js' instead\n */\nexport function redirect(url: string, type: 'replace' | 'push' = 'replace'): never {\n const error = new Error(`Redirect: ${url}`);\n (error as Error & { __flight_redirect: { url: string; type: string } }).__flight_redirect = { url, type };\n throw error;\n}\n\n/**\n * Check if error is redirect\n * @deprecated Use isRedirectError from './context.js' instead\n */\nexport function isRedirectError(error: unknown): { url: string; type: string } | null {\n if (error instanceof Error && (error as Error & { __flight_redirect?: unknown }).__flight_redirect) {\n return (error as Error & { __flight_redirect: { url: string; type: string } }).__flight_redirect;\n }\n return null;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rsc/stream.ts"],"names":["index","result"],"mappings":"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","file":"chunk-A2QRUBVE.js","sourcesContent":["/**\n * @flight-framework/core - Flight Stream\n * \n * Protocolo de streaming para Server Components.\n * Usa NDJSON (Newline Delimited JSON) para máxima debuggabilidad.\n * \n * Filosofía Flight:\n * - Formato abierto y documentado\n * - Works con cualquier runtime (Node, Deno, Bun, Edge)\n * - Fácil de debuggear (text-based)\n * - Sin dependencias\n * \n * @module @flight-framework/core/rsc/stream\n */\n\nimport type {\n FlightChunk,\n ServerComponentChunk,\n ErrorBoundaryChunk,\n} from './payload.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Opciones para crear un FlightStream\n */\nexport interface FlightStreamOptions {\n /** Incluir timestamps en chunks */\n timestamps?: boolean;\n /** Prefix para IDs generados */\n idPrefix?: string;\n /** Callback cuando un chunk es enviado */\n onChunk?: (chunk: FlightChunk) => void;\n /** Callback cuando el stream termina */\n onComplete?: () => void;\n /** Callback en caso de error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Resultado del parsing de un FlightStream\n */\nexport interface FlightStreamResult {\n /** Chunks recibidos */\n chunks: FlightChunk[];\n /** Componente raíz */\n root?: ServerComponentChunk;\n /** Errores encontrados */\n errors: ErrorBoundaryChunk[];\n /** Tiempo total de streaming en ms */\n duration: number;\n}\n\n// ============================================================================\n// Stream Creation\n// ============================================================================\n\n/**\n * Crea un ReadableStream desde un AsyncIterable de chunks\n * \n * @example\n * ```typescript\n * async function* renderApp() {\n * yield createServerChunk('root', tree);\n * yield createClientChunk('counter', './Counter', 'default', { initial: 0 });\n * }\n * \n * const stream = createFlightStream(renderApp());\n * return new Response(stream, { headers: { 'Content-Type': 'text/x-flight' } });\n * ```\n */\nexport function createFlightStream(\n chunks: AsyncIterable<FlightChunk>,\n options: FlightStreamOptions = {}\n): ReadableStream<Uint8Array> {\n const { onChunk, onComplete, onError } = options;\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of chunks) {\n // Serialize chunk to NDJSON line\n const line = JSON.stringify(chunk) + '\\n';\n controller.enqueue(encoder.encode(line));\n\n onChunk?.(chunk);\n }\n\n controller.close();\n onComplete?.();\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n onError?.(err);\n controller.error(err);\n }\n },\n });\n}\n\n/**\n * Crea un FlightStream desde un array de chunks\n */\nexport function createFlightStreamFromArray(\n chunks: FlightChunk[],\n options: FlightStreamOptions = {}\n): ReadableStream<Uint8Array> {\n async function* generator() {\n for (const chunk of chunks) {\n yield chunk;\n }\n }\n return createFlightStream(generator(), options);\n}\n\n// ============================================================================\n// Stream Parsing\n// ============================================================================\n\n/**\n * Parsea un FlightStream a chunks individuales\n * \n * @example\n * ```typescript\n * // En el cliente\n * const response = await fetch('/page');\n * const chunks = parseFlightStream(response.body!);\n * \n * for await (const chunk of chunks) {\n * handleChunk(chunk);\n * }\n * ```\n */\nexport async function* parseFlightStream(\n stream: ReadableStream<Uint8Array>\n): AsyncGenerator<FlightChunk> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Process remaining buffer\n if (buffer.trim()) {\n yield parseChunk(buffer);\n }\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Split by newlines and process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim()) {\n yield parseChunk(line);\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parsea un string completo de FlightStream\n */\nexport function parseFlightStreamSync(data: string): FlightChunk[] {\n const chunks: FlightChunk[] = [];\n\n for (const line of data.split('\\n')) {\n if (line.trim()) {\n chunks.push(parseChunk(line));\n }\n }\n\n return chunks;\n}\n\n/**\n * Parsea una línea individual a un chunk\n */\nfunction parseChunk(line: string): FlightChunk {\n try {\n return JSON.parse(line) as FlightChunk;\n } catch {\n throw new FlightStreamError(\n `Failed to parse Flight chunk: ${line.slice(0, 100)}${line.length > 100 ? '...' : ''}`,\n line\n );\n }\n}\n\n/**\n * Consume un FlightStream y retorna todos los chunks\n */\nexport async function consumeFlightStream(\n stream: ReadableStream<Uint8Array>\n): Promise<FlightStreamResult> {\n const startTime = Date.now();\n const chunks: FlightChunk[] = [];\n const errors: ErrorBoundaryChunk[] = [];\n let root: ServerComponentChunk | undefined;\n\n for await (const chunk of parseFlightStream(stream)) {\n chunks.push(chunk);\n\n if (chunk.type === 'S' && chunk.id === 'root') {\n root = chunk;\n }\n\n if (chunk.type === 'E') {\n errors.push(chunk);\n }\n }\n\n return {\n chunks,\n root,\n errors,\n duration: Date.now() - startTime,\n };\n}\n\n// ============================================================================\n// Response Helpers\n// ============================================================================\n\n/**\n * Crea una Response con Flight payload\n */\nexport function createFlightResponse(\n chunks: AsyncIterable<FlightChunk>,\n options: FlightResponseOptions = {}\n): Response {\n const { status = 200, headers = {} } = options;\n\n return new Response(createFlightStream(chunks), {\n status,\n headers: {\n 'Content-Type': 'text/x-flight',\n 'Transfer-Encoding': 'chunked',\n 'Cache-Control': 'no-cache, no-store',\n 'X-Content-Type-Options': 'nosniff',\n ...headers,\n },\n });\n}\n\nexport interface FlightResponseOptions {\n status?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * Crea una Response HTML con streaming SSR + Flight payload embebido\n */\nexport function createHybridResponse(\n htmlStream: ReadableStream<Uint8Array>,\n flightChunks: FlightChunk[],\n options: FlightResponseOptions = {}\n): Response {\n const { status = 200, headers = {} } = options;\n\n // Combine HTML stream with Flight payload as inline script\n const encoder = new TextEncoder();\n const flightPayload = JSON.stringify(flightChunks);\n const inlineScript = `<script type=\"text/x-flight\">${escapeScript(flightPayload)}</script>`;\n\n // Create a TransformStream to inject Flight payload before closing body\n const transform = new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n },\n flush(controller) {\n controller.enqueue(encoder.encode(inlineScript));\n },\n });\n\n const combinedStream = htmlStream.pipeThrough(transform);\n\n return new Response(combinedStream, {\n status,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Transfer-Encoding': 'chunked',\n 'X-Content-Type-Options': 'nosniff',\n ...headers,\n },\n });\n}\n\n/**\n * Escapa contenido para uso seguro en script tags\n */\nfunction escapeScript(content: string): string {\n return content\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026');\n}\n\n// ============================================================================\n// Streaming Utilities\n// ============================================================================\n\n/**\n * Crea un stream controller para enviar chunks progresivamente\n */\nexport function createStreamController(): {\n stream: ReadableStream<Uint8Array>;\n enqueue: (chunk: FlightChunk) => void;\n error: (error: Error) => void;\n close: () => void;\n} {\n const encoder = new TextEncoder();\n let controller: ReadableStreamDefaultController<Uint8Array>;\n\n const stream = new ReadableStream<Uint8Array>({\n start(ctrl) {\n controller = ctrl;\n },\n });\n\n return {\n stream,\n enqueue(chunk: FlightChunk) {\n const line = JSON.stringify(chunk) + '\\n';\n controller.enqueue(encoder.encode(line));\n },\n error(err: Error) {\n controller.error(err);\n },\n close() {\n controller.close();\n },\n };\n}\n\n/**\n * Merge múltiples streams en uno solo (para rendering paralelo)\n */\nexport function mergeFlightStreams(\n ...streams: ReadableStream<Uint8Array>[]\n): ReadableStream<Uint8Array> {\n const readers = streams.map(s => s.getReader());\n\n return new ReadableStream({\n async pull(controller) {\n // Race all readers\n const promises = readers.map(async (reader, index) => {\n const result = await reader.read();\n return { result, index };\n });\n\n const { result, index } = await Promise.race(promises);\n\n if (result.done) {\n // Remove completed reader\n readers.splice(index, 1);\n\n if (readers.length === 0) {\n controller.close();\n }\n } else {\n controller.enqueue(result.value);\n }\n },\n });\n}\n\n/**\n * Pipe a flight stream through a transform\n */\nexport function transformFlightStream(\n stream: ReadableStream<Uint8Array>,\n transform: (chunk: FlightChunk) => FlightChunk | null | Promise<FlightChunk | null>\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of parseFlightStream(stream)) {\n const transformed = await transform(chunk);\n if (transformed) {\n const line = JSON.stringify(transformed) + '\\n';\n controller.enqueue(encoder.encode(line));\n }\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n}\n\n// ============================================================================\n// Debug Utilities\n// ============================================================================\n\n/**\n * Pretty print Flight chunks para debugging\n */\nexport function prettyPrintChunks(chunks: FlightChunk[]): string {\n const lines: string[] = [];\n\n for (const chunk of chunks) {\n const prefix = getChunkTypeLabel(chunk.type);\n const id = 'id' in chunk ? chunk.id : 'boundary' in chunk ? chunk.boundary : '?';\n\n lines.push(`[${prefix}] ${id}`);\n\n if (chunk.type === 'S' && chunk.tree) {\n lines.push(` └─ Tree: ${prettyPrintElement(chunk.tree)}`);\n }\n if (chunk.type === 'C') {\n lines.push(` └─ Module: ${chunk.module}#${chunk.export}`);\n }\n if (chunk.type === 'E') {\n lines.push(` └─ Error: ${chunk.message}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction getChunkTypeLabel(type: FlightChunk['type']): string {\n switch (type) {\n case 'S': return 'SERVER';\n case 'C': return 'CLIENT';\n case 'A': return 'ACTION';\n case 'E': return 'ERROR ';\n case 'H': return 'HINT ';\n case 'M': return 'META ';\n default: return 'UNKNWN';\n }\n}\n\nfunction prettyPrintElement(element: unknown): string {\n if (!element || typeof element !== 'object') return String(element);\n\n const el = element as { $$type?: string; tag?: string; ref?: string };\n\n if (el.$$type === 'host') return `<${el.tag}>...`;\n if (el.$$type === 'text') return '\"text\"';\n if (el.$$type === 'fragment') return '<>...</>';\n if (el.$$type === 'suspense') return '<Suspense>...</Suspense>';\n if (el.$$type === 'client') return `<ClientRef:${el.ref}>`;\n if (el.$$type === 'lazy') return '<Lazy...>';\n if (el.$$type === 'null') return 'null';\n\n return JSON.stringify(element).slice(0, 50);\n}\n\n// ============================================================================\n// Custom Errors\n// ============================================================================\n\n/**\n * Error durante parsing de FlightStream\n */\nexport class FlightStreamError extends Error {\n constructor(\n message: string,\n public readonly rawData?: string\n ) {\n super(message);\n this.name = 'FlightStreamError';\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/handlers/index.ts"],"names":[],"mappings":";AAuDO,SAAS,kBAAA,CACZ,OAAA,EACA,MAAA,GAAiC,EAAC,EACf;AACnB,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA,cAAc,GAAA,CAAI;AAAA,GACtB;AACJ;AAKO,SAAS,IAAA,CAAQ,MAAS,IAAA,EAA+B;AAC5D,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACzC,EAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,iCAAiC,CAAA;AAE7D,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,IACtC,GAAG,IAAA;AAAA,IACH;AAAA,GACH,CAAA;AACL;AAKO,SAAS,QAAA,CAAS,GAAA,EAAa,MAAA,GAAsC,GAAA,EAAe;AACvF,EAAA,OAAO,IAAI,SAAS,IAAA,EAAM;AAAA,IACtB,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,QAAA,EAAU,GAAA;AAAI,GAC5B,CAAA;AACL;AAKO,SAAS,KAAA,CAAM,OAAA,EAAiB,MAAA,GAAS,GAAA,EAAe;AAC3D,EAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG;AAAA,IACpD,MAAA;AAAA,IACA,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,GACjD,CAAA;AACL;AAKA,eAAsB,UAAa,OAAA,EAA8B;AAC7D,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAE3D,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC1C,IAAA,OAAO,MAAM,QAAQ,IAAA,EAAK;AAAA,EAC9B;AAEA,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,mCAAmC,CAAA,EAAG;AAC3D,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,QAAA,EAAS;AACxC,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC7B,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACX;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,WAAW,CAAA,CAAE,CAAA;AAC9D","file":"chunk-A4TKWQBU.js","sourcesContent":["/**\n * @flight-framework/core - Route Handlers\n * \n * Types and utilities for route handlers.\n * Similar to Next.js Route Handlers pattern.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * HTTP methods supported by route handlers\n */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';\n\n/**\n * Context passed to route handlers\n */\nexport interface RouteHandlerContext {\n /** Route parameters (e.g., { id: '123' }) */\n params: Record<string, string>;\n /** Query string parameters */\n searchParams: URLSearchParams;\n}\n\n/**\n * Route handler function signature\n * \n * @example\n * ```typescript\n * // src/routes/api/users/[id].ts\n * export const GET: RouteHandler = async (request, context) => {\n * const { id } = context.params;\n * return Response.json({ userId: id });\n * };\n * \n * export const PUT: RouteHandler = async (request, context) => {\n * const body = await request.json();\n * return Response.json({ updated: true, data: body });\n * };\n * ```\n */\nexport type RouteHandler = (\n request: Request,\n context: RouteHandlerContext\n) => Response | Promise<Response>;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create a route handler context from request\n */\nexport function createRouteContext(\n request: Request,\n params: Record<string, string> = {}\n): RouteHandlerContext {\n const url = new URL(request.url);\n return {\n params,\n searchParams: url.searchParams,\n };\n}\n\n/**\n * Helper to create JSON response\n */\nexport function json<T>(data: T, init?: ResponseInit): Response {\n const headers = new Headers(init?.headers);\n headers.set('Content-Type', 'application/json; charset=utf-8');\n\n return new Response(JSON.stringify(data), {\n ...init,\n headers,\n });\n}\n\n/**\n * Helper to create redirect response\n */\nexport function redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 302): Response {\n return new Response(null, {\n status,\n headers: { Location: url },\n });\n}\n\n/**\n * Helper to create error response\n */\nexport function error(message: string, status = 500): Response {\n return new Response(JSON.stringify({ error: message }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n}\n\n/**\n * Helper to get request body as typed object\n */\nexport async function parseBody<T>(request: Request): Promise<T> {\n const contentType = request.headers.get('content-type') || '';\n\n if (contentType.includes('application/json')) {\n return await request.json() as T;\n }\n\n if (contentType.includes('application/x-www-form-urlencoded')) {\n const formData = await request.formData();\n const obj: Record<string, string> = {};\n formData.forEach((value, key) => {\n obj[key] = String(value);\n });\n return obj as T;\n }\n\n throw new Error(`Unsupported content type: ${contentType}`);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/render/index.ts"],"names":[],"mappings":";AA0EO,SAAS,eAAe,IAAA,EAA2B;AACtD,EAAA,OAAO,IAAA,KAAS,SAAS,IAAA,KAAS,KAAA;AACtC;AAKO,SAAS,YAAY,IAAA,EAA2B;AACnD,EAAA,OAAO,IAAA,KAAS,SAAS,IAAA,KAAS,KAAA;AACtC;AAKO,SAAS,aAAa,IAAA,EAA2B;AACpD,EAAA,OAAO,IAAA,KAAS,KAAA;AACpB;AAkDO,SAAS,gBAAgB,OAAA,EAOrB;AACP,EAAA,MAAM,EAAE,IAAA,GAAO,EAAA,EAAI,IAAA,EAAM,OAAA,GAAU,EAAC,EAAG,MAAA,GAAS,EAAC,EAAG,iBAAiB,EAAC,EAAG,cAAA,GAAiB,IAAG,GAAI,OAAA;AAEjG,EAAA,MAAM,SAAA,GAAY,OAAO,OAAA,CAAQ,cAAc,EAC1C,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,MAAM,CAAA,EAAG,GAAG,KAAK,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CACrD,KAAK,GAAG,CAAA;AAEb,EAAA,MAAM,SAAA,GAAY,OAAO,OAAA,CAAQ,cAAc,EAC1C,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,MAAM,CAAA,EAAG,GAAG,KAAK,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CACrD,KAAK,GAAG,CAAA;AAEb,EAAA,MAAM,UAAA,GAAa,MAAA,CACd,GAAA,CAAI,CAAA,IAAA,KAAQ,CAAA,6BAAA,EAAgC,UAAA,CAAW,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA,CAChE,IAAA,CAAK,QAAQ,CAAA;AAElB,EAAA,MAAM,UAAA,GAAa,OAAA,CACd,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,2BAAA,EAA8B,UAAA,CAAW,GAAG,CAAC,CAAA,WAAA,CAAa,CAAA,CACrE,IAAA,CAAK,QAAQ,CAAA;AAElB,EAAA,OAAO,CAAA;AAAA,MAAA,EACH,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAIX,UAAU;AAAA,IAAA,EACV,IAAI;AAAA;AAAA,QAAA,EAEA,SAAS,CAAA;AAAA,IAAA,EACb,IAAI;AAAA,IAAA,EACJ,UAAU;AAAA;AAAA,OAAA,CAAA;AAGhB;AAKO,SAAS,WAAW,GAAA,EAAqB;AAC5C,EAAA,OAAO,IACF,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC9B;AAKO,SAAS,eAAe,OAAA,EAId;AACb,EAAA,MAAM,EAAE,KAAA,GAAQ,YAAA,EAAc,WAAA,EAAa,MAAA,GAAS,OAAM,GAAI,OAAA;AAE9D,EAAA,MAAM,OAAO,eAAA,CAAgB;AAAA,IACzB,IAAA,EAAM,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,IACjC,IAAA,EAAM,YAAY,MAAM,CAAA,QAAA,CAAA;AAAA,IACxB,OAAA,EAAS,CAAC,WAAW;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACH,IAAA;AAAA,IACA,MAAA,EAAQ,GAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACL,cAAA,EAAgB;AAAA;AACpB,GACJ;AACJ","file":"chunk-B2LPSCES.js","sourcesContent":["/**\n * Flight Render Engine - Universal rendering primitives\n * \n * Supports SSR, SSG, CSR, and ISR - the user chooses per route.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Rendering modes supported by Flight */\nexport type RenderMode =\n | 'ssr' // Server-Side Rendering\n | 'ssg' // Static Site Generation\n | 'csr' // Client-Side Rendering\n | 'isr'; // Incremental Static Regeneration\n\n/** Context passed to render functions */\nexport interface RenderContext {\n /** The URL being rendered */\n url: URL;\n /** Route parameters */\n params: Record<string, string | string[]>;\n /** Request headers (available in SSR/ISR) */\n headers?: Headers;\n /** Cookies (available in SSR/ISR) */\n cookies?: Record<string, string>;\n /** Request method */\n method?: string;\n /** Request body (for POST/PUT/etc) */\n body?: unknown;\n /** Custom context data */\n locals?: Record<string, unknown>;\n}\n\n/** Result of a render operation */\nexport interface RenderResult {\n /** HTML content */\n html: string;\n /** HTTP status code */\n status: number;\n /** Response headers */\n headers: Record<string, string>;\n /** Head elements to inject */\n head?: {\n title?: string;\n meta?: Array<{ name?: string; property?: string; content: string }>;\n links?: Array<{ rel: string; href: string;[key: string]: string }>;\n scripts?: Array<{ src?: string; content?: string; type?: string }>;\n styles?: Array<{ href?: string; content?: string }>;\n };\n}\n\n/** Configuration for SSG/ISR */\nexport interface StaticRenderConfig {\n /** Paths to pre-render */\n paths: string[] | (() => Promise<string[]>);\n /** Fallback behavior for non-pre-rendered paths */\n fallback?: 'blocking' | 'prerender' | false;\n}\n\n/** Configuration for ISR */\nexport interface ISRConfig extends StaticRenderConfig {\n /** Revalidation time in seconds */\n revalidate: number;\n}\n\n// ============================================================================\n// Render Mode Helpers\n// ============================================================================\n\n/**\n * Check if a render mode requires server runtime\n */\nexport function requiresServer(mode: RenderMode): boolean {\n return mode === 'ssr' || mode === 'isr';\n}\n\n/**\n * Check if a render mode can be statically generated\n */\nexport function canBeStatic(mode: RenderMode): boolean {\n return mode === 'ssg' || mode === 'isr';\n}\n\n/**\n * Check if a render mode is purely client-side\n */\nexport function isClientOnly(mode: RenderMode): boolean {\n return mode === 'csr';\n}\n\n// ============================================================================\n// Abstract Renderer Interface\n// ============================================================================\n\n/**\n * UI Framework Integration Interface\n * \n * Each UI framework (React, Vue, Svelte, etc.) implements this interface\n * to integrate with Flight's render engine.\n */\nexport interface UIFrameworkAdapter<Component = unknown> {\n /** Framework name */\n name: string;\n\n /** \n * Render a component to HTML string (for SSR/SSG)\n */\n renderToString(\n component: Component,\n context: RenderContext\n ): Promise<RenderResult>;\n\n /**\n * Render a component to a stream (for streaming SSR)\n */\n renderToStream?(\n component: Component,\n context: RenderContext\n ): Promise<ReadableStream<Uint8Array>>;\n\n /**\n * Generate client hydration script\n */\n getHydrationScript?(component: Component): string;\n\n /**\n * File extensions this adapter handles\n */\n extensions: string[];\n}\n\n// ============================================================================\n// Default HTML Render Helpers\n// ============================================================================\n\n/**\n * Create a minimal HTML shell\n */\nexport function createHTMLShell(options: {\n head?: string;\n body: string;\n scripts?: string[];\n styles?: string[];\n htmlAttributes?: Record<string, string>;\n bodyAttributes?: Record<string, string>;\n}): string {\n const { head = '', body, scripts = [], styles = [], htmlAttributes = {}, bodyAttributes = {} } = options;\n\n const htmlAttrs = Object.entries(htmlAttributes)\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\n .join(' ');\n\n const bodyAttrs = Object.entries(bodyAttributes)\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\n .join(' ');\n\n const styleLinks = styles\n .map(href => `<link rel=\"stylesheet\" href=\"${escapeHtml(href)}\">`)\n .join('\\n ');\n\n const scriptTags = scripts\n .map(src => `<script type=\"module\" src=\"${escapeHtml(src)}\"></script>`)\n .join('\\n ');\n\n return `<!DOCTYPE html>\n<html ${htmlAttrs}>\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n ${styleLinks}\n ${head}\n </head>\n <body ${bodyAttrs}>\n ${body}\n ${scriptTags}\n </body>\n</html>`;\n}\n\n/**\n * Escape HTML special characters\n */\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * Create a CSR shell (minimal HTML that loads client bundle)\n */\nexport function createCSRShell(options: {\n title?: string;\n entryScript: string;\n rootId?: string;\n}): RenderResult {\n const { title = 'Flight App', entryScript, rootId = 'app' } = options;\n\n const html = createHTMLShell({\n head: `<title>${escapeHtml(title)}</title>`,\n body: `<div id=\"${rootId}\"></div>`,\n scripts: [entryScript],\n });\n\n return {\n html,\n status: 200,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n },\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rsc/context.ts"],"names":[],"mappings":"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","file":"chunk-CKJHJPKQ.js","sourcesContent":["/**\n * @flight-framework/core - Server Context\n * \n * API de contexto para Server Components.\n * Provee acceso a datos del request de forma explícita y type-safe.\n * \n * Filosofía Flight:\n * - Contexto EXPLÍCITO (no magia con AsyncLocalStorage)\n * - Pasado como argumento (testeable, predecible)\n * - Extensible con adapters custom\n * - Inmutable por defecto\n * \n * @module @flight-framework/core/rsc/context\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Contexto del servidor disponible en Server Components\n */\nexport interface ServerContext {\n /** Request actual (Web API Request) */\n readonly request: Request;\n\n /** Parámetros de ruta */\n readonly params: Readonly<Record<string, string>>;\n\n /** Search params de la URL */\n readonly searchParams: URLSearchParams;\n\n /** Headers del request */\n readonly headers: Headers;\n\n /** Accessor de cookies */\n readonly cookies: CookieAccessor;\n\n /** Headers de respuesta (mutables) */\n readonly responseHeaders: Headers;\n\n /** Signal para cancelación */\n readonly signal: AbortSignal;\n\n /** URL parseada */\n readonly url: URL;\n\n /** Método HTTP */\n readonly method: string;\n\n /** Context extensions (para adapters) */\n readonly extensions: ContextExtensions;\n}\n\n/**\n * Accessor para cookies con lazy parsing\n */\nexport interface CookieAccessor {\n /** Obtiene el valor de una cookie */\n get(name: string): string | undefined;\n\n /** Obtiene todas las cookies */\n getAll(): Readonly<Record<string, string>>;\n\n /** Verifica si existe una cookie */\n has(name: string): boolean;\n}\n\n/**\n * Extensiones del contexto para adapters\n */\nexport interface ContextExtensions {\n /** Obtiene una extensión */\n get<T>(key: string): T | undefined;\n\n /** Verifica si existe una extensión */\n has(key: string): boolean;\n}\n\n/**\n * Opciones para crear ServerContext\n */\nexport interface ServerContextOptions {\n /** Parámetros de ruta */\n params?: Record<string, string>;\n\n /** Extensiones custom */\n extensions?: Record<string, unknown>;\n\n /** Headers de respuesta iniciales */\n responseHeaders?: HeadersInit;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Crea un ServerContext a partir de un Request\n * \n * @example\n * ```typescript\n * const ctx = createServerContext(request, { \n * params: { id: '123' } \n * });\n * \n * // En un Server Component\n * async function UserPage(props, ctx: ServerContext) {\n * const userId = ctx.params.id;\n * const user = await db.users.get(userId);\n * return <UserProfile user={user} />;\n * }\n * ```\n */\nexport function createServerContext(\n request: Request,\n options: ServerContextOptions = {}\n): ServerContext {\n const { params = {}, extensions = {}, responseHeaders: initHeaders } = options;\n\n // Parse URL\n const url = new URL(request.url);\n\n // Lazy cookie parsing\n let parsedCookies: Record<string, string> | null = null;\n\n const parseCookies = (): Record<string, string> => {\n if (parsedCookies !== null) return parsedCookies;\n\n parsedCookies = {};\n const cookieHeader = request.headers.get('cookie');\n\n if (cookieHeader) {\n for (const cookie of cookieHeader.split(';')) {\n const trimmed = cookie.trim();\n const eqIndex = trimmed.indexOf('=');\n\n if (eqIndex > 0) {\n const key = trimmed.slice(0, eqIndex).trim();\n const value = trimmed.slice(eqIndex + 1).trim();\n\n // Decode URL-encoded values\n try {\n parsedCookies[key] = decodeURIComponent(value);\n } catch {\n parsedCookies[key] = value;\n }\n }\n }\n }\n\n return parsedCookies;\n };\n\n // Cookie accessor\n const cookies: CookieAccessor = {\n get(name: string): string | undefined {\n return parseCookies()[name];\n },\n getAll(): Readonly<Record<string, string>> {\n return Object.freeze({ ...parseCookies() });\n },\n has(name: string): boolean {\n return name in parseCookies();\n },\n };\n\n // Extensions accessor\n const contextExtensions: ContextExtensions = {\n get<T>(key: string): T | undefined {\n return extensions[key] as T | undefined;\n },\n has(key: string): boolean {\n return key in extensions;\n },\n };\n\n // Response headers (mutable)\n const responseHeaders = new Headers(initHeaders);\n\n return Object.freeze({\n request,\n params: Object.freeze({ ...params }),\n searchParams: url.searchParams,\n headers: request.headers,\n cookies,\n responseHeaders,\n signal: request.signal,\n url,\n method: request.method,\n extensions: contextExtensions,\n });\n}\n\n// ============================================================================\n// Context Helpers\n// ============================================================================\n\n/**\n * Obtiene un header del request\n */\nexport function getHeader(ctx: ServerContext, name: string): string | null {\n return ctx.headers.get(name);\n}\n\n/**\n * Obtiene todos los headers como objeto\n */\nexport function getHeaders(ctx: ServerContext): Record<string, string> {\n const headers: Record<string, string> = {};\n ctx.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n\n/**\n * Verifica si el request es un POST/PUT/PATCH/DELETE (mutation request)\n */\nexport function isMutationRequest(ctx: ServerContext): boolean {\n return ['POST', 'PUT', 'PATCH', 'DELETE'].includes(ctx.method);\n}\n\n/**\n * Verifica si el request acepta JSON\n */\nexport function acceptsJson(ctx: ServerContext): boolean {\n const accept = ctx.headers.get('accept') || '';\n return accept.includes('application/json') || accept.includes('*/*');\n}\n\n/**\n * Verifica si el request es AJAX/fetch\n */\nexport function isAjaxRequest(ctx: ServerContext): boolean {\n return ctx.headers.get('x-requested-with')?.toLowerCase() === 'xmlhttprequest' ||\n ctx.headers.has('x-flight-action');\n}\n\n/**\n * Verifica si el request viene de un bot\n */\nexport function isBotRequest(ctx: ServerContext): boolean {\n const ua = ctx.headers.get('user-agent')?.toLowerCase() || '';\n const botPatterns = [\n 'bot', 'crawler', 'spider', 'scraper',\n 'googlebot', 'bingbot', 'yandexbot', 'duckduckbot',\n 'slurp', 'baiduspider', 'facebookexternalhit',\n 'twitterbot', 'linkedinbot', 'embedly', 'quora',\n 'outbrain', 'pinterest', 'slack', 'vkshare',\n 'w3c_validator', 'lighthouse', 'pagespeed',\n ];\n return botPatterns.some(pattern => ua.includes(pattern));\n}\n\n/**\n * Verifica si el cliente soporta streaming\n */\nexport function supportsStreaming(ctx: ServerContext): boolean {\n // Check for no-stream preference\n const noStream = ctx.searchParams.get('_nostream');\n if (noStream === '1' || noStream === 'true') return false;\n\n // Bots typically don't support streaming well\n if (isBotRequest(ctx)) return false;\n\n // Check for slow connection hints\n const connection = ctx.headers.get('downlink') || ctx.headers.get('ect');\n if (connection === 'slow-2g' || connection === '2g') return false;\n\n return true;\n}\n\n/**\n * Obtiene el idioma preferido del cliente\n */\nexport function getPreferredLanguage(ctx: ServerContext, available: string[]): string | undefined {\n const acceptLang = ctx.headers.get('accept-language');\n if (!acceptLang) return available[0];\n\n // Parse Accept-Language header\n const languages = acceptLang\n .split(',')\n .map(lang => {\n const [code, q = 'q=1'] = lang.trim().split(';');\n const quality = parseFloat(q.replace('q=', '')) || 1;\n return { code: code!.trim().toLowerCase(), quality };\n })\n .sort((a, b) => b.quality - a.quality);\n\n // Find best match\n for (const { code } of languages) {\n // Exact match\n const exact = available.find(a => a.toLowerCase() === code);\n if (exact) return exact;\n\n // Language-only match (e.g., 'es' matches 'es-AR')\n const baseCode = code.split('-')[0];\n const partial = available.find(a => a.toLowerCase().startsWith(baseCode!));\n if (partial) return partial;\n }\n\n return available[0];\n}\n\n// ============================================================================\n// Response Helpers\n// ============================================================================\n\n/**\n * Sets a cookie in the response\n */\nexport function setCookie(\n ctx: ServerContext,\n name: string,\n value: string,\n options: CookieOptions = {}\n): void {\n const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];\n\n if (options.maxAge !== undefined) {\n parts.push(`Max-Age=${options.maxAge}`);\n }\n if (options.expires) {\n parts.push(`Expires=${options.expires.toUTCString()}`);\n }\n if (options.path) {\n parts.push(`Path=${options.path}`);\n }\n if (options.domain) {\n parts.push(`Domain=${options.domain}`);\n }\n if (options.secure) {\n parts.push('Secure');\n }\n if (options.httpOnly) {\n parts.push('HttpOnly');\n }\n if (options.sameSite) {\n parts.push(`SameSite=${options.sameSite}`);\n }\n\n ctx.responseHeaders.append('Set-Cookie', parts.join('; '));\n}\n\n/**\n * Deletes a cookie\n */\nexport function deleteCookie(ctx: ServerContext, name: string, options: Pick<CookieOptions, 'path' | 'domain'> = {}): void {\n setCookie(ctx, name, '', {\n ...options,\n maxAge: 0,\n expires: new Date(0),\n });\n}\n\n/**\n * Cookie options\n */\nexport interface CookieOptions {\n /** Max age in seconds */\n maxAge?: number;\n /** Expiration date */\n expires?: Date;\n /** Cookie path */\n path?: string;\n /** Cookie domain */\n domain?: string;\n /** HTTPS only */\n secure?: boolean;\n /** Not accessible via JavaScript */\n httpOnly?: boolean;\n /** SameSite attribute */\n sameSite?: 'Strict' | 'Lax' | 'None';\n}\n\n/**\n * Sets cache control headers\n */\nexport function setCacheControl(ctx: ServerContext, options: CacheControlOptions): void {\n const parts: string[] = [];\n\n if (options.public) parts.push('public');\n if (options.private) parts.push('private');\n if (options.noCache) parts.push('no-cache');\n if (options.noStore) parts.push('no-store');\n if (options.maxAge !== undefined) parts.push(`max-age=${options.maxAge}`);\n if (options.sMaxAge !== undefined) parts.push(`s-maxage=${options.sMaxAge}`);\n if (options.staleWhileRevalidate !== undefined) {\n parts.push(`stale-while-revalidate=${options.staleWhileRevalidate}`);\n }\n if (options.staleIfError !== undefined) {\n parts.push(`stale-if-error=${options.staleIfError}`);\n }\n if (options.mustRevalidate) parts.push('must-revalidate');\n if (options.immutable) parts.push('immutable');\n\n ctx.responseHeaders.set('Cache-Control', parts.join(', '));\n}\n\n/**\n * Cache control options\n */\nexport interface CacheControlOptions {\n public?: boolean;\n private?: boolean;\n noCache?: boolean;\n noStore?: boolean;\n maxAge?: number;\n sMaxAge?: number;\n staleWhileRevalidate?: number;\n staleIfError?: number;\n mustRevalidate?: boolean;\n immutable?: boolean;\n}\n\n// ============================================================================\n// Error Helpers\n// ============================================================================\n\n/**\n * Not found error - triggers 404 handling\n */\nexport function notFound(message = 'Not Found'): never {\n const error = new Error(message) as Error & { __flight_not_found: true };\n error.__flight_not_found = true;\n throw error;\n}\n\n/**\n * Check if error is a not found error\n */\nexport function isNotFoundError(error: unknown): boolean {\n return error instanceof Error && '__flight_not_found' in error;\n}\n\n/**\n * Redirect error - triggers redirect handling\n */\nexport function redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 307): never {\n const error = new Error(`Redirect: ${url}`) as Error & {\n __flight_redirect: { url: string; status: number }\n };\n error.__flight_redirect = { url, status };\n throw error;\n}\n\n/**\n * Check if error is a redirect error\n */\nexport function isRedirectError(error: unknown): error is Error & {\n __flight_redirect: { url: string; status: number }\n} {\n return error instanceof Error && '__flight_redirect' in error;\n}\n\n/**\n * Get redirect info from error\n */\nexport function getRedirectInfo(error: Error & { __flight_redirect: { url: string; status: number } }): { url: string; status: number } {\n return error.__flight_redirect;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/streaming/index.ts"],"names":[],"mappings":"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","file":"chunk-CNY3ZUVG.js","sourcesContent":["/**\n * @flight-framework/core - Streaming SSR\n * \n * Full streaming server-side rendering implementation following React 18+/19 patterns.\n * Supports both Node.js (renderToPipeableStream) and Edge (renderToReadableStream) environments.\n * \n * Best Practices 2025/2026:\n * - Progressive HTML streaming with Suspense boundaries\n * - Shell-first rendering for fast TTFB\n * - Nested Suspense for granular loading states\n * - Error boundaries for graceful degradation\n * - Web Streams API for Edge runtime compatibility\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Streaming render options following React's conventions\n */\nexport interface StreamingRenderOptions {\n /** Bootstrap scripts to load on client */\n bootstrapScripts?: string[];\n /** Bootstrap ES modules */\n bootstrapModules?: string[];\n /** Inline script content */\n bootstrapScriptContent?: string;\n /** Prefix for React IDs (useId) */\n identifierPrefix?: string;\n /** Nonce for CSP */\n nonce?: string;\n /** Callback when shell is ready (main content before Suspense) */\n onShellReady?: () => void;\n /** Callback when shell errors */\n onShellError?: (error: Error) => void;\n /** Callback when all content is ready */\n onAllReady?: () => void;\n /** Callback for any error */\n onError?: (error: Error) => void;\n /** Timeout before aborting stream */\n timeoutMs?: number;\n /** Progressive hydration enabled */\n progressiveHydration?: boolean;\n}\n\n/**\n * Streaming render result\n */\nexport interface StreamingRenderResult {\n /** The readable stream to pipe to response */\n stream: ReadableStream<Uint8Array>;\n /** Abort the stream */\n abort: () => void;\n /** Promise that resolves when shell is ready */\n shellReady: Promise<void>;\n /** Promise that resolves when all content is ready */\n allReady: Promise<void>;\n}\n\n/**\n * Suspense boundary configuration\n */\nexport interface SuspenseBoundaryConfig {\n /** Unique ID for this boundary */\n id: string;\n /** Fallback HTML to show while loading */\n fallback: string;\n /** Content resolver promise */\n contentPromise: Promise<string>;\n /** \n * IDs of boundaries that must resolve before this one.\n * Enables dependency-aware streaming for complex data relationships.\n * @example ['user'] - Wait for 'user' boundary before starting\n */\n dependsOn?: string[];\n /** Custom metadata for observability */\n meta?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Streaming Renderer\n// ============================================================================\n\n/**\n * Create a streaming SSR response using Web Streams API.\n * Compatible with Edge Runtime (Cloudflare, Vercel Edge, Deno).\n * \n * @example\n * ```typescript\n * const result = await createStreamingSSR({\n * shell: '<html><body><div id=\"root\">',\n * shellEnd: '</div></body></html>',\n * suspenseBoundaries: [\n * {\n * id: 'posts',\n * fallback: '<div>Loading posts...</div>',\n * contentPromise: fetchAndRenderPosts(),\n * }\n * ],\n * bootstrapScripts: ['/client.js'],\n * });\n * \n * return new Response(result.stream, {\n * headers: { 'Content-Type': 'text/html' },\n * });\n * ```\n */\nexport async function createStreamingSSR(config: {\n /** Initial HTML shell (before suspense content) */\n shell: string;\n /** Closing HTML shell */\n shellEnd: string;\n /** Suspense boundaries with async content */\n suspenseBoundaries?: SuspenseBoundaryConfig[];\n /** Streaming options */\n options?: StreamingRenderOptions;\n}): Promise<StreamingRenderResult> {\n const { shell, shellEnd, suspenseBoundaries = [], options = {} } = config;\n\n let shellResolved = false;\n let allResolved = false;\n let abortController: AbortController | null = null;\n\n // Shell ready promise\n let resolveShell: () => void;\n const shellReady = new Promise<void>((resolve) => {\n resolveShell = resolve;\n });\n\n // All ready promise\n let resolveAll: () => void;\n const allReady = new Promise<void>((resolve) => {\n resolveAll = resolve;\n });\n\n const encoder = new TextEncoder();\n\n const stream = new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n // 1. Send the shell immediately (fast TTFB)\n const shellWithPlaceholders = buildShellWithPlaceholders(\n shell,\n suspenseBoundaries,\n shellEnd,\n options\n );\n\n controller.enqueue(encoder.encode(shellWithPlaceholders));\n\n shellResolved = true;\n options.onShellReady?.();\n resolveShell!();\n\n // 2. Stream Suspense boundary contents as they resolve\n if (suspenseBoundaries.length > 0) {\n await streamSuspenseContent(controller, encoder, suspenseBoundaries, options);\n }\n\n // 3. Send hydration script if needed\n if (options.bootstrapScripts?.length || options.bootstrapModules?.length) {\n const hydrationScript = buildHydrationScript(options);\n controller.enqueue(encoder.encode(hydrationScript));\n }\n\n allResolved = true;\n options.onAllReady?.();\n resolveAll!();\n\n controller.close();\n } catch (error) {\n if (!shellResolved) {\n options.onShellError?.(error as Error);\n }\n options.onError?.(error as Error);\n controller.error(error);\n }\n },\n\n cancel() {\n abortController?.abort();\n },\n });\n\n const abort = () => {\n abortController?.abort();\n };\n\n // Timeout handling\n if (options.timeoutMs) {\n abortController = new AbortController();\n setTimeout(() => {\n if (!allResolved) {\n abort();\n }\n }, options.timeoutMs);\n }\n\n return {\n stream,\n abort,\n shellReady,\n allReady,\n };\n}\n\n/**\n * Build shell HTML with Suspense placeholders\n */\nfunction buildShellWithPlaceholders(\n shell: string,\n boundaries: SuspenseBoundaryConfig[],\n shellEnd: string,\n options: StreamingRenderOptions\n): string {\n let html = shell;\n\n // Add inline bootstrap script if provided\n if (options.bootstrapScriptContent) {\n html += `<script>${options.bootstrapScriptContent}</script>`;\n }\n\n // Add Suspense fallbacks with placeholder markers\n for (const boundary of boundaries) {\n html += `\n<!--$?--><template id=\"B:${boundary.id}\"></template>\n${boundary.fallback}\n<!--/$-->`;\n }\n\n html += shellEnd;\n\n return html;\n}\n\n/**\n * Stream Suspense content as promises resolve\n */\nasync function streamSuspenseContent(\n controller: ReadableStreamDefaultController<Uint8Array>,\n encoder: TextEncoder,\n boundaries: SuspenseBoundaryConfig[],\n options: StreamingRenderOptions\n): Promise<void> {\n // Race all boundaries - stream each as it completes\n const pending = boundaries.map(async (boundary) => {\n try {\n const content = await boundary.contentPromise;\n return { boundary, content, error: null };\n } catch (error) {\n return { boundary, content: null, error: error as Error };\n }\n });\n\n // Process as each resolves\n const results = await Promise.allSettled(pending);\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n const { boundary, content, error } = result.value;\n\n if (error) {\n // Send error replacement\n const errorScript = buildErrorReplacement(boundary.id, error.message);\n controller.enqueue(encoder.encode(errorScript));\n options.onError?.(error);\n } else if (content) {\n // Send content replacement script\n const replacementScript = buildContentReplacement(boundary.id, content);\n controller.enqueue(encoder.encode(replacementScript));\n }\n }\n }\n}\n\n/**\n * Build script to replace Suspense placeholder with actual content\n * This follows React's streaming hydration pattern\n */\nfunction buildContentReplacement(id: string, content: string): string {\n // Escape script-breaking characters\n const escaped = content\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/'/g, \"\\\\'\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r');\n\n return `\n<script>\n(function(){\n var b=document.getElementById(\"B:${id}\");\n if(b){\n var p=b.previousSibling;\n while(p&&p.nodeType===8&&p.data===\"$?\")p=p.previousSibling;\n var n=b.nextSibling;\n var f=document.createDocumentFragment();\n var t=document.createElement(\"template\");\n t.innerHTML=\"${escaped}\";\n while(t.content.firstChild)f.appendChild(t.content.firstChild);\n if(n&&n.nodeType===8&&n.data===\"/$\"){\n var s=n.nextSibling;\n while(s&&s!==b){var x=s.nextSibling;s.parentNode.removeChild(s);s=x;}\n }\n b.parentNode.replaceChild(f,b);\n }\n})();\n</script>`;\n}\n\n/**\n * Build script to show error in place of Suspense content\n */\nfunction buildErrorReplacement(id: string, message: string): string {\n const escaped = message.replace(/'/g, \"\\\\'\").replace(/\"/g, '\\\\\"');\n\n return `\n<script>\n(function(){\n var b=document.getElementById(\"B:${id}\");\n if(b){\n var t=document.createElement(\"div\");\n t.className=\"streaming-error\";\n t.textContent=\"Error: ${escaped}\";\n b.parentNode.replaceChild(t,b);\n }\n})();\n</script>`;\n}\n\n/**\n * Build hydration bootstrap script\n */\nfunction buildHydrationScript(options: StreamingRenderOptions): string {\n let scripts = '';\n\n if (options.bootstrapScripts?.length) {\n for (const src of options.bootstrapScripts) {\n const nonceAttr = options.nonce ? ` nonce=\"${options.nonce}\"` : '';\n scripts += `<script src=\"${src}\"${nonceAttr} async></script>`;\n }\n }\n\n if (options.bootstrapModules?.length) {\n for (const src of options.bootstrapModules) {\n const nonceAttr = options.nonce ? ` nonce=\"${options.nonce}\"` : '';\n scripts += `<script type=\"module\" src=\"${src}\"${nonceAttr}></script>`;\n }\n }\n\n return scripts;\n}\n\n// ============================================================================\n// Streaming Response Helpers\n// ============================================================================\n\n/**\n * Create a streaming HTML Response object\n */\nexport function createStreamingResponse(\n stream: ReadableStream<Uint8Array>,\n options: {\n status?: number;\n headers?: Record<string, string>;\n } = {}\n): Response {\n return new Response(stream, {\n status: options.status || 200,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Transfer-Encoding': 'chunked',\n 'X-Content-Type-Options': 'nosniff',\n ...options.headers,\n },\n });\n}\n\n/**\n * Higher-level API: Render page with Suspense boundaries\n * \n * @example\n * ```typescript\n * return renderWithStreaming({\n * layout: ({ children }) => `\n * <html>\n * <head><title>My App</title></head>\n * <body><div id=\"root\">${children}</div></body>\n * </html>\n * `,\n * page: async () => '<h1>Welcome</h1>',\n * suspense: {\n * posts: {\n * fallback: '<div class=\"skeleton\">Loading...</div>',\n * content: fetchPosts().then(renderPosts),\n * },\n * },\n * });\n * ```\n */\nexport async function renderWithStreaming(config: {\n /** Layout wrapper */\n layout: (props: { children: string }) => string;\n /** Main page content (sync part) */\n page: () => string | Promise<string>;\n /** Suspense boundaries keyed by ID */\n suspense?: Record<string, { fallback: string; content: Promise<string> }>;\n /** Bootstrap scripts */\n bootstrapScripts?: string[];\n /** Timeout in ms */\n timeoutMs?: number;\n}): Promise<Response> {\n const { layout, page, suspense = {}, bootstrapScripts, timeoutMs } = config;\n\n // Get synchronous page content\n const pageContent = await page();\n\n // Build suspense boundaries\n const boundaries: SuspenseBoundaryConfig[] = Object.entries(suspense).map(\n ([id, { fallback, content }]) => ({\n id,\n fallback,\n contentPromise: content,\n })\n );\n\n // Create streaming result\n const result = await createStreamingSSR({\n shell: layout({ children: pageContent }),\n shellEnd: '',\n suspenseBoundaries: boundaries,\n options: {\n bootstrapScripts,\n timeoutMs,\n },\n });\n\n return createStreamingResponse(result.stream);\n}\n\n// ============================================================================\n// Progressive Rendering Utilities\n// ============================================================================\n\n/**\n * Create a lazy component that streams its content\n */\nexport function createLazyContent<T>(\n fetcher: () => Promise<T>,\n renderer: (data: T) => string,\n fallback: string\n): { fallback: string; content: Promise<string> } {\n return {\n fallback,\n content: fetcher().then(renderer),\n };\n}\n\n/**\n * Parallel streaming: resolve multiple boundaries simultaneously\n */\nexport async function streamParallel(\n boundaries: Array<{\n id: string;\n fallback: string;\n content: () => Promise<string>;\n }>\n): Promise<SuspenseBoundaryConfig[]> {\n return boundaries.map((b) => ({\n id: b.id,\n fallback: b.fallback,\n contentPromise: b.content(),\n }));\n}\n\n/**\n * Sequential streaming: resolve boundaries in order\n */\nexport async function streamSequential(\n boundaries: Array<{\n id: string;\n fallback: string;\n content: () => Promise<string>;\n }>\n): Promise<SuspenseBoundaryConfig[]> {\n const result: SuspenseBoundaryConfig[] = [];\n\n for (const b of boundaries) {\n result.push({\n id: b.id,\n fallback: b.fallback,\n contentPromise: b.content(),\n });\n }\n\n return result;\n}\n\n// ============================================================================\n// Export for use with React\n// ============================================================================\n\n/**\n * NOTE: For React-specific streaming with renderToPipeableStream or \n * renderToReadableStream, use the dedicated React adapter:\n * \n * ```typescript\n * import { renderToReadableStream } from 'react-dom/server';\n * import { createStreamingResponse } from '@flight-framework/core/streaming';\n * \n * const stream = await renderToReadableStream(<App />, {\n * bootstrapScripts: ['/client.js'],\n * });\n * \n * return createStreamingResponse(stream);\n * ```\n * \n * This module provides framework-agnostic streaming primitives that work\n * with any UI library or custom HTML generation.\n */\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/index.ts"],"names":[],"mappings":"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","file":"chunk-EHVUAFNH.js","sourcesContent":["/**\n * Flight Configuration - User configuration system\n */\n\nimport type { RenderMode } from '../render/index.js';\nimport type { FlightAdapter } from '../adapters/index.js';\n\n// ============================================================================\n// Bundler Types (from @flight-framework/bundler)\n// ============================================================================\n\n/**\n * Bundler adapter interface.\n * Import the full type from @flight-framework/bundler for implementation.\n */\nexport interface BundlerAdapter {\n /** Adapter identifier */\n name: string;\n /** Bundler name (vite, esbuild, rolldown, etc.) */\n bundler: string;\n /** Bundler-specific options */\n options?: Record<string, unknown>;\n /** Create dev server */\n createDevServer(config: FlightConfig): Promise<unknown>;\n /** Build for production */\n build(config: FlightConfig): Promise<unknown>;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** UI Framework configuration */\nexport interface UIConfig {\n /** The UI framework to use */\n framework?: 'react' | 'vue' | 'svelte' | 'solid' | 'preact' | 'vanilla' | string;\n /** Framework-specific options */\n options?: Record<string, unknown>;\n}\n\n/** Rendering configuration */\nexport interface RenderConfig {\n /** Default render mode */\n default?: RenderMode;\n /** Per-route render mode overrides */\n routes?: Record<string, RenderMode>;\n}\n\n/** Development server options */\nexport interface DevConfig {\n /** Port to run dev server on */\n port?: number;\n /** Host to bind to */\n host?: string | boolean;\n /** Open browser on start */\n open?: boolean;\n /** HTTPS configuration */\n https?: boolean | {\n key?: string;\n cert?: string;\n };\n /** Proxy configuration */\n proxy?: Record<string, string | {\n target: string;\n changeOrigin?: boolean;\n rewrite?: (path: string) => string;\n }>;\n}\n\n/** Build configuration */\nexport interface BuildConfig {\n /** Output directory */\n outDir?: string;\n /** Source directory */\n srcDir?: string;\n /** Public assets directory */\n publicDir?: string;\n /** Routes directory */\n routesDir?: string;\n /** Generate sourcemaps */\n sourcemap?: boolean | 'inline' | 'hidden';\n /** Minify output */\n minify?: boolean | 'terser' | 'esbuild';\n /** Target environments */\n target?: string | string[];\n}\n\n/** Full Flight configuration (resolved) */\nexport interface FlightConfig {\n /** Root directory */\n root: string;\n /** Deployment adapter */\n adapter: FlightAdapter | null;\n /** Bundler adapter (Vite, esbuild, Rolldown, etc.) */\n bundler: BundlerAdapter | null;\n /** UI framework configuration */\n ui: UIConfig;\n /** Rendering configuration */\n rendering: RenderConfig;\n /** Development server options */\n dev: Required<DevConfig>;\n /** Build configuration */\n build: Required<BuildConfig>;\n /** Bundler-specific configuration (passed to adapter) */\n bundlerOptions?: Record<string, unknown>;\n /** @deprecated Use bundler adapter instead */\n vite?: Record<string, unknown>;\n /** Plugin configurations */\n plugins: FlightPlugin[];\n}\n\n/** Flight plugin interface */\nexport interface FlightPlugin {\n /** Plugin name */\n name: string;\n /** Hook into config resolution */\n config?: (config: FlightConfig) => FlightConfig | void | Promise<FlightConfig | void>;\n /** Hook into build start */\n buildStart?: () => void | Promise<void>;\n /** Hook into build end */\n buildEnd?: () => void | Promise<void>;\n /** Hook into dev server start */\n devStart?: () => void | Promise<void>;\n}\n\n/** User-provided configuration (partial) */\nexport interface FlightUserConfig {\n /** Root directory (defaults to process.cwd()) */\n root?: string;\n /** Deployment adapter */\n adapter?: FlightAdapter;\n /** Bundler adapter (Vite, esbuild, Rolldown, etc.) */\n bundler?: BundlerAdapter;\n /** UI framework configuration */\n ui?: UIConfig;\n /** Rendering configuration */\n rendering?: RenderConfig;\n /** Development server options */\n dev?: DevConfig;\n /** Build configuration */\n build?: BuildConfig;\n /** Bundler-specific configuration */\n bundlerOptions?: Record<string, unknown>;\n /** @deprecated Use bundler adapter instead */\n vite?: Record<string, unknown>;\n /** Plugins */\n plugins?: FlightPlugin[];\n}\n\n// ============================================================================\n// Configuration Factory\n// ============================================================================\n\n/** Default configuration values */\nconst DEFAULT_CONFIG: Omit<FlightConfig, 'root'> = {\n adapter: null,\n bundler: null,\n ui: {\n framework: 'vanilla',\n },\n rendering: {\n default: 'ssr',\n routes: {},\n },\n dev: {\n port: 5173,\n host: 'localhost',\n open: false,\n https: false,\n proxy: {},\n },\n build: {\n outDir: 'dist',\n srcDir: 'src',\n publicDir: 'public',\n routesDir: 'src/routes',\n sourcemap: false,\n minify: true,\n target: 'es2022',\n },\n plugins: [],\n};\n\n/**\n * Define Flight configuration\n * \n * @example\n * ```typescript\n * // flight.config.ts\n * import { defineConfig } from '@flight-framework/core';\n * import node from '@flight-framework/adapter-node';\n * \n * export default defineConfig({\n * adapter: node(),\n * ui: { framework: 'react' },\n * rendering: {\n * default: 'ssr',\n * routes: {\n * '/blog/*': 'ssg',\n * '/app/*': 'csr',\n * },\n * },\n * });\n * ```\n */\nexport function defineConfig(config: FlightUserConfig): FlightUserConfig {\n return config;\n}\n\n/**\n * Resolve user config to full config with defaults\n */\nexport function resolveConfig(userConfig: FlightUserConfig = {}): FlightConfig {\n return {\n root: userConfig.root ?? process.cwd(),\n adapter: userConfig.adapter ?? DEFAULT_CONFIG.adapter,\n bundler: userConfig.bundler ?? DEFAULT_CONFIG.bundler,\n ui: {\n ...DEFAULT_CONFIG.ui,\n ...userConfig.ui,\n },\n rendering: {\n ...DEFAULT_CONFIG.rendering,\n ...userConfig.rendering,\n },\n dev: {\n ...DEFAULT_CONFIG.dev,\n ...userConfig.dev,\n } as Required<DevConfig>,\n build: {\n ...DEFAULT_CONFIG.build,\n ...userConfig.build,\n } as Required<BuildConfig>,\n bundlerOptions: userConfig.bundlerOptions,\n vite: userConfig.vite,\n plugins: userConfig.plugins ?? [],\n };\n}\n\n// ============================================================================\n// Config Loading\n// ============================================================================\n\nconst CONFIG_FILES = [\n 'flight.config.ts',\n 'flight.config.js',\n 'flight.config.mjs',\n 'flight.config.mts',\n];\n\n/**\n * Find the config file in a directory\n */\nexport async function findConfigFile(root: string): Promise<string | null> {\n // Dynamic import for Node.js fs\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n\n for (const file of CONFIG_FILES) {\n const path = join(root, file);\n if (existsSync(path)) {\n return path;\n }\n }\n\n return null;\n}\n\n/**\n * Load configuration from file\n */\nexport async function loadConfig(root: string = process.cwd()): Promise<FlightConfig> {\n const configFile = await findConfigFile(root);\n\n if (!configFile) {\n return resolveConfig({ root });\n }\n\n try {\n // Use dynamic import for the config file\n // On Windows, we need to convert the path to a file:// URL\n const { pathToFileURL } = await import('node:url');\n const configUrl = pathToFileURL(configFile).href;\n const module = await import(configUrl);\n const userConfig = module.default as FlightUserConfig;\n\n return resolveConfig({\n ...userConfig,\n root,\n });\n } catch (error) {\n console.error(`Failed to load config from ${configFile}:`, error);\n return resolveConfig({ root });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rsc/renderer.ts"],"names":["children"],"mappings":"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","file":"chunk-FRAH5QNY.js","sourcesContent":["/**\n * @flight-framework/core - Server Component Renderer\n * \n * Renders Server Components to FlightChunks.\n * Framework-agnostic rendering engine that works with adapters.\n * \n * @module @flight-framework/core/rsc/renderer\n */\n\nimport type {\n FlightChunk,\n FlightElement,\n ServerComponentChunk,\n ClientReferenceChunk,\n} from './payload.js';\nimport {\n generateChunkId,\n createServerChunk,\n createClientChunk,\n createErrorChunk,\n toFlightElement,\n serialize,\n} from './payload.js';\nimport {\n isClientReference,\n type ClientReference,\n} from './boundaries.js';\nimport type { ServerContext } from './context.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * UI Framework adapter for rendering\n */\nexport interface UIAdapter {\n /** Adapter name */\n name: string;\n\n /** Check if value is a framework element */\n isElement(value: unknown): boolean;\n\n /** Get element type info */\n getElementType(element: unknown): ElementTypeInfo;\n\n /** Get element props */\n getProps(element: unknown): Record<string, unknown>;\n\n /** Get element children */\n getChildren(element: unknown): unknown[];\n\n /** Get element key */\n getKey(element: unknown): string | number | undefined;\n\n /** Check if component is a client boundary */\n isClientBoundary(component: unknown): boolean;\n\n /** \n * Create a framework-specific element\n * This abstracts away React's Symbol.for('react.element'), Vue's VNode, etc.\n */\n createElement(\n component: ComponentFn,\n props: Record<string, unknown>\n ): unknown;\n\n /** Render element to HTML string (for SSR fallback) */\n renderToString?(element: unknown): Promise<string>;\n}\n\nexport type ElementTypeInfo =\n | { kind: 'host'; tag: string }\n | { kind: 'component'; fn: ComponentFn; name: string }\n | { kind: 'fragment' }\n | { kind: 'suspense'; fallback?: unknown }\n | { kind: 'provider'; value?: unknown }\n | { kind: 'context' }\n | { kind: 'text'; value: string }\n | { kind: 'null' };\n\n/**\n * Component function type\n */\nexport type ComponentFn = (\n props: Record<string, unknown>,\n ctx?: ServerContext\n) => unknown | Promise<unknown>;\n\n/**\n * Render options\n */\nexport interface RenderOptions {\n /** Include SSR fallbacks for client components */\n includeSSRFallbacks?: boolean;\n\n /** Error handler */\n onError?: (error: Error, componentName?: string) => void;\n\n /** Dev mode (include extra debug info) */\n dev?: boolean;\n\n /** Max render depth to prevent infinite loops */\n maxDepth?: number;\n}\n\n/**\n * Render result with metadata\n */\nexport interface RenderResult {\n /** All chunks generated */\n chunks: FlightChunk[];\n\n /** Root chunk */\n root: ServerComponentChunk;\n\n /** Client references found */\n clientRefs: ClientReferenceChunk[];\n\n /** Timing info */\n timing: {\n startTime: number;\n endTime: number;\n duration: number;\n };\n}\n\n// ============================================================================\n// Renderer Implementation\n// ============================================================================\n\n/**\n * Flight Server Component Renderer\n */\nexport class FlightRenderer {\n private chunks: FlightChunk[] = [];\n private clientRefs: ClientReferenceChunk[] = [];\n private pendingPromises = new Map<string, Promise<FlightElement>>();\n private depth = 0;\n\n constructor(\n private adapter: UIAdapter,\n private options: RenderOptions = {}\n ) { }\n\n /**\n * Render a component tree to Flight chunks\n */\n async render(\n element: unknown,\n ctx: ServerContext\n ): Promise<RenderResult> {\n const startTime = Date.now();\n\n this.chunks = [];\n this.clientRefs = [];\n this.pendingPromises.clear();\n this.depth = 0;\n\n try {\n // Render the root element\n const rootTree = await this.renderElement(element, ctx);\n const root = createServerChunk('root', rootTree);\n this.chunks.unshift(root);\n\n // Wait for any pending async boundaries\n await this.resolvePendingChunks(ctx);\n\n const endTime = Date.now();\n\n return {\n chunks: this.chunks,\n root,\n clientRefs: this.clientRefs,\n timing: {\n startTime,\n endTime,\n duration: endTime - startTime,\n },\n };\n } catch (error) {\n const errChunk = createErrorChunk('root', error as Error, this.options.dev);\n this.chunks.push(errChunk);\n\n throw error;\n }\n }\n\n /**\n * Render as async generator (for streaming)\n */\n async *renderStreaming(\n element: unknown,\n ctx: ServerContext\n ): AsyncGenerator<FlightChunk> {\n // Note: startTime available for future timing features\n this.chunks = [];\n this.clientRefs = [];\n this.pendingPromises.clear();\n this.depth = 0;\n\n try {\n // Render root synchronously\n const rootTree = await this.renderElement(element, ctx);\n const root = createServerChunk('root', rootTree);\n yield root;\n\n // Yield pending chunks as they resolve\n while (this.pendingPromises.size > 0) {\n const entries = [...this.pendingPromises.entries()];\n\n // Race all pending promises\n const promises = entries.map(async ([id, promise]) => {\n const tree = await promise;\n this.pendingPromises.delete(id);\n return createServerChunk(id, tree);\n });\n\n // Yield first to complete\n const chunk = await Promise.race(promises);\n yield chunk;\n }\n\n // Yield all client refs\n for (const clientRef of this.clientRefs) {\n yield clientRef;\n }\n\n } catch (error) {\n yield createErrorChunk('root', error as Error, this.options.dev);\n }\n }\n\n /**\n * Render an element to FlightElement\n */\n private async renderElement(\n element: unknown,\n ctx: ServerContext\n ): Promise<FlightElement> {\n // Check depth limit\n this.depth++;\n if (this.depth > (this.options.maxDepth ?? 100)) {\n throw new Error('Maximum render depth exceeded. Check for infinite component loops.');\n }\n\n try {\n // Handle null/undefined/boolean\n if (element === null || element === undefined || typeof element === 'boolean') {\n return { $$type: 'null' };\n }\n\n // Handle primitives\n if (typeof element === 'string') {\n return { $$type: 'text', value: element };\n }\n if (typeof element === 'number') {\n return { $$type: 'text', value: String(element) };\n }\n\n // Handle arrays (fragments)\n if (Array.isArray(element)) {\n const children = await Promise.all(\n element.map(child => this.renderElement(child, ctx))\n );\n return { $$type: 'fragment', children };\n }\n\n // Handle Client References\n if (isClientReference(element)) {\n return this.renderClientReference(element, ctx);\n }\n\n // Handle framework elements\n if (this.adapter.isElement(element)) {\n return this.renderFrameworkElement(element, ctx);\n }\n\n // Unknown - try to convert\n return toFlightElement(element);\n\n } finally {\n this.depth--;\n }\n }\n\n /**\n * Render a framework-specific element\n */\n private async renderFrameworkElement(\n element: unknown,\n ctx: ServerContext\n ): Promise<FlightElement> {\n const typeInfo = this.adapter.getElementType(element);\n const props = this.adapter.getProps(element);\n const key = this.adapter.getKey(element);\n\n switch (typeInfo.kind) {\n case 'host':\n return this.renderHostElement(typeInfo.tag, props, key, ctx);\n\n case 'component':\n return this.renderComponent(typeInfo.fn, typeInfo.name, props, ctx);\n\n case 'fragment': {\n const children = this.adapter.getChildren(element);\n const renderedChildren = await Promise.all(\n children.map(child => this.renderElement(child, ctx))\n );\n return { $$type: 'fragment', children: renderedChildren };\n }\n\n case 'suspense': {\n return this.renderSuspense(element, typeInfo.fallback, ctx);\n }\n\n case 'text':\n return { $$type: 'text', value: typeInfo.value };\n\n case 'null':\n return { $$type: 'null' };\n\n default:\n return { $$type: 'null' };\n }\n }\n\n /**\n * Render a host element (div, span, etc.)\n */\n private async renderHostElement(\n tag: string,\n props: Record<string, unknown>,\n key: string | number | undefined,\n ctx: ServerContext\n ): Promise<FlightElement> {\n // Extract children\n const { children: childrenProp, ...restProps } = props;\n\n // Serialize props (excluding functions and children)\n const serializedProps: Record<string, unknown> = {};\n for (const [propKey, value] of Object.entries(restProps)) {\n if (typeof value !== 'function') {\n serializedProps[propKey] = serialize(value);\n }\n }\n\n // Render children\n const rawChildren = childrenProp ?\n (Array.isArray(childrenProp) ? childrenProp : [childrenProp]) :\n [];\n\n const children = await Promise.all(\n rawChildren.map(child => this.renderElement(child, ctx))\n );\n\n return {\n $$type: 'host',\n tag,\n key,\n props: serializedProps as Record<string, import('./payload.js').SerializedValue>,\n children,\n };\n }\n\n /**\n * Render a component (server or client)\n */\n private async renderComponent(\n component: ComponentFn,\n name: string,\n props: Record<string, unknown>,\n ctx: ServerContext\n ): Promise<FlightElement> {\n // Check if this is a client component\n if (this.adapter.isClientBoundary(component)) {\n return this.renderClientBoundary(component, name, props, ctx);\n }\n\n // Execute server component\n try {\n const result = await component(props, ctx);\n return this.renderElement(result, ctx);\n } catch (error) {\n // Check for Suspense promise\n if (error instanceof Promise) {\n return this.renderAsyncBoundary(error, name, props, ctx);\n }\n\n this.options.onError?.(error as Error, name);\n throw error;\n }\n }\n\n /**\n * Render a client boundary\n */\n private async renderClientBoundary(\n component: ComponentFn,\n name: string,\n props: Record<string, unknown>,\n _ctx: ServerContext\n ): Promise<FlightElement> {\n const chunkId = generateChunkId('c');\n\n // Get module info from component\n const moduleId = (component as unknown as { __flight_module?: string }).__flight_module ?? name;\n const exportName = (component as unknown as { __flight_export?: string }).__flight_export ?? 'default';\n\n // Generate SSR fallback if enabled\n let fallback: string | undefined;\n if (this.options.includeSSRFallbacks && this.adapter.renderToString) {\n try {\n // Create element with props for SSR\n fallback = await this.adapter.renderToString(props);\n } catch {\n // SSR failed, continue without fallback\n }\n }\n\n // Create client reference chunk\n const clientChunk = createClientChunk(chunkId, moduleId, exportName, props, fallback);\n this.clientRefs.push(clientChunk);\n this.chunks.push(clientChunk);\n\n return {\n $$type: 'client',\n ref: chunkId,\n ssr: fallback,\n };\n }\n\n /**\n * Render a Suspense boundary\n */\n private async renderSuspense(\n element: unknown,\n fallbackElement: unknown,\n ctx: ServerContext\n ): Promise<FlightElement> {\n const boundaryId = generateChunkId('s');\n const children = this.adapter.getChildren(element);\n\n // Render fallback\n const fallback = fallbackElement ?\n await this.renderElement(fallbackElement, ctx) :\n { $$type: 'null' as const };\n\n // Render children\n const renderedChildren: FlightElement[] = [];\n for (const child of children) {\n try {\n const rendered = await this.renderElement(child, ctx);\n renderedChildren.push(rendered);\n } catch (error) {\n if (error instanceof Promise) {\n // This is a suspended promise\n this.pendingPromises.set(boundaryId, error.then(async () => {\n const children = this.adapter.getChildren(element);\n const rendered = await Promise.all(\n children.map(c => this.renderElement(c, ctx))\n );\n return { $$type: 'fragment' as const, children: rendered };\n }));\n\n // Return suspense with fallback for now\n return {\n $$type: 'suspense',\n id: boundaryId,\n fallback,\n children: [{ $$type: 'lazy', id: boundaryId, fallback }],\n };\n }\n throw error;\n }\n }\n\n return {\n $$type: 'suspense',\n id: boundaryId,\n fallback,\n children: renderedChildren,\n };\n }\n\n /**\n * Render an async boundary (promise thrown from component)\n */\n private renderAsyncBoundary(\n promise: Promise<unknown>,\n name: string,\n props: Record<string, unknown>,\n ctx: ServerContext\n ): FlightElement {\n const boundaryId = generateChunkId('a');\n\n // Track this promise\n this.pendingPromises.set(boundaryId,\n promise.then(async () => {\n // Re-render the component after promise resolves\n const component = (props as unknown as { component: ComponentFn }).component;\n if (component) {\n const result = await component(props, ctx);\n return this.renderElement(result, ctx);\n }\n return { $$type: 'null' as const };\n })\n );\n\n return {\n $$type: 'lazy',\n id: boundaryId,\n fallback: { $$type: 'text', value: `Loading ${name}...` },\n };\n }\n\n /**\n * Render a Client Reference directly\n */\n private async renderClientReference(\n ref: ClientReference,\n _ctx: ServerContext\n ): Promise<FlightElement> {\n const chunkId = generateChunkId('c');\n\n const clientChunk = createClientChunk(\n chunkId,\n ref.__flight_module,\n ref.__flight_export,\n {} // Props are embedded in the reference\n );\n\n this.clientRefs.push(clientChunk);\n this.chunks.push(clientChunk);\n\n return {\n $$type: 'client',\n ref: chunkId,\n };\n }\n\n /**\n * Resolve all pending async chunks\n */\n private async resolvePendingChunks(_ctx: ServerContext): Promise<void> {\n while (this.pendingPromises.size > 0) {\n const entries = [...this.pendingPromises.entries()];\n\n for (const [id, promise] of entries) {\n try {\n const tree = await promise;\n this.chunks.push(createServerChunk(id, tree));\n } catch (error) {\n this.chunks.push(createErrorChunk(id, error as Error, this.options.dev));\n }\n this.pendingPromises.delete(id);\n }\n }\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create a renderer with adapter\n */\nexport function createRenderer(\n adapter: UIAdapter,\n options?: RenderOptions\n): FlightRenderer {\n return new FlightRenderer(adapter, options);\n}\n\n/**\n * Render a server component tree\n */\nexport async function renderServerComponent<P>(\n component: ComponentFn,\n props: P,\n ctx: ServerContext,\n adapter: UIAdapter,\n options?: RenderOptions\n): Promise<RenderResult> {\n const renderer = createRenderer(adapter, options);\n\n // Create element using adapter (framework-agnostic)\n const element = adapter.createElement(component, props as Record<string, unknown>);\n\n return renderer.render(element, ctx);\n}\n\nexport async function* renderServerComponentStreaming<P>(\n component: ComponentFn,\n props: P,\n ctx: ServerContext,\n adapter: UIAdapter,\n options?: RenderOptions\n): AsyncGenerator<FlightChunk> {\n const renderer = createRenderer(adapter, options);\n\n // Create element using adapter (framework-agnostic)\n const element = adapter.createElement(component, props as Record<string, unknown>);\n\n yield* renderer.renderStreaming(element, ctx);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/streaming/adapters/index.ts"],"names":[],"mappings":"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","file":"chunk-GNS2FGPC.js","sourcesContent":["/**\n * @flight-framework/core - Multi-Framework Streaming Adapters\n * \n * Streaming SSR adapters for React, Vue, Svelte, Solid, and HTMX.\n * Uses dependency injection pattern for optional framework dependencies.\n * \n * Best Practices 2026:\n * - Dependency injection for optional peer dependencies\n * - Support both Node.js and Edge runtimes \n * - Progressive hydration support\n * - Error boundary integration\n * \n * @example\n * ```typescript\n * // React adapter with your imports\n * import { renderToReadableStream } from 'react-dom/server';\n * \n * const adapter = createReactStreamAdapter({\n * renderToReadableStream,\n * bootstrapModules: ['/client.js'],\n * });\n * ```\n */\n\nimport type { StreamingRenderOptions, StreamingRenderResult } from '../index.js';\n\n// ============================================================================\n// Common Types\n// ============================================================================\n\n/**\n * Framework-specific streaming adapter\n */\nexport interface StreamingAdapter<TComponent = unknown> {\n /** Adapter name */\n readonly name: string;\n /** Framework version support */\n readonly framework: string;\n /** Runtime support */\n readonly runtime: 'universal' | 'node' | 'edge';\n\n /**\n * Create a streaming response from a component\n */\n stream(\n component: TComponent,\n options?: StreamingRenderOptions\n ): Promise<StreamingRenderResult>;\n\n /**\n * Render to static string (for comparison/fallback)\n */\n renderToString?(component: TComponent): Promise<string>;\n}\n\n/**\n * Common adapter options\n */\nexport interface AdapterOptions {\n /** Enable streaming (default: true) */\n streaming?: boolean;\n /** Scripts to bootstrap on client */\n bootstrapScripts?: string[];\n /** Modules to bootstrap on client */\n bootstrapModules?: string[];\n /** Error handling strategy */\n onError?: (error: Error) => void;\n /** Shell ready callback */\n onShellReady?: () => void;\n /** All content ready callback */\n onAllReady?: () => void;\n}\n\n// ============================================================================\n// React Adapter (Dependency Injection Pattern)\n// ============================================================================\n\n/**\n * React streaming adapter options with required dependencies\n */\nexport interface ReactAdapterOptions extends AdapterOptions {\n /** React's renderToReadableStream (for Edge) */\n renderToReadableStream?: (\n element: unknown,\n options?: {\n bootstrapScripts?: string[];\n bootstrapModules?: string[];\n identifierPrefix?: string;\n signal?: AbortSignal;\n onError?: (error: unknown) => void;\n }\n ) => Promise<ReadableStream<Uint8Array> & { allReady: Promise<void> }>;\n\n /** React's renderToString (for static fallback) */\n renderToString?: (element: unknown) => string;\n\n /** Custom identifier prefix */\n identifierPrefix?: string;\n /** Abort signal */\n signal?: AbortSignal;\n}\n\n/**\n * Create a React streaming adapter\n * \n * @example\n * ```typescript\n * import { renderToReadableStream, renderToString } from 'react-dom/server';\n * \n * const adapter = createReactStreamAdapter({\n * renderToReadableStream,\n * renderToString,\n * bootstrapModules: ['/client.js'],\n * });\n * \n * const result = await adapter.stream(<App />);\n * ```\n */\nexport function createReactStreamAdapter(options: ReactAdapterOptions): StreamingAdapter {\n if (!options.renderToReadableStream) {\n throw new Error(\n '[Flight] createReactStreamAdapter requires renderToReadableStream. ' +\n 'Import it from react-dom/server and pass it in options.'\n );\n }\n\n return {\n name: 'react',\n framework: 'react@18+',\n runtime: 'edge',\n\n async stream(component, streamOptions = {}) {\n const mergedOptions = { ...options, ...streamOptions };\n\n let resolveShell: () => void;\n let resolveAll: () => void;\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\n const allReady = new Promise<void>((r) => { resolveAll = r; });\n\n const stream = await options.renderToReadableStream!(component, {\n bootstrapScripts: mergedOptions.bootstrapScripts,\n bootstrapModules: mergedOptions.bootstrapModules,\n identifierPrefix: mergedOptions.identifierPrefix,\n signal: mergedOptions.signal,\n onError: (error: unknown) => {\n mergedOptions.onError?.(error as Error);\n },\n });\n\n // Shell is ready when stream is created\n resolveShell!();\n mergedOptions.onShellReady?.();\n\n // Track all ready via stream completion\n stream.allReady.then(() => {\n resolveAll!();\n mergedOptions.onAllReady?.();\n });\n\n return {\n stream,\n abort: () => { /* stream handles abort via signal */ },\n shellReady,\n allReady,\n };\n },\n\n async renderToString(component) {\n if (!options.renderToString) {\n throw new Error('[Flight] renderToString not provided to adapter');\n }\n return options.renderToString(component);\n },\n };\n}\n\n// ============================================================================\n// Vue Adapter (Dependency Injection Pattern)\n// ============================================================================\n\n/**\n * Vue streaming adapter options\n */\nexport interface VueAdapterOptions extends AdapterOptions {\n /** Vue's renderToWebStream */\n renderToWebStream?: (app: unknown, context?: Record<string, unknown>) => ReadableStream;\n /** Vue's renderToString */\n renderToString?: (app: unknown) => Promise<string>;\n /** Vue app context */\n context?: Record<string, unknown>;\n}\n\n/**\n * Create a Vue 3 streaming adapter\n * \n * @example\n * ```typescript\n * import { renderToWebStream, renderToString } from 'vue/server-renderer';\n * \n * const adapter = createVueStreamAdapter({\n * renderToWebStream,\n * renderToString,\n * });\n * \n * const result = await adapter.stream(createSSRApp(App));\n * ```\n */\nexport function createVueStreamAdapter(options: VueAdapterOptions): StreamingAdapter {\n if (!options.renderToWebStream) {\n throw new Error(\n '[Flight] createVueStreamAdapter requires renderToWebStream. ' +\n 'Import it from vue/server-renderer and pass it in options.'\n );\n }\n\n return {\n name: 'vue',\n framework: 'vue@3+',\n runtime: 'universal',\n\n async stream(app, streamOptions = {}) {\n const mergedOptions = { ...options, ...streamOptions };\n\n let resolveShell: () => void;\n let resolveAll: () => void;\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\n const allReady = new Promise<void>((r) => { resolveAll = r; });\n\n try {\n const stream = options.renderToWebStream!(app, mergedOptions.context);\n\n // Vue streams shell immediately\n resolveShell!();\n mergedOptions.onShellReady?.();\n\n // Wrap to detect completion\n const reader = stream.getReader();\n\n const wrappedStream = new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { done, value } = await reader.read();\n if (done) {\n resolveAll!();\n mergedOptions.onAllReady?.();\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n });\n\n return {\n stream: wrappedStream,\n abort: () => reader.cancel(),\n shellReady,\n allReady,\n };\n } catch (error) {\n mergedOptions.onError?.(error as Error);\n throw error;\n }\n },\n\n async renderToString(app) {\n if (!options.renderToString) {\n throw new Error('[Flight] renderToString not provided to adapter');\n }\n return options.renderToString(app);\n },\n };\n}\n\n// ============================================================================\n// Solid Adapter (Dependency Injection Pattern)\n// ============================================================================\n\n/**\n * Solid streaming adapter options\n */\nexport interface SolidAdapterOptions extends AdapterOptions {\n /** Solid's renderToStream */\n renderToStream?: (\n fn: () => unknown,\n options?: {\n nonce?: string;\n onCompleteShell?: () => void;\n onCompleteAll?: () => void;\n }\n ) => { pipeTo: (writable: WritableStream) => void };\n /** Solid's renderToString */\n renderToString?: (fn: () => unknown) => string;\n /** Nonce for CSP */\n nonce?: string;\n}\n\n/**\n * Create a Solid.js streaming adapter\n * \n * @example\n * ```typescript\n * import { renderToStream, renderToString } from 'solid-js/web';\n * \n * const adapter = createSolidStreamAdapter({\n * renderToStream,\n * renderToString,\n * });\n * \n * const result = await adapter.stream(() => <App />);\n * ```\n */\nexport function createSolidStreamAdapter(options: SolidAdapterOptions): StreamingAdapter {\n if (!options.renderToStream) {\n throw new Error(\n '[Flight] createSolidStreamAdapter requires renderToStream. ' +\n 'Import it from solid-js/web and pass it in options.'\n );\n }\n\n return {\n name: 'solid',\n framework: 'solid-js@1+',\n runtime: 'universal',\n\n async stream(component, streamOptions = {}) {\n const mergedOptions = { ...options, ...streamOptions };\n\n let resolveShell: () => void;\n let resolveAll: () => void;\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\n const allReady = new Promise<void>((r) => { resolveAll = r; });\n\n try {\n const { readable, writable } = new TransformStream<Uint8Array, Uint8Array>();\n\n // Solid's renderToStream with async options\n const result = options.renderToStream!(component as () => unknown, {\n nonce: mergedOptions.nonce,\n onCompleteShell: () => {\n resolveShell!();\n mergedOptions.onShellReady?.();\n },\n onCompleteAll: () => {\n resolveAll!();\n mergedOptions.onAllReady?.();\n },\n });\n\n // Pipe to transform stream\n result.pipeTo(writable);\n\n return {\n stream: readable,\n abort: () => writable.abort(),\n shellReady,\n allReady,\n };\n } catch (error) {\n mergedOptions.onError?.(error as Error);\n throw error;\n }\n },\n\n async renderToString(component) {\n if (!options.renderToString) {\n throw new Error('[Flight] renderToString not provided to adapter');\n }\n return options.renderToString(component as () => unknown);\n },\n };\n}\n\n// ============================================================================\n// Svelte Adapter (Dependency Injection Pattern)\n// ============================================================================\n\n/**\n * Svelte streaming adapter options\n */\nexport interface SvelteAdapterOptions extends AdapterOptions {\n /** Svelte's render function */\n render?: (\n component: unknown,\n options?: { props?: Record<string, unknown> }\n ) => { body: string; head?: string };\n /** Props for the component */\n props?: Record<string, unknown>;\n}\n\n/**\n * Create a Svelte 5 streaming adapter\n * Note: Svelte's SSR is primarily string-based, streaming is simulated\n * \n * @example\n * ```typescript\n * import { render } from 'svelte/server';\n * \n * const adapter = createSvelteStreamAdapter({\n * render,\n * props: { name: 'World' },\n * });\n * \n * const result = await adapter.stream(App);\n * ```\n */\nexport function createSvelteStreamAdapter(options: SvelteAdapterOptions): StreamingAdapter {\n if (!options.render) {\n throw new Error(\n '[Flight] createSvelteStreamAdapter requires render. ' +\n 'Import it from svelte/server and pass it in options.'\n );\n }\n\n return {\n name: 'svelte',\n framework: 'svelte@5+',\n runtime: 'universal',\n\n async stream(component, streamOptions = {}) {\n const mergedOptions = { ...options, ...streamOptions };\n\n let resolveShell: () => void;\n let resolveAll: () => void;\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\n const allReady = new Promise<void>((r) => { resolveAll = r; });\n\n try {\n // Render to string first\n const result = options.render!(component, { props: mergedOptions.props || {} });\n const html = result.body;\n\n // Convert to stream\n const encoder = new TextEncoder();\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n // Send head/css first\n if (result.head) {\n controller.enqueue(encoder.encode(result.head));\n }\n\n resolveShell!();\n mergedOptions.onShellReady?.();\n\n // Send body\n controller.enqueue(encoder.encode(html));\n\n resolveAll!();\n mergedOptions.onAllReady?.();\n controller.close();\n },\n });\n\n return {\n stream,\n abort: () => { },\n shellReady,\n allReady,\n };\n } catch (error) {\n mergedOptions.onError?.(error as Error);\n throw error;\n }\n },\n\n async renderToString(component) {\n const result = options.render!(component, { props: options?.props || {} });\n return result.body;\n },\n };\n}\n\n// ============================================================================\n// HTMX Streaming Adapter (SSE-based)\n// ============================================================================\n\n/**\n * HTMX streaming adapter options\n */\nexport interface HTMXAdapterOptions extends AdapterOptions {\n /** Event name for SSE */\n eventName?: string;\n /** Retry interval for SSE */\n retryMs?: number;\n}\n\n/**\n * Create an HTMX SSE streaming adapter\n * Uses Server-Sent Events for progressive updates\n * \n * @example\n * ```typescript\n * const adapter = createHTMXStreamAdapter({\n * eventName: 'update',\n * retryMs: 3000,\n * });\n * \n * const result = await adapter.stream(['<div>Part 1</div>', '<div>Part 2</div>']);\n * ```\n */\nexport function createHTMXStreamAdapter(options?: HTMXAdapterOptions): StreamingAdapter<string[]> {\n return {\n name: 'htmx',\n framework: 'htmx@2+',\n runtime: 'universal',\n\n async stream(htmlChunks, streamOptions = {}) {\n const mergedOptions = { ...options, ...streamOptions };\n const eventName = mergedOptions.eventName || 'message';\n const retryMs = mergedOptions.retryMs || 3000;\n\n let resolveShell: () => void;\n let resolveAll: () => void;\n const shellReady = new Promise<void>((r) => { resolveShell = r; });\n const allReady = new Promise<void>((r) => { resolveAll = r; });\n\n const encoder = new TextEncoder();\n let chunkIndex = 0;\n\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n // Send retry configuration\n controller.enqueue(encoder.encode(`retry: ${retryMs}\\n\\n`));\n resolveShell!();\n mergedOptions.onShellReady?.();\n },\n\n async pull(controller) {\n if (chunkIndex >= htmlChunks.length) {\n resolveAll!();\n mergedOptions.onAllReady?.();\n controller.close();\n return;\n }\n\n const chunk = htmlChunks[chunkIndex++];\n const sseData = `event: ${eventName}\\ndata: ${JSON.stringify(chunk)}\\n\\n`;\n controller.enqueue(encoder.encode(sseData));\n },\n });\n\n return {\n stream,\n abort: () => { },\n shellReady,\n allReady,\n };\n },\n };\n}\n\n// ============================================================================\n// Adapter Factory\n// ============================================================================\n\nexport type FrameworkType = 'react' | 'vue' | 'solid' | 'svelte' | 'htmx';\n\n/**\n * Create a streaming adapter for any supported framework\n * Note: For react, vue, solid, svelte you need to pass the required dependencies\n */\nexport function createStreamAdapter(\n framework: FrameworkType,\n options?: AdapterOptions & Record<string, unknown>\n): StreamingAdapter {\n switch (framework) {\n case 'react':\n return createReactStreamAdapter(options as ReactAdapterOptions);\n case 'vue':\n return createVueStreamAdapter(options as VueAdapterOptions);\n case 'solid':\n return createSolidStreamAdapter(options as SolidAdapterOptions);\n case 'svelte':\n return createSvelteStreamAdapter(options as SvelteAdapterOptions);\n case 'htmx':\n return createHTMXStreamAdapter(options as HTMXAdapterOptions);\n default:\n throw new Error(`[Flight] Unknown framework: ${framework}`);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rsc/adapters/react.ts"],"names":[],"mappings":"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","file":"chunk-HNPO6LFW.js","sourcesContent":["/**\n * @flight-framework/core - React UI Adapter\n * \n * Adapter for using React with Flight Server Components.\n * Enables Flight to render React elements without tight coupling.\n * \n * @module @flight-framework/core/rsc/adapters/react\n */\n\nimport type { UIAdapter, ElementTypeInfo } from '../renderer.js';\n\n// ============================================================================\n// React Symbols\n// ============================================================================\n\n// React internal symbols (stable across versions)\nconst REACT_ELEMENT_TYPE = Symbol.for('react.element');\nconst REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nconst REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nconst REACT_CONTEXT_TYPE = Symbol.for('react.context');\nconst REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nconst REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nconst REACT_MEMO_TYPE = Symbol.for('react.memo');\nconst REACT_LAZY_TYPE = Symbol.for('react.lazy');\n\n// Flight reference symbols\nconst CLIENT_REFERENCE = Symbol.for('flight.client.reference');\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * React element shape (minimal interface)\n */\ninterface ReactElement {\n $$typeof: symbol;\n type: unknown;\n key: string | number | null;\n ref: unknown;\n props: Record<string, unknown>;\n _owner: unknown;\n}\n\n// ============================================================================\n// Adapter Implementation\n// ============================================================================\n\n/**\n * Create React UI Adapter\n * \n * @example\n * ```typescript\n * import { createReactAdapter } from '@flight-framework/core/rsc/adapters/react';\n * import { renderToString } from 'react-dom/server';\n * import * as React from 'react';\n * \n * const adapter = createReactAdapter({\n * React,\n * renderToString,\n * });\n * \n * const renderer = createRenderer(adapter);\n * ```\n */\nexport function createReactAdapter(deps?: {\n /** React module (optional - for SSR) */\n React?: {\n isValidElement: (value: unknown) => boolean;\n Children: { toArray: (children: unknown) => unknown[] };\n Fragment: symbol;\n Suspense: unknown;\n };\n /** renderToString function (optional - for SSR fallbacks) */\n renderToString?: (element: unknown) => string;\n}): UIAdapter {\n const { React, renderToString } = deps || {};\n\n return {\n name: 'react',\n\n isElement(value: unknown): boolean {\n if (React) {\n return React.isValidElement(value);\n }\n // Fallback: check for $$typeof\n return (\n typeof value === 'object' &&\n value !== null &&\n '$$typeof' in value &&\n (value as ReactElement).$$typeof === REACT_ELEMENT_TYPE\n );\n },\n\n getElementType(element: unknown): ElementTypeInfo {\n const el = element as ReactElement;\n const type = el.type;\n\n // String = host element (div, span, etc.)\n if (typeof type === 'string') {\n return { kind: 'host', tag: type };\n }\n\n // Symbol types\n if (typeof type === 'symbol') {\n if (type === REACT_FRAGMENT_TYPE || type === (React?.Fragment as symbol)) {\n return { kind: 'fragment' };\n }\n if (type === REACT_SUSPENSE_TYPE || (React?.Suspense && type === (React.Suspense as unknown as symbol))) {\n return {\n kind: 'suspense',\n fallback: el.props.fallback\n };\n }\n if (type === REACT_PROVIDER_TYPE) {\n return { kind: 'provider', value: el.props.value };\n }\n if (type === REACT_CONTEXT_TYPE) {\n return { kind: 'context' };\n }\n return { kind: 'null' };\n }\n\n // Object types (memo, lazy, forwardRef)\n if (typeof type === 'object' && type !== null) {\n const typeObj = type as { $$typeof?: symbol; type?: unknown; render?: unknown };\n\n if (typeObj.$$typeof === REACT_MEMO_TYPE) {\n // Unwrap memo\n return this.getElementType({ ...el, type: typeObj.type });\n }\n\n if (typeObj.$$typeof === REACT_LAZY_TYPE) {\n return { kind: 'component', fn: () => null, name: 'Lazy' };\n }\n\n if (typeObj.$$typeof === REACT_FORWARD_REF_TYPE && typeObj.render) {\n return {\n kind: 'component',\n fn: typeObj.render as (props: Record<string, unknown>) => unknown,\n name: 'ForwardRef'\n };\n }\n\n // Check for Suspense object\n if ('$$typeof' in typeObj &&\n (typeObj.$$typeof === REACT_SUSPENSE_TYPE)) {\n return { kind: 'suspense', fallback: el.props.fallback };\n }\n }\n\n // Function component\n if (typeof type === 'function') {\n const fn = type as ((props: Record<string, unknown>) => unknown) & {\n displayName?: string;\n name?: string;\n };\n return {\n kind: 'component',\n fn,\n name: fn.displayName || fn.name || 'Component'\n };\n }\n\n return { kind: 'null' };\n },\n\n getProps(element: unknown): Record<string, unknown> {\n return (element as ReactElement).props || {};\n },\n\n getChildren(element: unknown): unknown[] {\n const props = (element as ReactElement).props;\n const children = props?.children;\n\n if (children === undefined || children === null) {\n return [];\n }\n\n if (React?.Children) {\n return React.Children.toArray(children);\n }\n\n // Fallback array handling\n if (Array.isArray(children)) {\n return children.flat();\n }\n\n return [children];\n },\n\n getKey(element: unknown): string | number | undefined {\n const key = (element as ReactElement).key;\n return key !== null ? key : undefined;\n },\n\n isClientBoundary(component: unknown): boolean {\n if (typeof component !== 'function') return false;\n\n const comp = component as {\n $$typeof?: symbol;\n __flight_client?: boolean;\n };\n\n // Check for Flight client marker\n if (comp.__flight_client === true) return true;\n\n // Check for client reference symbol\n if (comp.$$typeof === CLIENT_REFERENCE) return true;\n\n return false;\n },\n\n createElement(\n component: (props: Record<string, unknown>) => unknown,\n props: Record<string, unknown>\n ): unknown {\n // Create a React element using the internal structure\n // This is framework-agnostic from the caller's perspective\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: component,\n key: null,\n ref: null,\n props,\n _owner: null,\n };\n },\n\n async renderToString(element: unknown): Promise<string> {\n if (renderToString) {\n return renderToString(element);\n }\n throw new Error(\n 'renderToString not provided. Pass it when creating the adapter: ' +\n 'createReactAdapter({ renderToString })'\n );\n },\n };\n}\n\n// ============================================================================\n// React Client Consumer\n// ============================================================================\n\n/**\n * Opciones para el consumer de React\n */\nexport interface ReactConsumerOptions {\n /** Registry de client components */\n registry?: Map<string, () => Promise<unknown>>;\n /** Callback when hydration completes */\n onHydrate?: (id: string) => void;\n}\n\n/**\n * Create a React client-side consumer for Flight payloads\n * \n * This reconstructs React elements from Flight chunks on the client.\n */\nexport function createReactConsumer(deps: {\n React: {\n createElement: (type: unknown, props?: unknown, ...children: unknown[]) => unknown;\n Suspense: unknown;\n Fragment: unknown;\n lazy: (factory: () => Promise<{ default: unknown }>) => unknown;\n };\n}, options: ReactConsumerOptions = {}) {\n const { React } = deps;\n const { registry = new Map() } = options;\n\n return {\n /**\n * Register a client component\n */\n register(id: string, loader: () => Promise<unknown>): void {\n registry.set(id, loader);\n },\n\n /**\n * Convert Flight elements to React elements\n */\n toReactElement(element: import('../payload.js').FlightElement): unknown {\n switch (element.$$type) {\n case 'null':\n return null;\n\n case 'text':\n return element.value;\n\n case 'host': {\n const children = element.children.map(c => this.toReactElement(c));\n return React.createElement(\n element.tag,\n { ...element.props, key: element.key },\n ...children\n );\n }\n\n case 'fragment': {\n const children = element.children.map(c => this.toReactElement(c));\n return React.createElement(React.Fragment, null, ...children);\n }\n\n case 'suspense': {\n const fallback = this.toReactElement(element.fallback);\n const children = element.children.map(c => this.toReactElement(c));\n return React.createElement(\n React.Suspense,\n { fallback },\n ...children\n );\n }\n\n case 'client': {\n // Get loader from registry\n const loader = registry.get(element.ref);\n if (!loader) {\n console.warn(`[Flight] Client component not registered: ${element.ref}`);\n // Return SSR fallback if available\n if (element.ssr) {\n return React.createElement('div', {\n dangerouslySetInnerHTML: { __html: element.ssr }\n });\n }\n return null;\n }\n\n // Create lazy component\n const LazyComponent = React.lazy(async () => {\n const mod = await loader() as { default?: unknown };\n return { default: mod.default ?? mod };\n });\n\n return React.createElement(LazyComponent);\n }\n\n case 'lazy': {\n // This is a pending chunk - render fallback\n if (element.fallback) {\n return this.toReactElement(element.fallback);\n }\n return React.createElement('div', { 'data-flight-pending': element.id });\n }\n\n default:\n return null;\n }\n },\n\n /**\n * Process Flight chunks and build React tree\n */\n processChunks(chunks: import('../payload.js').FlightChunk[]): unknown {\n // Find root chunk\n const rootChunk = chunks.find(c => c.type === 'S' && c.id === 'root');\n if (!rootChunk || rootChunk.type !== 'S') {\n throw new Error('[Flight] No root chunk found in payload');\n }\n\n // Register all client references\n for (const chunk of chunks) {\n if (chunk.type === 'C') {\n // Default registry - lazy load via dynamic import\n if (!registry.has(chunk.id)) {\n registry.set(chunk.id, () => import(/* webpackIgnore: true */ chunk.module));\n }\n }\n }\n\n return this.toReactElement(rootChunk.tree);\n }\n };\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Type helper for React Server Component\n */\nexport type ReactServerComponent<P = Record<string, unknown>> = (\n props: P,\n ctx: import('../context.js').ServerContext\n) => Promise<ReturnType<typeof import('react').createElement>> | ReturnType<typeof import('react').createElement>;\n\n/**\n * Mark a component as a client component (for use without bundler transform)\n */\nexport function markAsClientComponent<T extends (...args: unknown[]) => unknown>(\n component: T,\n moduleId: string,\n exportName = 'default'\n): T {\n const marked = component as T & {\n $$typeof: symbol;\n __flight_client: boolean;\n __flight_module: string;\n __flight_export: string;\n };\n\n marked.$$typeof = CLIENT_REFERENCE;\n marked.__flight_client = true;\n marked.__flight_module = moduleId;\n marked.__flight_export = exportName;\n\n return marked;\n}\n"]}