@flight-framework/core 0.6.5 → 0.6.7

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 (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +541 -541
  3. package/dist/actions/index.d.ts +1 -58
  4. package/dist/actions/index.js +1 -1
  5. package/dist/adapters/index.js +1 -1
  6. package/dist/cache/index.js +1 -1
  7. package/dist/{chunk-FSJNOPYE.js → chunk-2JVEH76V.js} +3 -3
  8. package/dist/chunk-2JVEH76V.js.map +1 -0
  9. package/dist/{chunk-VPFMHGEV.js → chunk-3N5ZBVZJ.js} +2 -2
  10. package/dist/chunk-3N5ZBVZJ.js.map +1 -0
  11. package/dist/{chunk-2F2QU6RC.js → chunk-3UQJE3XZ.js} +2 -2
  12. package/dist/chunk-3UQJE3XZ.js.map +1 -0
  13. package/dist/{chunk-3KRBRSRJ.js → chunk-4U7CJVNQ.js} +2 -2
  14. package/dist/chunk-4U7CJVNQ.js.map +1 -0
  15. package/dist/{chunk-PDW5WCMW.js → chunk-5XHOLZBJ.js} +2 -2
  16. package/dist/chunk-5XHOLZBJ.js.map +1 -0
  17. package/dist/{chunk-MDQNNIHH.js → chunk-65JYF3DJ.js} +2 -2
  18. package/dist/chunk-65JYF3DJ.js.map +1 -0
  19. package/dist/{chunk-K2CQZPCG.js → chunk-6GI6HFSQ.js} +2 -2
  20. package/dist/chunk-6GI6HFSQ.js.map +1 -0
  21. package/dist/{chunk-LNV47HGV.js → chunk-6IG6XIXU.js} +2 -2
  22. package/dist/chunk-6IG6XIXU.js.map +1 -0
  23. package/dist/{chunk-PVUMB632.js → chunk-A2QRUBVE.js} +2 -2
  24. package/dist/chunk-A2QRUBVE.js.map +1 -0
  25. package/dist/{chunk-W6D62JCI.js → chunk-A4TKWQBU.js} +2 -2
  26. package/dist/chunk-A4TKWQBU.js.map +1 -0
  27. package/dist/{chunk-GCQZ4FHI.js → chunk-ARBKF6VI.js} +2 -2
  28. package/dist/{chunk-GCQZ4FHI.js.map → chunk-ARBKF6VI.js.map} +1 -1
  29. package/dist/{chunk-ZVC3ZWLM.js → chunk-B2LPSCES.js} +2 -2
  30. package/dist/chunk-B2LPSCES.js.map +1 -0
  31. package/dist/{chunk-62C7LX2E.js → chunk-CKJHJPKQ.js} +2 -2
  32. package/dist/chunk-CKJHJPKQ.js.map +1 -0
  33. package/dist/{chunk-RSVA2EYO.js → chunk-CNY3ZUVG.js} +2 -2
  34. package/dist/chunk-CNY3ZUVG.js.map +1 -0
  35. package/dist/{chunk-IXMD5QH2.js → chunk-EHVUAFNH.js} +2 -2
  36. package/dist/chunk-EHVUAFNH.js.map +1 -0
  37. package/dist/{chunk-P6WSBVDT.js → chunk-FRAH5QNY.js} +4 -4
  38. package/dist/chunk-FRAH5QNY.js.map +1 -0
  39. package/dist/{chunk-MQQLYWZZ.js → chunk-GNS2FGPC.js} +2 -2
  40. package/dist/chunk-GNS2FGPC.js.map +1 -0
  41. package/dist/{chunk-TASAT7KB.js → chunk-HNPO6LFW.js} +2 -2
  42. package/dist/chunk-HNPO6LFW.js.map +1 -0
  43. package/dist/{chunk-EGB7C73X.js → chunk-KDEA64UX.js} +5 -5
  44. package/dist/chunk-KDEA64UX.js.map +1 -0
  45. package/dist/{chunk-NWMJYTMB.js → chunk-LAKHYTHL.js} +3 -3
  46. package/dist/chunk-LAKHYTHL.js.map +1 -0
  47. package/dist/{chunk-R7SQAREQ.js → chunk-LKOPJ3GS.js} +2 -2
  48. package/dist/chunk-LKOPJ3GS.js.map +1 -0
  49. package/dist/{chunk-WOEIJWGJ.js → chunk-NZS2YJ43.js} +2 -2
  50. package/dist/chunk-NZS2YJ43.js.map +1 -0
  51. package/dist/{chunk-XGP3C2ZE.js → chunk-OZ3EXPLE.js} +4 -112
  52. package/dist/chunk-OZ3EXPLE.js.map +1 -0
  53. package/dist/{chunk-YHEVHRLH.js → chunk-OZBPR27I.js} +2 -2
  54. package/dist/chunk-OZBPR27I.js.map +1 -0
  55. package/dist/{chunk-T4Z4HM4W.js → chunk-PAVI5W6M.js} +3 -3
  56. package/dist/chunk-PAVI5W6M.js.map +1 -0
  57. package/dist/chunk-PL37KFRJ.js +3 -0
  58. package/dist/chunk-PL37KFRJ.js.map +1 -0
  59. package/dist/{chunk-XSY5AAXT.js → chunk-PO7IHPFF.js} +2 -2
  60. package/dist/chunk-PO7IHPFF.js.map +1 -0
  61. package/dist/{chunk-OYF2OAKS.js → chunk-R7MEVVA4.js} +2 -2
  62. package/dist/chunk-R7MEVVA4.js.map +1 -0
  63. package/dist/{chunk-WFAWAHJH.js → chunk-UFWGOJL7.js} +2 -2
  64. package/dist/chunk-UFWGOJL7.js.map +1 -0
  65. package/dist/{chunk-XOIYNY4I.js → chunk-VNO2YUVD.js} +2 -2
  66. package/dist/chunk-VNO2YUVD.js.map +1 -0
  67. package/dist/{chunk-ZIE56LCA.js → chunk-XU6MRYG2.js} +3 -3
  68. package/dist/chunk-XU6MRYG2.js.map +1 -0
  69. package/dist/{chunk-6BDCTUQY.js → chunk-YNTMYL36.js} +3 -3
  70. package/dist/chunk-YNTMYL36.js.map +1 -0
  71. package/dist/{chunk-77MJZCYD.js → chunk-ZQS3WBE7.js} +2 -2
  72. package/dist/chunk-ZQS3WBE7.js.map +1 -0
  73. package/dist/client.d.ts +1 -1
  74. package/dist/client.js +9 -9
  75. package/dist/client.js.map +1 -1
  76. package/dist/config/index.js +1 -1
  77. package/dist/errors/index.js +2 -2
  78. package/dist/file-router/index.js +1 -1
  79. package/dist/file-router/streaming-hints.js +1 -1
  80. package/dist/handlers/index.js +1 -1
  81. package/dist/index.d.ts +1 -3
  82. package/dist/index.js +31 -31
  83. package/dist/index.js.map +1 -1
  84. package/dist/islands/index.js +1 -1
  85. package/dist/middleware/index.js +1 -1
  86. package/dist/react/index.js +2 -2
  87. package/dist/react/index.js.map +1 -1
  88. package/dist/render/index.js +1 -1
  89. package/dist/router/index.js +1 -1
  90. package/dist/rsc/adapters/index.js +4 -4
  91. package/dist/rsc/adapters/preact.js +1 -1
  92. package/dist/rsc/adapters/react.js +1 -1
  93. package/dist/rsc/adapters/solid.js +1 -1
  94. package/dist/rsc/adapters/vue.js +1 -1
  95. package/dist/rsc/boundaries.js +1 -1
  96. package/dist/rsc/context.js +1 -1
  97. package/dist/rsc/index.js +11 -11
  98. package/dist/rsc/legacy.js +1 -1
  99. package/dist/rsc/payload.js +1 -1
  100. package/dist/rsc/plugins/esbuild.js +2 -2
  101. package/dist/rsc/plugins/index.js +4 -4
  102. package/dist/rsc/plugins/rollup.js +2 -2
  103. package/dist/rsc/renderer.js +3 -3
  104. package/dist/rsc/stream.js +1 -1
  105. package/dist/rsc/vite-plugin.js +2 -2
  106. package/dist/server/index.js +4 -4
  107. package/dist/streaming/adapters/index.js +1 -1
  108. package/dist/streaming/conditional.js +1 -1
  109. package/dist/streaming/index.js +1 -1
  110. package/dist/streaming/observability.js +2 -2
  111. package/dist/streaming/priority.js +1 -1
  112. package/dist/utils/index.d.ts +28 -83
  113. package/dist/utils/index.js +2 -2
  114. package/package.json +225 -235
  115. package/dist/chunk-2F2QU6RC.js.map +0 -1
  116. package/dist/chunk-3KRBRSRJ.js.map +0 -1
  117. package/dist/chunk-62C7LX2E.js.map +0 -1
  118. package/dist/chunk-6BDCTUQY.js.map +0 -1
  119. package/dist/chunk-77MJZCYD.js.map +0 -1
  120. package/dist/chunk-EGB7C73X.js.map +0 -1
  121. package/dist/chunk-FSJNOPYE.js.map +0 -1
  122. package/dist/chunk-IXMD5QH2.js.map +0 -1
  123. package/dist/chunk-J7WEZXWH.js +0 -14
  124. package/dist/chunk-J7WEZXWH.js.map +0 -1
  125. package/dist/chunk-K2CQZPCG.js.map +0 -1
  126. package/dist/chunk-LNV47HGV.js.map +0 -1
  127. package/dist/chunk-MDQNNIHH.js.map +0 -1
  128. package/dist/chunk-MFUJN7RV.js +0 -20
  129. package/dist/chunk-MFUJN7RV.js.map +0 -1
  130. package/dist/chunk-MQQLYWZZ.js.map +0 -1
  131. package/dist/chunk-NWMJYTMB.js.map +0 -1
  132. package/dist/chunk-OYF2OAKS.js.map +0 -1
  133. package/dist/chunk-P6WSBVDT.js.map +0 -1
  134. package/dist/chunk-PDW5WCMW.js.map +0 -1
  135. package/dist/chunk-PVUMB632.js.map +0 -1
  136. package/dist/chunk-R7SQAREQ.js.map +0 -1
  137. package/dist/chunk-RSVA2EYO.js.map +0 -1
  138. package/dist/chunk-T4Z4HM4W.js.map +0 -1
  139. package/dist/chunk-TASAT7KB.js.map +0 -1
  140. package/dist/chunk-VPFMHGEV.js.map +0 -1
  141. package/dist/chunk-W6D62JCI.js.map +0 -1
  142. package/dist/chunk-WF46NESN.js +0 -67
  143. package/dist/chunk-WF46NESN.js.map +0 -1
  144. package/dist/chunk-WFAWAHJH.js.map +0 -1
  145. package/dist/chunk-WOEIJWGJ.js.map +0 -1
  146. package/dist/chunk-XGP3C2ZE.js.map +0 -1
  147. package/dist/chunk-XOIYNY4I.js.map +0 -1
  148. package/dist/chunk-XSY5AAXT.js.map +0 -1
  149. package/dist/chunk-YHEVHRLH.js.map +0 -1
  150. package/dist/chunk-ZIE56LCA.js.map +0 -1
  151. package/dist/chunk-ZVC3ZWLM.js.map +0 -1
  152. package/dist/env-9do2c6yn.d.ts +0 -42
  153. package/dist/plugins/env-plugin.d.ts +0 -47
  154. package/dist/plugins/env-plugin.js +0 -3
  155. package/dist/plugins/env-plugin.js.map +0 -1
  156. package/dist/plugins/index.d.ts +0 -221
  157. package/dist/plugins/index.js +0 -192
  158. package/dist/plugins/index.js.map +0 -1
  159. package/dist/plugins/server-boundary-plugin.d.ts +0 -40
  160. package/dist/plugins/server-boundary-plugin.js +0 -3
  161. package/dist/plugins/server-boundary-plugin.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/islands/index.ts"],"names":[],"mappings":"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","file":"chunk-UFWGOJL7.js","sourcesContent":["/**\n * @flight-framework/core - Islands Architecture\n * \n * Selective hydration with fine-grained control over when and how\n * components become interactive. Framework-agnostic islands primitives.\n * \n * Best Practices 2026:\n * - Minimal JavaScript: Only hydrate what needs interactivity\n * - Lazy hydration: Load JS when actually needed\n * - Progressive enhancement: Works without JS\n * - Performance: Reduce main thread work\n * \n * @example\n * ```typescript\n * import { defineIsland, renderIsland, hydrateIslands } from '@flight-framework/core/islands';\n * \n * // Server: Define an interactive island\n * const Counter = defineIsland({\n * id: 'counter',\n * component: CounterComponent,\n * hydrate: 'visible', // Only hydrate when scrolled into view\n * });\n * \n * // Server: Render to HTML with island markers\n * const html = await renderIsland(Counter, { initial: 0 });\n * \n * // Client: Hydrate all islands on the page\n * hydrateIslands();\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * When to hydrate the island\n */\nexport type HydrationTrigger =\n | 'load' // Immediate: hydrate as soon as JS loads\n | 'idle' // When browser is idle (requestIdleCallback)\n | 'visible' // When island enters viewport (IntersectionObserver)\n | 'interaction' // On first user interaction (click, focus, hover)\n | 'media' // When media query matches\n | 'never' // Never hydrate (static HTML only)\n | CustomHydrationTrigger;\n\n/**\n * Custom hydration trigger function\n */\nexport interface CustomHydrationTrigger {\n type: 'custom';\n /** Name for debugging */\n name: string;\n /** Function that returns a promise resolving when hydration should occur */\n when: (element: HTMLElement) => Promise<void>;\n}\n\n/**\n * Island configuration\n */\nexport interface IslandConfig<P = Record<string, unknown>> {\n /** Unique identifier for this island type */\n id: string;\n /** The component to render (framework-specific) */\n component: unknown;\n /** When to hydrate on client */\n hydrate: HydrationTrigger;\n /** Default props */\n defaultProps?: P;\n /** Media query for 'media' trigger */\n mediaQuery?: string;\n /** Path to client-side component bundle */\n clientEntry?: string;\n /** Fallback HTML while not hydrated (optional override) */\n fallback?: string;\n /** Loading priority hint */\n priority?: 'high' | 'low';\n}\n\n/**\n * Island instance with props\n */\nexport interface Island<P = Record<string, unknown>> {\n /** Island configuration */\n config: IslandConfig<P>;\n /** Instance props */\n props: P;\n /** Unique instance ID (for multiple instances of same island type) */\n instanceId: string;\n}\n\n/**\n * Rendered island HTML with metadata\n */\nexport interface RenderedIsland {\n /** The HTML string */\n html: string;\n /** Island ID */\n id: string;\n /** Instance ID */\n instanceId: string;\n /** Serialized props for hydration */\n propsScript: string;\n /** CSS if any */\n css?: string;\n}\n\n/**\n * Island registry for client-side hydration\n */\nexport interface IslandRegistry {\n /** Register a component for an island ID */\n register(id: string, loader: () => Promise<unknown>): void;\n /** Get registered loader */\n get(id: string): (() => Promise<unknown>) | undefined;\n /** Check if island is registered */\n has(id: string): boolean;\n}\n\n/**\n * Client-side hydration options\n */\nexport interface HydrateOptions {\n /** Root element to scan for islands */\n root?: HTMLElement;\n /** Custom island registry */\n registry?: IslandRegistry;\n /** Callback when an island is hydrated */\n onHydrate?: (id: string, instanceId: string, duration: number) => void;\n /** Callback on hydration error */\n onError?: (id: string, error: Error) => void;\n}\n\n// ============================================================================\n// Server-Side: Island Definition\n// ============================================================================\n\nlet instanceCounter = 0;\n\n/**\n * Generate a unique instance ID\n */\nfunction generateInstanceId(islandId: string): string {\n return `${islandId}:${++instanceCounter}:${Math.random().toString(36).slice(2, 7)}`;\n}\n\n/**\n * Define an island component\n */\nexport function defineIsland<P = Record<string, unknown>>(\n config: IslandConfig<P>\n): (props?: P) => Island<P> {\n return (props?: P) => ({\n config,\n props: { ...config.defaultProps, ...props } as P,\n instanceId: generateInstanceId(config.id),\n });\n}\n\n/**\n * Serialize props for client-side hydration\n */\nfunction serializeProps(props: Record<string, unknown>): string {\n try {\n return JSON.stringify(props);\n } catch {\n console.warn('[Flight Islands] Props are not serializable, using empty object');\n return '{}';\n }\n}\n\n/**\n * Get hydration trigger attribute value\n */\nfunction getHydrateAttr(trigger: HydrationTrigger): string {\n if (typeof trigger === 'object' && trigger.type === 'custom') {\n return `custom:${trigger.name}`;\n }\n return trigger as string;\n}\n\n// ============================================================================\n// Server-Side: Island Rendering\n// ============================================================================\n\n/**\n * UI framework adapter for island rendering\n */\nexport interface IslandRenderAdapter {\n /** Framework name */\n name: string;\n /** Render component to HTML */\n renderToString(component: unknown, props: Record<string, unknown>): Promise<string>;\n /** Get CSS if any */\n getCSS?(component: unknown): string;\n}\n\nlet globalAdapter: IslandRenderAdapter | null = null;\n\n/**\n * Set the global island render adapter\n */\nexport function setIslandAdapter(adapter: IslandRenderAdapter): void {\n globalAdapter = adapter;\n}\n\n/**\n * Render an island to HTML with hydration markers\n */\nexport async function renderIsland<P extends Record<string, unknown>>(\n island: Island<P>,\n adapter?: IslandRenderAdapter\n): Promise<RenderedIsland> {\n const renderAdapter = adapter || globalAdapter;\n\n if (!renderAdapter) {\n throw new Error(\n '[Flight Islands] No render adapter set. Call setIslandAdapter() or pass adapter to renderIsland().'\n );\n }\n\n const { config, props, instanceId } = island;\n\n // Render component to HTML\n const componentHtml = await renderAdapter.renderToString(config.component, props);\n const css = renderAdapter.getCSS?.(config.component);\n\n // Build island wrapper with data attributes\n const hydrateAttr = getHydrateAttr(config.hydrate);\n const propsJson = serializeProps(props);\n\n const html = `\n<flight-island \n data-island=\"${config.id}\"\n data-instance=\"${instanceId}\"\n data-hydrate=\"${hydrateAttr}\"\n ${config.mediaQuery ? `data-media=\"${config.mediaQuery}\"` : ''}\n ${config.clientEntry ? `data-entry=\"${config.clientEntry}\"` : ''}\n ${config.priority ? `data-priority=\"${config.priority}\"` : ''}\n>\n ${componentHtml}\n</flight-island>`;\n\n // Props script (inline for hydration)\n const propsScript = `<script type=\"application/json\" data-island-props=\"${instanceId}\">${propsJson}</script>`;\n\n return {\n html,\n id: config.id,\n instanceId,\n propsScript,\n css,\n };\n}\n\n/**\n * Render multiple islands and collect their outputs\n */\nexport async function renderIslands<P extends Record<string, unknown>>(\n islands: Island<P>[],\n adapter?: IslandRenderAdapter\n): Promise<{\n html: string;\n propsScripts: string;\n css: string;\n}> {\n const rendered = await Promise.all(\n islands.map(island => renderIsland(island, adapter))\n );\n\n return {\n html: rendered.map(r => r.html).join('\\n'),\n propsScripts: rendered.map(r => r.propsScript).join('\\n'),\n css: rendered.filter(r => r.css).map(r => r.css).join('\\n'),\n };\n}\n\n// ============================================================================\n// Client-Side: Island Hydration\n// ============================================================================\n\n/**\n * Create an island registry for client-side hydration\n */\nexport function createIslandRegistry(): IslandRegistry {\n const loaders = new Map<string, () => Promise<unknown>>();\n\n return {\n register(id: string, loader: () => Promise<unknown>) {\n loaders.set(id, loader);\n },\n get(id: string) {\n return loaders.get(id);\n },\n has(id: string) {\n return loaders.has(id);\n },\n };\n}\n\n// Global registry for convenience\nconst globalRegistry = createIslandRegistry();\n\n/**\n * Register an island component for client-side hydration\n */\nexport function registerIsland(id: string, loader: () => Promise<unknown>): void {\n globalRegistry.register(id, loader);\n}\n\n/**\n * Client-side hydration bootstrapper\n * Call this in your client entry point\n */\nexport function hydrateIslands(options?: HydrateOptions): void {\n const {\n root = typeof document !== 'undefined' ? document.body : null,\n registry = globalRegistry,\n onHydrate,\n onError,\n } = options || {};\n\n if (!root || typeof document === 'undefined') {\n console.warn('[Flight Islands] hydrateIslands called in non-browser environment');\n return;\n }\n\n // Find all island elements\n const islands = root.querySelectorAll<HTMLElement>('flight-island[data-island]');\n\n islands.forEach((element) => {\n const islandId = element.dataset.island!;\n const instanceId = element.dataset.instance!;\n const hydrateTrigger = element.dataset.hydrate as string;\n const mediaQuery = element.dataset.media;\n\n // Check if component is registered\n if (!registry.has(islandId)) {\n console.warn(`[Flight Islands] No component registered for island: ${islandId}`);\n return;\n }\n\n // Setup hydration based on trigger\n setupHydration(\n element,\n islandId,\n instanceId,\n hydrateTrigger,\n mediaQuery,\n registry,\n onHydrate,\n onError\n );\n });\n}\n\n/**\n * Setup hydration trigger for an island element\n */\nfunction setupHydration(\n element: HTMLElement,\n islandId: string,\n instanceId: string,\n trigger: string,\n mediaQuery: string | undefined,\n registry: IslandRegistry,\n onHydrate?: (id: string, instanceId: string, duration: number) => void,\n onError?: (id: string, error: Error) => void\n): void {\n const hydrate = async () => {\n const startTime = performance.now();\n\n try {\n // Load component\n const loader = registry.get(islandId)!;\n const module = await loader() as { default?: unknown };\n const Component = module.default || module;\n\n // Get props\n const propsScript = document.querySelector(`[data-island-props=\"${instanceId}\"]`);\n const props = propsScript ? JSON.parse(propsScript.textContent || '{}') : {};\n\n // Hydrate (framework-specific, emit event for now)\n element.dispatchEvent(new CustomEvent('flight:hydrate', {\n detail: { Component, props, islandId, instanceId },\n bubbles: true,\n }));\n\n // Mark as hydrated\n element.setAttribute('data-hydrated', 'true');\n\n const duration = performance.now() - startTime;\n onHydrate?.(islandId, instanceId, duration);\n\n } catch (error) {\n console.error(`[Flight Islands] Failed to hydrate ${islandId}:`, error);\n element.setAttribute('data-hydrate-error', 'true');\n onError?.(islandId, error as Error);\n }\n };\n\n // Skip if already hydrated\n if (element.hasAttribute('data-hydrated')) return;\n\n switch (trigger) {\n case 'load':\n // Immediate hydration\n hydrate();\n break;\n\n case 'idle':\n // When browser is idle\n if ('requestIdleCallback' in window) {\n (window as unknown as { requestIdleCallback: (cb: () => void, opts?: { timeout: number }) => void })\n .requestIdleCallback(() => hydrate(), { timeout: 2000 });\n } else {\n setTimeout(hydrate, 200);\n }\n break;\n\n case 'visible': {\n // When element enters viewport\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n observer.disconnect();\n hydrate();\n }\n });\n },\n { rootMargin: '50px' }\n );\n observer.observe(element);\n break;\n }\n\n case 'interaction': {\n // On first user interaction\n const events = ['click', 'focus', 'touchstart', 'mouseenter'];\n const onInteraction = () => {\n events.forEach(e => element.removeEventListener(e, onInteraction));\n hydrate();\n };\n events.forEach(e => element.addEventListener(e, onInteraction, { once: true, passive: true }));\n break;\n }\n\n case 'media':\n // When media query matches\n if (mediaQuery) {\n const mql = window.matchMedia(mediaQuery);\n const check = () => {\n if (mql.matches) {\n mql.removeEventListener('change', check);\n hydrate();\n }\n };\n if (mql.matches) {\n hydrate();\n } else {\n mql.addEventListener('change', check);\n }\n }\n break;\n\n case 'never':\n // Never hydrate\n break;\n\n default:\n // Custom trigger\n if (trigger.startsWith('custom:')) {\n // Custom triggers need manual setup\n element.dispatchEvent(new CustomEvent('flight:custom-hydrate', {\n detail: { hydrate, trigger: trigger.replace('custom:', '') },\n bubbles: true,\n }));\n }\n }\n}\n\n// ============================================================================\n// Utility: Framework-Specific Adapter Factories\n// These return adapters that users configure with their own framework imports\n// ============================================================================\n\n/**\n * Create a React island render adapter\n * \n * @example\n * ```typescript\n * import { renderToString } from 'react-dom/server';\n * import { createElement } from 'react';\n * \n * const reactAdapter = createReactIslandAdapter({\n * renderToString,\n * createElement,\n * });\n * ```\n */\nexport function createReactIslandAdapter(deps: {\n renderToString: (element: unknown) => string;\n createElement: (type: unknown, props?: unknown) => unknown;\n}): IslandRenderAdapter {\n return {\n name: 'react',\n async renderToString(component, props) {\n const element = deps.createElement(component, props);\n return deps.renderToString(element);\n },\n };\n}\n\n/**\n * Create a Preact island render adapter\n * \n * @example\n * ```typescript\n * import { renderToString } from 'preact-render-to-string';\n * import { h } from 'preact';\n * \n * const preactAdapter = createPreactIslandAdapter({\n * renderToString,\n * h,\n * });\n * ```\n */\nexport function createPreactIslandAdapter(deps: {\n renderToString: (element: unknown) => string;\n h: (type: unknown, props?: unknown) => unknown;\n}): IslandRenderAdapter {\n return {\n name: 'preact',\n async renderToString(component, props) {\n const element = deps.h(component, props);\n return deps.renderToString(element);\n },\n };\n}\n\n/**\n * Create a Vue island render adapter\n * \n * @example\n * ```typescript\n * import { renderToString, createSSRApp } from 'vue/server-renderer';\n * \n * const vueAdapter = createVueIslandAdapter({\n * renderToString,\n * createSSRApp,\n * });\n * ```\n */\nexport function createVueIslandAdapter(deps: {\n renderToString: (app: unknown) => Promise<string>;\n createSSRApp: (component: unknown, props?: unknown) => unknown;\n}): IslandRenderAdapter {\n return {\n name: 'vue',\n async renderToString(component, props) {\n const app = deps.createSSRApp(component, props);\n return deps.renderToString(app);\n },\n };\n}\n\n/**\n * Create a Solid island render adapter\n * \n * @example\n * ```typescript\n * import { renderToString } from 'solid-js/web';\n * \n * const solidAdapter = createSolidIslandAdapter({\n * renderToString,\n * });\n * ```\n */\nexport function createSolidIslandAdapter(deps: {\n renderToString: (fn: () => unknown) => string;\n}): IslandRenderAdapter {\n return {\n name: 'solid',\n async renderToString(component, props) {\n // Solid uses a function component pattern\n return deps.renderToString(() => (component as (p: unknown) => unknown)(props));\n },\n };\n}\n\n// ============================================================================\n// Custom Element Registration (optional)\n// ============================================================================\n\n/**\n * Register the flight-island custom element\n * This provides additional functionality like slot support\n */\nexport function registerFlightIslandElement(): void {\n if (typeof customElements === 'undefined') return;\n if (customElements.get('flight-island')) return;\n\n class FlightIsland extends HTMLElement {\n static get observedAttributes() {\n return ['data-hydrated', 'data-hydrate-error'];\n }\n\n connectedCallback() {\n // Could add loading indicator logic here\n }\n\n attributeChangedCallback(name: string, _oldValue: string, newValue: string) {\n if (name === 'data-hydrated' && newValue === 'true') {\n this.classList.add('hydrated');\n }\n if (name === 'data-hydrate-error' && newValue === 'true') {\n this.classList.add('hydrate-error');\n }\n }\n }\n\n customElements.define('flight-island', FlightIsland);\n}\n"]}
@@ -160,5 +160,5 @@ function createStaticResponse(html, options) {
160
160
  }
161
161
 
162
162
  export { DEFAULT_BOT_PATTERNS, addStreamingHeaders, createConditionalStreamer, createStaticResponse, createStreamingResponse, isBot, isSlowConnection, prefersNoStream, streamIf, supportsStreaming };
163
- //# sourceMappingURL=chunk-XOIYNY4I.js.map
164
- //# sourceMappingURL=chunk-XOIYNY4I.js.map
163
+ //# sourceMappingURL=chunk-VNO2YUVD.js.map
164
+ //# sourceMappingURL=chunk-VNO2YUVD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/streaming/conditional.ts"],"names":["result"],"mappings":"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","file":"chunk-VNO2YUVD.js","sourcesContent":["/**\n * @flight-framework/core - Conditional Streaming\n * \n * Smart streaming decisions based on request context.\n * Bots get full HTML, users get streaming - YOU control the logic.\n * \n * Best Practices 2026:\n * - SEO-friendly: Crawlers receive complete HTML\n * - Performance: Users get progressive streaming\n * - Flexibility: Custom conditions for any use case\n * \n * @example\n * ```typescript\n * import { streamIf } from '@flight-framework/core/streaming';\n * \n * const response = await streamIf({\n * request,\n * condition: (req) => !isBot(req), // YOUR logic\n * stream: () => createStreamingSSR({ ... }),\n * static: () => renderToString(<App />),\n * });\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Condition function to determine if streaming should be used\n */\nexport type StreamingCondition = (request: Request) => boolean | Promise<boolean>;\n\n/**\n * Built-in condition types\n */\nexport type BuiltInCondition =\n | 'always-stream' // Always use streaming\n | 'never-stream' // Always use static\n | 'no-bots' // Stream for users, static for bots\n | 'fast-network' // Stream only on fast connections\n | 'modern-browser'; // Stream only on modern browsers\n\n/**\n * Configuration for conditional streaming\n */\nexport interface StreamIfConfig<T = Response> {\n /** The incoming request */\n request: Request;\n /** Condition to check (function or built-in) */\n condition: StreamingCondition | BuiltInCondition;\n /** Factory for streaming response */\n stream: () => Promise<T> | T;\n /** Factory for static response */\n static: () => Promise<T> | T;\n /** Optional: Custom bot patterns */\n botPatterns?: RegExp[];\n /** Optional: Force streaming via query param (for testing) */\n forceStreamParam?: string;\n /** Optional: Force static via query param (for testing) */\n forceStaticParam?: string;\n}\n\n/**\n * Result of condition evaluation\n */\nexport interface StreamingDecision {\n /** Whether streaming was used */\n streaming: boolean;\n /** Reason for the decision */\n reason: string;\n /** The response */\n response: Response;\n}\n\n// ============================================================================\n// Bot Detection\n// ============================================================================\n\n/**\n * Default bot patterns for detection\n */\nexport const DEFAULT_BOT_PATTERNS: RegExp[] = [\n /googlebot/i,\n /bingbot/i,\n /slurp/i, // Yahoo\n /duckduckbot/i,\n /baiduspider/i,\n /yandexbot/i,\n /sogou/i,\n /facebot/i, // Facebook\n /twitterbot/i,\n /linkedinbot/i,\n /whatsapp/i,\n /telegrambot/i,\n /discordbot/i,\n /slackbot/i,\n /applebot/i,\n /crawler/i,\n /spider/i,\n /bot\\//i,\n /bot;/i,\n /headless/i, // Headless browsers\n /lighthouse/i, // Google Lighthouse\n /pagespeed/i,\n /gtmetrix/i,\n /pingdom/i,\n /uptimerobot/i,\n];\n\n/**\n * Check if a request is from a bot/crawler\n */\nexport function isBot(request: Request, customPatterns?: RegExp[]): boolean {\n const userAgent = request.headers.get('user-agent') || '';\n const patterns = customPatterns || DEFAULT_BOT_PATTERNS;\n return patterns.some(pattern => pattern.test(userAgent));\n}\n\n/**\n * Check if request explicitly asks for no streaming\n */\nexport function prefersNoStream(request: Request): boolean {\n // Check for custom header\n if (request.headers.get('x-no-stream') === 'true') return true;\n if (request.headers.get('x-prefer-static') === 'true') return true;\n\n // Check Accept header for preference\n const accept = request.headers.get('accept') || '';\n if (accept.includes('text/html; streaming=false')) return true;\n\n return false;\n}\n\n/**\n * Check if a connection is likely slow (based on headers)\n */\nexport function isSlowConnection(request: Request): boolean {\n // ECT (Effective Connection Type) header\n const ect = request.headers.get('ect');\n if (ect && ['slow-2g', '2g'].includes(ect)) return true;\n\n // Save-Data header\n if (request.headers.get('save-data') === 'on') return true;\n\n // Downlink header (Mbps)\n const downlink = request.headers.get('downlink');\n if (downlink && parseFloat(downlink) < 1) return true;\n\n return false;\n}\n\n/**\n * Check if browser supports streaming well\n */\nexport function supportsStreaming(request: Request): boolean {\n const userAgent = request.headers.get('user-agent') || '';\n\n // IE doesn't support streaming well\n if (/MSIE|Trident/i.test(userAgent)) return false;\n\n // Very old browsers\n if (/Opera Mini/i.test(userAgent)) return false;\n\n // Check for modern browser features via client hints\n const secChUa = request.headers.get('sec-ch-ua');\n if (secChUa) {\n // Has client hints = modern browser\n return true;\n }\n\n return true; // Default to supporting streaming\n}\n\n// ============================================================================\n// Built-in Conditions\n// ============================================================================\n\nfunction getBuiltInCondition(\n condition: BuiltInCondition,\n botPatterns?: RegExp[]\n): StreamingCondition {\n switch (condition) {\n case 'always-stream':\n return () => true;\n case 'never-stream':\n return () => false;\n case 'no-bots':\n return (req) => !isBot(req, botPatterns) && !prefersNoStream(req);\n case 'fast-network':\n return (req) => !isSlowConnection(req) && !isBot(req, botPatterns);\n case 'modern-browser':\n return (req) => supportsStreaming(req) && !isBot(req, botPatterns);\n }\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Conditionally use streaming or static rendering based on request context\n */\nexport async function streamIf<T = Response>(\n config: StreamIfConfig<T>\n): Promise<{ result: T; streaming: boolean; reason: string }> {\n const {\n request,\n condition,\n stream,\n static: staticFn,\n botPatterns,\n forceStreamParam = '__stream',\n forceStaticParam = '__static',\n } = config;\n\n // Check for forced mode via query params (useful for testing)\n const url = new URL(request.url);\n if (url.searchParams.has(forceStreamParam)) {\n const result = await stream();\n return { result, streaming: true, reason: 'forced via query param' };\n }\n if (url.searchParams.has(forceStaticParam)) {\n const result = await staticFn();\n return { result, streaming: false, reason: 'forced via query param' };\n }\n\n // Resolve condition\n const conditionFn = typeof condition === 'function'\n ? condition\n : getBuiltInCondition(condition, botPatterns);\n\n // Evaluate condition\n let shouldStream: boolean;\n let reason: string;\n\n try {\n shouldStream = await conditionFn(request);\n reason = shouldStream ? 'condition passed' : 'condition failed';\n } catch (error) {\n // On error, default to static (safer for SEO)\n shouldStream = false;\n reason = `condition error: ${error instanceof Error ? error.message : 'unknown'}`;\n }\n\n // Add specific reason for built-in conditions\n if (typeof condition === 'string') {\n if (!shouldStream && condition === 'no-bots') {\n reason = isBot(request, botPatterns)\n ? 'bot detected'\n : 'user prefers no streaming';\n } else if (!shouldStream && condition === 'fast-network') {\n reason = isSlowConnection(request)\n ? 'slow connection detected'\n : 'bot detected';\n }\n }\n\n // Execute appropriate renderer\n const result = shouldStream ? await stream() : await staticFn();\n return { result, streaming: shouldStream, reason };\n}\n\n/**\n * Create a middleware-style conditional streamer\n */\nexport function createConditionalStreamer<T = Response>(\n defaultCondition: StreamingCondition | BuiltInCondition,\n options?: {\n botPatterns?: RegExp[];\n forceStreamParam?: string;\n forceStaticParam?: string;\n }\n) {\n return async (config: {\n request: Request;\n stream: () => Promise<T> | T;\n static: () => Promise<T> | T;\n condition?: StreamingCondition | BuiltInCondition;\n }) => {\n return streamIf({\n request: config.request,\n condition: config.condition || defaultCondition,\n stream: config.stream,\n static: config.static,\n ...options,\n });\n };\n}\n\n// ============================================================================\n// Response Helpers\n// ============================================================================\n\n/**\n * Add streaming decision headers to response (for debugging)\n */\nexport function addStreamingHeaders(\n response: Response,\n decision: { streaming: boolean; reason: string }\n): Response {\n const headers = new Headers(response.headers);\n headers.set('X-Flight-Streaming', decision.streaming ? 'true' : 'false');\n headers.set('X-Flight-Streaming-Reason', decision.reason);\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\n/**\n * Create a streaming-aware Response with appropriate headers\n */\nexport function createStreamingResponse(\n stream: ReadableStream<Uint8Array>,\n options?: {\n status?: number;\n headers?: Record<string, string>;\n isStreaming?: boolean;\n }\n): Response {\n const { status = 200, headers = {}, isStreaming = true } = options || {};\n\n return new Response(stream, {\n status,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Transfer-Encoding': isStreaming ? 'chunked' : undefined,\n 'X-Content-Type-Options': 'nosniff',\n 'X-Flight-Streaming': isStreaming ? 'true' : 'false',\n ...headers,\n } as HeadersInit,\n });\n}\n\n/**\n * Create a static HTML Response\n */\nexport function createStaticResponse(\n html: string,\n options?: {\n status?: number;\n headers?: Record<string, string>;\n }\n): Response {\n const { status = 200, headers = {} } = options || {};\n\n return new Response(html, {\n status,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'X-Flight-Streaming': 'false',\n ...headers,\n },\n });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-PDW5WCMW.js';
1
+ import { analyzeModule, hasUseClientDirective, hasUseServerDirective, detectInlineServerActions } from './chunk-5XHOLZBJ.js';
2
2
 
3
3
  // src/rsc/vite-plugin.ts
4
4
  function flightRSC(options = {}) {
@@ -337,5 +337,5 @@ function extractExportNames(code) {
337
337
  var vite_plugin_default = flightRSC;
338
338
 
339
339
  export { flightRSC, vite_plugin_default };
340
- //# sourceMappingURL=chunk-ZIE56LCA.js.map
341
- //# sourceMappingURL=chunk-ZIE56LCA.js.map
340
+ //# sourceMappingURL=chunk-XU6MRYG2.js.map
341
+ //# sourceMappingURL=chunk-XU6MRYG2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rsc/vite-plugin.ts"],"names":["exports"],"mappings":"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","file":"chunk-XU6MRYG2.js","sourcesContent":["/**\n * @flight-framework/vite-plugin-rsc\n * \n * Vite plugin for Flight Server Components.\n * Transforms 'use client' and 'use server' directives at build time.\n * \n * Philosophy:\n * - Zero config for common cases\n * - Full control when needed\n * - Works with any Vite project\n * - No Next.js dependencies\n * \n * @module @flight-framework/vite-plugin-rsc\n */\n\nimport type { Plugin, ResolvedConfig } from 'vite';\nimport {\n analyzeModule,\n hasUseClientDirective,\n hasUseServerDirective,\n detectInlineServerActions,\n} from './boundaries.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Plugin configuration\n */\nexport interface FlightRSCPluginOptions {\n /** Include patterns (glob) */\n include?: string[];\n\n /** Exclude patterns (glob) */\n exclude?: string[];\n\n /** Server actions endpoint */\n actionsEndpoint?: string;\n\n /** Client manifest output path */\n clientManifest?: string;\n\n /** Server manifest output path */\n serverManifest?: string;\n\n /** Enable dev mode features */\n dev?: boolean;\n\n /** Custom transforms */\n transforms?: {\n /** Transform client components */\n client?: (code: string, id: string) => string | null;\n /** Transform server actions */\n server?: (code: string, id: string) => string | null;\n };\n}\n\n/**\n * Client manifest entry\n */\nexport interface ClientManifestEntry {\n id: string;\n file: string;\n exports: string[];\n chunks?: string[];\n}\n\n/**\n * Server manifest entry\n */\nexport interface ServerManifestEntry {\n id: string;\n file: string;\n actions: string[];\n}\n\n// ============================================================================\n// Plugin Implementation\n// ============================================================================\n\n/**\n * Flight RSC Vite Plugin\n * \n * @example\n * ```typescript\n * // vite.config.ts\n * import { flightRSC } from '@flight-framework/core/rsc/vite-plugin';\n * \n * export default defineConfig({\n * plugins: [\n * flightRSC({\n * actionsEndpoint: '/_flight/action',\n * }),\n * ],\n * });\n * ```\n */\nexport function flightRSC(options: FlightRSCPluginOptions = {}): Plugin[] {\n const {\n include = ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n exclude = ['**/node_modules/**', '**/.git/**'],\n actionsEndpoint = '/_flight/action',\n clientManifest = '.flight/client-manifest.json',\n serverManifest = '.flight/server-manifest.json',\n // dev flag reserved for future use\n } = options;\n\n // State\n const clientModules = new Map<string, ClientManifestEntry>();\n const serverActions = new Map<string, ServerManifestEntry>();\n let config: ResolvedConfig;\n let isSSR = false;\n\n return [\n // ================================================================\n // 1. Analyze modules and track boundaries\n // ================================================================\n {\n name: 'flight-rsc:analyze',\n enforce: 'pre',\n\n configResolved(resolvedConfig) {\n config = resolvedConfig;\n },\n\n transform(code, id) {\n // Skip excluded files\n if (!shouldProcess(id, include, exclude)) {\n return null;\n }\n\n // Analyze module\n const analysis = analyzeModule(code, id);\n\n // Track client modules\n if (analysis.fileDirective === 'client') {\n clientModules.set(id, {\n id: createModuleId(id, config),\n file: id,\n exports: analysis.clientComponents,\n });\n }\n\n // Track server actions\n if (analysis.fileDirective === 'server' || analysis.serverActions.length > 0) {\n serverActions.set(id, {\n id: createModuleId(id, config),\n file: id,\n actions: analysis.serverActions,\n });\n }\n\n return null;\n },\n },\n\n // ================================================================\n // 2. Transform client components to references (server bundle)\n // ================================================================\n {\n name: 'flight-rsc:client-transform',\n\n transform(code, id, opts) {\n isSSR = opts?.ssr ?? false;\n\n if (!isSSR) return null;\n if (!hasUseClientDirective(code)) return null;\n if (!shouldProcess(id, include, exclude)) return null;\n\n // Custom transform\n if (options.transforms?.client) {\n const result = options.transforms.client(code, id);\n if (result) return result;\n }\n\n // Replace client component with reference proxy\n const moduleId = createModuleId(id, config);\n const exports = extractExportNames(code);\n\n let transformed = `\n// Flight RSC: Client Component Reference\n// Original: ${id}\n\nconst __flight_client_module_id = ${JSON.stringify(moduleId)};\n\n`;\n\n // Create proxy for each export\n for (const exportName of exports) {\n if (exportName === 'default') {\n transformed += `\nconst __flight_default_proxy = Object.assign(\n function() {\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_client_module_id);\n },\n {\n $$typeof: Symbol.for('flight.client.reference'),\n $$id: __flight_client_module_id + '#default',\n $$async: false,\n __flight_client: true,\n __flight_module: __flight_client_module_id,\n __flight_export: 'default',\n }\n);\n\nexport default __flight_default_proxy;\n`;\n } else {\n transformed += `\nexport const ${exportName} = Object.assign(\n function() {\n throw new Error('Client Component cannot be called on the server. Module: ' + __flight_client_module_id);\n },\n {\n $$typeof: Symbol.for('flight.client.reference'),\n $$id: __flight_client_module_id + '#${exportName}',\n $$async: false,\n __flight_client: true,\n __flight_module: __flight_client_module_id,\n __flight_export: '${exportName}',\n }\n);\n`;\n }\n }\n\n return {\n code: transformed,\n map: null,\n };\n },\n },\n\n // ================================================================\n // 3. Transform server actions to RPC calls (client bundle)\n // ================================================================\n {\n name: 'flight-rsc:server-transform',\n\n transform(code, id, opts) {\n isSSR = opts?.ssr ?? false;\n\n if (isSSR) return null; // Only transform for client\n if (!shouldProcess(id, include, exclude)) return null;\n\n // Check for file-level 'use server'\n if (hasUseServerDirective(code)) {\n // Custom transform\n if (options.transforms?.server) {\n const result = options.transforms.server(code, id);\n if (result) return result;\n }\n\n // Replace all exports with RPC calls\n const moduleId = createModuleId(id, config);\n const exports = extractExportNames(code);\n\n let transformed = `\n// Flight RSC: Server Actions (RPC Proxies)\n// Original: ${id}\n\nconst __flight_actions_endpoint = ${JSON.stringify(actionsEndpoint)};\nconst __flight_module_id = ${JSON.stringify(moduleId)};\n\nasync function __flight_call_action(actionId, args) {\n const response = await fetch(__flight_actions_endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Flight-Action': actionId,\n },\n body: JSON.stringify({ actionId, args }),\n });\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Server action failed' }));\n throw new Error(error.message || 'Server action failed');\n }\n \n return response.json();\n}\n\n`;\n\n for (const exportName of exports) {\n const actionId = `${moduleId}#${exportName}`;\n if (exportName === 'default') {\n transformed += `\nexport default async function(...args) {\n return __flight_call_action(${JSON.stringify(actionId)}, args);\n}\n`;\n } else {\n transformed += `\nexport async function ${exportName}(...args) {\n return __flight_call_action(${JSON.stringify(actionId)}, args);\n}\n`;\n }\n }\n\n return {\n code: transformed,\n map: null,\n };\n }\n\n // Check for inline 'use server' in functions\n const inlineActions = detectInlineServerActions(code);\n if (inlineActions.length > 0) {\n // Transform specific functions to RPC calls\n let transformed = code;\n const moduleId = createModuleId(id, config);\n\n for (const actionName of inlineActions) {\n const actionId = `${moduleId}#${actionName}`;\n\n // Replace function with RPC call\n // This is a simplified transform - a real implementation would use AST\n const asyncFnPattern = new RegExp(\n `(async\\\\s+function\\\\s+${actionName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{[^}]*['\"]use server['\"][^}]*\\\\})`,\n 'g'\n );\n\n transformed = transformed.replace(asyncFnPattern, `\nasync function ${actionName}(...args) {\n const response = await fetch(${JSON.stringify(actionsEndpoint)}, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Flight-Action': ${JSON.stringify(actionId)},\n },\n body: JSON.stringify({ actionId: ${JSON.stringify(actionId)}, args }),\n });\n if (!response.ok) throw new Error('Server action failed');\n return response.json();\n}`\n );\n }\n\n if (transformed !== code) {\n return {\n code: transformed,\n map: null,\n };\n }\n }\n\n return null;\n },\n },\n\n // ================================================================\n // 4. Generate manifests\n // ================================================================\n {\n name: 'flight-rsc:manifest',\n\n generateBundle() {\n // Client manifest\n if (clientModules.size > 0) {\n const manifest = Object.fromEntries(clientModules);\n this.emitFile({\n type: 'asset',\n fileName: clientManifest,\n source: JSON.stringify(manifest, null, 2),\n });\n }\n\n // Server manifest\n if (serverActions.size > 0) {\n const manifest = Object.fromEntries(serverActions);\n this.emitFile({\n type: 'asset',\n fileName: serverManifest,\n source: JSON.stringify(manifest, null, 2),\n });\n }\n },\n },\n\n // ================================================================\n // 5. Dev server middleware for server actions\n // ================================================================\n {\n name: 'flight-rsc:dev-server',\n apply: 'serve',\n\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n if (req.url?.startsWith(actionsEndpoint) && req.method === 'POST') {\n try {\n // Parse request body\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = JSON.parse(Buffer.concat(chunks).toString());\n\n const { actionId, args } = body;\n\n // Find and execute action\n const [moduleId, actionName] = actionId.split('#');\n const entry = [...serverActions.values()].find(e => e.id === moduleId);\n\n if (!entry) {\n res.statusCode = 404;\n res.end(JSON.stringify({ error: 'Action not found' }));\n return;\n }\n\n // Load module and execute action\n const mod = await server.ssrLoadModule(entry.file);\n const action = mod[actionName] || mod.default;\n\n if (typeof action !== 'function') {\n res.statusCode = 404;\n res.end(JSON.stringify({ error: 'Action not found' }));\n return;\n }\n\n const result = await action(...args);\n\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(result));\n\n } catch (error) {\n console.error('[Flight RSC] Action error:', error);\n res.statusCode = 500;\n res.end(JSON.stringify({\n error: (error as Error).message\n }));\n }\n return;\n }\n\n next();\n });\n },\n },\n ];\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Check if file should be processed\n */\nfunction shouldProcess(id: string, include: string[], exclude: string[]): boolean {\n // Simple glob matching (for production, use picomatch)\n const isIncluded = include.some(pattern => {\n const regex = globToRegex(pattern);\n return regex.test(id);\n });\n\n const isExcluded = exclude.some(pattern => {\n const regex = globToRegex(pattern);\n return regex.test(id);\n });\n\n return isIncluded && !isExcluded;\n}\n\n/**\n * Convert glob pattern to regex (simplified)\n */\nfunction globToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '{{GLOBSTAR}}')\n .replace(/\\*/g, '[^/]*')\n .replace(/{{GLOBSTAR}}/g, '.*');\n\n return new RegExp(escaped);\n}\n\n/**\n * Create a stable module ID from file path\n */\nfunction createModuleId(id: string, config: ResolvedConfig): string {\n // Remove root prefix\n let moduleId = id;\n if (config?.root && id.startsWith(config.root)) {\n moduleId = id.slice(config.root.length);\n }\n\n // Normalize path\n moduleId = moduleId.replace(/\\\\/g, '/');\n if (!moduleId.startsWith('/')) {\n moduleId = '/' + moduleId;\n }\n\n return moduleId;\n}\n\n/**\n * Extract export names from source code\n */\nfunction extractExportNames(code: string): string[] {\n const exports: string[] = [];\n\n // export default\n if (/export\\s+default\\s+/.test(code)) {\n exports.push('default');\n }\n\n // export function/const/let/class Name\n const namedPattern = /export\\s+(?:async\\s+)?(?:function|const|let|var|class)\\s+(\\w+)/g;\n let match;\n while ((match = namedPattern.exec(code)) !== null) {\n if (match[1] && match[1] !== 'default') {\n exports.push(match[1]);\n }\n }\n\n // export { a, b, c }\n const bracketPattern = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\n while ((match = bracketPattern.exec(code)) !== null) {\n if (match[1]) {\n const names = match[1].split(',').map(n => {\n const parts = n.trim().split(/\\s+as\\s+/);\n return parts[parts.length - 1]!.trim();\n });\n exports.push(...names.filter(n => n && n !== 'default'));\n }\n }\n\n return [...new Set(exports)];\n}\n\nexport default flightRSC;\n"]}
@@ -1,4 +1,4 @@
1
- import { createStreamingSSR } from './chunk-RSVA2EYO.js';
1
+ import { createStreamingSSR } from './chunk-CNY3ZUVG.js';
2
2
 
3
3
  // src/streaming/observability.ts
4
4
  function generateStreamId() {
@@ -278,5 +278,5 @@ function createHttpObserver(endpoint, options) {
278
278
  }
279
279
 
280
280
  export { MetricsAggregator, createHttpObserver, createInstrumentedStream, createLoggerObserver };
281
- //# sourceMappingURL=chunk-6BDCTUQY.js.map
282
- //# sourceMappingURL=chunk-6BDCTUQY.js.map
281
+ //# sourceMappingURL=chunk-YNTMYL36.js.map
282
+ //# sourceMappingURL=chunk-YNTMYL36.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/streaming/observability.ts"],"names":[],"mappings":"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","file":"chunk-YNTMYL36.js","sourcesContent":["/**\n * @flight-framework/core - Streaming Observability\n * \n * Zero-telemetry metrics and instrumentation for streaming SSR.\n * All data stays on YOUR infrastructure - never sent anywhere.\n * \n * Best Practices 2026:\n * - Comprehensive timing metrics for each boundary\n * - Hook-based observability for custom integrations\n * - Performance insights without vendor lock-in\n * \n * @example\n * ```typescript\n * import { createInstrumentedStream } from '@flight-framework/core/streaming';\n * \n * const { stream, metrics } = await createInstrumentedStream({\n * shell: '<html>...',\n * boundaries: [...],\n * onMetrics: (m) => myAnalytics.track(m), // YOUR system\n * });\n * ```\n */\n\nimport type { StreamingRenderOptions, SuspenseBoundaryConfig } from './index.js';\nimport { createStreamingSSR } from './index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Timing information for a single boundary\n */\nexport interface BoundaryTiming {\n /** Boundary identifier */\n id: string;\n /** When the boundary started resolving (ms since stream start) */\n startTime: number;\n /** When the boundary finished resolving */\n endTime: number;\n /** Total duration in milliseconds */\n duration: number;\n /** Whether it resolved successfully */\n success: boolean;\n /** Size of content in bytes (if successful) */\n contentSize?: number;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Overall streaming metrics\n */\nexport interface StreamingMetrics {\n /** Unique ID for this stream session */\n streamId: string;\n /** When streaming started */\n startTime: number;\n /** Time to shell ready (TTFB improvement) */\n shellTime: number;\n /** Time until all boundaries resolved */\n totalStreamTime: number;\n /** Individual boundary timings */\n boundaries: BoundaryTiming[];\n /** Number of boundaries that resolved successfully */\n successCount: number;\n /** Number of boundaries that failed */\n errorCount: number;\n /** Total bytes streamed */\n totalBytes: number;\n /** Strategy used (if priority streaming) */\n strategy?: string;\n /** Custom metadata you can add */\n meta?: Record<string, unknown>;\n}\n\n/**\n * Observability hooks for streaming events\n */\nexport interface StreamingObserver {\n /** Called when streaming starts */\n onStreamStart?: (streamId: string) => void;\n /** Called when shell is sent */\n onShellReady?: (timing: { streamId: string; duration: number }) => void;\n /** Called when a boundary starts resolving */\n onBoundaryStart?: (info: { streamId: string; boundaryId: string; startTime: number }) => void;\n /** Called when a boundary finishes */\n onBoundaryEnd?: (timing: BoundaryTiming & { streamId: string }) => void;\n /** Called when streaming completes */\n onStreamEnd?: (metrics: StreamingMetrics) => void;\n /** Called on any error */\n onError?: (error: { streamId: string; boundaryId?: string; error: Error }) => void;\n}\n\n/**\n * Configuration for instrumented streaming\n */\nexport interface InstrumentedStreamConfig {\n /** Initial HTML shell */\n shell: string;\n /** Closing HTML */\n shellEnd: string;\n /** Suspense boundaries */\n suspenseBoundaries: SuspenseBoundaryConfig[];\n /** Streaming options */\n options?: StreamingRenderOptions;\n /** Observer hooks */\n observer?: StreamingObserver;\n /** Callback when all metrics are ready */\n onMetrics?: (metrics: StreamingMetrics) => void;\n /** Custom metadata to include in metrics */\n meta?: Record<string, unknown>;\n}\n\n/**\n * Result of instrumented streaming\n */\nexport interface InstrumentedStreamResult {\n /** The readable stream */\n stream: ReadableStream<Uint8Array>;\n /** Abort the stream */\n abort: () => void;\n /** Shell ready promise */\n shellReady: Promise<void>;\n /** All content ready promise */\n allReady: Promise<void>;\n /** Final metrics (resolves when stream completes) */\n metrics: Promise<StreamingMetrics>;\n /** Stream ID for correlation */\n streamId: string;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Generate a unique stream ID\n */\nfunction generateStreamId(): string {\n return `stream_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Create an instrumented streaming SSR response with full observability\n */\nexport async function createInstrumentedStream(\n config: InstrumentedStreamConfig\n): Promise<InstrumentedStreamResult> {\n const {\n shell,\n shellEnd,\n suspenseBoundaries,\n options = {},\n observer,\n onMetrics,\n meta,\n } = config;\n\n const streamId = generateStreamId();\n const startTime = Date.now();\n const boundaryTimings: BoundaryTiming[] = [];\n const boundaryStarts = new Map<string, number>();\n let shellTime = 0;\n let totalBytes = 0;\n\n // Metrics promise\n let resolveMetrics: (m: StreamingMetrics) => void;\n const metricsPromise = new Promise<StreamingMetrics>((r) => { resolveMetrics = r; });\n\n // Notify stream start\n observer?.onStreamStart?.(streamId);\n\n // Wrap boundaries with instrumentation\n const instrumentedBoundaries: SuspenseBoundaryConfig[] = suspenseBoundaries.map(boundary => {\n const boundaryStart = Date.now();\n boundaryStarts.set(boundary.id, boundaryStart);\n\n observer?.onBoundaryStart?.({\n streamId,\n boundaryId: boundary.id,\n startTime: boundaryStart - startTime,\n });\n\n return {\n ...boundary,\n contentPromise: boundary.contentPromise.then(\n (content) => {\n const endTime = Date.now();\n const timing: BoundaryTiming = {\n id: boundary.id,\n startTime: boundaryStarts.get(boundary.id)! - startTime,\n endTime: endTime - startTime,\n duration: endTime - boundaryStarts.get(boundary.id)!,\n success: true,\n contentSize: new TextEncoder().encode(content).length,\n };\n boundaryTimings.push(timing);\n observer?.onBoundaryEnd?.({ ...timing, streamId });\n return content;\n },\n (error) => {\n const endTime = Date.now();\n const timing: BoundaryTiming = {\n id: boundary.id,\n startTime: boundaryStarts.get(boundary.id)! - startTime,\n endTime: endTime - startTime,\n duration: endTime - boundaryStarts.get(boundary.id)!,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n boundaryTimings.push(timing);\n observer?.onBoundaryEnd?.({ ...timing, streamId });\n observer?.onError?.({ streamId, boundaryId: boundary.id, error: error as Error });\n throw error;\n }\n ),\n };\n });\n\n // Create the underlying stream with instrumented callbacks\n const result = await createStreamingSSR({\n shell,\n shellEnd,\n suspenseBoundaries: instrumentedBoundaries,\n options: {\n ...options,\n onShellReady: () => {\n shellTime = Date.now() - startTime;\n observer?.onShellReady?.({ streamId, duration: shellTime });\n options.onShellReady?.();\n },\n onAllReady: () => {\n const totalStreamTime = Date.now() - startTime;\n\n const metrics: StreamingMetrics = {\n streamId,\n startTime,\n shellTime,\n totalStreamTime,\n boundaries: boundaryTimings,\n successCount: boundaryTimings.filter(b => b.success).length,\n errorCount: boundaryTimings.filter(b => !b.success).length,\n totalBytes,\n meta,\n };\n\n observer?.onStreamEnd?.(metrics);\n onMetrics?.(metrics);\n resolveMetrics!(metrics);\n options.onAllReady?.();\n },\n onError: (error) => {\n observer?.onError?.({ streamId, error });\n options.onError?.(error);\n },\n },\n });\n\n // Wrap stream to count bytes\n const countingStream = result.stream.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n totalBytes += chunk.length;\n controller.enqueue(chunk);\n },\n })\n );\n\n return {\n stream: countingStream,\n abort: result.abort,\n shellReady: result.shellReady,\n allReady: result.allReady,\n metrics: metricsPromise,\n streamId,\n };\n}\n\n// ============================================================================\n// Utility: Metrics Aggregator\n// ============================================================================\n\n/**\n * Aggregate metrics from multiple streams for analysis\n */\nexport class MetricsAggregator {\n private metrics: StreamingMetrics[] = [];\n private maxSamples: number;\n\n constructor(maxSamples = 1000) {\n this.maxSamples = maxSamples;\n }\n\n /**\n * Add metrics from a stream\n */\n add(metrics: StreamingMetrics): void {\n this.metrics.push(metrics);\n if (this.metrics.length > this.maxSamples) {\n this.metrics.shift();\n }\n }\n\n /**\n * Get average shell time\n */\n getAverageShellTime(): number {\n if (this.metrics.length === 0) return 0;\n return this.metrics.reduce((sum, m) => sum + m.shellTime, 0) / this.metrics.length;\n }\n\n /**\n * Get average total stream time\n */\n getAverageTotalTime(): number {\n if (this.metrics.length === 0) return 0;\n return this.metrics.reduce((sum, m) => sum + m.totalStreamTime, 0) / this.metrics.length;\n }\n\n /**\n * Get slowest boundaries (by average duration)\n */\n getSlowestBoundaries(limit = 5): { id: string; avgDuration: number; errorRate: number }[] {\n const boundaryStats = new Map<string, { totalDuration: number; count: number; errors: number }>();\n\n for (const m of this.metrics) {\n for (const b of m.boundaries) {\n const stats = boundaryStats.get(b.id) || { totalDuration: 0, count: 0, errors: 0 };\n stats.totalDuration += b.duration;\n stats.count++;\n if (!b.success) stats.errors++;\n boundaryStats.set(b.id, stats);\n }\n }\n\n return [...boundaryStats.entries()]\n .map(([id, stats]) => ({\n id,\n avgDuration: stats.totalDuration / stats.count,\n errorRate: stats.errors / stats.count,\n }))\n .sort((a, b) => b.avgDuration - a.avgDuration)\n .slice(0, limit);\n }\n\n /**\n * Get overall error rate\n */\n getErrorRate(): number {\n const total = this.metrics.reduce((sum, m) => sum + m.boundaries.length, 0);\n const errors = this.metrics.reduce((sum, m) => sum + m.errorCount, 0);\n return total > 0 ? errors / total : 0;\n }\n\n /**\n * Get percentiles for shell time\n */\n getShellTimePercentiles(): { p50: number; p90: number; p99: number } {\n const sorted = [...this.metrics].map(m => m.shellTime).sort((a, b) => a - b);\n const len = sorted.length;\n if (len === 0) return { p50: 0, p90: 0, p99: 0 };\n\n return {\n p50: sorted[Math.floor(len * 0.5)] ?? 0,\n p90: sorted[Math.floor(len * 0.9)] ?? 0,\n p99: sorted[Math.floor(len * 0.99)] ?? 0,\n };\n }\n\n /**\n * Export all metrics for external analysis\n */\n export(): StreamingMetrics[] {\n return [...this.metrics];\n }\n\n /**\n * Clear all metrics\n */\n clear(): void {\n this.metrics = [];\n }\n}\n\n// ============================================================================\n// Utility: Create Observer from Logger\n// ============================================================================\n\n/**\n * Create a streaming observer from a simple logger function\n */\nexport function createLoggerObserver(\n log: (message: string, data?: Record<string, unknown>) => void\n): StreamingObserver {\n return {\n onStreamStart: (streamId) => {\n log('[Flight] Stream started', { streamId });\n },\n onShellReady: ({ streamId, duration }) => {\n log('[Flight] Shell ready', { streamId, duration: `${duration}ms` });\n },\n onBoundaryStart: ({ streamId, boundaryId, startTime }) => {\n log('[Flight] Boundary started', { streamId, boundaryId, startTime: `${startTime}ms` });\n },\n onBoundaryEnd: (timing) => {\n log('[Flight] Boundary completed', {\n streamId: (timing as any).streamId,\n boundaryId: timing.id,\n duration: `${timing.duration}ms`,\n success: timing.success,\n size: timing.contentSize ? `${timing.contentSize}b` : undefined,\n });\n },\n onStreamEnd: (metrics) => {\n log('[Flight] Stream completed', {\n streamId: metrics.streamId,\n totalTime: `${metrics.totalStreamTime}ms`,\n shellTime: `${metrics.shellTime}ms`,\n boundaries: metrics.boundaries.length,\n errors: metrics.errorCount,\n });\n },\n onError: ({ streamId, boundaryId, error }) => {\n log('[Flight] Stream error', { streamId, boundaryId, error: error.message });\n },\n };\n}\n\n/**\n * Create observer that sends metrics to a custom endpoint (YOUR infrastructure)\n */\nexport function createHttpObserver(endpoint: string, options?: {\n headers?: Record<string, string>;\n batchSize?: number;\n flushInterval?: number;\n}): StreamingObserver {\n const { headers = {}, batchSize = 10, flushInterval = 5000 } = options || {};\n const buffer: StreamingMetrics[] = [];\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n const flush = async () => {\n if (buffer.length === 0) return;\n const batch = buffer.splice(0, buffer.length);\n\n try {\n await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({ metrics: batch, timestamp: Date.now() }),\n });\n } catch (error) {\n console.error('[Flight] Failed to send metrics:', error);\n // Re-add to buffer for retry\n buffer.unshift(...batch);\n }\n };\n\n const scheduleFlush = () => {\n if (flushTimer) return;\n flushTimer = setTimeout(() => {\n flushTimer = null;\n flush();\n }, flushInterval);\n };\n\n return {\n onStreamEnd: (metrics) => {\n buffer.push(metrics);\n if (buffer.length >= batchSize) {\n flush();\n } else {\n scheduleFlush();\n }\n },\n };\n}\n"]}
@@ -350,5 +350,5 @@ function createAdapter(options) {
350
350
  }
351
351
 
352
352
  export { assertValidOptions, createAdapter, createUniversalHandler, createValidatedAdapter, validateAdapterOptions };
353
- //# sourceMappingURL=chunk-77MJZCYD.js.map
354
- //# sourceMappingURL=chunk-77MJZCYD.js.map
353
+ //# sourceMappingURL=chunk-ZQS3WBE7.js.map
354
+ //# sourceMappingURL=chunk-ZQS3WBE7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/handler.ts","../src/adapters/validation.ts","../src/adapters/index.ts"],"names":[],"mappings":"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","file":"chunk-ZQS3WBE7.js","sourcesContent":["/**\n * Flight Universal Handler - Platform-agnostic request handler\n * \n * This is the core abstraction that allows Flight applications to run anywhere.\n * Adapters can use this handler, or implement their own - zero lock-in.\n * \n * @module @flight-framework/core/adapters/handler\n */\n\nimport type { RenderContext, RenderResult, UIFrameworkAdapter } from '../render/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Route rules for per-path configuration\n * Similar to Nitro's routeRules - completely optional to use\n */\nexport interface RouteRules {\n [pattern: string]: RouteRuleConfig;\n}\n\nexport interface RouteRuleConfig {\n /** Cache configuration */\n cache?: {\n /** Max age in seconds */\n maxAge?: number;\n /** Stale-while-revalidate in seconds */\n swr?: number;\n /** Vary headers */\n vary?: string[];\n };\n\n /** CORS configuration */\n cors?: boolean | CorsOptions;\n\n /** Headers to add to response */\n headers?: Record<string, string>;\n\n /** Redirect configuration */\n redirect?: string | {\n to: string;\n statusCode?: 301 | 302 | 303 | 307 | 308;\n };\n\n /** Proxy to another URL */\n proxy?: string;\n\n /** Render mode override */\n render?: 'ssr' | 'ssg' | 'csr' | 'isr';\n\n /** ISR revalidation time in seconds */\n isr?: number;\n\n /** Prerender at build time */\n prerender?: boolean;\n}\n\nexport interface CorsOptions {\n origin?: string | string[] | boolean;\n methods?: string[];\n allowedHeaders?: string[];\n exposedHeaders?: string[];\n credentials?: boolean;\n maxAge?: number;\n}\n\n/**\n * Handler options - all optional, user configures what they need\n */\nexport interface UniversalHandlerOptions {\n /** Route manifest from build */\n manifest?: RouteManifest;\n\n /** UI framework adapter (optional - for SSR) */\n framework?: UIFrameworkAdapter;\n\n /** Route rules (optional) */\n routeRules?: RouteRules;\n\n /** Static files directory (optional) */\n staticDir?: string;\n\n /** Base path (optional) */\n basePath?: string;\n\n /** Custom error handler (optional) */\n onError?: (error: Error, request: Request) => Response | Promise<Response>;\n\n /** Custom not found handler (optional) */\n onNotFound?: (request: Request) => Response | Promise<Response>;\n\n /** Hooks for extensibility (optional) */\n hooks?: HandlerHooks;\n}\n\n/**\n * Handler hooks for extensibility - all optional\n */\nexport interface HandlerHooks {\n /** Before handling request */\n beforeHandle?: (request: Request) => Request | Promise<Request> | void;\n\n /** After getting response, before sending */\n afterHandle?: (request: Request, response: Response) => Response | Promise<Response> | void;\n\n /** Before SSR render */\n beforeRender?: (context: RenderContext) => void | Promise<void>;\n\n /** After SSR render */\n afterRender?: (result: RenderResult) => RenderResult | Promise<RenderResult>;\n}\n\n/**\n * Route manifest from build\n */\nexport interface RouteManifest {\n routes: Array<{\n path: string;\n component: string;\n mode: 'ssr' | 'ssg' | 'csr' | 'isr';\n handler?: string;\n }>;\n staticFiles?: string[];\n}\n\n/**\n * Universal handler interface\n */\nexport interface UniversalHandler {\n /** Handle a fetch request */\n fetch(request: Request, env?: unknown, ctx?: unknown): Promise<Response>;\n\n /** Check if this handler can handle the request */\n canHandle(request: Request): boolean;\n}\n\n// ============================================================================\n// Handler Factory\n// ============================================================================\n\n/**\n * Create a universal request handler\n * \n * This is the main abstraction for handling requests.\n * Adapters can use this, extend it, or ignore it completely.\n * \n * @example\n * ```typescript\n * // Using the handler (optional)\n * import { createUniversalHandler } from '@flight-framework/core/adapters';\n * \n * const handler = createUniversalHandler({\n * manifest: await import('./manifest.json'),\n * routeRules: {\n * '/api/**': { cors: true },\n * '/blog/**': { cache: { maxAge: 3600 } },\n * },\n * });\n * \n * // In your adapter\n * export default {\n * fetch: handler.fetch,\n * };\n * ```\n */\nexport function createUniversalHandler(options: UniversalHandlerOptions = {}): UniversalHandler {\n const {\n manifest,\n routeRules = {},\n basePath = '',\n onError = defaultErrorHandler,\n onNotFound = defaultNotFoundHandler,\n hooks = {},\n } = options;\n\n return {\n /**\n * Handle incoming request\n */\n async fetch(request: Request, env?: unknown, ctx?: unknown): Promise<Response> {\n try {\n // Run beforeHandle hook\n if (hooks.beforeHandle) {\n const modifiedRequest = await hooks.beforeHandle(request);\n if (modifiedRequest) request = modifiedRequest;\n }\n\n const url = new URL(request.url);\n let pathname = url.pathname;\n\n // Strip base path if present\n if (basePath && pathname.startsWith(basePath)) {\n pathname = pathname.slice(basePath.length) || '/';\n }\n\n // Apply route rules\n const rules = matchRouteRules(pathname, routeRules);\n\n // Handle redirect rules\n if (rules?.redirect) {\n return handleRedirect(rules.redirect);\n }\n\n // Handle proxy rules\n if (rules?.proxy) {\n return handleProxy(request, rules.proxy);\n }\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS' && rules?.cors) {\n return handleCorsPreFlight(rules.cors);\n }\n\n // Find matching route from manifest\n const route = manifest?.routes?.find(r => matchPath(pathname, r.path));\n\n // No matching route - try static or return 404\n if (!route) {\n return await onNotFound(request);\n }\n\n // Build render context\n const context: RenderContext = {\n url,\n params: extractParams(pathname, route.path),\n headers: request.headers,\n method: request.method,\n };\n\n // Run beforeRender hook\n if (hooks.beforeRender) {\n await hooks.beforeRender(context);\n }\n\n // Generate response based on route mode\n let response: Response;\n\n switch (route.mode) {\n case 'ssr':\n case 'isr':\n response = await handleSSR(context, options);\n break;\n case 'ssg':\n response = await handleSSG(context, options);\n break;\n case 'csr':\n response = handleCSR(options);\n break;\n default:\n response = await handleSSR(context, options);\n }\n\n // Apply cache headers from route rules\n if (rules?.cache) {\n response = applyCacheHeaders(response, rules.cache);\n }\n\n // Apply CORS headers\n if (rules?.cors) {\n response = applyCorsHeaders(response, rules.cors, request);\n }\n\n // Apply custom headers\n if (rules?.headers) {\n response = applyCustomHeaders(response, rules.headers);\n }\n\n // Run afterHandle hook\n if (hooks.afterHandle) {\n const modifiedResponse = await hooks.afterHandle(request, response);\n if (modifiedResponse) response = modifiedResponse;\n }\n\n return response;\n\n } catch (error) {\n return onError(error as Error, request);\n }\n },\n\n /**\n * Check if this handler can handle the request\n */\n canHandle(request: Request): boolean {\n const url = new URL(request.url);\n let pathname = url.pathname;\n\n if (basePath && pathname.startsWith(basePath)) {\n pathname = pathname.slice(basePath.length) || '/';\n }\n\n // Check manifest routes\n if (manifest?.routes) {\n return manifest.routes.some(r => matchPath(pathname, r.path));\n }\n\n // Check route rules\n return Object.keys(routeRules).some(pattern =>\n matchPath(pathname, pattern)\n );\n },\n };\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\nfunction defaultErrorHandler(error: Error, _request: Request): Response {\n console.error('[Flight] Request error:', error);\n\n return new Response(\n JSON.stringify({\n error: 'Internal Server Error',\n message: process.env.NODE_ENV === 'development' ? error.message : undefined,\n }),\n {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n}\n\nfunction defaultNotFoundHandler(_request: Request): Response {\n return new Response('Not Found', { status: 404 });\n}\n\nfunction matchRouteRules(pathname: string, rules: RouteRules): RouteRuleConfig | null {\n for (const [pattern, config] of Object.entries(rules)) {\n if (matchPath(pathname, pattern)) {\n return config;\n }\n }\n return null;\n}\n\nfunction matchPath(pathname: string, pattern: string): boolean {\n // Handle exact match\n if (pattern === pathname) return true;\n\n // Handle wildcard patterns\n if (pattern.endsWith('/**')) {\n const prefix = pattern.slice(0, -3);\n return pathname.startsWith(prefix);\n }\n\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n const rest = pathname.slice(prefix.length);\n return pathname.startsWith(prefix) && !rest.includes('/');\n }\n\n // Handle dynamic params\n const patternParts = pattern.split('/');\n const pathParts = pathname.split('/');\n\n if (patternParts.length !== pathParts.length) return false;\n\n return patternParts.every((part, i) => {\n if (part.startsWith('[') && part.endsWith(']')) return true;\n if (part.startsWith(':')) return true;\n return part === pathParts[i];\n });\n}\n\nfunction extractParams(pathname: string, pattern: string): Record<string, string> {\n const params: Record<string, string> = {};\n const patternParts = pattern.split('/');\n const pathParts = pathname.split('/');\n\n patternParts.forEach((part, i) => {\n if (part.startsWith('[') && part.endsWith(']')) {\n const key = part.slice(1, -1).replace('...', '');\n params[key] = pathParts[i] ?? '';\n } else if (part.startsWith(':')) {\n params[part.slice(1)] = pathParts[i] ?? '';\n }\n });\n\n return params;\n}\n\nfunction handleRedirect(redirect: string | { to: string; statusCode?: number }): Response {\n const to = typeof redirect === 'string' ? redirect : redirect.to;\n const status = typeof redirect === 'string' ? 302 : (redirect.statusCode ?? 302);\n\n return new Response(null, {\n status,\n headers: { Location: to },\n });\n}\n\nasync function handleProxy(request: Request, target: string): Promise<Response> {\n const url = new URL(request.url);\n const targetUrl = new URL(target);\n targetUrl.pathname = url.pathname;\n targetUrl.search = url.search;\n\n const proxyRequest = new Request(targetUrl.toString(), {\n method: request.method,\n headers: request.headers,\n body: request.body,\n });\n\n return fetch(proxyRequest);\n}\n\nfunction handleCorsPreFlight(cors: boolean | CorsOptions): Response {\n // Normalize CORS options - true means default options, object means custom\n const options: CorsOptions = cors === true ? {} : (cors || {});\n\n return new Response(null, {\n status: 204,\n headers: {\n 'Access-Control-Allow-Origin': resolveOrigin(options.origin),\n 'Access-Control-Allow-Methods': (options.methods ?? ['GET', 'POST', 'PUT', 'DELETE', 'PATCH']).join(', '),\n 'Access-Control-Allow-Headers': (options.allowedHeaders ?? ['Content-Type', 'Authorization']).join(', '),\n 'Access-Control-Max-Age': String(options.maxAge ?? 86400),\n ...(options.credentials && { 'Access-Control-Allow-Credentials': 'true' }),\n },\n });\n}\n\nfunction resolveOrigin(origin?: string | string[] | boolean): string {\n if (origin === true || origin === undefined) return '*';\n if (origin === false) return '*';\n if (Array.isArray(origin)) return origin[0] ?? '*';\n return origin;\n}\n\nfunction applyCacheHeaders(response: Response, cache: { maxAge?: number; swr?: number }): Response {\n const headers = new Headers(response.headers);\n\n let cacheControl = `public, max-age=${cache.maxAge ?? 0}`;\n if (cache.swr) {\n cacheControl += `, stale-while-revalidate=${cache.swr}`;\n }\n\n headers.set('Cache-Control', cacheControl);\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nfunction applyCorsHeaders(response: Response, cors: boolean | CorsOptions, _request: Request): Response {\n // Normalize CORS options\n const options: CorsOptions = cors === true ? {} : (cors || {});\n const headers = new Headers(response.headers);\n\n headers.set('Access-Control-Allow-Origin', resolveOrigin(options.origin));\n\n if (options.credentials) {\n headers.set('Access-Control-Allow-Credentials', 'true');\n }\n\n if (options.exposedHeaders) {\n headers.set('Access-Control-Expose-Headers', options.exposedHeaders.join(', '));\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nfunction applyCustomHeaders(response: Response, customHeaders: Record<string, string>): Response {\n const headers = new Headers(response.headers);\n\n for (const [key, value] of Object.entries(customHeaders)) {\n headers.set(key, value);\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nasync function handleSSR(context: RenderContext, options: UniversalHandlerOptions): Promise<Response> {\n const { framework, hooks } = options;\n\n // If no framework adapter, return placeholder\n if (!framework) {\n return new Response(createPlaceholderHTML(context.url.pathname), {\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n }\n\n // Render with framework adapter\n let result = await framework.renderToString({} as never, context);\n\n // Run afterRender hook\n if (hooks?.afterRender) {\n const modifiedResult = await hooks.afterRender(result);\n if (modifiedResult) result = modifiedResult;\n }\n\n return new Response(result.html, {\n status: result.status,\n headers: result.headers,\n });\n}\n\nasync function handleSSG(context: RenderContext, options: UniversalHandlerOptions): Promise<Response> {\n // For SSG, typically serve pre-rendered HTML\n // Fall back to SSR if not found\n return handleSSR(context, options);\n}\n\nfunction handleCSR(options: UniversalHandlerOptions): Response {\n const html = `<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Flight App</title>\n </head>\n <body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/assets/client.js\"></script>\n </body>\n</html>`;\n\n return new Response(html, {\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n}\n\nfunction createPlaceholderHTML(pathname: string): string {\n return `<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Flight</title>\n <style>\n body { font-family: system-ui, sans-serif; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; background: #0a0a0a; color: #fafafa; }\n .container { text-align: center; }\n h1 { font-size: 3rem; margin-bottom: 0.5rem; }\n p { color: #888; }\n code { background: #1a1a1a; padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.875rem; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <h1>Flight</h1>\n <p>Path: <code>${pathname}</code></p>\n <p>Configure a UI framework adapter to enable SSR.</p>\n </div>\n </body>\n</html>`;\n}\n\n// Note: All exports are at the point of definition (export interface, export function)\n","/**\n * Flight Adapters - Optional Validation Helpers\n * \n * This module provides optional validation utilities for adapter options.\n * Zod is NOT required - these are only used if the developer chooses to\n * add runtime validation to their adapter.\n * \n * @example Without validation (default - no Zod needed)\n * ```typescript\n * import { createAdapter } from '@flight-framework/core/adapters';\n * \n * export default function myAdapter(options = {}) {\n * return createAdapter({\n * name: 'my-adapter',\n * adapt: async (builder) => { ... }\n * });\n * }\n * ```\n * \n * @example With optional Zod validation (if developer wants it)\n * ```typescript\n * import { createValidatedAdapter } from '@flight-framework/core/adapters';\n * import { z } from 'zod';\n * \n * const optionsSchema = z.object({\n * port: z.number().default(3000),\n * healthCheck: z.boolean().default(true),\n * });\n * \n * export default createValidatedAdapter(\n * 'my-adapter',\n * optionsSchema,\n * (options) => ({\n * adapt: async (builder) => { ... }\n * })\n * );\n * ```\n * \n * @module @flight-framework/core/adapters/validation\n */\n\nimport type { FlightAdapter, AdapterBuilder } from './index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Zod-like schema interface\n * This allows the validation helper to work with Zod or any compatible library\n * without requiring Zod as a direct dependency\n */\nexport interface ZodLikeSchema<T = unknown> {\n parse(data: unknown): T;\n safeParse(data: unknown): { success: true; data: T } | { success: false; error: unknown };\n}\n\n/**\n * Options for validated adapter factory\n */\nexport interface ValidatedAdapterOptions<T> {\n /** Parsed and validated options */\n adapt: (builder: AdapterBuilder) => Promise<void>;\n /** Optional emulate function */\n emulate?: FlightAdapter['emulate'];\n /** Optional supports declaration */\n supports?: FlightAdapter['supports'];\n}\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\n/**\n * Create a validated adapter factory\n * \n * This helper validates adapter options at runtime using a Zod-like schema.\n * The developer chooses whether to use this - it's completely optional.\n * \n * @param name - Adapter name\n * @param schema - Zod-like schema for options validation\n * @param factory - Factory function that receives validated options\n * @returns Adapter factory function\n * \n * @example\n * ```typescript\n * import { createValidatedAdapter } from '@flight-framework/core/adapters';\n * import { z } from 'zod';\n * \n * const schema = z.object({\n * port: z.number().default(3000),\n * region: z.string().optional(),\n * });\n * \n * export default createValidatedAdapter('my-adapter', schema, (options) => ({\n * adapt: async (builder) => {\n * // options is fully typed: { port: number; region?: string }\n * console.log(`Using port ${options.port}`);\n * }\n * }));\n * ```\n */\nexport function createValidatedAdapter<TSchema extends ZodLikeSchema>(\n name: string,\n schema: TSchema,\n factory: (options: ReturnType<TSchema['parse']>) => ValidatedAdapterOptions<ReturnType<TSchema['parse']>>\n): (options?: unknown) => FlightAdapter {\n return (rawOptions: unknown = {}): FlightAdapter => {\n // Validate options using the provided schema\n const parseResult = schema.safeParse(rawOptions);\n\n if (!parseResult.success) {\n const errorMessage = formatValidationError(name, parseResult.error);\n throw new Error(errorMessage);\n }\n\n const validatedOptions = parseResult.data as ReturnType<TSchema['parse']>;\n const adapterConfig = factory(validatedOptions);\n\n return {\n name,\n adapt: adapterConfig.adapt,\n emulate: adapterConfig.emulate,\n supports: adapterConfig.supports,\n };\n };\n}\n\n/**\n * Validate adapter options without throwing\n * Returns null if validation fails, useful for optional validation\n * \n * @param schema - Zod-like schema\n * @param options - Options to validate\n * @returns Validated options or null\n */\nexport function validateAdapterOptions<TSchema extends ZodLikeSchema>(\n schema: TSchema,\n options: unknown\n): ReturnType<TSchema['parse']> | null {\n const result = schema.safeParse(options);\n return result.success ? (result.data as ReturnType<TSchema['parse']>) : null;\n}\n\n/**\n * Assert adapter options are valid, throwing detailed error if not\n * \n * @param name - Adapter name for error messages\n * @param schema - Zod-like schema\n * @param options - Options to validate\n * @returns Validated options\n * @throws Error with detailed message if validation fails\n */\nexport function assertValidOptions<TSchema extends ZodLikeSchema>(\n name: string,\n schema: TSchema,\n options: unknown\n): ReturnType<TSchema['parse']> {\n const result = schema.safeParse(options);\n\n if (!result.success) {\n throw new Error(formatValidationError(name, result.error));\n }\n\n return result.data as ReturnType<TSchema['parse']>;\n}\n\n// ============================================================================\n// Error Formatting\n// ============================================================================\n\n/**\n * Format a validation error into a readable message\n */\nfunction formatValidationError(adapterName: string, error: unknown): string {\n const prefix = `[${adapterName}] Invalid adapter options`;\n\n // Handle Zod errors\n if (error && typeof error === 'object' && 'issues' in error) {\n const zodError = error as { issues: Array<{ path: (string | number)[]; message: string }> };\n const issues = zodError.issues\n .map(issue => ` - ${issue.path.join('.')}: ${issue.message}`)\n .join('\\n');\n return `${prefix}:\\n${issues}`;\n }\n\n // Fallback for other error types\n if (error instanceof Error) {\n return `${prefix}: ${error.message}`;\n }\n\n return `${prefix}: Unknown validation error`;\n}\n\n// ============================================================================\n// Type Utilities\n// ============================================================================\n\n/**\n * Extract the inferred type from a Zod-like schema\n * Useful for typing adapter options in TypeScript\n */\nexport type InferSchema<T extends ZodLikeSchema> = ReturnType<T['parse']>;\n","/**\n * Flight Adapters - Universal deployment adapters\n * \n * Adapters transform Flight's output for different deployment targets.\n * The user chooses where to deploy - Flight provides the adapters.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Build manifest containing all generated assets */\nexport interface BuildManifest {\n /** Entry points by name */\n entries: Record<string, string>;\n /** All generated files */\n files: string[];\n /** Route information */\n routes: RouteManifestEntry[];\n /** Server entry point (if applicable) */\n serverEntry?: string;\n /** Client entry point */\n clientEntry?: string;\n}\n\n/** Route information in manifest */\nexport interface RouteManifestEntry {\n /** Route path pattern */\n path: string;\n /** Render mode for this route */\n mode: 'ssr' | 'ssg' | 'csr' | 'isr';\n /** Component/handler file path */\n component: string;\n /** Pre-rendered paths (for SSG/ISR) */\n prerendered?: string[];\n}\n\n/** Builder utilities passed to adapters */\nexport interface AdapterBuilder {\n /** Build manifest */\n manifest: BuildManifest;\n /** Project root directory */\n root: string;\n /** Build output directory */\n outDir: string;\n\n /** Read a file from the build output */\n readFile(path: string): Promise<string>;\n /** Write a file to the adapter output */\n writeFile(path: string, content: string): Promise<void>;\n /** Copy files from build to adapter output */\n copy(from: string, to: string): Promise<void>;\n /** Get all files matching a pattern */\n glob(pattern: string): Promise<string[]>;\n /** Compress files for production */\n compress?(files: string[]): Promise<void>;\n\n /** Log info message */\n log: {\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n };\n}\n\n/** Flight adapter interface */\nexport interface FlightAdapter {\n /** Adapter name */\n name: string;\n\n /** \n * Transform the build output for the target platform\n * This is called after Flight's build process completes\n */\n adapt(builder: AdapterBuilder): Promise<void>;\n\n /**\n * Optional: Start listening for requests (for Node.js/Bun adapters)\n */\n listen?(server: unknown, port: number): Promise<void>;\n\n /**\n * Optional: Emulate the platform during development\n * Useful for testing platform-specific behavior locally\n */\n emulate?(): {\n /** Platform-specific env vars */\n env?: Record<string, string>;\n /** Custom middleware for dev server */\n middleware?: unknown[];\n };\n\n /**\n * Optional: Declare what this adapter supports\n * Flight uses this to warn about incompatible features\n */\n supports?: {\n /** Can read files at runtime (for dynamic content) */\n read?: () => boolean;\n /** Supports streaming responses */\n streaming?: () => boolean;\n /** Supports WebSockets */\n websockets?: () => boolean;\n /** Supports edge runtime */\n edge?: () => boolean;\n /** Supports Node.js runtime */\n node?: () => boolean;\n };\n}\n\n\n// ============================================================================\n// Adapter Factory Helper\n// ============================================================================\n\nexport interface AdapterOptions {\n name: string;\n adapt: (builder: AdapterBuilder) => Promise<void>;\n emulate?: FlightAdapter['emulate'];\n supports?: FlightAdapter['supports'];\n}\n\n/**\n * Create a Flight adapter\n * \n * @example\n * ```typescript\n * import { createAdapter } from '@flight-framework/core/adapters';\n * \n * export default function myAdapter(options = {}) {\n * return createAdapter({\n * name: 'my-adapter',\n * async adapt(builder) {\n * // Transform build output for your platform\n * },\n * });\n * }\n * ```\n */\nexport function createAdapter(options: AdapterOptions): FlightAdapter {\n return {\n name: options.name,\n adapt: options.adapt,\n emulate: options.emulate,\n supports: options.supports,\n };\n}\n\n// Re-export universal handler for adapters to use (optional)\nexport * from './handler.js';\n\n// Re-export optional validation helpers (Zod not required)\nexport * from './validation.js';\n\n// ============================================================================\n// Agnostic Service Adapters (Interfaces)\n// ============================================================================\n\n/**\n * Storage Adapter Interface\n * \n * Implement this to use any storage provider:\n * S3, Supabase Storage, Cloudflare R2, local filesystem, etc.\n */\nexport interface StorageAdapter {\n name: string;\n\n /** Upload a file */\n upload(path: string, data: Buffer | Uint8Array | string, options?: {\n contentType?: string;\n metadata?: Record<string, string>;\n }): Promise<{ url: string; path: string }>;\n\n /** Download a file */\n download(path: string): Promise<Buffer>;\n\n /** Delete a file */\n delete(path: string): Promise<void>;\n\n /** List files with optional prefix */\n list(prefix?: string): Promise<string[]>;\n\n /** Get a signed URL for direct access */\n getSignedUrl?(path: string, options?: {\n expiresIn?: number;\n operation?: 'read' | 'write';\n }): Promise<string>;\n}\n\n/**\n * Auth Adapter Interface\n * \n * Implement this to use any auth provider:\n * Better Auth, Supabase Auth, Lucia, Auth.js, etc.\n */\nexport interface AuthAdapter {\n name: string;\n\n /** Get the current user from a request */\n getUser(request: Request): Promise<AuthUser | null>;\n\n /** Verify a session token */\n verifySession(token: string): Promise<AuthSession | null>;\n\n /** Optional middleware for handling auth-specific routes (e.g., /api/auth/*) */\n middleware?: (req: Request) => Promise<Response | null>;\n}\n\nexport interface AuthUser {\n id: string;\n email?: string;\n name?: string;\n avatar?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AuthSession {\n user: AuthUser;\n expiresAt: Date;\n token: string;\n}\n\n/**\n * Email Adapter Interface\n * \n * Implement this to use any email provider:\n * Resend, SendGrid, Postmark, SMTP, etc.\n */\nexport interface EmailAdapter {\n name: string;\n\n /** Send an email */\n send(options: {\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n from?: string;\n replyTo?: string;\n attachments?: Array<{\n filename: string;\n content: Buffer | string;\n contentType?: string;\n }>;\n }): Promise<{ id: string; success: boolean }>;\n}\n\n/**\n * Queue/Jobs Adapter Interface\n * \n * Implement this to use any job queue:\n * BullMQ, Quirrel, Inngest, custom, etc.\n */\nexport interface JobsAdapter {\n name: string;\n\n /** Add a job to the queue */\n enqueue<T>(jobName: string, data: T, options?: {\n delay?: number;\n priority?: number;\n retries?: number;\n }): Promise<{ id: string }>;\n\n /** Schedule a recurring job */\n schedule?(jobName: string, cron: string, data?: unknown): Promise<{ id: string }>;\n\n /** Cancel a job */\n cancel?(jobId: string): Promise<void>;\n}\n\n/**\n * Database Adapter Interface\n * \n * Note: This is intentionally minimal. \n * For databases, use your preferred ORM/query builder directly.\n * This interface is for Flight's internal use (sessions, cache, etc.)\n */\nexport interface DatabaseAdapter {\n name: string;\n\n /** Raw query execution */\n query<T = unknown>(sql: string, params?: unknown[]): Promise<T[]>;\n\n /** Execute a mutation */\n execute(sql: string, params?: unknown[]): Promise<{ rowsAffected: number }>;\n\n /** Transaction support */\n transaction?<T>(fn: (tx: DatabaseAdapter) => Promise<T>): Promise<T>;\n}\n"]}
package/dist/client.d.ts CHANGED
@@ -5,7 +5,7 @@ export { Middleware, MiddlewareContext, MiddlewareNext, createMiddlewareChain }
5
5
  export { CustomHydrationTrigger, HydrateOptions, HydrationTrigger, IslandConfig, hydrateIslands, registerFlightIslandElement } from './islands/index.js';
6
6
  export { BuiltInCondition, DEFAULT_BOT_PATTERNS, StreamingCondition, isBot, isSlowConnection, prefersNoStream, supportsStreaming } from './streaming/conditional.js';
7
7
  export { BadRequestError, ErrorBoundaryOptions, FlightError, FlightErrorOptions, FlightErrorProps, ForbiddenError, InternalError, NotFoundError, ResetDetails, UnauthorizedError, clearError, createError, getError, getErrorStatusCode, isFlightError, isForbiddenError as isForbidden, isNotFoundError as isNotFound, isUnauthorizedError as isUnauthorized, showError } from './errors/index.js';
8
- export { g as getEnvironment, d as isBrowser, a as isDevelopment, i as isProduction, c as isServer, b as isTest } from './env-9do2c6yn.js';
8
+ export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest } from './utils/index.js';
9
9
  import './render/index.js';
10
10
  import './adapters/index.js';
11
11
 
package/dist/client.js CHANGED
@@ -1,12 +1,12 @@
1
- export { DEFAULT_BOT_PATTERNS, isBot, isSlowConnection, prefersNoStream, supportsStreaming } from './chunk-XOIYNY4I.js';
2
- export { hydrateIslands, registerFlightIslandElement } from './chunk-WFAWAHJH.js';
3
- export { createMiddlewareChain } from './chunk-OYF2OAKS.js';
4
- import './chunk-IXMD5QH2.js';
5
- export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, getError, getErrorStatusCode, isFlightError, isForbiddenError as isForbidden, isNotFoundError as isNotFound, isUnauthorizedError as isUnauthorized, showError } from './chunk-FSJNOPYE.js';
6
- import './chunk-WF46NESN.js';
7
- export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest } from './chunk-YHEVHRLH.js';
8
- export { createRouter } from './chunk-GCQZ4FHI.js';
9
- export { cacheKey, cached, createCache, dedupe, jsonSerializer, memory } from './chunk-R7SQAREQ.js';
1
+ export { DEFAULT_BOT_PATTERNS, isBot, isSlowConnection, prefersNoStream, supportsStreaming } from './chunk-VNO2YUVD.js';
2
+ export { hydrateIslands, registerFlightIslandElement } from './chunk-UFWGOJL7.js';
3
+ export { createMiddlewareChain } from './chunk-R7MEVVA4.js';
4
+ import './chunk-EHVUAFNH.js';
5
+ export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, getError, getErrorStatusCode, isFlightError, isForbiddenError as isForbidden, isNotFoundError as isNotFound, isUnauthorizedError as isUnauthorized, showError } from './chunk-2JVEH76V.js';
6
+ import './chunk-PL37KFRJ.js';
7
+ export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest } from './chunk-OZBPR27I.js';
8
+ export { createRouter } from './chunk-ARBKF6VI.js';
9
+ export { cacheKey, cached, createCache, dedupe, jsonSerializer, memory } from './chunk-LKOPJ3GS.js';
10
10
 
