@flight-framework/cli 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +97 -3076
- package/dist/bin.js.map +1 -1
- package/dist/index.js +97 -3076
- package/dist/index.js.map +1 -1
- package/package.json +53 -50
- package/templates/base/README.md.template +26 -0
- package/templates/base/_gitignore +25 -0
- package/templates/base/flight.config.ts.template +10 -0
- package/templates/base/styles/global.css +58 -0
- package/templates/htmx/index.html +19 -0
- package/templates/htmx/package.json.template +14 -0
- package/templates/htmx/vite.config.ts +6 -0
- package/templates/lit/index.html +15 -0
- package/templates/lit/package.json.template +19 -0
- package/templates/lit/src/app-root.ts +18 -0
- package/templates/lit/src/entry-client.ts +5 -0
- package/templates/lit/src/entry-server.ts +9 -0
- package/templates/lit/tsconfig.json +19 -0
- package/templates/lit/vite.config.ts +6 -0
- package/templates/preact/index.html +15 -0
- package/templates/preact/package.json.template +20 -0
- package/templates/preact/src/App.tsx +8 -0
- package/templates/preact/src/entry-client.tsx +11 -0
- package/templates/preact/src/entry-server.tsx +6 -0
- package/templates/preact/tsconfig.json +19 -0
- package/templates/preact/vite.config.ts +8 -0
- package/templates/qwik/index.html +15 -0
- package/templates/qwik/package.json.template +18 -0
- package/templates/qwik/src/App.tsx +10 -0
- package/templates/qwik/src/entry-client.tsx +4 -0
- package/templates/qwik/src/entry-server.tsx +9 -0
- package/templates/qwik/tsconfig.json +19 -0
- package/templates/qwik/vite.config.ts +8 -0
- package/templates/react/index.html +13 -0
- package/templates/react/package.json.template +22 -0
- package/templates/react/src/App.tsx +8 -0
- package/templates/react/src/entry-client.tsx +11 -0
- package/templates/react/src/entry-server.tsx +6 -0
- package/templates/react/tsconfig.json +20 -0
- package/templates/react/vite.config.ts +12 -0
- package/templates/solid/index.html +15 -0
- package/templates/solid/package.json.template +19 -0
- package/templates/solid/src/App.tsx +8 -0
- package/templates/solid/src/entry-client.tsx +11 -0
- package/templates/solid/src/entry-server.tsx +6 -0
- package/templates/solid/tsconfig.json +19 -0
- package/templates/solid/vite.config.ts +8 -0
- package/templates/svelte/index.html +15 -0
- package/templates/svelte/package.json.template +19 -0
- package/templates/svelte/src/App.svelte +4 -0
- package/templates/svelte/src/entry-client.ts +7 -0
- package/templates/svelte/src/entry-server.ts +7 -0
- package/templates/svelte/tsconfig.json +18 -0
- package/templates/svelte/vite.config.ts +8 -0
- package/templates/vanilla/index.html +15 -0
- package/templates/vanilla/package.json.template +15 -0
- package/templates/vanilla/src/main.ts +10 -0
- package/templates/vanilla/tsconfig.json +17 -0
- package/templates/vanilla/vite.config.ts +6 -0
- package/templates/vue/index.html +15 -0
- package/templates/vue/package.json.template +19 -0
- package/templates/vue/src/App.vue +6 -0
- package/templates/vue/src/entry-client.ts +12 -0
- package/templates/vue/src/entry-server.ts +8 -0
- package/templates/vue/tsconfig.json +18 -0
- package/templates/vue/vite.config.ts +8 -0
- package/LICENSE +0 -21
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/config/index.ts","../../../node_modules/.pnpm/radix3@1.1.2/node_modules/radix3/dist/index.mjs","../../http/src/router.ts","../../http/src/context.ts","../../http/src/server.ts","../../core/src/file-router/index.ts","../../core/dist/file-router/index.js","../../core/src/actions/index.ts","../../core/src/handlers/index.ts","../../core/src/streaming/index.ts","../../core/src/rsc/index.ts","../../core/src/cache/index.ts","../../../node_modules/.pnpm/radix3@1.1.2/node_modules/radix3/dist/index.mjs","../../core/src/router/index.ts","../../core/src/middleware/index.ts","../../core/src/server/index.ts","../../core/src/index.ts","../src/index.ts","../src/version.ts","../src/commands/create.ts","../src/commands/dev.ts","../../core/dist/config/index.js","../src/commands/build.ts","../src/commands/preview.ts","../src/bin.ts"],"sourcesContent":["/**\r\n * Flight Configuration - User configuration system\r\n */\r\n\r\nimport type { RenderMode } from '../render/index.js';\r\nimport type { FlightAdapter } from '../adapters/index.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** UI Framework configuration */\r\nexport interface UIConfig {\r\n /** The UI framework to use */\r\n framework?: 'react' | 'vue' | 'svelte' | 'solid' | 'preact' | 'vanilla' | string;\r\n /** Framework-specific options */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/** Rendering configuration */\r\nexport interface RenderConfig {\r\n /** Default render mode */\r\n default?: RenderMode;\r\n /** Per-route render mode overrides */\r\n routes?: Record<string, RenderMode>;\r\n}\r\n\r\n/** Development server options */\r\nexport interface DevConfig {\r\n /** Port to run dev server on */\r\n port?: number;\r\n /** Host to bind to */\r\n host?: string | boolean;\r\n /** Open browser on start */\r\n open?: boolean;\r\n /** HTTPS configuration */\r\n https?: boolean | {\r\n key?: string;\r\n cert?: string;\r\n };\r\n /** Proxy configuration */\r\n proxy?: Record<string, string | {\r\n target: string;\r\n changeOrigin?: boolean;\r\n rewrite?: (path: string) => string;\r\n }>;\r\n}\r\n\r\n/** Build configuration */\r\nexport interface BuildConfig {\r\n /** Output directory */\r\n outDir?: string;\r\n /** Source directory */\r\n srcDir?: string;\r\n /** Public assets directory */\r\n publicDir?: string;\r\n /** Routes directory */\r\n routesDir?: string;\r\n /** Generate sourcemaps */\r\n sourcemap?: boolean | 'inline' | 'hidden';\r\n /** Minify output */\r\n minify?: boolean | 'terser' | 'esbuild';\r\n /** Target environments */\r\n target?: string | string[];\r\n}\r\n\r\n/** Full Flight configuration (resolved) */\r\nexport interface FlightConfig {\r\n /** Root directory */\r\n root: string;\r\n /** Deployment adapter */\r\n adapter: FlightAdapter | null;\r\n /** UI framework configuration */\r\n ui: UIConfig;\r\n /** Rendering configuration */\r\n rendering: RenderConfig;\r\n /** Development server options */\r\n dev: Required<DevConfig>;\r\n /** Build configuration */\r\n build: Required<BuildConfig>;\r\n /** Vite configuration overrides */\r\n vite?: Record<string, unknown>;\r\n /** Plugin configurations */\r\n plugins: FlightPlugin[];\r\n}\r\n\r\n/** Flight plugin interface */\r\nexport interface FlightPlugin {\r\n /** Plugin name */\r\n name: string;\r\n /** Hook into config resolution */\r\n config?: (config: FlightConfig) => FlightConfig | void | Promise<FlightConfig | void>;\r\n /** Hook into build start */\r\n buildStart?: () => void | Promise<void>;\r\n /** Hook into build end */\r\n buildEnd?: () => void | Promise<void>;\r\n /** Hook into dev server start */\r\n devStart?: () => void | Promise<void>;\r\n}\r\n\r\n/** User-provided configuration (partial) */\r\nexport interface FlightUserConfig {\r\n /** Root directory (defaults to process.cwd()) */\r\n root?: string;\r\n /** Deployment adapter */\r\n adapter?: FlightAdapter;\r\n /** UI framework configuration */\r\n ui?: UIConfig;\r\n /** Rendering configuration */\r\n rendering?: RenderConfig;\r\n /** Development server options */\r\n dev?: DevConfig;\r\n /** Build configuration */\r\n build?: BuildConfig;\r\n /** Vite configuration overrides */\r\n vite?: Record<string, unknown>;\r\n /** Plugins */\r\n plugins?: FlightPlugin[];\r\n}\r\n\r\n// ============================================================================\r\n// Configuration Factory\r\n// ============================================================================\r\n\r\n/** Default configuration values */\r\nconst DEFAULT_CONFIG: Omit<FlightConfig, 'root'> = {\r\n adapter: null,\r\n ui: {\r\n framework: 'vanilla',\r\n },\r\n rendering: {\r\n default: 'ssr',\r\n routes: {},\r\n },\r\n dev: {\r\n port: 5173,\r\n host: 'localhost',\r\n open: false,\r\n https: false,\r\n proxy: {},\r\n },\r\n build: {\r\n outDir: 'dist',\r\n srcDir: 'src',\r\n publicDir: 'public',\r\n routesDir: 'src/routes',\r\n sourcemap: false,\r\n minify: true,\r\n target: 'es2022',\r\n },\r\n plugins: [],\r\n};\r\n\r\n/**\r\n * Define Flight configuration\r\n * \r\n * @example\r\n * ```typescript\r\n * // flight.config.ts\r\n * import { defineConfig } from '@flight/core';\r\n * import node from '@flight/adapter-node';\r\n * \r\n * export default defineConfig({\r\n * adapter: node(),\r\n * ui: { framework: 'react' },\r\n * rendering: {\r\n * default: 'ssr',\r\n * routes: {\r\n * '/blog/*': 'ssg',\r\n * '/app/*': 'csr',\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport function defineConfig(config: FlightUserConfig): FlightUserConfig {\r\n return config;\r\n}\r\n\r\n/**\r\n * Resolve user config to full config with defaults\r\n */\r\nexport function resolveConfig(userConfig: FlightUserConfig = {}): FlightConfig {\r\n return {\r\n root: userConfig.root ?? process.cwd(),\r\n adapter: userConfig.adapter ?? DEFAULT_CONFIG.adapter,\r\n ui: {\r\n ...DEFAULT_CONFIG.ui,\r\n ...userConfig.ui,\r\n },\r\n rendering: {\r\n ...DEFAULT_CONFIG.rendering,\r\n ...userConfig.rendering,\r\n },\r\n dev: {\r\n ...DEFAULT_CONFIG.dev,\r\n ...userConfig.dev,\r\n } as Required<DevConfig>,\r\n build: {\r\n ...DEFAULT_CONFIG.build,\r\n ...userConfig.build,\r\n } as Required<BuildConfig>,\r\n vite: userConfig.vite,\r\n plugins: userConfig.plugins ?? [],\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Config Loading\r\n// ============================================================================\r\n\r\nconst CONFIG_FILES = [\r\n 'flight.config.ts',\r\n 'flight.config.js',\r\n 'flight.config.mjs',\r\n 'flight.config.mts',\r\n];\r\n\r\n/**\r\n * Find the config file in a directory\r\n */\r\nexport async function findConfigFile(root: string): Promise<string | null> {\r\n // Dynamic import for Node.js fs\r\n const { existsSync } = await import('node:fs');\r\n const { join } = await import('node:path');\r\n\r\n for (const file of CONFIG_FILES) {\r\n const path = join(root, file);\r\n if (existsSync(path)) {\r\n return path;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Load configuration from file\r\n */\r\nexport async function loadConfig(root: string = process.cwd()): Promise<FlightConfig> {\r\n const configFile = await findConfigFile(root);\r\n\r\n if (!configFile) {\r\n return resolveConfig({ root });\r\n }\r\n\r\n try {\r\n // Use dynamic import for the config file\r\n // On Windows, we need to convert the path to a file:// URL\r\n const { pathToFileURL } = await import('node:url');\r\n const configUrl = pathToFileURL(configFile).href;\r\n const module = await import(configUrl);\r\n const userConfig = module.default as FlightUserConfig;\r\n\r\n return resolveConfig({\r\n ...userConfig,\r\n root,\r\n });\r\n } catch (error) {\r\n console.error(`Failed to load config from ${configFile}:`, error);\r\n return resolveConfig({ root });\r\n }\r\n}\r\n","const NODE_TYPES = {\n NORMAL: 0,\n WILDCARD: 1,\n PLACEHOLDER: 2\n};\n\nfunction createRouter(options = {}) {\n const ctx = {\n options,\n rootNode: createRadixNode(),\n staticRoutesMap: {}\n };\n const normalizeTrailingSlash = (p) => options.strictTrailingSlash ? p : p.replace(/\\/$/, \"\") || \"/\";\n if (options.routes) {\n for (const path in options.routes) {\n insert(ctx, normalizeTrailingSlash(path), options.routes[path]);\n }\n }\n return {\n ctx,\n lookup: (path) => lookup(ctx, normalizeTrailingSlash(path)),\n insert: (path, data) => insert(ctx, normalizeTrailingSlash(path), data),\n remove: (path) => remove(ctx, normalizeTrailingSlash(path))\n };\n}\nfunction lookup(ctx, path) {\n const staticPathNode = ctx.staticRoutesMap[path];\n if (staticPathNode) {\n return staticPathNode.data;\n }\n const sections = path.split(\"/\");\n const params = {};\n let paramsFound = false;\n let wildcardNode = null;\n let node = ctx.rootNode;\n let wildCardParam = null;\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i];\n if (node.wildcardChildNode !== null) {\n wildcardNode = node.wildcardChildNode;\n wildCardParam = sections.slice(i).join(\"/\");\n }\n const nextNode = node.children.get(section);\n if (nextNode === void 0) {\n if (node && node.placeholderChildren.length > 1) {\n const remaining = sections.length - i;\n node = node.placeholderChildren.find((c) => c.maxDepth === remaining) || null;\n } else {\n node = node.placeholderChildren[0] || null;\n }\n if (!node) {\n break;\n }\n if (node.paramName) {\n params[node.paramName] = section;\n }\n paramsFound = true;\n } else {\n node = nextNode;\n }\n }\n if ((node === null || node.data === null) && wildcardNode !== null) {\n node = wildcardNode;\n params[node.paramName || \"_\"] = wildCardParam;\n paramsFound = true;\n }\n if (!node) {\n return null;\n }\n if (paramsFound) {\n return {\n ...node.data,\n params: paramsFound ? params : void 0\n };\n }\n return node.data;\n}\nfunction insert(ctx, path, data) {\n let isStaticRoute = true;\n const sections = path.split(\"/\");\n let node = ctx.rootNode;\n let _unnamedPlaceholderCtr = 0;\n const matchedNodes = [node];\n for (const section of sections) {\n let childNode;\n if (childNode = node.children.get(section)) {\n node = childNode;\n } else {\n const type = getNodeType(section);\n childNode = createRadixNode({ type, parent: node });\n node.children.set(section, childNode);\n if (type === NODE_TYPES.PLACEHOLDER) {\n childNode.paramName = section === \"*\" ? `_${_unnamedPlaceholderCtr++}` : section.slice(1);\n node.placeholderChildren.push(childNode);\n isStaticRoute = false;\n } else if (type === NODE_TYPES.WILDCARD) {\n node.wildcardChildNode = childNode;\n childNode.paramName = section.slice(\n 3\n /* \"**:\" */\n ) || \"_\";\n isStaticRoute = false;\n }\n matchedNodes.push(childNode);\n node = childNode;\n }\n }\n for (const [depth, node2] of matchedNodes.entries()) {\n node2.maxDepth = Math.max(matchedNodes.length - depth, node2.maxDepth || 0);\n }\n node.data = data;\n if (isStaticRoute === true) {\n ctx.staticRoutesMap[path] = node;\n }\n return node;\n}\nfunction remove(ctx, path) {\n let success = false;\n const sections = path.split(\"/\");\n let node = ctx.rootNode;\n for (const section of sections) {\n node = node.children.get(section);\n if (!node) {\n return success;\n }\n }\n if (node.data) {\n const lastSection = sections.at(-1) || \"\";\n node.data = null;\n if (Object.keys(node.children).length === 0 && node.parent) {\n node.parent.children.delete(lastSection);\n node.parent.wildcardChildNode = null;\n node.parent.placeholderChildren = [];\n }\n success = true;\n }\n return success;\n}\nfunction createRadixNode(options = {}) {\n return {\n type: options.type || NODE_TYPES.NORMAL,\n maxDepth: 0,\n parent: options.parent || null,\n children: /* @__PURE__ */ new Map(),\n data: options.data || null,\n paramName: options.paramName || null,\n wildcardChildNode: null,\n placeholderChildren: []\n };\n}\nfunction getNodeType(str) {\n if (str.startsWith(\"**\")) {\n return NODE_TYPES.WILDCARD;\n }\n if (str[0] === \":\" || str === \"*\") {\n return NODE_TYPES.PLACEHOLDER;\n }\n return NODE_TYPES.NORMAL;\n}\n\nfunction toRouteMatcher(router) {\n const table = _routerNodeToTable(\"\", router.ctx.rootNode);\n return _createMatcher(table, router.ctx.options.strictTrailingSlash);\n}\nfunction _createMatcher(table, strictTrailingSlash) {\n return {\n ctx: { table },\n matchAll: (path) => _matchRoutes(path, table, strictTrailingSlash)\n };\n}\nfunction _createRouteTable() {\n return {\n static: /* @__PURE__ */ new Map(),\n wildcard: /* @__PURE__ */ new Map(),\n dynamic: /* @__PURE__ */ new Map()\n };\n}\nfunction _exportMatcherFromTable(table) {\n const obj = /* @__PURE__ */ Object.create(null);\n for (const property in table) {\n obj[property] = property === \"dynamic\" ? Object.fromEntries(\n [...table[property].entries()].map(([key, value]) => [\n key,\n _exportMatcherFromTable(value)\n ])\n ) : Object.fromEntries(table[property].entries());\n }\n return obj;\n}\nfunction exportMatcher(matcher) {\n return _exportMatcherFromTable(matcher.ctx.table);\n}\nfunction _createTableFromExport(matcherExport) {\n const table = {};\n for (const property in matcherExport) {\n table[property] = property === \"dynamic\" ? new Map(\n Object.entries(matcherExport[property]).map(([key, value]) => [\n key,\n _createTableFromExport(value)\n ])\n ) : new Map(\n Object.entries(matcherExport[property])\n );\n }\n return table;\n}\nfunction createMatcherFromExport(matcherExport) {\n return _createMatcher(_createTableFromExport(matcherExport));\n}\nfunction _matchRoutes(path, table, strictTrailingSlash) {\n if (strictTrailingSlash !== true && path.endsWith(\"/\")) {\n path = path.slice(0, -1) || \"/\";\n }\n const matches = [];\n for (const [key, value] of _sortRoutesMap(table.wildcard)) {\n if (path === key || path.startsWith(key + \"/\")) {\n matches.push(value);\n }\n }\n for (const [key, value] of _sortRoutesMap(table.dynamic)) {\n if (path.startsWith(key + \"/\")) {\n const subPath = \"/\" + path.slice(key.length).split(\"/\").splice(2).join(\"/\");\n matches.push(..._matchRoutes(subPath, value));\n }\n }\n const staticMatch = table.static.get(path);\n if (staticMatch) {\n matches.push(staticMatch);\n }\n return matches.filter(Boolean);\n}\nfunction _sortRoutesMap(m) {\n return [...m.entries()].sort((a, b) => a[0].length - b[0].length);\n}\nfunction _routerNodeToTable(initialPath, initialNode) {\n const table = _createRouteTable();\n function _addNode(path, node) {\n if (path) {\n if (node.type === NODE_TYPES.NORMAL && !(path.includes(\"*\") || path.includes(\":\"))) {\n if (node.data) {\n table.static.set(path, node.data);\n }\n } else if (node.type === NODE_TYPES.WILDCARD) {\n table.wildcard.set(path.replace(\"/**\", \"\"), node.data);\n } else if (node.type === NODE_TYPES.PLACEHOLDER) {\n const subTable = _routerNodeToTable(\"\", node);\n if (node.data) {\n subTable.static.set(\"/\", node.data);\n }\n table.dynamic.set(path.replace(/\\/\\*|\\/:\\w+/, \"\"), subTable);\n return;\n }\n }\n for (const [childPath, child] of node.children.entries()) {\n _addNode(`${path}/${childPath}`.replace(\"//\", \"/\"), child);\n }\n }\n _addNode(initialPath, initialNode);\n return table;\n}\n\nexport { NODE_TYPES, createMatcherFromExport, createRouter, exportMatcher, toRouteMatcher };\n","/**\r\n * @flight/http - Router\r\n * \r\n * Radix-tree based router for ultra-fast path matching.\r\n * Uses radix3 under the hood.\r\n */\r\n\r\nimport { createRouter as createRadixRouter, type RadixRouter } from 'radix3';\r\nimport type { Handler, HttpMethod, Route, Env } from './types.js';\r\n\r\n// ============================================================================\r\n// Router Types\r\n// ============================================================================\r\n\r\ninterface RouterNode<E extends Env = Env> {\r\n handlers: Map<HttpMethod | '*', Handler<E>>;\r\n}\r\n\r\ninterface MatchResult<E extends Env = Env> {\r\n handler: Handler<E>;\r\n params: Record<string, string>;\r\n}\r\n\r\n// ============================================================================\r\n// Router Class\r\n// ============================================================================\r\n\r\nexport class Router<E extends Env = Env> {\r\n private radix: RadixRouter<RouterNode<E>>;\r\n private routes: Route<E>[] = [];\r\n\r\n constructor() {\r\n this.radix = createRadixRouter<RouterNode<E>>();\r\n }\r\n\r\n /**\r\n * Add a route\r\n */\r\n add(method: HttpMethod | '*', path: string, handler: Handler<E>): void {\r\n // Normalize path\r\n const normalizedPath = this.normalizePath(path);\r\n\r\n // Get or create node\r\n let node = this.radix.lookup(normalizedPath);\r\n\r\n if (!node) {\r\n node = { handlers: new Map() };\r\n this.radix.insert(normalizedPath, node);\r\n }\r\n\r\n // Add handler for method\r\n node.handlers.set(method, handler);\r\n\r\n // Track route for debugging\r\n this.routes.push({\r\n method,\r\n path: normalizedPath,\r\n handler,\r\n middleware: [],\r\n });\r\n }\r\n\r\n /**\r\n * Match a request to a route\r\n */\r\n match(method: HttpMethod, path: string): MatchResult<E> | null {\r\n const normalizedPath = this.normalizePath(path);\r\n const result = this.radix.lookup(normalizedPath);\r\n\r\n if (!result) {\r\n return null;\r\n }\r\n\r\n // Try exact method first\r\n let handler = result.handlers.get(method);\r\n\r\n // Fall back to wildcard\r\n if (!handler) {\r\n handler = result.handlers.get('*');\r\n }\r\n\r\n if (!handler) {\r\n return null;\r\n }\r\n\r\n // radix3 returns params in the result via _params property\r\n // Also extract from the lookup result directly\r\n const params: Record<string, string> = (result as any).params || {};\r\n\r\n return { handler, params };\r\n }\r\n\r\n /**\r\n * Get all registered routes\r\n */\r\n getRoutes(): Route<E>[] {\r\n return [...this.routes];\r\n }\r\n\r\n /**\r\n * Normalize path\r\n */\r\n private normalizePath(path: string): string {\r\n // Ensure leading slash\r\n if (!path.startsWith('/')) {\r\n path = '/' + path;\r\n }\r\n\r\n // Remove trailing slash (except for root)\r\n if (path !== '/' && path.endsWith('/')) {\r\n path = path.slice(0, -1);\r\n }\r\n\r\n // Convert [param] to :param for radix3\r\n path = path.replace(/\\[([^\\]]+)\\]/g, ':$1');\r\n\r\n // Convert [...slug] to ** for catch-all\r\n path = path.replace(/\\[\\.\\.\\.([\\w]+)\\]/g, '**');\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Extract params from matched path\r\n * @deprecated radix3 handles param extraction internally\r\n */\r\n private _extractParams(pattern: string, actualPath: string): Record<string, string> {\r\n const params: Record<string, string> = {};\r\n\r\n const patternParts = pattern.split('/');\r\n const actualParts = actualPath.split('/');\r\n\r\n for (let i = 0; i < patternParts.length; i++) {\r\n const patternPart = patternParts[i];\r\n if (!patternPart) continue;\r\n\r\n if (patternPart.startsWith(':')) {\r\n const paramName = patternPart.slice(1);\r\n params[paramName] = actualParts[i] || '';\r\n } else if (patternPart === '**') {\r\n // Catch-all: collect remaining parts\r\n const paramName = 'slug';\r\n params[paramName] = actualParts.slice(i).join('/');\r\n break;\r\n }\r\n }\r\n\r\n return params;\r\n }\r\n}\r\n","/**\r\n * @flight/http - Context\r\n * \r\n * Request/Response context object passed to handlers.\r\n * Similar to Hono's Context for familiarity.\r\n */\r\n\r\nimport type { Context, Env } from './types.js';\r\n\r\n// ============================================================================\r\n// Context Factory\r\n// ============================================================================\r\n\r\nexport function createContext<E extends Env = Env>(\r\n request: Request,\r\n params: Record<string, string> = {},\r\n env: E['Bindings'] = {} as E['Bindings']\r\n): Context<E> {\r\n const variables: Record<string, unknown> = {};\r\n\r\n return {\r\n req: request,\r\n env,\r\n params,\r\n variables: variables as E['Variables'],\r\n\r\n // Response helpers\r\n json<T>(data: T, status = 200): Response {\r\n return new Response(JSON.stringify(data), {\r\n status,\r\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\r\n });\r\n },\r\n\r\n text(text: string, status = 200): Response {\r\n return new Response(text, {\r\n status,\r\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\r\n });\r\n },\r\n\r\n html(html: string, status = 200): Response {\r\n return new Response(html, {\r\n status,\r\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\r\n });\r\n },\r\n\r\n redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 302): Response {\r\n return new Response(null, {\r\n status,\r\n headers: { Location: url },\r\n });\r\n },\r\n\r\n // Variable getter/setter\r\n get<K extends keyof E['Variables']>(key: K): E['Variables'][K] {\r\n return variables[key as string] as E['Variables'][K];\r\n },\r\n\r\n set<K extends keyof E['Variables']>(key: K, value: E['Variables'][K]): void {\r\n variables[key as string] = value;\r\n },\r\n\r\n // Request helpers\r\n header(name: string): string | null {\r\n return request.headers.get(name);\r\n },\r\n\r\n cookie(name: string): string | undefined {\r\n const cookieHeader = request.headers.get('cookie');\r\n if (!cookieHeader) return undefined;\r\n\r\n const cookies = parseCookies(cookieHeader);\r\n return cookies[name];\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Cookie Parser\r\n// ============================================================================\r\n\r\nfunction parseCookies(cookieHeader: string): Record<string, string> {\r\n const cookies: Record<string, string> = {};\r\n\r\n for (const cookie of cookieHeader.split(';')) {\r\n const [name, ...rest] = cookie.trim().split('=');\r\n if (name) {\r\n cookies[name] = rest.join('=');\r\n }\r\n }\r\n\r\n return cookies;\r\n}\r\n","/**\r\n * @flight/http - Server\r\n * \r\n * Main server class that implements the FlightHttpServer interface.\r\n * Inspired by Hono's design patterns.\r\n */\r\n\r\nimport { Router } from './router.js';\r\nimport { createContext } from './context.js';\r\nimport type {\r\n FlightHttpServer,\r\n Handler,\r\n Middleware,\r\n HandlerOrMiddleware,\r\n HttpMethod,\r\n Context,\r\n Env,\r\n ServerOptions,\r\n ListenOptions,\r\n FetchOptions,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Server Class\r\n// ============================================================================\r\n\r\nexport class FlightHttp<E extends Env = Env> implements FlightHttpServer<E> {\r\n private router: Router<E>;\r\n private globalMiddleware: Middleware<E>[] = [];\r\n private notFoundHandler: Handler<E>;\r\n private errorHandler: (error: Error, c: Context<E>) => Response | Promise<Response>;\r\n private basePath: string;\r\n\r\n constructor(options: ServerOptions = {}) {\r\n this.router = new Router<E>();\r\n this.basePath = options.basePath || '';\r\n\r\n // Default not found handler\r\n this.notFoundHandler = (c) => c.json(\r\n { error: 'Not Found', path: new URL(c.req.url).pathname },\r\n 404\r\n );\r\n\r\n // Default error handler\r\n this.errorHandler = (error, c) => c.json(\r\n { error: error.message || 'Internal Server Error' },\r\n 500\r\n );\r\n }\r\n\r\n // ========================================================================\r\n // Route Registration\r\n // ========================================================================\r\n\r\n get(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('GET', path, handlers);\r\n }\r\n\r\n post(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('POST', path, handlers);\r\n }\r\n\r\n put(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('PUT', path, handlers);\r\n }\r\n\r\n delete(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('DELETE', path, handlers);\r\n }\r\n\r\n patch(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('PATCH', path, handlers);\r\n }\r\n\r\n options(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('OPTIONS', path, handlers);\r\n }\r\n\r\n head(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('HEAD', path, handlers);\r\n }\r\n\r\n all(path: string, ...handlers: HandlerOrMiddleware<E>[]): FlightHttpServer<E> {\r\n return this.addRoute('*', path, handlers);\r\n }\r\n\r\n // ========================================================================\r\n // Middleware\r\n // ========================================================================\r\n\r\n use(...handlers: Middleware<E>[]): FlightHttpServer<E> {\r\n this.globalMiddleware.push(...handlers);\r\n return this;\r\n }\r\n\r\n // ========================================================================\r\n // Sub-routing\r\n // ========================================================================\r\n\r\n route(path: string, router: FlightHttpServer<E>): FlightHttpServer<E> {\r\n // Get routes from sub-router\r\n if (router instanceof FlightHttp) {\r\n const routes = router.router.getRoutes();\r\n for (const route of routes) {\r\n const fullPath = this.basePath + path + route.path;\r\n this.router.add(route.method, fullPath, route.handler);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n // ========================================================================\r\n // Error Handling\r\n // ========================================================================\r\n\r\n notFound(handler: Handler<E>): FlightHttpServer<E> {\r\n this.notFoundHandler = handler;\r\n return this;\r\n }\r\n\r\n onError(handler: (error: Error, c: Context<E>) => Response | Promise<Response>): FlightHttpServer<E> {\r\n this.errorHandler = handler;\r\n return this;\r\n }\r\n\r\n // ========================================================================\r\n // Core Fetch Handler\r\n // ========================================================================\r\n\r\n async fetch(request: Request, options: FetchOptions = {}): Promise<Response> {\r\n const url = new URL(request.url);\r\n const path = url.pathname;\r\n const method = request.method.toUpperCase() as HttpMethod;\r\n\r\n // Match route\r\n const match = this.router.match(method, path);\r\n\r\n // Create context\r\n const context = createContext<E>(\r\n request,\r\n match?.params || {},\r\n (options.env || {}) as E['Bindings']\r\n );\r\n\r\n try {\r\n // Build middleware chain\r\n const middlewares = [...this.globalMiddleware];\r\n\r\n if (match) {\r\n // Compose middleware + handler\r\n const composed = this.composeMiddleware(\r\n middlewares,\r\n match.handler\r\n );\r\n return await composed(context);\r\n } else {\r\n // No route found\r\n if (middlewares.length > 0) {\r\n const composed = this.composeMiddleware(\r\n middlewares,\r\n this.notFoundHandler\r\n );\r\n return await composed(context);\r\n }\r\n return await this.notFoundHandler(context);\r\n }\r\n } catch (error) {\r\n console.error('[Flight HTTP] Error:', error);\r\n return await this.errorHandler(\r\n error instanceof Error ? error : new Error(String(error)),\r\n context\r\n );\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // Listen (Node.js adapter will override this)\r\n // ========================================================================\r\n\r\n listen(options?: ListenOptions | number): void {\r\n const port = typeof options === 'number' ? options : options?.port || 3000;\r\n console.log(`[Flight HTTP] Call adapter-specific listen() to start server on port ${port}`);\r\n console.log('[Flight HTTP] Import from \"@flight/http/node\" or \"@flight/http/bun\"');\r\n }\r\n\r\n // ========================================================================\r\n // Private Methods\r\n // ========================================================================\r\n\r\n private addRoute(\r\n method: HttpMethod | '*',\r\n path: string,\r\n handlers: HandlerOrMiddleware<E>[]\r\n ): FlightHttpServer<E> {\r\n // Last handler is the main handler\r\n const mainHandler = handlers[handlers.length - 1] as Handler<E>;\r\n const routeMiddleware = handlers.slice(0, -1) as Middleware<E>[];\r\n\r\n const fullPath = this.basePath + path;\r\n\r\n // If there's route-specific middleware, compose it\r\n if (routeMiddleware.length > 0) {\r\n const composedHandler = this.composeMiddleware(routeMiddleware, mainHandler);\r\n this.router.add(method, fullPath, composedHandler);\r\n } else {\r\n this.router.add(method, fullPath, mainHandler);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Compose middleware chain with final handler\r\n */\r\n private composeMiddleware(\r\n middlewares: Middleware<E>[],\r\n handler: Handler<E>\r\n ): Handler<E> {\r\n return async (c: Context<E>) => {\r\n let index = 0;\r\n\r\n const dispatch = async (): Promise<Response> => {\r\n if (index < middlewares.length) {\r\n const middleware = middlewares[index++];\r\n if (middleware) {\r\n return await middleware(c, dispatch);\r\n }\r\n }\r\n return await handler(c);\r\n };\r\n\r\n return await dispatch();\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Factory Function\r\n// ============================================================================\r\n\r\n/**\r\n * Create a new Flight HTTP server\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight/http';\r\n * \r\n * const app = createServer();\r\n * \r\n * app.get('/', (c) => c.json({ message: 'Hello Flight!' }));\r\n * \r\n * export default app;\r\n * ```\r\n */\r\nexport function createServer<E extends Env = Env>(\r\n options: ServerOptions = {}\r\n): FlightHttpServer<E> {\r\n return new FlightHttp<E>(options);\r\n}\r\n","/**\r\n * @flight/core - File Router\r\n * \r\n * Auto-discovery of routes from file system.\r\n * Similar to Next.js App Router and Nuxt server/api patterns.\r\n */\r\n\r\nimport { readdir } from 'node:fs/promises';\r\nimport { join, basename, extname } from 'node:path';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';\r\n\r\nexport type Handler = (context: unknown) => Response | Promise<Response>;\r\nexport type Middleware = (context: unknown, next: () => Promise<Response>) => Response | Promise<Response>;\r\n\r\nexport interface FileRoute {\r\n /** HTTP method (GET, POST, etc) or 'ALL' */\r\n method: HttpMethod | 'ALL';\r\n /** Route path with params (e.g., /users/:id) */\r\n path: string;\r\n /** Original file path */\r\n filePath: string;\r\n /** Handler function (for APIs) */\r\n handler?: Handler;\r\n /** Route-specific middleware */\r\n middleware?: Middleware[];\r\n /** Route type: 'page' for SSR pages, 'api' for API endpoints */\r\n type: 'page' | 'api';\r\n /** Component function (for pages) */\r\n component?: () => unknown;\r\n /** Page metadata (title, description, etc) */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\nexport interface FileRouterOptions {\r\n /** Root directory to scan (default: src/routes) */\r\n directory: string;\r\n /** File extensions to consider (default: ['.ts', '.js']) */\r\n extensions?: string[];\r\n /** Whether to watch for changes (default: false in prod) */\r\n watch?: boolean;\r\n}\r\n\r\nexport interface ScanResult {\r\n routes: FileRoute[];\r\n errors: string[];\r\n}\r\n\r\n// ============================================================================\r\n// File Scanner\r\n// ============================================================================\r\n\r\n/**\r\n * Scan a directory for route files\r\n */\r\nexport async function scanRoutes(options: FileRouterOptions): Promise<ScanResult> {\r\n const {\r\n directory,\r\n extensions = ['.ts', '.js'],\r\n } = options;\r\n\r\n const routes: FileRoute[] = [];\r\n const errors: string[] = [];\r\n\r\n async function scanDir(dir: string, basePath: string = ''): Promise<void> {\r\n try {\r\n const entries = await readdir(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n // Skip hidden directories and node_modules\r\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\r\n continue;\r\n }\r\n\r\n // Recurse into subdirectory\r\n await scanDir(fullPath, `${basePath}/${entry.name}`);\r\n } else if (entry.isFile()) {\r\n const ext = extname(entry.name);\r\n\r\n if (!extensions.includes(ext)) {\r\n continue;\r\n }\r\n\r\n // Parse route from filename\r\n const routeInfo = parseRouteFile(entry.name, basePath);\r\n\r\n if (routeInfo && routeInfo.method && routeInfo.path) {\r\n routes.push({\r\n method: routeInfo.method,\r\n path: routeInfo.path,\r\n filePath: fullPath,\r\n type: routeInfo.type,\r\n });\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n errors.push(`Failed to scan ${dir}: ${error}`);\r\n }\r\n }\r\n\r\n await scanDir(directory);\r\n\r\n return { routes, errors };\r\n}\r\n\r\n// ============================================================================\r\n// Route Parser\r\n// ============================================================================\r\n\r\ninterface ParsedRoute {\r\n method: HttpMethod | 'ALL';\r\n path: string;\r\n type: 'page' | 'api';\r\n}\r\n\r\n/**\r\n * Parse route information from filename and path\r\n * \r\n * Patterns:\r\n * - index.ts → /\r\n * - users.ts → /users\r\n * - users.get.ts → GET /users (API)\r\n * - users.post.ts → POST /users (API)\r\n * - about.page.tsx → GET /about (Page)\r\n * - blog/[slug].page.tsx → GET /blog/:slug (Page)\r\n * - [id].ts → /:id\r\n * - [...slug].ts → /* (catch-all)\r\n * - [[...slug]].ts → /* (optional catch-all)\r\n */\r\nfunction parseRouteFile(filename: string, basePath: string): ParsedRoute | null {\r\n const ext = extname(filename);\r\n const nameWithoutExt = basename(filename, ext);\r\n\r\n // Skip files starting with underscore (private)\r\n if (nameWithoutExt.startsWith('_')) {\r\n return null;\r\n }\r\n\r\n // Detect route type\r\n let type: 'page' | 'api' = 'api';\r\n let routeName = nameWithoutExt;\r\n let method: HttpMethod | 'ALL' = 'ALL';\r\n\r\n // Check for page suffix (e.g., about.page.tsx, index.page.tsx)\r\n const pageMatch = nameWithoutExt.match(/^(.+)?\\.page$/i);\r\n if (pageMatch) {\r\n type = 'page';\r\n method = 'GET'; // Pages are always GET\r\n routeName = pageMatch[1] || 'index';\r\n } else {\r\n // Check for method suffix (e.g., users.get.ts)\r\n const methodMatch = nameWithoutExt.match(/^(.+)\\.(get|post|put|delete|patch|head|options)$/i);\r\n if (methodMatch) {\r\n routeName = methodMatch[1] || nameWithoutExt;\r\n method = (methodMatch[2] || 'ALL').toUpperCase() as HttpMethod;\r\n }\r\n }\r\n\r\n // Also check if file is in /api/ directory\r\n if (basePath.startsWith('/api') || basePath.includes('/api/')) {\r\n type = 'api';\r\n }\r\n\r\n // Build route path\r\n let path = basePath;\r\n\r\n if (routeName !== 'index') {\r\n path = `${basePath}/${convertToRoutePath(routeName)}`;\r\n }\r\n\r\n // Ensure path starts with /\r\n if (!path.startsWith('/')) {\r\n path = '/' + path;\r\n }\r\n\r\n // Remove trailing slash (except for root)\r\n if (path !== '/' && path.endsWith('/')) {\r\n path = path.slice(0, -1);\r\n }\r\n\r\n return { method, path, type };\r\n}\r\n\r\n/**\r\n * Convert filename segment to route path segment\r\n * \r\n * - [id] → :id\r\n * - [...slug] → *\r\n * - [[...slug]] → *?\r\n */\r\nfunction convertToRoutePath(name: string): string {\r\n // Optional catch-all: [[...slug]]\r\n if (name.startsWith('[[...') && name.endsWith(']]')) {\r\n const paramName = name.slice(5, -2);\r\n return `:${paramName}*`;\r\n }\r\n\r\n // Catch-all: [...slug]\r\n if (name.startsWith('[...') && name.endsWith(']')) {\r\n const paramName = name.slice(4, -1);\r\n return `:${paramName}+`;\r\n }\r\n\r\n // Dynamic param: [id]\r\n if (name.startsWith('[') && name.endsWith(']')) {\r\n const paramName = name.slice(1, -1);\r\n return `:${paramName}`;\r\n }\r\n\r\n return name;\r\n}\r\n\r\n// ============================================================================\r\n// Route Loader\r\n// ============================================================================\r\n\r\n/**\r\n * Load routes with their handlers or components\r\n */\r\nexport async function loadRoutes(scanResult: ScanResult): Promise<FileRoute[]> {\r\n const loadedRoutes: FileRoute[] = [];\r\n\r\n for (const route of scanResult.routes) {\r\n try {\r\n // Dynamic import of route file\r\n const module = await import(route.filePath);\r\n\r\n // Handle PAGE routes\r\n if (route.type === 'page') {\r\n // Pages export default component\r\n const component = module.default;\r\n const meta = module.meta || module.metadata || {};\r\n\r\n if (component) {\r\n loadedRoutes.push({\r\n ...route,\r\n component,\r\n meta,\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n // Handle API routes\r\n if (route.method === 'ALL') {\r\n // Look for named exports: GET, POST, PUT, DELETE, etc\r\n const methods: HttpMethod[] = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'];\r\n\r\n for (const method of methods) {\r\n if (typeof module[method] === 'function') {\r\n loadedRoutes.push({\r\n ...route,\r\n method,\r\n handler: module[method],\r\n });\r\n }\r\n }\r\n\r\n // Also check for default export as handler\r\n if (typeof module.default === 'function') {\r\n loadedRoutes.push({\r\n ...route,\r\n method: 'ALL',\r\n handler: module.default,\r\n });\r\n }\r\n } else {\r\n // Specific method from filename suffix\r\n const handler = module[route.method] || module.default;\r\n\r\n if (typeof handler === 'function') {\r\n loadedRoutes.push({\r\n ...route,\r\n handler,\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`[Flight] Failed to load route ${route.filePath}:`, error);\r\n }\r\n }\r\n\r\n return loadedRoutes;\r\n}\r\n\r\n// ============================================================================\r\n// File Router Factory\r\n// ============================================================================\r\n\r\nexport interface FileRouter {\r\n routes: FileRoute[];\r\n refresh: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Create a file-based router\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createFileRouter } from '@flight/core/file-router';\r\n * import { createServer } from '@flight/http';\r\n * \r\n * const router = await createFileRouter({ directory: './src/routes' });\r\n * const app = createServer();\r\n * \r\n * // Register all discovered routes\r\n * for (const route of router.routes) {\r\n * app[route.method.toLowerCase()](route.path, route.handler);\r\n * }\r\n * ```\r\n */\r\nexport async function createFileRouter(options: FileRouterOptions): Promise<FileRouter> {\r\n let routes: FileRoute[] = [];\r\n\r\n async function refresh(): Promise<void> {\r\n const scanResult = await scanRoutes(options);\r\n\r\n if (scanResult.errors.length > 0) {\r\n console.warn('[Flight] Route scan errors:', scanResult.errors);\r\n }\r\n\r\n routes = await loadRoutes(scanResult);\r\n\r\n console.log(`[Flight] Loaded ${routes.length} routes from ${options.directory}`);\r\n }\r\n\r\n // Initial load\r\n await refresh();\r\n\r\n return {\r\n get routes() {\r\n return routes;\r\n },\r\n refresh,\r\n };\r\n}\r\n","export { createFileRouter, loadRoutes, scanRoutes } from '../chunk-I5RHYGX6.js';\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","/**\r\n * @flight/core - Server Actions\r\n * \r\n * Implementation of React 19 style Server Actions.\r\n * Functions marked with 'use server' run on the server.\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Server action metadata\r\n */\r\nexport interface ServerAction {\r\n /** Unique action ID */\r\n id: string;\r\n /** Original function name */\r\n name: string;\r\n /** File path where action is defined */\r\n filePath: string;\r\n /** The actual action function */\r\n fn: (...args: unknown[]) => Promise<unknown>;\r\n}\r\n\r\n/**\r\n * Server action result\r\n */\r\nexport interface ActionResult<T = unknown> {\r\n success: boolean;\r\n data?: T;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Form action data\r\n */\r\nexport interface FormActionData {\r\n actionId: string;\r\n formData: FormData;\r\n}\r\n\r\n// ============================================================================\r\n// Action Registry\r\n// ============================================================================\r\n\r\nconst actionRegistry = new Map<string, ServerAction>();\r\n\r\n/**\r\n * Register a server action\r\n */\r\nexport function registerAction(action: ServerAction): void {\r\n actionRegistry.set(action.id, action);\r\n}\r\n\r\n/**\r\n * Get a registered action by ID\r\n */\r\nexport function getAction(id: string): ServerAction | undefined {\r\n return actionRegistry.get(id);\r\n}\r\n\r\n/**\r\n * Get all registered actions\r\n */\r\nexport function getAllActions(): ServerAction[] {\r\n return Array.from(actionRegistry.values());\r\n}\r\n\r\n/**\r\n * Clear all registered actions (useful for testing)\r\n */\r\nexport function clearActions(): void {\r\n actionRegistry.clear();\r\n}\r\n\r\n// ============================================================================\r\n// Action Execution\r\n// ============================================================================\r\n\r\n/**\r\n * Execute a server action\r\n */\r\nexport async function executeAction<T = unknown>(\r\n actionId: string,\r\n args: unknown[]\r\n): Promise<ActionResult<T>> {\r\n const action = getAction(actionId);\r\n\r\n if (!action) {\r\n return {\r\n success: false,\r\n error: `Action not found: ${actionId}`,\r\n };\r\n }\r\n\r\n try {\r\n const result = await action.fn(...args);\r\n return {\r\n success: true,\r\n data: result as T,\r\n };\r\n } catch (error) {\r\n // Re-throw RedirectError so handleActionRequest can return 303\r\n if (isRedirectError(error)) {\r\n throw error;\r\n }\r\n console.error(`[Flight] Action error (${actionId}):`, error);\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Execute a form action\r\n */\r\nexport async function executeFormAction<T = unknown>(\r\n actionId: string,\r\n formData: FormData\r\n): Promise<ActionResult<T>> {\r\n return executeAction<T>(actionId, [formData]);\r\n}\r\n\r\n// ============================================================================\r\n// Action ID Generation\r\n// ============================================================================\r\n\r\nlet actionCounter = 0;\r\n\r\n/**\r\n * Generate a unique action ID\r\n */\r\nexport function generateActionId(name: string, filePath: string): string {\r\n const hash = simpleHash(`${filePath}:${name}`);\r\n return `action_${hash}_${actionCounter++}`;\r\n}\r\n\r\n/**\r\n * Simple hash function for action IDs\r\n */\r\nfunction simpleHash(str: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash; // Convert to 32bit integer\r\n }\r\n return Math.abs(hash).toString(36);\r\n}\r\n\r\n// ============================================================================\r\n// Action Helpers (for use inside actions)\r\n// ============================================================================\r\n\r\n/**\r\n * Get cookies in server action context\r\n */\r\nexport function cookies(): {\r\n get: (name: string) => string | undefined;\r\n set: (name: string, value: string, options?: CookieOptions) => void;\r\n delete: (name: string) => void;\r\n} {\r\n // This will be populated by the runtime\r\n const cookieStore = (globalThis as any).__flightCookies;\r\n\r\n if (!cookieStore) {\r\n console.warn('[Flight] Cookies not available outside of action context');\r\n return {\r\n get: () => undefined,\r\n set: () => { },\r\n delete: () => { },\r\n };\r\n }\r\n\r\n return cookieStore;\r\n}\r\n\r\nexport interface CookieOptions {\r\n maxAge?: number;\r\n expires?: Date;\r\n path?: string;\r\n domain?: string;\r\n secure?: boolean;\r\n httpOnly?: boolean;\r\n sameSite?: 'strict' | 'lax' | 'none';\r\n}\r\n\r\n/**\r\n * Redirect in server action context\r\n */\r\nexport function redirect(url: string): never {\r\n throw new RedirectError(url);\r\n}\r\n\r\n/**\r\n * Special error for redirects\r\n */\r\nexport class RedirectError extends Error {\r\n public readonly url: string;\r\n\r\n constructor(url: string) {\r\n super(`Redirect to ${url}`);\r\n this.name = 'RedirectError';\r\n this.url = url;\r\n }\r\n}\r\n\r\n/**\r\n * Check if error is a redirect\r\n */\r\nexport function isRedirectError(error: unknown): error is RedirectError {\r\n return error instanceof RedirectError;\r\n}\r\n\r\n// ============================================================================\r\n// Form Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Parse form data to typed object\r\n */\r\nexport function parseFormData<T extends Record<string, string>>(\r\n formData: FormData\r\n): T {\r\n const result: Record<string, string> = {};\r\n\r\n formData.forEach((value, key) => {\r\n result[key] = String(value);\r\n });\r\n\r\n return result as T;\r\n}\r\n\r\n/**\r\n * Create action reference for form action attribute\r\n */\r\nexport function createActionReference(actionId: string): string {\r\n return `/__flight_action/${actionId}`;\r\n}\r\n\r\n// ============================================================================\r\n// Action Handler (for HTTP endpoint)\r\n// ============================================================================\r\n\r\n/**\r\n * Handle action request from client\r\n */\r\nexport async function handleActionRequest(\r\n request: Request\r\n): Promise<Response> {\r\n const url = new URL(request.url);\r\n const actionPath = url.pathname;\r\n\r\n // Extract action ID from path: /__flight_action/{actionId}\r\n const match = actionPath.match(/^\\/__flight_action\\/(.+)$/);\r\n\r\n if (!match) {\r\n return new Response(JSON.stringify({ error: 'Invalid action path' }), {\r\n status: 400,\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n }\r\n\r\n const actionId = match[1];\r\n\r\n if (!actionId) {\r\n return new Response(JSON.stringify({ error: 'Missing action ID' }), {\r\n status: 400,\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n }\r\n\r\n try {\r\n let result: ActionResult;\r\n\r\n // Check content type for form vs JSON\r\n const contentType = request.headers.get('content-type') || '';\r\n\r\n if (contentType.includes('application/x-www-form-urlencoded') ||\r\n contentType.includes('multipart/form-data')) {\r\n const formData = await request.formData();\r\n result = await executeFormAction(actionId, formData);\r\n } else {\r\n const args = await request.json();\r\n result = await executeAction(actionId, Array.isArray(args) ? args : [args]);\r\n }\r\n\r\n return new Response(JSON.stringify(result), {\r\n status: result.success ? 200 : 400,\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n } catch (error) {\r\n if (isRedirectError(error)) {\r\n return new Response(null, {\r\n status: 303,\r\n headers: { Location: error.url },\r\n });\r\n }\r\n\r\n return new Response(JSON.stringify({\r\n success: false,\r\n error: error instanceof Error ? error.message : 'Unknown error',\r\n }), {\r\n status: 500,\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n }\r\n}\r\n","/**\r\n * @flight/core - Route Handlers\r\n * \r\n * Types and utilities for route handlers.\r\n * Similar to Next.js Route Handlers pattern.\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * HTTP methods supported by route handlers\r\n */\r\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';\r\n\r\n/**\r\n * Context passed to route handlers\r\n */\r\nexport interface RouteHandlerContext {\r\n /** Route parameters (e.g., { id: '123' }) */\r\n params: Record<string, string>;\r\n /** Query string parameters */\r\n searchParams: URLSearchParams;\r\n}\r\n\r\n/**\r\n * Route handler function signature\r\n * \r\n * @example\r\n * ```typescript\r\n * // src/routes/api/users/[id].ts\r\n * export const GET: RouteHandler = async (request, context) => {\r\n * const { id } = context.params;\r\n * return Response.json({ userId: id });\r\n * };\r\n * \r\n * export const PUT: RouteHandler = async (request, context) => {\r\n * const body = await request.json();\r\n * return Response.json({ updated: true, data: body });\r\n * };\r\n * ```\r\n */\r\nexport type RouteHandler = (\r\n request: Request,\r\n context: RouteHandlerContext\r\n) => Response | Promise<Response>;\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a route handler context from request\r\n */\r\nexport function createRouteContext(\r\n request: Request,\r\n params: Record<string, string> = {}\r\n): RouteHandlerContext {\r\n const url = new URL(request.url);\r\n return {\r\n params,\r\n searchParams: url.searchParams,\r\n };\r\n}\r\n\r\n/**\r\n * Helper to create JSON response\r\n */\r\nexport function json<T>(data: T, init?: ResponseInit): Response {\r\n const headers = new Headers(init?.headers);\r\n headers.set('Content-Type', 'application/json; charset=utf-8');\r\n\r\n return new Response(JSON.stringify(data), {\r\n ...init,\r\n headers,\r\n });\r\n}\r\n\r\n/**\r\n * Helper to create redirect response\r\n */\r\nexport function redirect(url: string, status: 301 | 302 | 303 | 307 | 308 = 302): Response {\r\n return new Response(null, {\r\n status,\r\n headers: { Location: url },\r\n });\r\n}\r\n\r\n/**\r\n * Helper to create error response\r\n */\r\nexport function error(message: string, status = 500): Response {\r\n return new Response(JSON.stringify({ error: message }), {\r\n status,\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n}\r\n\r\n/**\r\n * Helper to get request body as typed object\r\n */\r\nexport async function parseBody<T>(request: Request): Promise<T> {\r\n const contentType = request.headers.get('content-type') || '';\r\n\r\n if (contentType.includes('application/json')) {\r\n return await request.json() as T;\r\n }\r\n\r\n if (contentType.includes('application/x-www-form-urlencoded')) {\r\n const formData = await request.formData();\r\n const obj: Record<string, string> = {};\r\n formData.forEach((value, key) => {\r\n obj[key] = String(value);\r\n });\r\n return obj as T;\r\n }\r\n\r\n throw new Error(`Unsupported content type: ${contentType}`);\r\n}\r\n","/**\r\n * @flight/core - Streaming SSR\r\n * \r\n * Full streaming server-side rendering implementation following React 18+/19 patterns.\r\n * Supports both Node.js (renderToPipeableStream) and Edge (renderToReadableStream) environments.\r\n * \r\n * Best Practices 2025/2026:\r\n * - Progressive HTML streaming with Suspense boundaries\r\n * - Shell-first rendering for fast TTFB\r\n * - Nested Suspense for granular loading states\r\n * - Error boundaries for graceful degradation\r\n * - Web Streams API for Edge runtime compatibility\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Streaming render options following React's conventions\r\n */\r\nexport interface StreamingRenderOptions {\r\n /** Bootstrap scripts to load on client */\r\n bootstrapScripts?: string[];\r\n /** Bootstrap ES modules */\r\n bootstrapModules?: string[];\r\n /** Inline script content */\r\n bootstrapScriptContent?: string;\r\n /** Prefix for React IDs (useId) */\r\n identifierPrefix?: string;\r\n /** Nonce for CSP */\r\n nonce?: string;\r\n /** Callback when shell is ready (main content before Suspense) */\r\n onShellReady?: () => void;\r\n /** Callback when shell errors */\r\n onShellError?: (error: Error) => void;\r\n /** Callback when all content is ready */\r\n onAllReady?: () => void;\r\n /** Callback for any error */\r\n onError?: (error: Error) => void;\r\n /** Timeout before aborting stream */\r\n timeoutMs?: number;\r\n /** Progressive hydration enabled */\r\n progressiveHydration?: boolean;\r\n}\r\n\r\n/**\r\n * Streaming render result\r\n */\r\nexport interface StreamingRenderResult {\r\n /** The readable stream to pipe to response */\r\n stream: ReadableStream<Uint8Array>;\r\n /** Abort the stream */\r\n abort: () => void;\r\n /** Promise that resolves when shell is ready */\r\n shellReady: Promise<void>;\r\n /** Promise that resolves when all content is ready */\r\n allReady: Promise<void>;\r\n}\r\n\r\n/**\r\n * Suspense boundary configuration\r\n */\r\nexport interface SuspenseBoundaryConfig {\r\n /** Unique ID for this boundary */\r\n id: string;\r\n /** Fallback HTML to show while loading */\r\n fallback: string;\r\n /** Content resolver promise */\r\n contentPromise: Promise<string>;\r\n}\r\n\r\n// ============================================================================\r\n// Streaming Renderer\r\n// ============================================================================\r\n\r\n/**\r\n * Create a streaming SSR response using Web Streams API.\r\n * Compatible with Edge Runtime (Cloudflare, Vercel Edge, Deno).\r\n * \r\n * @example\r\n * ```typescript\r\n * const result = await createStreamingSSR({\r\n * shell: '<html><body><div id=\"root\">',\r\n * shellEnd: '</div></body></html>',\r\n * suspenseBoundaries: [\r\n * {\r\n * id: 'posts',\r\n * fallback: '<div>Loading posts...</div>',\r\n * contentPromise: fetchAndRenderPosts(),\r\n * }\r\n * ],\r\n * bootstrapScripts: ['/client.js'],\r\n * });\r\n * \r\n * return new Response(result.stream, {\r\n * headers: { 'Content-Type': 'text/html' },\r\n * });\r\n * ```\r\n */\r\nexport async function createStreamingSSR(config: {\r\n /** Initial HTML shell (before suspense content) */\r\n shell: string;\r\n /** Closing HTML shell */\r\n shellEnd: string;\r\n /** Suspense boundaries with async content */\r\n suspenseBoundaries?: SuspenseBoundaryConfig[];\r\n /** Streaming options */\r\n options?: StreamingRenderOptions;\r\n}): Promise<StreamingRenderResult> {\r\n const { shell, shellEnd, suspenseBoundaries = [], options = {} } = config;\r\n\r\n let shellResolved = false;\r\n let allResolved = false;\r\n let _aborted = false;\r\n let abortController: AbortController | null = null;\r\n\r\n // Shell ready promise\r\n let resolveShell: () => void;\r\n const shellReady = new Promise<void>((resolve) => {\r\n resolveShell = resolve;\r\n });\r\n\r\n // All ready promise\r\n let resolveAll: () => void;\r\n const allReady = new Promise<void>((resolve) => {\r\n resolveAll = resolve;\r\n });\r\n\r\n const encoder = new TextEncoder();\r\n\r\n const stream = new ReadableStream<Uint8Array>({\r\n async start(controller) {\r\n try {\r\n // 1. Send the shell immediately (fast TTFB)\r\n const shellWithPlaceholders = buildShellWithPlaceholders(\r\n shell,\r\n suspenseBoundaries,\r\n shellEnd,\r\n options\r\n );\r\n\r\n controller.enqueue(encoder.encode(shellWithPlaceholders));\r\n\r\n shellResolved = true;\r\n options.onShellReady?.();\r\n resolveShell!();\r\n\r\n // 2. Stream Suspense boundary contents as they resolve\r\n if (suspenseBoundaries.length > 0) {\r\n await streamSuspenseContent(controller, encoder, suspenseBoundaries, options);\r\n }\r\n\r\n // 3. Send hydration script if needed\r\n if (options.bootstrapScripts?.length || options.bootstrapModules?.length) {\r\n const hydrationScript = buildHydrationScript(options);\r\n controller.enqueue(encoder.encode(hydrationScript));\r\n }\r\n\r\n allResolved = true;\r\n options.onAllReady?.();\r\n resolveAll!();\r\n\r\n controller.close();\r\n } catch (error) {\r\n if (!shellResolved) {\r\n options.onShellError?.(error as Error);\r\n }\r\n options.onError?.(error as Error);\r\n controller.error(error);\r\n }\r\n },\r\n\r\n cancel() {\r\n _aborted = true;\r\n abortController?.abort();\r\n },\r\n });\r\n\r\n // Abort function\r\n const abort = () => {\r\n _aborted = true;\r\n abortController?.abort();\r\n };\r\n\r\n // Timeout handling\r\n if (options.timeoutMs) {\r\n abortController = new AbortController();\r\n setTimeout(() => {\r\n if (!allResolved) {\r\n abort();\r\n }\r\n }, options.timeoutMs);\r\n }\r\n\r\n return {\r\n stream,\r\n abort,\r\n shellReady,\r\n allReady,\r\n };\r\n}\r\n\r\n/**\r\n * Build shell HTML with Suspense placeholders\r\n */\r\nfunction buildShellWithPlaceholders(\r\n shell: string,\r\n boundaries: SuspenseBoundaryConfig[],\r\n shellEnd: string,\r\n options: StreamingRenderOptions\r\n): string {\r\n let html = shell;\r\n\r\n // Add inline bootstrap script if provided\r\n if (options.bootstrapScriptContent) {\r\n html += `<script>${options.bootstrapScriptContent}</script>`;\r\n }\r\n\r\n // Add Suspense fallbacks with placeholder markers\r\n for (const boundary of boundaries) {\r\n html += `\r\n<!--$?--><template id=\"B:${boundary.id}\"></template>\r\n${boundary.fallback}\r\n<!--/$-->`;\r\n }\r\n\r\n html += shellEnd;\r\n\r\n return html;\r\n}\r\n\r\n/**\r\n * Stream Suspense content as promises resolve\r\n */\r\nasync function streamSuspenseContent(\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n boundaries: SuspenseBoundaryConfig[],\r\n options: StreamingRenderOptions\r\n): Promise<void> {\r\n // Race all boundaries - stream each as it completes\r\n const pending = boundaries.map(async (boundary) => {\r\n try {\r\n const content = await boundary.contentPromise;\r\n return { boundary, content, error: null };\r\n } catch (error) {\r\n return { boundary, content: null, error: error as Error };\r\n }\r\n });\r\n\r\n // Process as each resolves\r\n const results = await Promise.allSettled(pending);\r\n\r\n for (const result of results) {\r\n if (result.status === 'fulfilled') {\r\n const { boundary, content, error } = result.value;\r\n\r\n if (error) {\r\n // Send error replacement\r\n const errorScript = buildErrorReplacement(boundary.id, error.message);\r\n controller.enqueue(encoder.encode(errorScript));\r\n options.onError?.(error);\r\n } else if (content) {\r\n // Send content replacement script\r\n const replacementScript = buildContentReplacement(boundary.id, content);\r\n controller.enqueue(encoder.encode(replacementScript));\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Build script to replace Suspense placeholder with actual content\r\n * This follows React's streaming hydration pattern\r\n */\r\nfunction buildContentReplacement(id: string, content: string): string {\r\n // Escape script-breaking characters\r\n const escaped = content\r\n .replace(/\\\\/g, '\\\\\\\\')\r\n .replace(/</g, '\\\\u003c')\r\n .replace(/>/g, '\\\\u003e')\r\n .replace(/'/g, \"\\\\'\")\r\n .replace(/\"/g, '\\\\\"')\r\n .replace(/\\n/g, '\\\\n')\r\n .replace(/\\r/g, '\\\\r');\r\n\r\n return `\r\n<script>\r\n(function(){\r\n var b=document.getElementById(\"B:${id}\");\r\n if(b){\r\n var p=b.previousSibling;\r\n while(p&&p.nodeType===8&&p.data===\"$?\")p=p.previousSibling;\r\n var n=b.nextSibling;\r\n var f=document.createDocumentFragment();\r\n var t=document.createElement(\"template\");\r\n t.innerHTML=\"${escaped}\";\r\n while(t.content.firstChild)f.appendChild(t.content.firstChild);\r\n if(n&&n.nodeType===8&&n.data===\"/$\"){\r\n var s=n.nextSibling;\r\n while(s&&s!==b){var x=s.nextSibling;s.parentNode.removeChild(s);s=x;}\r\n }\r\n b.parentNode.replaceChild(f,b);\r\n }\r\n})();\r\n</script>`;\r\n}\r\n\r\n/**\r\n * Build script to show error in place of Suspense content\r\n */\r\nfunction buildErrorReplacement(id: string, message: string): string {\r\n const escaped = message.replace(/'/g, \"\\\\'\").replace(/\"/g, '\\\\\"');\r\n\r\n return `\r\n<script>\r\n(function(){\r\n var b=document.getElementById(\"B:${id}\");\r\n if(b){\r\n var t=document.createElement(\"div\");\r\n t.className=\"streaming-error\";\r\n t.textContent=\"Error: ${escaped}\";\r\n b.parentNode.replaceChild(t,b);\r\n }\r\n})();\r\n</script>`;\r\n}\r\n\r\n/**\r\n * Build hydration bootstrap script\r\n */\r\nfunction buildHydrationScript(options: StreamingRenderOptions): string {\r\n let scripts = '';\r\n\r\n if (options.bootstrapScripts?.length) {\r\n for (const src of options.bootstrapScripts) {\r\n const nonceAttr = options.nonce ? ` nonce=\"${options.nonce}\"` : '';\r\n scripts += `<script src=\"${src}\"${nonceAttr} async></script>`;\r\n }\r\n }\r\n\r\n if (options.bootstrapModules?.length) {\r\n for (const src of options.bootstrapModules) {\r\n const nonceAttr = options.nonce ? ` nonce=\"${options.nonce}\"` : '';\r\n scripts += `<script type=\"module\" src=\"${src}\"${nonceAttr}></script>`;\r\n }\r\n }\r\n\r\n return scripts;\r\n}\r\n\r\n// ============================================================================\r\n// Streaming Response Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Create a streaming HTML Response object\r\n */\r\nexport function createStreamingResponse(\r\n stream: ReadableStream<Uint8Array>,\r\n options: {\r\n status?: number;\r\n headers?: Record<string, string>;\r\n } = {}\r\n): Response {\r\n return new Response(stream, {\r\n status: options.status || 200,\r\n headers: {\r\n 'Content-Type': 'text/html; charset=utf-8',\r\n 'Transfer-Encoding': 'chunked',\r\n 'X-Content-Type-Options': 'nosniff',\r\n ...options.headers,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Higher-level API: Render page with Suspense boundaries\r\n * \r\n * @example\r\n * ```typescript\r\n * return renderWithStreaming({\r\n * layout: ({ children }) => `\r\n * <html>\r\n * <head><title>My App</title></head>\r\n * <body><div id=\"root\">${children}</div></body>\r\n * </html>\r\n * `,\r\n * page: async () => '<h1>Welcome</h1>',\r\n * suspense: {\r\n * posts: {\r\n * fallback: '<div class=\"skeleton\">Loading...</div>',\r\n * content: fetchPosts().then(renderPosts),\r\n * },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport async function renderWithStreaming(config: {\r\n /** Layout wrapper */\r\n layout: (props: { children: string }) => string;\r\n /** Main page content (sync part) */\r\n page: () => string | Promise<string>;\r\n /** Suspense boundaries keyed by ID */\r\n suspense?: Record<string, { fallback: string; content: Promise<string> }>;\r\n /** Bootstrap scripts */\r\n bootstrapScripts?: string[];\r\n /** Timeout in ms */\r\n timeoutMs?: number;\r\n}): Promise<Response> {\r\n const { layout, page, suspense = {}, bootstrapScripts, timeoutMs } = config;\r\n\r\n // Get synchronous page content\r\n const pageContent = await page();\r\n\r\n // Build suspense boundaries\r\n const boundaries: SuspenseBoundaryConfig[] = Object.entries(suspense).map(\r\n ([id, { fallback, content }]) => ({\r\n id,\r\n fallback,\r\n contentPromise: content,\r\n })\r\n );\r\n\r\n // Create streaming result\r\n const result = await createStreamingSSR({\r\n shell: layout({ children: pageContent }),\r\n shellEnd: '',\r\n suspenseBoundaries: boundaries,\r\n options: {\r\n bootstrapScripts,\r\n timeoutMs,\r\n },\r\n });\r\n\r\n return createStreamingResponse(result.stream);\r\n}\r\n\r\n// ============================================================================\r\n// Progressive Rendering Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Create a lazy component that streams its content\r\n */\r\nexport function createLazyContent<T>(\r\n fetcher: () => Promise<T>,\r\n renderer: (data: T) => string,\r\n fallback: string\r\n): { fallback: string; content: Promise<string> } {\r\n return {\r\n fallback,\r\n content: fetcher().then(renderer),\r\n };\r\n}\r\n\r\n/**\r\n * Parallel streaming: resolve multiple boundaries simultaneously\r\n */\r\nexport async function streamParallel(\r\n boundaries: Array<{\r\n id: string;\r\n fallback: string;\r\n content: () => Promise<string>;\r\n }>\r\n): Promise<SuspenseBoundaryConfig[]> {\r\n return boundaries.map((b) => ({\r\n id: b.id,\r\n fallback: b.fallback,\r\n contentPromise: b.content(),\r\n }));\r\n}\r\n\r\n/**\r\n * Sequential streaming: resolve boundaries in order\r\n */\r\nexport async function streamSequential(\r\n boundaries: Array<{\r\n id: string;\r\n fallback: string;\r\n content: () => Promise<string>;\r\n }>\r\n): Promise<SuspenseBoundaryConfig[]> {\r\n const result: SuspenseBoundaryConfig[] = [];\r\n\r\n for (const b of boundaries) {\r\n result.push({\r\n id: b.id,\r\n fallback: b.fallback,\r\n contentPromise: b.content(),\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Export for use with React\r\n// ============================================================================\r\n\r\n/**\r\n * NOTE: For React-specific streaming with renderToPipeableStream or \r\n * renderToReadableStream, use the dedicated React adapter:\r\n * \r\n * ```typescript\r\n * import { renderToReadableStream } from 'react-dom/server';\r\n * import { createStreamingResponse } from '@flight/core/streaming';\r\n * \r\n * const stream = await renderToReadableStream(<App />, {\r\n * bootstrapScripts: ['/client.js'],\r\n * });\r\n * \r\n * return createStreamingResponse(stream);\r\n * ```\r\n * \r\n * This module provides framework-agnostic streaming primitives that work\r\n * with any UI library or custom HTML generation.\r\n */\r\n","/**\r\n * @flight/core - React Server Components Support\r\n * \r\n * Framework-agnostic primitives for RSC-like patterns.\r\n * Enables async server components, client/server boundaries, and data fetching.\r\n * \r\n * Best Practices 2025/2026:\r\n * - Async components for server-side data fetching\r\n * - 'use client' / 'use server' directive detection\r\n * - Automatic component serialization\r\n * - Props passing between server and client\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Component rendering context\r\n */\r\nexport interface RenderContext {\r\n /** Current request */\r\n request: Request;\r\n /** Route params */\r\n params: Record<string, string>;\r\n /** Search params */\r\n searchParams: URLSearchParams;\r\n /** Request headers */\r\n headers: Headers;\r\n /** Cookies */\r\n cookies: Map<string, string>;\r\n}\r\n\r\n/**\r\n * Server component definition\r\n */\r\nexport interface ServerComponent<P = unknown> {\r\n (props: P, context: RenderContext): Promise<string> | string;\r\n /** Mark as server component */\r\n __flight_server?: true;\r\n /** Dependencies for hydration */\r\n __flight_deps?: string[];\r\n}\r\n\r\n/**\r\n * Client component definition\r\n */\r\nexport interface ClientComponent<P = unknown> {\r\n (props: P): unknown;\r\n /** Mark as client component */\r\n __flight_client?: true;\r\n /** Client bundle path */\r\n __flight_bundle?: string;\r\n}\r\n\r\n/**\r\n * Component type detection\r\n */\r\nexport type ComponentType = 'server' | 'client' | 'hybrid';\r\n\r\n// ============================================================================\r\n// Directive Detection (Build-time)\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a file has 'use client' directive\r\n */\r\nexport function hasUseClientDirective(source: string): boolean {\r\n const firstLine = source.trim().split('\\n')[0] ?? '';\r\n return /^['\"]use client['\"];?/.test(firstLine);\r\n}\r\n\r\n/**\r\n * Check if a file has 'use server' directive\r\n */\r\nexport function hasUseServerDirective(source: string): boolean {\r\n const firstLine = source.trim().split('\\n')[0] ?? '';\r\n return /^['\"]use server['\"];?/.test(firstLine);\r\n}\r\n\r\n/**\r\n * Detect component type from source\r\n */\r\nexport function detectComponentType(source: string): ComponentType {\r\n if (hasUseClientDirective(source)) return 'client';\r\n if (hasUseServerDirective(source)) return 'server';\r\n return 'hybrid';\r\n}\r\n\r\n// ============================================================================\r\n// Server Component Execution\r\n// ============================================================================\r\n\r\n/**\r\n * Execute an async server component\r\n */\r\nexport async function executeServerComponent<P>(\r\n component: ServerComponent<P>,\r\n props: P,\r\n context: RenderContext\r\n): Promise<string> {\r\n try {\r\n const result = await component(props, context);\r\n return result;\r\n } catch (error) {\r\n console.error('[Flight] Server component error:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Create a render context from a Request\r\n */\r\nexport function createRenderContext(request: Request, params: Record<string, string> = {}): RenderContext {\r\n const url = new URL(request.url);\r\n\r\n // Parse cookies\r\n const cookies = new Map<string, string>();\r\n const cookieHeader = request.headers.get('cookie') || '';\r\n cookieHeader.split(';').forEach(cookie => {\r\n const [key, value] = cookie.trim().split('=');\r\n if (key && value) cookies.set(key, value);\r\n });\r\n\r\n return {\r\n request,\r\n params,\r\n searchParams: url.searchParams,\r\n headers: request.headers,\r\n cookies,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Data Fetching Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Cache for server-side fetch requests\r\n */\r\nconst fetchCache = new Map<string, { data: unknown; timestamp: number }>();\r\n\r\n/**\r\n * Server-side fetch with automatic caching (like Next.js fetch extensions)\r\n */\r\nexport async function serverFetch<T>(\r\n url: string,\r\n options: RequestInit & {\r\n revalidate?: number | false;\r\n tags?: string[];\r\n } = {}\r\n): Promise<T> {\r\n const { revalidate = 60, tags = [], ...fetchOptions } = options;\r\n const cacheKey = `${url}:${JSON.stringify(fetchOptions)}`;\r\n\r\n // Check cache\r\n const cached = fetchCache.get(cacheKey);\r\n if (cached) {\r\n const age = Date.now() - cached.timestamp;\r\n if (revalidate === false || age < (revalidate * 1000)) {\r\n return cached.data as T;\r\n }\r\n }\r\n\r\n // Fetch fresh data\r\n const response = await fetch(url, fetchOptions);\r\n\r\n if (!response.ok) {\r\n throw new Error(`Fetch failed: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n\r\n // Cache the result\r\n if (revalidate !== false) {\r\n fetchCache.set(cacheKey, {\r\n data,\r\n timestamp: Date.now(),\r\n });\r\n }\r\n\r\n return data as T;\r\n}\r\n\r\n/**\r\n * Invalidate cache by tag\r\n */\r\nexport function revalidateTag(tag: string): void {\r\n // In a real implementation, this would invalidate cache entries by tag\r\n console.log(`[Flight] Revalidating tag: ${tag}`);\r\n}\r\n\r\n/**\r\n * Invalidate cache by path\r\n */\r\nexport function revalidatePath(path: string): void {\r\n // In a real implementation, this would invalidate cache entries by path\r\n console.log(`[Flight] Revalidating path: ${path}`);\r\n}\r\n\r\n// ============================================================================\r\n// Component Serialization (for client boundary crossing)\r\n// ============================================================================\r\n\r\n/**\r\n * Serialize props for transmission to client\r\n */\r\nexport function serializeProps(props: unknown): string {\r\n // Pre-process to handle special types before JSON.stringify\r\n function preProcess(value: unknown): unknown {\r\n if (value instanceof Date) {\r\n return { __type: 'Date', value: value.toISOString() };\r\n }\r\n if (value instanceof Map) {\r\n return { __type: 'Map', value: Array.from(value.entries()).map(([k, v]) => [preProcess(k), preProcess(v)]) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', value: Array.from(value).map(preProcess) };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', value: value.toString() };\r\n }\r\n if (typeof value === 'function') {\r\n return undefined;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map(preProcess);\r\n }\r\n if (value && typeof value === 'object') {\r\n const result: Record<string, unknown> = {};\r\n for (const [k, v] of Object.entries(value)) {\r\n result[k] = preProcess(v);\r\n }\r\n return result;\r\n }\r\n return value;\r\n }\r\n\r\n return JSON.stringify(preProcess(props));\r\n}\r\n\r\n/**\r\n * Deserialize props on client\r\n */\r\nexport function deserializeProps<T>(serialized: string): T {\r\n return JSON.parse(serialized, (_key, value) => {\r\n if (value && typeof value === 'object' && '__type' in value) {\r\n switch (value.__type) {\r\n case 'Date':\r\n return new Date(value.value);\r\n case 'Map':\r\n return new Map(value.value);\r\n case 'Set':\r\n return new Set(value.value);\r\n case 'BigInt':\r\n return BigInt(value.value);\r\n }\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Client Component Boundary\r\n// ============================================================================\r\n\r\n/**\r\n * Create a client boundary placeholder\r\n */\r\nexport function createClientBoundary(\r\n componentId: string,\r\n props: unknown,\r\n fallback?: string\r\n): string {\r\n const serializedProps = serializeProps(props);\r\n\r\n return `\r\n<!--flight-client:${componentId}-->\r\n<div data-flight-component=\"${componentId}\" data-flight-props='${serializedProps.replace(/'/g, \"'\")}'>\r\n ${fallback || '<div>Loading...</div>'}\r\n</div>\r\n<!--/flight-client-->\r\n<script type=\"module\">\r\n(async function() {\r\n const component = await import('/_flight/components/${componentId}.js');\r\n const props = JSON.parse('${serializedProps.replace(/'/g, \"\\\\'\")}');\r\n const container = document.querySelector('[data-flight-component=\"${componentId}\"]');\r\n if (container && component.default) {\r\n // Hydrate with the framework's hydration method\r\n if (typeof component.hydrate === 'function') {\r\n component.hydrate(container, props);\r\n }\r\n }\r\n})();\r\n</script>`;\r\n}\r\n\r\n// ============================================================================\r\n// Async Component Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Helper to create an async server component\r\n */\r\nexport function createAsyncComponent<P, T>(\r\n fetcher: (props: P, context: RenderContext) => Promise<T>,\r\n renderer: (data: T, props: P) => string\r\n): ServerComponent<P> {\r\n const component: ServerComponent<P> = async (props, context) => {\r\n const data = await fetcher(props, context);\r\n return renderer(data, props);\r\n };\r\n component.__flight_server = true;\r\n return component;\r\n}\r\n\r\n/**\r\n * Compose multiple server components\r\n */\r\nexport function composeComponents(\r\n ...components: Array<() => Promise<string> | string>\r\n): () => Promise<string> {\r\n return async () => {\r\n const results = await Promise.all(\r\n components.map(async (comp) => await comp())\r\n );\r\n return results.join('');\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Error Boundary for Server Components\r\n// ============================================================================\r\n\r\n/**\r\n * Wrap a server component with error handling\r\n */\r\nexport function withErrorBoundary<P>(\r\n component: ServerComponent<P>,\r\n errorFallback: (error: Error) => string\r\n): ServerComponent<P> {\r\n return async (props: P, context: RenderContext) => {\r\n try {\r\n return await component(props, context);\r\n } catch (error) {\r\n console.error('[Flight] Server component error:', error);\r\n return errorFallback(error as Error);\r\n }\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Not Found / Redirect Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Throw a not found error (like Next.js notFound())\r\n */\r\nexport function notFound(): never {\r\n const error = new Error('Not Found');\r\n (error as any).__flight_not_found = true;\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is not found\r\n */\r\nexport function isNotFoundError(error: unknown): boolean {\r\n return error instanceof Error && (error as any).__flight_not_found === true;\r\n}\r\n\r\n/**\r\n * Server-side redirect (like Next.js redirect())\r\n */\r\nexport function redirect(url: string, type: 'replace' | 'push' = 'replace'): never {\r\n const error = new Error(`Redirect: ${url}`);\r\n (error as any).__flight_redirect = { url, type };\r\n throw error;\r\n}\r\n\r\n/**\r\n * Check if error is redirect\r\n */\r\nexport function isRedirectError(error: unknown): { url: string; type: string } | null {\r\n if (error instanceof Error && (error as any).__flight_redirect) {\r\n return (error as any).__flight_redirect;\r\n }\r\n return null;\r\n}\r\n","/**\r\n * Flight Cache - Agnostic caching primitives\r\n * \r\n * Flight provides the interface, you choose the implementation.\r\n * Use in-memory, Redis, Cloudflare KV, or anything else.\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface CacheOptions {\r\n /** Time-to-live in seconds */\r\n ttl?: number;\r\n /** Cache tags for invalidation */\r\n tags?: string[];\r\n /** Stale-while-revalidate time in seconds */\r\n swr?: number;\r\n}\r\n\r\nexport interface CacheEntry<T> {\r\n /** Cached value */\r\n value: T;\r\n /** When this entry expires (timestamp) */\r\n expiresAt?: number;\r\n /** When this entry becomes stale (timestamp) */\r\n staleAt?: number;\r\n /** Cache tags for invalidation */\r\n tags?: string[];\r\n /** When this entry was created */\r\n createdAt: number;\r\n}\r\n\r\nexport interface Cache {\r\n /** Get a value from cache */\r\n get<T>(key: string): Promise<T | undefined>;\r\n\r\n /** Set a value in cache */\r\n set<T>(key: string, value: T, options?: CacheOptions): Promise<void>;\r\n\r\n /** Delete a value from cache */\r\n delete(key: string): Promise<boolean>;\r\n\r\n /** Check if a key exists */\r\n has(key: string): Promise<boolean>;\r\n\r\n /** Clear all cache entries */\r\n clear(): Promise<void>;\r\n\r\n /** Invalidate entries by tag */\r\n invalidateTag(tag: string): Promise<void>;\r\n\r\n /** Get or set with a factory function */\r\n getOrSet<T>(\r\n key: string,\r\n factory: () => Promise<T>,\r\n options?: CacheOptions\r\n ): Promise<T>;\r\n}\r\n\r\n/** Adapter interface for external cache providers */\r\nexport interface CacheAdapter {\r\n name: string;\r\n get<T>(key: string): Promise<CacheEntry<T> | undefined>;\r\n set<T>(key: string, entry: CacheEntry<T>): Promise<void>;\r\n delete(key: string): Promise<boolean>;\r\n has(key: string): Promise<boolean>;\r\n clear(): Promise<void>;\r\n keys?(pattern?: string): Promise<string[]>;\r\n}\r\n\r\n// ============================================================================\r\n// In-Memory Cache Implementation (Default)\r\n// ============================================================================\r\n\r\nclass MemoryCacheAdapter implements CacheAdapter {\r\n name = 'memory';\r\n private store = new Map<string, CacheEntry<unknown>>();\r\n\r\n async get<T>(key: string): Promise<CacheEntry<T> | undefined> {\r\n const entry = this.store.get(key) as CacheEntry<T> | undefined;\r\n if (!entry) return undefined;\r\n\r\n // Check if expired\r\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\r\n this.store.delete(key);\r\n return undefined;\r\n }\r\n\r\n return entry;\r\n }\r\n\r\n async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\r\n this.store.set(key, entry as CacheEntry<unknown>);\r\n }\r\n\r\n async delete(key: string): Promise<boolean> {\r\n return this.store.delete(key);\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n const entry = await this.get(key);\r\n return entry !== undefined;\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.store.clear();\r\n }\r\n\r\n async keys(pattern?: string): Promise<string[]> {\r\n const allKeys = Array.from(this.store.keys());\r\n if (!pattern) return allKeys;\r\n\r\n const regex = new RegExp(pattern.replace(/\\*/g, '.*'));\r\n return allKeys.filter(key => regex.test(key));\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Cache Factory\r\n// ============================================================================\r\n\r\nexport interface CreateCacheOptions {\r\n /** Custom cache adapter (defaults to in-memory) */\r\n adapter?: CacheAdapter;\r\n /** Default TTL for all entries */\r\n defaultTTL?: number;\r\n /** Key prefix for namespacing */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * Create a new cache instance\r\n */\r\nexport function createCache(options: CreateCacheOptions = {}): Cache {\r\n const {\r\n adapter = new MemoryCacheAdapter(),\r\n defaultTTL,\r\n prefix = ''\r\n } = options;\r\n\r\n const tagIndex = new Map<string, Set<string>>();\r\n\r\n function prefixKey(key: string): string {\r\n return prefix ? `${prefix}:${key}` : key;\r\n }\r\n\r\n return {\r\n async get<T>(key: string): Promise<T | undefined> {\r\n const entry = await adapter.get<T>(prefixKey(key));\r\n if (!entry) return undefined;\r\n\r\n // Check stale-while-revalidate\r\n if (entry.staleAt && Date.now() > entry.staleAt) {\r\n // Return stale value (caller should revalidate)\r\n return entry.value;\r\n }\r\n\r\n return entry.value;\r\n },\r\n\r\n async set<T>(key: string, value: T, opts?: CacheOptions): Promise<void> {\r\n const ttl = opts?.ttl ?? defaultTTL;\r\n const now = Date.now();\r\n\r\n const entry: CacheEntry<T> = {\r\n value,\r\n createdAt: now,\r\n tags: opts?.tags,\r\n };\r\n\r\n if (ttl) {\r\n entry.expiresAt = now + (ttl * 1000);\r\n if (opts?.swr) {\r\n entry.staleAt = now + ((ttl - opts.swr) * 1000);\r\n }\r\n }\r\n\r\n const fullKey = prefixKey(key);\r\n await adapter.set(fullKey, entry);\r\n\r\n // Update tag index\r\n if (opts?.tags) {\r\n for (const tag of opts.tags) {\r\n if (!tagIndex.has(tag)) {\r\n tagIndex.set(tag, new Set());\r\n }\r\n tagIndex.get(tag)!.add(fullKey);\r\n }\r\n }\r\n },\r\n\r\n async delete(key: string): Promise<boolean> {\r\n return adapter.delete(prefixKey(key));\r\n },\r\n\r\n async has(key: string): Promise<boolean> {\r\n return adapter.has(prefixKey(key));\r\n },\r\n\r\n async clear(): Promise<void> {\r\n await adapter.clear();\r\n tagIndex.clear();\r\n },\r\n\r\n async invalidateTag(tag: string): Promise<void> {\r\n const keys = tagIndex.get(tag);\r\n if (!keys) return;\r\n\r\n for (const key of keys) {\r\n await adapter.delete(key);\r\n }\r\n tagIndex.delete(tag);\r\n },\r\n\r\n async getOrSet<T>(\r\n key: string,\r\n factory: () => Promise<T>,\r\n opts?: CacheOptions\r\n ): Promise<T> {\r\n const cached = await this.get<T>(key);\r\n if (cached !== undefined) {\r\n return cached;\r\n }\r\n\r\n const value = await factory();\r\n await this.set(key, value, opts);\r\n return value;\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Cache Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Create a cache key from multiple parts\r\n */\r\nexport function cacheKey(...parts: (string | number | boolean | undefined)[]): string {\r\n return parts\r\n .filter(p => p !== undefined)\r\n .map(p => String(p))\r\n .join(':');\r\n}\r\n\r\n/**\r\n * Wrap a function with caching\r\n */\r\nexport function cached<T extends (...args: unknown[]) => Promise<unknown>>(\r\n cache: Cache,\r\n fn: T,\r\n options?: CacheOptions & { keyFn?: (...args: Parameters<T>) => string }\r\n): T {\r\n const { keyFn = (...args: unknown[]) => JSON.stringify(args), ...cacheOpts } = options ?? {};\r\n\r\n return (async (...args: Parameters<T>) => {\r\n const key = keyFn(...args);\r\n return cache.getOrSet(key, () => fn(...args) as Promise<unknown>, cacheOpts);\r\n }) as T;\r\n}\r\n","const NODE_TYPES = {\n NORMAL: 0,\n WILDCARD: 1,\n PLACEHOLDER: 2\n};\n\nfunction createRouter(options = {}) {\n const ctx = {\n options,\n rootNode: createRadixNode(),\n staticRoutesMap: {}\n };\n const normalizeTrailingSlash = (p) => options.strictTrailingSlash ? p : p.replace(/\\/$/, \"\") || \"/\";\n if (options.routes) {\n for (const path in options.routes) {\n insert(ctx, normalizeTrailingSlash(path), options.routes[path]);\n }\n }\n return {\n ctx,\n lookup: (path) => lookup(ctx, normalizeTrailingSlash(path)),\n insert: (path, data) => insert(ctx, normalizeTrailingSlash(path), data),\n remove: (path) => remove(ctx, normalizeTrailingSlash(path))\n };\n}\nfunction lookup(ctx, path) {\n const staticPathNode = ctx.staticRoutesMap[path];\n if (staticPathNode) {\n return staticPathNode.data;\n }\n const sections = path.split(\"/\");\n const params = {};\n let paramsFound = false;\n let wildcardNode = null;\n let node = ctx.rootNode;\n let wildCardParam = null;\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i];\n if (node.wildcardChildNode !== null) {\n wildcardNode = node.wildcardChildNode;\n wildCardParam = sections.slice(i).join(\"/\");\n }\n const nextNode = node.children.get(section);\n if (nextNode === void 0) {\n if (node && node.placeholderChildren.length > 1) {\n const remaining = sections.length - i;\n node = node.placeholderChildren.find((c) => c.maxDepth === remaining) || null;\n } else {\n node = node.placeholderChildren[0] || null;\n }\n if (!node) {\n break;\n }\n if (node.paramName) {\n params[node.paramName] = section;\n }\n paramsFound = true;\n } else {\n node = nextNode;\n }\n }\n if ((node === null || node.data === null) && wildcardNode !== null) {\n node = wildcardNode;\n params[node.paramName || \"_\"] = wildCardParam;\n paramsFound = true;\n }\n if (!node) {\n return null;\n }\n if (paramsFound) {\n return {\n ...node.data,\n params: paramsFound ? params : void 0\n };\n }\n return node.data;\n}\nfunction insert(ctx, path, data) {\n let isStaticRoute = true;\n const sections = path.split(\"/\");\n let node = ctx.rootNode;\n let _unnamedPlaceholderCtr = 0;\n const matchedNodes = [node];\n for (const section of sections) {\n let childNode;\n if (childNode = node.children.get(section)) {\n node = childNode;\n } else {\n const type = getNodeType(section);\n childNode = createRadixNode({ type, parent: node });\n node.children.set(section, childNode);\n if (type === NODE_TYPES.PLACEHOLDER) {\n childNode.paramName = section === \"*\" ? `_${_unnamedPlaceholderCtr++}` : section.slice(1);\n node.placeholderChildren.push(childNode);\n isStaticRoute = false;\n } else if (type === NODE_TYPES.WILDCARD) {\n node.wildcardChildNode = childNode;\n childNode.paramName = section.slice(\n 3\n /* \"**:\" */\n ) || \"_\";\n isStaticRoute = false;\n }\n matchedNodes.push(childNode);\n node = childNode;\n }\n }\n for (const [depth, node2] of matchedNodes.entries()) {\n node2.maxDepth = Math.max(matchedNodes.length - depth, node2.maxDepth || 0);\n }\n node.data = data;\n if (isStaticRoute === true) {\n ctx.staticRoutesMap[path] = node;\n }\n return node;\n}\nfunction remove(ctx, path) {\n let success = false;\n const sections = path.split(\"/\");\n let node = ctx.rootNode;\n for (const section of sections) {\n node = node.children.get(section);\n if (!node) {\n return success;\n }\n }\n if (node.data) {\n const lastSection = sections.at(-1) || \"\";\n node.data = null;\n if (Object.keys(node.children).length === 0 && node.parent) {\n node.parent.children.delete(lastSection);\n node.parent.wildcardChildNode = null;\n node.parent.placeholderChildren = [];\n }\n success = true;\n }\n return success;\n}\nfunction createRadixNode(options = {}) {\n return {\n type: options.type || NODE_TYPES.NORMAL,\n maxDepth: 0,\n parent: options.parent || null,\n children: /* @__PURE__ */ new Map(),\n data: options.data || null,\n paramName: options.paramName || null,\n wildcardChildNode: null,\n placeholderChildren: []\n };\n}\nfunction getNodeType(str) {\n if (str.startsWith(\"**\")) {\n return NODE_TYPES.WILDCARD;\n }\n if (str[0] === \":\" || str === \"*\") {\n return NODE_TYPES.PLACEHOLDER;\n }\n return NODE_TYPES.NORMAL;\n}\n\nfunction toRouteMatcher(router) {\n const table = _routerNodeToTable(\"\", router.ctx.rootNode);\n return _createMatcher(table, router.ctx.options.strictTrailingSlash);\n}\nfunction _createMatcher(table, strictTrailingSlash) {\n return {\n ctx: { table },\n matchAll: (path) => _matchRoutes(path, table, strictTrailingSlash)\n };\n}\nfunction _createRouteTable() {\n return {\n static: /* @__PURE__ */ new Map(),\n wildcard: /* @__PURE__ */ new Map(),\n dynamic: /* @__PURE__ */ new Map()\n };\n}\nfunction _exportMatcherFromTable(table) {\n const obj = /* @__PURE__ */ Object.create(null);\n for (const property in table) {\n obj[property] = property === \"dynamic\" ? Object.fromEntries(\n [...table[property].entries()].map(([key, value]) => [\n key,\n _exportMatcherFromTable(value)\n ])\n ) : Object.fromEntries(table[property].entries());\n }\n return obj;\n}\nfunction exportMatcher(matcher) {\n return _exportMatcherFromTable(matcher.ctx.table);\n}\nfunction _createTableFromExport(matcherExport) {\n const table = {};\n for (const property in matcherExport) {\n table[property] = property === \"dynamic\" ? new Map(\n Object.entries(matcherExport[property]).map(([key, value]) => [\n key,\n _createTableFromExport(value)\n ])\n ) : new Map(\n Object.entries(matcherExport[property])\n );\n }\n return table;\n}\nfunction createMatcherFromExport(matcherExport) {\n return _createMatcher(_createTableFromExport(matcherExport));\n}\nfunction _matchRoutes(path, table, strictTrailingSlash) {\n if (strictTrailingSlash !== true && path.endsWith(\"/\")) {\n path = path.slice(0, -1) || \"/\";\n }\n const matches = [];\n for (const [key, value] of _sortRoutesMap(table.wildcard)) {\n if (path === key || path.startsWith(key + \"/\")) {\n matches.push(value);\n }\n }\n for (const [key, value] of _sortRoutesMap(table.dynamic)) {\n if (path.startsWith(key + \"/\")) {\n const subPath = \"/\" + path.slice(key.length).split(\"/\").splice(2).join(\"/\");\n matches.push(..._matchRoutes(subPath, value));\n }\n }\n const staticMatch = table.static.get(path);\n if (staticMatch) {\n matches.push(staticMatch);\n }\n return matches.filter(Boolean);\n}\nfunction _sortRoutesMap(m) {\n return [...m.entries()].sort((a, b) => a[0].length - b[0].length);\n}\nfunction _routerNodeToTable(initialPath, initialNode) {\n const table = _createRouteTable();\n function _addNode(path, node) {\n if (path) {\n if (node.type === NODE_TYPES.NORMAL && !(path.includes(\"*\") || path.includes(\":\"))) {\n if (node.data) {\n table.static.set(path, node.data);\n }\n } else if (node.type === NODE_TYPES.WILDCARD) {\n table.wildcard.set(path.replace(\"/**\", \"\"), node.data);\n } else if (node.type === NODE_TYPES.PLACEHOLDER) {\n const subTable = _routerNodeToTable(\"\", node);\n if (node.data) {\n subTable.static.set(\"/\", node.data);\n }\n table.dynamic.set(path.replace(/\\/\\*|\\/:\\w+/, \"\"), subTable);\n return;\n }\n }\n for (const [childPath, child] of node.children.entries()) {\n _addNode(`${path}/${childPath}`.replace(\"//\", \"/\"), child);\n }\n }\n _addNode(initialPath, initialNode);\n return table;\n}\n\nexport { NODE_TYPES, createMatcherFromExport, createRouter, exportMatcher, toRouteMatcher };\n","/**\r\n * Flight Router - File-based routing with dynamic patterns\r\n */\r\n\r\nimport { createRouter as createRadixRouter, type RadixRouter } from 'radix3';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface RouteParams {\r\n [key: string]: string | string[];\r\n}\r\n\r\nexport interface Route<T = unknown> {\r\n /** Route path pattern (e.g., '/blog/[slug]', '/api/[...path]') */\r\n path: string;\r\n /** Handler or component for this route */\r\n handler: T;\r\n /** Rendering mode for this route */\r\n mode?: 'ssr' | 'ssg' | 'csr' | 'isr';\r\n /** Metadata for the route */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\nexport interface RouteMatch<T = unknown> {\r\n /** The matched route */\r\n route: Route<T>;\r\n /** Extracted parameters from the URL */\r\n params: RouteParams;\r\n /** The original path that was matched */\r\n path: string;\r\n}\r\n\r\nexport interface Router<T = unknown> {\r\n /** Add a route to the router */\r\n add(route: Route<T>): void;\r\n /** Add multiple routes */\r\n addAll(routes: Route<T>[]): void;\r\n /** Match a path against registered routes */\r\n match(path: string): RouteMatch<T> | null;\r\n /** Get all registered routes */\r\n routes(): Route<T>[];\r\n /** Remove a route by path */\r\n remove(path: string): boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Implementation\r\n// ============================================================================\r\n\r\n/**\r\n * Convert Flight route pattern to radix3 pattern\r\n * Flight: /blog/[slug] -> radix3: /blog/:slug\r\n * Flight: /api/[...path] -> radix3: /api/**:path\r\n */\r\nfunction convertPattern(pattern: string): string {\r\n return pattern\r\n // Convert catch-all [...param] to **:param\r\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '**:$1')\r\n // Convert dynamic [param] to :param\r\n .replace(/\\[(\\w+)\\]/g, ':$1');\r\n}\r\n\r\n/**\r\n * Create a new Flight router instance\r\n */\r\nexport function createRouter<T = unknown>(): Router<T> {\r\n const radix: RadixRouter<Route<T>> = createRadixRouter();\r\n const routeMap = new Map<string, Route<T>>();\r\n\r\n return {\r\n add(route: Route<T>): void {\r\n const radixPath = convertPattern(route.path);\r\n radix.insert(radixPath, route);\r\n routeMap.set(route.path, route);\r\n },\r\n\r\n addAll(routes: Route<T>[]): void {\r\n for (const route of routes) {\r\n this.add(route);\r\n }\r\n },\r\n\r\n match(path: string): RouteMatch<T> | null {\r\n const result = radix.lookup(path);\r\n\r\n if (!result) {\r\n return null;\r\n }\r\n\r\n // Extract params from radix3 result\r\n const params: RouteParams = {};\r\n if (result.params) {\r\n for (const [key, value] of Object.entries(result.params)) {\r\n if (value !== undefined) {\r\n params[key] = value as string | string[];\r\n }\r\n }\r\n }\r\n\r\n return {\r\n route: result,\r\n params,\r\n path,\r\n };\r\n },\r\n\r\n routes(): Route<T>[] {\r\n return Array.from(routeMap.values());\r\n },\r\n\r\n remove(path: string): boolean {\r\n if (routeMap.has(path)) {\r\n const radixPath = convertPattern(path);\r\n radix.remove(radixPath);\r\n routeMap.delete(path);\r\n return true;\r\n }\r\n return false;\r\n },\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// File System Router Utilities\r\n// ============================================================================\r\n\r\nexport interface FileRoute {\r\n /** File path relative to routes directory */\r\n filePath: string;\r\n /** Generated route path */\r\n routePath: string;\r\n}\r\n\r\n/**\r\n * Convert a file path to a route path\r\n * \r\n * Examples:\r\n * - index.tsx -> /\r\n * - about.tsx -> /about\r\n * - blog/index.tsx -> /blog\r\n * - blog/[slug].tsx -> /blog/[slug]\r\n * - api/[...path].ts -> /api/[...path]\r\n * - (group)/settings.tsx -> /settings (groups are ignored)\r\n */\r\nexport function filePathToRoutePath(filePath: string): string {\r\n let routePath = filePath\r\n // Remove file extension\r\n .replace(/\\.(tsx?|jsx?|vue|svelte|astro)$/, '')\r\n // Remove index files\r\n .replace(/\\/index$/, '')\r\n .replace(/^index$/, '')\r\n // Remove route groups (parentheses)\r\n .replace(/\\([^)]+\\)\\//g, '')\r\n .replace(/\\/\\([^)]+\\)/g, '');\r\n\r\n // Ensure path starts with /\r\n if (!routePath.startsWith('/')) {\r\n routePath = '/' + routePath;\r\n }\r\n\r\n // Handle root\r\n if (routePath === '/') {\r\n return '/';\r\n }\r\n\r\n // Remove trailing slash\r\n return routePath.replace(/\\/$/, '');\r\n}\r\n\r\n/**\r\n * Sort routes by specificity (most specific first)\r\n * Static routes come before dynamic routes\r\n */\r\nexport function sortRoutes<T>(routes: Route<T>[]): Route<T>[] {\r\n return [...routes].sort((a, b) => {\r\n const aSegments = a.path.split('/');\r\n const bSegments = b.path.split('/');\r\n\r\n // Count dynamic segments\r\n const aDynamic = aSegments.filter(s => s.startsWith('[') || s.startsWith(':')).length;\r\n const bDynamic = bSegments.filter(s => s.startsWith('[') || s.startsWith(':')).length;\r\n\r\n // More segments = more specific\r\n if (aSegments.length !== bSegments.length) {\r\n return bSegments.length - aSegments.length;\r\n }\r\n\r\n // Fewer dynamic segments = more specific\r\n if (aDynamic !== bDynamic) {\r\n return aDynamic - bDynamic;\r\n }\r\n\r\n // Catch-all routes are less specific\r\n const aCatchAll = a.path.includes('[...');\r\n const bCatchAll = b.path.includes('[...');\r\n if (aCatchAll !== bCatchAll) {\r\n return aCatchAll ? 1 : -1;\r\n }\r\n\r\n // Alphabetical for consistency\r\n return a.path.localeCompare(b.path);\r\n });\r\n}\r\n","/**\r\n * Flight Middleware - Composable request/response handlers\r\n * \r\n * Framework-agnostic middleware system inspired by Koa/Hono.\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** Request context passed through middleware chain */\r\nexport interface MiddlewareContext {\r\n /** Request URL */\r\n url: URL;\r\n /** Request method */\r\n method: string;\r\n /** Request headers */\r\n headers: Headers;\r\n /** URL parameters from routing */\r\n params: Record<string, string | string[]>;\r\n /** Query parameters */\r\n query: URLSearchParams;\r\n /** Parsed request body (if any) */\r\n body?: unknown;\r\n /** Local data shared between middleware */\r\n locals: Record<string, unknown>;\r\n /** Original request (platform-specific) */\r\n request?: Request;\r\n\r\n // Response building\r\n /** Response status code */\r\n status: number;\r\n /** Response headers */\r\n responseHeaders: Headers;\r\n /** Response body */\r\n responseBody?: BodyInit | null;\r\n}\r\n\r\n/** Next function to call the next middleware */\r\nexport type MiddlewareNext = () => Promise<void>;\r\n\r\n/** Middleware function signature */\r\nexport type Middleware = (\r\n ctx: MiddlewareContext,\r\n next: MiddlewareNext\r\n) => Promise<void> | void;\r\n\r\n/** Middleware with optional path matching */\r\nexport interface MiddlewareDefinition {\r\n /** Path pattern to match (undefined = match all) */\r\n path?: string | RegExp;\r\n /** HTTP methods to match (undefined = match all) */\r\n methods?: string[];\r\n /** The middleware function */\r\n handler: Middleware;\r\n}\r\n\r\n// ============================================================================\r\n// Middleware Chain\r\n// ============================================================================\r\n\r\nexport interface MiddlewareChain {\r\n /** Add middleware to the chain */\r\n use(middleware: Middleware): MiddlewareChain;\r\n use(path: string, middleware: Middleware): MiddlewareChain;\r\n use(definition: MiddlewareDefinition): MiddlewareChain;\r\n\r\n /** Execute the middleware chain */\r\n execute(ctx: MiddlewareContext): Promise<void>;\r\n\r\n /** Get all middleware definitions */\r\n middlewares(): MiddlewareDefinition[];\r\n}\r\n\r\n/**\r\n * Create a new middleware chain\r\n */\r\nexport function createMiddlewareChain(): MiddlewareChain {\r\n const stack: MiddlewareDefinition[] = [];\r\n\r\n function use(\r\n pathOrMiddleware: string | Middleware | MiddlewareDefinition,\r\n maybeMiddleware?: Middleware\r\n ): MiddlewareChain {\r\n if (typeof pathOrMiddleware === 'function') {\r\n // use(middleware)\r\n stack.push({ handler: pathOrMiddleware });\r\n } else if (typeof pathOrMiddleware === 'string' && maybeMiddleware) {\r\n // use(path, middleware)\r\n stack.push({ path: pathOrMiddleware, handler: maybeMiddleware });\r\n } else if (typeof pathOrMiddleware === 'object') {\r\n // use(definition)\r\n stack.push(pathOrMiddleware);\r\n }\r\n return chain;\r\n }\r\n\r\n async function execute(ctx: MiddlewareContext): Promise<void> {\r\n let index = -1;\r\n\r\n async function dispatch(i: number): Promise<void> {\r\n if (i <= index) {\r\n throw new Error('next() called multiple times');\r\n }\r\n index = i;\r\n\r\n if (i >= stack.length) {\r\n return;\r\n }\r\n\r\n const definition = stack[i];\r\n if (!definition) {\r\n return dispatch(i + 1);\r\n }\r\n\r\n // Check if middleware should run\r\n if (!shouldRun(definition, ctx)) {\r\n return dispatch(i + 1);\r\n }\r\n\r\n await definition.handler(ctx, () => dispatch(i + 1));\r\n }\r\n\r\n await dispatch(0);\r\n }\r\n\r\n const chain: MiddlewareChain = {\r\n use: use as MiddlewareChain['use'],\r\n execute,\r\n middlewares: () => [...stack],\r\n };\r\n\r\n return chain;\r\n}\r\n\r\n/**\r\n * Check if a middleware should run for the given context\r\n */\r\nfunction shouldRun(def: MiddlewareDefinition, ctx: MiddlewareContext): boolean {\r\n // Check method\r\n if (def.methods && !def.methods.includes(ctx.method.toUpperCase())) {\r\n return false;\r\n }\r\n\r\n // Check path\r\n if (def.path) {\r\n const path = ctx.url.pathname;\r\n\r\n if (typeof def.path === 'string') {\r\n // Simple path matching (supports wildcards)\r\n if (def.path.endsWith('*')) {\r\n const prefix = def.path.slice(0, -1);\r\n if (!path.startsWith(prefix)) {\r\n return false;\r\n }\r\n } else if (def.path !== path) {\r\n return false;\r\n }\r\n } else if (def.path instanceof RegExp) {\r\n if (!def.path.test(path)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// ============================================================================\r\n// Built-in Middleware Factories\r\n// ============================================================================\r\n\r\n/**\r\n * CORS middleware factory\r\n */\r\nexport function cors(options: {\r\n origin?: string | string[] | ((origin: string) => boolean);\r\n methods?: string[];\r\n headers?: string[];\r\n credentials?: boolean;\r\n maxAge?: number;\r\n} = {}): Middleware {\r\n const {\r\n origin = '*',\r\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\r\n headers = ['Content-Type', 'Authorization'],\r\n credentials = false,\r\n maxAge = 86400,\r\n } = options;\r\n\r\n return async (ctx, next) => {\r\n const requestOrigin = ctx.headers.get('Origin') || '';\r\n\r\n // Determine allowed origin\r\n let allowedOrigin: string | null = null;\r\n if (origin === '*') {\r\n allowedOrigin = '*';\r\n } else if (typeof origin === 'string') {\r\n allowedOrigin = origin;\r\n } else if (Array.isArray(origin)) {\r\n if (origin.includes(requestOrigin)) {\r\n allowedOrigin = requestOrigin;\r\n }\r\n } else if (typeof origin === 'function') {\r\n if (origin(requestOrigin)) {\r\n allowedOrigin = requestOrigin;\r\n }\r\n }\r\n\r\n if (allowedOrigin) {\r\n ctx.responseHeaders.set('Access-Control-Allow-Origin', allowedOrigin);\r\n ctx.responseHeaders.set('Access-Control-Allow-Methods', methods.join(', '));\r\n ctx.responseHeaders.set('Access-Control-Allow-Headers', headers.join(', '));\r\n\r\n if (credentials) {\r\n ctx.responseHeaders.set('Access-Control-Allow-Credentials', 'true');\r\n }\r\n\r\n if (maxAge) {\r\n ctx.responseHeaders.set('Access-Control-Max-Age', String(maxAge));\r\n }\r\n }\r\n\r\n // Handle preflight\r\n if (ctx.method === 'OPTIONS') {\r\n ctx.status = 204;\r\n ctx.responseBody = null;\r\n return;\r\n }\r\n\r\n await next();\r\n };\r\n}\r\n// ============================================================================\r\n// Logger Types and Constants\r\n// ============================================================================\r\n\r\n/** Log levels in order of verbosity */\r\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\r\n\r\n/** Log format types */\r\nexport type LogFormat = 'pretty' | 'json' | 'combined' | 'common' | 'short' | 'tiny';\r\n\r\n/** Log entry structure for JSON format */\r\nexport interface LogEntry {\r\n timestamp: string;\r\n level: LogLevel;\r\n method: string;\r\n path: string;\r\n status: number;\r\n duration: number;\r\n userAgent?: string;\r\n ip?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\n/** Custom log writer function */\r\nexport type LogWriter = (entry: LogEntry, formatted: string) => void;\r\n\r\n/** Logger options */\r\nexport interface LoggerOptions {\r\n /** Minimum log level (default: 'info') */\r\n level?: LogLevel;\r\n /** Output format (default: 'pretty') */\r\n format?: LogFormat;\r\n /** Skip logging for certain requests */\r\n skip?: (ctx: MiddlewareContext) => boolean;\r\n /** Custom log writer (replaces console output) */\r\n writer?: LogWriter;\r\n /** Include request headers in logs */\r\n includeHeaders?: boolean;\r\n /** Colorize output (only for 'pretty' format, default: true) */\r\n colorize?: boolean;\r\n}\r\n\r\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n silent: 4,\r\n};\r\n\r\nconst LOG_LEVEL_COLORS: Record<LogLevel, string> = {\r\n debug: '\\x1b[36m', // Cyan\r\n info: '\\x1b[32m', // Green\r\n warn: '\\x1b[33m', // Yellow\r\n error: '\\x1b[31m', // Red\r\n silent: '',\r\n};\r\n\r\nconst STATUS_COLORS: Record<string, string> = {\r\n '2': '\\x1b[32m', // Green for 2xx\r\n '3': '\\x1b[36m', // Cyan for 3xx\r\n '4': '\\x1b[33m', // Yellow for 4xx\r\n '5': '\\x1b[31m', // Red for 5xx\r\n};\r\n\r\nconst RESET = '\\x1b[0m';\r\nconst DIM = '\\x1b[2m';\r\n\r\n/**\r\n * Professional logger middleware with configurable levels\r\n * \r\n * @example\r\n * ```typescript\r\n * // Basic usage\r\n * server.use(logger());\r\n * \r\n * // With level control\r\n * server.use(logger({ level: 'warn' })); // Only warn and error\r\n * \r\n * // JSON format for production/observability\r\n * server.use(logger({ format: 'json', level: 'info' }));\r\n * \r\n * // Custom writer (e.g., for external logging service)\r\n * server.use(logger({\r\n * writer: (entry) => myLoggingService.log(entry)\r\n * }));\r\n * \r\n * // Silent in production\r\n * server.use(logger({ level: process.env.NODE_ENV === 'production' ? 'error' : 'debug' }));\r\n * ```\r\n */\r\nexport function logger(options: LoggerOptions = {}): Middleware {\r\n const {\r\n level = 'info',\r\n format = 'pretty',\r\n skip,\r\n writer,\r\n includeHeaders = false,\r\n colorize = true,\r\n } = options;\r\n\r\n return async (ctx, next) => {\r\n // Skip if configured\r\n if (skip?.(ctx)) {\r\n return next();\r\n }\r\n\r\n const start = Date.now();\r\n const startTime = new Date().toISOString();\r\n\r\n await next();\r\n\r\n const duration = Date.now() - start;\r\n const status = ctx.status;\r\n\r\n // Determine log level based on status\r\n let logLevel: LogLevel = 'info';\r\n if (status >= 500) {\r\n logLevel = 'error';\r\n } else if (status >= 400) {\r\n logLevel = 'warn';\r\n } else if (status >= 300) {\r\n logLevel = 'info';\r\n } else {\r\n logLevel = 'debug';\r\n }\r\n\r\n // Check if we should log based on level\r\n if (LOG_LEVEL_PRIORITY[logLevel] < LOG_LEVEL_PRIORITY[level]) {\r\n return;\r\n }\r\n\r\n // Build log entry\r\n const entry: LogEntry = {\r\n timestamp: startTime,\r\n level: logLevel,\r\n method: ctx.method,\r\n path: ctx.url.pathname,\r\n status,\r\n duration,\r\n };\r\n\r\n // Add optional fields\r\n const userAgent = ctx.headers.get('user-agent');\r\n if (userAgent) entry.userAgent = userAgent;\r\n\r\n const forwardedFor = ctx.headers.get('x-forwarded-for');\r\n const ip = forwardedFor || 'unknown';\r\n entry.ip = ip;\r\n\r\n if (includeHeaders) {\r\n const headers: Record<string, string> = {};\r\n ctx.headers.forEach((value, key) => {\r\n if (!key.toLowerCase().includes('authorization')) {\r\n headers[key] = value;\r\n }\r\n });\r\n entry.headers = headers;\r\n }\r\n\r\n // Format the log line\r\n let formatted: string;\r\n\r\n switch (format) {\r\n case 'json':\r\n formatted = JSON.stringify(entry);\r\n break;\r\n\r\n case 'combined':\r\n formatted = `${ip} - - [${startTime}] \"${ctx.method} ${ctx.url.pathname}\" ${status} - \"${userAgent || '-'}\"`;\r\n break;\r\n\r\n case 'common':\r\n formatted = `${ip} - - [${startTime}] \"${ctx.method} ${ctx.url.pathname}\" ${status}`;\r\n break;\r\n\r\n case 'short':\r\n formatted = `${ctx.method} ${ctx.url.pathname} ${status} ${duration}ms`;\r\n break;\r\n\r\n case 'tiny':\r\n formatted = `${ctx.method} ${ctx.url.pathname} ${status}`;\r\n break;\r\n\r\n case 'pretty':\r\n default:\r\n if (colorize) {\r\n const statusFirstChar = String(status).charAt(0) || '2';\r\n const statusColor = STATUS_COLORS[statusFirstChar] ?? '';\r\n const levelColor = LOG_LEVEL_COLORS[logLevel];\r\n formatted = `${DIM}${startTime}${RESET} ${levelColor}${logLevel.toUpperCase().padEnd(5)}${RESET} ${ctx.method.padEnd(7)} ${ctx.url.pathname} ${statusColor}${status}${RESET} ${DIM}${duration}ms${RESET}`;\r\n } else {\r\n formatted = `${startTime} ${logLevel.toUpperCase().padEnd(5)} ${ctx.method.padEnd(7)} ${ctx.url.pathname} ${status} ${duration}ms`;\r\n }\r\n break;\r\n }\r\n\r\n // Output\r\n if (writer) {\r\n writer(entry, formatted);\r\n } else {\r\n switch (logLevel) {\r\n case 'error':\r\n console.error(formatted);\r\n break;\r\n case 'warn':\r\n console.warn(formatted);\r\n break;\r\n case 'debug':\r\n console.debug(formatted);\r\n break;\r\n default:\r\n console.log(formatted);\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Security headers middleware\r\n */\r\nexport function securityHeaders(options: {\r\n contentSecurityPolicy?: string | false;\r\n xFrameOptions?: 'DENY' | 'SAMEORIGIN' | false;\r\n xContentTypeOptions?: boolean;\r\n referrerPolicy?: string;\r\n permissionsPolicy?: string;\r\n} = {}): Middleware {\r\n const {\r\n contentSecurityPolicy = \"default-src 'self'\",\r\n xFrameOptions = 'DENY',\r\n xContentTypeOptions = true,\r\n referrerPolicy = 'strict-origin-when-cross-origin',\r\n permissionsPolicy,\r\n } = options;\r\n\r\n return async (ctx, next) => {\r\n if (contentSecurityPolicy) {\r\n ctx.responseHeaders.set('Content-Security-Policy', contentSecurityPolicy);\r\n }\r\n if (xFrameOptions) {\r\n ctx.responseHeaders.set('X-Frame-Options', xFrameOptions);\r\n }\r\n if (xContentTypeOptions) {\r\n ctx.responseHeaders.set('X-Content-Type-Options', 'nosniff');\r\n }\r\n if (referrerPolicy) {\r\n ctx.responseHeaders.set('Referrer-Policy', referrerPolicy);\r\n }\r\n if (permissionsPolicy) {\r\n ctx.responseHeaders.set('Permissions-Policy', permissionsPolicy);\r\n }\r\n\r\n await next();\r\n };\r\n}\r\n\r\n/**\r\n * Compression middleware (requires implementation in adapter)\r\n */\r\nexport function compress(): Middleware {\r\n return async (ctx, next) => {\r\n // Mark that compression is desired\r\n ctx.locals['flight:compress'] = true;\r\n await next();\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a middleware context from a Web Request\r\n */\r\nexport function createContextFromRequest(\r\n request: Request,\r\n params: Record<string, string | string[]> = {}\r\n): MiddlewareContext {\r\n const url = new URL(request.url);\r\n\r\n return {\r\n url,\r\n method: request.method,\r\n headers: request.headers,\r\n params,\r\n query: url.searchParams,\r\n locals: {},\r\n request,\r\n status: 200,\r\n responseHeaders: new Headers(),\r\n };\r\n}\r\n\r\n/**\r\n * Create a Web Response from middleware context\r\n */\r\nexport function createResponseFromContext(ctx: MiddlewareContext): Response {\r\n return new Response(ctx.responseBody, {\r\n status: ctx.status,\r\n headers: ctx.responseHeaders,\r\n });\r\n}\r\n\r\n/**\r\n * Compose multiple middleware into one\r\n */\r\nexport function compose(...middlewares: Middleware[]): Middleware {\r\n return async (ctx, next) => {\r\n let index = -1;\r\n\r\n async function dispatch(i: number): Promise<void> {\r\n if (i <= index) {\r\n throw new Error('next() called multiple times');\r\n }\r\n index = i;\r\n\r\n const fn = i === middlewares.length ? next : middlewares[i];\r\n\r\n if (fn) {\r\n await fn(ctx, () => dispatch(i + 1));\r\n }\r\n }\r\n\r\n await dispatch(0);\r\n };\r\n}\r\n","/**\r\n * Flight Server - Main server factory\r\n * \r\n * Creates a Flight server instance that handles routing, middleware, and rendering.\r\n * This is the primary entry point for Flight applications.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight/core';\r\n * \r\n * const server = createServer();\r\n * \r\n * server.get('/api/health', () => Response.json({ status: 'ok' }));\r\n * \r\n * // Just works! Auto-detects Node.js, Bun, or Deno\r\n * server.listen(3000);\r\n * ```\r\n */\r\n\r\nimport { createRouter, type Router } from '../router/index.js';\r\nimport {\r\n createMiddlewareChain,\r\n createContextFromRequest,\r\n createResponseFromContext,\r\n type MiddlewareChain,\r\n type Middleware,\r\n} from '../middleware/index.js';\r\nimport { type FlightConfig, type FlightUserConfig, resolveConfig } from '../config/index.js';\r\nimport type { FlightAdapter } from '../adapters/index.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/** Route handler function signature */\r\nexport type RouteHandler = (context: RouteHandlerContext) => Promise<Response> | Response;\r\n\r\n/** Context passed to route handlers */\r\nexport interface RouteHandlerContext {\r\n /** The incoming request */\r\n request: Request;\r\n /** URL parameters from routing */\r\n params: Record<string, string | string[]>;\r\n /** Query parameters */\r\n query: URLSearchParams;\r\n /** Parsed URL */\r\n url: URL;\r\n /** Local data from middleware */\r\n locals: Record<string, unknown>;\r\n /** Database instance (if configured) */\r\n db?: unknown;\r\n /** Auth instance (if configured) */\r\n auth?: unknown;\r\n /** Email instance (if configured) */\r\n email?: unknown;\r\n}\r\n\r\n/** Server options */\r\nexport interface ServerOptions {\r\n /** Server configuration */\r\n config?: FlightUserConfig;\r\n /** Deployment adapter */\r\n adapter?: FlightAdapter;\r\n /** Database instance */\r\n db?: unknown;\r\n /** Auth instance */\r\n auth?: unknown;\r\n /** Email instance */\r\n email?: unknown;\r\n}\r\n\r\n/** Route definition for the server */\r\nexport interface ServerRoute {\r\n /** HTTP method (GET, POST, etc.) */\r\n method: string | string[];\r\n /** Route path pattern */\r\n path: string;\r\n /** Route handler */\r\n handler: RouteHandler;\r\n}\r\n\r\n/** Listen options */\r\nexport interface ListenOptions {\r\n /** Port to listen on (default: 3000) */\r\n port?: number;\r\n /** Hostname to bind to (default: 'localhost') */\r\n hostname?: string;\r\n /** Callback when server starts */\r\n onListen?: (info: { port: number; hostname: string }) => void;\r\n}\r\n\r\n/** Flight Server instance */\r\nexport interface FlightServer {\r\n /** Add a route */\r\n route(method: string | string[], path: string, handler: RouteHandler): FlightServer;\r\n\r\n /** Convenience methods for common HTTP methods */\r\n get(path: string, handler: RouteHandler): FlightServer;\r\n post(path: string, handler: RouteHandler): FlightServer;\r\n put(path: string, handler: RouteHandler): FlightServer;\r\n delete(path: string, handler: RouteHandler): FlightServer;\r\n patch(path: string, handler: RouteHandler): FlightServer;\r\n\r\n /** Add middleware */\r\n use(middleware: Middleware): FlightServer;\r\n use(path: string, middleware: Middleware): FlightServer;\r\n\r\n /** Handle incoming request (Web standard Request/Response) */\r\n handle(request: Request): Promise<Response>;\r\n\r\n /** \r\n * Start the HTTP server\r\n * Auto-detects runtime: Node.js, Bun, or Deno\r\n */\r\n listen(port?: number | ListenOptions): Promise<void>;\r\n\r\n /** Fetch handler for Bun.serve() and Deno.serve() */\r\n fetch(request: Request): Promise<Response>;\r\n\r\n /** Get the resolved configuration */\r\n readonly config: FlightConfig;\r\n\r\n /** Get the router instance */\r\n readonly router: Router<RouteHandler>;\r\n\r\n /** Get the middleware chain */\r\n readonly middleware: MiddlewareChain;\r\n}\r\n\r\n// ============================================================================\r\n// Runtime Detection\r\n// ============================================================================\r\n\r\ntype Runtime = 'node' | 'bun' | 'deno' | 'unknown';\r\n\r\nfunction detectRuntime(): Runtime {\r\n // @ts-expect-error - Bun global\r\n if (typeof Bun !== 'undefined') return 'bun';\r\n // @ts-expect-error - Deno global \r\n if (typeof Deno !== 'undefined') return 'deno';\r\n if (typeof process !== 'undefined' && process.versions?.node) return 'node';\r\n return 'unknown';\r\n}\r\n\r\n// ============================================================================\r\n// Server Implementation\r\n// ============================================================================\r\n\r\ninterface RouteEntry {\r\n methods: Set<string>;\r\n handler: RouteHandler;\r\n}\r\n\r\n/**\r\n * Create a new Flight server instance\r\n * \r\n * @example\r\n * ```typescript\r\n * import { createServer } from '@flight/core';\r\n * \r\n * const server = createServer();\r\n * \r\n * server.get('/api/users', async ({ db }) => {\r\n * const users = await db.query('SELECT * FROM users');\r\n * return Response.json(users);\r\n * });\r\n * \r\n * // Works on Node.js, Bun, and Deno!\r\n * server.listen(3000);\r\n * ```\r\n */\r\nexport function createServer(options: ServerOptions = {}): FlightServer {\r\n const config = resolveConfig(options.config ?? {});\r\n const router = createRouter<RouteEntry>();\r\n const middlewareChain = createMiddlewareChain();\r\n\r\n // Store dependencies\r\n const deps = {\r\n db: options.db,\r\n auth: options.auth,\r\n email: options.email,\r\n };\r\n\r\n function addRoute(method: string | string[], path: string, handler: RouteHandler): FlightServer {\r\n const methods = Array.isArray(method) ? method : [method];\r\n const methodSet = new Set(methods.map(m => m.toUpperCase()));\r\n\r\n // Check if route already exists\r\n const existingMatch = router.match(path);\r\n if (existingMatch && existingMatch.route.path === path) {\r\n // Merge methods\r\n for (const m of methodSet) {\r\n existingMatch.route.handler.methods.add(m);\r\n }\r\n existingMatch.route.handler.handler = handler;\r\n } else {\r\n router.add({\r\n path,\r\n handler: { methods: methodSet, handler },\r\n });\r\n }\r\n\r\n return server;\r\n }\r\n\r\n function useMiddleware(\r\n pathOrMiddleware: string | Middleware,\r\n maybeMiddleware?: Middleware\r\n ): FlightServer {\r\n if (typeof pathOrMiddleware === 'string' && maybeMiddleware) {\r\n middlewareChain.use(pathOrMiddleware, maybeMiddleware);\r\n } else if (typeof pathOrMiddleware === 'function') {\r\n middlewareChain.use(pathOrMiddleware);\r\n }\r\n return server;\r\n }\r\n\r\n async function handle(request: Request): Promise<Response> {\r\n const url = new URL(request.url);\r\n const method = request.method.toUpperCase();\r\n\r\n // Run middleware\r\n const ctx = createContextFromRequest(request);\r\n await middlewareChain.execute(ctx);\r\n\r\n // If middleware already set a response, return it\r\n if (ctx.responseBody !== undefined) {\r\n return createResponseFromContext(ctx);\r\n }\r\n\r\n // Match route\r\n const match = router.match(url.pathname);\r\n if (!match) {\r\n return new Response('Not Found', { status: 404 });\r\n }\r\n\r\n // Check method\r\n if (!match.route.handler.methods.has(method) && !match.route.handler.methods.has('*')) {\r\n return new Response('Method Not Allowed', { status: 405 });\r\n }\r\n\r\n // Build handler context\r\n const handlerContext: RouteHandlerContext = {\r\n request,\r\n params: match.params,\r\n query: url.searchParams,\r\n url,\r\n locals: ctx.locals,\r\n ...deps,\r\n };\r\n\r\n try {\r\n return await match.route.handler.handler(handlerContext);\r\n } catch (error) {\r\n console.error('Route handler error:', error);\r\n return new Response('Internal Server Error', { status: 500 });\r\n }\r\n }\r\n\r\n /**\r\n * Start the HTTP server\r\n * Auto-detects the runtime and uses the appropriate server\r\n */\r\n async function listen(portOrOptions?: number | ListenOptions): Promise<void> {\r\n const opts: ListenOptions = typeof portOrOptions === 'number'\r\n ? { port: portOrOptions }\r\n : portOrOptions ?? {};\r\n\r\n const port = opts.port ?? config.dev.port ?? 3000;\r\n const hostname = opts.hostname ?? 'localhost';\r\n\r\n // Check for custom adapter first\r\n const adapter = options.adapter ?? config.adapter;\r\n if (adapter?.listen) {\r\n await adapter.listen(server, port);\r\n return;\r\n }\r\n\r\n const runtime = detectRuntime();\r\n\r\n switch (runtime) {\r\n case 'bun':\r\n await startBunServer(port, hostname, opts.onListen);\r\n break;\r\n case 'deno':\r\n await startDenoServer(port, hostname, opts.onListen);\r\n break;\r\n case 'node':\r\n default:\r\n await startNodeServer(port, hostname, opts.onListen);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Start Node.js HTTP server\r\n */\r\n async function startNodeServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n const httpServer = createHttpServer(async (req, res) => {\r\n const url = new URL(req.url || '/', `http://${hostname}:${port}`);\r\n\r\n // Build headers\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n const headerValue = Array.isArray(value) ? value[0] : value;\r\n if (headerValue) headers.set(key, headerValue);\r\n }\r\n }\r\n\r\n // Read body for POST/PUT/PATCH\r\n let body: string | undefined;\r\n if (['POST', 'PUT', 'PATCH'].includes(req.method || '')) {\r\n body = await new Promise<string>((resolve) => {\r\n let data = '';\r\n req.on('data', chunk => data += chunk);\r\n req.on('end', () => resolve(data));\r\n });\r\n }\r\n\r\n const request = new Request(url.toString(), {\r\n method: req.method,\r\n headers,\r\n body: body || undefined,\r\n });\r\n\r\n try {\r\n const response = await handle(request);\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value, key) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const responseBody = await response.text();\r\n res.end(responseBody);\r\n } catch (error) {\r\n console.error('Server error:', error);\r\n res.statusCode = 500;\r\n res.setHeader('Content-Type', 'application/json');\r\n res.end(JSON.stringify({ error: 'Internal Server Error' }));\r\n }\r\n });\r\n\r\n return new Promise((resolve) => {\r\n httpServer.listen(port, hostname, () => {\r\n const info = { port, hostname };\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n╔═══════════════════════════════════════════════════════════╗\r\n║ Flight Server (Node.js) ║\r\n╠═══════════════════════════════════════════════════════════╣\r\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\r\n╚═══════════════════════════════════════════════════════════╝\r\n`);\r\n }\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Start Bun server\r\n */\r\n async function startBunServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\r\n // @ts-expect-error - Bun types\r\n Bun.serve({\r\n port,\r\n hostname,\r\n fetch: handle,\r\n });\r\n\r\n const info = { port, hostname };\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n╔═══════════════════════════════════════════════════════════╗\r\n║ Flight Server (Bun) ║\r\n╠═══════════════════════════════════════════════════════════╣\r\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\r\n╚═══════════════════════════════════════════════════════════╝\r\n`);\r\n }\r\n }\r\n\r\n /**\r\n * Start Deno server\r\n */\r\n async function startDenoServer(port: number, hostname: string, onListen?: ListenOptions['onListen']): Promise<void> {\r\n // @ts-expect-error - Deno types\r\n Deno.serve({ port, hostname }, handle);\r\n\r\n const info = { port, hostname };\r\n if (onListen) {\r\n onListen(info);\r\n } else {\r\n console.log(`\r\n╔═══════════════════════════════════════════════════════════╗\r\n║ Flight Server (Deno) ║\r\n╠═══════════════════════════════════════════════════════════╣\r\n║ Server: http://${hostname}:${port.toString().padEnd(37)}║\r\n╚═══════════════════════════════════════════════════════════╝\r\n`);\r\n }\r\n }\r\n\r\n const server: FlightServer = {\r\n route: addRoute,\r\n get: (path, handler) => addRoute('GET', path, handler),\r\n post: (path, handler) => addRoute('POST', path, handler),\r\n put: (path, handler) => addRoute('PUT', path, handler),\r\n delete: (path, handler) => addRoute('DELETE', path, handler),\r\n patch: (path, handler) => addRoute('PATCH', path, handler),\r\n use: useMiddleware as FlightServer['use'],\r\n handle,\r\n listen,\r\n fetch: handle, // Alias for Bun/Deno compatibility\r\n get config() { return config; },\r\n get router() { return router as unknown as Router<RouteHandler>; },\r\n get middleware() { return middlewareChain; },\r\n };\r\n\r\n return server;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Exports\r\n// ============================================================================\r\n\r\n/** Type guard to check if an object is a FlightServer */\r\nexport function isFlightServer(obj: unknown): obj is FlightServer {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'handle' in obj &&\r\n 'route' in obj &&\r\n typeof (obj as FlightServer).handle === 'function'\r\n );\r\n}\r\n\r\n/** Get current runtime */\r\nexport function getRuntime(): Runtime {\r\n return detectRuntime();\r\n}\r\n\r\n","/**\r\n * Flight Framework - Core\r\n * \r\n * The agnostic full-stack framework primitives.\r\n * Maximum flexibility, zero lock-in.\r\n */\r\n\r\n// Configuration\r\nexport { defineConfig, type FlightConfig, type FlightUserConfig } from './config/index.js';\r\n\r\n// Router\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// Server\r\nexport {\r\n createServer,\r\n type FlightServer,\r\n type RouteHandler,\r\n type RouteHandlerContext,\r\n type ServerOptions,\r\n type ServerRoute,\r\n} from './server/index.js';\r\n\r\n// Render\r\nexport {\r\n type RenderMode,\r\n type RenderContext,\r\n type RenderResult,\r\n} from './render/index.js';\r\n\r\n// Cache\r\nexport {\r\n createCache,\r\n type Cache,\r\n type CacheOptions,\r\n} from './cache/index.js';\r\n\r\n// Middleware\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// Adapters\r\nexport {\r\n type FlightAdapter,\r\n type AdapterBuilder,\r\n} from './adapters/index.js';\r\n\r\n// File Router\r\nexport {\r\n createFileRouter,\r\n scanRoutes,\r\n loadRoutes,\r\n type FileRoute,\r\n type FileRouter,\r\n type FileRouterOptions,\r\n type ScanResult,\r\n} from './file-router/index.js';\r\n\r\n// Route Handlers (for file-based routing)\r\nexport {\r\n createRouteContext,\r\n json,\r\n redirect,\r\n error,\r\n parseBody,\r\n type RouteHandler as FileRouteHandler,\r\n type RouteHandlerContext as FileRouteHandlerContext,\r\n type HttpMethod as FileHttpMethod,\r\n} from './handlers/index.js';\r\n\r\n// Server Actions\r\nexport {\r\n registerAction,\r\n getAction,\r\n executeAction,\r\n executeFormAction,\r\n handleActionRequest,\r\n cookies,\r\n redirect as actionRedirect,\r\n parseFormData,\r\n RedirectError,\r\n isRedirectError,\r\n type ServerAction,\r\n type ActionResult,\r\n type CookieOptions,\r\n} from './actions/index.js';\r\n\r\n// Streaming SSR\r\nexport {\r\n createStreamingSSR,\r\n createStreamingResponse,\r\n renderWithStreaming,\r\n createLazyContent,\r\n streamParallel,\r\n streamSequential,\r\n type StreamingRenderOptions,\r\n type StreamingRenderResult,\r\n type SuspenseBoundaryConfig,\r\n} from './streaming/index.js';\r\n\r\n// React Server Components (RSC) Primitives\r\nexport {\r\n hasUseClientDirective,\r\n hasUseServerDirective,\r\n detectComponentType,\r\n createRenderContext,\r\n executeServerComponent,\r\n serverFetch,\r\n revalidateTag,\r\n revalidatePath,\r\n serializeProps,\r\n deserializeProps,\r\n createClientBoundary,\r\n createAsyncComponent,\r\n composeComponents,\r\n withErrorBoundary,\r\n notFound,\r\n isNotFoundError,\r\n redirect as rscRedirect,\r\n isRedirectError as isRscRedirectError,\r\n type RenderContext as RSCRenderContext,\r\n type ServerComponent,\r\n type ClientComponent,\r\n type ComponentType as RSCComponentType,\r\n} from './rsc/index.js';\r\n\r\n// Version\r\nexport const VERSION = '0.0.1';\r\n","/**\r\n * Flight CLI - Command-line interface\r\n */\r\n\r\nimport { cac } from 'cac';\r\nimport pc from 'picocolors';\r\nimport { VERSION } from './version.js';\r\nimport { createCommand } from './commands/create.js';\r\nimport { devCommand } from './commands/dev.js';\r\nimport { buildCommand } from './commands/build.js';\r\nimport { previewCommand } from './commands/preview.js';\r\n\r\nconst cli = cac('flight');\r\n\r\n// Logo\r\nconst LOGO = `\r\n${pc.cyan(' ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗')}\r\n${pc.cyan(' ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝')}\r\n${pc.cyan(' █████╗ ██║ ██║██║ ███╗███████║ ██║ ')}\r\n${pc.cyan(' ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ ')}\r\n${pc.cyan(' ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ ')}\r\n${pc.cyan(' ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ')}\r\n \r\n ${pc.dim('The Agnostic Full-Stack Framework')}\r\n ${pc.dim('Maximum Flexibility. Zero Lock-in.')}\r\n`;\r\n\r\nexport function printLogo(): void {\r\n console.log(LOGO);\r\n}\r\n\r\n// Version\r\ncli.version(VERSION);\r\ncli.help();\r\n\r\n// Commands\r\ncli\r\n .command('create [name]', 'Create a new Flight project')\r\n .option('-t, --template <template>', 'Project template to use', { default: 'basic' })\r\n .option('--ui <framework>', 'UI framework (react, vue, svelte, solid, vanilla)')\r\n .option('--ts', 'Use TypeScript', { default: true })\r\n .option('--git', 'Initialize git repository', { default: true })\r\n .option('--install', 'Install dependencies', { default: true })\r\n .action(createCommand);\r\n\r\ncli\r\n .command('dev', 'Start development server')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .option('--https', 'Enable HTTPS')\r\n .option('--ssr', 'Enable Server-Side Rendering')\r\n .action(devCommand);\r\n\r\ncli\r\n .command('build', 'Build for production')\r\n .option('--outDir <dir>', 'Output directory')\r\n .option('--sourcemap', 'Generate source maps')\r\n .option('--minify', 'Minify output', { default: true })\r\n .action(buildCommand);\r\n\r\ncli\r\n .command('preview', 'Preview production build')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .action(previewCommand);\r\n\r\n// Parse and run\r\nexport function run(): void {\r\n try {\r\n cli.parse(process.argv, { run: false });\r\n\r\n // Show logo for help\r\n if (cli.options.help || process.argv.length <= 2) {\r\n printLogo();\r\n }\r\n\r\n cli.runMatchedCommand();\r\n } catch (error) {\r\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { VERSION };\r\n","export const VERSION = '0.0.1';\r\n","/**\r\n * Flight CLI - Create Command\r\n * \r\n * Scaffold a new Flight project with the user's preferred options.\r\n */\r\n\r\nimport { existsSync, mkdirSync, writeFileSync, readdirSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\nimport { execSync } from 'node:child_process';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface CreateOptions {\r\n template: string;\r\n ui?: string;\r\n ts: boolean;\r\n git: boolean;\r\n install: boolean;\r\n}\r\n\r\n\r\n\r\nexport async function createCommand(\r\n name: string | undefined,\r\n options: CreateOptions\r\n): Promise<void> {\r\n printLogo();\r\n\r\n console.log(pc.cyan('\\n[*] Creating a new Flight project...\\n'));\r\n\r\n // Interactive prompts if name not provided\r\n let projectName = name;\r\n let uiFramework = options.ui;\r\n\r\n if (!projectName) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: 'Project name:',\r\n initial: 'my-flight-app',\r\n validate: (value: string) => {\r\n if (!value) return 'Project name is required';\r\n if (!/^[a-z0-9-_]+$/i.test(value)) return 'Invalid project name';\r\n return true;\r\n },\r\n });\r\n projectName = response.name;\r\n }\r\n\r\n if (!projectName) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n if (!uiFramework) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'ui',\r\n message: 'Choose your UI framework:',\r\n choices: [\r\n { title: 'React', value: 'react', description: 'The library for web and native user interfaces' },\r\n { title: 'Vue', value: 'vue', description: 'The progressive JavaScript framework' },\r\n { title: 'Svelte', value: 'svelte', description: 'Cybernetically enhanced web apps' },\r\n { title: 'Solid', value: 'solid', description: 'Simple and performant reactivity' },\r\n { title: 'Preact', value: 'preact', description: 'Fast 3kB alternative to React' },\r\n { title: 'Qwik', value: 'qwik', description: 'Resumable framework with O(1) loading' },\r\n { title: 'Lit', value: 'lit', description: 'Fast, lightweight Web Components' },\r\n { title: 'Htmx', value: 'htmx', description: 'HTML over the wire, no JavaScript' },\r\n { title: 'Vanilla', value: 'vanilla', description: 'No framework, just JavaScript' },\r\n ],\r\n initial: 0,\r\n });\r\n uiFramework = response.ui;\r\n }\r\n\r\n if (!uiFramework) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n const projectPath = resolve(process.cwd(), projectName);\r\n\r\n // Check if directory exists\r\n if (existsSync(projectPath)) {\r\n const files = readdirSync(projectPath);\r\n if (files.length > 0) {\r\n const response = await prompts({\r\n type: 'confirm',\r\n name: 'overwrite',\r\n message: `Directory ${projectName} is not empty. Continue anyway?`,\r\n initial: false,\r\n });\r\n if (!response.overwrite) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n }\r\n }\r\n\r\n console.log(pc.dim(`\\nCreating project in ${projectPath}...\\n`));\r\n\r\n // Create project structure\r\n try {\r\n createProjectStructure(projectPath, {\r\n name: projectName,\r\n ui: uiFramework,\r\n typescript: options.ts,\r\n });\r\n\r\n console.log(pc.green('✓') + ' Project structure created');\r\n\r\n // Initialize git\r\n if (options.git) {\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n console.log(pc.green('✓') + ' Git repository initialized');\r\n } catch {\r\n console.log(pc.yellow('[!]') + ' Could not initialize git repository');\r\n }\r\n }\r\n\r\n // Install dependencies\r\n if (options.install) {\r\n console.log(pc.dim('\\nInstalling dependencies...\\n'));\r\n try {\r\n // Detect package manager\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n console.log(pc.green('\\n✓') + ' Dependencies installed');\r\n } catch {\r\n console.log(pc.yellow('\\n[!]') + ' Could not install dependencies. Run `npm install` manually.');\r\n }\r\n }\r\n\r\n // Success message\r\n console.log(`\r\n${pc.green('[OK] Project created successfully!')}\r\n\r\n${pc.cyan('Next steps:')}\r\n\r\n ${pc.dim('$')} cd ${projectName}\r\n ${pc.dim('$')} ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\n${pc.dim('Your project is 100% yours:')}\r\n ${pc.dim('•')} No telemetry\r\n ${pc.dim('•')} No lock-in\r\n ${pc.dim('•')} Deploy anywhere\r\n\r\n${pc.cyan('Happy flying!')}\r\n`);\r\n } catch (error) {\r\n console.error(pc.red('Failed to create project:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction detectPackageManager(): string {\r\n if (process.env.npm_config_user_agent?.includes('pnpm')) return 'pnpm';\r\n if (process.env.npm_config_user_agent?.includes('yarn')) return 'yarn';\r\n if (process.env.npm_config_user_agent?.includes('bun')) return 'bun';\r\n return 'npm';\r\n}\r\n\r\ninterface ProjectOptions {\r\n name: string;\r\n ui: string;\r\n typescript: boolean;\r\n}\r\n\r\nfunction createProjectStructure(projectPath: string, options: ProjectOptions): void {\r\n const { name, ui, typescript } = options;\r\n const ext = typescript ? 'ts' : 'js';\r\n const extx = typescript ? 'tsx' : 'jsx';\r\n\r\n // Create directories - minimal structure following 2026 best practices\r\n const dirs = [\r\n '',\r\n 'src',\r\n 'src/styles',\r\n 'public',\r\n ];\r\n\r\n for (const dir of dirs) {\r\n mkdirSync(join(projectPath, dir), { recursive: true });\r\n }\r\n\r\n // Determine Vite plugin based on UI framework\r\n const vitePlugin = getVitePlugin(ui);\r\n const vitePluginImport = getVitePluginImport(ui);\r\n\r\n // package.json - 2026 best practices\r\n const packageJson = {\r\n name,\r\n version: '0.0.1',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'vite',\r\n build: 'vite build',\r\n preview: 'vite preview',\r\n 'flight:dev': 'flight dev',\r\n 'flight:build': 'flight build',\r\n },\r\n dependencies: {} as Record<string, string>,\r\n devDependencies: {\r\n 'vite': '^6.0.0',\r\n ...(typescript ? {\r\n 'typescript': '^5.7.0',\r\n '@types/node': '^22.0.0'\r\n } : {}),\r\n } as Record<string, string>,\r\n };\r\n\r\n // Add UI framework dependencies\r\n if (ui === 'react') {\r\n packageJson.dependencies['react'] = '^19.0.0';\r\n packageJson.dependencies['react-dom'] = '^19.0.0';\r\n packageJson.devDependencies['@vitejs/plugin-react'] = '^4.3.0';\r\n if (typescript) {\r\n packageJson.devDependencies['@types/react'] = '^19.0.0';\r\n packageJson.devDependencies['@types/react-dom'] = '^19.0.0';\r\n }\r\n } else if (ui === 'vue') {\r\n packageJson.dependencies['vue'] = '^3.5.0';\r\n packageJson.devDependencies['@vitejs/plugin-vue'] = '^5.2.0';\r\n } else if (ui === 'svelte') {\r\n packageJson.dependencies['svelte'] = '^5.0.0';\r\n packageJson.devDependencies['@sveltejs/vite-plugin-svelte'] = '^4.0.0';\r\n } else if (ui === 'solid') {\r\n packageJson.dependencies['solid-js'] = '^1.9.0';\r\n packageJson.devDependencies['vite-plugin-solid'] = '^2.10.0';\r\n } else if (ui === 'preact') {\r\n packageJson.dependencies['preact'] = '^10.25.0';\r\n packageJson.devDependencies['@preact/preset-vite'] = '^2.9.0';\r\n packageJson.devDependencies['preact-render-to-string'] = '^6.5.0';\r\n } else if (ui === 'qwik') {\r\n packageJson.dependencies['@builder.io/qwik'] = '^2.0.0';\r\n packageJson.devDependencies['@builder.io/qwik-city'] = '^2.0.0'; // Optional, but included for SSR\r\n } else if (ui === 'lit') {\r\n packageJson.dependencies['lit'] = '^3.2.0';\r\n packageJson.devDependencies['@lit-labs/ssr'] = '^3.3.0';\r\n } else if (ui === 'htmx') {\r\n // HTMX: Just a script tag, minimal dependencies\r\n packageJson.dependencies['htmx.org'] = '^2.0.0';\r\n }\r\n\r\n writeFileSync(\r\n join(projectPath, 'package.json'),\r\n JSON.stringify(packageJson, null, 2)\r\n );\r\n\r\n // vite.config.ts - 2026 best practices\r\n const viteConfig = `import { defineConfig } from 'vite';\r\n${vitePluginImport}\r\n\r\n// https://vite.dev/config/\r\nexport default defineConfig({\r\n plugins: [${vitePlugin}],\r\n server: {\r\n port: 5173,\r\n open: false,\r\n },\r\n build: {\r\n target: 'es2022',\r\n sourcemap: true,\r\n },\r\n});\r\n`;\r\n writeFileSync(join(projectPath, `vite.config.${ext}`), viteConfig);\r\n\r\n // index.html - Entry point for Vite (with SSR outlet)\r\n const indexHtml = createIndexHtml(name, ui);\r\n writeFileSync(join(projectPath, 'index.html'), indexHtml);\r\n\r\n // entry-client.tsx - Client hydration entry point\r\n const clientEntry = createClientEntry(ui, typescript);\r\n writeFileSync(join(projectPath, `src/entry-client.${extx}`), clientEntry);\r\n\r\n // entry-server.tsx - SSR entry point\r\n const serverEntry = createServerEntry(ui, typescript);\r\n writeFileSync(join(projectPath, `src/entry-server.${extx}`), serverEntry);\r\n\r\n // App.tsx - Root component\r\n const appComponent = createAppComponent(ui, typescript);\r\n const appExt = ui === 'svelte' ? 'svelte' : ui === 'vue' ? 'vue' : extx;\r\n writeFileSync(join(projectPath, `src/App.${appExt}`), appComponent);\r\n\r\n // CSS - Modern 2026 styles\r\n const globalStyles = createGlobalStyles();\r\n writeFileSync(join(projectPath, 'src/styles/global.css'), globalStyles);\r\n\r\n // flight.config.ts - Flight framework config with SSR enabled\r\n const flightConfig = `// Flight Framework Configuration\r\n// SSR enabled by default\r\n\r\nexport default {\r\n ui: {\r\n framework: '${ui}',\r\n },\r\n rendering: {\r\n default: 'ssr', // Server-side rendering enabled\r\n },\r\n};\r\n`;\r\n writeFileSync(join(projectPath, `flight.config.${ext}`), flightConfig);\r\n\r\n // tsconfig.json (if TypeScript)\r\n if (typescript) {\r\n const tsconfig = {\r\n compilerOptions: {\r\n target: 'ES2022',\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\r\n strict: true,\r\n noEmit: true,\r\n esModuleInterop: true,\r\n skipLibCheck: true,\r\n forceConsistentCasingInFileNames: true,\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n verbatimModuleSyntax: true,\r\n jsx: ui === 'react' || ui === 'preact' ? 'react-jsx'\r\n : ui === 'solid' ? 'preserve'\r\n : undefined,\r\n jsxImportSource: ui === 'preact' ? 'preact'\r\n : ui === 'solid' ? 'solid-js'\r\n : undefined,\r\n },\r\n include: ['src'],\r\n exclude: ['node_modules'],\r\n };\r\n writeFileSync(\r\n join(projectPath, 'tsconfig.json'),\r\n JSON.stringify(tsconfig, null, 2)\r\n );\r\n }\r\n\r\n // Note: Routes directory is not created by default for minimal template\r\n // Users can create src/routes/ when they need file-based routing\r\n // See documentation: docs/routing.md\r\n\r\n // .gitignore\r\n const gitignore = `# Dependencies\r\nnode_modules/\r\n\r\n# Build output\r\ndist/\r\n.output/\r\n\r\n# Environment\r\n.env\r\n.env.*\r\n!.env.example\r\n\r\n# Logs\r\n*.log\r\nnpm-debug.log*\r\n\r\n# Editor\r\n.vscode/\r\n.idea/\r\n*.swp\r\n*.swo\r\n\r\n# OS\r\n.DS_Store\r\nThumbs.db\r\n`;\r\n writeFileSync(join(projectPath, '.gitignore'), gitignore);\r\n\r\n // README.md\r\n const readme = `# ${name}\r\n\r\nA modern web application built with Flight Framework.\r\n\r\n## Development\r\n\r\n\\`\\`\\`bash\r\nnpm run dev\r\n\\`\\`\\`\r\n\r\n## Production Build\r\n\r\n\\`\\`\\`bash\r\nnpm run build\r\nnpm run preview\r\n\\`\\`\\`\r\n\r\n## Tech Stack\r\n\r\n- **Framework**: ${ui.charAt(0).toUpperCase() + ui.slice(1)}\r\n- **Build Tool**: Vite 6\r\n- **Language**: ${typescript ? 'TypeScript' : 'JavaScript'}\r\n\r\n## Flight Philosophy\r\n\r\nThis project runs on Flight Framework:\r\n- **No lock-in** - Deploy anywhere\r\n- **No telemetry** - Your code, your privacy\r\n- **You choose** - UI, database, auth, hosting\r\n`;\r\n writeFileSync(join(projectPath, 'README.md'), readme);\r\n}\r\n\r\n// Helper functions for template generation\r\n\r\nfunction getVitePlugin(ui: string): string {\r\n switch (ui) {\r\n case 'react': return 'react()';\r\n case 'vue': return 'vue()';\r\n case 'svelte': return 'svelte()';\r\n case 'solid': return 'solid()';\r\n case 'preact': return 'preact()';\r\n case 'qwik': return 'qwikVite()';\r\n case 'lit': return ''; // Lit doesn't need Vite plugin for SSR\r\n case 'htmx': return ''; // HTMX is HTML-only, no plugin needed\r\n default: return '';\r\n }\r\n}\r\n\r\nfunction getVitePluginImport(ui: string): string {\r\n switch (ui) {\r\n case 'react': return \"import react from '@vitejs/plugin-react';\";\r\n case 'vue': return \"import vue from '@vitejs/plugin-vue';\";\r\n case 'svelte': return \"import { svelte } from '@sveltejs/vite-plugin-svelte';\";\r\n case 'solid': return \"import solid from 'vite-plugin-solid';\";\r\n case 'preact': return \"import preact from '@preact/preset-vite';\";\r\n case 'qwik': return \"import { qwikVite } from '@builder.io/qwik/optimizer';\";\r\n case 'lit': return '// Lit uses native Web Components, no Vite plugin required';\r\n case 'htmx': return '// HTMX is HTML-only, no Vite plugin required';\r\n default: return '';\r\n }\r\n}\r\n\r\nfunction createIndexHtml(name: string, ui: string): string {\r\n const moduleExt = ui === 'svelte' ? 'ts' : 'tsx';\r\n return `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <meta name=\"description\" content=\"${name} - Built with Flight Framework\" />\r\n <title>${name}</title>\r\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\" />\r\n</head>\r\n<body>\r\n <div id=\"root\"><!--ssr-outlet--></div>\r\n <script type=\"module\" src=\"/src/entry-client.${moduleExt}\"></script>\r\n</body>\r\n</html>\r\n`;\r\n}\r\n\r\n/**\r\n * Create client entry for hydration (entry-client.tsx)\r\n */\r\nfunction createClientEntry(ui: string, _typescript: boolean): string {\r\n switch (ui) {\r\n case 'react':\r\n return `import { hydrateRoot, createRoot } from 'react-dom/client';\r\nimport App from './App';\r\nimport './styles/global.css';\r\n\r\nconst rootElement = document.getElementById('root');\r\n\r\nif (!rootElement) {\r\n throw new Error('Root element not found');\r\n}\r\n\r\n// Check if we have SSR content to hydrate\r\nif (rootElement.innerHTML.trim()) {\r\n hydrateRoot(rootElement, <App />);\r\n} else {\r\n // CSR fallback\r\n createRoot(rootElement).render(<App />);\r\n}\r\n`;\r\n case 'vue':\r\n return `import { createApp, createSSRApp } from 'vue';\r\nimport App from './App.vue';\r\nimport './styles/global.css';\r\n\r\nconst rootElement = document.getElementById('root');\r\nconst hasSSRContent = rootElement?.innerHTML.trim();\r\n\r\nif (hasSSRContent) {\r\n createSSRApp(App).mount('#root');\r\n} else {\r\n createApp(App).mount('#root');\r\n}\r\n`;\r\n case 'solid':\r\n return `import { hydrate, render } from 'solid-js/web';\r\nimport App from './App';\r\nimport './styles/global.css';\r\n\r\nconst root = document.getElementById('root');\r\n\r\nif (!root) {\r\n throw new Error('Root element not found');\r\n}\r\n\r\n// Check for SSR content\r\nif (root.innerHTML.trim()) {\r\n hydrate(() => <App />, root);\r\n} else {\r\n render(() => <App />, root);\r\n}\r\n`;\r\n case 'preact':\r\n return `import { hydrate, render } from 'preact';\r\nimport App from './App';\r\nimport './styles/global.css';\r\n\r\nconst root = document.getElementById('root');\r\n\r\nif (!root) {\r\n throw new Error('Root element not found');\r\n}\r\n\r\n// Check for SSR content\r\nif (root.innerHTML.trim()) {\r\n hydrate(<App />, root);\r\n} else {\r\n render(<App />, root);\r\n}\r\n`;\r\n case 'svelte':\r\n return `import App from './App.svelte';\r\nimport './styles/global.css';\r\n\r\nconst target = document.getElementById('root');\r\n\r\nif (!target) {\r\n throw new Error('Root element not found');\r\n}\r\n\r\n// Hydrate or mount\r\nconst app = new App({\r\n target,\r\n hydrate: target.innerHTML.trim() !== '',\r\n});\r\n\r\nexport default app;\r\n`;\r\n case 'qwik':\r\n return `import './styles/global.css';\r\n\r\n/**\r\n * Qwik Client Entry\r\n * Qwik uses resumability - no hydration needed!\r\n * The framework automatically resumes where the server left off.\r\n */\r\nconsole.log('Qwik app resumed!');\r\n`;\r\n case 'lit':\r\n return `import './styles/global.css';\r\nimport './components/app-element.js';\r\n\r\n/**\r\n * Lit Client Entry\r\n * Web Components hydrate automatically via declarative shadow DOM\r\n */\r\nconsole.log('Lit Web Components ready!');\r\n`;\r\n case 'htmx':\r\n return `import './styles/global.css';\r\nimport 'htmx.org';\r\n\r\n/**\r\n * HTMX Client Entry\r\n * HTMX handles all interactivity via HTML attributes\r\n * No JavaScript framework needed!\r\n */\r\ndocument.body.addEventListener('htmx:afterSwap', (event) => {\r\n console.log('HTMX content swapped:', event.detail.target);\r\n});\r\n\r\nconsole.log('HTMX ready!');\r\n`;\r\n default: // vanilla\r\n return `import './styles/global.css';\r\n\r\n// CSR only for vanilla\r\nconst root = document.getElementById('root');\r\nif (root && !root.innerHTML.trim()) {\r\n root.innerHTML = \\`\r\n <main class=\"container\">\r\n <h1>Welcome to Flight ✈️</h1>\r\n <p>The agnostic full-stack framework.</p>\r\n <p>Maximum flexibility. Zero lock-in.</p>\r\n </main>\r\n \\`;\r\n}\r\n`;\r\n }\r\n}\r\n\r\n/**\r\n * Create server entry for SSR (entry-server.tsx)\r\n */\r\nfunction createServerEntry(ui: string, _typescript: boolean): string {\r\n switch (ui) {\r\n case 'react':\r\n return `import { renderToString } from 'react-dom/server';\r\nimport App from './App';\r\n\r\n/**\r\n * Server-side render function\r\n * Called by Flight dev server for each request\r\n */\r\nexport function render(url: string): string {\r\n const html = renderToString(<App />);\r\n return html;\r\n}\r\n`;\r\n case 'vue':\r\n return `import { renderToString } from 'vue/server-renderer';\r\nimport { createSSRApp } from 'vue';\r\nimport App from './App.vue';\r\n\r\n/**\r\n * Server-side render function\r\n */\r\nexport async function render(url: string): Promise<string> {\r\n const app = createSSRApp(App);\r\n const html = await renderToString(app);\r\n return html;\r\n}\r\n`;\r\n case 'solid':\r\n return `import { renderToString } from 'solid-js/web';\r\nimport App from './App';\r\n\r\n/**\r\n * Server-side render function\r\n */\r\nexport function render(url: string): string {\r\n const html = renderToString(() => <App />);\r\n return html;\r\n}\r\n`;\r\n case 'preact':\r\n return `import renderToString from 'preact-render-to-string';\r\nimport App from './App';\r\n\r\n/**\r\n * Server-side render function\r\n */\r\nexport function render(url: string): string {\r\n const html = renderToString(<App />);\r\n return html;\r\n}\r\n`;\r\n case 'svelte':\r\n return `import { render } from 'svelte/server';\r\nimport App from './App.svelte';\r\n\r\n/**\r\n * Server-side render function\r\n * Uses Svelte 5 native SSR (no SvelteKit required)\r\n */\r\nexport function render(url: string): string {\r\n const { body, head } = render(App, {\r\n props: { url }\r\n });\r\n return body;\r\n}\r\n`;\r\n case 'qwik':\r\n return `import { renderToString } from '@builder.io/qwik/server';\r\nimport App from './App';\r\n\r\n/**\r\n * Server-side render function\r\n * Qwik: Resumable framework with O(1) loading\r\n */\r\nexport async function render(url: string): Promise<string> {\r\n const { html } = await renderToString(<App />, {\r\n containerTagName: 'div',\r\n });\r\n return html;\r\n}\r\n`;\r\n case 'lit':\r\n return `import { render } from '@lit-labs/ssr';\r\nimport { html } from 'lit';\r\nimport { collectResult } from '@lit-labs/ssr/lib/render-result.js';\r\nimport './components/app-element.js';\r\n\r\n/**\r\n * Server-side render function\r\n * Lit: Web Components SSR\r\n */\r\nexport async function render(url: string): Promise<string> {\r\n const result = render(html\\`<app-element></app-element>\\`);\r\n return collectResult(result);\r\n}\r\n`;\r\n case 'htmx':\r\n return `/**\r\n * Server-side render function\r\n * HTMX: HTML over the wire - no JavaScript needed\r\n */\r\nexport function render(url: string): string {\r\n return \\`\r\n <main class=\"container\" hx-boost=\"true\">\r\n <div class=\"hero\">\r\n <h1>\r\n <span class=\"flight-icon\">*</span>\r\n Welcome to <span class=\"gradient-text\">Flight</span>\r\n </h1>\r\n <p class=\"tagline\">The agnostic full-stack framework</p>\r\n <p class=\"subtitle\">Maximum flexibility. Zero lock-in.</p>\r\n \r\n <div class=\"features\" hx-get=\"/api/features\" hx-trigger=\"load\" hx-swap=\"innerHTML\">\r\n <p>Loading features...</p>\r\n </div>\r\n \r\n <div class=\"cta\">\r\n <a href=\"/docs\" class=\"btn btn-primary\" hx-boost=\"true\">Get Started</a>\r\n <a href=\"/api\" class=\"btn btn-secondary\" hx-boost=\"true\">API Docs</a>\r\n </div>\r\n </div>\r\n </main>\r\n \\`;\r\n}\r\n`;\r\n default: // vanilla\r\n return `/**\r\n * Server-side render function for vanilla JS\r\n */\r\nexport function render(url: string): string {\r\n return \\`\r\n <main class=\"container\">\r\n <h1>Welcome to Flight *</h1>\r\n <p>The agnostic full-stack framework.</p>\r\n <p>Maximum flexibility. Zero lock-in.</p>\r\n </main>\r\n \\`;\r\n}\r\n`;\r\n }\r\n}\r\n\r\nfunction createMainEntry(ui: string, _typescript: boolean): string {\r\n switch (ui) {\r\n case 'react':\r\n return `import { StrictMode } from 'react';\r\nimport { createRoot } from 'react-dom/client';\r\nimport App from './App';\r\nimport './styles/global.css';\r\n\r\nconst rootElement = document.getElementById('root');\r\n\r\nif (!rootElement) {\r\n throw new Error('Root element not found');\r\n}\r\n\r\ncreateRoot(rootElement).render(\r\n <StrictMode>\r\n <App />\r\n </StrictMode>\r\n);\r\n`;\r\n case 'vue':\r\n return `import { createApp } from 'vue';\r\nimport App from './App.vue';\r\nimport './styles/global.css';\r\n\r\ncreateApp(App).mount('#root');\r\n`;\r\n case 'svelte':\r\n return `import App from './App.svelte';\r\nimport './styles/global.css';\r\n\r\nconst app = new App({\r\n target: document.getElementById('root')!,\r\n});\r\n\r\nexport default app;\r\n`;\r\n case 'solid':\r\n return `import { render } from 'solid-js/web';\r\nimport App from './App';\r\nimport './styles/global.css';\r\n\r\nconst root = document.getElementById('root');\r\n\r\nif (!root) {\r\n throw new Error('Root element not found');\r\n}\r\n\r\nrender(() => <App />, root);\r\n`;\r\n case 'preact':\r\n return `import { render } from 'preact';\r\nimport App from './App';\r\nimport './styles/global.css';\r\n\r\nconst root = document.getElementById('root');\r\n\r\nif (!root) {\r\n throw new Error('Root element not found');\r\n}\r\n\r\nrender(<App />, root);\r\n`;\r\n default: // vanilla\r\n return `import './styles/global.css';\r\n\r\nconst root = document.getElementById('root');\r\nif (root) {\r\n root.innerHTML = \\`\r\n <main class=\"container\">\r\n <h1>Welcome to Flight *</h1>\r\n <p>The agnostic full-stack framework.</p>\r\n <p>Maximum flexibility. Zero lock-in.</p>\r\n </main>\r\n \\`;\r\n}\r\n`;\r\n }\r\n}\r\n\r\nfunction createAppComponent(ui: string, _typescript: boolean): string {\r\n switch (ui) {\r\n case 'react':\r\n case 'solid':\r\n case 'preact':\r\n return `export default function App() {\r\n return (\r\n <main className=\"container\">\r\n <div className=\"hero\">\r\n <h1>\r\n <span className=\"flight-icon\">*</span>\r\n Welcome to <span className=\"gradient-text\">Flight</span>\r\n </h1>\r\n <p className=\"tagline\">The agnostic full-stack framework</p>\r\n <p className=\"subtitle\">Maximum flexibility. Zero lock-in.</p>\r\n \r\n <div className=\"features\">\r\n <div className=\"feature\">\r\n <span className=\"feature-icon\">*</span>\r\n <h3>Lightning Fast</h3>\r\n <p>Powered by Vite for instant HMR</p>\r\n </div>\r\n <div className=\"feature\">\r\n <span className=\"feature-icon\">*</span>\r\n <h3>No Lock-in</h3>\r\n <p>Deploy anywhere you want</p>\r\n </div>\r\n <div className=\"feature\">\r\n <span className=\"feature-icon\">*</span>\r\n <h3>Privacy First</h3>\r\n <p>Zero telemetry, ever</p>\r\n </div>\r\n </div>\r\n \r\n <div className=\"cta\">\r\n <a href=\"https://github.com\" className=\"btn btn-primary\">Get Started</a>\r\n <a href=\"https://github.com\" className=\"btn btn-secondary\">Documentation</a>\r\n </div>\r\n </div>\r\n </main>\r\n );\r\n}\r\n`;\r\n case 'vue':\r\n return `<template>\r\n <main class=\"container\">\r\n <div class=\"hero\">\r\n <h1>\r\n <span class=\"flight-icon\">*</span>\r\n Welcome to <span class=\"gradient-text\">Flight</span>\r\n </h1>\r\n <p class=\"tagline\">The agnostic full-stack framework</p>\r\n <p class=\"subtitle\">Maximum flexibility. Zero lock-in.</p>\r\n \r\n <div class=\"features\">\r\n <div class=\"feature\">\r\n <span class=\"feature-icon\">*</span>\r\n <h3>Lightning Fast</h3>\r\n <p>Powered by Vite for instant HMR</p>\r\n </div>\r\n <div class=\"feature\">\r\n <span class=\"feature-icon\">*</span>\r\n <h3>No Lock-in</h3>\r\n <p>Deploy anywhere you want</p>\r\n </div>\r\n <div class=\"feature\">\r\n <span class=\"feature-icon\">*</span>\r\n <h3>Privacy First</h3>\r\n <p>Zero telemetry, ever</p>\r\n </div>\r\n </div>\r\n \r\n <div class=\"cta\">\r\n <a href=\"https://github.com\" class=\"btn btn-primary\">Get Started</a>\r\n <a href=\"https://github.com\" class=\"btn btn-secondary\">Documentation</a>\r\n </div>\r\n </div>\r\n </main>\r\n</template>\r\n\r\n<script setup>\r\n// Vue component logic here\r\n</script>\r\n`;\r\n case 'svelte':\r\n return `<script>\r\n // Svelte component logic here\r\n</script>\r\n\r\n<main class=\"container\">\r\n <div class=\"hero\">\r\n <h1>\r\n <span class=\"flight-icon\">*</span>\r\n Welcome to <span class=\"gradient-text\">Flight</span>\r\n </h1>\r\n <p class=\"tagline\">The agnostic full-stack framework</p>\r\n <p class=\"subtitle\">Maximum flexibility. Zero lock-in.</p>\r\n \r\n <div class=\"features\">\r\n <div class=\"feature\">\r\n <span class=\"feature-icon\">*</span>\r\n <h3>Lightning Fast</h3>\r\n <p>Powered by Vite for instant HMR</p>\r\n </div>\r\n <div class=\"feature\">\r\n <span class=\"feature-icon\">*</span>\r\n <h3>No Lock-in</h3>\r\n <p>Deploy anywhere you want</p>\r\n </div>\r\n <div class=\"feature\">\r\n <span class=\"feature-icon\">*</span>\r\n <h3>Privacy First</h3>\r\n <p>Zero telemetry, ever</p>\r\n </div>\r\n </div>\r\n \r\n <div class=\"cta\">\r\n <a href=\"https://github.com\" class=\"btn btn-primary\">Get Started</a>\r\n <a href=\"https://github.com\" class=\"btn btn-secondary\">Documentation</a>\r\n </div>\r\n </div>\r\n</main>\r\n`;\r\n default:\r\n return `export function render() {\r\n return \\`\r\n <main class=\"container\">\r\n <h1>Welcome to Flight *</h1>\r\n <p>The agnostic full-stack framework.</p>\r\n </main>\r\n \\`;\r\n}\r\n`;\r\n }\r\n}\r\n\r\nfunction createGlobalStyles(): string {\r\n return `/* Flight Framework - 2026 Modern CSS */\r\n\r\n:root {\r\n /* Colors - Dark theme by default */\r\n --color-bg: #0a0a0f;\r\n --color-bg-secondary: #12121a;\r\n --color-text: #f0f0f5;\r\n --color-text-muted: #8888a0;\r\n --color-primary: #6366f1;\r\n --color-primary-light: #818cf8;\r\n --color-secondary: #22d3ee;\r\n --color-accent: #f472b6;\r\n --color-border: #2a2a3a;\r\n \r\n /* Gradients */\r\n --gradient-primary: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);\r\n --gradient-text: linear-gradient(135deg, var(--color-primary-light) 0%, var(--color-secondary) 50%, var(--color-accent) 100%);\r\n \r\n /* Spacing */\r\n --space-xs: 0.25rem;\r\n --space-sm: 0.5rem;\r\n --space-md: 1rem;\r\n --space-lg: 2rem;\r\n --space-xl: 4rem;\r\n \r\n /* Typography */\r\n --font-sans: 'Inter', system-ui, -apple-system, sans-serif;\r\n --font-mono: 'JetBrains Mono', 'Fira Code', monospace;\r\n \r\n /* Effects */\r\n --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);\r\n --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4);\r\n --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5);\r\n --shadow-glow: 0 0 40px rgba(99, 102, 241, 0.3);\r\n \r\n /* Transitions */\r\n --transition-fast: 150ms ease;\r\n --transition-normal: 250ms ease;\r\n --transition-slow: 400ms ease;\r\n \r\n /* Border radius */\r\n --radius-sm: 0.375rem;\r\n --radius-md: 0.75rem;\r\n --radius-lg: 1rem;\r\n --radius-full: 9999px;\r\n}\r\n\r\n/* Reset */\r\n*, *::before, *::after {\r\n box-sizing: border-box;\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\nhtml {\r\n font-size: 16px;\r\n scroll-behavior: smooth;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\nbody {\r\n font-family: var(--font-sans);\r\n background: var(--color-bg);\r\n color: var(--color-text);\r\n line-height: 1.6;\r\n min-height: 100vh;\r\n}\r\n\r\n/* Typography */\r\nh1, h2, h3, h4, h5, h6 {\r\n line-height: 1.2;\r\n font-weight: 700;\r\n}\r\n\r\nh1 { font-size: clamp(2.5rem, 5vw, 4rem); }\r\nh2 { font-size: clamp(1.75rem, 3vw, 2.5rem); }\r\nh3 { font-size: clamp(1.25rem, 2vw, 1.5rem); }\r\n\r\na {\r\n color: var(--color-primary-light);\r\n text-decoration: none;\r\n transition: color var(--transition-fast);\r\n}\r\n\r\na:hover {\r\n color: var(--color-secondary);\r\n}\r\n\r\n/* Container */\r\n.container {\r\n width: 100%;\r\n max-width: 1200px;\r\n margin: 0 auto;\r\n padding: var(--space-lg);\r\n}\r\n\r\n/* Hero Section */\r\n.hero {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 100vh;\r\n text-align: center;\r\n gap: var(--space-lg);\r\n}\r\n\r\n.flight-icon {\r\n display: inline-block;\r\n font-size: 1.2em;\r\n margin-right: var(--space-sm);\r\n animation: float 3s ease-in-out infinite;\r\n}\r\n\r\n@keyframes float {\r\n 0%, 100% { transform: translateY(0) rotate(-5deg); }\r\n 50% { transform: translateY(-10px) rotate(5deg); }\r\n}\r\n\r\n.gradient-text {\r\n background: var(--gradient-text);\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n background-clip: text;\r\n}\r\n\r\n.tagline {\r\n font-size: clamp(1.25rem, 2.5vw, 1.75rem);\r\n color: var(--color-text);\r\n font-weight: 500;\r\n}\r\n\r\n.subtitle {\r\n font-size: clamp(1rem, 2vw, 1.25rem);\r\n color: var(--color-text-muted);\r\n}\r\n\r\n/* Features Grid */\r\n.features {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\r\n gap: var(--space-lg);\r\n width: 100%;\r\n max-width: 900px;\r\n margin-top: var(--space-xl);\r\n}\r\n\r\n.feature {\r\n background: var(--color-bg-secondary);\r\n border: 1px solid var(--color-border);\r\n border-radius: var(--radius-lg);\r\n padding: var(--space-lg);\r\n text-align: center;\r\n transition: all var(--transition-normal);\r\n}\r\n\r\n.feature:hover {\r\n border-color: var(--color-primary);\r\n box-shadow: var(--shadow-glow);\r\n transform: translateY(-4px);\r\n}\r\n\r\n.feature-icon {\r\n font-size: 2.5rem;\r\n display: block;\r\n margin-bottom: var(--space-md);\r\n}\r\n\r\n.feature h3 {\r\n margin-bottom: var(--space-sm);\r\n color: var(--color-text);\r\n}\r\n\r\n.feature p {\r\n color: var(--color-text-muted);\r\n font-size: 0.95rem;\r\n}\r\n\r\n/* Buttons */\r\n.cta {\r\n display: flex;\r\n gap: var(--space-md);\r\n margin-top: var(--space-xl);\r\n flex-wrap: wrap;\r\n justify-content: center;\r\n}\r\n\r\n.btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--space-md) var(--space-lg);\r\n font-size: 1rem;\r\n font-weight: 600;\r\n border-radius: var(--radius-md);\r\n border: none;\r\n cursor: pointer;\r\n transition: all var(--transition-fast);\r\n text-decoration: none;\r\n}\r\n\r\n.btn-primary {\r\n background: var(--gradient-primary);\r\n color: white;\r\n box-shadow: var(--shadow-md);\r\n}\r\n\r\n.btn-primary:hover {\r\n transform: translateY(-2px);\r\n box-shadow: var(--shadow-lg), var(--shadow-glow);\r\n color: white;\r\n}\r\n\r\n.btn-secondary {\r\n background: transparent;\r\n color: var(--color-text);\r\n border: 1px solid var(--color-border);\r\n}\r\n\r\n.btn-secondary:hover {\r\n border-color: var(--color-primary);\r\n color: var(--color-primary-light);\r\n}\r\n\r\n/* Responsive */\r\n@media (max-width: 768px) {\r\n .container {\r\n padding: var(--space-md);\r\n }\r\n \r\n .hero {\r\n padding: var(--space-lg) 0;\r\n }\r\n \r\n .features {\r\n grid-template-columns: 1fr;\r\n }\r\n}\r\n\r\n/* Dark mode is default, but support light mode */\r\n@media (prefers-color-scheme: light) {\r\n :root {\r\n --color-bg: #fafafa;\r\n --color-bg-secondary: #ffffff;\r\n --color-text: #1a1a2e;\r\n --color-text-muted: #64648a;\r\n --color-border: #e0e0e8;\r\n --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.08);\r\n --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.12);\r\n --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.16);\r\n --shadow-glow: 0 0 40px rgba(99, 102, 241, 0.15);\r\n }\r\n}\r\n`;\r\n}\r\n\r\n\r\n","/**\r\n * Flight CLI - Dev Command (SSR Enhanced)\r\n * \r\n * Start the development server with:\r\n * - Server-Side Rendering (renderToPipeableStream)\r\n * - Vite for HMR and asset transformation\r\n * - @flight/http integration\r\n */\r\n\r\nimport { resolve, join } from 'node:path';\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface DevOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n https?: boolean;\r\n ssr?: boolean;\r\n}\r\n\r\nexport async function devCommand(options: DevOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight development server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n // Merge CLI options with config\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? config.dev.open;\r\n\r\n // Check if SSR mode is enabled\r\n const ssrEnabled = options.ssr ?? config.rendering?.default === 'ssr';\r\n const entryServerPath = join(root, 'src', 'entry-server.tsx');\r\n const hasSSREntry = existsSync(entryServerPath);\r\n\r\n // Dynamic import vite to avoid bundling issues\r\n const { createServer: createViteServer } = await import('vite');\r\n\r\n // Try to import Flight HTTP and file router\r\n let flightHttpAvailable = false;\r\n let flightRouterAvailable = false;\r\n\r\n try {\r\n await import('@flight/http');\r\n flightHttpAvailable = true;\r\n } catch {\r\n // @flight/http not installed\r\n }\r\n\r\n try {\r\n await import('@flight/core/file-router');\r\n flightRouterAvailable = true;\r\n } catch {\r\n // file-router not available\r\n }\r\n\r\n // Create Vite dev server in middleware mode for SSR\r\n const vite = await createViteServer({\r\n root,\r\n mode: 'development',\r\n server: {\r\n middlewareMode: ssrEnabled && hasSSREntry,\r\n port: ssrEnabled && hasSSREntry ? undefined : port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open: ssrEnabled && hasSSREntry ? false : open,\r\n https: options.https ? {} : undefined,\r\n },\r\n appType: ssrEnabled && hasSSREntry ? 'custom' : 'spa',\r\n plugins: [\r\n // Add Flight plugin when @flight/http is available\r\n flightHttpAvailable ? flightDevPlugin(root) : null,\r\n ].filter(Boolean),\r\n });\r\n\r\n // SSR Mode with custom server\r\n if (ssrEnabled && hasSSREntry) {\r\n await startSSRServer(vite, root, port, host);\r\n } else {\r\n // CSR Mode - standard Vite server\r\n await vite.listen();\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const isSSR = ssrEnabled && hasSSREntry;\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight dev server ready in ${pc.bold(elapsed + 'ms')}\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://${getNetworkAddress()}:${port}/`)}` : ''}\r\n \r\n ${isSSR ? pc.green('✓') : pc.yellow('○')} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}\r\n ${flightHttpAvailable ? pc.green('✓') : pc.yellow('○')} @flight/http ${flightHttpAvailable ? 'enabled' : 'not installed'}\r\n ${flightRouterAvailable ? pc.green('✓') : pc.yellow('○')} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}\r\n\r\n ${pc.dim('press')} ${pc.bold('h')} ${pc.dim('to show help')}\r\n`);\r\n\r\n // Handle server shortcuts\r\n if (!isSSR) {\r\n vite.bindCLIShortcuts({ print: true });\r\n }\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start dev server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Start SSR server with Vite middleware and file-based page routing\r\n */\r\nasync function startSSRServer(\r\n vite: any,\r\n root: string,\r\n port: number,\r\n host: string | boolean\r\n): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n // Try to load file-based page router\r\n let pageRouter: any = null;\r\n try {\r\n const { createFileRouter } = await import('@flight/core/file-router');\r\n pageRouter = await createFileRouter({\r\n directory: join(root, 'src', 'routes'),\r\n extensions: ['.tsx', '.ts', '.jsx', '.js']\r\n });\r\n console.log(pc.green(` ✓ Page router loaded: ${pageRouter.routes.filter((r: any) => r.type === 'page').length} pages`));\r\n } catch {\r\n // File router not available, use entry-server only\r\n }\r\n\r\n // Create a simple connect-like middleware handler\r\n const server = createHttpServer(async (req, res) => {\r\n const url = req.url || '/';\r\n const pathname = url.split('?')[0];\r\n\r\n // Let Vite handle HMR and static assets\r\n if (url.startsWith('/@') ||\r\n url.startsWith('/node_modules') ||\r\n (url.startsWith('/src') && !url.includes('entry-server'))) {\r\n vite.middlewares(req, res);\r\n return;\r\n }\r\n\r\n try {\r\n // 1. Read index.html template\r\n let template = readFileSync(\r\n join(root, 'index.html'),\r\n 'utf-8'\r\n );\r\n\r\n // 2. Apply Vite HTML transforms (HMR client injection)\r\n template = await vite.transformIndexHtml(url, template);\r\n\r\n let appHtml = '';\r\n\r\n // 3. Try file-based page routing first\r\n if (pageRouter) {\r\n const pageRoute = pageRouter.routes.find((r: any) =>\r\n r.type === 'page' && matchRoute(r.path, pathname)\r\n );\r\n\r\n if (pageRoute && pageRoute.component) {\r\n // Load component via Vite for HMR\r\n const mod = await vite.ssrLoadModule(pageRoute.filePath.replace(root, ''));\r\n const Component = mod.default;\r\n\r\n // Get render function for the UI framework\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n\r\n if (typeof render === 'function' && Component) {\r\n appHtml = await render(url, { Component });\r\n }\r\n }\r\n }\r\n\r\n // 4. Fallback to entry-server.tsx if no page matched\r\n if (!appHtml) {\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n if (typeof render === 'function') {\r\n appHtml = await render(url);\r\n }\r\n }\r\n\r\n // 5. Inject rendered app into template\r\n if (appHtml) {\r\n const html = template.replace('<!--ssr-outlet-->', appHtml);\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(html);\r\n } else {\r\n // Fallback to CSR if no render\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(template);\r\n }\r\n\r\n } catch (e: any) {\r\n // Fix Vite stack trace\r\n vite.ssrFixStacktrace(e);\r\n console.error(pc.red('[SSR Error]'), e.stack);\r\n\r\n if (!res.headersSent) {\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end(`SSR Error: ${e.message}\\n\\n${e.stack}`);\r\n }\r\n }\r\n });\r\n\r\n const listenHost = host === true ? '0.0.0.0' : (host || 'localhost');\r\n\r\n server.listen(port, listenHost as string, () => {\r\n console.log(pc.green(` ✓ SSR server listening`));\r\n });\r\n}\r\n\r\n/**\r\n * Flight development plugin for Vite\r\n */\r\nfunction flightDevPlugin(root: string) {\r\n return {\r\n name: 'flight:dev',\r\n\r\n configureServer(server: any) {\r\n // Add middleware to handle Flight API routes\r\n server.middlewares.use(async (req: any, res: any, next: any) => {\r\n const url = req.url || '/';\r\n\r\n // Handle Flight action requests\r\n if (url.startsWith('/__flight_action/')) {\r\n try {\r\n const { handleActionRequest } = await import('@flight/core');\r\n\r\n // Convert Node request to Web Request\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await handleActionRequest(webRequest);\r\n\r\n // Write response\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n } catch (error) {\r\n console.error('[Flight] Action error:', error);\r\n res.statusCode = 500;\r\n res.end(JSON.stringify({ error: 'Internal server error' }));\r\n }\r\n return;\r\n }\r\n\r\n // Handle API routes from file-router\r\n if (url.startsWith('/api/')) {\r\n try {\r\n const { createFileRouter } = await import('@flight/core/file-router');\r\n const routesDir = join(root, 'src', 'routes');\r\n\r\n const router = await createFileRouter({ directory: routesDir });\r\n const route = router.routes.find(r => {\r\n // Simple path matching (production would use radix matching)\r\n return matchPath(r.path, url);\r\n });\r\n\r\n if (route && route.handler) {\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await route.handler({ req: webRequest, params: {} });\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n return;\r\n }\r\n } catch (error) {\r\n // File router not set up, continue to next middleware\r\n }\r\n }\r\n\r\n next();\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Convert Node.js request to Web Standard Request\r\n */\r\nasync function nodeToWebRequest(req: any): Promise<Request> {\r\n const host = req.headers.host || 'localhost';\r\n const protocol = 'http';\r\n const url = new URL(req.url || '/', `${protocol}://${host}`);\r\n\r\n let body: BodyInit | null = null;\r\n\r\n if (req.method !== 'GET' && req.method !== 'HEAD') {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of req) {\r\n chunks.push(chunk);\r\n }\r\n body = Buffer.concat(chunks);\r\n }\r\n\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n if (Array.isArray(value)) {\r\n for (const v of value) {\r\n headers.append(key, v);\r\n }\r\n } else {\r\n headers.set(key, value as string);\r\n }\r\n }\r\n }\r\n\r\n return new Request(url.toString(), {\r\n method: req.method || 'GET',\r\n headers,\r\n body,\r\n });\r\n}\r\n\r\n/**\r\n * Simple path matching\r\n */\r\nfunction matchPath(pattern: string, path: string): boolean {\r\n // Remove query string\r\n const cleanPath = path.split('?')[0];\r\n\r\n // Convert pattern params to regex\r\n const regexPattern = pattern\r\n .replace(/:\\w+/g, '[^/]+')\r\n .replace(/\\*/g, '.*');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(cleanPath || '/');\r\n}\r\n\r\nfunction getNetworkAddress(): string {\r\n try {\r\n const { networkInterfaces } = require('os');\r\n const nets = networkInterfaces();\r\n\r\n for (const name of Object.keys(nets)) {\r\n for (const net of nets[name]) {\r\n if (net.family === 'IPv4' && !net.internal) {\r\n return net.address;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore\r\n }\r\n return '0.0.0.0';\r\n}\r\n\r\n","export { defineConfig, findConfigFile, loadConfig, resolveConfig } from '../chunk-WAGCTWGY.js';\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","/**\r\n * Flight CLI - Build Command\r\n * \r\n * Build for production.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface BuildOptions {\r\n outDir?: string;\r\n sourcemap?: boolean;\r\n minify?: boolean;\r\n}\r\n\r\nexport async function buildCommand(options: BuildOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Building Flight project for production...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const outDir = options.outDir ?? config.build.outDir;\r\n const sourcemap = options.sourcemap ?? config.build.sourcemap;\r\n const minify = options.minify ?? config.build.minify;\r\n\r\n // Dynamic import vite\r\n const { build } = await import('vite');\r\n\r\n console.log(pc.dim(`Output directory: ${outDir}`));\r\n console.log(pc.dim(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`));\r\n console.log(pc.dim(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`));\r\n\r\n // Client build\r\n console.log(pc.cyan('Building client...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/client`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n rollupOptions: {\r\n input: resolve(root, 'index.html'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Client build complete');\r\n\r\n // SSR build (if applicable)\r\n if (config.rendering.default !== 'csr') {\r\n console.log(pc.cyan('\\nBuilding server...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/server`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n ssr: true,\r\n rollupOptions: {\r\n input: resolve(root, config.build.srcDir, 'entry-server.ts'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Server build complete');\r\n }\r\n\r\n // Run adapter if configured\r\n if (config.adapter) {\r\n console.log(pc.cyan(`\\nRunning ${config.adapter.name} adapter...`));\r\n // TODO: Implement adapter execution\r\n console.log(pc.green('✓') + ` ${config.adapter.name} adapter complete`);\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\r\n\r\n console.log(`\r\n${pc.green('[OK] Build complete!')} ${pc.dim(`(${elapsedSeconds}s)`)}\r\n\r\n${pc.cyan('Output:')} ${resolve(root, outDir)}\r\n\r\n${pc.dim('To preview the build:')}\r\n ${pc.dim('$')} flight preview\r\n\r\n${pc.dim('To deploy:')}\r\n ${pc.dim('•')} Upload ${outDir}/ to your server\r\n ${pc.dim('•')} Or use your configured adapter\r\n`);\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nBuild failed:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Preview Command\r\n * \r\n * Preview production build locally.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface PreviewOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n}\r\n\r\nexport async function previewCommand(options: PreviewOptions): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight preview server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port + 1;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? false;\r\n\r\n // Dynamic import vite\r\n const { preview } = await import('vite');\r\n\r\n const server = await preview({\r\n root,\r\n preview: {\r\n port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open,\r\n },\r\n build: {\r\n outDir: config.build.outDir,\r\n },\r\n });\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight preview server ready\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://0.0.0.0:${port}/`)}` : ''}\r\n\r\n ${pc.dim('This is a preview of your production build.')}\r\n ${pc.dim('For development, use')} ${pc.bold('flight dev')}\r\n`);\r\n\r\n // Keep server running\r\n server.printUrls();\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start preview server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI Binary Entry Point\r\n */\r\n\r\nimport { run } from './index.js';\r\n\r\nrun();\r\n"],"mappings":"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","names":["existsSync","join","error","cookies","createRadixRouter","error","join","error","error","redirect","resolve","error","error","cookies","redirect","isRedirectError","cached","createRouter","createRadixNode","insert","lookup","remove","getNodeType","NODE_TYPES","createServer","createRouter2","error","resolve","VERSION","pc","error","resolve","join","existsSync","pc","pc","resolve","join","existsSync","error","createFileRouter","handleActionRequest","resolve","pc","pc","resolve","error","resolve","pc","pc","resolve","error","pc","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/version.ts","../src/commands/create.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/preview.ts","../src/bin.ts"],"sourcesContent":["/**\r\n * Flight CLI - Command-line interface\r\n */\r\n\r\nimport { cac } from 'cac';\r\nimport pc from 'picocolors';\r\nimport { VERSION } from './version.js';\r\nimport { createCommand } from './commands/create.js';\r\nimport { devCommand } from './commands/dev.js';\r\nimport { buildCommand } from './commands/build.js';\r\nimport { previewCommand } from './commands/preview.js';\r\n\r\nconst cli = cac('flight');\r\n\r\n// Logo\r\nconst LOGO = `\r\n${pc.cyan(' ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗')}\r\n${pc.cyan(' ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝')}\r\n${pc.cyan(' █████╗ ██║ ██║██║ ███╗███████║ ██║ ')}\r\n${pc.cyan(' ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ ')}\r\n${pc.cyan(' ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ ')}\r\n${pc.cyan(' ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ')}\r\n \r\n ${pc.dim('The Agnostic Full-Stack Framework')}\r\n ${pc.dim('Maximum Flexibility. Zero Lock-in.')}\r\n`;\r\n\r\nexport function printLogo(): void {\r\n console.log(LOGO);\r\n}\r\n\r\n// Version\r\ncli.version(VERSION);\r\ncli.help();\r\n\r\n// Commands\r\ncli\r\n .command('create [name]', 'Create a new Flight project')\r\n .option('-t, --template <template>', 'Project template to use', { default: 'basic' })\r\n .option('--ui <framework>', 'UI framework (react, vue, svelte, solid, vanilla)')\r\n .option('--ts', 'Use TypeScript', { default: true })\r\n .option('--git', 'Initialize git repository', { default: true })\r\n .option('--install', 'Install dependencies', { default: true })\r\n .action(createCommand);\r\n\r\ncli\r\n .command('dev', 'Start development server')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .option('--https', 'Enable HTTPS')\r\n .option('--ssr', 'Enable Server-Side Rendering')\r\n .action(devCommand);\r\n\r\ncli\r\n .command('build', 'Build for production')\r\n .option('--outDir <dir>', 'Output directory')\r\n .option('--sourcemap', 'Generate source maps')\r\n .option('--minify', 'Minify output', { default: true })\r\n .action(buildCommand);\r\n\r\ncli\r\n .command('preview', 'Preview production build')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .action(previewCommand);\r\n\r\n// Parse and run\r\nexport function run(): void {\r\n try {\r\n cli.parse(process.argv, { run: false });\r\n\r\n // Show logo for help\r\n if (cli.options.help || process.argv.length <= 2) {\r\n printLogo();\r\n }\r\n\r\n cli.runMatchedCommand();\r\n } catch (error) {\r\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { VERSION };\r\n","export const VERSION = '0.0.1';\r\n","/**\r\n * Flight CLI - Create Command\r\n * \r\n * Scaffold a new Flight project using external templates.\r\n * Follows 2026 best practices: external templates, minimal CLI logic.\r\n */\r\n\r\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, copyFileSync, statSync, unlinkSync } from 'node:fs';\r\nimport { join, resolve, dirname } from 'node:path';\r\nimport { execSync } from 'node:child_process';\r\nimport { fileURLToPath } from 'node:url';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport { printLogo } from '../index.js';\r\n\r\nconst __dirname = dirname(fileURLToPath(import.meta.url));\r\nconst TEMPLATES_DIR = resolve(__dirname, '../../templates');\r\n\r\ninterface CreateOptions {\r\n template: string;\r\n ui?: string;\r\n ts: boolean;\r\n git: boolean;\r\n install: boolean;\r\n}\r\n\r\nconst UI_FRAMEWORKS = [\r\n { title: 'React', value: 'react', description: 'The library for web and native user interfaces' },\r\n { title: 'Vue', value: 'vue', description: 'The progressive JavaScript framework' },\r\n { title: 'Svelte', value: 'svelte', description: 'Cybernetically enhanced web apps' },\r\n { title: 'Solid', value: 'solid', description: 'Simple and performant reactivity' },\r\n { title: 'Preact', value: 'preact', description: 'Fast 3kB alternative to React' },\r\n { title: 'Qwik', value: 'qwik', description: 'Resumable framework with O(1) loading' },\r\n { title: 'Lit', value: 'lit', description: 'Fast, lightweight Web Components' },\r\n { title: 'Htmx', value: 'htmx', description: 'HTML over the wire, no JavaScript' },\r\n { title: 'Vanilla', value: 'vanilla', description: 'No framework, just TypeScript' },\r\n];\r\n\r\nexport async function createCommand(\r\n name: string | undefined,\r\n options: CreateOptions\r\n): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Creating a new Flight project...\\n'));\r\n\r\n // Interactive prompts\r\n let projectName = name;\r\n let uiFramework = options.ui;\r\n\r\n if (!projectName) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: 'Project name:',\r\n initial: 'my-flight-app',\r\n validate: (value: string) => {\r\n if (!value) return 'Project name is required';\r\n if (!/^[a-z0-9-_]+$/i.test(value)) return 'Invalid project name';\r\n return true;\r\n },\r\n });\r\n projectName = response.name;\r\n }\r\n\r\n if (!projectName) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n if (!uiFramework) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'ui',\r\n message: 'Choose your UI framework:',\r\n choices: UI_FRAMEWORKS,\r\n initial: 0,\r\n });\r\n uiFramework = response.ui;\r\n }\r\n\r\n if (!uiFramework) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n const projectPath = resolve(process.cwd(), projectName);\r\n\r\n // Check if directory exists and is not empty\r\n if (existsSync(projectPath)) {\r\n const files = readdirSync(projectPath);\r\n if (files.length > 0) {\r\n const response = await prompts({\r\n type: 'confirm',\r\n name: 'overwrite',\r\n message: `Directory ${projectName} is not empty. Continue anyway?`,\r\n initial: false,\r\n });\r\n if (!response.overwrite) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n }\r\n }\r\n\r\n console.log(pc.dim(`\\nCreating project in ${projectPath}...\\n`));\r\n\r\n try {\r\n // Copy templates\r\n copyTemplate(projectPath, uiFramework, projectName);\r\n console.log(pc.green('✓') + ' Project structure created');\r\n\r\n // Initialize git\r\n if (options.git) {\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n console.log(pc.green('✓') + ' Git repository initialized');\r\n } catch {\r\n console.log(pc.yellow('[!]') + ' Could not initialize git repository');\r\n }\r\n }\r\n\r\n // Install dependencies\r\n if (options.install) {\r\n console.log(pc.dim('\\nInstalling dependencies...\\n'));\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n console.log(pc.green('\\n✓') + ' Dependencies installed');\r\n } catch {\r\n console.log(pc.yellow('\\n[!]') + ' Could not install dependencies. Run `npm install` manually.');\r\n }\r\n }\r\n\r\n // Success message\r\n console.log(`\r\n${pc.green('[OK] Project created successfully!')}\r\n\r\n${pc.cyan('Next steps:')}\r\n\r\n ${pc.dim('$')} cd ${projectName}\r\n ${pc.dim('$')} ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\n${pc.dim('Your project is 100% yours:')}\r\n ${pc.dim('•')} No telemetry\r\n ${pc.dim('•')} No lock-in\r\n ${pc.dim('•')} Deploy anywhere\r\n\r\n${pc.cyan('Happy flying!')}\r\n`);\r\n } catch (error) {\r\n console.error(pc.red('Failed to create project:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction detectPackageManager(): string {\r\n if (process.env.npm_config_user_agent?.includes('pnpm')) return 'pnpm';\r\n if (process.env.npm_config_user_agent?.includes('yarn')) return 'yarn';\r\n if (process.env.npm_config_user_agent?.includes('bun')) return 'bun';\r\n return 'npm';\r\n}\r\n\r\n/**\r\n * Copy template files to project directory\r\n */\r\nfunction copyTemplate(projectPath: string, ui: string, projectName: string): void {\r\n const baseDir = join(TEMPLATES_DIR, 'base');\r\n const uiDir = join(TEMPLATES_DIR, ui);\r\n\r\n // Ensure directories exist\r\n mkdirSync(projectPath, { recursive: true });\r\n mkdirSync(join(projectPath, 'src'), { recursive: true });\r\n mkdirSync(join(projectPath, 'src/styles'), { recursive: true });\r\n mkdirSync(join(projectPath, 'public'), { recursive: true });\r\n\r\n // Variables for template substitution\r\n const vars = {\r\n '{{PROJECT_NAME}}': projectName,\r\n '{{UI_FRAMEWORK}}': ui,\r\n '{{LANGUAGE}}': 'TypeScript',\r\n };\r\n\r\n // Copy base files\r\n copyDirWithTemplates(baseDir, projectPath, vars);\r\n\r\n // Copy UI-specific files (override base if needed)\r\n copyDirWithTemplates(uiDir, projectPath, vars);\r\n\r\n // Rename special files\r\n const gitignoreSrc = join(projectPath, '_gitignore');\r\n const gitignoreDest = join(projectPath, '.gitignore');\r\n if (existsSync(gitignoreSrc)) {\r\n copyFileSync(gitignoreSrc, gitignoreDest);\r\n unlinkSync(gitignoreSrc);\r\n }\r\n}\r\n\r\n/**\r\n * Recursively copy directory, processing .template files\r\n */\r\nfunction copyDirWithTemplates(\r\n srcDir: string,\r\n destDir: string,\r\n vars: Record<string, string>\r\n): void {\r\n if (!existsSync(srcDir)) return;\r\n\r\n const entries = readdirSync(srcDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const srcPath = join(srcDir, entry.name);\r\n let destName = entry.name;\r\n let isTemplate = false;\r\n\r\n // Handle .template extension\r\n if (destName.endsWith('.template')) {\r\n destName = destName.replace('.template', '');\r\n isTemplate = true;\r\n }\r\n\r\n const destPath = join(destDir, destName);\r\n\r\n if (entry.isDirectory()) {\r\n mkdirSync(destPath, { recursive: true });\r\n copyDirWithTemplates(srcPath, destPath, vars);\r\n } else {\r\n let content = readFileSync(srcPath, 'utf-8');\r\n\r\n // Apply template substitutions\r\n if (isTemplate || destName.endsWith('.json') || destName.endsWith('.html') || destName.endsWith('.md')) {\r\n for (const [key, value] of Object.entries(vars)) {\r\n content = content.replaceAll(key, value);\r\n }\r\n }\r\n\r\n writeFileSync(destPath, content);\r\n }\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Dev Command (SSR Enhanced)\r\n * \r\n * Start the development server with:\r\n * - Server-Side Rendering (renderToPipeableStream)\r\n * - Vite for HMR and asset transformation\r\n * - @flight-framework/http integration\r\n */\r\n\r\nimport { resolve, join } from 'node:path';\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface DevOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n https?: boolean;\r\n ssr?: boolean;\r\n}\r\n\r\nexport async function devCommand(options: DevOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight development server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n // Merge CLI options with config\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? config.dev.open;\r\n\r\n // Check if SSR mode is enabled\r\n const ssrEnabled = options.ssr ?? config.rendering?.default === 'ssr';\r\n const entryServerPath = join(root, 'src', 'entry-server.tsx');\r\n const hasSSREntry = existsSync(entryServerPath);\r\n\r\n // Dynamic import vite to avoid bundling issues\r\n const { createServer: createViteServer } = await import('vite');\r\n\r\n // Try to import Flight HTTP and file router\r\n let flightHttpAvailable = false;\r\n let flightRouterAvailable = false;\r\n\r\n try {\r\n await import('@flight-framework/http');\r\n flightHttpAvailable = true;\r\n } catch {\r\n // @flight-framework/http not installed\r\n }\r\n\r\n try {\r\n await import('@flight-framework/core/file-router');\r\n flightRouterAvailable = true;\r\n } catch {\r\n // file-router not available\r\n }\r\n\r\n // Create Vite dev server in middleware mode for SSR\r\n const vite = await createViteServer({\r\n root,\r\n mode: 'development',\r\n server: {\r\n middlewareMode: ssrEnabled && hasSSREntry,\r\n port: ssrEnabled && hasSSREntry ? undefined : port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open: ssrEnabled && hasSSREntry ? false : open,\r\n https: options.https ? {} : undefined,\r\n },\r\n appType: ssrEnabled && hasSSREntry ? 'custom' : 'spa',\r\n plugins: [\r\n // Add Flight plugin when @flight-framework/http is available\r\n flightHttpAvailable ? flightDevPlugin(root) : null,\r\n ].filter(Boolean),\r\n });\r\n\r\n // SSR Mode with custom server\r\n if (ssrEnabled && hasSSREntry) {\r\n await startSSRServer(vite, root, port, host);\r\n } else {\r\n // CSR Mode - standard Vite server\r\n await vite.listen();\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const isSSR = ssrEnabled && hasSSREntry;\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight dev server ready in ${pc.bold(elapsed + 'ms')}\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://${getNetworkAddress()}:${port}/`)}` : ''}\r\n \r\n ${isSSR ? pc.green('✓') : pc.yellow('○')} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}\r\n ${flightHttpAvailable ? pc.green('✓') : pc.yellow('○')} @flight-framework/http ${flightHttpAvailable ? 'enabled' : 'not installed'}\r\n ${flightRouterAvailable ? pc.green('✓') : pc.yellow('○')} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}\r\n\r\n ${pc.dim('press')} ${pc.bold('h')} ${pc.dim('to show help')}\r\n`);\r\n\r\n // Handle server shortcuts\r\n if (!isSSR) {\r\n vite.bindCLIShortcuts({ print: true });\r\n }\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start dev server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Start SSR server with Vite middleware and file-based page routing\r\n */\r\nasync function startSSRServer(\r\n vite: any,\r\n root: string,\r\n port: number,\r\n host: string | boolean\r\n): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n // Try to load file-based page router\r\n let pageRouter: any = null;\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n pageRouter = await createFileRouter({\r\n directory: join(root, 'src', 'routes'),\r\n extensions: ['.tsx', '.ts', '.jsx', '.js']\r\n });\r\n console.log(pc.green(` ✓ Page router loaded: ${pageRouter.routes.filter((r: any) => r.type === 'page').length} pages`));\r\n } catch {\r\n // File router not available, use entry-server only\r\n }\r\n\r\n // Create a simple connect-like middleware handler\r\n const server = createHttpServer(async (req, res) => {\r\n const url = req.url || '/';\r\n const pathname = url.split('?')[0];\r\n\r\n // Let Vite handle HMR and static assets\r\n if (url.startsWith('/@') ||\r\n url.startsWith('/node_modules') ||\r\n (url.startsWith('/src') && !url.includes('entry-server'))) {\r\n vite.middlewares(req, res);\r\n return;\r\n }\r\n\r\n try {\r\n // 1. Read index.html template\r\n let template = readFileSync(\r\n join(root, 'index.html'),\r\n 'utf-8'\r\n );\r\n\r\n // 2. Apply Vite HTML transforms (HMR client injection)\r\n template = await vite.transformIndexHtml(url, template);\r\n\r\n let appHtml = '';\r\n\r\n // 3. Try file-based page routing first\r\n if (pageRouter) {\r\n const pageRoute = pageRouter.routes.find((r: any) =>\r\n r.type === 'page' && matchPath(r.path, pathname)\r\n );\r\n\r\n if (pageRoute && pageRoute.component) {\r\n // Load component via Vite for HMR\r\n const mod = await vite.ssrLoadModule(pageRoute.filePath.replace(root, ''));\r\n const Component = mod.default;\r\n\r\n // Get render function for the UI framework\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n\r\n if (typeof render === 'function' && Component) {\r\n appHtml = await render(url, { Component });\r\n }\r\n }\r\n }\r\n\r\n // 4. Fallback to entry-server.tsx if no page matched\r\n if (!appHtml) {\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n if (typeof render === 'function') {\r\n appHtml = await render(url);\r\n }\r\n }\r\n\r\n // 5. Inject rendered app into template\r\n if (appHtml) {\r\n const html = template.replace('<!--ssr-outlet-->', appHtml);\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(html);\r\n } else {\r\n // Fallback to CSR if no render\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(template);\r\n }\r\n\r\n } catch (e: any) {\r\n // Fix Vite stack trace\r\n vite.ssrFixStacktrace(e);\r\n console.error(pc.red('[SSR Error]'), e.stack);\r\n\r\n if (!res.headersSent) {\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end(`SSR Error: ${e.message}\\n\\n${e.stack}`);\r\n }\r\n }\r\n });\r\n\r\n const listenHost = host === true ? '0.0.0.0' : (host || 'localhost');\r\n\r\n server.listen(port, listenHost as string, () => {\r\n console.log(pc.green(` ✓ SSR server listening`));\r\n });\r\n}\r\n\r\n/**\r\n * Flight development plugin for Vite\r\n */\r\nfunction flightDevPlugin(root: string) {\r\n return {\r\n name: 'flight:dev',\r\n\r\n configureServer(server: any) {\r\n // Add middleware to handle Flight API routes\r\n server.middlewares.use(async (req: any, res: any, next: any) => {\r\n const url = req.url || '/';\r\n\r\n // Handle Flight action requests\r\n if (url.startsWith('/__flight_action/')) {\r\n try {\r\n const { handleActionRequest } = await import('@flight-framework/core');\r\n\r\n // Convert Node request to Web Request\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await handleActionRequest(webRequest);\r\n\r\n // Write response\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n } catch (error) {\r\n console.error('[Flight] Action error:', error);\r\n res.statusCode = 500;\r\n res.end(JSON.stringify({ error: 'Internal server error' }));\r\n }\r\n return;\r\n }\r\n\r\n // Handle API routes from file-router\r\n if (url.startsWith('/api/')) {\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n const routesDir = join(root, 'src', 'routes');\r\n\r\n const router = await createFileRouter({ directory: routesDir });\r\n const route = router.routes.find(r => {\r\n // Simple path matching (production would use radix matching)\r\n return matchPath(r.path, url);\r\n });\r\n\r\n if (route && route.handler) {\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await route.handler({ req: webRequest, params: {} });\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n return;\r\n }\r\n } catch (error) {\r\n // File router not set up, continue to next middleware\r\n }\r\n }\r\n\r\n next();\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Convert Node.js request to Web Standard Request\r\n */\r\nasync function nodeToWebRequest(req: any): Promise<Request> {\r\n const host = req.headers.host || 'localhost';\r\n const protocol = 'http';\r\n const url = new URL(req.url || '/', `${protocol}://${host}`);\r\n\r\n let body: BodyInit | null = null;\r\n\r\n if (req.method !== 'GET' && req.method !== 'HEAD') {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of req) {\r\n chunks.push(chunk);\r\n }\r\n body = Buffer.concat(chunks);\r\n }\r\n\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n if (Array.isArray(value)) {\r\n for (const v of value) {\r\n headers.append(key, v);\r\n }\r\n } else {\r\n headers.set(key, value as string);\r\n }\r\n }\r\n }\r\n\r\n return new Request(url.toString(), {\r\n method: req.method || 'GET',\r\n headers,\r\n body,\r\n });\r\n}\r\n\r\n/**\r\n * Simple path matching\r\n */\r\nfunction matchPath(pattern: string, path: string): boolean {\r\n // Remove query string\r\n const cleanPath = path.split('?')[0];\r\n\r\n // Convert pattern params to regex\r\n const regexPattern = pattern\r\n .replace(/:\\w+/g, '[^/]+')\r\n .replace(/\\*/g, '.*');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(cleanPath || '/');\r\n}\r\n\r\nfunction getNetworkAddress(): string {\r\n try {\r\n const { networkInterfaces } = require('os');\r\n const nets = networkInterfaces();\r\n\r\n for (const name of Object.keys(nets)) {\r\n for (const net of nets[name]) {\r\n if (net.family === 'IPv4' && !net.internal) {\r\n return net.address;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore\r\n }\r\n return '0.0.0.0';\r\n}\r\n\r\n","/**\r\n * Flight CLI - Build Command\r\n * \r\n * Build for production.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface BuildOptions {\r\n outDir?: string;\r\n sourcemap?: boolean;\r\n minify?: boolean;\r\n}\r\n\r\nexport async function buildCommand(options: BuildOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Building Flight project for production...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const outDir = options.outDir ?? config.build.outDir;\r\n const sourcemap = options.sourcemap ?? config.build.sourcemap;\r\n const minify = options.minify ?? config.build.minify;\r\n\r\n // Dynamic import vite\r\n const { build } = await import('vite');\r\n\r\n console.log(pc.dim(`Output directory: ${outDir}`));\r\n console.log(pc.dim(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`));\r\n console.log(pc.dim(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`));\r\n\r\n // Client build\r\n console.log(pc.cyan('Building client...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/client`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n rollupOptions: {\r\n input: resolve(root, 'index.html'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Client build complete');\r\n\r\n // SSR build (if applicable)\r\n if (config.rendering.default !== 'csr') {\r\n console.log(pc.cyan('\\nBuilding server...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/server`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n ssr: true,\r\n rollupOptions: {\r\n input: resolve(root, config.build.srcDir, 'entry-server.ts'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Server build complete');\r\n }\r\n\r\n // Run adapter if configured\r\n if (config.adapter) {\r\n console.log(pc.cyan(`\\nRunning ${config.adapter.name} adapter...`));\r\n // TODO: Implement adapter execution\r\n console.log(pc.green('✓') + ` ${config.adapter.name} adapter complete`);\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\r\n\r\n console.log(`\r\n${pc.green('[OK] Build complete!')} ${pc.dim(`(${elapsedSeconds}s)`)}\r\n\r\n${pc.cyan('Output:')} ${resolve(root, outDir)}\r\n\r\n${pc.dim('To preview the build:')}\r\n ${pc.dim('$')} flight preview\r\n\r\n${pc.dim('To deploy:')}\r\n ${pc.dim('•')} Upload ${outDir}/ to your server\r\n ${pc.dim('•')} Or use your configured adapter\r\n`);\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nBuild failed:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Preview Command\r\n * \r\n * Preview production build locally.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface PreviewOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n}\r\n\r\nexport async function previewCommand(options: PreviewOptions): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight preview server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port + 1;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? false;\r\n\r\n // Dynamic import vite\r\n const { preview } = await import('vite');\r\n\r\n const server = await preview({\r\n root,\r\n preview: {\r\n port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open,\r\n },\r\n build: {\r\n outDir: config.build.outDir,\r\n },\r\n });\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight preview server ready\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://0.0.0.0:${port}/`)}` : ''}\r\n\r\n ${pc.dim('This is a preview of your production build.')}\r\n ${pc.dim('For development, use')} ${pc.bold('flight dev')}\r\n`);\r\n\r\n // Keep server running\r\n server.printUrls();\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start preview server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI Binary Entry Point\r\n */\r\n\r\nimport { run } from './index.js';\r\n\r\nrun();\r\n"],"mappings":"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","names":["pc","resolve","join","readFileSync","existsSync","pc","pc","resolve","join","existsSync","readFileSync","resolve","pc","loadConfig","pc","resolve","loadConfig","resolve","pc","loadConfig","pc","resolve","loadConfig","pc"]}
|