@flight-framework/cli 0.4.4 → 0.4.5

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/version.ts","../src/commands/create.ts","../src/commands/dev.ts","../src/generators/typegen.ts","../src/commands/build.ts","../src/commands/preview.ts","../src/commands/routes-generate.ts","../src/generators/routes.ts","../src/commands/types-generate.ts","../src/commands/add.ts","../src/commands/adapter-create.ts","../src/bin.ts"],"sourcesContent":["/**\r\n * Flight CLI - Command Line Interface for Flight Framework\r\n * \r\n * Built with citty (UnJS) - ESM-first CLI builder\r\n * Following 2026 best practices for Node.js CLI tools\r\n * \r\n * @see https://github.com/unjs/citty\r\n */\r\nimport { defineCommand, runMain } from 'citty';\r\nimport { consola } from 'consola';\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\nimport { routesGenerateCommand } from './commands/routes-generate.js';\r\nimport { typesGenerateCommand } from './commands/types-generate.js';\r\nimport { addCommand } from './commands/add.js';\r\nimport { adapterCreateCommand } from './commands/adapter-create.js';\r\n\r\n// Logo - using consola for styled output\r\nconst LOGO = `\r\n ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗\r\n ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝\r\n █████╗ ██║ ██║██║ ███╗███████║ ██║ \r\n ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ \r\n ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ \r\n ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ \r\n \r\n The Agnostic Full-Stack Framework\r\n Maximum Flexibility. Zero Lock-in.\r\n`;\r\n\r\nexport function printLogo(): void {\r\n consola.log(LOGO);\r\n}\r\n\r\n/**\r\n * Create subcommand\r\n */\r\nconst create = defineCommand({\r\n meta: {\r\n name: 'create',\r\n description: 'Create a new Flight project',\r\n },\r\n args: {\r\n name: {\r\n type: 'positional',\r\n description: 'Project name',\r\n required: false,\r\n },\r\n template: {\r\n type: 'string',\r\n alias: 't',\r\n description: 'Project template to use',\r\n default: 'basic',\r\n },\r\n ui: {\r\n type: 'string',\r\n description: 'UI framework (react, vue, svelte, solid, vanilla)',\r\n },\r\n 'use-case': {\r\n type: 'string',\r\n description: 'Use-case template (blog, ecommerce, saas, api, docs)',\r\n },\r\n ts: {\r\n type: 'boolean',\r\n description: 'Use TypeScript',\r\n default: true,\r\n },\r\n git: {\r\n type: 'boolean',\r\n description: 'Initialize git repository',\r\n default: true,\r\n },\r\n install: {\r\n type: 'boolean',\r\n description: 'Install dependencies',\r\n default: true,\r\n },\r\n raw: {\r\n type: 'boolean',\r\n description: 'Create raw project (100% Web Standards, zero dependencies)',\r\n },\r\n empty: {\r\n type: 'boolean',\r\n description: 'Create empty project (just package.json)',\r\n },\r\n minimal: {\r\n type: 'boolean',\r\n description: 'Create minimal project (single server file with Flight)',\r\n },\r\n },\r\n run({ args }) {\r\n return createCommand(args.name, args);\r\n },\r\n});\r\n\r\n/**\r\n * Add subcommand\r\n */\r\nconst add = defineCommand({\r\n meta: {\r\n name: 'add',\r\n description: 'Add a Flight package to your project',\r\n },\r\n args: {\r\n package: {\r\n type: 'positional',\r\n description: 'Package name to add',\r\n required: false,\r\n },\r\n },\r\n run({ args }) {\r\n return addCommand(args.package);\r\n },\r\n});\r\n\r\n/**\r\n * Dev subcommand\r\n */\r\nconst dev = defineCommand({\r\n meta: {\r\n name: 'dev',\r\n description: 'Start development server',\r\n },\r\n args: {\r\n port: {\r\n type: 'string',\r\n alias: 'p',\r\n description: 'Port to listen on',\r\n },\r\n host: {\r\n type: 'string',\r\n alias: 'h',\r\n description: 'Host to bind to',\r\n },\r\n open: {\r\n type: 'boolean',\r\n description: 'Open browser on start',\r\n },\r\n https: {\r\n type: 'boolean',\r\n description: 'Enable HTTPS',\r\n },\r\n ssr: {\r\n type: 'boolean',\r\n description: 'Enable Server-Side Rendering',\r\n },\r\n },\r\n run({ args }) {\r\n return devCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Build subcommand\r\n */\r\nconst build = defineCommand({\r\n meta: {\r\n name: 'build',\r\n description: 'Build for production',\r\n },\r\n args: {\r\n outDir: {\r\n type: 'string',\r\n description: 'Output directory',\r\n },\r\n sourcemap: {\r\n type: 'boolean',\r\n description: 'Generate source maps',\r\n },\r\n minify: {\r\n type: 'boolean',\r\n description: 'Minify output',\r\n default: true,\r\n },\r\n },\r\n run({ args }) {\r\n return buildCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Preview subcommand\r\n */\r\nconst preview = defineCommand({\r\n meta: {\r\n name: 'preview',\r\n description: 'Preview production build',\r\n },\r\n args: {\r\n port: {\r\n type: 'string',\r\n alias: 'p',\r\n description: 'Port to listen on',\r\n },\r\n host: {\r\n type: 'string',\r\n alias: 'h',\r\n description: 'Host to bind to',\r\n },\r\n open: {\r\n type: 'boolean',\r\n description: 'Open browser on start',\r\n },\r\n },\r\n run({ args }) {\r\n return previewCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Routes generate subcommand\r\n */\r\nconst routesGenerate = defineCommand({\r\n meta: {\r\n name: 'routes:generate',\r\n description: 'Generate route manifest from routes directory',\r\n },\r\n args: {\r\n routesDir: {\r\n type: 'string',\r\n description: 'Routes directory',\r\n default: 'src/routes',\r\n },\r\n outputDir: {\r\n type: 'string',\r\n description: 'Output directory',\r\n default: 'src/.flight',\r\n },\r\n },\r\n run({ args }) {\r\n return routesGenerateCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Types generate subcommand\r\n */\r\nconst typesGenerate = defineCommand({\r\n meta: {\r\n name: 'types:generate',\r\n description: 'Generate TypeScript types for routes and environment',\r\n },\r\n args: {\r\n routesDir: {\r\n type: 'string',\r\n description: 'Routes directory',\r\n default: 'src/routes',\r\n },\r\n outputDir: {\r\n type: 'string',\r\n description: 'Output directory',\r\n default: 'src/.flight',\r\n },\r\n routes: {\r\n type: 'boolean',\r\n description: 'Generate route types',\r\n default: true,\r\n },\r\n env: {\r\n type: 'boolean',\r\n description: 'Generate environment variable types',\r\n },\r\n watch: {\r\n type: 'boolean',\r\n description: 'Watch for changes and regenerate',\r\n },\r\n },\r\n run({ args }) {\r\n return typesGenerateCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Adapter create subcommand\r\n */\r\nconst adapterCreate = defineCommand({\r\n meta: {\r\n name: 'adapter:create',\r\n description: 'Create a new adapter package',\r\n },\r\n args: {\r\n name: {\r\n type: 'positional',\r\n description: 'Adapter name',\r\n required: true,\r\n },\r\n type: {\r\n type: 'string',\r\n alias: 't',\r\n description: 'Platform type (node, edge, container, serverless)',\r\n default: 'node',\r\n },\r\n validation: {\r\n type: 'boolean',\r\n description: 'Include Zod validation example',\r\n },\r\n outputDir: {\r\n type: 'string',\r\n description: 'Output directory',\r\n },\r\n },\r\n run({ args }) {\r\n return adapterCreateCommand(args.name, {\r\n ...args,\r\n type: args.type as 'node' | 'edge' | 'container' | 'serverless',\r\n });\r\n },\r\n});\r\n\r\n/**\r\n * Main CLI command\r\n */\r\nconst main = defineCommand({\r\n meta: {\r\n name: 'flight',\r\n version: VERSION,\r\n description: 'The Agnostic Full-Stack Framework - Maximum Flexibility. Zero Lock-in.',\r\n },\r\n subCommands: {\r\n create,\r\n add,\r\n dev,\r\n build,\r\n preview,\r\n 'routes:generate': routesGenerate,\r\n 'types:generate': typesGenerate,\r\n 'adapter:create': adapterCreate,\r\n },\r\n setup() {\r\n // Show logo when CLI starts\r\n printLogo();\r\n },\r\n});\r\n\r\n/**\r\n * Run the CLI\r\n */\r\nexport function run(): void {\r\n runMain(main);\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 { consola } from 'consola';\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 bundler?: string;\r\n useCase?: string;\r\n ts: boolean;\r\n git: boolean;\r\n install: boolean;\r\n /** Create empty project (just package.json) */\r\n empty: boolean;\r\n /** Create minimal project (single server file with Flight) */\r\n minimal: boolean;\r\n /** Create raw project (100% Web Standards, zero Flight dependencies) */\r\n raw: 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\nconst BUNDLERS = [\r\n { title: 'Vite', value: 'vite', description: 'Next Gen Frontend Tooling (recommended)' },\r\n { title: 'FlightPack', value: 'flightpack', description: 'Native Rust bundler for maximum performance' },\r\n { title: 'esbuild', value: 'esbuild', description: 'Ultra-fast builds for performance-focused projects' },\r\n { title: 'Rolldown', value: 'rolldown', description: 'Rust-based Rollup replacement (experimental)' },\r\n];\r\n\r\nconst USE_CASES = [\r\n { title: 'Web Application', value: '', description: 'Choose UI framework manually' },\r\n { title: 'Blog', value: 'blog', description: 'Blog with SEO and markdown support' },\r\n { title: 'E-commerce', value: 'ecommerce', description: 'Store with products and cart' },\r\n { title: 'SaaS', value: 'saas', description: 'SaaS app with auth and dashboard' },\r\n { title: 'API Only', value: 'api', description: 'REST API without UI' },\r\n { title: 'Documentation', value: 'docs', description: 'Documentation site' },\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 consola.info('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 consola.error('Project creation cancelled.');\r\n return;\r\n }\r\n\r\n // Handle --raw mode: 100% Web Standards, ZERO Flight dependencies\r\n if (options.raw) {\r\n const projectPath = resolve(process.cwd(), projectName);\r\n createRawProject(projectPath, projectName, options);\r\n return;\r\n }\r\n\r\n // Handle --empty mode: just package.json\r\n if (options.empty) {\r\n const projectPath = resolve(process.cwd(), projectName);\r\n createEmptyProject(projectPath, projectName, options);\r\n return;\r\n }\r\n\r\n // Handle --minimal mode: single file project with Flight\r\n if (options.minimal) {\r\n const projectPath = resolve(process.cwd(), projectName);\r\n createMinimalProject(projectPath, projectName, options);\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 consola.error('Project creation cancelled.');\r\n return;\r\n }\r\n\r\n // Check for use-case templates\r\n let useCase = options.useCase;\r\n const useCaseDir = join(TEMPLATES_DIR, 'use-cases', useCase || '');\r\n const isUseCase = useCase && existsSync(useCaseDir);\r\n\r\n // Bundler selection\r\n let bundler = options.bundler;\r\n if (!bundler) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'bundler',\r\n message: 'Choose your bundler:',\r\n choices: BUNDLERS,\r\n initial: 0,\r\n });\r\n bundler = response.bundler;\r\n }\r\n\r\n if (!bundler) {\r\n consola.error('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 consola.error('Project creation cancelled.');\r\n return;\r\n }\r\n }\r\n }\r\n\r\n consola.log(`\\nCreating project in ${projectPath}...\\n`);\r\n\r\n try {\r\n // Copy templates\r\n if (isUseCase && useCase) {\r\n copyUseCaseTemplate(projectPath, useCase, projectName);\r\n } else {\r\n copyTemplate(projectPath, uiFramework, bundler, projectName);\r\n }\r\n consola.success('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 consola.success('Git repository initialized');\r\n } catch {\r\n consola.warn('Could not initialize git repository');\r\n }\r\n }\r\n\r\n // Install dependencies\r\n if (options.install) {\r\n consola.log('\\nInstalling dependencies...\\n');\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n consola.success('Dependencies installed');\r\n } catch {\r\n consola.warn('Could not install dependencies. Run `npm install` manually.');\r\n }\r\n }\r\n\r\n // Success message\r\n consola.box(`\r\nProject created successfully!\r\n\r\nNext steps:\r\n\r\n $ cd ${projectName}\r\n $ ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\nYour project is 100% yours:\r\n • No telemetry\r\n • No lock-in\r\n • Deploy anywhere\r\n\r\nHappy flying!\r\n`);\r\n } catch (error) {\r\n consola.error('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, bundler: 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 '{{BUNDLER}}': bundler,\r\n '{{BUNDLER_PACKAGE}}': `@flight-framework/bundler-${bundler}`,\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 * Copy use-case template files to project directory\r\n */\r\nfunction copyUseCaseTemplate(projectPath: string, useCase: string, projectName: string): void {\r\n const useCaseDir = join(TEMPLATES_DIR, 'use-cases', useCase);\r\n\r\n // Ensure project directory exists\r\n mkdirSync(projectPath, { recursive: true });\r\n\r\n // Variables for template substitution\r\n const vars = {\r\n '{{PROJECT_NAME}}': projectName,\r\n '{{USE_CASE}}': useCase,\r\n };\r\n\r\n // Copy use-case files\r\n copyDirWithTemplates(useCaseDir, projectPath, vars);\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/**\r\n * Create a raw project with 100% Web Standards, ZERO Flight dependencies\r\n * True zero lock-in: works on Bun, Deno, Node 22+, Cloudflare Workers\r\n */\r\nfunction createRawProject(projectPath: string, projectName: string, options: CreateOptions): void {\r\n mkdirSync(projectPath, { recursive: true });\r\n\r\n const packageJson = {\r\n name: projectName,\r\n version: '0.0.1',\r\n type: 'module',\r\n scripts: {\r\n // Works with Bun, Node 22+, or Deno\r\n 'dev': 'node --watch server.js',\r\n 'dev:bun': 'bun --watch server.js',\r\n 'dev:deno': 'deno run --allow-net server.js',\r\n 'start': 'node server.js',\r\n },\r\n dependencies: {},\r\n devDependencies: {},\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 // 100% Web Standards server - NO Flight dependencies\r\n const serverCode = `/**\r\n * ${projectName}\r\n * \r\n * 100% Web Standards server. Zero dependencies. Zero lock-in.\r\n * Works on: Bun, Deno, Node 22+, Cloudflare Workers\r\n * \r\n * Run:\r\n * bun server.js\r\n * deno run --allow-net server.js\r\n * node server.js (Node 22+)\r\n */\r\n\r\n/**\r\n * Handle incoming requests using Web Standard APIs\r\n * @param {Request} request\r\n * @returns {Response}\r\n */\r\nfunction handleRequest(request) {\r\n const url = new URL(request.url);\r\n const method = request.method;\r\n \r\n // Router\r\n if (method === 'GET' && url.pathname === '/') {\r\n return Response.json({\r\n message: 'Hello World!',\r\n runtime: detectRuntime(),\r\n docs: 'https://flight.dev/docs/quickstart-http',\r\n });\r\n }\r\n \r\n if (method === 'GET' && url.pathname === '/health') {\r\n return Response.json({\r\n status: 'ok',\r\n timestamp: Date.now(),\r\n });\r\n }\r\n \r\n if (method === 'GET' && url.pathname.startsWith('/api/')) {\r\n return Response.json({\r\n path: url.pathname,\r\n query: Object.fromEntries(url.searchParams),\r\n });\r\n }\r\n \r\n // 404\r\n return Response.json(\r\n { error: 'Not Found', path: url.pathname },\r\n { status: 404 }\r\n );\r\n}\r\n\r\n/**\r\n * Detect which runtime we're running on\r\n */\r\nfunction detectRuntime() {\r\n if (typeof Bun !== 'undefined') return 'bun';\r\n if (typeof Deno !== 'undefined') return 'deno';\r\n return 'node';\r\n}\r\n\r\n// Export for different runtimes\r\nconst port = process.env.PORT || 3000;\r\n\r\n// Bun / Cloudflare Workers style\r\nexport default {\r\n port,\r\n fetch: handleRequest,\r\n};\r\n\r\n// Also start server for Node.js\r\nif (detectRuntime() === 'node') {\r\n const { serve } = await import('node:http');\r\n serve({ port }, (req, res) => {\r\n const url = 'http://localhost' + req.url;\r\n const request = new Request(url, { method: req.method });\r\n handleRequest(request).then(response => {\r\n res.writeHead(response.status, Object.fromEntries(response.headers));\r\n response.text().then(body => res.end(body));\r\n });\r\n });\r\n console.log(\\`Server running at http://localhost:\\${port}\\`);\r\n}\r\n`;\r\n\r\n writeFileSync(join(projectPath, 'server.js'), serverCode);\r\n\r\n // Create .gitignore\r\n if (options.git) {\r\n writeFileSync(\r\n join(projectPath, '.gitignore'),\r\n 'node_modules\\ndist\\n.env\\n.env.local\\n'\r\n );\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n } catch { /* ignore */ }\r\n }\r\n\r\n consola.box(`\r\nRaw project created!\r\n\r\nZERO dependencies. ZERO lock-in. 100% Web Standards.\r\n\r\nRun with any runtime:\r\n\r\n # Bun (fastest)\r\n bun server.js\r\n\r\n # Deno\r\n deno run --allow-net server.js\r\n\r\n # Node.js 22+\r\n node server.js\r\n\r\nWant to add Flight later? Just run:\r\n flight add http # HTTP server with routing\r\n flight add db # Database abstraction\r\n flight add cache # Caching layer\r\n\r\nPath: ${projectPath}\r\n`);\r\n}\r\n\r\n/**\r\n * Create an empty project with just package.json\r\n * Ultimate toolbox approach: start from zero\r\n */\r\nfunction createEmptyProject(projectPath: string, projectName: string, options: CreateOptions): void {\r\n mkdirSync(projectPath, { recursive: true });\r\n\r\n const packageJson = {\r\n name: projectName,\r\n version: '0.0.1',\r\n type: 'module',\r\n scripts: {\r\n dev: 'node server.js',\r\n },\r\n dependencies: {},\r\n devDependencies: {},\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 // Create .gitignore\r\n if (options.git) {\r\n writeFileSync(\r\n join(projectPath, '.gitignore'),\r\n 'node_modules\\ndist\\n.env\\n.env.local\\n'\r\n );\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n } catch { /* ignore */ }\r\n }\r\n\r\n consola.box(`\r\nEmpty project created!\r\n\r\nYour project is a blank canvas. Add what you need:\r\n\r\n # HTTP server\r\n npm install @flight-framework/http\r\n\r\n # Database\r\n npm install @flight-framework/db\r\n\r\n # Cache\r\n npm install @flight-framework/cache\r\n\r\n # Authentication\r\n npm install @flight-framework/auth\r\n\r\nPath: ${projectPath}\r\n`);\r\n}\r\n\r\n/**\r\n * Create a minimal project with a single server file\r\n * One step up from empty: working server in one file\r\n */\r\nfunction createMinimalProject(projectPath: string, projectName: string, options: CreateOptions): void {\r\n mkdirSync(projectPath, { recursive: true });\r\n\r\n const packageJson = {\r\n name: projectName,\r\n version: '0.0.1',\r\n type: 'module',\r\n scripts: {\r\n dev: 'node --watch server.js',\r\n start: 'node server.js',\r\n },\r\n dependencies: {\r\n '@flight-framework/http': '^0.0.1',\r\n },\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 const serverCode = `/**\r\n * ${projectName} - Built with Flight\r\n * \r\n * This is a minimal Flight server. Add more as you need.\r\n * Run: npm run dev\r\n */\r\n\r\nimport { createServer } from '@flight-framework/http';\r\n\r\nconst app = createServer();\r\n\r\n// Your routes\r\napp.get('/', (c) => c.json({ \r\n message: 'Hello from Flight!',\r\n docs: 'https://flight.dev/docs/quickstart-http'\r\n}));\r\n\r\napp.get('/health', (c) => c.json({ \r\n status: 'ok', \r\n timestamp: Date.now() \r\n}));\r\n\r\n// Start server\r\nconst port = process.env.PORT || 3000;\r\nconsole.log(\\`Server running at http://localhost:\\${port}\\`);\r\n\r\nexport default { port, fetch: app.fetch };\r\n`;\r\n\r\n writeFileSync(join(projectPath, 'server.js'), serverCode);\r\n\r\n // Create .gitignore\r\n if (options.git) {\r\n writeFileSync(\r\n join(projectPath, '.gitignore'),\r\n 'node_modules\\ndist\\n.env\\n.env.local\\n'\r\n );\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // Install if requested\r\n if (options.install) {\r\n consola.log('\\nInstalling dependencies...\\n');\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n } catch { /* ignore */ }\r\n }\r\n\r\n consola.box(`\r\nMinimal project created!\r\n\r\nNext steps:\r\n\r\n $ cd ${projectName}\r\n $ ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\nAdd more features as needed:\r\n\r\n # File-based routing\r\n npm install @flight-framework/core\r\n\r\n # Database\r\n npm install @flight-framework/db pg\r\n\r\n # Caching\r\n npm install @flight-framework/cache\r\n\r\nHappy flying!\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 * - Automatic route type generation\r\n */\r\n\r\nimport { resolve, join } from 'node:path';\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport { consola } from 'consola';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport type { BundlerAdapter } from '@flight-framework/bundler';\r\nimport { printLogo } from '../index.js';\r\nimport { generateTypes, watchAndGenerate } from '../generators/typegen.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 consola.info('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 // Generate route types on startup\r\n const routesDir = join(root, 'src', 'routes');\r\n const outputDir = join(root, 'src', '.flight');\r\n\r\n if (existsSync(routesDir)) {\r\n try {\r\n const result = await generateTypes({\r\n routesDir,\r\n outputDir,\r\n includeRoutes: true,\r\n includeEnv: false,\r\n projectRoot: root,\r\n });\r\n consola.success(`Route types generated: ${result.routeCount} routes`);\r\n\r\n // Watch for route file changes and regenerate types\r\n const cleanup = watchAndGenerate({\r\n routesDir,\r\n outputDir,\r\n includeRoutes: true,\r\n includeEnv: false,\r\n projectRoot: root,\r\n onRegenerate: (watchResult) => {\r\n consola.info(`Route types updated: ${watchResult.routeCount} routes`);\r\n },\r\n });\r\n\r\n // Cleanup on process exit\r\n process.on('SIGINT', () => cleanup());\r\n process.on('SIGTERM', () => cleanup());\r\n } catch (typeError) {\r\n consola.warn(`Route type generation skipped: ${typeError}`);\r\n }\r\n }\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 // Check if a custom bundler is configured with dev server support\r\n const bundler = config.bundler as BundlerAdapter | undefined;\r\n\r\n if (bundler && typeof bundler.createDevServer === 'function') {\r\n // Turbopack-style architecture: CLI controls HTML, FlightPack transforms files\r\n consola.info(`Using bundler: ${bundler.name || bundler.bundler || 'custom'}`);\r\n\r\n // Start FlightPack dev server (runs on an internal port for transforms only)\r\n const devServer = await bundler.createDevServer(config);\r\n const transformPort = devServer.port; // FlightPack's port for transform API\r\n\r\n // Create CLI's own HTTP server that serves HTML and proxies transforms\r\n const http = await import('node:http');\r\n const fs = await import('node:fs/promises');\r\n const path = await import('node:path');\r\n\r\n // Find index.html in project root\r\n const indexHtmlPath = path.join(root, 'index.html');\r\n const publicIndexPath = path.join(root, 'public', 'index.html');\r\n\r\n const server = http.createServer(async (req, res) => {\r\n const url = req.url || '/';\r\n\r\n // Serve index.html for root and SPA routes\r\n if (url === '/' || url === '/index.html' || (!url.includes('.') && !url.startsWith('/@') && !url.startsWith('/__'))) {\r\n try {\r\n // Try root index.html first, then public/index.html\r\n let htmlContent: string;\r\n try {\r\n htmlContent = await fs.readFile(indexHtmlPath, 'utf-8');\r\n } catch {\r\n htmlContent = await fs.readFile(publicIndexPath, 'utf-8');\r\n }\r\n\r\n // Inject HMR runtime\r\n if (!htmlContent.includes('/__flightpack/hmr-runtime.js')) {\r\n htmlContent = htmlContent.replace(\r\n '</body>',\r\n `<script src=\"/__flightpack/hmr-runtime.js\"></script>\\n</body>`\r\n );\r\n }\r\n\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(htmlContent);\r\n } catch (err) {\r\n res.writeHead(404, { 'Content-Type': 'text/plain' });\r\n res.end(`index.html not found in ${root}`);\r\n }\r\n return;\r\n }\r\n\r\n // Proxy all other requests to FlightPack dev server\r\n const proxyReq = http.request(\r\n {\r\n hostname: 'localhost',\r\n port: transformPort,\r\n path: url,\r\n method: req.method,\r\n headers: req.headers,\r\n },\r\n (proxyRes) => {\r\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\r\n proxyRes.pipe(res);\r\n }\r\n );\r\n\r\n proxyReq.on('error', (err) => {\r\n console.error('[CLI Proxy Error]', err.message);\r\n res.writeHead(502, { 'Content-Type': 'text/plain' });\r\n res.end('FlightPack transform server unavailable');\r\n });\r\n\r\n req.pipe(proxyReq);\r\n });\r\n\r\n // Start CLI server on a different port, then FlightPack handles transforms\r\n const cliPort = port; // CLI uses the user-facing port\r\n await new Promise<void>((resolve) => server.listen(cliPort, () => resolve()));\r\n\r\n console.log(`\\n⚡ Flight dev server running\\n`);\r\n console.log(` Bundler: FlightPack`);\r\n console.log(` Local: http://localhost:${cliPort}`);\r\n console.log(``);\r\n\r\n const elapsed = Date.now() - startTime;\r\n consola.success(`Flight dev server ready in ${elapsed}ms`);\r\n devServer.printUrls?.();\r\n\r\n } else {\r\n // Fallback to Vite for backwards compatibility\r\n consola.info('Using bundler: Vite (default)');\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 consola.success(`Flight dev server ready in ${elapsed}ms`);\r\n consola.log(`\\n ➜ Local: http://localhost:${port}/`);\r\n if (host === true || host === '0.0.0.0') {\r\n consola.log(` ➜ Network: http://${getNetworkAddress()}:${port}/`);\r\n }\r\n consola.log('');\r\n consola.log(` ${isSSR ? '✓' : '○'} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}`);\r\n consola.log(` ${flightHttpAvailable ? '✓' : '○'} @flight-framework/http ${flightHttpAvailable ? 'enabled' : 'not installed'}`);\r\n consola.log(` ${flightRouterAvailable ? '✓' : '○'} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}`);\r\n consola.log('');\r\n consola.log(' press h to show help');\r\n\r\n // Handle server shortcuts\r\n if (!isSSR) {\r\n vite.bindCLIShortcuts({ print: true });\r\n }\r\n }\r\n\r\n } catch (error) {\r\n consola.error('Failed 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\r\n // Create module loader that uses Vite's ssrLoadModule for TSX support\r\n const moduleLoader = async (filePath: string) => {\r\n // Normalize both paths to use forward slashes for Vite\r\n const normalizedFilePath = filePath.replace(/\\\\/g, '/');\r\n const normalizedRoot = root.replace(/\\\\/g, '/');\r\n // Create relative path that Vite expects (starts with /)\r\n const relativePath = normalizedFilePath.replace(normalizedRoot, '');\r\n return vite.ssrLoadModule(relativePath);\r\n };\r\n\r\n pageRouter = await createFileRouter({\r\n directory: join(root, 'src', 'routes'),\r\n extensions: ['.tsx', '.ts', '.jsx', '.js'],\r\n moduleLoader, // Use Vite's ssrLoadModule\r\n });\r\n consola.success(`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 // Check if this is a static asset request\r\n const isStaticAsset =\r\n url.startsWith('/@') ||\r\n url.startsWith('/node_modules') ||\r\n (url.startsWith('/src') && !url.includes('entry-server')) ||\r\n // Static file extensions\r\n pathname.endsWith('.css') ||\r\n pathname.endsWith('.js') ||\r\n pathname.endsWith('.ts') ||\r\n pathname.endsWith('.tsx') ||\r\n pathname.endsWith('.svg') ||\r\n pathname.endsWith('.png') ||\r\n pathname.endsWith('.jpg') ||\r\n pathname.endsWith('.jpeg') ||\r\n pathname.endsWith('.gif') ||\r\n pathname.endsWith('.ico') ||\r\n pathname.endsWith('.woff') ||\r\n pathname.endsWith('.woff2') ||\r\n pathname.endsWith('.ttf') ||\r\n pathname.endsWith('.eot') ||\r\n pathname.endsWith('.json') ||\r\n pathname.endsWith('.webp') ||\r\n pathname.endsWith('.mp4') ||\r\n pathname.endsWith('.webm');\r\n\r\n // Let Vite handle static assets\r\n if (isStaticAsset) {\r\n vite.middlewares(req, res);\r\n return;\r\n }\r\n\r\n // Skip SSR for API routes - let Flight HTTP middleware handle them\r\n if (pathname.startsWith('/api/')) {\r\n // API routes are handled by Flight HTTP middleware\r\n // Pass through to Vite middlewares which will invoke our Flight middleware\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 // Normalize paths for Vite (forward slashes, remove root)\r\n const normalizedFilePath = pageRoute.filePath.replace(/\\\\/g, '/');\r\n const normalizedRoot = root.replace(/\\\\/g, '/');\r\n const relativePath = normalizedFilePath.replace(normalizedRoot, '');\r\n const mod = await vite.ssrLoadModule(relativePath);\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 consola.error('[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 consola.success('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 consola.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 * Type Generation Module\r\n *\r\n * Generates TypeScript declaration files from route structure and environment files.\r\n * Follows Flight's toolbox philosophy: explicit, opt-in, no magic.\r\n *\r\n * @example CLI Usage\r\n * ```bash\r\n * flight types:generate --routes --env\r\n * flight types:generate --routes --watch\r\n * ```\r\n *\r\n * @example Programmatic Usage\r\n * ```typescript\r\n * import { generateTypes } from '@flight-framework/cli/generators/typegen';\r\n *\r\n * await generateTypes({\r\n * routesDir: './src/routes',\r\n * outputDir: './src/.flight',\r\n * includeRoutes: true,\r\n * includeEnv: true,\r\n * });\r\n * ```\r\n *\r\n * @module @flight-framework/cli/generators/typegen\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, watch } from 'fs';\r\nimport { join, resolve, dirname } from 'path';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface TypeGenOptions {\r\n /** Directory containing route files */\r\n routesDir: string;\r\n\r\n /** Output directory for generated types */\r\n outputDir: string;\r\n\r\n /** Generate route types (default: true) */\r\n includeRoutes?: boolean;\r\n\r\n /** Generate environment variable types (default: false) */\r\n includeEnv?: boolean;\r\n\r\n /** Project root for .env file discovery */\r\n projectRoot?: string;\r\n}\r\n\r\nexport interface TypeGenResult {\r\n /** Generated route types content */\r\n routeTypes: string;\r\n\r\n /** Generated env types content */\r\n envTypes: string;\r\n\r\n /** List of files written */\r\n filesWritten: string[];\r\n\r\n /** Number of routes processed */\r\n routeCount: number;\r\n\r\n /** Number of env variables processed */\r\n envVarCount: number;\r\n}\r\n\r\nexport interface ScannedRoute {\r\n path: string;\r\n filePath: string;\r\n isDynamic: boolean;\r\n isApiRoute: boolean;\r\n httpMethod?: string;\r\n}\r\n\r\ninterface EnvVariable {\r\n key: string;\r\n optional: boolean;\r\n}\r\n\r\ninterface ParsedEnv {\r\n server: EnvVariable[];\r\n client: EnvVariable[];\r\n}\r\n\r\n// ============================================================================\r\n// Route Type Generation\r\n// ============================================================================\r\n\r\n/**\r\n * Generate default header for auto-generated files\r\n */\r\nfunction generateHeader(command: string): string {\r\n const timestamp = new Date().toISOString();\r\n return `/**\r\n * Auto-generated by Flight CLI\r\n * Do not edit manually - changes will be overwritten\r\n *\r\n * Command: ${command}\r\n * Generated: ${timestamp}\r\n */`;\r\n}\r\n\r\n/**\r\n * Extract parameter names from a route path\r\n *\r\n * @example\r\n * extractParams('/users/:id') // ['id']\r\n * extractParams('/blog/:year/:slug') // ['year', 'slug']\r\n * extractParams('/docs/*path') // ['path']\r\n */\r\nexport function extractParams(routePath: string): string[] {\r\n const params: string[] = [];\r\n\r\n // Match :param patterns\r\n const dynamicMatches = routePath.match(/:(\\w+)/g);\r\n if (dynamicMatches) {\r\n params.push(...dynamicMatches.map((m) => m.slice(1)));\r\n }\r\n\r\n // Match *param patterns (catch-all)\r\n const catchAllMatches = routePath.match(/\\*(\\w+)/g);\r\n if (catchAllMatches) {\r\n params.push(...catchAllMatches.map((m) => m.slice(1)));\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Check if route has dynamic segments\r\n */\r\nfunction isDynamicRoute(routePath: string): boolean {\r\n return routePath.includes(':') || routePath.includes('*');\r\n}\r\n\r\n/**\r\n * Generate TypeScript route types from scanned routes\r\n */\r\nexport function generateRouteTypes(routes: ScannedRoute[]): string {\r\n const pageRoutes = routes.filter((r) => !r.isApiRoute);\r\n const apiRoutes = routes.filter((r) => r.isApiRoute);\r\n\r\n const staticRoutes = pageRoutes.filter((r) => !r.isDynamic);\r\n const dynamicRoutes = pageRoutes.filter((r) => r.isDynamic);\r\n\r\n // Generate route unions\r\n const appRoutesUnion =\r\n pageRoutes.length > 0\r\n ? pageRoutes.map((r) => ` | '${r.path}'`).join('\\n')\r\n : ' | never';\r\n\r\n const apiRoutesUnion =\r\n apiRoutes.length > 0\r\n ? apiRoutes.map((r) => ` | '${r.path}'`).join('\\n')\r\n : ' | never';\r\n\r\n const staticRoutesUnion =\r\n staticRoutes.length > 0\r\n ? staticRoutes.map((r) => ` | '${r.path}'`).join('\\n')\r\n : ' | never';\r\n\r\n const dynamicRoutesUnion =\r\n dynamicRoutes.length > 0\r\n ? dynamicRoutes.map((r) => ` | '${r.path}'`).join('\\n')\r\n : ' | never';\r\n\r\n // Generate param types for dynamic routes\r\n const paramTypes = dynamicRoutes\r\n .map((r) => {\r\n const params = extractParams(r.path);\r\n const typeName = routePathToTypeName(r.path);\r\n const paramDef = params.map((p) => `${p}: string`).join('; ');\r\n return `export type ${typeName}Params = { ${paramDef} };`;\r\n })\r\n .join('\\n');\r\n\r\n return `${generateHeader('flight types:generate --routes')}\r\n\r\n// ============================================================================\r\n// Route Types\r\n// ============================================================================\r\n\r\n/**\r\n * All available page routes in the application\r\n */\r\nexport type AppRoutes =\r\n${appRoutesUnion};\r\n\r\n/**\r\n * All available API routes in the application\r\n */\r\nexport type ApiRoutes =\r\n${apiRoutesUnion};\r\n\r\n/**\r\n * Static routes (no dynamic parameters)\r\n */\r\nexport type StaticRoutes =\r\n${staticRoutesUnion};\r\n\r\n/**\r\n * Dynamic routes (with parameters like :id or *slug)\r\n */\r\nexport type DynamicRoutes =\r\n${dynamicRoutesUnion};\r\n\r\n// ============================================================================\r\n// Route Parameter Extraction\r\n// ============================================================================\r\n\r\n/**\r\n * Extract route parameters from a route pattern using template literal types.\r\n *\r\n * @example\r\n * type Params = ExtractRouteParams<'/users/:id'>; // { id: string }\r\n * type BlogParams = ExtractRouteParams<'/blog/:year/:slug'>; // { year: string; slug: string }\r\n */\r\ntype ExtractRouteParams<T extends string> =\r\n // Handle :param/rest pattern\r\n T extends \\`\\${infer _Start}:\\${infer Param}/\\${infer Rest}\\`\r\n ? { [K in Param]: string } & ExtractRouteParams<\\`/\\${Rest}\\`>\r\n // Handle :param at end\r\n : T extends \\`\\${infer _Start}:\\${infer Param}\\`\r\n ? { [K in Param]: string }\r\n // Handle *param (catch-all)\r\n : T extends \\`\\${infer _Start}*\\${infer Param}\\`\r\n ? { [K in Param]: string }\r\n // No params\r\n : Record<string, never>;\r\n\r\n/**\r\n * Get typed parameters for a specific route.\r\n *\r\n * @example\r\n * const params: RouteParams<'/users/:id'> = { id: '123' };\r\n */\r\nexport type RouteParams<T extends AppRoutes | ApiRoutes> = ExtractRouteParams<T>;\r\n\r\n// ============================================================================\r\n// Helper Types\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a route requires parameters\r\n */\r\nexport type RequiresParams<T extends AppRoutes | ApiRoutes> =\r\n RouteParams<T> extends Record<string, never> ? false : true;\r\n\r\n/**\r\n * Props for a type-safe Link component\r\n */\r\nexport type TypedLinkProps<T extends AppRoutes> =\r\n RequiresParams<T> extends true\r\n ? { to: T; params: RouteParams<T> }\r\n : { to: T; params?: never };\r\n\r\n/**\r\n * Build a URL from a route pattern and parameters\r\n */\r\nexport type BuildUrl<T extends AppRoutes> =\r\n RequiresParams<T> extends true\r\n ? (route: T, params: RouteParams<T>) => string\r\n : (route: T) => string;\r\n\r\n// ============================================================================\r\n// Individual Route Parameter Types\r\n// ============================================================================\r\n\r\n${paramTypes || '// No dynamic routes found'}\r\n`;\r\n}\r\n\r\n/**\r\n * Convert route path to a valid TypeScript type name\r\n *\r\n * @example\r\n * routePathToTypeName('/users/:id') // 'Users_Id'\r\n * routePathToTypeName('/blog/:year/:slug') // 'Blog_Year_Slug'\r\n */\r\nfunction routePathToTypeName(routePath: string): string {\r\n return routePath\r\n .split('/')\r\n .filter(Boolean)\r\n .map((segment) => {\r\n // Remove : and * prefixes, capitalize\r\n const clean = segment.replace(/^[:*]/, '');\r\n return clean.charAt(0).toUpperCase() + clean.slice(1);\r\n })\r\n .join('_') || 'Root';\r\n}\r\n\r\n// ============================================================================\r\n// Environment Variable Type Generation\r\n// ============================================================================\r\n\r\n/**\r\n * Parse .env file content and extract variable definitions\r\n */\r\nexport function parseEnvFile(content: string): ParsedEnv {\r\n const server: EnvVariable[] = [];\r\n const client: EnvVariable[] = [];\r\n\r\n const lines = content.split('\\n');\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Skip comments and empty lines\r\n if (!trimmed || trimmed.startsWith('#')) {\r\n continue;\r\n }\r\n\r\n // Match KEY=value or KEY?=value (optional)\r\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)(\\?)?=/i);\r\n if (!match) {\r\n continue;\r\n }\r\n\r\n const key = match[1];\r\n const optional = match[2] === '?';\r\n\r\n const envVar: EnvVariable = { key, optional };\r\n\r\n // PUBLIC_ prefix means client-side accessible\r\n if (key.startsWith('PUBLIC_')) {\r\n client.push(envVar);\r\n } else {\r\n server.push(envVar);\r\n }\r\n }\r\n\r\n return { server, client };\r\n}\r\n\r\n/**\r\n * Load and merge all .env files from project root\r\n */\r\nexport function loadEnvFiles(projectRoot: string): ParsedEnv {\r\n const envFiles = ['.env', '.env.local', '.env.development', '.env.production'];\r\n\r\n const merged: ParsedEnv = { server: [], client: [] };\r\n const seenKeys = new Set<string>();\r\n\r\n for (const envFile of envFiles) {\r\n const envPath = join(projectRoot, envFile);\r\n\r\n if (!existsSync(envPath)) {\r\n continue;\r\n }\r\n\r\n const content = readFileSync(envPath, 'utf-8');\r\n const parsed = parseEnvFile(content);\r\n\r\n // Add new keys only (first definition wins)\r\n for (const envVar of parsed.server) {\r\n if (!seenKeys.has(envVar.key)) {\r\n seenKeys.add(envVar.key);\r\n merged.server.push(envVar);\r\n }\r\n }\r\n\r\n for (const envVar of parsed.client) {\r\n if (!seenKeys.has(envVar.key)) {\r\n seenKeys.add(envVar.key);\r\n merged.client.push(envVar);\r\n }\r\n }\r\n }\r\n\r\n return merged;\r\n}\r\n\r\n/**\r\n * Generate TypeScript environment variable types\r\n */\r\nexport function generateEnvTypes(env: ParsedEnv): string {\r\n const serverVars = env.server\r\n .sort((a, b) => a.key.localeCompare(b.key))\r\n .map((v) => ` ${v.key}${v.optional ? '?' : ''}: string;`)\r\n .join('\\n');\r\n\r\n const clientVars = env.client\r\n .sort((a, b) => a.key.localeCompare(b.key))\r\n .map((v) => ` ${v.key}${v.optional ? '?' : ''}: string;`)\r\n .join('\\n');\r\n\r\n return `${generateHeader('flight types:generate --env')}\r\n\r\n// ============================================================================\r\n// Server-side Environment Variables\r\n// ============================================================================\r\n\r\n/**\r\n * Server-side environment variables accessible via process.env\r\n * These are NOT exposed to the client.\r\n */\r\ndeclare namespace NodeJS {\r\n interface ProcessEnv {\r\n${serverVars || ' // No server environment variables defined'}\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Client-side Environment Variables\r\n// ============================================================================\r\n\r\n/**\r\n * Client-side environment variables accessible via import.meta.env\r\n * Only variables with PUBLIC_ prefix are included.\r\n */\r\ninterface ImportMetaEnv {\r\n${clientVars || ' // No client environment variables defined'}\r\n}\r\n\r\ninterface ImportMeta {\r\n readonly env: ImportMetaEnv;\r\n}\r\n`;\r\n}\r\n\r\n// ============================================================================\r\n// Main Generation Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Scan routes directory and extract route information\r\n */\r\nexport function scanRoutesForTypes(routesDir: string): ScannedRoute[] {\r\n if (!existsSync(routesDir)) {\r\n return [];\r\n }\r\n\r\n const routes: ScannedRoute[] = [];\r\n scanDirectoryRecursive(routesDir, '', routes);\r\n return routes;\r\n}\r\n\r\nfunction scanDirectoryRecursive(\r\n dir: string,\r\n basePath: string,\r\n results: ScannedRoute[]\r\n): void {\r\n const entries = readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n const relativePath = join(basePath, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n // Skip special directories\r\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\r\n continue;\r\n }\r\n scanDirectoryRecursive(fullPath, relativePath, results);\r\n } else if (entry.isFile()) {\r\n const route = parseRouteFile(entry.name, relativePath);\r\n if (route) {\r\n results.push(route);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction parseRouteFile(filename: string, relativePath: string): ScannedRoute | null {\r\n // Check for page routes\r\n if (/\\.(page|route)\\.(tsx?|jsx?)$/.test(filename)) {\r\n const urlPath = filePathToUrlPath(relativePath);\r\n return {\r\n path: urlPath,\r\n filePath: relativePath.replace(/\\\\/g, '/'),\r\n isDynamic: isDynamicRoute(urlPath),\r\n isApiRoute: false,\r\n };\r\n }\r\n\r\n // Check for API routes\r\n const apiMatch = filename.match(/\\.(get|post|put|patch|delete|options|head)\\.(tsx?|jsx?)$/i);\r\n if (apiMatch) {\r\n const urlPath = filePathToUrlPath(relativePath);\r\n return {\r\n path: urlPath,\r\n filePath: relativePath.replace(/\\\\/g, '/'),\r\n isDynamic: isDynamicRoute(urlPath),\r\n isApiRoute: true,\r\n httpMethod: apiMatch[1].toUpperCase(),\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction filePathToUrlPath(filePath: string): string {\r\n let urlPath = filePath\r\n // Normalize slashes first (Windows compatibility)\r\n .replace(/\\\\/g, '/')\r\n // Remove file extension\r\n .replace(/\\.(page|route)\\.(tsx?|jsx?)$/, '')\r\n // Remove HTTP method suffix\r\n .replace(/\\.(get|post|put|patch|delete|options|head)$/i, '')\r\n // Remove index (after slash normalization)\r\n .replace(/\\/index$/, '')\r\n .replace(/^index$/, '')\r\n // Remove route groups\r\n .replace(/\\/?\\\\?\\([^)]+\\\\?\\)/g, '')\r\n // Convert [param] to :param\r\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*$1')\r\n .replace(/\\[(\\w+)\\]/g, ':$1');\r\n\r\n // Ensure leading slash\r\n if (!urlPath.startsWith('/')) {\r\n urlPath = '/' + urlPath;\r\n }\r\n\r\n // Clean double slashes\r\n urlPath = urlPath.replace(/\\/+/g, '/');\r\n\r\n return urlPath || '/';\r\n}\r\n\r\n/**\r\n * Generate types and write to output directory\r\n */\r\nexport async function generateTypes(options: TypeGenOptions): Promise<TypeGenResult> {\r\n const {\r\n routesDir,\r\n outputDir,\r\n includeRoutes = true,\r\n includeEnv = false,\r\n projectRoot = process.cwd(),\r\n } = options;\r\n\r\n const result: TypeGenResult = {\r\n routeTypes: '',\r\n envTypes: '',\r\n filesWritten: [],\r\n routeCount: 0,\r\n envVarCount: 0,\r\n };\r\n\r\n // Ensure output directory exists\r\n if (!existsSync(outputDir)) {\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Generate route types\r\n if (includeRoutes) {\r\n const routes = scanRoutesForTypes(routesDir);\r\n result.routeCount = routes.length;\r\n result.routeTypes = generateRouteTypes(routes);\r\n\r\n const routeTypesPath = join(outputDir, 'routes.d.ts');\r\n writeFileSync(routeTypesPath, result.routeTypes, 'utf-8');\r\n result.filesWritten.push(routeTypesPath);\r\n\r\n console.log(`Generated route types: ${routes.length} routes`);\r\n }\r\n\r\n // Generate env types\r\n if (includeEnv) {\r\n const env = loadEnvFiles(projectRoot);\r\n result.envVarCount = env.server.length + env.client.length;\r\n result.envTypes = generateEnvTypes(env);\r\n\r\n const envTypesPath = join(outputDir, 'env.d.ts');\r\n writeFileSync(envTypesPath, result.envTypes, 'utf-8');\r\n result.filesWritten.push(envTypesPath);\r\n\r\n console.log(`Generated env types: ${env.server.length} server, ${env.client.length} client`);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Watch Mode\r\n// ============================================================================\r\n\r\nexport interface WatchOptions extends TypeGenOptions {\r\n /** Debounce delay in milliseconds */\r\n debounce?: number;\r\n\r\n /** Callback when types are regenerated */\r\n onRegenerate?: (result: TypeGenResult) => void;\r\n}\r\n\r\n/**\r\n * Watch for changes and regenerate types automatically\r\n */\r\nexport function watchAndGenerate(options: WatchOptions): () => void {\r\n const { routesDir, debounce = 100, onRegenerate } = options;\r\n\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n const regenerate = async () => {\r\n try {\r\n const result = await generateTypes(options);\r\n onRegenerate?.(result);\r\n } catch (error) {\r\n console.error('Type generation failed:', (error as Error).message);\r\n }\r\n };\r\n\r\n const debouncedRegenerate = () => {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = setTimeout(regenerate, debounce);\r\n };\r\n\r\n // Initial generation\r\n regenerate();\r\n\r\n // Watch routes directory\r\n const watcher = watch(routesDir, { recursive: true }, (eventType: string, filename: string | null) => {\r\n if (filename && /\\.(tsx?|jsx?)$/.test(filename)) {\r\n console.log(`Route file changed: ${filename}`);\r\n debouncedRegenerate();\r\n }\r\n });\r\n\r\n // Return cleanup function\r\n return () => {\r\n watcher.close();\r\n if (timeout) clearTimeout(timeout);\r\n };\r\n}\r\n","/**\r\n * Flight CLI - Build Command\r\n * \r\n * Build for production using the configured bundler adapter.\r\n * Supports FlightPack (native Rust) and Vite (fallback).\r\n * \r\n * @module @flight-framework/cli/commands/build\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport { existsSync } from 'node:fs';\r\nimport { consola } from 'consola';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport type { BundlerAdapter } from '@flight-framework/bundler';\r\nimport { printLogo } from '../index.js';\r\n\r\n/**\r\n * Find entry-server file with either .tsx or .ts extension\r\n */\r\nfunction findEntryServer(root: string, srcDir: string): string {\r\n const tsxPath = resolve(root, srcDir, 'entry-server.tsx');\r\n const tsPath = resolve(root, srcDir, 'entry-server.ts');\r\n\r\n if (existsSync(tsxPath)) return tsxPath;\r\n if (existsSync(tsPath)) return tsPath;\r\n\r\n // Default to tsx (will error if not found, but with clear message)\r\n return tsxPath;\r\n}\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 consola.info('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 consola.log(`Output directory: ${outDir}`);\r\n consola.log(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`);\r\n consola.log(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`);\r\n\r\n // Check if a custom bundler is configured (e.g., FlightPack)\r\n const bundler = config.bundler as BundlerAdapter | undefined;\r\n\r\n if (bundler && typeof bundler.build === 'function') {\r\n // Use the configured bundler adapter (FlightPack, etc.)\r\n consola.info(`Using bundler: ${bundler.name || bundler.bundler || 'custom'}`);\r\n\r\n const result = await bundler.build(config);\r\n\r\n if (!result.success) {\r\n for (const error of result.errors) {\r\n consola.error(error.message);\r\n }\r\n throw new Error('Build failed');\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\r\n\r\n consola.success(`Build complete! (${elapsedSeconds}s)`);\r\n consola.log(`\\nOutput: ${resolve(root, outDir)}`);\r\n consola.log(`\\nTo preview the build:`);\r\n consola.log(` $ flight preview\\n`);\r\n\r\n } else {\r\n // Fallback to Vite for backwards compatibility\r\n consola.info('Using bundler: Vite (default)');\r\n\r\n // Dynamic import vite\r\n const { build } = await import('vite');\r\n\r\n // Client build\r\n consola.info('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 consola.success('Client build complete');\r\n\r\n // SSR build (if applicable)\r\n if (config.rendering.default !== 'csr') {\r\n consola.info('Building 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: findEntryServer(root, config.build.srcDir),\r\n },\r\n },\r\n });\r\n consola.success('Server build complete');\r\n }\r\n\r\n // Run adapter if configured\r\n if (config.adapter) {\r\n consola.info(`Running ${config.adapter.name} adapter...`);\r\n // TODO: Implement adapter execution\r\n consola.success(`${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 consola.success(`Build complete! (${elapsedSeconds}s)`);\r\n consola.log(`\\nOutput: ${resolve(root, outDir)}`);\r\n consola.log(`\\nTo preview the build:`);\r\n consola.log(` $ flight preview\\n`);\r\n consola.log(`To deploy:`);\r\n consola.log(` • Upload ${outDir}/ to your server`);\r\n consola.log(` • Or use your configured adapter\\n`);\r\n }\r\n\r\n } catch (error) {\r\n consola.error('Build 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 { consola } from 'consola';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport type { BundlerAdapter } from '@flight-framework/bundler';\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 consola.info('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 // Check if a custom bundler is configured with preview support\r\n const bundler = config.bundler as BundlerAdapter | undefined;\r\n\r\n if (bundler && typeof bundler.preview === 'function') {\r\n // Use the configured bundler's preview server\r\n consola.info(`Using bundler: ${bundler.name || bundler.bundler || 'custom'}`);\r\n\r\n const server = await bundler.preview(config);\r\n server.printUrls?.();\r\n\r\n } else {\r\n // Fallback to Vite preview\r\n consola.info('Using bundler: Vite (default)');\r\n\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 consola.success('Flight preview server ready');\r\n consola.log(`\\n ➜ Local: http://localhost:${port}/`);\r\n if (host === true || host === '0.0.0.0') {\r\n consola.log(` ➜ Network: http://0.0.0.0:${port}/`);\r\n }\r\n consola.log('\\n This is a preview of your production build.');\r\n consola.log(' For development, use: flight dev\\n');\r\n\r\n server.printUrls();\r\n }\r\n\r\n } catch (error) {\r\n consola.error('Failed to start preview server:', error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Routes Generate Command\r\n * \r\n * Generates route manifest from the routes directory.\r\n * Usage: flight routes:generate [options]\r\n */\r\n\r\nimport { resolve } from 'path';\r\nimport { generateRoutes } from '../generators/routes.js';\r\n\r\ninterface RoutesGenerateOptions {\r\n routesDir?: string;\r\n outputDir?: string;\r\n watch?: boolean;\r\n}\r\n\r\nexport async function routesGenerateCommand(options: RoutesGenerateOptions = {}): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n const routesDir = options.routesDir\r\n ? resolve(cwd, options.routesDir)\r\n : resolve(cwd, 'src/routes');\r\n\r\n const outputDir = options.outputDir\r\n ? resolve(cwd, options.outputDir)\r\n : resolve(cwd, 'src/.flight');\r\n\r\n try {\r\n const manifest = await generateRoutes({\r\n routesDir,\r\n outputDir,\r\n watch: options.watch,\r\n });\r\n\r\n console.log('\\nRoute manifest generated successfully!');\r\n console.log(` Pages: ${manifest.routes.length}`);\r\n console.log(` API Routes: ${manifest.apiRoutes.length}`);\r\n console.log(` Layouts: ${manifest.layouts.length}`);\r\n } catch (error) {\r\n console.error('Failed to generate routes:', error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Route Generator\r\n * \r\n * Scans the routes directory and generates a route manifest.\r\n * This enables automatic route registration without manual imports.\r\n */\r\n\r\nimport { readdirSync, statSync, existsSync, writeFileSync, mkdirSync } from 'fs';\r\nimport { join, relative, basename, dirname } from 'path';\r\n\r\ninterface ScannedRoute {\r\n path: string; // URL path pattern (e.g., '/docs/:slug')\r\n filePath: string; // Relative file path\r\n isLayout: boolean; // Is this a _layout file\r\n isLoading: boolean; // Is this a _loading file\r\n isError: boolean; // Is this a _error file\r\n isNotFound: boolean; // Is this a _not-found file\r\n isDynamic: boolean; // Has dynamic segments\r\n isApiRoute: boolean; // Is an API route\r\n httpMethod?: string; // HTTP method for API routes\r\n}\r\n\r\ninterface RouteManifest {\r\n routes: ScannedRoute[];\r\n layouts: ScannedRoute[];\r\n loadingStates: ScannedRoute[];\r\n errorBoundaries: ScannedRoute[];\r\n notFoundPages: ScannedRoute[];\r\n apiRoutes: ScannedRoute[];\r\n generated: string; // Timestamp\r\n}\r\n\r\n/**\r\n * Convert file path to URL path pattern\r\n * \r\n * Handles:\r\n * - File extensions (.page.tsx, .get.ts, etc.)\r\n * - Index files → root of directory\r\n * - Dynamic segments [param] → :param\r\n * - Catch-all [...param] → *param\r\n * - Route groups (group) → removed from URL\r\n */\r\nfunction filePathToUrlPath(filePath: string): string {\r\n let urlPath = filePath\r\n // Remove file extension\r\n .replace(/\\.(page|route)\\.(tsx?|jsx?)$/, '')\r\n // Remove HTTP method suffix for API routes\r\n .replace(/\\.(get|post|put|patch|delete|options|head)$/, '')\r\n // Remove index from path\r\n .replace(/\\/index$/, '')\r\n // Remove route groups (segments wrapped in parentheses)\r\n // e.g., (marketing)/about → about, (app)/dashboard → dashboard\r\n .replace(/\\/?\\([^)]+\\)/g, '')\r\n // Convert [param] to :param\r\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*$1') // Catch-all [...slug] -> *slug\r\n .replace(/\\[(\\w+)\\]/g, ':$1'); // Dynamic [slug] -> :slug\r\n\r\n // Ensure leading slash\r\n if (!urlPath.startsWith('/')) {\r\n urlPath = '/' + urlPath;\r\n }\r\n\r\n // Root path\r\n if (urlPath === '' || urlPath === '/') {\r\n urlPath = '/';\r\n }\r\n\r\n // Clean up double slashes that might result from group removal\r\n urlPath = urlPath.replace(/\\/+/g, '/');\r\n\r\n return urlPath;\r\n}\r\n\r\n/**\r\n * Check if directory is a route group\r\n * Route groups are directories wrapped in parentheses: (groupName)\r\n */\r\nfunction isRouteGroup(dirname: string): boolean {\r\n return /^\\([^)]+\\)$/.test(dirname);\r\n}\r\n\r\n/**\r\n * Extract HTTP method from API route filename\r\n */\r\nfunction extractHttpMethod(filename: string): string | undefined {\r\n const match = filename.match(/\\.(get|post|put|patch|delete|options|head)\\.(tsx?|jsx?)$/i);\r\n return match ? match[1].toUpperCase() : undefined;\r\n}\r\n\r\n/**\r\n * Check if file is a layout file\r\n */\r\nfunction isLayoutFile(filename: string): boolean {\r\n return filename.startsWith('_layout.');\r\n}\r\n\r\n/**\r\n * Check if file is a loading file\r\n */\r\nfunction isLoadingFile(filename: string): boolean {\r\n return filename.startsWith('_loading.');\r\n}\r\n\r\n/**\r\n * Check if file is an error file\r\n */\r\nfunction isErrorFile(filename: string): boolean {\r\n return filename.startsWith('_error.');\r\n}\r\n\r\n/**\r\n * Check if file is a not-found file\r\n */\r\nfunction isNotFoundFile(filename: string): boolean {\r\n return filename.startsWith('_not-found.');\r\n}\r\n\r\n/**\r\n * Check if file is a page/route file\r\n */\r\nfunction isRouteFile(filename: string): boolean {\r\n return /\\.(page|route)\\.(tsx?|jsx?)$/.test(filename);\r\n}\r\n\r\n/**\r\n * Check if file is an API route file\r\n */\r\nfunction isApiRouteFile(filename: string): boolean {\r\n return /\\.(get|post|put|patch|delete|options|head)\\.(tsx?|jsx?)$/.test(filename);\r\n}\r\n\r\n/**\r\n * Check if path has dynamic segments\r\n */\r\nfunction hasDynamicSegments(path: string): boolean {\r\n return path.includes('[') && path.includes(']');\r\n}\r\n\r\n/**\r\n * Recursively scan directory for routes\r\n */\r\nfunction scanDirectory(\r\n dir: string,\r\n basePath: string = '',\r\n results: ScannedRoute[] = []\r\n): ScannedRoute[] {\r\n if (!existsSync(dir)) {\r\n return results;\r\n }\r\n\r\n const entries = readdirSync(dir);\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry);\r\n const relativePath = join(basePath, entry);\r\n const stat = statSync(fullPath);\r\n\r\n if (stat.isDirectory()) {\r\n // Skip special directories\r\n if (entry.startsWith('.') || entry === 'node_modules') {\r\n continue;\r\n }\r\n // Recurse into subdirectory\r\n scanDirectory(fullPath, relativePath, results);\r\n } else if (stat.isFile()) {\r\n const routePath = filePathToUrlPath(dirname(relativePath));\r\n const normalizedFilePath = relativePath.replace(/\\\\/g, '/');\r\n const isDynamic = hasDynamicSegments(relativePath);\r\n\r\n // Layout files\r\n if (isLayoutFile(entry)) {\r\n results.push({\r\n path: routePath,\r\n filePath: normalizedFilePath,\r\n isLayout: true,\r\n isLoading: false,\r\n isError: false,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n // Loading files\r\n else if (isLoadingFile(entry)) {\r\n results.push({\r\n path: routePath,\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: true,\r\n isError: false,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n // Error files\r\n else if (isErrorFile(entry)) {\r\n results.push({\r\n path: routePath,\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: false,\r\n isError: true,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n // Not-found files\r\n else if (isNotFoundFile(entry)) {\r\n results.push({\r\n path: routePath,\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: false,\r\n isError: false,\r\n isNotFound: true,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n // API route files\r\n else if (isApiRouteFile(entry)) {\r\n const method = extractHttpMethod(entry);\r\n results.push({\r\n path: filePathToUrlPath(relativePath),\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: false,\r\n isError: false,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: true,\r\n httpMethod: method,\r\n });\r\n }\r\n // Page/route files\r\n else if (isRouteFile(entry)) {\r\n results.push({\r\n path: filePathToUrlPath(relativePath),\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: false,\r\n isError: false,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Sort routes for matching priority\r\n * Static routes before dynamic, shorter before longer\r\n */\r\nfunction sortRoutes(routes: ScannedRoute[]): ScannedRoute[] {\r\n return routes.sort((a, b) => {\r\n // Static routes first\r\n if (!a.isDynamic && b.isDynamic) return -1;\r\n if (a.isDynamic && !b.isDynamic) return 1;\r\n\r\n // Shorter paths first\r\n const aSegments = a.path.split('/').length;\r\n const bSegments = b.path.split('/').length;\r\n if (aSegments !== bSegments) return aSegments - bSegments;\r\n\r\n // Alphabetical as tiebreaker\r\n return a.path.localeCompare(b.path);\r\n });\r\n}\r\n\r\n/**\r\n * Generate route manifest from scanned routes\r\n */\r\nexport function generateRouteManifest(routesDir: string): RouteManifest {\r\n const allRoutes = scanDirectory(routesDir);\r\n\r\n // Filter by type - pages are routes that are not special files or API routes\r\n const isPageRoute = (r: ScannedRoute) =>\r\n !r.isLayout && !r.isLoading && !r.isError && !r.isNotFound && !r.isApiRoute;\r\n\r\n const routes = sortRoutes(allRoutes.filter(isPageRoute));\r\n const layouts = allRoutes.filter(r => r.isLayout);\r\n const loadingStates = allRoutes.filter(r => r.isLoading);\r\n const errorBoundaries = allRoutes.filter(r => r.isError);\r\n const notFoundPages = allRoutes.filter(r => r.isNotFound);\r\n const apiRoutes = sortRoutes(allRoutes.filter(r => r.isApiRoute));\r\n\r\n return {\r\n routes,\r\n layouts,\r\n loadingStates,\r\n errorBoundaries,\r\n notFoundPages,\r\n apiRoutes,\r\n generated: new Date().toISOString(),\r\n };\r\n}\r\n\r\n/**\r\n * Generate TypeScript route manifest file\r\n */\r\nexport function generateRoutesFile(manifest: RouteManifest, outputDir: string): void {\r\n // Ensure output directory exists\r\n if (!existsSync(outputDir)) {\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Generate routes.ts content\r\n const routesContent = `/**\r\n * Auto-generated by Flight CLI\r\n * Do not edit manually\r\n * Generated: ${manifest.generated}\r\n */\r\n\r\nimport type { RouteDefinition } from '@flight-framework/router';\r\n\r\n// Page Routes\r\nexport const routes: RouteDefinition[] = [\r\n${manifest.routes.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Layout Components\r\nexport const layouts = [\r\n${manifest.layouts.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Loading State Components\r\nexport const loadingStates = [\r\n${manifest.loadingStates.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Error Boundary Components\r\nexport const errorBoundaries = [\r\n${manifest.errorBoundaries.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Not Found Page Components\r\nexport const notFoundPages = [\r\n${manifest.notFoundPages.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// API Routes\r\nexport const apiRoutes = [\r\n${manifest.apiRoutes.map(r => ` {\r\n path: '${r.path}',\r\n method: '${r.httpMethod}',\r\n handler: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Type-safe route paths\r\nexport type AppRoutes = ${manifest.routes.length > 0\r\n ? manifest.routes.map(r => `'${r.path}'`).join(' | ')\r\n : 'never'};\r\n\r\n// Type-safe API route paths\r\nexport type ApiRoutes = ${manifest.apiRoutes.length > 0\r\n ? manifest.apiRoutes.map(r => `'${r.path}'`).join(' | ')\r\n : 'never'};\r\n`;\r\n\r\n writeFileSync(join(outputDir, 'routes.ts'), routesContent, 'utf-8');\r\n\r\n // Generate types.ts for enhanced type safety\r\n const typesContent = `/**\r\n * Auto-generated route types\r\n * Generated: ${manifest.generated}\r\n */\r\n\r\nimport type { RouteParams } from '@flight-framework/router';\r\n\r\n// Extract params from route patterns\r\n${manifest.routes\r\n .filter(r => r.isDynamic)\r\n .map(r => {\r\n const paramMatches = r.path.match(/:(\\w+)/g) || [];\r\n const params = paramMatches.map(p => p.slice(1));\r\n const typeName = r.path\r\n .replace(/[/:]/g, '_')\r\n .replace(/^_/, '')\r\n .replace(/_$/, '') || 'Root';\r\n return `export type ${typeName}Params = { ${params.map(p => `${p}: string`).join('; ')} };`;\r\n })\r\n .join('\\n')}\r\n`;\r\n\r\n writeFileSync(join(outputDir, 'types.ts'), typesContent, 'utf-8');\r\n}\r\n\r\n/**\r\n * Main function to generate routes\r\n */\r\nexport async function generateRoutes(options: {\r\n routesDir: string;\r\n outputDir: string;\r\n watch?: boolean;\r\n}): Promise<RouteManifest> {\r\n const { routesDir, outputDir } = options;\r\n\r\n console.log(`Scanning routes in: ${routesDir}`);\r\n\r\n const manifest = generateRouteManifest(routesDir);\r\n\r\n const stats = [\r\n `${manifest.routes.length} pages`,\r\n `${manifest.layouts.length} layouts`,\r\n `${manifest.loadingStates.length} loading states`,\r\n `${manifest.errorBoundaries.length} error boundaries`,\r\n `${manifest.notFoundPages.length} not-found pages`,\r\n `${manifest.apiRoutes.length} API routes`,\r\n ].join(', ');\r\n\r\n console.log(`Found: ${stats}`);\r\n\r\n generateRoutesFile(manifest, outputDir);\r\n\r\n console.log(`Generated route manifest in: ${outputDir}`);\r\n\r\n return manifest;\r\n}\r\n","/**\r\n * Types Generate Command\r\n *\r\n * Generates TypeScript declaration files for routes and environment variables.\r\n * This command is opt-in and explicit - follows Flight's toolbox philosophy.\r\n *\r\n * Usage:\r\n * flight types:generate # Generate route types (default)\r\n * flight types:generate --routes # Generate route types only\r\n * flight types:generate --env # Generate env types only\r\n * flight types:generate --watch # Watch mode for development\r\n *\r\n * Output:\r\n * src/.flight/routes.d.ts - Route type definitions\r\n * src/.flight/env.d.ts - Environment variable types\r\n */\r\n\r\nimport { resolve } from 'path';\r\nimport { generateTypes, watchAndGenerate } from '../generators/typegen.js';\r\n\r\nexport interface TypesGenerateOptions {\r\n /** Routes directory (default: src/routes) */\r\n routesDir?: string;\r\n\r\n /** Output directory (default: src/.flight) */\r\n outputDir?: string;\r\n\r\n /** Generate route types (default: true) */\r\n routes?: boolean;\r\n\r\n /** Generate environment variable types (default: false) */\r\n env?: boolean;\r\n\r\n /** Watch for changes and regenerate (default: false) */\r\n watch?: boolean;\r\n}\r\n\r\nexport async function typesGenerateCommand(options: TypesGenerateOptions = {}): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n const routesDir = options.routesDir\r\n ? resolve(cwd, options.routesDir)\r\n : resolve(cwd, 'src/routes');\r\n\r\n const outputDir = options.outputDir\r\n ? resolve(cwd, options.outputDir)\r\n : resolve(cwd, 'src/.flight');\r\n\r\n // Default to routes if no specific flag is set\r\n const includeRoutes = options.routes ?? (!options.env);\r\n const includeEnv = options.env ?? false;\r\n\r\n console.log('Flight Type Generator');\r\n console.log('---------------------');\r\n console.log(`Routes directory: ${routesDir}`);\r\n console.log(`Output directory: ${outputDir}`);\r\n console.log(`Generate routes: ${includeRoutes}`);\r\n console.log(`Generate env: ${includeEnv}`);\r\n console.log('');\r\n\r\n try {\r\n if (options.watch) {\r\n console.log('Watching for changes... (Ctrl+C to stop)');\r\n console.log('');\r\n\r\n const cleanup = watchAndGenerate({\r\n routesDir,\r\n outputDir,\r\n includeRoutes,\r\n includeEnv,\r\n projectRoot: cwd,\r\n onRegenerate: (result) => {\r\n console.log(`Regenerated: ${result.filesWritten.length} files`);\r\n },\r\n });\r\n\r\n // Handle graceful shutdown\r\n process.on('SIGINT', () => {\r\n console.log('\\nStopping watch mode...');\r\n cleanup();\r\n process.exit(0);\r\n });\r\n\r\n // Keep process alive\r\n await new Promise(() => { });\r\n } else {\r\n const result = await generateTypes({\r\n routesDir,\r\n outputDir,\r\n includeRoutes,\r\n includeEnv,\r\n projectRoot: cwd,\r\n });\r\n\r\n console.log('Type generation complete!');\r\n console.log('');\r\n console.log('Files written:');\r\n for (const file of result.filesWritten) {\r\n console.log(` - ${file}`);\r\n }\r\n console.log('');\r\n console.log('Add to your tsconfig.json includes:');\r\n console.log(' \"include\": [\"src\", \"src/.flight/*.d.ts\"]');\r\n }\r\n } catch (error) {\r\n console.error('Type generation failed:', error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Add Command\r\n * \r\n * Add Flight packages to an existing project.\r\n * Toolbox philosophy: add only what you need, when you need it.\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\nimport { execSync } from 'node:child_process';\r\nimport { consola } from 'consola';\r\n\r\nconst PACKAGES: Record<string, PackageInfo> = {\r\n // Core\r\n 'http': {\r\n name: '@flight-framework/http',\r\n description: 'HTTP server with routing and middleware',\r\n category: 'core',\r\n },\r\n 'core': {\r\n name: '@flight-framework/core',\r\n description: 'File-based routing and configuration',\r\n category: 'core',\r\n },\r\n\r\n // Data\r\n 'db': {\r\n name: '@flight-framework/db',\r\n description: 'Database abstraction layer',\r\n category: 'data',\r\n drivers: ['pg', '@libsql/client', '@neondatabase/serverless', '@supabase/supabase-js'],\r\n },\r\n 'cache': {\r\n name: '@flight-framework/cache',\r\n description: 'Caching with multiple adapters',\r\n category: 'data',\r\n },\r\n\r\n // Auth\r\n 'auth': {\r\n name: '@flight-framework/auth',\r\n description: 'Authentication adapters',\r\n category: 'auth',\r\n },\r\n\r\n // Frontend\r\n 'forms': {\r\n name: '@flight-framework/forms',\r\n description: 'Type-safe form handling',\r\n category: 'frontend',\r\n },\r\n 'i18n': {\r\n name: '@flight-framework/i18n',\r\n description: 'Internationalization',\r\n category: 'frontend',\r\n },\r\n 'seo': {\r\n name: '@flight-framework/seo',\r\n description: 'SEO utilities',\r\n category: 'frontend',\r\n },\r\n 'image': {\r\n name: '@flight-framework/image',\r\n description: 'Image optimization',\r\n category: 'frontend',\r\n },\r\n\r\n // Communication\r\n 'email': {\r\n name: '@flight-framework/email',\r\n description: 'Email sending',\r\n category: 'communication',\r\n },\r\n 'realtime': {\r\n name: '@flight-framework/realtime',\r\n description: 'WebSocket and real-time features',\r\n category: 'communication',\r\n },\r\n\r\n // Deployment\r\n 'helpers': {\r\n name: '@flight-framework/helpers',\r\n description: 'Optional helper utilities (detection, suggestions)',\r\n category: 'utilities',\r\n },\r\n};\r\n\r\ninterface PackageInfo {\r\n name: string;\r\n description: string;\r\n category: string;\r\n drivers?: string[];\r\n}\r\n\r\nexport async function addCommand(packageName: string | undefined): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n // Check if we're in a project\r\n if (!existsSync(join(cwd, 'package.json'))) {\r\n consola.error('No package.json found. Run this command from your project directory.');\r\n process.exit(1);\r\n }\r\n\r\n // If no package specified, show available packages\r\n if (!packageName) {\r\n showAvailablePackages();\r\n return;\r\n }\r\n\r\n // Find the package\r\n const pkg = PACKAGES[packageName];\r\n if (!pkg) {\r\n consola.error(`Unknown package: ${packageName}`);\r\n consola.log('Run `flight add` to see available packages.');\r\n process.exit(1);\r\n }\r\n\r\n consola.info(`Adding ${pkg.name}...`);\r\n consola.log(pkg.description);\r\n consola.log('');\r\n\r\n // Detect package manager\r\n const pm = detectPackageManager();\r\n\r\n // Install the package\r\n try {\r\n const installCmd = pm === 'npm' ? 'npm install' : `${pm} add`;\r\n execSync(`${installCmd} ${pkg.name}`, { cwd, stdio: 'inherit' });\r\n\r\n consola.success(`${pkg.name} added successfully!`);\r\n\r\n // Show next steps\r\n showNextSteps(packageName, pkg);\r\n\r\n } catch (error) {\r\n consola.error(`Failed to install ${pkg.name}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction detectPackageManager(): string {\r\n const cwd = process.cwd();\r\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\r\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\r\n if (existsSync(join(cwd, 'bun.lockb'))) return 'bun';\r\n return 'npm';\r\n}\r\n\r\nfunction showAvailablePackages(): void {\r\n consola.log(`\r\nAvailable Flight packages:\r\n\r\nCore\r\n http HTTP server with routing and middleware\r\n core File-based routing and configuration\r\n\r\nData\r\n db Database abstraction layer\r\n cache Caching with multiple adapters\r\n\r\nAuth\r\n auth Authentication adapters\r\n\r\nFrontend\r\n forms Type-safe form handling\r\n i18n Internationalization\r\n seo SEO utilities\r\n image Image optimization\r\n\r\nCommunication\r\n email Email sending\r\n realtime WebSocket and real-time features\r\n\r\nUtilities\r\n helpers Optional helper utilities\r\n\r\nUsage:\r\n flight add http\r\n flight add db\r\n flight add auth\r\n`);\r\n}\r\n\r\nfunction showNextSteps(packageName: string, pkg: PackageInfo): void {\r\n const examples: Record<string, string> = {\r\n 'http': `\r\nQuick example:\r\n\r\n import { createServer } from '@flight-framework/http';\r\n \r\n const app = createServer();\r\n app.get('/', (c) => c.json({ hello: 'world' }));\r\n \r\n export default { port: 3000, fetch: app.fetch };\r\n`,\r\n 'db': `\r\nQuick example:\r\n\r\n import { createDb } from '@flight-framework/db';\r\n import { postgres } from '@flight-framework/db/postgres';\r\n \r\n const db = createDb(postgres({ connectionString: process.env.DATABASE_URL }));\r\n const users = await db.query('SELECT * FROM users');\r\n\r\nYou may also need a driver:\r\n npm install pg # PostgreSQL\r\n npm install @libsql/client # Turso/SQLite\r\n npm install @neondatabase/serverless # Neon\r\n`,\r\n 'cache': `\r\nQuick example:\r\n\r\n import { createCache, lru } from '@flight-framework/cache';\r\n \r\n const cache = createCache(lru({ max: 1000 }));\r\n await cache.set('key', { data: 'value' });\r\n const value = await cache.get('key');\r\n`,\r\n 'auth': `\r\nQuick example:\r\n\r\n import { createAuth } from '@flight-framework/auth';\r\n import { betterAuth } from '@flight-framework/auth/better-auth';\r\n \r\n const auth = createAuth(betterAuth({ db }));\r\n const user = await auth.getUser(request);\r\n`,\r\n 'forms': `\r\nQuick example:\r\n\r\n import { createForm } from '@flight-framework/forms';\r\n import { zodAdapter } from '@flight-framework/forms/adapters/zod';\r\n \r\n const form = createForm({ schema: zodAdapter(schema) });\r\n const result = form.validate(data);\r\n`,\r\n };\r\n\r\n if (examples[packageName]) {\r\n consola.log(examples[packageName]);\r\n }\r\n\r\n consola.log(`Docs: https://flight.dev/docs/packages/${packageName}`);\r\n}\r\n\r\nexport function registerAddCommand(program: any): void {\r\n program\r\n .command('add [package]')\r\n .description('Add a Flight package to your project')\r\n .action(addCommand);\r\n}\r\n","/**\r\n * Flight CLI - Adapter Create Command\r\n * \r\n * Scaffolds a new adapter package with all necessary files.\r\n * \r\n * Usage:\r\n * flight adapter:create my-platform\r\n * flight adapter:create my-platform --type edge\r\n * flight adapter:create my-platform --validation\r\n * \r\n * @module @flight-framework/cli/commands/adapter-create\r\n */\r\n\r\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\nimport { consola } from 'consola';\r\n\r\nexport interface AdapterCreateOptions {\r\n /** Adapter name (e.g., 'my-platform') */\r\n name: string;\r\n /** Platform type for template selection */\r\n type?: 'node' | 'edge' | 'container' | 'serverless';\r\n /** Include Zod validation example */\r\n validation?: boolean;\r\n /** Output directory (default: packages/adapter-{name}) */\r\n outputDir?: string;\r\n}\r\n\r\nexport async function adapterCreateCommand(name: string, options: Partial<AdapterCreateOptions> = {}): Promise<void> {\r\n const cwd = process.cwd();\r\n const adapterName = name.toLowerCase().replace(/[^a-z0-9-]/g, '-');\r\n const packageName = `@flight-framework/adapter-${adapterName}`;\r\n const outputDir = options.outputDir || join(cwd, 'packages', `adapter-${adapterName}`);\r\n const type = options.type || 'node';\r\n const includeValidation = options.validation || false;\r\n\r\n consola.info(`Creating adapter: ${packageName}`);\r\n\r\n // Check if directory exists\r\n if (existsSync(outputDir)) {\r\n consola.error(`Directory already exists: ${outputDir}`);\r\n process.exit(1);\r\n }\r\n\r\n // Create directory structure\r\n mkdirSync(join(outputDir, 'src'), { recursive: true });\r\n mkdirSync(join(outputDir, 'tests'), { recursive: true });\r\n\r\n // Generate files\r\n const files = generateAdapterFiles(adapterName, packageName, type, includeValidation);\r\n\r\n for (const [filePath, content] of Object.entries(files)) {\r\n const fullPath = join(outputDir, filePath);\r\n writeFileSync(fullPath, content, 'utf-8');\r\n consola.success(`Created ${filePath}`);\r\n }\r\n\r\n consola.success(`Adapter created successfully!\r\n\r\n Next steps:\r\n 1. cd packages/adapter-${adapterName}\r\n 2. Implement your adapter logic in src/index.ts\r\n 3. Run: pnpm build\r\n 4. Test: pnpm test\r\n\r\n Documentation:\r\n https://flight.dev/docs/adapters/custom\r\n`);\r\n}\r\n\r\nfunction generateAdapterFiles(\r\n name: string,\r\n packageName: string,\r\n type: string,\r\n includeValidation: boolean\r\n): Record<string, string> {\r\n const pascalName = name\r\n .split('-')\r\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\r\n .join('');\r\n\r\n return {\r\n 'package.json': generatePackageJson(packageName, includeValidation),\r\n 'tsconfig.json': generateTsConfig(),\r\n 'tsup.config.ts': generateTsupConfig(),\r\n 'src/index.ts': generateAdapterSource(name, pascalName, type, includeValidation),\r\n 'tests/adapter.test.ts': generateAdapterTest(name, pascalName),\r\n 'README.md': generateReadme(name, packageName),\r\n };\r\n}\r\n\r\nfunction generatePackageJson(packageName: string, includeValidation: boolean): string {\r\n const pkg = {\r\n name: packageName,\r\n version: '0.1.0',\r\n description: `Flight adapter for custom platform`,\r\n type: 'module',\r\n main: './dist/index.js',\r\n types: './dist/index.d.ts',\r\n exports: {\r\n '.': {\r\n types: './dist/index.d.ts',\r\n import: './dist/index.js',\r\n },\r\n },\r\n scripts: {\r\n build: 'tsup',\r\n test: 'vitest run',\r\n 'test:watch': 'vitest',\r\n },\r\n dependencies: {\r\n '@flight-framework/core': '^0.4.0',\r\n },\r\n devDependencies: {\r\n tsup: '^8.0.0',\r\n typescript: '^5.0.0',\r\n vitest: '^2.0.0',\r\n ...(includeValidation ? { zod: '^3.23.0' } : {}),\r\n },\r\n peerDependencies: includeValidation ? {\r\n zod: '^3.0.0',\r\n } : undefined,\r\n peerDependenciesMeta: includeValidation ? {\r\n zod: { optional: true },\r\n } : undefined,\r\n };\r\n\r\n return JSON.stringify(pkg, null, 2);\r\n}\r\n\r\nfunction generateTsConfig(): string {\r\n return JSON.stringify({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n outDir: './dist',\r\n rootDir: './src',\r\n },\r\n include: ['src'],\r\n }, null, 2);\r\n}\r\n\r\nfunction generateTsupConfig(): string {\r\n return `import { defineConfig } from 'tsup';\r\n\r\nexport default defineConfig({\r\n entry: ['src/index.ts'],\r\n format: ['esm'],\r\n dts: true,\r\n clean: true,\r\n target: 'node20',\r\n});\r\n`;\r\n}\r\n\r\nfunction generateAdapterSource(\r\n name: string,\r\n pascalName: string,\r\n type: string,\r\n includeValidation: boolean\r\n): string {\r\n if (includeValidation) {\r\n return `/**\r\n * Flight Adapter - ${pascalName}\r\n * \r\n * Custom deployment adapter with optional Zod validation.\r\n */\r\n\r\nimport { createValidatedAdapter, type AdapterBuilder } from '@flight-framework/core/adapters';\r\nimport { z } from 'zod';\r\n\r\n// ============================================================================\r\n// Options Schema (Optional - Zod validation)\r\n// ============================================================================\r\n\r\nconst optionsSchema = z.object({\r\n /** Server port */\r\n port: z.number().default(3000),\r\n /** Enable health check endpoint */\r\n healthCheck: z.boolean().default(true),\r\n /** Custom environment variables */\r\n env: z.record(z.string()).optional(),\r\n});\r\n\r\nexport type ${pascalName}AdapterOptions = z.infer<typeof optionsSchema>;\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\nexport default createValidatedAdapter('${name}', optionsSchema, (options) => ({\r\n async adapt(builder: AdapterBuilder) {\r\n builder.log.info(\\`Building for ${pascalName} platform...\\`);\r\n builder.log.info(\\`Port: \\${options.port}\\`);\r\n\r\n // Generate server entry\r\n await generateServerEntry(builder, options);\r\n\r\n // Generate platform-specific config\r\n await generatePlatformConfig(builder, options);\r\n\r\n builder.log.info('Build complete!');\r\n },\r\n\r\n supports: {\r\n node: () => ${type === 'node' || type === 'container'},\r\n edge: () => ${type === 'edge' || type === 'serverless'},\r\n streaming: () => ${type === 'node'},\r\n websockets: () => ${type === 'node'},\r\n },\r\n\r\n emulate: () => ({\r\n env: {\r\n ${name.toUpperCase().replace(/-/g, '_')}_PLATFORM: 'true',\r\n PORT: String(options.port),\r\n },\r\n }),\r\n}));\r\n\r\n// ============================================================================\r\n// Generator Functions\r\n// ============================================================================\r\n\r\nasync function generateServerEntry(builder: AdapterBuilder, options: ${pascalName}AdapterOptions): Promise<void> {\r\n const serverCode = \\`\r\nimport { createUniversalHandler } from '@flight-framework/core/adapters';\r\nimport manifest from './manifest.js';\r\n\r\nconst handler = createUniversalHandler(manifest);\r\n\r\nconst server = Bun.serve({\r\n port: \\${options.port},\r\n fetch: handler,\r\n});\r\n\r\nconsole.log(\\\\\\`Server running at http://localhost:\\${options.port}\\\\\\`);\r\n\\`;\r\n\r\n await builder.writeFile('server.ts', serverCode.trim());\r\n}\r\n\r\nasync function generatePlatformConfig(builder: AdapterBuilder, options: ${pascalName}AdapterOptions): Promise<void> {\r\n const config = {\r\n name: '${name}-app',\r\n port: options.port,\r\n healthCheck: options.healthCheck ? '/health' : null,\r\n };\r\n\r\n await builder.writeFile('platform.json', JSON.stringify(config, null, 2));\r\n}\r\n`;\r\n }\r\n\r\n // Without validation (default)\r\n return `/**\r\n * Flight Adapter - ${pascalName}\r\n * \r\n * Custom deployment adapter for ${pascalName} platform.\r\n * \r\n * @example\r\n * \\`\\`\\`typescript\r\n * import ${name.replace(/-/g, '')} from '${name.includes('@') ? name : `@flight-framework/adapter-${name}`}';\r\n * \r\n * export default defineConfig({\r\n * adapter: ${name.replace(/-/g, '')}({\r\n * port: 3000,\r\n * }),\r\n * });\r\n * \\`\\`\\`\r\n */\r\n\r\nimport { createAdapter, type AdapterBuilder } from '@flight-framework/core/adapters';\r\n\r\n// ============================================================================\r\n// Options Interface\r\n// ============================================================================\r\n\r\nexport interface ${pascalName}AdapterOptions {\r\n /** Server port (default: 3000) */\r\n port?: number;\r\n /** Enable health check endpoint (default: true) */\r\n healthCheck?: boolean;\r\n /** Custom environment variables */\r\n env?: Record<string, string>;\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\nexport default function ${name.replace(/-/g, '')}Adapter(options: ${pascalName}AdapterOptions = {}) {\r\n const {\r\n port = 3000,\r\n healthCheck = true,\r\n env = {},\r\n } = options;\r\n\r\n return createAdapter({\r\n name: '${name}',\r\n\r\n async adapt(builder: AdapterBuilder) {\r\n builder.log.info(\\`Building for ${pascalName} platform...\\`);\r\n builder.log.info(\\`Port: \\${port}\\`);\r\n\r\n // Generate server entry\r\n await generateServerEntry(builder, port, healthCheck);\r\n\r\n // Generate platform-specific config\r\n await generatePlatformConfig(builder, port, healthCheck);\r\n\r\n builder.log.info('Build complete!');\r\n },\r\n\r\n supports: {\r\n node: () => ${type === 'node' || type === 'container'},\r\n edge: () => ${type === 'edge' || type === 'serverless'},\r\n streaming: () => ${type === 'node'},\r\n websockets: () => ${type === 'node'},\r\n },\r\n\r\n emulate: () => ({\r\n env: {\r\n ${name.toUpperCase().replace(/-/g, '_')}_PLATFORM: 'true',\r\n PORT: String(port),\r\n ...env,\r\n },\r\n }),\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Generator Functions\r\n// ============================================================================\r\n\r\nasync function generateServerEntry(\r\n builder: AdapterBuilder,\r\n port: number,\r\n healthCheck: boolean\r\n): Promise<void> {\r\n const serverCode = \\`\r\nimport { createServer } from 'node:http';\r\nimport { createUniversalHandler } from '@flight-framework/core/adapters';\r\nimport manifest from './manifest.js';\r\n\r\nconst handler = createUniversalHandler(manifest);\r\n\r\nconst server = createServer(async (req, res) => {\r\n const url = req.url || '/';\r\n \r\n // Health check endpoint\r\n if (url === '/health' && \\${healthCheck}) {\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ status: 'ok' }));\r\n return;\r\n }\r\n\r\n // Handle request with Flight\r\n const webReq = new Request(\\\\\\`http://localhost\\${url}\\\\\\`, {\r\n method: req.method,\r\n headers: Object.fromEntries(\r\n Object.entries(req.headers).filter(([_, v]) => v != null).map(([k, v]) => [k, String(v)])\r\n ),\r\n });\r\n\r\n const response = await handler(webReq);\r\n\r\n res.writeHead(response.status, Object.fromEntries(response.headers));\r\n res.end(await response.text());\r\n});\r\n\r\nserver.listen(\\${port}, () => {\r\n console.log(\\\\\\`Server running at http://localhost:\\${port}\\\\\\`);\r\n});\r\n\\`;\r\n\r\n await builder.writeFile('server.mjs', serverCode.trim());\r\n}\r\n\r\nasync function generatePlatformConfig(\r\n builder: AdapterBuilder,\r\n port: number,\r\n healthCheck: boolean\r\n): Promise<void> {\r\n const config = {\r\n name: '${name}-app',\r\n port,\r\n healthCheck: healthCheck ? '/health' : null,\r\n };\r\n\r\n await builder.writeFile('platform.json', JSON.stringify(config, null, 2));\r\n}\r\n`;\r\n}\r\n\r\nfunction generateAdapterTest(name: string, pascalName: string): string {\r\n return `/**\r\n * ${pascalName} Adapter Tests\r\n */\r\n\r\nimport { describe, it, expect, vi } from 'vitest';\r\nimport adapter from '../src/index.js';\r\n\r\ndescribe('adapter-${name}', () => {\r\n const createMockBuilder = () => ({\r\n manifest: {\r\n entries: {},\r\n files: [],\r\n routes: [],\r\n },\r\n root: '/test',\r\n outDir: '/test/dist',\r\n readFile: vi.fn(),\r\n writeFile: vi.fn(),\r\n copy: vi.fn(),\r\n glob: vi.fn(),\r\n log: {\r\n info: vi.fn(),\r\n warn: vi.fn(),\r\n error: vi.fn(),\r\n },\r\n });\r\n\r\n it('should have correct name', () => {\r\n const instance = adapter();\r\n expect(instance.name).toBe('${name}');\r\n });\r\n\r\n it('should generate server entry', async () => {\r\n const instance = adapter({ port: 4000 });\r\n const builder = createMockBuilder();\r\n\r\n await instance.adapt(builder);\r\n\r\n expect(builder.writeFile).toHaveBeenCalledWith(\r\n 'server.mjs',\r\n expect.stringContaining('4000')\r\n );\r\n });\r\n\r\n it('should generate platform config', async () => {\r\n const instance = adapter();\r\n const builder = createMockBuilder();\r\n\r\n await instance.adapt(builder);\r\n\r\n expect(builder.writeFile).toHaveBeenCalledWith(\r\n 'platform.json',\r\n expect.any(String)\r\n );\r\n });\r\n\r\n it('should declare supported features', () => {\r\n const instance = adapter();\r\n\r\n expect(instance.supports?.node?.()).toBeDefined();\r\n expect(instance.supports?.streaming?.()).toBeDefined();\r\n });\r\n\r\n it('should provide emulation environment', () => {\r\n const instance = adapter({ port: 5000 });\r\n const emulation = instance.emulate?.();\r\n\r\n expect(emulation?.env?.PORT).toBe('5000');\r\n expect(emulation?.env?.${name.toUpperCase().replace(/-/g, '_')}_PLATFORM).toBe('true');\r\n });\r\n});\r\n`;\r\n}\r\n\r\nfunction generateReadme(name: string, packageName: string): string {\r\n return `# ${packageName}\r\n\r\nFlight adapter for ${name} platform.\r\n\r\n## Installation\r\n\r\n\\`\\`\\`bash\r\nnpm install ${packageName}\r\n\\`\\`\\`\r\n\r\n## Usage\r\n\r\n\\`\\`\\`typescript\r\nimport { defineConfig } from '@flight-framework/core';\r\nimport ${name.replace(/-/g, '')} from '${packageName}';\r\n\r\nexport default defineConfig({\r\n adapter: ${name.replace(/-/g, '')}({\r\n port: 3000,\r\n healthCheck: true,\r\n }),\r\n});\r\n\\`\\`\\`\r\n\r\n## Options\r\n\r\n| Option | Type | Default | Description |\r\n|--------|------|---------|-------------|\r\n| \\`port\\` | \\`number\\` | \\`3000\\` | Server port |\r\n| \\`healthCheck\\` | \\`boolean\\` | \\`true\\` | Enable health check endpoint |\r\n| \\`env\\` | \\`Record<string, string>\\` | \\`{}\\` | Custom environment variables |\r\n\r\n## License\r\n\r\nMIT\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":["consola","projectPath","resolve","join","readFileSync","existsSync","consola","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","consola","resolve","join","existsSync","readFileSync","resolve","existsSync","consola","loadConfig","resolve","existsSync","consola","loadConfig","build","resolve","consola","loadConfig","consola","resolve","loadConfig","preview","resolve","readdirSync","statSync","existsSync","writeFileSync","mkdirSync","join","dirname","filePathToUrlPath","existsSync","readdirSync","join","statSync","filePathToUrlPath","dirname","mkdirSync","writeFileSync","resolve","resolve","resolve","existsSync","join","execSync","consola","detectPackageManager","existsSync","mkdirSync","writeFileSync","join","consola","consola"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/version.ts","../src/commands/create.ts","../src/commands/dev.ts","../src/generators/typegen.ts","../src/commands/build.ts","../src/commands/preview.ts","../src/commands/routes-generate.ts","../src/generators/routes.ts","../src/commands/types-generate.ts","../src/commands/add.ts","../src/commands/adapter-create.ts","../src/bin.ts"],"sourcesContent":["/**\r\n * Flight CLI - Command Line Interface for Flight Framework\r\n * \r\n * Built with citty (UnJS) - ESM-first CLI builder\r\n * Following 2026 best practices for Node.js CLI tools\r\n * \r\n * @see https://github.com/unjs/citty\r\n */\r\nimport { defineCommand, runMain } from 'citty';\r\nimport { consola } from 'consola';\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\nimport { routesGenerateCommand } from './commands/routes-generate.js';\r\nimport { typesGenerateCommand } from './commands/types-generate.js';\r\nimport { addCommand } from './commands/add.js';\r\nimport { adapterCreateCommand } from './commands/adapter-create.js';\r\n\r\n// Logo - using consola for styled output\r\nconst LOGO = `\r\n ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗\r\n ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝\r\n █████╗ ██║ ██║██║ ███╗███████║ ██║ \r\n ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ \r\n ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ \r\n ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ \r\n \r\n The Agnostic Full-Stack Framework\r\n Maximum Flexibility. Zero Lock-in.\r\n`;\r\n\r\nexport function printLogo(): void {\r\n consola.log(LOGO);\r\n}\r\n\r\n/**\r\n * Create subcommand\r\n */\r\nconst create = defineCommand({\r\n meta: {\r\n name: 'create',\r\n description: 'Create a new Flight project',\r\n },\r\n args: {\r\n name: {\r\n type: 'positional',\r\n description: 'Project name',\r\n required: false,\r\n },\r\n template: {\r\n type: 'string',\r\n alias: 't',\r\n description: 'Project template to use',\r\n default: 'basic',\r\n },\r\n ui: {\r\n type: 'string',\r\n description: 'UI framework (react, vue, svelte, solid, vanilla)',\r\n },\r\n 'use-case': {\r\n type: 'string',\r\n description: 'Use-case template (blog, ecommerce, saas, api, docs)',\r\n },\r\n ts: {\r\n type: 'boolean',\r\n description: 'Use TypeScript',\r\n default: true,\r\n },\r\n git: {\r\n type: 'boolean',\r\n description: 'Initialize git repository',\r\n default: true,\r\n },\r\n install: {\r\n type: 'boolean',\r\n description: 'Install dependencies',\r\n default: true,\r\n },\r\n raw: {\r\n type: 'boolean',\r\n description: 'Create raw project (100% Web Standards, zero dependencies)',\r\n },\r\n empty: {\r\n type: 'boolean',\r\n description: 'Create empty project (just package.json)',\r\n },\r\n minimal: {\r\n type: 'boolean',\r\n description: 'Create minimal project (single server file with Flight)',\r\n },\r\n },\r\n run({ args }) {\r\n return createCommand(args.name, args);\r\n },\r\n});\r\n\r\n/**\r\n * Add subcommand\r\n */\r\nconst add = defineCommand({\r\n meta: {\r\n name: 'add',\r\n description: 'Add a Flight package to your project',\r\n },\r\n args: {\r\n package: {\r\n type: 'positional',\r\n description: 'Package name to add',\r\n required: false,\r\n },\r\n },\r\n run({ args }) {\r\n return addCommand(args.package);\r\n },\r\n});\r\n\r\n/**\r\n * Dev subcommand\r\n */\r\nconst dev = defineCommand({\r\n meta: {\r\n name: 'dev',\r\n description: 'Start development server',\r\n },\r\n args: {\r\n port: {\r\n type: 'string',\r\n alias: 'p',\r\n description: 'Port to listen on',\r\n },\r\n host: {\r\n type: 'string',\r\n alias: 'h',\r\n description: 'Host to bind to',\r\n },\r\n open: {\r\n type: 'boolean',\r\n description: 'Open browser on start',\r\n },\r\n https: {\r\n type: 'boolean',\r\n description: 'Enable HTTPS',\r\n },\r\n ssr: {\r\n type: 'boolean',\r\n description: 'Enable Server-Side Rendering',\r\n },\r\n },\r\n run({ args }) {\r\n return devCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Build subcommand\r\n */\r\nconst build = defineCommand({\r\n meta: {\r\n name: 'build',\r\n description: 'Build for production',\r\n },\r\n args: {\r\n outDir: {\r\n type: 'string',\r\n description: 'Output directory',\r\n },\r\n sourcemap: {\r\n type: 'boolean',\r\n description: 'Generate source maps',\r\n },\r\n minify: {\r\n type: 'boolean',\r\n description: 'Minify output',\r\n default: true,\r\n },\r\n },\r\n run({ args }) {\r\n return buildCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Preview subcommand\r\n */\r\nconst preview = defineCommand({\r\n meta: {\r\n name: 'preview',\r\n description: 'Preview production build',\r\n },\r\n args: {\r\n port: {\r\n type: 'string',\r\n alias: 'p',\r\n description: 'Port to listen on',\r\n },\r\n host: {\r\n type: 'string',\r\n alias: 'h',\r\n description: 'Host to bind to',\r\n },\r\n open: {\r\n type: 'boolean',\r\n description: 'Open browser on start',\r\n },\r\n },\r\n run({ args }) {\r\n return previewCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Routes generate subcommand\r\n */\r\nconst routesGenerate = defineCommand({\r\n meta: {\r\n name: 'routes:generate',\r\n description: 'Generate route manifest from routes directory',\r\n },\r\n args: {\r\n routesDir: {\r\n type: 'string',\r\n description: 'Routes directory',\r\n default: 'src/routes',\r\n },\r\n outputDir: {\r\n type: 'string',\r\n description: 'Output directory',\r\n default: 'src/.flight',\r\n },\r\n },\r\n run({ args }) {\r\n return routesGenerateCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Types generate subcommand\r\n */\r\nconst typesGenerate = defineCommand({\r\n meta: {\r\n name: 'types:generate',\r\n description: 'Generate TypeScript types for routes and environment',\r\n },\r\n args: {\r\n routesDir: {\r\n type: 'string',\r\n description: 'Routes directory',\r\n default: 'src/routes',\r\n },\r\n outputDir: {\r\n type: 'string',\r\n description: 'Output directory',\r\n default: 'src/.flight',\r\n },\r\n routes: {\r\n type: 'boolean',\r\n description: 'Generate route types',\r\n default: true,\r\n },\r\n env: {\r\n type: 'boolean',\r\n description: 'Generate environment variable types',\r\n },\r\n watch: {\r\n type: 'boolean',\r\n description: 'Watch for changes and regenerate',\r\n },\r\n },\r\n run({ args }) {\r\n return typesGenerateCommand(args);\r\n },\r\n});\r\n\r\n/**\r\n * Adapter create subcommand\r\n */\r\nconst adapterCreate = defineCommand({\r\n meta: {\r\n name: 'adapter:create',\r\n description: 'Create a new adapter package',\r\n },\r\n args: {\r\n name: {\r\n type: 'positional',\r\n description: 'Adapter name',\r\n required: true,\r\n },\r\n type: {\r\n type: 'string',\r\n alias: 't',\r\n description: 'Platform type (node, edge, container, serverless)',\r\n default: 'node',\r\n },\r\n validation: {\r\n type: 'boolean',\r\n description: 'Include Zod validation example',\r\n },\r\n outputDir: {\r\n type: 'string',\r\n description: 'Output directory',\r\n },\r\n },\r\n run({ args }) {\r\n return adapterCreateCommand(args.name, {\r\n ...args,\r\n type: args.type as 'node' | 'edge' | 'container' | 'serverless',\r\n });\r\n },\r\n});\r\n\r\n/**\r\n * Main CLI command\r\n */\r\nconst main = defineCommand({\r\n meta: {\r\n name: 'flight',\r\n version: VERSION,\r\n description: 'The Agnostic Full-Stack Framework - Maximum Flexibility. Zero Lock-in.',\r\n },\r\n subCommands: {\r\n create,\r\n add,\r\n dev,\r\n build,\r\n preview,\r\n 'routes:generate': routesGenerate,\r\n 'types:generate': typesGenerate,\r\n 'adapter:create': adapterCreate,\r\n },\r\n setup() {\r\n // Show logo when CLI starts\r\n printLogo();\r\n },\r\n});\r\n\r\n/**\r\n * Run the CLI\r\n */\r\nexport function run(): void {\r\n runMain(main);\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 { consola } from 'consola';\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 bundler?: string;\r\n useCase?: string;\r\n ts: boolean;\r\n git: boolean;\r\n install: boolean;\r\n /** Create empty project (just package.json) */\r\n empty: boolean;\r\n /** Create minimal project (single server file with Flight) */\r\n minimal: boolean;\r\n /** Create raw project (100% Web Standards, zero Flight dependencies) */\r\n raw: 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\nconst BUNDLERS = [\r\n { title: 'Vite', value: 'vite', description: 'Next Gen Frontend Tooling (recommended)' },\r\n { title: 'FlightPack', value: 'flightpack', description: 'Native Rust bundler for maximum performance' },\r\n { title: 'esbuild', value: 'esbuild', description: 'Ultra-fast builds for performance-focused projects' },\r\n { title: 'Rolldown', value: 'rolldown', description: 'Rust-based Rollup replacement (experimental)' },\r\n];\r\n\r\nconst USE_CASES = [\r\n { title: 'Web Application', value: '', description: 'Choose UI framework manually' },\r\n { title: 'Blog', value: 'blog', description: 'Blog with SEO and markdown support' },\r\n { title: 'E-commerce', value: 'ecommerce', description: 'Store with products and cart' },\r\n { title: 'SaaS', value: 'saas', description: 'SaaS app with auth and dashboard' },\r\n { title: 'API Only', value: 'api', description: 'REST API without UI' },\r\n { title: 'Documentation', value: 'docs', description: 'Documentation site' },\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 consola.info('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 consola.error('Project creation cancelled.');\r\n return;\r\n }\r\n\r\n // Handle --raw mode: 100% Web Standards, ZERO Flight dependencies\r\n if (options.raw) {\r\n const projectPath = resolve(process.cwd(), projectName);\r\n createRawProject(projectPath, projectName, options);\r\n return;\r\n }\r\n\r\n // Handle --empty mode: just package.json\r\n if (options.empty) {\r\n const projectPath = resolve(process.cwd(), projectName);\r\n createEmptyProject(projectPath, projectName, options);\r\n return;\r\n }\r\n\r\n // Handle --minimal mode: single file project with Flight\r\n if (options.minimal) {\r\n const projectPath = resolve(process.cwd(), projectName);\r\n createMinimalProject(projectPath, projectName, options);\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 consola.error('Project creation cancelled.');\r\n return;\r\n }\r\n\r\n // Check for use-case templates\r\n let useCase = options.useCase;\r\n const useCaseDir = join(TEMPLATES_DIR, 'use-cases', useCase || '');\r\n const isUseCase = useCase && existsSync(useCaseDir);\r\n\r\n // Bundler selection\r\n let bundler = options.bundler;\r\n if (!bundler) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'bundler',\r\n message: 'Choose your bundler:',\r\n choices: BUNDLERS,\r\n initial: 0,\r\n });\r\n bundler = response.bundler;\r\n }\r\n\r\n if (!bundler) {\r\n consola.error('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 consola.error('Project creation cancelled.');\r\n return;\r\n }\r\n }\r\n }\r\n\r\n consola.log(`\\nCreating project in ${projectPath}...\\n`);\r\n\r\n try {\r\n // Copy templates\r\n if (isUseCase && useCase) {\r\n copyUseCaseTemplate(projectPath, useCase, projectName);\r\n } else {\r\n copyTemplate(projectPath, uiFramework, bundler, projectName);\r\n }\r\n consola.success('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 consola.success('Git repository initialized');\r\n } catch {\r\n consola.warn('Could not initialize git repository');\r\n }\r\n }\r\n\r\n // Install dependencies\r\n if (options.install) {\r\n consola.log('\\nInstalling dependencies...\\n');\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n consola.success('Dependencies installed');\r\n } catch {\r\n consola.warn('Could not install dependencies. Run `npm install` manually.');\r\n }\r\n }\r\n\r\n // Success message\r\n consola.box(`\r\nProject created successfully!\r\n\r\nNext steps:\r\n\r\n $ cd ${projectName}\r\n $ ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\nYour project is 100% yours:\r\n • No telemetry\r\n • No lock-in\r\n • Deploy anywhere\r\n\r\nHappy flying!\r\n`);\r\n } catch (error) {\r\n consola.error('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, bundler: 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 '{{BUNDLER}}': bundler,\r\n '{{BUNDLER_PACKAGE}}': `@flight-framework/bundler-${bundler}`,\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 * Copy use-case template files to project directory\r\n */\r\nfunction copyUseCaseTemplate(projectPath: string, useCase: string, projectName: string): void {\r\n const useCaseDir = join(TEMPLATES_DIR, 'use-cases', useCase);\r\n\r\n // Ensure project directory exists\r\n mkdirSync(projectPath, { recursive: true });\r\n\r\n // Variables for template substitution\r\n const vars = {\r\n '{{PROJECT_NAME}}': projectName,\r\n '{{USE_CASE}}': useCase,\r\n };\r\n\r\n // Copy use-case files\r\n copyDirWithTemplates(useCaseDir, projectPath, vars);\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/**\r\n * Create a raw project with 100% Web Standards, ZERO Flight dependencies\r\n * True zero lock-in: works on Bun, Deno, Node 22+, Cloudflare Workers\r\n */\r\nfunction createRawProject(projectPath: string, projectName: string, options: CreateOptions): void {\r\n mkdirSync(projectPath, { recursive: true });\r\n\r\n const packageJson = {\r\n name: projectName,\r\n version: '0.0.1',\r\n type: 'module',\r\n scripts: {\r\n // Works with Bun, Node 22+, or Deno\r\n 'dev': 'node --watch server.js',\r\n 'dev:bun': 'bun --watch server.js',\r\n 'dev:deno': 'deno run --allow-net server.js',\r\n 'start': 'node server.js',\r\n },\r\n dependencies: {},\r\n devDependencies: {},\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 // 100% Web Standards server - NO Flight dependencies\r\n const serverCode = `/**\r\n * ${projectName}\r\n * \r\n * 100% Web Standards server. Zero dependencies. Zero lock-in.\r\n * Works on: Bun, Deno, Node 22+, Cloudflare Workers\r\n * \r\n * Run:\r\n * bun server.js\r\n * deno run --allow-net server.js\r\n * node server.js (Node 22+)\r\n */\r\n\r\n/**\r\n * Handle incoming requests using Web Standard APIs\r\n * @param {Request} request\r\n * @returns {Response}\r\n */\r\nfunction handleRequest(request) {\r\n const url = new URL(request.url);\r\n const method = request.method;\r\n \r\n // Router\r\n if (method === 'GET' && url.pathname === '/') {\r\n return Response.json({\r\n message: 'Hello World!',\r\n runtime: detectRuntime(),\r\n docs: 'https://flight.dev/docs/quickstart-http',\r\n });\r\n }\r\n \r\n if (method === 'GET' && url.pathname === '/health') {\r\n return Response.json({\r\n status: 'ok',\r\n timestamp: Date.now(),\r\n });\r\n }\r\n \r\n if (method === 'GET' && url.pathname.startsWith('/api/')) {\r\n return Response.json({\r\n path: url.pathname,\r\n query: Object.fromEntries(url.searchParams),\r\n });\r\n }\r\n \r\n // 404\r\n return Response.json(\r\n { error: 'Not Found', path: url.pathname },\r\n { status: 404 }\r\n );\r\n}\r\n\r\n/**\r\n * Detect which runtime we're running on\r\n */\r\nfunction detectRuntime() {\r\n if (typeof Bun !== 'undefined') return 'bun';\r\n if (typeof Deno !== 'undefined') return 'deno';\r\n return 'node';\r\n}\r\n\r\n// Export for different runtimes\r\nconst port = process.env.PORT || 3000;\r\n\r\n// Bun / Cloudflare Workers style\r\nexport default {\r\n port,\r\n fetch: handleRequest,\r\n};\r\n\r\n// Also start server for Node.js\r\nif (detectRuntime() === 'node') {\r\n const { serve } = await import('node:http');\r\n serve({ port }, (req, res) => {\r\n const url = 'http://localhost' + req.url;\r\n const request = new Request(url, { method: req.method });\r\n handleRequest(request).then(response => {\r\n res.writeHead(response.status, Object.fromEntries(response.headers));\r\n response.text().then(body => res.end(body));\r\n });\r\n });\r\n console.log(\\`Server running at http://localhost:\\${port}\\`);\r\n}\r\n`;\r\n\r\n writeFileSync(join(projectPath, 'server.js'), serverCode);\r\n\r\n // Create .gitignore\r\n if (options.git) {\r\n writeFileSync(\r\n join(projectPath, '.gitignore'),\r\n 'node_modules\\ndist\\n.env\\n.env.local\\n'\r\n );\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n } catch { /* ignore */ }\r\n }\r\n\r\n consola.box(`\r\nRaw project created!\r\n\r\nZERO dependencies. ZERO lock-in. 100% Web Standards.\r\n\r\nRun with any runtime:\r\n\r\n # Bun (fastest)\r\n bun server.js\r\n\r\n # Deno\r\n deno run --allow-net server.js\r\n\r\n # Node.js 22+\r\n node server.js\r\n\r\nWant to add Flight later? Just run:\r\n flight add http # HTTP server with routing\r\n flight add db # Database abstraction\r\n flight add cache # Caching layer\r\n\r\nPath: ${projectPath}\r\n`);\r\n}\r\n\r\n/**\r\n * Create an empty project with just package.json\r\n * Ultimate toolbox approach: start from zero\r\n */\r\nfunction createEmptyProject(projectPath: string, projectName: string, options: CreateOptions): void {\r\n mkdirSync(projectPath, { recursive: true });\r\n\r\n const packageJson = {\r\n name: projectName,\r\n version: '0.0.1',\r\n type: 'module',\r\n scripts: {\r\n dev: 'node server.js',\r\n },\r\n dependencies: {},\r\n devDependencies: {},\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 // Create .gitignore\r\n if (options.git) {\r\n writeFileSync(\r\n join(projectPath, '.gitignore'),\r\n 'node_modules\\ndist\\n.env\\n.env.local\\n'\r\n );\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n } catch { /* ignore */ }\r\n }\r\n\r\n consola.box(`\r\nEmpty project created!\r\n\r\nYour project is a blank canvas. Add what you need:\r\n\r\n # HTTP server\r\n npm install @flight-framework/http\r\n\r\n # Database\r\n npm install @flight-framework/db\r\n\r\n # Cache\r\n npm install @flight-framework/cache\r\n\r\n # Authentication\r\n npm install @flight-framework/auth\r\n\r\nPath: ${projectPath}\r\n`);\r\n}\r\n\r\n/**\r\n * Create a minimal project with a single server file\r\n * One step up from empty: working server in one file\r\n */\r\nfunction createMinimalProject(projectPath: string, projectName: string, options: CreateOptions): void {\r\n mkdirSync(projectPath, { recursive: true });\r\n\r\n const packageJson = {\r\n name: projectName,\r\n version: '0.0.1',\r\n type: 'module',\r\n scripts: {\r\n dev: 'node --watch server.js',\r\n start: 'node server.js',\r\n },\r\n dependencies: {\r\n '@flight-framework/http': '^0.0.1',\r\n },\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 const serverCode = `/**\r\n * ${projectName} - Built with Flight\r\n * \r\n * This is a minimal Flight server. Add more as you need.\r\n * Run: npm run dev\r\n */\r\n\r\nimport { createServer } from '@flight-framework/http';\r\n\r\nconst app = createServer();\r\n\r\n// Your routes\r\napp.get('/', (c) => c.json({ \r\n message: 'Hello from Flight!',\r\n docs: 'https://flight.dev/docs/quickstart-http'\r\n}));\r\n\r\napp.get('/health', (c) => c.json({ \r\n status: 'ok', \r\n timestamp: Date.now() \r\n}));\r\n\r\n// Start server\r\nconst port = process.env.PORT || 3000;\r\nconsole.log(\\`Server running at http://localhost:\\${port}\\`);\r\n\r\nexport default { port, fetch: app.fetch };\r\n`;\r\n\r\n writeFileSync(join(projectPath, 'server.js'), serverCode);\r\n\r\n // Create .gitignore\r\n if (options.git) {\r\n writeFileSync(\r\n join(projectPath, '.gitignore'),\r\n 'node_modules\\ndist\\n.env\\n.env.local\\n'\r\n );\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n } catch { /* ignore */ }\r\n }\r\n\r\n // Install if requested\r\n if (options.install) {\r\n consola.log('\\nInstalling dependencies...\\n');\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n } catch { /* ignore */ }\r\n }\r\n\r\n consola.box(`\r\nMinimal project created!\r\n\r\nNext steps:\r\n\r\n $ cd ${projectName}\r\n $ ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\nAdd more features as needed:\r\n\r\n # File-based routing\r\n npm install @flight-framework/core\r\n\r\n # Database\r\n npm install @flight-framework/db pg\r\n\r\n # Caching\r\n npm install @flight-framework/cache\r\n\r\nHappy flying!\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 * - Automatic route type generation\r\n */\r\n\r\nimport { resolve, join } from 'node:path';\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport { consola } from 'consola';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport type { BundlerAdapter } from '@flight-framework/bundler';\r\nimport { printLogo } from '../index.js';\r\nimport { generateTypes, watchAndGenerate } from '../generators/typegen.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 consola.info('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 // Generate route types on startup\r\n const routesDir = join(root, 'src', 'routes');\r\n const outputDir = join(root, 'src', '.flight');\r\n\r\n if (existsSync(routesDir)) {\r\n try {\r\n const result = await generateTypes({\r\n routesDir,\r\n outputDir,\r\n includeRoutes: true,\r\n includeEnv: false,\r\n projectRoot: root,\r\n });\r\n consola.success(`Route types generated: ${result.routeCount} routes`);\r\n\r\n // Watch for route file changes and regenerate types\r\n const cleanup = watchAndGenerate({\r\n routesDir,\r\n outputDir,\r\n includeRoutes: true,\r\n includeEnv: false,\r\n projectRoot: root,\r\n onRegenerate: (watchResult) => {\r\n consola.info(`Route types updated: ${watchResult.routeCount} routes`);\r\n },\r\n });\r\n\r\n // Cleanup on process exit\r\n process.on('SIGINT', () => cleanup());\r\n process.on('SIGTERM', () => cleanup());\r\n } catch (typeError) {\r\n consola.warn(`Route type generation skipped: ${typeError}`);\r\n }\r\n }\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 // Check if a custom bundler is configured with dev server support\r\n const bundler = config.bundler as BundlerAdapter | undefined;\r\n\r\n if (bundler && typeof bundler.createDevServer === 'function') {\r\n // Turbopack-style architecture: CLI controls HTML, FlightPack transforms files\r\n consola.info(`Using bundler: ${bundler.name || bundler.bundler || 'custom'}`);\r\n\r\n // Start FlightPack dev server (runs on an internal port for transforms only)\r\n const devServer = await bundler.createDevServer(config);\r\n const transformPort = devServer.port; // FlightPack's port for transform API\r\n\r\n // Create CLI's own HTTP server that serves HTML and proxies transforms\r\n const http = await import('node:http');\r\n const fs = await import('node:fs/promises');\r\n const path = await import('node:path');\r\n\r\n // Find index.html in project root\r\n const indexHtmlPath = path.join(root, 'index.html');\r\n const publicIndexPath = path.join(root, 'public', 'index.html');\r\n\r\n const server = http.createServer(async (req, res) => {\r\n const url = req.url || '/';\r\n\r\n // Serve index.html for root and SPA routes\r\n if (url === '/' || url === '/index.html' || (!url.includes('.') && !url.startsWith('/@') && !url.startsWith('/__'))) {\r\n try {\r\n // Try root index.html first, then public/index.html\r\n let htmlContent: string;\r\n try {\r\n htmlContent = await fs.readFile(indexHtmlPath, 'utf-8');\r\n } catch {\r\n htmlContent = await fs.readFile(publicIndexPath, 'utf-8');\r\n }\r\n\r\n // Inject HMR runtime\r\n if (!htmlContent.includes('/__flightpack/hmr-runtime.js')) {\r\n htmlContent = htmlContent.replace(\r\n '</body>',\r\n `<script src=\"/__flightpack/hmr-runtime.js\"></script>\\n</body>`\r\n );\r\n }\r\n\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(htmlContent);\r\n } catch (err) {\r\n res.writeHead(404, { 'Content-Type': 'text/plain' });\r\n res.end(`index.html not found in ${root}`);\r\n }\r\n return;\r\n }\r\n\r\n // Smart Proxy with Extension Fallback\r\n // This handles cases where the native bundler returns 404 for extensionless imports\r\n const proxyRequest = (targetUrl: string, originalRes: any, attemptExtensions = false) => {\r\n const proxyReq = http.request(\r\n {\r\n hostname: 'localhost',\r\n port: transformPort,\r\n path: targetUrl,\r\n method: req.method,\r\n headers: req.headers,\r\n },\r\n (proxyRes) => {\r\n // If successful, pipe response\r\n if (proxyRes.statusCode !== 404 || !attemptExtensions) {\r\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\r\n proxyRes.pipe(res);\r\n return;\r\n }\r\n\r\n // If 404 and we haven't tried extensions yet, try common extensions\r\n // Consume the failed response stream to avoid memory leaks\r\n proxyRes.resume();\r\n\r\n const commonExtensions = ['.mjs', '.js', '.ts', '.tsx', '.jsx', '/index.js'];\r\n\r\n // Try extensions sequentially\r\n const tryNextExtension = (index: number) => {\r\n if (index >= commonExtensions.length) {\r\n // All fallbacks failed, return original 404\r\n res.writeHead(404, proxyRes.headers);\r\n res.end('Not Found');\r\n return;\r\n }\r\n\r\n const ext = commonExtensions[index];\r\n const fallbackUrl = targetUrl + ext;\r\n\r\n const fallbackReq = http.request(\r\n {\r\n hostname: 'localhost',\r\n port: transformPort,\r\n path: fallbackUrl,\r\n method: 'GET', // Always GET for fallbacks\r\n headers: req.headers,\r\n },\r\n (fallbackRes) => {\r\n if (fallbackRes.statusCode === 200) {\r\n // Found it! Serve this file but keep original content-type if possible? \r\n // Actually native server sets correct CT for the extension.\r\n res.writeHead(200, fallbackRes.headers);\r\n fallbackRes.pipe(res);\r\n } else {\r\n fallbackRes.resume();\r\n tryNextExtension(index + 1);\r\n }\r\n }\r\n );\r\n\r\n fallbackReq.on('error', () => tryNextExtension(index + 1));\r\n fallbackReq.end();\r\n };\r\n\r\n tryNextExtension(0);\r\n }\r\n );\r\n\r\n proxyReq.on('error', (err) => {\r\n console.error('[CLI Proxy Error]', err.message);\r\n if (!res.headersSent) {\r\n res.writeHead(502, { 'Content-Type': 'text/plain' });\r\n res.end('FlightPack transform server unavailable');\r\n }\r\n });\r\n\r\n if (req.method !== 'GET' && req.method !== 'HEAD') {\r\n req.pipe(proxyReq);\r\n } else {\r\n proxyReq.end();\r\n }\r\n };\r\n\r\n // Determine if we should attempt extension fallbacks\r\n // Only for extensionless URLs that look like imports\r\n const shouldTryExtensions = !url.includes('.') && !url.endsWith('/');\r\n proxyRequest(url, res, shouldTryExtensions);\r\n });\r\n\r\n // Start CLI server on a different port, then FlightPack handles transforms\r\n const cliPort = port; // CLI uses the user-facing port\r\n await new Promise<void>((resolve) => server.listen(cliPort, () => resolve()));\r\n\r\n console.log(`\\n⚡ Flight dev server running\\n`);\r\n console.log(` Bundler: FlightPack`);\r\n console.log(` Local: http://localhost:${cliPort}`);\r\n console.log(``);\r\n\r\n const elapsed = Date.now() - startTime;\r\n consola.success(`Flight dev server ready in ${elapsed}ms`);\r\n devServer.printUrls?.();\r\n\r\n } else {\r\n // Fallback to Vite for backwards compatibility\r\n consola.info('Using bundler: Vite (default)');\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 consola.success(`Flight dev server ready in ${elapsed}ms`);\r\n consola.log(`\\n ➜ Local: http://localhost:${port}/`);\r\n if (host === true || host === '0.0.0.0') {\r\n consola.log(` ➜ Network: http://${getNetworkAddress()}:${port}/`);\r\n }\r\n consola.log('');\r\n consola.log(` ${isSSR ? '✓' : '○'} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}`);\r\n consola.log(` ${flightHttpAvailable ? '✓' : '○'} @flight-framework/http ${flightHttpAvailable ? 'enabled' : 'not installed'}`);\r\n consola.log(` ${flightRouterAvailable ? '✓' : '○'} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}`);\r\n consola.log('');\r\n consola.log(' press h to show help');\r\n\r\n // Handle server shortcuts\r\n if (!isSSR) {\r\n vite.bindCLIShortcuts({ print: true });\r\n }\r\n }\r\n\r\n } catch (error) {\r\n consola.error('Failed 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\r\n // Create module loader that uses Vite's ssrLoadModule for TSX support\r\n const moduleLoader = async (filePath: string) => {\r\n // Normalize both paths to use forward slashes for Vite\r\n const normalizedFilePath = filePath.replace(/\\\\/g, '/');\r\n const normalizedRoot = root.replace(/\\\\/g, '/');\r\n // Create relative path that Vite expects (starts with /)\r\n const relativePath = normalizedFilePath.replace(normalizedRoot, '');\r\n return vite.ssrLoadModule(relativePath);\r\n };\r\n\r\n pageRouter = await createFileRouter({\r\n directory: join(root, 'src', 'routes'),\r\n extensions: ['.tsx', '.ts', '.jsx', '.js'],\r\n moduleLoader, // Use Vite's ssrLoadModule\r\n });\r\n consola.success(`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 // Check if this is a static asset request\r\n const isStaticAsset =\r\n url.startsWith('/@') ||\r\n url.startsWith('/node_modules') ||\r\n (url.startsWith('/src') && !url.includes('entry-server')) ||\r\n // Static file extensions\r\n pathname.endsWith('.css') ||\r\n pathname.endsWith('.js') ||\r\n pathname.endsWith('.ts') ||\r\n pathname.endsWith('.tsx') ||\r\n pathname.endsWith('.svg') ||\r\n pathname.endsWith('.png') ||\r\n pathname.endsWith('.jpg') ||\r\n pathname.endsWith('.jpeg') ||\r\n pathname.endsWith('.gif') ||\r\n pathname.endsWith('.ico') ||\r\n pathname.endsWith('.woff') ||\r\n pathname.endsWith('.woff2') ||\r\n pathname.endsWith('.ttf') ||\r\n pathname.endsWith('.eot') ||\r\n pathname.endsWith('.json') ||\r\n pathname.endsWith('.webp') ||\r\n pathname.endsWith('.mp4') ||\r\n pathname.endsWith('.webm');\r\n\r\n // Let Vite handle static assets\r\n if (isStaticAsset) {\r\n vite.middlewares(req, res);\r\n return;\r\n }\r\n\r\n // Skip SSR for API routes - let Flight HTTP middleware handle them\r\n if (pathname.startsWith('/api/')) {\r\n // API routes are handled by Flight HTTP middleware\r\n // Pass through to Vite middlewares which will invoke our Flight middleware\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 // Normalize paths for Vite (forward slashes, remove root)\r\n const normalizedFilePath = pageRoute.filePath.replace(/\\\\/g, '/');\r\n const normalizedRoot = root.replace(/\\\\/g, '/');\r\n const relativePath = normalizedFilePath.replace(normalizedRoot, '');\r\n const mod = await vite.ssrLoadModule(relativePath);\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 consola.error('[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 consola.success('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 consola.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 * Type Generation Module\r\n *\r\n * Generates TypeScript declaration files from route structure and environment files.\r\n * Follows Flight's toolbox philosophy: explicit, opt-in, no magic.\r\n *\r\n * @example CLI Usage\r\n * ```bash\r\n * flight types:generate --routes --env\r\n * flight types:generate --routes --watch\r\n * ```\r\n *\r\n * @example Programmatic Usage\r\n * ```typescript\r\n * import { generateTypes } from '@flight-framework/cli/generators/typegen';\r\n *\r\n * await generateTypes({\r\n * routesDir: './src/routes',\r\n * outputDir: './src/.flight',\r\n * includeRoutes: true,\r\n * includeEnv: true,\r\n * });\r\n * ```\r\n *\r\n * @module @flight-framework/cli/generators/typegen\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, watch } from 'fs';\r\nimport { join, resolve, dirname } from 'path';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface TypeGenOptions {\r\n /** Directory containing route files */\r\n routesDir: string;\r\n\r\n /** Output directory for generated types */\r\n outputDir: string;\r\n\r\n /** Generate route types (default: true) */\r\n includeRoutes?: boolean;\r\n\r\n /** Generate environment variable types (default: false) */\r\n includeEnv?: boolean;\r\n\r\n /** Project root for .env file discovery */\r\n projectRoot?: string;\r\n}\r\n\r\nexport interface TypeGenResult {\r\n /** Generated route types content */\r\n routeTypes: string;\r\n\r\n /** Generated env types content */\r\n envTypes: string;\r\n\r\n /** List of files written */\r\n filesWritten: string[];\r\n\r\n /** Number of routes processed */\r\n routeCount: number;\r\n\r\n /** Number of env variables processed */\r\n envVarCount: number;\r\n}\r\n\r\nexport interface ScannedRoute {\r\n path: string;\r\n filePath: string;\r\n isDynamic: boolean;\r\n isApiRoute: boolean;\r\n httpMethod?: string;\r\n}\r\n\r\ninterface EnvVariable {\r\n key: string;\r\n optional: boolean;\r\n}\r\n\r\ninterface ParsedEnv {\r\n server: EnvVariable[];\r\n client: EnvVariable[];\r\n}\r\n\r\n// ============================================================================\r\n// Route Type Generation\r\n// ============================================================================\r\n\r\n/**\r\n * Generate default header for auto-generated files\r\n */\r\nfunction generateHeader(command: string): string {\r\n const timestamp = new Date().toISOString();\r\n return `/**\r\n * Auto-generated by Flight CLI\r\n * Do not edit manually - changes will be overwritten\r\n *\r\n * Command: ${command}\r\n * Generated: ${timestamp}\r\n */`;\r\n}\r\n\r\n/**\r\n * Extract parameter names from a route path\r\n *\r\n * @example\r\n * extractParams('/users/:id') // ['id']\r\n * extractParams('/blog/:year/:slug') // ['year', 'slug']\r\n * extractParams('/docs/*path') // ['path']\r\n */\r\nexport function extractParams(routePath: string): string[] {\r\n const params: string[] = [];\r\n\r\n // Match :param patterns\r\n const dynamicMatches = routePath.match(/:(\\w+)/g);\r\n if (dynamicMatches) {\r\n params.push(...dynamicMatches.map((m) => m.slice(1)));\r\n }\r\n\r\n // Match *param patterns (catch-all)\r\n const catchAllMatches = routePath.match(/\\*(\\w+)/g);\r\n if (catchAllMatches) {\r\n params.push(...catchAllMatches.map((m) => m.slice(1)));\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Check if route has dynamic segments\r\n */\r\nfunction isDynamicRoute(routePath: string): boolean {\r\n return routePath.includes(':') || routePath.includes('*');\r\n}\r\n\r\n/**\r\n * Generate TypeScript route types from scanned routes\r\n */\r\nexport function generateRouteTypes(routes: ScannedRoute[]): string {\r\n const pageRoutes = routes.filter((r) => !r.isApiRoute);\r\n const apiRoutes = routes.filter((r) => r.isApiRoute);\r\n\r\n const staticRoutes = pageRoutes.filter((r) => !r.isDynamic);\r\n const dynamicRoutes = pageRoutes.filter((r) => r.isDynamic);\r\n\r\n // Generate route unions\r\n const appRoutesUnion =\r\n pageRoutes.length > 0\r\n ? pageRoutes.map((r) => ` | '${r.path}'`).join('\\n')\r\n : ' | never';\r\n\r\n const apiRoutesUnion =\r\n apiRoutes.length > 0\r\n ? apiRoutes.map((r) => ` | '${r.path}'`).join('\\n')\r\n : ' | never';\r\n\r\n const staticRoutesUnion =\r\n staticRoutes.length > 0\r\n ? staticRoutes.map((r) => ` | '${r.path}'`).join('\\n')\r\n : ' | never';\r\n\r\n const dynamicRoutesUnion =\r\n dynamicRoutes.length > 0\r\n ? dynamicRoutes.map((r) => ` | '${r.path}'`).join('\\n')\r\n : ' | never';\r\n\r\n // Generate param types for dynamic routes\r\n const paramTypes = dynamicRoutes\r\n .map((r) => {\r\n const params = extractParams(r.path);\r\n const typeName = routePathToTypeName(r.path);\r\n const paramDef = params.map((p) => `${p}: string`).join('; ');\r\n return `export type ${typeName}Params = { ${paramDef} };`;\r\n })\r\n .join('\\n');\r\n\r\n return `${generateHeader('flight types:generate --routes')}\r\n\r\n// ============================================================================\r\n// Route Types\r\n// ============================================================================\r\n\r\n/**\r\n * All available page routes in the application\r\n */\r\nexport type AppRoutes =\r\n${appRoutesUnion};\r\n\r\n/**\r\n * All available API routes in the application\r\n */\r\nexport type ApiRoutes =\r\n${apiRoutesUnion};\r\n\r\n/**\r\n * Static routes (no dynamic parameters)\r\n */\r\nexport type StaticRoutes =\r\n${staticRoutesUnion};\r\n\r\n/**\r\n * Dynamic routes (with parameters like :id or *slug)\r\n */\r\nexport type DynamicRoutes =\r\n${dynamicRoutesUnion};\r\n\r\n// ============================================================================\r\n// Route Parameter Extraction\r\n// ============================================================================\r\n\r\n/**\r\n * Extract route parameters from a route pattern using template literal types.\r\n *\r\n * @example\r\n * type Params = ExtractRouteParams<'/users/:id'>; // { id: string }\r\n * type BlogParams = ExtractRouteParams<'/blog/:year/:slug'>; // { year: string; slug: string }\r\n */\r\ntype ExtractRouteParams<T extends string> =\r\n // Handle :param/rest pattern\r\n T extends \\`\\${infer _Start}:\\${infer Param}/\\${infer Rest}\\`\r\n ? { [K in Param]: string } & ExtractRouteParams<\\`/\\${Rest}\\`>\r\n // Handle :param at end\r\n : T extends \\`\\${infer _Start}:\\${infer Param}\\`\r\n ? { [K in Param]: string }\r\n // Handle *param (catch-all)\r\n : T extends \\`\\${infer _Start}*\\${infer Param}\\`\r\n ? { [K in Param]: string }\r\n // No params\r\n : Record<string, never>;\r\n\r\n/**\r\n * Get typed parameters for a specific route.\r\n *\r\n * @example\r\n * const params: RouteParams<'/users/:id'> = { id: '123' };\r\n */\r\nexport type RouteParams<T extends AppRoutes | ApiRoutes> = ExtractRouteParams<T>;\r\n\r\n// ============================================================================\r\n// Helper Types\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a route requires parameters\r\n */\r\nexport type RequiresParams<T extends AppRoutes | ApiRoutes> =\r\n RouteParams<T> extends Record<string, never> ? false : true;\r\n\r\n/**\r\n * Props for a type-safe Link component\r\n */\r\nexport type TypedLinkProps<T extends AppRoutes> =\r\n RequiresParams<T> extends true\r\n ? { to: T; params: RouteParams<T> }\r\n : { to: T; params?: never };\r\n\r\n/**\r\n * Build a URL from a route pattern and parameters\r\n */\r\nexport type BuildUrl<T extends AppRoutes> =\r\n RequiresParams<T> extends true\r\n ? (route: T, params: RouteParams<T>) => string\r\n : (route: T) => string;\r\n\r\n// ============================================================================\r\n// Individual Route Parameter Types\r\n// ============================================================================\r\n\r\n${paramTypes || '// No dynamic routes found'}\r\n`;\r\n}\r\n\r\n/**\r\n * Convert route path to a valid TypeScript type name\r\n *\r\n * @example\r\n * routePathToTypeName('/users/:id') // 'Users_Id'\r\n * routePathToTypeName('/blog/:year/:slug') // 'Blog_Year_Slug'\r\n */\r\nfunction routePathToTypeName(routePath: string): string {\r\n return routePath\r\n .split('/')\r\n .filter(Boolean)\r\n .map((segment) => {\r\n // Remove : and * prefixes, capitalize\r\n const clean = segment.replace(/^[:*]/, '');\r\n return clean.charAt(0).toUpperCase() + clean.slice(1);\r\n })\r\n .join('_') || 'Root';\r\n}\r\n\r\n// ============================================================================\r\n// Environment Variable Type Generation\r\n// ============================================================================\r\n\r\n/**\r\n * Parse .env file content and extract variable definitions\r\n */\r\nexport function parseEnvFile(content: string): ParsedEnv {\r\n const server: EnvVariable[] = [];\r\n const client: EnvVariable[] = [];\r\n\r\n const lines = content.split('\\n');\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Skip comments and empty lines\r\n if (!trimmed || trimmed.startsWith('#')) {\r\n continue;\r\n }\r\n\r\n // Match KEY=value or KEY?=value (optional)\r\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)(\\?)?=/i);\r\n if (!match) {\r\n continue;\r\n }\r\n\r\n const key = match[1];\r\n const optional = match[2] === '?';\r\n\r\n const envVar: EnvVariable = { key, optional };\r\n\r\n // PUBLIC_ prefix means client-side accessible\r\n if (key.startsWith('PUBLIC_')) {\r\n client.push(envVar);\r\n } else {\r\n server.push(envVar);\r\n }\r\n }\r\n\r\n return { server, client };\r\n}\r\n\r\n/**\r\n * Load and merge all .env files from project root\r\n */\r\nexport function loadEnvFiles(projectRoot: string): ParsedEnv {\r\n const envFiles = ['.env', '.env.local', '.env.development', '.env.production'];\r\n\r\n const merged: ParsedEnv = { server: [], client: [] };\r\n const seenKeys = new Set<string>();\r\n\r\n for (const envFile of envFiles) {\r\n const envPath = join(projectRoot, envFile);\r\n\r\n if (!existsSync(envPath)) {\r\n continue;\r\n }\r\n\r\n const content = readFileSync(envPath, 'utf-8');\r\n const parsed = parseEnvFile(content);\r\n\r\n // Add new keys only (first definition wins)\r\n for (const envVar of parsed.server) {\r\n if (!seenKeys.has(envVar.key)) {\r\n seenKeys.add(envVar.key);\r\n merged.server.push(envVar);\r\n }\r\n }\r\n\r\n for (const envVar of parsed.client) {\r\n if (!seenKeys.has(envVar.key)) {\r\n seenKeys.add(envVar.key);\r\n merged.client.push(envVar);\r\n }\r\n }\r\n }\r\n\r\n return merged;\r\n}\r\n\r\n/**\r\n * Generate TypeScript environment variable types\r\n */\r\nexport function generateEnvTypes(env: ParsedEnv): string {\r\n const serverVars = env.server\r\n .sort((a, b) => a.key.localeCompare(b.key))\r\n .map((v) => ` ${v.key}${v.optional ? '?' : ''}: string;`)\r\n .join('\\n');\r\n\r\n const clientVars = env.client\r\n .sort((a, b) => a.key.localeCompare(b.key))\r\n .map((v) => ` ${v.key}${v.optional ? '?' : ''}: string;`)\r\n .join('\\n');\r\n\r\n return `${generateHeader('flight types:generate --env')}\r\n\r\n// ============================================================================\r\n// Server-side Environment Variables\r\n// ============================================================================\r\n\r\n/**\r\n * Server-side environment variables accessible via process.env\r\n * These are NOT exposed to the client.\r\n */\r\ndeclare namespace NodeJS {\r\n interface ProcessEnv {\r\n${serverVars || ' // No server environment variables defined'}\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Client-side Environment Variables\r\n// ============================================================================\r\n\r\n/**\r\n * Client-side environment variables accessible via import.meta.env\r\n * Only variables with PUBLIC_ prefix are included.\r\n */\r\ninterface ImportMetaEnv {\r\n${clientVars || ' // No client environment variables defined'}\r\n}\r\n\r\ninterface ImportMeta {\r\n readonly env: ImportMetaEnv;\r\n}\r\n`;\r\n}\r\n\r\n// ============================================================================\r\n// Main Generation Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Scan routes directory and extract route information\r\n */\r\nexport function scanRoutesForTypes(routesDir: string): ScannedRoute[] {\r\n if (!existsSync(routesDir)) {\r\n return [];\r\n }\r\n\r\n const routes: ScannedRoute[] = [];\r\n scanDirectoryRecursive(routesDir, '', routes);\r\n return routes;\r\n}\r\n\r\nfunction scanDirectoryRecursive(\r\n dir: string,\r\n basePath: string,\r\n results: ScannedRoute[]\r\n): void {\r\n const entries = readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n const relativePath = join(basePath, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n // Skip special directories\r\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\r\n continue;\r\n }\r\n scanDirectoryRecursive(fullPath, relativePath, results);\r\n } else if (entry.isFile()) {\r\n const route = parseRouteFile(entry.name, relativePath);\r\n if (route) {\r\n results.push(route);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction parseRouteFile(filename: string, relativePath: string): ScannedRoute | null {\r\n // Check for page routes\r\n if (/\\.(page|route)\\.(tsx?|jsx?)$/.test(filename)) {\r\n const urlPath = filePathToUrlPath(relativePath);\r\n return {\r\n path: urlPath,\r\n filePath: relativePath.replace(/\\\\/g, '/'),\r\n isDynamic: isDynamicRoute(urlPath),\r\n isApiRoute: false,\r\n };\r\n }\r\n\r\n // Check for API routes\r\n const apiMatch = filename.match(/\\.(get|post|put|patch|delete|options|head)\\.(tsx?|jsx?)$/i);\r\n if (apiMatch) {\r\n const urlPath = filePathToUrlPath(relativePath);\r\n return {\r\n path: urlPath,\r\n filePath: relativePath.replace(/\\\\/g, '/'),\r\n isDynamic: isDynamicRoute(urlPath),\r\n isApiRoute: true,\r\n httpMethod: apiMatch[1].toUpperCase(),\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction filePathToUrlPath(filePath: string): string {\r\n let urlPath = filePath\r\n // Normalize slashes first (Windows compatibility)\r\n .replace(/\\\\/g, '/')\r\n // Remove file extension\r\n .replace(/\\.(page|route)\\.(tsx?|jsx?)$/, '')\r\n // Remove HTTP method suffix\r\n .replace(/\\.(get|post|put|patch|delete|options|head)$/i, '')\r\n // Remove index (after slash normalization)\r\n .replace(/\\/index$/, '')\r\n .replace(/^index$/, '')\r\n // Remove route groups\r\n .replace(/\\/?\\\\?\\([^)]+\\\\?\\)/g, '')\r\n // Convert [param] to :param\r\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*$1')\r\n .replace(/\\[(\\w+)\\]/g, ':$1');\r\n\r\n // Ensure leading slash\r\n if (!urlPath.startsWith('/')) {\r\n urlPath = '/' + urlPath;\r\n }\r\n\r\n // Clean double slashes\r\n urlPath = urlPath.replace(/\\/+/g, '/');\r\n\r\n return urlPath || '/';\r\n}\r\n\r\n/**\r\n * Generate types and write to output directory\r\n */\r\nexport async function generateTypes(options: TypeGenOptions): Promise<TypeGenResult> {\r\n const {\r\n routesDir,\r\n outputDir,\r\n includeRoutes = true,\r\n includeEnv = false,\r\n projectRoot = process.cwd(),\r\n } = options;\r\n\r\n const result: TypeGenResult = {\r\n routeTypes: '',\r\n envTypes: '',\r\n filesWritten: [],\r\n routeCount: 0,\r\n envVarCount: 0,\r\n };\r\n\r\n // Ensure output directory exists\r\n if (!existsSync(outputDir)) {\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Generate route types\r\n if (includeRoutes) {\r\n const routes = scanRoutesForTypes(routesDir);\r\n result.routeCount = routes.length;\r\n result.routeTypes = generateRouteTypes(routes);\r\n\r\n const routeTypesPath = join(outputDir, 'routes.d.ts');\r\n writeFileSync(routeTypesPath, result.routeTypes, 'utf-8');\r\n result.filesWritten.push(routeTypesPath);\r\n\r\n console.log(`Generated route types: ${routes.length} routes`);\r\n }\r\n\r\n // Generate env types\r\n if (includeEnv) {\r\n const env = loadEnvFiles(projectRoot);\r\n result.envVarCount = env.server.length + env.client.length;\r\n result.envTypes = generateEnvTypes(env);\r\n\r\n const envTypesPath = join(outputDir, 'env.d.ts');\r\n writeFileSync(envTypesPath, result.envTypes, 'utf-8');\r\n result.filesWritten.push(envTypesPath);\r\n\r\n console.log(`Generated env types: ${env.server.length} server, ${env.client.length} client`);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Watch Mode\r\n// ============================================================================\r\n\r\nexport interface WatchOptions extends TypeGenOptions {\r\n /** Debounce delay in milliseconds */\r\n debounce?: number;\r\n\r\n /** Callback when types are regenerated */\r\n onRegenerate?: (result: TypeGenResult) => void;\r\n}\r\n\r\n/**\r\n * Watch for changes and regenerate types automatically\r\n */\r\nexport function watchAndGenerate(options: WatchOptions): () => void {\r\n const { routesDir, debounce = 100, onRegenerate } = options;\r\n\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n const regenerate = async () => {\r\n try {\r\n const result = await generateTypes(options);\r\n onRegenerate?.(result);\r\n } catch (error) {\r\n console.error('Type generation failed:', (error as Error).message);\r\n }\r\n };\r\n\r\n const debouncedRegenerate = () => {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = setTimeout(regenerate, debounce);\r\n };\r\n\r\n // Initial generation\r\n regenerate();\r\n\r\n // Watch routes directory\r\n const watcher = watch(routesDir, { recursive: true }, (eventType: string, filename: string | null) => {\r\n if (filename && /\\.(tsx?|jsx?)$/.test(filename)) {\r\n console.log(`Route file changed: ${filename}`);\r\n debouncedRegenerate();\r\n }\r\n });\r\n\r\n // Return cleanup function\r\n return () => {\r\n watcher.close();\r\n if (timeout) clearTimeout(timeout);\r\n };\r\n}\r\n","/**\r\n * Flight CLI - Build Command\r\n * \r\n * Build for production using the configured bundler adapter.\r\n * Supports FlightPack (native Rust) and Vite (fallback).\r\n * \r\n * @module @flight-framework/cli/commands/build\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport { existsSync } from 'node:fs';\r\nimport { consola } from 'consola';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport type { BundlerAdapter } from '@flight-framework/bundler';\r\nimport { printLogo } from '../index.js';\r\n\r\n/**\r\n * Find entry-server file with either .tsx or .ts extension\r\n */\r\nfunction findEntryServer(root: string, srcDir: string): string {\r\n const tsxPath = resolve(root, srcDir, 'entry-server.tsx');\r\n const tsPath = resolve(root, srcDir, 'entry-server.ts');\r\n\r\n if (existsSync(tsxPath)) return tsxPath;\r\n if (existsSync(tsPath)) return tsPath;\r\n\r\n // Default to tsx (will error if not found, but with clear message)\r\n return tsxPath;\r\n}\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 consola.info('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 consola.log(`Output directory: ${outDir}`);\r\n consola.log(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`);\r\n consola.log(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`);\r\n\r\n // Check if a custom bundler is configured (e.g., FlightPack)\r\n const bundler = config.bundler as BundlerAdapter | undefined;\r\n\r\n if (bundler && typeof bundler.build === 'function') {\r\n // Use the configured bundler adapter (FlightPack, etc.)\r\n consola.info(`Using bundler: ${bundler.name || bundler.bundler || 'custom'}`);\r\n\r\n const result = await bundler.build(config);\r\n\r\n if (!result.success) {\r\n for (const error of result.errors) {\r\n consola.error(error.message);\r\n }\r\n throw new Error('Build failed');\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\r\n\r\n consola.success(`Build complete! (${elapsedSeconds}s)`);\r\n consola.log(`\\nOutput: ${resolve(root, outDir)}`);\r\n consola.log(`\\nTo preview the build:`);\r\n consola.log(` $ flight preview\\n`);\r\n\r\n } else {\r\n // Fallback to Vite for backwards compatibility\r\n consola.info('Using bundler: Vite (default)');\r\n\r\n // Dynamic import vite\r\n const { build } = await import('vite');\r\n\r\n // Client build\r\n consola.info('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 consola.success('Client build complete');\r\n\r\n // SSR build (if applicable)\r\n if (config.rendering.default !== 'csr') {\r\n consola.info('Building 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: findEntryServer(root, config.build.srcDir),\r\n },\r\n },\r\n });\r\n consola.success('Server build complete');\r\n }\r\n\r\n // Run adapter if configured\r\n if (config.adapter) {\r\n consola.info(`Running ${config.adapter.name} adapter...`);\r\n // TODO: Implement adapter execution\r\n consola.success(`${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 consola.success(`Build complete! (${elapsedSeconds}s)`);\r\n consola.log(`\\nOutput: ${resolve(root, outDir)}`);\r\n consola.log(`\\nTo preview the build:`);\r\n consola.log(` $ flight preview\\n`);\r\n consola.log(`To deploy:`);\r\n consola.log(` • Upload ${outDir}/ to your server`);\r\n consola.log(` • Or use your configured adapter\\n`);\r\n }\r\n\r\n } catch (error) {\r\n consola.error('Build 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 { consola } from 'consola';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport type { BundlerAdapter } from '@flight-framework/bundler';\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 consola.info('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 // Check if a custom bundler is configured with preview support\r\n const bundler = config.bundler as BundlerAdapter | undefined;\r\n\r\n if (bundler && typeof bundler.preview === 'function') {\r\n // Use the configured bundler's preview server\r\n consola.info(`Using bundler: ${bundler.name || bundler.bundler || 'custom'}`);\r\n\r\n const server = await bundler.preview(config);\r\n server.printUrls?.();\r\n\r\n } else {\r\n // Fallback to Vite preview\r\n consola.info('Using bundler: Vite (default)');\r\n\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 consola.success('Flight preview server ready');\r\n consola.log(`\\n ➜ Local: http://localhost:${port}/`);\r\n if (host === true || host === '0.0.0.0') {\r\n consola.log(` ➜ Network: http://0.0.0.0:${port}/`);\r\n }\r\n consola.log('\\n This is a preview of your production build.');\r\n consola.log(' For development, use: flight dev\\n');\r\n\r\n server.printUrls();\r\n }\r\n\r\n } catch (error) {\r\n consola.error('Failed to start preview server:', error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Routes Generate Command\r\n * \r\n * Generates route manifest from the routes directory.\r\n * Usage: flight routes:generate [options]\r\n */\r\n\r\nimport { resolve } from 'path';\r\nimport { generateRoutes } from '../generators/routes.js';\r\n\r\ninterface RoutesGenerateOptions {\r\n routesDir?: string;\r\n outputDir?: string;\r\n watch?: boolean;\r\n}\r\n\r\nexport async function routesGenerateCommand(options: RoutesGenerateOptions = {}): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n const routesDir = options.routesDir\r\n ? resolve(cwd, options.routesDir)\r\n : resolve(cwd, 'src/routes');\r\n\r\n const outputDir = options.outputDir\r\n ? resolve(cwd, options.outputDir)\r\n : resolve(cwd, 'src/.flight');\r\n\r\n try {\r\n const manifest = await generateRoutes({\r\n routesDir,\r\n outputDir,\r\n watch: options.watch,\r\n });\r\n\r\n console.log('\\nRoute manifest generated successfully!');\r\n console.log(` Pages: ${manifest.routes.length}`);\r\n console.log(` API Routes: ${manifest.apiRoutes.length}`);\r\n console.log(` Layouts: ${manifest.layouts.length}`);\r\n } catch (error) {\r\n console.error('Failed to generate routes:', error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Route Generator\r\n * \r\n * Scans the routes directory and generates a route manifest.\r\n * This enables automatic route registration without manual imports.\r\n */\r\n\r\nimport { readdirSync, statSync, existsSync, writeFileSync, mkdirSync } from 'fs';\r\nimport { join, relative, basename, dirname } from 'path';\r\n\r\ninterface ScannedRoute {\r\n path: string; // URL path pattern (e.g., '/docs/:slug')\r\n filePath: string; // Relative file path\r\n isLayout: boolean; // Is this a _layout file\r\n isLoading: boolean; // Is this a _loading file\r\n isError: boolean; // Is this a _error file\r\n isNotFound: boolean; // Is this a _not-found file\r\n isDynamic: boolean; // Has dynamic segments\r\n isApiRoute: boolean; // Is an API route\r\n httpMethod?: string; // HTTP method for API routes\r\n}\r\n\r\ninterface RouteManifest {\r\n routes: ScannedRoute[];\r\n layouts: ScannedRoute[];\r\n loadingStates: ScannedRoute[];\r\n errorBoundaries: ScannedRoute[];\r\n notFoundPages: ScannedRoute[];\r\n apiRoutes: ScannedRoute[];\r\n generated: string; // Timestamp\r\n}\r\n\r\n/**\r\n * Convert file path to URL path pattern\r\n * \r\n * Handles:\r\n * - File extensions (.page.tsx, .get.ts, etc.)\r\n * - Index files → root of directory\r\n * - Dynamic segments [param] → :param\r\n * - Catch-all [...param] → *param\r\n * - Route groups (group) → removed from URL\r\n */\r\nfunction filePathToUrlPath(filePath: string): string {\r\n let urlPath = filePath\r\n // Remove file extension\r\n .replace(/\\.(page|route)\\.(tsx?|jsx?)$/, '')\r\n // Remove HTTP method suffix for API routes\r\n .replace(/\\.(get|post|put|patch|delete|options|head)$/, '')\r\n // Remove index from path\r\n .replace(/\\/index$/, '')\r\n // Remove route groups (segments wrapped in parentheses)\r\n // e.g., (marketing)/about → about, (app)/dashboard → dashboard\r\n .replace(/\\/?\\([^)]+\\)/g, '')\r\n // Convert [param] to :param\r\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*$1') // Catch-all [...slug] -> *slug\r\n .replace(/\\[(\\w+)\\]/g, ':$1'); // Dynamic [slug] -> :slug\r\n\r\n // Ensure leading slash\r\n if (!urlPath.startsWith('/')) {\r\n urlPath = '/' + urlPath;\r\n }\r\n\r\n // Root path\r\n if (urlPath === '' || urlPath === '/') {\r\n urlPath = '/';\r\n }\r\n\r\n // Clean up double slashes that might result from group removal\r\n urlPath = urlPath.replace(/\\/+/g, '/');\r\n\r\n return urlPath;\r\n}\r\n\r\n/**\r\n * Check if directory is a route group\r\n * Route groups are directories wrapped in parentheses: (groupName)\r\n */\r\nfunction isRouteGroup(dirname: string): boolean {\r\n return /^\\([^)]+\\)$/.test(dirname);\r\n}\r\n\r\n/**\r\n * Extract HTTP method from API route filename\r\n */\r\nfunction extractHttpMethod(filename: string): string | undefined {\r\n const match = filename.match(/\\.(get|post|put|patch|delete|options|head)\\.(tsx?|jsx?)$/i);\r\n return match ? match[1].toUpperCase() : undefined;\r\n}\r\n\r\n/**\r\n * Check if file is a layout file\r\n */\r\nfunction isLayoutFile(filename: string): boolean {\r\n return filename.startsWith('_layout.');\r\n}\r\n\r\n/**\r\n * Check if file is a loading file\r\n */\r\nfunction isLoadingFile(filename: string): boolean {\r\n return filename.startsWith('_loading.');\r\n}\r\n\r\n/**\r\n * Check if file is an error file\r\n */\r\nfunction isErrorFile(filename: string): boolean {\r\n return filename.startsWith('_error.');\r\n}\r\n\r\n/**\r\n * Check if file is a not-found file\r\n */\r\nfunction isNotFoundFile(filename: string): boolean {\r\n return filename.startsWith('_not-found.');\r\n}\r\n\r\n/**\r\n * Check if file is a page/route file\r\n */\r\nfunction isRouteFile(filename: string): boolean {\r\n return /\\.(page|route)\\.(tsx?|jsx?)$/.test(filename);\r\n}\r\n\r\n/**\r\n * Check if file is an API route file\r\n */\r\nfunction isApiRouteFile(filename: string): boolean {\r\n return /\\.(get|post|put|patch|delete|options|head)\\.(tsx?|jsx?)$/.test(filename);\r\n}\r\n\r\n/**\r\n * Check if path has dynamic segments\r\n */\r\nfunction hasDynamicSegments(path: string): boolean {\r\n return path.includes('[') && path.includes(']');\r\n}\r\n\r\n/**\r\n * Recursively scan directory for routes\r\n */\r\nfunction scanDirectory(\r\n dir: string,\r\n basePath: string = '',\r\n results: ScannedRoute[] = []\r\n): ScannedRoute[] {\r\n if (!existsSync(dir)) {\r\n return results;\r\n }\r\n\r\n const entries = readdirSync(dir);\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry);\r\n const relativePath = join(basePath, entry);\r\n const stat = statSync(fullPath);\r\n\r\n if (stat.isDirectory()) {\r\n // Skip special directories\r\n if (entry.startsWith('.') || entry === 'node_modules') {\r\n continue;\r\n }\r\n // Recurse into subdirectory\r\n scanDirectory(fullPath, relativePath, results);\r\n } else if (stat.isFile()) {\r\n const routePath = filePathToUrlPath(dirname(relativePath));\r\n const normalizedFilePath = relativePath.replace(/\\\\/g, '/');\r\n const isDynamic = hasDynamicSegments(relativePath);\r\n\r\n // Layout files\r\n if (isLayoutFile(entry)) {\r\n results.push({\r\n path: routePath,\r\n filePath: normalizedFilePath,\r\n isLayout: true,\r\n isLoading: false,\r\n isError: false,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n // Loading files\r\n else if (isLoadingFile(entry)) {\r\n results.push({\r\n path: routePath,\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: true,\r\n isError: false,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n // Error files\r\n else if (isErrorFile(entry)) {\r\n results.push({\r\n path: routePath,\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: false,\r\n isError: true,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n // Not-found files\r\n else if (isNotFoundFile(entry)) {\r\n results.push({\r\n path: routePath,\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: false,\r\n isError: false,\r\n isNotFound: true,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n // API route files\r\n else if (isApiRouteFile(entry)) {\r\n const method = extractHttpMethod(entry);\r\n results.push({\r\n path: filePathToUrlPath(relativePath),\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: false,\r\n isError: false,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: true,\r\n httpMethod: method,\r\n });\r\n }\r\n // Page/route files\r\n else if (isRouteFile(entry)) {\r\n results.push({\r\n path: filePathToUrlPath(relativePath),\r\n filePath: normalizedFilePath,\r\n isLayout: false,\r\n isLoading: false,\r\n isError: false,\r\n isNotFound: false,\r\n isDynamic,\r\n isApiRoute: false,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Sort routes for matching priority\r\n * Static routes before dynamic, shorter before longer\r\n */\r\nfunction sortRoutes(routes: ScannedRoute[]): ScannedRoute[] {\r\n return routes.sort((a, b) => {\r\n // Static routes first\r\n if (!a.isDynamic && b.isDynamic) return -1;\r\n if (a.isDynamic && !b.isDynamic) return 1;\r\n\r\n // Shorter paths first\r\n const aSegments = a.path.split('/').length;\r\n const bSegments = b.path.split('/').length;\r\n if (aSegments !== bSegments) return aSegments - bSegments;\r\n\r\n // Alphabetical as tiebreaker\r\n return a.path.localeCompare(b.path);\r\n });\r\n}\r\n\r\n/**\r\n * Generate route manifest from scanned routes\r\n */\r\nexport function generateRouteManifest(routesDir: string): RouteManifest {\r\n const allRoutes = scanDirectory(routesDir);\r\n\r\n // Filter by type - pages are routes that are not special files or API routes\r\n const isPageRoute = (r: ScannedRoute) =>\r\n !r.isLayout && !r.isLoading && !r.isError && !r.isNotFound && !r.isApiRoute;\r\n\r\n const routes = sortRoutes(allRoutes.filter(isPageRoute));\r\n const layouts = allRoutes.filter(r => r.isLayout);\r\n const loadingStates = allRoutes.filter(r => r.isLoading);\r\n const errorBoundaries = allRoutes.filter(r => r.isError);\r\n const notFoundPages = allRoutes.filter(r => r.isNotFound);\r\n const apiRoutes = sortRoutes(allRoutes.filter(r => r.isApiRoute));\r\n\r\n return {\r\n routes,\r\n layouts,\r\n loadingStates,\r\n errorBoundaries,\r\n notFoundPages,\r\n apiRoutes,\r\n generated: new Date().toISOString(),\r\n };\r\n}\r\n\r\n/**\r\n * Generate TypeScript route manifest file\r\n */\r\nexport function generateRoutesFile(manifest: RouteManifest, outputDir: string): void {\r\n // Ensure output directory exists\r\n if (!existsSync(outputDir)) {\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Generate routes.ts content\r\n const routesContent = `/**\r\n * Auto-generated by Flight CLI\r\n * Do not edit manually\r\n * Generated: ${manifest.generated}\r\n */\r\n\r\nimport type { RouteDefinition } from '@flight-framework/router';\r\n\r\n// Page Routes\r\nexport const routes: RouteDefinition[] = [\r\n${manifest.routes.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Layout Components\r\nexport const layouts = [\r\n${manifest.layouts.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Loading State Components\r\nexport const loadingStates = [\r\n${manifest.loadingStates.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Error Boundary Components\r\nexport const errorBoundaries = [\r\n${manifest.errorBoundaries.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Not Found Page Components\r\nexport const notFoundPages = [\r\n${manifest.notFoundPages.map(r => ` {\r\n path: '${r.path}',\r\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// API Routes\r\nexport const apiRoutes = [\r\n${manifest.apiRoutes.map(r => ` {\r\n path: '${r.path}',\r\n method: '${r.httpMethod}',\r\n handler: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\r\n },`).join('\\n')}\r\n];\r\n\r\n// Type-safe route paths\r\nexport type AppRoutes = ${manifest.routes.length > 0\r\n ? manifest.routes.map(r => `'${r.path}'`).join(' | ')\r\n : 'never'};\r\n\r\n// Type-safe API route paths\r\nexport type ApiRoutes = ${manifest.apiRoutes.length > 0\r\n ? manifest.apiRoutes.map(r => `'${r.path}'`).join(' | ')\r\n : 'never'};\r\n`;\r\n\r\n writeFileSync(join(outputDir, 'routes.ts'), routesContent, 'utf-8');\r\n\r\n // Generate types.ts for enhanced type safety\r\n const typesContent = `/**\r\n * Auto-generated route types\r\n * Generated: ${manifest.generated}\r\n */\r\n\r\nimport type { RouteParams } from '@flight-framework/router';\r\n\r\n// Extract params from route patterns\r\n${manifest.routes\r\n .filter(r => r.isDynamic)\r\n .map(r => {\r\n const paramMatches = r.path.match(/:(\\w+)/g) || [];\r\n const params = paramMatches.map(p => p.slice(1));\r\n const typeName = r.path\r\n .replace(/[/:]/g, '_')\r\n .replace(/^_/, '')\r\n .replace(/_$/, '') || 'Root';\r\n return `export type ${typeName}Params = { ${params.map(p => `${p}: string`).join('; ')} };`;\r\n })\r\n .join('\\n')}\r\n`;\r\n\r\n writeFileSync(join(outputDir, 'types.ts'), typesContent, 'utf-8');\r\n}\r\n\r\n/**\r\n * Main function to generate routes\r\n */\r\nexport async function generateRoutes(options: {\r\n routesDir: string;\r\n outputDir: string;\r\n watch?: boolean;\r\n}): Promise<RouteManifest> {\r\n const { routesDir, outputDir } = options;\r\n\r\n console.log(`Scanning routes in: ${routesDir}`);\r\n\r\n const manifest = generateRouteManifest(routesDir);\r\n\r\n const stats = [\r\n `${manifest.routes.length} pages`,\r\n `${manifest.layouts.length} layouts`,\r\n `${manifest.loadingStates.length} loading states`,\r\n `${manifest.errorBoundaries.length} error boundaries`,\r\n `${manifest.notFoundPages.length} not-found pages`,\r\n `${manifest.apiRoutes.length} API routes`,\r\n ].join(', ');\r\n\r\n console.log(`Found: ${stats}`);\r\n\r\n generateRoutesFile(manifest, outputDir);\r\n\r\n console.log(`Generated route manifest in: ${outputDir}`);\r\n\r\n return manifest;\r\n}\r\n","/**\r\n * Types Generate Command\r\n *\r\n * Generates TypeScript declaration files for routes and environment variables.\r\n * This command is opt-in and explicit - follows Flight's toolbox philosophy.\r\n *\r\n * Usage:\r\n * flight types:generate # Generate route types (default)\r\n * flight types:generate --routes # Generate route types only\r\n * flight types:generate --env # Generate env types only\r\n * flight types:generate --watch # Watch mode for development\r\n *\r\n * Output:\r\n * src/.flight/routes.d.ts - Route type definitions\r\n * src/.flight/env.d.ts - Environment variable types\r\n */\r\n\r\nimport { resolve } from 'path';\r\nimport { generateTypes, watchAndGenerate } from '../generators/typegen.js';\r\n\r\nexport interface TypesGenerateOptions {\r\n /** Routes directory (default: src/routes) */\r\n routesDir?: string;\r\n\r\n /** Output directory (default: src/.flight) */\r\n outputDir?: string;\r\n\r\n /** Generate route types (default: true) */\r\n routes?: boolean;\r\n\r\n /** Generate environment variable types (default: false) */\r\n env?: boolean;\r\n\r\n /** Watch for changes and regenerate (default: false) */\r\n watch?: boolean;\r\n}\r\n\r\nexport async function typesGenerateCommand(options: TypesGenerateOptions = {}): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n const routesDir = options.routesDir\r\n ? resolve(cwd, options.routesDir)\r\n : resolve(cwd, 'src/routes');\r\n\r\n const outputDir = options.outputDir\r\n ? resolve(cwd, options.outputDir)\r\n : resolve(cwd, 'src/.flight');\r\n\r\n // Default to routes if no specific flag is set\r\n const includeRoutes = options.routes ?? (!options.env);\r\n const includeEnv = options.env ?? false;\r\n\r\n console.log('Flight Type Generator');\r\n console.log('---------------------');\r\n console.log(`Routes directory: ${routesDir}`);\r\n console.log(`Output directory: ${outputDir}`);\r\n console.log(`Generate routes: ${includeRoutes}`);\r\n console.log(`Generate env: ${includeEnv}`);\r\n console.log('');\r\n\r\n try {\r\n if (options.watch) {\r\n console.log('Watching for changes... (Ctrl+C to stop)');\r\n console.log('');\r\n\r\n const cleanup = watchAndGenerate({\r\n routesDir,\r\n outputDir,\r\n includeRoutes,\r\n includeEnv,\r\n projectRoot: cwd,\r\n onRegenerate: (result) => {\r\n console.log(`Regenerated: ${result.filesWritten.length} files`);\r\n },\r\n });\r\n\r\n // Handle graceful shutdown\r\n process.on('SIGINT', () => {\r\n console.log('\\nStopping watch mode...');\r\n cleanup();\r\n process.exit(0);\r\n });\r\n\r\n // Keep process alive\r\n await new Promise(() => { });\r\n } else {\r\n const result = await generateTypes({\r\n routesDir,\r\n outputDir,\r\n includeRoutes,\r\n includeEnv,\r\n projectRoot: cwd,\r\n });\r\n\r\n console.log('Type generation complete!');\r\n console.log('');\r\n console.log('Files written:');\r\n for (const file of result.filesWritten) {\r\n console.log(` - ${file}`);\r\n }\r\n console.log('');\r\n console.log('Add to your tsconfig.json includes:');\r\n console.log(' \"include\": [\"src\", \"src/.flight/*.d.ts\"]');\r\n }\r\n } catch (error) {\r\n console.error('Type generation failed:', error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Add Command\r\n * \r\n * Add Flight packages to an existing project.\r\n * Toolbox philosophy: add only what you need, when you need it.\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\nimport { execSync } from 'node:child_process';\r\nimport { consola } from 'consola';\r\n\r\nconst PACKAGES: Record<string, PackageInfo> = {\r\n // Core\r\n 'http': {\r\n name: '@flight-framework/http',\r\n description: 'HTTP server with routing and middleware',\r\n category: 'core',\r\n },\r\n 'core': {\r\n name: '@flight-framework/core',\r\n description: 'File-based routing and configuration',\r\n category: 'core',\r\n },\r\n\r\n // Data\r\n 'db': {\r\n name: '@flight-framework/db',\r\n description: 'Database abstraction layer',\r\n category: 'data',\r\n drivers: ['pg', '@libsql/client', '@neondatabase/serverless', '@supabase/supabase-js'],\r\n },\r\n 'cache': {\r\n name: '@flight-framework/cache',\r\n description: 'Caching with multiple adapters',\r\n category: 'data',\r\n },\r\n\r\n // Auth\r\n 'auth': {\r\n name: '@flight-framework/auth',\r\n description: 'Authentication adapters',\r\n category: 'auth',\r\n },\r\n\r\n // Frontend\r\n 'forms': {\r\n name: '@flight-framework/forms',\r\n description: 'Type-safe form handling',\r\n category: 'frontend',\r\n },\r\n 'i18n': {\r\n name: '@flight-framework/i18n',\r\n description: 'Internationalization',\r\n category: 'frontend',\r\n },\r\n 'seo': {\r\n name: '@flight-framework/seo',\r\n description: 'SEO utilities',\r\n category: 'frontend',\r\n },\r\n 'image': {\r\n name: '@flight-framework/image',\r\n description: 'Image optimization',\r\n category: 'frontend',\r\n },\r\n\r\n // Communication\r\n 'email': {\r\n name: '@flight-framework/email',\r\n description: 'Email sending',\r\n category: 'communication',\r\n },\r\n 'realtime': {\r\n name: '@flight-framework/realtime',\r\n description: 'WebSocket and real-time features',\r\n category: 'communication',\r\n },\r\n\r\n // Deployment\r\n 'helpers': {\r\n name: '@flight-framework/helpers',\r\n description: 'Optional helper utilities (detection, suggestions)',\r\n category: 'utilities',\r\n },\r\n};\r\n\r\ninterface PackageInfo {\r\n name: string;\r\n description: string;\r\n category: string;\r\n drivers?: string[];\r\n}\r\n\r\nexport async function addCommand(packageName: string | undefined): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n // Check if we're in a project\r\n if (!existsSync(join(cwd, 'package.json'))) {\r\n consola.error('No package.json found. Run this command from your project directory.');\r\n process.exit(1);\r\n }\r\n\r\n // If no package specified, show available packages\r\n if (!packageName) {\r\n showAvailablePackages();\r\n return;\r\n }\r\n\r\n // Find the package\r\n const pkg = PACKAGES[packageName];\r\n if (!pkg) {\r\n consola.error(`Unknown package: ${packageName}`);\r\n consola.log('Run `flight add` to see available packages.');\r\n process.exit(1);\r\n }\r\n\r\n consola.info(`Adding ${pkg.name}...`);\r\n consola.log(pkg.description);\r\n consola.log('');\r\n\r\n // Detect package manager\r\n const pm = detectPackageManager();\r\n\r\n // Install the package\r\n try {\r\n const installCmd = pm === 'npm' ? 'npm install' : `${pm} add`;\r\n execSync(`${installCmd} ${pkg.name}`, { cwd, stdio: 'inherit' });\r\n\r\n consola.success(`${pkg.name} added successfully!`);\r\n\r\n // Show next steps\r\n showNextSteps(packageName, pkg);\r\n\r\n } catch (error) {\r\n consola.error(`Failed to install ${pkg.name}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction detectPackageManager(): string {\r\n const cwd = process.cwd();\r\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\r\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\r\n if (existsSync(join(cwd, 'bun.lockb'))) return 'bun';\r\n return 'npm';\r\n}\r\n\r\nfunction showAvailablePackages(): void {\r\n consola.log(`\r\nAvailable Flight packages:\r\n\r\nCore\r\n http HTTP server with routing and middleware\r\n core File-based routing and configuration\r\n\r\nData\r\n db Database abstraction layer\r\n cache Caching with multiple adapters\r\n\r\nAuth\r\n auth Authentication adapters\r\n\r\nFrontend\r\n forms Type-safe form handling\r\n i18n Internationalization\r\n seo SEO utilities\r\n image Image optimization\r\n\r\nCommunication\r\n email Email sending\r\n realtime WebSocket and real-time features\r\n\r\nUtilities\r\n helpers Optional helper utilities\r\n\r\nUsage:\r\n flight add http\r\n flight add db\r\n flight add auth\r\n`);\r\n}\r\n\r\nfunction showNextSteps(packageName: string, pkg: PackageInfo): void {\r\n const examples: Record<string, string> = {\r\n 'http': `\r\nQuick example:\r\n\r\n import { createServer } from '@flight-framework/http';\r\n \r\n const app = createServer();\r\n app.get('/', (c) => c.json({ hello: 'world' }));\r\n \r\n export default { port: 3000, fetch: app.fetch };\r\n`,\r\n 'db': `\r\nQuick example:\r\n\r\n import { createDb } from '@flight-framework/db';\r\n import { postgres } from '@flight-framework/db/postgres';\r\n \r\n const db = createDb(postgres({ connectionString: process.env.DATABASE_URL }));\r\n const users = await db.query('SELECT * FROM users');\r\n\r\nYou may also need a driver:\r\n npm install pg # PostgreSQL\r\n npm install @libsql/client # Turso/SQLite\r\n npm install @neondatabase/serverless # Neon\r\n`,\r\n 'cache': `\r\nQuick example:\r\n\r\n import { createCache, lru } from '@flight-framework/cache';\r\n \r\n const cache = createCache(lru({ max: 1000 }));\r\n await cache.set('key', { data: 'value' });\r\n const value = await cache.get('key');\r\n`,\r\n 'auth': `\r\nQuick example:\r\n\r\n import { createAuth } from '@flight-framework/auth';\r\n import { betterAuth } from '@flight-framework/auth/better-auth';\r\n \r\n const auth = createAuth(betterAuth({ db }));\r\n const user = await auth.getUser(request);\r\n`,\r\n 'forms': `\r\nQuick example:\r\n\r\n import { createForm } from '@flight-framework/forms';\r\n import { zodAdapter } from '@flight-framework/forms/adapters/zod';\r\n \r\n const form = createForm({ schema: zodAdapter(schema) });\r\n const result = form.validate(data);\r\n`,\r\n };\r\n\r\n if (examples[packageName]) {\r\n consola.log(examples[packageName]);\r\n }\r\n\r\n consola.log(`Docs: https://flight.dev/docs/packages/${packageName}`);\r\n}\r\n\r\nexport function registerAddCommand(program: any): void {\r\n program\r\n .command('add [package]')\r\n .description('Add a Flight package to your project')\r\n .action(addCommand);\r\n}\r\n","/**\r\n * Flight CLI - Adapter Create Command\r\n * \r\n * Scaffolds a new adapter package with all necessary files.\r\n * \r\n * Usage:\r\n * flight adapter:create my-platform\r\n * flight adapter:create my-platform --type edge\r\n * flight adapter:create my-platform --validation\r\n * \r\n * @module @flight-framework/cli/commands/adapter-create\r\n */\r\n\r\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\nimport { consola } from 'consola';\r\n\r\nexport interface AdapterCreateOptions {\r\n /** Adapter name (e.g., 'my-platform') */\r\n name: string;\r\n /** Platform type for template selection */\r\n type?: 'node' | 'edge' | 'container' | 'serverless';\r\n /** Include Zod validation example */\r\n validation?: boolean;\r\n /** Output directory (default: packages/adapter-{name}) */\r\n outputDir?: string;\r\n}\r\n\r\nexport async function adapterCreateCommand(name: string, options: Partial<AdapterCreateOptions> = {}): Promise<void> {\r\n const cwd = process.cwd();\r\n const adapterName = name.toLowerCase().replace(/[^a-z0-9-]/g, '-');\r\n const packageName = `@flight-framework/adapter-${adapterName}`;\r\n const outputDir = options.outputDir || join(cwd, 'packages', `adapter-${adapterName}`);\r\n const type = options.type || 'node';\r\n const includeValidation = options.validation || false;\r\n\r\n consola.info(`Creating adapter: ${packageName}`);\r\n\r\n // Check if directory exists\r\n if (existsSync(outputDir)) {\r\n consola.error(`Directory already exists: ${outputDir}`);\r\n process.exit(1);\r\n }\r\n\r\n // Create directory structure\r\n mkdirSync(join(outputDir, 'src'), { recursive: true });\r\n mkdirSync(join(outputDir, 'tests'), { recursive: true });\r\n\r\n // Generate files\r\n const files = generateAdapterFiles(adapterName, packageName, type, includeValidation);\r\n\r\n for (const [filePath, content] of Object.entries(files)) {\r\n const fullPath = join(outputDir, filePath);\r\n writeFileSync(fullPath, content, 'utf-8');\r\n consola.success(`Created ${filePath}`);\r\n }\r\n\r\n consola.success(`Adapter created successfully!\r\n\r\n Next steps:\r\n 1. cd packages/adapter-${adapterName}\r\n 2. Implement your adapter logic in src/index.ts\r\n 3. Run: pnpm build\r\n 4. Test: pnpm test\r\n\r\n Documentation:\r\n https://flight.dev/docs/adapters/custom\r\n`);\r\n}\r\n\r\nfunction generateAdapterFiles(\r\n name: string,\r\n packageName: string,\r\n type: string,\r\n includeValidation: boolean\r\n): Record<string, string> {\r\n const pascalName = name\r\n .split('-')\r\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\r\n .join('');\r\n\r\n return {\r\n 'package.json': generatePackageJson(packageName, includeValidation),\r\n 'tsconfig.json': generateTsConfig(),\r\n 'tsup.config.ts': generateTsupConfig(),\r\n 'src/index.ts': generateAdapterSource(name, pascalName, type, includeValidation),\r\n 'tests/adapter.test.ts': generateAdapterTest(name, pascalName),\r\n 'README.md': generateReadme(name, packageName),\r\n };\r\n}\r\n\r\nfunction generatePackageJson(packageName: string, includeValidation: boolean): string {\r\n const pkg = {\r\n name: packageName,\r\n version: '0.1.0',\r\n description: `Flight adapter for custom platform`,\r\n type: 'module',\r\n main: './dist/index.js',\r\n types: './dist/index.d.ts',\r\n exports: {\r\n '.': {\r\n types: './dist/index.d.ts',\r\n import: './dist/index.js',\r\n },\r\n },\r\n scripts: {\r\n build: 'tsup',\r\n test: 'vitest run',\r\n 'test:watch': 'vitest',\r\n },\r\n dependencies: {\r\n '@flight-framework/core': '^0.4.0',\r\n },\r\n devDependencies: {\r\n tsup: '^8.0.0',\r\n typescript: '^5.0.0',\r\n vitest: '^2.0.0',\r\n ...(includeValidation ? { zod: '^3.23.0' } : {}),\r\n },\r\n peerDependencies: includeValidation ? {\r\n zod: '^3.0.0',\r\n } : undefined,\r\n peerDependenciesMeta: includeValidation ? {\r\n zod: { optional: true },\r\n } : undefined,\r\n };\r\n\r\n return JSON.stringify(pkg, null, 2);\r\n}\r\n\r\nfunction generateTsConfig(): string {\r\n return JSON.stringify({\r\n extends: '../../tsconfig.base.json',\r\n compilerOptions: {\r\n outDir: './dist',\r\n rootDir: './src',\r\n },\r\n include: ['src'],\r\n }, null, 2);\r\n}\r\n\r\nfunction generateTsupConfig(): string {\r\n return `import { defineConfig } from 'tsup';\r\n\r\nexport default defineConfig({\r\n entry: ['src/index.ts'],\r\n format: ['esm'],\r\n dts: true,\r\n clean: true,\r\n target: 'node20',\r\n});\r\n`;\r\n}\r\n\r\nfunction generateAdapterSource(\r\n name: string,\r\n pascalName: string,\r\n type: string,\r\n includeValidation: boolean\r\n): string {\r\n if (includeValidation) {\r\n return `/**\r\n * Flight Adapter - ${pascalName}\r\n * \r\n * Custom deployment adapter with optional Zod validation.\r\n */\r\n\r\nimport { createValidatedAdapter, type AdapterBuilder } from '@flight-framework/core/adapters';\r\nimport { z } from 'zod';\r\n\r\n// ============================================================================\r\n// Options Schema (Optional - Zod validation)\r\n// ============================================================================\r\n\r\nconst optionsSchema = z.object({\r\n /** Server port */\r\n port: z.number().default(3000),\r\n /** Enable health check endpoint */\r\n healthCheck: z.boolean().default(true),\r\n /** Custom environment variables */\r\n env: z.record(z.string()).optional(),\r\n});\r\n\r\nexport type ${pascalName}AdapterOptions = z.infer<typeof optionsSchema>;\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\nexport default createValidatedAdapter('${name}', optionsSchema, (options) => ({\r\n async adapt(builder: AdapterBuilder) {\r\n builder.log.info(\\`Building for ${pascalName} platform...\\`);\r\n builder.log.info(\\`Port: \\${options.port}\\`);\r\n\r\n // Generate server entry\r\n await generateServerEntry(builder, options);\r\n\r\n // Generate platform-specific config\r\n await generatePlatformConfig(builder, options);\r\n\r\n builder.log.info('Build complete!');\r\n },\r\n\r\n supports: {\r\n node: () => ${type === 'node' || type === 'container'},\r\n edge: () => ${type === 'edge' || type === 'serverless'},\r\n streaming: () => ${type === 'node'},\r\n websockets: () => ${type === 'node'},\r\n },\r\n\r\n emulate: () => ({\r\n env: {\r\n ${name.toUpperCase().replace(/-/g, '_')}_PLATFORM: 'true',\r\n PORT: String(options.port),\r\n },\r\n }),\r\n}));\r\n\r\n// ============================================================================\r\n// Generator Functions\r\n// ============================================================================\r\n\r\nasync function generateServerEntry(builder: AdapterBuilder, options: ${pascalName}AdapterOptions): Promise<void> {\r\n const serverCode = \\`\r\nimport { createUniversalHandler } from '@flight-framework/core/adapters';\r\nimport manifest from './manifest.js';\r\n\r\nconst handler = createUniversalHandler(manifest);\r\n\r\nconst server = Bun.serve({\r\n port: \\${options.port},\r\n fetch: handler,\r\n});\r\n\r\nconsole.log(\\\\\\`Server running at http://localhost:\\${options.port}\\\\\\`);\r\n\\`;\r\n\r\n await builder.writeFile('server.ts', serverCode.trim());\r\n}\r\n\r\nasync function generatePlatformConfig(builder: AdapterBuilder, options: ${pascalName}AdapterOptions): Promise<void> {\r\n const config = {\r\n name: '${name}-app',\r\n port: options.port,\r\n healthCheck: options.healthCheck ? '/health' : null,\r\n };\r\n\r\n await builder.writeFile('platform.json', JSON.stringify(config, null, 2));\r\n}\r\n`;\r\n }\r\n\r\n // Without validation (default)\r\n return `/**\r\n * Flight Adapter - ${pascalName}\r\n * \r\n * Custom deployment adapter for ${pascalName} platform.\r\n * \r\n * @example\r\n * \\`\\`\\`typescript\r\n * import ${name.replace(/-/g, '')} from '${name.includes('@') ? name : `@flight-framework/adapter-${name}`}';\r\n * \r\n * export default defineConfig({\r\n * adapter: ${name.replace(/-/g, '')}({\r\n * port: 3000,\r\n * }),\r\n * });\r\n * \\`\\`\\`\r\n */\r\n\r\nimport { createAdapter, type AdapterBuilder } from '@flight-framework/core/adapters';\r\n\r\n// ============================================================================\r\n// Options Interface\r\n// ============================================================================\r\n\r\nexport interface ${pascalName}AdapterOptions {\r\n /** Server port (default: 3000) */\r\n port?: number;\r\n /** Enable health check endpoint (default: true) */\r\n healthCheck?: boolean;\r\n /** Custom environment variables */\r\n env?: Record<string, string>;\r\n}\r\n\r\n// ============================================================================\r\n// Adapter Implementation\r\n// ============================================================================\r\n\r\nexport default function ${name.replace(/-/g, '')}Adapter(options: ${pascalName}AdapterOptions = {}) {\r\n const {\r\n port = 3000,\r\n healthCheck = true,\r\n env = {},\r\n } = options;\r\n\r\n return createAdapter({\r\n name: '${name}',\r\n\r\n async adapt(builder: AdapterBuilder) {\r\n builder.log.info(\\`Building for ${pascalName} platform...\\`);\r\n builder.log.info(\\`Port: \\${port}\\`);\r\n\r\n // Generate server entry\r\n await generateServerEntry(builder, port, healthCheck);\r\n\r\n // Generate platform-specific config\r\n await generatePlatformConfig(builder, port, healthCheck);\r\n\r\n builder.log.info('Build complete!');\r\n },\r\n\r\n supports: {\r\n node: () => ${type === 'node' || type === 'container'},\r\n edge: () => ${type === 'edge' || type === 'serverless'},\r\n streaming: () => ${type === 'node'},\r\n websockets: () => ${type === 'node'},\r\n },\r\n\r\n emulate: () => ({\r\n env: {\r\n ${name.toUpperCase().replace(/-/g, '_')}_PLATFORM: 'true',\r\n PORT: String(port),\r\n ...env,\r\n },\r\n }),\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Generator Functions\r\n// ============================================================================\r\n\r\nasync function generateServerEntry(\r\n builder: AdapterBuilder,\r\n port: number,\r\n healthCheck: boolean\r\n): Promise<void> {\r\n const serverCode = \\`\r\nimport { createServer } from 'node:http';\r\nimport { createUniversalHandler } from '@flight-framework/core/adapters';\r\nimport manifest from './manifest.js';\r\n\r\nconst handler = createUniversalHandler(manifest);\r\n\r\nconst server = createServer(async (req, res) => {\r\n const url = req.url || '/';\r\n \r\n // Health check endpoint\r\n if (url === '/health' && \\${healthCheck}) {\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ status: 'ok' }));\r\n return;\r\n }\r\n\r\n // Handle request with Flight\r\n const webReq = new Request(\\\\\\`http://localhost\\${url}\\\\\\`, {\r\n method: req.method,\r\n headers: Object.fromEntries(\r\n Object.entries(req.headers).filter(([_, v]) => v != null).map(([k, v]) => [k, String(v)])\r\n ),\r\n });\r\n\r\n const response = await handler(webReq);\r\n\r\n res.writeHead(response.status, Object.fromEntries(response.headers));\r\n res.end(await response.text());\r\n});\r\n\r\nserver.listen(\\${port}, () => {\r\n console.log(\\\\\\`Server running at http://localhost:\\${port}\\\\\\`);\r\n});\r\n\\`;\r\n\r\n await builder.writeFile('server.mjs', serverCode.trim());\r\n}\r\n\r\nasync function generatePlatformConfig(\r\n builder: AdapterBuilder,\r\n port: number,\r\n healthCheck: boolean\r\n): Promise<void> {\r\n const config = {\r\n name: '${name}-app',\r\n port,\r\n healthCheck: healthCheck ? '/health' : null,\r\n };\r\n\r\n await builder.writeFile('platform.json', JSON.stringify(config, null, 2));\r\n}\r\n`;\r\n}\r\n\r\nfunction generateAdapterTest(name: string, pascalName: string): string {\r\n return `/**\r\n * ${pascalName} Adapter Tests\r\n */\r\n\r\nimport { describe, it, expect, vi } from 'vitest';\r\nimport adapter from '../src/index.js';\r\n\r\ndescribe('adapter-${name}', () => {\r\n const createMockBuilder = () => ({\r\n manifest: {\r\n entries: {},\r\n files: [],\r\n routes: [],\r\n },\r\n root: '/test',\r\n outDir: '/test/dist',\r\n readFile: vi.fn(),\r\n writeFile: vi.fn(),\r\n copy: vi.fn(),\r\n glob: vi.fn(),\r\n log: {\r\n info: vi.fn(),\r\n warn: vi.fn(),\r\n error: vi.fn(),\r\n },\r\n });\r\n\r\n it('should have correct name', () => {\r\n const instance = adapter();\r\n expect(instance.name).toBe('${name}');\r\n });\r\n\r\n it('should generate server entry', async () => {\r\n const instance = adapter({ port: 4000 });\r\n const builder = createMockBuilder();\r\n\r\n await instance.adapt(builder);\r\n\r\n expect(builder.writeFile).toHaveBeenCalledWith(\r\n 'server.mjs',\r\n expect.stringContaining('4000')\r\n );\r\n });\r\n\r\n it('should generate platform config', async () => {\r\n const instance = adapter();\r\n const builder = createMockBuilder();\r\n\r\n await instance.adapt(builder);\r\n\r\n expect(builder.writeFile).toHaveBeenCalledWith(\r\n 'platform.json',\r\n expect.any(String)\r\n );\r\n });\r\n\r\n it('should declare supported features', () => {\r\n const instance = adapter();\r\n\r\n expect(instance.supports?.node?.()).toBeDefined();\r\n expect(instance.supports?.streaming?.()).toBeDefined();\r\n });\r\n\r\n it('should provide emulation environment', () => {\r\n const instance = adapter({ port: 5000 });\r\n const emulation = instance.emulate?.();\r\n\r\n expect(emulation?.env?.PORT).toBe('5000');\r\n expect(emulation?.env?.${name.toUpperCase().replace(/-/g, '_')}_PLATFORM).toBe('true');\r\n });\r\n});\r\n`;\r\n}\r\n\r\nfunction generateReadme(name: string, packageName: string): string {\r\n return `# ${packageName}\r\n\r\nFlight adapter for ${name} platform.\r\n\r\n## Installation\r\n\r\n\\`\\`\\`bash\r\nnpm install ${packageName}\r\n\\`\\`\\`\r\n\r\n## Usage\r\n\r\n\\`\\`\\`typescript\r\nimport { defineConfig } from '@flight-framework/core';\r\nimport ${name.replace(/-/g, '')} from '${packageName}';\r\n\r\nexport default defineConfig({\r\n adapter: ${name.replace(/-/g, '')}({\r\n port: 3000,\r\n healthCheck: true,\r\n }),\r\n});\r\n\\`\\`\\`\r\n\r\n## Options\r\n\r\n| Option | Type | Default | Description |\r\n|--------|------|---------|-------------|\r\n| \\`port\\` | \\`number\\` | \\`3000\\` | Server port |\r\n| \\`healthCheck\\` | \\`boolean\\` | \\`true\\` | Enable health check endpoint |\r\n| \\`env\\` | \\`Record<string, string>\\` | \\`{}\\` | Custom environment variables |\r\n\r\n## License\r\n\r\nMIT\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":["consola","projectPath","resolve","join","readFileSync","existsSync","consola","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","consola","resolve","join","existsSync","readFileSync","resolve","existsSync","consola","loadConfig","resolve","existsSync","consola","loadConfig","build","resolve","consola","loadConfig","consola","resolve","loadConfig","preview","resolve","readdirSync","statSync","existsSync","writeFileSync","mkdirSync","join","dirname","filePathToUrlPath","existsSync","readdirSync","join","statSync","filePathToUrlPath","dirname","mkdirSync","writeFileSync","resolve","resolve","resolve","existsSync","join","execSync","consola","detectPackageManager","existsSync","mkdirSync","writeFileSync","join","consola","consola"]}