11
11
  // src/client.ts
12
12
  var VERSION = "0.0.1";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;;;;;;;;;AAuGO,IAAM,OAAA,GAAU","file":"client.js","sourcesContent":["/**\r\n * Flight Framework - Core (Browser-Safe Exports)\r\n *\r\n * This entry point only exports modules that are safe to use in browser environments.\r\n * Use this import when building for the client:\r\n *\r\n * import { ... } from '@flight-framework/core/client';\r\n *\r\n * Server-only modules (file-router, prerender, etc.) are NOT included.\r\n */\r\n\r\n// Configuration (browser-safe parts only)\r\nexport { type FlightConfig, type FlightUserConfig } from './config/index.js';\r\n\r\n// Router (browser-safe)\r\nexport {\r\n createRouter,\r\n type Route,\r\n type RouteMatch,\r\n type Router,\r\n type RouteParams,\r\n} from './router/index.js';\r\n\r\n// Cache (browser-safe)\r\nexport {\r\n createCache,\r\n memory,\r\n cacheKey,\r\n cached,\r\n dedupe,\r\n jsonSerializer,\r\n type Cache,\r\n type CacheOptions,\r\n type CacheEntry,\r\n type CacheAdapter,\r\n type CacheStats,\r\n type Serializer,\r\n type CreateCacheOptions,\r\n} from './cache/index.js';\r\n\r\n// Middleware (browser-safe)\r\nexport {\r\n createMiddlewareChain,\r\n type Middleware,\r\n type MiddlewareContext,\r\n type MiddlewareNext,\r\n} from './middleware/index.js';\r\n\r\n// Islands (browser-safe hydration)\r\nexport {\r\n hydrateIslands,\r\n registerFlightIslandElement,\r\n type HydrationTrigger,\r\n type CustomHydrationTrigger,\r\n type IslandConfig,\r\n type HydrateOptions,\r\n} from './islands/index.js';\r\n\r\n// Streaming Conditional (browser-safe detection)\r\nexport {\r\n isBot,\r\n prefersNoStream,\r\n isSlowConnection,\r\n supportsStreaming,\r\n DEFAULT_BOT_PATTERNS,\r\n type StreamingCondition,\r\n type BuiltInCondition,\r\n} from './streaming/conditional.js';\r\n\r\n// Error Handling (browser-safe)\r\nexport {\r\n FlightError,\r\n BadRequestError,\r\n UnauthorizedError,\r\n ForbiddenError,\r\n NotFoundError,\r\n InternalError,\r\n createError,\r\n showError,\r\n clearError,\r\n getError,\r\n isFlightError,\r\n isNotFoundError as isNotFound,\r\n isForbiddenError as isForbidden,\r\n isUnauthorizedError as isUnauthorized,\r\n getErrorStatusCode,\r\n type FlightErrorOptions,\r\n type FlightErrorProps,\r\n type ResetDetails,\r\n type ErrorBoundaryOptions,\r\n} from './errors/index.js';\r\n\r\n// Environment Utilities (browser-safe)\r\nexport {\r\n isProduction,\r\n isDevelopment,\r\n isTest,\r\n isServer,\r\n isBrowser,\r\n getEnvironment,\r\n} from './utils/index.js';\r\n\r\n// Version\r\nexport const VERSION = '0.0.1';\r\n"]}
1
+ {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;;;;;;;;;AAuGO,IAAM,OAAA,GAAU","file":"client.js","sourcesContent":["/**\n * Flight Framework - Core (Browser-Safe Exports)\n *\n * This entry point only exports modules that are safe to use in browser environments.\n * Use this import when building for the client:\n *\n * import { ... } from '@flight-framework/core/client';\n *\n * Server-only modules (file-router, prerender, etc.) are NOT included.\n */\n\n// Configuration (browser-safe parts only)\nexport { type FlightConfig, type FlightUserConfig } from './config/index.js';\n\n// Router (browser-safe)\nexport {\n createRouter,\n type Route,\n type RouteMatch,\n type Router,\n type RouteParams,\n} from './router/index.js';\n\n// Cache (browser-safe)\nexport {\n createCache,\n memory,\n cacheKey,\n cached,\n dedupe,\n jsonSerializer,\n type Cache,\n type CacheOptions,\n type CacheEntry,\n type CacheAdapter,\n type CacheStats,\n type Serializer,\n type CreateCacheOptions,\n} from './cache/index.js';\n\n// Middleware (browser-safe)\nexport {\n createMiddlewareChain,\n type Middleware,\n type MiddlewareContext,\n type MiddlewareNext,\n} from './middleware/index.js';\n\n// Islands (browser-safe hydration)\nexport {\n hydrateIslands,\n registerFlightIslandElement,\n type HydrationTrigger,\n type CustomHydrationTrigger,\n type IslandConfig,\n type HydrateOptions,\n} from './islands/index.js';\n\n// Streaming Conditional (browser-safe detection)\nexport {\n isBot,\n prefersNoStream,\n isSlowConnection,\n supportsStreaming,\n DEFAULT_BOT_PATTERNS,\n type StreamingCondition,\n type BuiltInCondition,\n} from './streaming/conditional.js';\n\n// Error Handling (browser-safe)\nexport {\n FlightError,\n BadRequestError,\n UnauthorizedError,\n ForbiddenError,\n NotFoundError,\n InternalError,\n createError,\n showError,\n clearError,\n getError,\n isFlightError,\n isNotFoundError as isNotFound,\n isForbiddenError as isForbidden,\n isUnauthorizedError as isUnauthorized,\n getErrorStatusCode,\n type FlightErrorOptions,\n type FlightErrorProps,\n type ResetDetails,\n type ErrorBoundaryOptions,\n} from './errors/index.js';\n\n// Environment Utilities (browser-safe)\nexport {\n isProduction,\n isDevelopment,\n isTest,\n isServer,\n isBrowser,\n getEnvironment,\n} from './utils/index.js';\n\n// Version\nexport const VERSION = '0.0.1';\n"]}
@@ -1,3 +1,3 @@
1
- export { defineConfig, findConfigFile, loadConfig, resolveConfig } from '../chunk-IXMD5QH2.js';
1
+ export { defineConfig, findConfigFile, loadConfig, resolveConfig } from '../chunk-EHVUAFNH.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden, getError, getErrorStatusCode, isFlightError, isForbiddenError, isNotFoundError, isUnauthorizedError, notFound, showError, unauthorized, wrapWithDigest } from '../chunk-FSJNOPYE.js';
2
- import '../chunk-YHEVHRLH.js';
1
+ export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden, getError, getErrorStatusCode, isFlightError, isForbiddenError, isNotFoundError, isUnauthorizedError, notFound, showError, unauthorized, wrapWithDigest } from '../chunk-2JVEH76V.js';
2
+ import '../chunk-OZBPR27I.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,3 +1,3 @@
1
- export { createFileRouter, extractRouteParams, findInterceptingRoute, getSlotDefault, getSlotNames, loadRoutes, resolveParallelSlots, scanRoutes, shouldDismissIntercept } from '../chunk-3KRBRSRJ.js';
1
+ export { createFileRouter, extractRouteParams, findInterceptingRoute, getSlotDefault, getSlotNames, loadRoutes, resolveParallelSlots, scanRoutes, shouldDismissIntercept } from '../chunk-4U7CJVNQ.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,3 +1,3 @@
1
- export { DEFAULT_STREAMING_HINTS, createStreamingController, generateCacheKey, getStreamingCacheHeaders, hasStreamingConfig, isValidStreamingHints, loadRouteWithStreaming, resolveStreamingConfig, shouldStream } from '../chunk-XSY5AAXT.js';
1
+ export { DEFAULT_STREAMING_HINTS, createStreamingController, generateCacheKey, getStreamingCacheHeaders, hasStreamingConfig, isValidStreamingHints, loadRouteWithStreaming, resolveStreamingConfig, shouldStream } from '../chunk-PO7IHPFF.js';
2
2
  //# sourceMappingURL=streaming-hints.js.map
3
3
  //# sourceMappingURL=streaming-hints.js.map
@@ -1,3 +1,3 @@
1
- export { createRouteContext, error, json, parseBody, redirect } from '../chunk-W6D62JCI.js';
1
+ export { createRouteContext, error, json, parseBody, redirect } from '../chunk-A4TKWQBU.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.d.ts CHANGED
@@ -20,9 +20,7 @@ export { ServerContext as RSCServerContext, createServerContext, isNotFoundError
20
20
  export { BoundaryType as RSCBoundaryType, detectBoundaryType, hasUseClientDirective, hasUseServerDirective } from './rsc/boundaries.js';
21
21
  export { ClientComponent, ComponentType as RSCComponentType, RenderContext as RSCRenderContext, ServerComponent, composeComponents, createAsyncComponent, createClientBoundary, createRenderContext, deserializeProps, executeServerComponent, revalidatePath as rscRevalidatePath, revalidateTag as rscRevalidateTag, serializeProps, serverFetch, withErrorBoundary } from './rsc/legacy.js';
22
22
  export { BadRequestError, ErrorBoundaryOptions, FlightError, FlightErrorOptions, FlightErrorProps, ForbiddenError, InternalError, NotFoundError, ResetDetails, UnauthorizedError, clearError, createError, createErrorResponse, forbidden as createForbidden, notFound as createNotFound, unauthorized as createUnauthorized, getError, getErrorStatusCode, isFlightError, isForbiddenError as isForbidden, isNotFoundError as isNotFound, isUnauthorizedError as isUnauthorized, showError, wrapWithDigest } from './errors/index.js';
23
- export { g as getEnvironment, d as isBrowser, a as isDevelopment, i as isProduction, c as isServer, b as isTest } from './env-9do2c6yn.js';
24
- export { assertClient, assertServer, getEnv, requireEnv } from './utils/index.js';
25
- import 'vite';
23
+ export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest } from './utils/index.js';
26
24
 
27
25
  /**
28
26
  * @flight-framework/core - Route Rules Configuration
package/dist/index.js CHANGED
@@ -1,36 +1,36 @@
1
- export { streamWithPriority, validateDependencies } from './chunk-WOEIJWGJ.js';
2
- export { MetricsAggregator, createHttpObserver, createInstrumentedStream, createLoggerObserver } from './chunk-6BDCTUQY.js';
3
- export { createHTMXStreamAdapter, createReactStreamAdapter, createSolidStreamAdapter, createStreamAdapter, createSvelteStreamAdapter, createVueStreamAdapter } from './chunk-MQQLYWZZ.js';
4
- export { DEFAULT_STREAMING_HINTS, createStreamingController, generateCacheKey, getStreamingCacheHeaders, hasStreamingConfig, isValidStreamingHints, loadRouteWithStreaming, resolveStreamingConfig, shouldStream } from './chunk-XSY5AAXT.js';
1
+ export { streamWithPriority, validateDependencies } from './chunk-NZS2YJ43.js';
2
+ export { MetricsAggregator, createHttpObserver, createInstrumentedStream, createLoggerObserver } from './chunk-YNTMYL36.js';
3
+ export { createHTMXStreamAdapter, createReactStreamAdapter, createSolidStreamAdapter, createStreamAdapter, createSvelteStreamAdapter, createVueStreamAdapter } from './chunk-GNS2FGPC.js';
4
+ export { DEFAULT_STREAMING_HINTS, createStreamingController, generateCacheKey, getStreamingCacheHeaders, hasStreamingConfig, isValidStreamingHints, loadRouteWithStreaming, resolveStreamingConfig, shouldStream } from './chunk-PO7IHPFF.js';
5
5
  import './chunk-63SCEXD7.js';
6
6
  import './chunk-Y22AMGTM.js';
7
- import './chunk-TASAT7KB.js';
8
- import './chunk-2F2QU6RC.js';
9
- import './chunk-VPFMHGEV.js';
10
- import './chunk-MDQNNIHH.js';
11
- export { createServerContext, isNotFoundError, isRedirectError as isRscRedirectError, notFound, redirect as rscRedirect } from './chunk-62C7LX2E.js';
12
- import './chunk-PVUMB632.js';
13
- import './chunk-P6WSBVDT.js';
14
- import './chunk-K2CQZPCG.js';
15
- export { composeComponents, createAsyncComponent, createClientBoundary, createRenderContext, deserializeProps, executeServerComponent, revalidatePath as rscRevalidatePath, revalidateTag as rscRevalidateTag, serializeProps, serverFetch, withErrorBoundary } from './chunk-LNV47HGV.js';
16
- import './chunk-ZIE56LCA.js';
17
- export { detectBoundaryType, hasUseClientDirective, hasUseServerDirective } from './chunk-PDW5WCMW.js';
18
- import './chunk-77MJZCYD.js';
19
- export { createServer } from './chunk-EGB7C73X.js';
20
- export { createFileRouter, loadRoutes, scanRoutes } from './chunk-3KRBRSRJ.js';
21
- export { RedirectError, redirect as actionRedirect, cookies, executeAction, executeFormAction, getAction, handleActionRequest, isRedirectError, parseFormData, registerAction } from './chunk-XGP3C2ZE.js';
22
- export { createRouteContext, error, json, parseBody, redirect } from './chunk-W6D62JCI.js';
23
- export { createLazyContent, createStreamingResponse, createStreamingSSR, renderWithStreaming, streamParallel, streamSequential } from './chunk-RSVA2EYO.js';
24
- export { DEFAULT_BOT_PATTERNS, addStreamingHeaders, createConditionalStreamer, createStreamingResponse as createConditionalStreamingResponse, createStaticResponse, isBot, isSlowConnection, prefersNoStream, streamIf, supportsStreaming } from './chunk-XOIYNY4I.js';
25
- export { createIslandRegistry, createPreactIslandAdapter, createReactIslandAdapter, createSolidIslandAdapter, createVueIslandAdapter, defineIsland, hydrateIslands, registerFlightIslandElement, registerIsland, renderIsland, renderIslands, setIslandAdapter } from './chunk-WFAWAHJH.js';
26
- export { createMiddlewareChain } from './chunk-OYF2OAKS.js';
27
- export { defineConfig } from './chunk-IXMD5QH2.js';
28
- export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden as createForbidden, notFound as createNotFound, unauthorized as createUnauthorized, getError, getErrorStatusCode, isFlightError, isForbiddenError as isForbidden, isNotFoundError as isNotFound, isUnauthorizedError as isUnauthorized, showError, wrapWithDigest } from './chunk-FSJNOPYE.js';
29
- export { assertClient, assertServer, getEnv, requireEnv } from './chunk-WF46NESN.js';
30
- export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest } from './chunk-YHEVHRLH.js';
31
- export { createRouter } from './chunk-GCQZ4FHI.js';
32
- import './chunk-ZVC3ZWLM.js';
33
- export { cacheKey, cached, createCache, dedupe, jsonSerializer, memory } from './chunk-R7SQAREQ.js';
7
+ import './chunk-HNPO6LFW.js';
8
+ import './chunk-3UQJE3XZ.js';
9
+ import './chunk-3N5ZBVZJ.js';
10
+ import './chunk-65JYF3DJ.js';
11
+ export { createServerContext, isNotFoundError, isRedirectError as isRscRedirectError, notFound, redirect as rscRedirect } from './chunk-CKJHJPKQ.js';
12
+ import './chunk-A2QRUBVE.js';
13
+ import './chunk-FRAH5QNY.js';
14
+ import './chunk-6GI6HFSQ.js';
15
+ export { composeComponents, createAsyncComponent, createClientBoundary, createRenderContext, deserializeProps, executeServerComponent, revalidatePath as rscRevalidatePath, revalidateTag as rscRevalidateTag, serializeProps, serverFetch, withErrorBoundary } from './chunk-6IG6XIXU.js';
16
+ import './chunk-XU6MRYG2.js';
17
+ export { detectBoundaryType, hasUseClientDirective, hasUseServerDirective } from './chunk-5XHOLZBJ.js';
18
+ import './chunk-ZQS3WBE7.js';
19
+ export { createServer } from './chunk-KDEA64UX.js';
20
+ export { createFileRouter, loadRoutes, scanRoutes } from './chunk-4U7CJVNQ.js';
21
+ export { RedirectError, redirect as actionRedirect, cookies, executeAction, executeFormAction, getAction, handleActionRequest, isRedirectError, parseFormData, registerAction } from './chunk-OZ3EXPLE.js';
22
+ export { createRouteContext, error, json, parseBody, redirect } from './chunk-A4TKWQBU.js';
23
+ export { createLazyContent, createStreamingResponse, createStreamingSSR, renderWithStreaming, streamParallel, streamSequential } from './chunk-CNY3ZUVG.js';
24
+ export { DEFAULT_BOT_PATTERNS, addStreamingHeaders, createConditionalStreamer, createStreamingResponse as createConditionalStreamingResponse, createStaticResponse, isBot, isSlowConnection, prefersNoStream, streamIf, supportsStreaming } from './chunk-VNO2YUVD.js';
25
+ export { createIslandRegistry, createPreactIslandAdapter, createReactIslandAdapter, createSolidIslandAdapter, createVueIslandAdapter, defineIsland, hydrateIslands, registerFlightIslandElement, registerIsland, renderIsland, renderIslands, setIslandAdapter } from './chunk-UFWGOJL7.js';
26
+ export { createMiddlewareChain } from './chunk-R7MEVVA4.js';
27
+ export { defineConfig } from './chunk-EHVUAFNH.js';
28
+ export { BadRequestError, FlightError, ForbiddenError, InternalError, NotFoundError, UnauthorizedError, clearError, createError, createErrorResponse, forbidden as createForbidden, notFound as createNotFound, unauthorized as createUnauthorized, getError, getErrorStatusCode, isFlightError, isForbiddenError as isForbidden, isNotFoundError as isNotFound, isUnauthorizedError as isUnauthorized, showError, wrapWithDigest } from './chunk-2JVEH76V.js';
29
+ import './chunk-PL37KFRJ.js';
30
+ export { getEnvironment, isBrowser, isDevelopment, isProduction, isServer, isTest } from './chunk-OZBPR27I.js';
31
+ export { createRouter } from './chunk-ARBKF6VI.js';
32
+ import './chunk-B2LPSCES.js';
33
+ export { cacheKey, cached, createCache, dedupe, jsonSerializer, memory } from './chunk-LKOPJ3GS.js';
34
34
  import { promises } from 'fs';
35
35
  import { dirname, join } from 'path';
36
36