@flight-framework/cli 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +474 -474
  2. package/dist/bin.js +0 -0
  3. package/dist/bin.js.map +1 -1
  4. package/dist/index.js +0 -0
  5. package/dist/index.js.map +1 -1
  6. package/package.json +54 -54
  7. package/templates/angular/index.html +13 -0
  8. package/templates/angular/package.json.template +25 -0
  9. package/templates/angular/src/app.component.ts +13 -0
  10. package/templates/angular/src/main.server.ts +11 -0
  11. package/templates/angular/src/main.ts +4 -0
  12. package/templates/angular/tsconfig.json +16 -0
  13. package/templates/base/README.md.template +26 -26
  14. package/templates/base/_gitignore +25 -25
  15. package/templates/base/flight.config.ts.template +15 -15
  16. package/templates/base/styles/global.css +58 -58
  17. package/templates/htmx/index.html +18 -18
  18. package/templates/htmx/package.json.template +18 -18
  19. package/templates/htmx/vite.config.ts +6 -6
  20. package/templates/lit/index.html +14 -14
  21. package/templates/lit/package.json.template +21 -21
  22. package/templates/lit/src/app-root.ts +18 -18
  23. package/templates/lit/src/entry-client.ts +5 -5
  24. package/templates/lit/src/entry-server.ts +9 -9
  25. package/templates/lit/tsconfig.json +18 -18
  26. package/templates/lit/vite.config.ts +6 -6
  27. package/templates/preact/index.html +14 -14
  28. package/templates/preact/package.json.template +22 -22
  29. package/templates/preact/src/App.tsx +8 -8
  30. package/templates/preact/src/entry-client.tsx +11 -11
  31. package/templates/preact/src/entry-server.tsx +6 -6
  32. package/templates/preact/tsconfig.json +18 -18
  33. package/templates/preact/vite.config.ts +8 -8
  34. package/templates/qwik/index.html +14 -14
  35. package/templates/qwik/package.json.template +20 -20
  36. package/templates/qwik/src/App.tsx +10 -10
  37. package/templates/qwik/src/entry-client.tsx +4 -4
  38. package/templates/qwik/src/entry-server.tsx +9 -9
  39. package/templates/qwik/tsconfig.json +18 -18
  40. package/templates/qwik/vite.config.ts +8 -8
  41. package/templates/react/index.html +13 -13
  42. package/templates/react/package.json.template +24 -24
  43. package/templates/react/src/App.tsx +13 -13
  44. package/templates/react/src/context/RouterContext.tsx +63 -63
  45. package/templates/react/src/entry-client.tsx +19 -19
  46. package/templates/react/src/entry-server.tsx +17 -17
  47. package/templates/react/tsconfig.json +19 -19
  48. package/templates/react/vite.config.ts +12 -12
  49. package/templates/solid/index.html +14 -14
  50. package/templates/solid/package.json.template +21 -21
  51. package/templates/solid/src/App.tsx +8 -8
  52. package/templates/solid/src/entry-client.tsx +11 -11
  53. package/templates/solid/src/entry-server.tsx +6 -6
  54. package/templates/solid/tsconfig.json +18 -18
  55. package/templates/solid/vite.config.ts +8 -8
  56. package/templates/svelte/index.html +14 -14
  57. package/templates/svelte/package.json.template +21 -21
  58. package/templates/svelte/src/App.svelte +4 -4
  59. package/templates/svelte/src/entry-client.ts +7 -7
  60. package/templates/svelte/src/entry-server.ts +7 -7
  61. package/templates/svelte/tsconfig.json +17 -17
  62. package/templates/svelte/vite.config.ts +8 -8
  63. package/templates/vanilla/index.html +14 -14
  64. package/templates/vanilla/package.json.template +19 -19
  65. package/templates/vanilla/src/main.ts +10 -10
  66. package/templates/vanilla/tsconfig.json +16 -16
  67. package/templates/vanilla/vite.config.ts +6 -6
  68. package/templates/vue/index.html +14 -14
  69. package/templates/vue/package.json.template +21 -21
  70. package/templates/vue/src/App.vue +6 -6
  71. package/templates/vue/src/entry-client.ts +12 -12
  72. package/templates/vue/src/entry-server.ts +8 -8
  73. package/templates/vue/tsconfig.json +17 -17
  74. package/templates/vue/vite.config.ts +8 -8
package/dist/bin.js CHANGED
File without changes
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/commands/build.ts","../src/commands/preview.ts","../src/commands/routes-generate.ts","../src/generators/routes.ts","../src/commands/types-generate.ts","../src/generators/typegen.ts","../src/bin.ts"],"sourcesContent":["import { cac } from 'cac';\r\nimport pc from 'picocolors';\r\nimport { VERSION } from './version.js';\r\nimport { createCommand } from './commands/create.js';\r\nimport { devCommand } from './commands/dev.js';\r\nimport { buildCommand } from './commands/build.js';\r\nimport { previewCommand } from './commands/preview.js';\r\nimport { routesGenerateCommand } from './commands/routes-generate.js';\r\nimport { typesGenerateCommand } from './commands/types-generate.js';\r\n\r\nconst cli = cac('flight');\r\n\r\n// Logo\r\nconst LOGO = `\r\n${pc.cyan(' ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗')}\r\n${pc.cyan(' ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝')}\r\n${pc.cyan(' █████╗ ██║ ██║██║ ███╗███████║ ██║ ')}\r\n${pc.cyan(' ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ ')}\r\n${pc.cyan(' ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ ')}\r\n${pc.cyan(' ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ')}\r\n \r\n ${pc.dim('The Agnostic Full-Stack Framework')}\r\n ${pc.dim('Maximum Flexibility. Zero Lock-in.')}\r\n`;\r\n\r\nexport function printLogo(): void {\r\n console.log(LOGO);\r\n}\r\n\r\n// Version\r\ncli.version(VERSION);\r\ncli.help();\r\n\r\n// Commands\r\ncli\r\n .command('create [name]', 'Create a new Flight project')\r\n .option('-t, --template <template>', 'Project template to use', { default: 'basic' })\r\n .option('--ui <framework>', 'UI framework (react, vue, svelte, solid, vanilla)')\r\n .option('--ts', 'Use TypeScript', { default: true })\r\n .option('--git', 'Initialize git repository', { default: true })\r\n .option('--install', 'Install dependencies', { default: true })\r\n .action(createCommand);\r\n\r\ncli\r\n .command('dev', 'Start development server')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .option('--https', 'Enable HTTPS')\r\n .option('--ssr', 'Enable Server-Side Rendering')\r\n .action(devCommand);\r\n\r\ncli\r\n .command('build', 'Build for production')\r\n .option('--outDir <dir>', 'Output directory')\r\n .option('--sourcemap', 'Generate source maps')\r\n .option('--minify', 'Minify output', { default: true })\r\n .action(buildCommand);\r\n\r\ncli\r\n .command('preview', 'Preview production build')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .action(previewCommand);\r\n\r\ncli\r\n .command('routes:generate', 'Generate route manifest from routes directory')\r\n .option('--routesDir <dir>', 'Routes directory', { default: 'src/routes' })\r\n .option('--outputDir <dir>', 'Output directory', { default: 'src/.flight' })\r\n .action(routesGenerateCommand);\r\n\r\ncli\r\n .command('types:generate', 'Generate TypeScript types for routes and environment')\r\n .option('--routesDir <dir>', 'Routes directory', { default: 'src/routes' })\r\n .option('--outputDir <dir>', 'Output directory', { default: 'src/.flight' })\r\n .option('--routes', 'Generate route types', { default: true })\r\n .option('--env', 'Generate environment variable types')\r\n .option('--watch', 'Watch for changes and regenerate')\r\n .action(typesGenerateCommand);\r\n\r\n// Parse and run\r\nexport function run(): void {\r\n try {\r\n cli.parse(process.argv, { run: false });\r\n\r\n // Show logo for help\r\n if (cli.options.help || process.argv.length <= 2) {\r\n printLogo();\r\n }\r\n\r\n cli.runMatchedCommand();\r\n } catch (error) {\r\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { VERSION };\r\n","export const VERSION = '0.0.1';\r\n","/**\r\n * Flight CLI - Create Command\r\n * \r\n * Scaffold a new Flight project using external templates.\r\n * Follows 2026 best practices: external templates, minimal CLI logic.\r\n */\r\n\r\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, copyFileSync, statSync, unlinkSync } from 'node:fs';\r\nimport { join, resolve, dirname } from 'node:path';\r\nimport { execSync } from 'node:child_process';\r\nimport { fileURLToPath } from 'node:url';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport { printLogo } from '../index.js';\r\n\r\nconst __dirname = dirname(fileURLToPath(import.meta.url));\r\nconst TEMPLATES_DIR = resolve(__dirname, '../../templates');\r\n\r\ninterface CreateOptions {\r\n template: string;\r\n ui?: string;\r\n bundler?: string;\r\n ts: boolean;\r\n git: boolean;\r\n install: boolean;\r\n}\r\n\r\nconst UI_FRAMEWORKS = [\r\n { title: 'React', value: 'react', description: 'The library for web and native user interfaces' },\r\n { title: 'Vue', value: 'vue', description: 'The progressive JavaScript framework' },\r\n { title: 'Svelte', value: 'svelte', description: 'Cybernetically enhanced web apps' },\r\n { title: 'Solid', value: 'solid', description: 'Simple and performant reactivity' },\r\n { title: 'Preact', value: 'preact', description: 'Fast 3kB alternative to React' },\r\n { title: 'Qwik', value: 'qwik', description: 'Resumable framework with O(1) loading' },\r\n { title: 'Lit', value: 'lit', description: 'Fast, lightweight Web Components' },\r\n { title: 'Htmx', value: 'htmx', description: 'HTML over the wire, no JavaScript' },\r\n { title: 'Vanilla', value: 'vanilla', description: 'No framework, just TypeScript' },\r\n];\r\n\r\nconst BUNDLERS = [\r\n { title: 'Vite', value: 'vite', description: 'Next Gen Frontend Tooling (recommended)' },\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\nexport async function createCommand(\r\n name: string | undefined,\r\n options: CreateOptions\r\n): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Creating a new Flight project...\\n'));\r\n\r\n // Interactive prompts\r\n let projectName = name;\r\n let uiFramework = options.ui;\r\n\r\n if (!projectName) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: 'Project name:',\r\n initial: 'my-flight-app',\r\n validate: (value: string) => {\r\n if (!value) return 'Project name is required';\r\n if (!/^[a-z0-9-_]+$/i.test(value)) return 'Invalid project name';\r\n return true;\r\n },\r\n });\r\n projectName = response.name;\r\n }\r\n\r\n if (!projectName) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n if (!uiFramework) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'ui',\r\n message: 'Choose your UI framework:',\r\n choices: UI_FRAMEWORKS,\r\n initial: 0,\r\n });\r\n uiFramework = response.ui;\r\n }\r\n\r\n if (!uiFramework) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n // 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 console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n const projectPath = resolve(process.cwd(), projectName);\r\n\r\n // Check if directory exists and is not empty\r\n if (existsSync(projectPath)) {\r\n const files = readdirSync(projectPath);\r\n if (files.length > 0) {\r\n const response = await prompts({\r\n type: 'confirm',\r\n name: 'overwrite',\r\n message: `Directory ${projectName} is not empty. Continue anyway?`,\r\n initial: false,\r\n });\r\n if (!response.overwrite) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n }\r\n }\r\n\r\n console.log(pc.dim(`\\nCreating project in ${projectPath}...\\n`));\r\n\r\n try {\r\n // Copy templates\r\n copyTemplate(projectPath, uiFramework, bundler, projectName);\r\n console.log(pc.green('✓') + ' Project structure created');\r\n\r\n // Initialize git\r\n if (options.git) {\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n console.log(pc.green('✓') + ' Git repository initialized');\r\n } catch {\r\n console.log(pc.yellow('[!]') + ' Could not initialize git repository');\r\n }\r\n }\r\n\r\n // Install dependencies\r\n if (options.install) {\r\n console.log(pc.dim('\\nInstalling dependencies...\\n'));\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n console.log(pc.green('\\n✓') + ' Dependencies installed');\r\n } catch {\r\n console.log(pc.yellow('\\n[!]') + ' Could not install dependencies. Run `npm install` manually.');\r\n }\r\n }\r\n\r\n // Success message\r\n console.log(`\r\n${pc.green('[OK] Project created successfully!')}\r\n\r\n${pc.cyan('Next steps:')}\r\n\r\n ${pc.dim('$')} cd ${projectName}\r\n ${pc.dim('$')} ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\n${pc.dim('Your project is 100% yours:')}\r\n ${pc.dim('•')} No telemetry\r\n ${pc.dim('•')} No lock-in\r\n ${pc.dim('•')} Deploy anywhere\r\n\r\n${pc.cyan('Happy flying!')}\r\n`);\r\n } catch (error) {\r\n console.error(pc.red('Failed to create project:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction detectPackageManager(): string {\r\n if (process.env.npm_config_user_agent?.includes('pnpm')) return 'pnpm';\r\n if (process.env.npm_config_user_agent?.includes('yarn')) return 'yarn';\r\n if (process.env.npm_config_user_agent?.includes('bun')) return 'bun';\r\n return 'npm';\r\n}\r\n\r\n/**\r\n * Copy template files to project directory\r\n */\r\nfunction copyTemplate(projectPath: string, ui: string, 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 * Recursively copy directory, processing .template files\r\n */\r\nfunction copyDirWithTemplates(\r\n srcDir: string,\r\n destDir: string,\r\n vars: Record<string, string>\r\n): void {\r\n if (!existsSync(srcDir)) return;\r\n\r\n const entries = readdirSync(srcDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const srcPath = join(srcDir, entry.name);\r\n let destName = entry.name;\r\n let isTemplate = false;\r\n\r\n // Handle .template extension\r\n if (destName.endsWith('.template')) {\r\n destName = destName.replace('.template', '');\r\n isTemplate = true;\r\n }\r\n\r\n const destPath = join(destDir, destName);\r\n\r\n if (entry.isDirectory()) {\r\n mkdirSync(destPath, { recursive: true });\r\n copyDirWithTemplates(srcPath, destPath, vars);\r\n } else {\r\n let content = readFileSync(srcPath, 'utf-8');\r\n\r\n // Apply template substitutions\r\n if (isTemplate || destName.endsWith('.json') || destName.endsWith('.html') || destName.endsWith('.md')) {\r\n for (const [key, value] of Object.entries(vars)) {\r\n content = content.replaceAll(key, value);\r\n }\r\n }\r\n\r\n writeFileSync(destPath, content);\r\n }\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Dev Command (SSR Enhanced)\r\n * \r\n * Start the development server with:\r\n * - Server-Side Rendering (renderToPipeableStream)\r\n * - Vite for HMR and asset transformation\r\n * - @flight-framework/http integration\r\n */\r\n\r\nimport { resolve, join } from 'node:path';\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface DevOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n https?: boolean;\r\n ssr?: boolean;\r\n}\r\n\r\nexport async function devCommand(options: DevOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight development server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n // Merge CLI options with config\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? config.dev.open;\r\n\r\n // Check if SSR mode is enabled\r\n const ssrEnabled = options.ssr ?? config.rendering?.default === 'ssr';\r\n const entryServerPath = join(root, 'src', 'entry-server.tsx');\r\n const hasSSREntry = existsSync(entryServerPath);\r\n\r\n // Dynamic import vite to avoid bundling issues\r\n const { createServer: createViteServer } = await import('vite');\r\n\r\n // Try to import Flight HTTP and file router\r\n let flightHttpAvailable = false;\r\n let flightRouterAvailable = false;\r\n\r\n try {\r\n await import('@flight-framework/http');\r\n flightHttpAvailable = true;\r\n } catch {\r\n // @flight-framework/http not installed\r\n }\r\n\r\n try {\r\n await import('@flight-framework/core/file-router');\r\n flightRouterAvailable = true;\r\n } catch {\r\n // file-router not available\r\n }\r\n\r\n // Create Vite dev server in middleware mode for SSR\r\n const vite = await createViteServer({\r\n root,\r\n mode: 'development',\r\n server: {\r\n middlewareMode: ssrEnabled && hasSSREntry,\r\n port: ssrEnabled && hasSSREntry ? undefined : port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open: ssrEnabled && hasSSREntry ? false : open,\r\n https: options.https ? {} : undefined,\r\n },\r\n appType: ssrEnabled && hasSSREntry ? 'custom' : 'spa',\r\n plugins: [\r\n // Add Flight plugin when @flight-framework/http is available\r\n flightHttpAvailable ? flightDevPlugin(root) : null,\r\n ].filter(Boolean),\r\n });\r\n\r\n // SSR Mode with custom server\r\n if (ssrEnabled && hasSSREntry) {\r\n await startSSRServer(vite, root, port, host);\r\n } else {\r\n // CSR Mode - standard Vite server\r\n await vite.listen();\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const isSSR = ssrEnabled && hasSSREntry;\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight dev server ready in ${pc.bold(elapsed + 'ms')}\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://${getNetworkAddress()}:${port}/`)}` : ''}\r\n \r\n ${isSSR ? pc.green('✓') : pc.yellow('○')} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}\r\n ${flightHttpAvailable ? pc.green('✓') : pc.yellow('○')} @flight-framework/http ${flightHttpAvailable ? 'enabled' : 'not installed'}\r\n ${flightRouterAvailable ? pc.green('✓') : pc.yellow('○')} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}\r\n\r\n ${pc.dim('press')} ${pc.bold('h')} ${pc.dim('to show help')}\r\n`);\r\n\r\n // Handle server shortcuts\r\n if (!isSSR) {\r\n vite.bindCLIShortcuts({ print: true });\r\n }\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start dev server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Start SSR server with Vite middleware and file-based page routing\r\n */\r\nasync function startSSRServer(\r\n vite: any,\r\n root: string,\r\n port: number,\r\n host: string | boolean\r\n): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n // Try to load file-based page router\r\n let pageRouter: any = null;\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n\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 console.log(pc.green(` ✓ Page router loaded: ${pageRouter.routes.filter((r: any) => r.type === 'page').length} pages`));\r\n } catch {\r\n // File router not available, use entry-server only\r\n }\r\n\r\n // Create a simple connect-like middleware handler\r\n const server = createHttpServer(async (req, res) => {\r\n const url = req.url || '/';\r\n const pathname = url.split('?')[0];\r\n\r\n // 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 console.error(pc.red('[SSR Error]'), e.stack);\r\n\r\n if (!res.headersSent) {\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end(`SSR Error: ${e.message}\\n\\n${e.stack}`);\r\n }\r\n }\r\n });\r\n\r\n const listenHost = host === true ? '0.0.0.0' : (host || 'localhost');\r\n\r\n server.listen(port, listenHost as string, () => {\r\n console.log(pc.green(` ✓ SSR server listening`));\r\n });\r\n}\r\n\r\n/**\r\n * Flight development plugin for Vite\r\n */\r\nfunction flightDevPlugin(root: string) {\r\n return {\r\n name: 'flight:dev',\r\n\r\n configureServer(server: any) {\r\n // Add middleware to handle Flight API routes\r\n server.middlewares.use(async (req: any, res: any, next: any) => {\r\n const url = req.url || '/';\r\n\r\n // Handle Flight action requests\r\n if (url.startsWith('/__flight_action/')) {\r\n try {\r\n const { handleActionRequest } = await import('@flight-framework/core');\r\n\r\n // Convert Node request to Web Request\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await handleActionRequest(webRequest);\r\n\r\n // Write response\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n } catch (error) {\r\n console.error('[Flight] Action error:', error);\r\n res.statusCode = 500;\r\n res.end(JSON.stringify({ error: 'Internal server error' }));\r\n }\r\n return;\r\n }\r\n\r\n // Handle API routes from file-router\r\n if (url.startsWith('/api/')) {\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n const routesDir = join(root, 'src', 'routes');\r\n\r\n const router = await createFileRouter({ directory: routesDir });\r\n const route = router.routes.find(r => {\r\n // Simple path matching (production would use radix matching)\r\n return matchPath(r.path, url);\r\n });\r\n\r\n if (route && route.handler) {\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await route.handler({ req: webRequest, params: {} });\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n return;\r\n }\r\n } catch (error) {\r\n // File router not set up, continue to next middleware\r\n }\r\n }\r\n\r\n next();\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Convert Node.js request to Web Standard Request\r\n */\r\nasync function nodeToWebRequest(req: any): Promise<Request> {\r\n const host = req.headers.host || 'localhost';\r\n const protocol = 'http';\r\n const url = new URL(req.url || '/', `${protocol}://${host}`);\r\n\r\n let body: BodyInit | null = null;\r\n\r\n if (req.method !== 'GET' && req.method !== 'HEAD') {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of req) {\r\n chunks.push(chunk);\r\n }\r\n body = Buffer.concat(chunks);\r\n }\r\n\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n if (Array.isArray(value)) {\r\n for (const v of value) {\r\n headers.append(key, v);\r\n }\r\n } else {\r\n headers.set(key, value as string);\r\n }\r\n }\r\n }\r\n\r\n return new Request(url.toString(), {\r\n method: req.method || 'GET',\r\n headers,\r\n body,\r\n });\r\n}\r\n\r\n/**\r\n * Simple path matching\r\n */\r\nfunction matchPath(pattern: string, path: string): boolean {\r\n // Remove query string\r\n const cleanPath = path.split('?')[0];\r\n\r\n // Convert pattern params to regex\r\n const regexPattern = pattern\r\n .replace(/:\\w+/g, '[^/]+')\r\n .replace(/\\*/g, '.*');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(cleanPath || '/');\r\n}\r\n\r\nfunction getNetworkAddress(): string {\r\n try {\r\n const { networkInterfaces } = require('os');\r\n const nets = networkInterfaces();\r\n\r\n for (const name of Object.keys(nets)) {\r\n for (const net of nets[name]) {\r\n if (net.family === 'IPv4' && !net.internal) {\r\n return net.address;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore\r\n }\r\n return '0.0.0.0';\r\n}\r\n\r\n","/**\r\n * Flight CLI - Build Command\r\n * \r\n * Build for production.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport { existsSync } from 'node:fs';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\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 console.log(pc.cyan('\\n[*] Building Flight project for production...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const outDir = options.outDir ?? config.build.outDir;\r\n const sourcemap = options.sourcemap ?? config.build.sourcemap;\r\n const minify = options.minify ?? config.build.minify;\r\n\r\n // Dynamic import vite\r\n const { build } = await import('vite');\r\n\r\n console.log(pc.dim(`Output directory: ${outDir}`));\r\n console.log(pc.dim(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`));\r\n console.log(pc.dim(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`));\r\n\r\n // Client build\r\n console.log(pc.cyan('Building client...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/client`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n rollupOptions: {\r\n input: resolve(root, 'index.html'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Client build complete');\r\n\r\n // SSR build (if applicable)\r\n if (config.rendering.default !== 'csr') {\r\n console.log(pc.cyan('\\nBuilding server...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/server`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n ssr: true,\r\n rollupOptions: {\r\n input: findEntryServer(root, config.build.srcDir),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Server build complete');\r\n }\r\n\r\n // Run adapter if configured\r\n if (config.adapter) {\r\n console.log(pc.cyan(`\\nRunning ${config.adapter.name} adapter...`));\r\n // TODO: Implement adapter execution\r\n console.log(pc.green('✓') + ` ${config.adapter.name} adapter complete`);\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\r\n\r\n console.log(`\r\n${pc.green('[OK] Build complete!')} ${pc.dim(`(${elapsedSeconds}s)`)}\r\n\r\n${pc.cyan('Output:')} ${resolve(root, outDir)}\r\n\r\n${pc.dim('To preview the build:')}\r\n ${pc.dim('$')} flight preview\r\n\r\n${pc.dim('To deploy:')}\r\n ${pc.dim('•')} Upload ${outDir}/ to your server\r\n ${pc.dim('•')} Or use your configured adapter\r\n`);\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nBuild failed:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Preview Command\r\n * \r\n * Preview production build locally.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface PreviewOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n}\r\n\r\nexport async function previewCommand(options: PreviewOptions): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight preview server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port + 1;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? false;\r\n\r\n // Dynamic import vite\r\n const { preview } = await import('vite');\r\n\r\n const server = await preview({\r\n root,\r\n preview: {\r\n port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open,\r\n },\r\n build: {\r\n outDir: config.build.outDir,\r\n },\r\n });\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight preview server ready\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://0.0.0.0:${port}/`)}` : ''}\r\n\r\n ${pc.dim('This is a preview of your production build.')}\r\n ${pc.dim('For development, use')} ${pc.bold('flight dev')}\r\n`);\r\n\r\n // Keep server running\r\n server.printUrls();\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start preview server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * 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 * 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 Binary Entry Point\r\n */\r\n\r\nimport { run } from './index.js';\r\n\r\nrun();\r\n"],"mappings":"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","names":["pc","resolve","join","readFileSync","existsSync","pc","pc","resolve","join","existsSync","readFileSync","resolve","existsSync","pc","loadConfig","resolve","existsSync","pc","loadConfig","resolve","pc","loadConfig","pc","resolve","loadConfig","resolve","readdirSync","statSync","existsSync","writeFileSync","mkdirSync","join","dirname","existsSync","readdirSync","join","statSync","dirname","mkdirSync","writeFileSync","resolve","resolve","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","filePathToUrlPath","resolve","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/version.ts","../src/commands/create.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/preview.ts","../src/commands/routes-generate.ts","../src/generators/routes.ts","../src/commands/types-generate.ts","../src/generators/typegen.ts","../src/bin.ts"],"sourcesContent":["import { cac } from 'cac';\nimport pc from 'picocolors';\nimport { VERSION } from './version.js';\nimport { createCommand } from './commands/create.js';\nimport { devCommand } from './commands/dev.js';\nimport { buildCommand } from './commands/build.js';\nimport { previewCommand } from './commands/preview.js';\nimport { routesGenerateCommand } from './commands/routes-generate.js';\nimport { typesGenerateCommand } from './commands/types-generate.js';\n\nconst cli = cac('flight');\n\n// Logo\nconst LOGO = `\n${pc.cyan(' ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗')}\n${pc.cyan(' ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝')}\n${pc.cyan(' █████╗ ██║ ██║██║ ███╗███████║ ██║ ')}\n${pc.cyan(' ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ ')}\n${pc.cyan(' ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ ')}\n${pc.cyan(' ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ')}\n \n ${pc.dim('The Agnostic Full-Stack Framework')}\n ${pc.dim('Maximum Flexibility. Zero Lock-in.')}\n`;\n\nexport function printLogo(): void {\n console.log(LOGO);\n}\n\n// Version\ncli.version(VERSION);\ncli.help();\n\n// Commands\ncli\n .command('create [name]', 'Create a new Flight project')\n .option('-t, --template <template>', 'Project template to use', { default: 'basic' })\n .option('--ui <framework>', 'UI framework (react, vue, svelte, solid, vanilla)')\n .option('--ts', 'Use TypeScript', { default: true })\n .option('--git', 'Initialize git repository', { default: true })\n .option('--install', 'Install dependencies', { default: true })\n .action(createCommand);\n\ncli\n .command('dev', 'Start development server')\n .option('-p, --port <port>', 'Port to listen on')\n .option('-h, --host <host>', 'Host to bind to')\n .option('--open', 'Open browser on start')\n .option('--https', 'Enable HTTPS')\n .option('--ssr', 'Enable Server-Side Rendering')\n .action(devCommand);\n\ncli\n .command('build', 'Build for production')\n .option('--outDir <dir>', 'Output directory')\n .option('--sourcemap', 'Generate source maps')\n .option('--minify', 'Minify output', { default: true })\n .action(buildCommand);\n\ncli\n .command('preview', 'Preview production build')\n .option('-p, --port <port>', 'Port to listen on')\n .option('-h, --host <host>', 'Host to bind to')\n .option('--open', 'Open browser on start')\n .action(previewCommand);\n\ncli\n .command('routes:generate', 'Generate route manifest from routes directory')\n .option('--routesDir <dir>', 'Routes directory', { default: 'src/routes' })\n .option('--outputDir <dir>', 'Output directory', { default: 'src/.flight' })\n .action(routesGenerateCommand);\n\ncli\n .command('types:generate', 'Generate TypeScript types for routes and environment')\n .option('--routesDir <dir>', 'Routes directory', { default: 'src/routes' })\n .option('--outputDir <dir>', 'Output directory', { default: 'src/.flight' })\n .option('--routes', 'Generate route types', { default: true })\n .option('--env', 'Generate environment variable types')\n .option('--watch', 'Watch for changes and regenerate')\n .action(typesGenerateCommand);\n\n// Parse and run\nexport function run(): void {\n try {\n cli.parse(process.argv, { run: false });\n\n // Show logo for help\n if (cli.options.help || process.argv.length <= 2) {\n printLogo();\n }\n\n cli.runMatchedCommand();\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n\nexport { VERSION };\n","export const VERSION = '0.0.1';\n","/**\n * Flight CLI - Create Command\n * \n * Scaffold a new Flight project using external templates.\n * Follows 2026 best practices: external templates, minimal CLI logic.\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, copyFileSync, statSync, unlinkSync } from 'node:fs';\nimport { join, resolve, dirname } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport pc from 'picocolors';\nimport prompts from 'prompts';\nimport { printLogo } from '../index.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst TEMPLATES_DIR = resolve(__dirname, '../../templates');\n\ninterface CreateOptions {\n template: string;\n ui?: string;\n bundler?: string;\n ts: boolean;\n git: boolean;\n install: boolean;\n}\n\nconst UI_FRAMEWORKS = [\n { title: 'React', value: 'react', description: 'The library for web and native user interfaces' },\n { title: 'Vue', value: 'vue', description: 'The progressive JavaScript framework' },\n { title: 'Svelte', value: 'svelte', description: 'Cybernetically enhanced web apps' },\n { title: 'Solid', value: 'solid', description: 'Simple and performant reactivity' },\n { title: 'Preact', value: 'preact', description: 'Fast 3kB alternative to React' },\n { title: 'Qwik', value: 'qwik', description: 'Resumable framework with O(1) loading' },\n { title: 'Lit', value: 'lit', description: 'Fast, lightweight Web Components' },\n { title: 'Htmx', value: 'htmx', description: 'HTML over the wire, no JavaScript' },\n { title: 'Vanilla', value: 'vanilla', description: 'No framework, just TypeScript' },\n];\n\nconst BUNDLERS = [\n { title: 'Vite', value: 'vite', description: 'Next Gen Frontend Tooling (recommended)' },\n { title: 'esbuild', value: 'esbuild', description: 'Ultra-fast builds for performance-focused projects' },\n { title: 'Rolldown', value: 'rolldown', description: 'Rust-based Rollup replacement (experimental)' },\n];\n\nexport async function createCommand(\n name: string | undefined,\n options: CreateOptions\n): Promise<void> {\n printLogo();\n console.log(pc.cyan('\\n[*] Creating a new Flight project...\\n'));\n\n // Interactive prompts\n let projectName = name;\n let uiFramework = options.ui;\n\n if (!projectName) {\n const response = await prompts({\n type: 'text',\n name: 'name',\n message: 'Project name:',\n initial: 'my-flight-app',\n validate: (value: string) => {\n if (!value) return 'Project name is required';\n if (!/^[a-z0-9-_]+$/i.test(value)) return 'Invalid project name';\n return true;\n },\n });\n projectName = response.name;\n }\n\n if (!projectName) {\n console.log(pc.red('Project creation cancelled.'));\n return;\n }\n\n if (!uiFramework) {\n const response = await prompts({\n type: 'select',\n name: 'ui',\n message: 'Choose your UI framework:',\n choices: UI_FRAMEWORKS,\n initial: 0,\n });\n uiFramework = response.ui;\n }\n\n if (!uiFramework) {\n console.log(pc.red('Project creation cancelled.'));\n return;\n }\n\n // Bundler selection\n let bundler = options.bundler;\n if (!bundler) {\n const response = await prompts({\n type: 'select',\n name: 'bundler',\n message: 'Choose your bundler:',\n choices: BUNDLERS,\n initial: 0,\n });\n bundler = response.bundler;\n }\n\n if (!bundler) {\n console.log(pc.red('Project creation cancelled.'));\n return;\n }\n\n const projectPath = resolve(process.cwd(), projectName);\n\n // Check if directory exists and is not empty\n if (existsSync(projectPath)) {\n const files = readdirSync(projectPath);\n if (files.length > 0) {\n const response = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `Directory ${projectName} is not empty. Continue anyway?`,\n initial: false,\n });\n if (!response.overwrite) {\n console.log(pc.red('Project creation cancelled.'));\n return;\n }\n }\n }\n\n console.log(pc.dim(`\\nCreating project in ${projectPath}...\\n`));\n\n try {\n // Copy templates\n copyTemplate(projectPath, uiFramework, bundler, projectName);\n console.log(pc.green('✓') + ' Project structure created');\n\n // Initialize git\n if (options.git) {\n try {\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\n console.log(pc.green('✓') + ' Git repository initialized');\n } catch {\n console.log(pc.yellow('[!]') + ' Could not initialize git repository');\n }\n }\n\n // Install dependencies\n if (options.install) {\n console.log(pc.dim('\\nInstalling dependencies...\\n'));\n try {\n const pm = detectPackageManager();\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\n console.log(pc.green('\\n✓') + ' Dependencies installed');\n } catch {\n console.log(pc.yellow('\\n[!]') + ' Could not install dependencies. Run `npm install` manually.');\n }\n }\n\n // Success message\n console.log(`\n${pc.green('[OK] Project created successfully!')}\n\n${pc.cyan('Next steps:')}\n\n ${pc.dim('$')} cd ${projectName}\n ${pc.dim('$')} ${options.install ? '' : 'npm install && '}npm run dev\n\n${pc.dim('Your project is 100% yours:')}\n ${pc.dim('•')} No telemetry\n ${pc.dim('•')} No lock-in\n ${pc.dim('•')} Deploy anywhere\n\n${pc.cyan('Happy flying!')}\n`);\n } catch (error) {\n console.error(pc.red('Failed to create project:'), error);\n process.exit(1);\n }\n}\n\nfunction detectPackageManager(): string {\n if (process.env.npm_config_user_agent?.includes('pnpm')) return 'pnpm';\n if (process.env.npm_config_user_agent?.includes('yarn')) return 'yarn';\n if (process.env.npm_config_user_agent?.includes('bun')) return 'bun';\n return 'npm';\n}\n\n/**\n * Copy template files to project directory\n */\nfunction copyTemplate(projectPath: string, ui: string, bundler: string, projectName: string): void {\n const baseDir = join(TEMPLATES_DIR, 'base');\n const uiDir = join(TEMPLATES_DIR, ui);\n\n // Ensure directories exist\n mkdirSync(projectPath, { recursive: true });\n mkdirSync(join(projectPath, 'src'), { recursive: true });\n mkdirSync(join(projectPath, 'src/styles'), { recursive: true });\n mkdirSync(join(projectPath, 'public'), { recursive: true });\n\n // Variables for template substitution\n const vars = {\n '{{PROJECT_NAME}}': projectName,\n '{{UI_FRAMEWORK}}': ui,\n '{{BUNDLER}}': bundler,\n '{{BUNDLER_PACKAGE}}': `@flight-framework/bundler-${bundler}`,\n '{{LANGUAGE}}': 'TypeScript',\n };\n\n // Copy base files\n copyDirWithTemplates(baseDir, projectPath, vars);\n\n // Copy UI-specific files (override base if needed)\n copyDirWithTemplates(uiDir, projectPath, vars);\n\n // Rename special files\n const gitignoreSrc = join(projectPath, '_gitignore');\n const gitignoreDest = join(projectPath, '.gitignore');\n if (existsSync(gitignoreSrc)) {\n copyFileSync(gitignoreSrc, gitignoreDest);\n unlinkSync(gitignoreSrc);\n }\n}\n\n/**\n * Recursively copy directory, processing .template files\n */\nfunction copyDirWithTemplates(\n srcDir: string,\n destDir: string,\n vars: Record<string, string>\n): void {\n if (!existsSync(srcDir)) return;\n\n const entries = readdirSync(srcDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name);\n let destName = entry.name;\n let isTemplate = false;\n\n // Handle .template extension\n if (destName.endsWith('.template')) {\n destName = destName.replace('.template', '');\n isTemplate = true;\n }\n\n const destPath = join(destDir, destName);\n\n if (entry.isDirectory()) {\n mkdirSync(destPath, { recursive: true });\n copyDirWithTemplates(srcPath, destPath, vars);\n } else {\n let content = readFileSync(srcPath, 'utf-8');\n\n // Apply template substitutions\n if (isTemplate || destName.endsWith('.json') || destName.endsWith('.html') || destName.endsWith('.md')) {\n for (const [key, value] of Object.entries(vars)) {\n content = content.replaceAll(key, value);\n }\n }\n\n writeFileSync(destPath, content);\n }\n }\n}\n","/**\n * Flight CLI - Dev Command (SSR Enhanced)\n * \n * Start the development server with:\n * - Server-Side Rendering (renderToPipeableStream)\n * - Vite for HMR and asset transformation\n * - @flight-framework/http integration\n */\n\nimport { resolve, join } from 'node:path';\nimport { readFileSync, existsSync } from 'node:fs';\nimport pc from 'picocolors';\nimport { loadConfig } from '@flight-framework/core/config';\nimport { printLogo } from '../index.js';\n\ninterface DevOptions {\n port?: string;\n host?: string;\n open?: boolean;\n https?: boolean;\n ssr?: boolean;\n}\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n const startTime = Date.now();\n\n printLogo();\n console.log(pc.cyan('\\n✈️ Starting Flight development server...\\n'));\n\n try {\n // Load config\n const root = resolve(process.cwd());\n const config = await loadConfig(root);\n\n // Merge CLI options with config\n const port = options.port ? parseInt(options.port, 10) : config.dev.port;\n const host = options.host ?? config.dev.host;\n const open = options.open ?? config.dev.open;\n\n // Check if SSR mode is enabled\n const ssrEnabled = options.ssr ?? config.rendering?.default === 'ssr';\n const entryServerPath = join(root, 'src', 'entry-server.tsx');\n const hasSSREntry = existsSync(entryServerPath);\n\n // Dynamic import vite to avoid bundling issues\n const { createServer: createViteServer } = await import('vite');\n\n // Try to import Flight HTTP and file router\n let flightHttpAvailable = false;\n let flightRouterAvailable = false;\n\n try {\n await import('@flight-framework/http');\n flightHttpAvailable = true;\n } catch {\n // @flight-framework/http not installed\n }\n\n try {\n await import('@flight-framework/core/file-router');\n flightRouterAvailable = true;\n } catch {\n // file-router not available\n }\n\n // Create Vite dev server in middleware mode for SSR\n const vite = await createViteServer({\n root,\n mode: 'development',\n server: {\n middlewareMode: ssrEnabled && hasSSREntry,\n port: ssrEnabled && hasSSREntry ? undefined : port,\n host: host === true ? '0.0.0.0' : host,\n open: ssrEnabled && hasSSREntry ? false : open,\n https: options.https ? {} : undefined,\n },\n appType: ssrEnabled && hasSSREntry ? 'custom' : 'spa',\n plugins: [\n // Add Flight plugin when @flight-framework/http is available\n flightHttpAvailable ? flightDevPlugin(root) : null,\n ].filter(Boolean),\n });\n\n // SSR Mode with custom server\n if (ssrEnabled && hasSSREntry) {\n await startSSRServer(vite, root, port, host);\n } else {\n // CSR Mode - standard Vite server\n await vite.listen();\n }\n\n const elapsed = Date.now() - startTime;\n const isSSR = ssrEnabled && hasSSREntry;\n\n console.log(`\n ${pc.green('✓')} Flight dev server ready in ${pc.bold(elapsed + 'ms')}\n\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://${getNetworkAddress()}:${port}/`)}` : ''}\n \n ${isSSR ? pc.green('✓') : pc.yellow('○')} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}\n ${flightHttpAvailable ? pc.green('✓') : pc.yellow('○')} @flight-framework/http ${flightHttpAvailable ? 'enabled' : 'not installed'}\n ${flightRouterAvailable ? pc.green('✓') : pc.yellow('○')} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}\n\n ${pc.dim('press')} ${pc.bold('h')} ${pc.dim('to show help')}\n`);\n\n // Handle server shortcuts\n if (!isSSR) {\n vite.bindCLIShortcuts({ print: true });\n }\n\n } catch (error) {\n console.error(pc.red('\\nFailed to start dev server:'), error);\n process.exit(1);\n }\n}\n\n/**\n * Start SSR server with Vite middleware and file-based page routing\n */\nasync function startSSRServer(\n vite: any,\n root: string,\n port: number,\n host: string | boolean\n): Promise<void> {\n const { createServer: createHttpServer } = await import('node:http');\n\n // Try to load file-based page router\n let pageRouter: any = null;\n try {\n const { createFileRouter } = await import('@flight-framework/core/file-router');\n\n // Create module loader that uses Vite's ssrLoadModule for TSX support\n const moduleLoader = async (filePath: string) => {\n // Normalize both paths to use forward slashes for Vite\n const normalizedFilePath = filePath.replace(/\\\\/g, '/');\n const normalizedRoot = root.replace(/\\\\/g, '/');\n // Create relative path that Vite expects (starts with /)\n const relativePath = normalizedFilePath.replace(normalizedRoot, '');\n return vite.ssrLoadModule(relativePath);\n };\n\n pageRouter = await createFileRouter({\n directory: join(root, 'src', 'routes'),\n extensions: ['.tsx', '.ts', '.jsx', '.js'],\n moduleLoader, // Use Vite's ssrLoadModule\n });\n console.log(pc.green(` ✓ Page router loaded: ${pageRouter.routes.filter((r: any) => r.type === 'page').length} pages`));\n } catch {\n // File router not available, use entry-server only\n }\n\n // Create a simple connect-like middleware handler\n const server = createHttpServer(async (req, res) => {\n const url = req.url || '/';\n const pathname = url.split('?')[0];\n\n // Check if this is a static asset request\n const isStaticAsset =\n url.startsWith('/@') ||\n url.startsWith('/node_modules') ||\n (url.startsWith('/src') && !url.includes('entry-server')) ||\n // Static file extensions\n pathname.endsWith('.css') ||\n pathname.endsWith('.js') ||\n pathname.endsWith('.ts') ||\n pathname.endsWith('.tsx') ||\n pathname.endsWith('.svg') ||\n pathname.endsWith('.png') ||\n pathname.endsWith('.jpg') ||\n pathname.endsWith('.jpeg') ||\n pathname.endsWith('.gif') ||\n pathname.endsWith('.ico') ||\n pathname.endsWith('.woff') ||\n pathname.endsWith('.woff2') ||\n pathname.endsWith('.ttf') ||\n pathname.endsWith('.eot') ||\n pathname.endsWith('.json') ||\n pathname.endsWith('.webp') ||\n pathname.endsWith('.mp4') ||\n pathname.endsWith('.webm');\n\n // Let Vite handle static assets\n if (isStaticAsset) {\n vite.middlewares(req, res);\n return;\n }\n\n // Skip SSR for API routes - let Flight HTTP middleware handle them\n if (pathname.startsWith('/api/')) {\n // API routes are handled by Flight HTTP middleware\n // Pass through to Vite middlewares which will invoke our Flight middleware\n vite.middlewares(req, res);\n return;\n }\n\n try {\n // 1. Read index.html template\n let template = readFileSync(\n join(root, 'index.html'),\n 'utf-8'\n );\n\n // 2. Apply Vite HTML transforms (HMR client injection)\n template = await vite.transformIndexHtml(url, template);\n\n let appHtml = '';\n\n // 3. Try file-based page routing first\n if (pageRouter) {\n const pageRoute = pageRouter.routes.find((r: any) =>\n r.type === 'page' && matchPath(r.path, pathname)\n );\n\n if (pageRoute && pageRoute.component) {\n // Load component via Vite for HMR\n // Normalize paths for Vite (forward slashes, remove root)\n const normalizedFilePath = pageRoute.filePath.replace(/\\\\/g, '/');\n const normalizedRoot = root.replace(/\\\\/g, '/');\n const relativePath = normalizedFilePath.replace(normalizedRoot, '');\n const mod = await vite.ssrLoadModule(relativePath);\n const Component = mod.default;\n\n // Get render function for the UI framework\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\n\n if (typeof render === 'function' && Component) {\n appHtml = await render(url, { Component });\n }\n }\n }\n\n // 4. Fallback to entry-server.tsx if no page matched\n if (!appHtml) {\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\n if (typeof render === 'function') {\n appHtml = await render(url);\n }\n }\n\n // 5. Inject rendered app into template\n if (appHtml) {\n const html = template.replace('<!--ssr-outlet-->', appHtml);\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(html);\n } else {\n // Fallback to CSR if no render\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(template);\n }\n\n } catch (e: any) {\n // Fix Vite stack trace\n vite.ssrFixStacktrace(e);\n console.error(pc.red('[SSR Error]'), e.stack);\n\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'text/plain' });\n res.end(`SSR Error: ${e.message}\\n\\n${e.stack}`);\n }\n }\n });\n\n const listenHost = host === true ? '0.0.0.0' : (host || 'localhost');\n\n server.listen(port, listenHost as string, () => {\n console.log(pc.green(` ✓ SSR server listening`));\n });\n}\n\n/**\n * Flight development plugin for Vite\n */\nfunction flightDevPlugin(root: string) {\n return {\n name: 'flight:dev',\n\n configureServer(server: any) {\n // Add middleware to handle Flight API routes\n server.middlewares.use(async (req: any, res: any, next: any) => {\n const url = req.url || '/';\n\n // Handle Flight action requests\n if (url.startsWith('/__flight_action/')) {\n try {\n const { handleActionRequest } = await import('@flight-framework/core');\n\n // Convert Node request to Web Request\n const webRequest = await nodeToWebRequest(req);\n const response = await handleActionRequest(webRequest);\n\n // Write response\n res.statusCode = response.status;\n response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n\n const body = await response.text();\n res.end(body);\n } catch (error) {\n console.error('[Flight] Action error:', error);\n res.statusCode = 500;\n res.end(JSON.stringify({ error: 'Internal server error' }));\n }\n return;\n }\n\n // Handle API routes from file-router\n if (url.startsWith('/api/')) {\n try {\n const { createFileRouter } = await import('@flight-framework/core/file-router');\n const routesDir = join(root, 'src', 'routes');\n\n const router = await createFileRouter({ directory: routesDir });\n const route = router.routes.find(r => {\n // Simple path matching (production would use radix matching)\n return matchPath(r.path, url);\n });\n\n if (route && route.handler) {\n const webRequest = await nodeToWebRequest(req);\n const response = await route.handler({ req: webRequest, params: {} });\n\n res.statusCode = response.status;\n response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n\n const body = await response.text();\n res.end(body);\n return;\n }\n } catch (error) {\n // File router not set up, continue to next middleware\n }\n }\n\n next();\n });\n },\n };\n}\n\n/**\n * Convert Node.js request to Web Standard Request\n */\nasync function nodeToWebRequest(req: any): Promise<Request> {\n const host = req.headers.host || 'localhost';\n const protocol = 'http';\n const url = new URL(req.url || '/', `${protocol}://${host}`);\n\n let body: BodyInit | null = null;\n\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk);\n }\n body = Buffer.concat(chunks);\n }\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n for (const v of value) {\n headers.append(key, v);\n }\n } else {\n headers.set(key, value as string);\n }\n }\n }\n\n return new Request(url.toString(), {\n method: req.method || 'GET',\n headers,\n body,\n });\n}\n\n/**\n * Simple path matching\n */\nfunction matchPath(pattern: string, path: string): boolean {\n // Remove query string\n const cleanPath = path.split('?')[0];\n\n // Convert pattern params to regex\n const regexPattern = pattern\n .replace(/:\\w+/g, '[^/]+')\n .replace(/\\*/g, '.*');\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(cleanPath || '/');\n}\n\nfunction getNetworkAddress(): string {\n try {\n const { networkInterfaces } = require('os');\n const nets = networkInterfaces();\n\n for (const name of Object.keys(nets)) {\n for (const net of nets[name]) {\n if (net.family === 'IPv4' && !net.internal) {\n return net.address;\n }\n }\n }\n } catch {\n // Ignore\n }\n return '0.0.0.0';\n}\n\n","/**\n * Flight CLI - Build Command\n * \n * Build for production.\n */\n\nimport { resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport pc from 'picocolors';\nimport { loadConfig } from '@flight-framework/core/config';\nimport { printLogo } from '../index.js';\n\n/**\n * Find entry-server file with either .tsx or .ts extension\n */\nfunction findEntryServer(root: string, srcDir: string): string {\n const tsxPath = resolve(root, srcDir, 'entry-server.tsx');\n const tsPath = resolve(root, srcDir, 'entry-server.ts');\n\n if (existsSync(tsxPath)) return tsxPath;\n if (existsSync(tsPath)) return tsPath;\n\n // Default to tsx (will error if not found, but with clear message)\n return tsxPath;\n}\n\ninterface BuildOptions {\n outDir?: string;\n sourcemap?: boolean;\n minify?: boolean;\n}\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n const startTime = Date.now();\n\n printLogo();\n console.log(pc.cyan('\\n[*] Building Flight project for production...\\n'));\n\n try {\n // Load config\n const root = resolve(process.cwd());\n const config = await loadConfig(root);\n\n const outDir = options.outDir ?? config.build.outDir;\n const sourcemap = options.sourcemap ?? config.build.sourcemap;\n const minify = options.minify ?? config.build.minify;\n\n // Dynamic import vite\n const { build } = await import('vite');\n\n console.log(pc.dim(`Output directory: ${outDir}`));\n console.log(pc.dim(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`));\n console.log(pc.dim(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`));\n\n // Client build\n console.log(pc.cyan('Building client...'));\n await build({\n root,\n mode: 'production',\n build: {\n outDir: `${outDir}/client`,\n sourcemap,\n minify: minify ? 'esbuild' : false,\n rollupOptions: {\n input: resolve(root, 'index.html'),\n },\n },\n });\n console.log(pc.green('✓') + ' Client build complete');\n\n // SSR build (if applicable)\n if (config.rendering.default !== 'csr') {\n console.log(pc.cyan('\\nBuilding server...'));\n await build({\n root,\n mode: 'production',\n build: {\n outDir: `${outDir}/server`,\n sourcemap,\n minify: minify ? 'esbuild' : false,\n ssr: true,\n rollupOptions: {\n input: findEntryServer(root, config.build.srcDir),\n },\n },\n });\n console.log(pc.green('✓') + ' Server build complete');\n }\n\n // Run adapter if configured\n if (config.adapter) {\n console.log(pc.cyan(`\\nRunning ${config.adapter.name} adapter...`));\n // TODO: Implement adapter execution\n console.log(pc.green('✓') + ` ${config.adapter.name} adapter complete`);\n }\n\n const elapsed = Date.now() - startTime;\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\n\n console.log(`\n${pc.green('[OK] Build complete!')} ${pc.dim(`(${elapsedSeconds}s)`)}\n\n${pc.cyan('Output:')} ${resolve(root, outDir)}\n\n${pc.dim('To preview the build:')}\n ${pc.dim('$')} flight preview\n\n${pc.dim('To deploy:')}\n ${pc.dim('•')} Upload ${outDir}/ to your server\n ${pc.dim('•')} Or use your configured adapter\n`);\n\n } catch (error) {\n console.error(pc.red('\\nBuild failed:'), error);\n process.exit(1);\n }\n}\n","/**\n * Flight CLI - Preview Command\n * \n * Preview production build locally.\n */\n\nimport { resolve } from 'node:path';\nimport pc from 'picocolors';\nimport { loadConfig } from '@flight-framework/core/config';\nimport { printLogo } from '../index.js';\n\ninterface PreviewOptions {\n port?: string;\n host?: string;\n open?: boolean;\n}\n\nexport async function previewCommand(options: PreviewOptions): Promise<void> {\n printLogo();\n console.log(pc.cyan('\\n✈️ Starting Flight preview server...\\n'));\n\n try {\n // Load config\n const root = resolve(process.cwd());\n const config = await loadConfig(root);\n\n const port = options.port ? parseInt(options.port, 10) : config.dev.port + 1;\n const host = options.host ?? config.dev.host;\n const open = options.open ?? false;\n\n // Dynamic import vite\n const { preview } = await import('vite');\n\n const server = await preview({\n root,\n preview: {\n port,\n host: host === true ? '0.0.0.0' : host,\n open,\n },\n build: {\n outDir: config.build.outDir,\n },\n });\n\n console.log(`\n ${pc.green('✓')} Flight preview server ready\n\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://0.0.0.0:${port}/`)}` : ''}\n\n ${pc.dim('This is a preview of your production build.')}\n ${pc.dim('For development, use')} ${pc.bold('flight dev')}\n`);\n\n // Keep server running\n server.printUrls();\n\n } catch (error) {\n console.error(pc.red('\\nFailed to start preview server:'), error);\n process.exit(1);\n }\n}\n","/**\n * Routes Generate Command\n * \n * Generates route manifest from the routes directory.\n * Usage: flight routes:generate [options]\n */\n\nimport { resolve } from 'path';\nimport { generateRoutes } from '../generators/routes.js';\n\ninterface RoutesGenerateOptions {\n routesDir?: string;\n outputDir?: string;\n watch?: boolean;\n}\n\nexport async function routesGenerateCommand(options: RoutesGenerateOptions = {}): Promise<void> {\n const cwd = process.cwd();\n\n const routesDir = options.routesDir\n ? resolve(cwd, options.routesDir)\n : resolve(cwd, 'src/routes');\n\n const outputDir = options.outputDir\n ? resolve(cwd, options.outputDir)\n : resolve(cwd, 'src/.flight');\n\n try {\n const manifest = await generateRoutes({\n routesDir,\n outputDir,\n watch: options.watch,\n });\n\n console.log('\\nRoute manifest generated successfully!');\n console.log(` Pages: ${manifest.routes.length}`);\n console.log(` API Routes: ${manifest.apiRoutes.length}`);\n console.log(` Layouts: ${manifest.layouts.length}`);\n } catch (error) {\n console.error('Failed to generate routes:', error);\n process.exit(1);\n }\n}\n","/**\n * Route Generator\n * \n * Scans the routes directory and generates a route manifest.\n * This enables automatic route registration without manual imports.\n */\n\nimport { readdirSync, statSync, existsSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, relative, basename, dirname } from 'path';\n\ninterface ScannedRoute {\n path: string; // URL path pattern (e.g., '/docs/:slug')\n filePath: string; // Relative file path\n isLayout: boolean; // Is this a _layout file\n isLoading: boolean; // Is this a _loading file\n isError: boolean; // Is this a _error file\n isNotFound: boolean; // Is this a _not-found file\n isDynamic: boolean; // Has dynamic segments\n isApiRoute: boolean; // Is an API route\n httpMethod?: string; // HTTP method for API routes\n}\n\ninterface RouteManifest {\n routes: ScannedRoute[];\n layouts: ScannedRoute[];\n loadingStates: ScannedRoute[];\n errorBoundaries: ScannedRoute[];\n notFoundPages: ScannedRoute[];\n apiRoutes: ScannedRoute[];\n generated: string; // Timestamp\n}\n\n/**\n * Convert file path to URL path pattern\n * \n * Handles:\n * - File extensions (.page.tsx, .get.ts, etc.)\n * - Index files → root of directory\n * - Dynamic segments [param] → :param\n * - Catch-all [...param] → *param\n * - Route groups (group) → removed from URL\n */\nfunction filePathToUrlPath(filePath: string): string {\n let urlPath = filePath\n // Remove file extension\n .replace(/\\.(page|route)\\.(tsx?|jsx?)$/, '')\n // Remove HTTP method suffix for API routes\n .replace(/\\.(get|post|put|patch|delete|options|head)$/, '')\n // Remove index from path\n .replace(/\\/index$/, '')\n // Remove route groups (segments wrapped in parentheses)\n // e.g., (marketing)/about → about, (app)/dashboard → dashboard\n .replace(/\\/?\\([^)]+\\)/g, '')\n // Convert [param] to :param\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*$1') // Catch-all [...slug] -> *slug\n .replace(/\\[(\\w+)\\]/g, ':$1'); // Dynamic [slug] -> :slug\n\n // Ensure leading slash\n if (!urlPath.startsWith('/')) {\n urlPath = '/' + urlPath;\n }\n\n // Root path\n if (urlPath === '' || urlPath === '/') {\n urlPath = '/';\n }\n\n // Clean up double slashes that might result from group removal\n urlPath = urlPath.replace(/\\/+/g, '/');\n\n return urlPath;\n}\n\n/**\n * Check if directory is a route group\n * Route groups are directories wrapped in parentheses: (groupName)\n */\nfunction isRouteGroup(dirname: string): boolean {\n return /^\\([^)]+\\)$/.test(dirname);\n}\n\n/**\n * Extract HTTP method from API route filename\n */\nfunction extractHttpMethod(filename: string): string | undefined {\n const match = filename.match(/\\.(get|post|put|patch|delete|options|head)\\.(tsx?|jsx?)$/i);\n return match ? match[1].toUpperCase() : undefined;\n}\n\n/**\n * Check if file is a layout file\n */\nfunction isLayoutFile(filename: string): boolean {\n return filename.startsWith('_layout.');\n}\n\n/**\n * Check if file is a loading file\n */\nfunction isLoadingFile(filename: string): boolean {\n return filename.startsWith('_loading.');\n}\n\n/**\n * Check if file is an error file\n */\nfunction isErrorFile(filename: string): boolean {\n return filename.startsWith('_error.');\n}\n\n/**\n * Check if file is a not-found file\n */\nfunction isNotFoundFile(filename: string): boolean {\n return filename.startsWith('_not-found.');\n}\n\n/**\n * Check if file is a page/route file\n */\nfunction isRouteFile(filename: string): boolean {\n return /\\.(page|route)\\.(tsx?|jsx?)$/.test(filename);\n}\n\n/**\n * Check if file is an API route file\n */\nfunction isApiRouteFile(filename: string): boolean {\n return /\\.(get|post|put|patch|delete|options|head)\\.(tsx?|jsx?)$/.test(filename);\n}\n\n/**\n * Check if path has dynamic segments\n */\nfunction hasDynamicSegments(path: string): boolean {\n return path.includes('[') && path.includes(']');\n}\n\n/**\n * Recursively scan directory for routes\n */\nfunction scanDirectory(\n dir: string,\n basePath: string = '',\n results: ScannedRoute[] = []\n): ScannedRoute[] {\n if (!existsSync(dir)) {\n return results;\n }\n\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const relativePath = join(basePath, entry);\n const stat = statSync(fullPath);\n\n if (stat.isDirectory()) {\n // Skip special directories\n if (entry.startsWith('.') || entry === 'node_modules') {\n continue;\n }\n // Recurse into subdirectory\n scanDirectory(fullPath, relativePath, results);\n } else if (stat.isFile()) {\n const routePath = filePathToUrlPath(dirname(relativePath));\n const normalizedFilePath = relativePath.replace(/\\\\/g, '/');\n const isDynamic = hasDynamicSegments(relativePath);\n\n // Layout files\n if (isLayoutFile(entry)) {\n results.push({\n path: routePath,\n filePath: normalizedFilePath,\n isLayout: true,\n isLoading: false,\n isError: false,\n isNotFound: false,\n isDynamic,\n isApiRoute: false,\n });\n }\n // Loading files\n else if (isLoadingFile(entry)) {\n results.push({\n path: routePath,\n filePath: normalizedFilePath,\n isLayout: false,\n isLoading: true,\n isError: false,\n isNotFound: false,\n isDynamic,\n isApiRoute: false,\n });\n }\n // Error files\n else if (isErrorFile(entry)) {\n results.push({\n path: routePath,\n filePath: normalizedFilePath,\n isLayout: false,\n isLoading: false,\n isError: true,\n isNotFound: false,\n isDynamic,\n isApiRoute: false,\n });\n }\n // Not-found files\n else if (isNotFoundFile(entry)) {\n results.push({\n path: routePath,\n filePath: normalizedFilePath,\n isLayout: false,\n isLoading: false,\n isError: false,\n isNotFound: true,\n isDynamic,\n isApiRoute: false,\n });\n }\n // API route files\n else if (isApiRouteFile(entry)) {\n const method = extractHttpMethod(entry);\n results.push({\n path: filePathToUrlPath(relativePath),\n filePath: normalizedFilePath,\n isLayout: false,\n isLoading: false,\n isError: false,\n isNotFound: false,\n isDynamic,\n isApiRoute: true,\n httpMethod: method,\n });\n }\n // Page/route files\n else if (isRouteFile(entry)) {\n results.push({\n path: filePathToUrlPath(relativePath),\n filePath: normalizedFilePath,\n isLayout: false,\n isLoading: false,\n isError: false,\n isNotFound: false,\n isDynamic,\n isApiRoute: false,\n });\n }\n }\n }\n\n return results;\n}\n\n/**\n * Sort routes for matching priority\n * Static routes before dynamic, shorter before longer\n */\nfunction sortRoutes(routes: ScannedRoute[]): ScannedRoute[] {\n return routes.sort((a, b) => {\n // Static routes first\n if (!a.isDynamic && b.isDynamic) return -1;\n if (a.isDynamic && !b.isDynamic) return 1;\n\n // Shorter paths first\n const aSegments = a.path.split('/').length;\n const bSegments = b.path.split('/').length;\n if (aSegments !== bSegments) return aSegments - bSegments;\n\n // Alphabetical as tiebreaker\n return a.path.localeCompare(b.path);\n });\n}\n\n/**\n * Generate route manifest from scanned routes\n */\nexport function generateRouteManifest(routesDir: string): RouteManifest {\n const allRoutes = scanDirectory(routesDir);\n\n // Filter by type - pages are routes that are not special files or API routes\n const isPageRoute = (r: ScannedRoute) =>\n !r.isLayout && !r.isLoading && !r.isError && !r.isNotFound && !r.isApiRoute;\n\n const routes = sortRoutes(allRoutes.filter(isPageRoute));\n const layouts = allRoutes.filter(r => r.isLayout);\n const loadingStates = allRoutes.filter(r => r.isLoading);\n const errorBoundaries = allRoutes.filter(r => r.isError);\n const notFoundPages = allRoutes.filter(r => r.isNotFound);\n const apiRoutes = sortRoutes(allRoutes.filter(r => r.isApiRoute));\n\n return {\n routes,\n layouts,\n loadingStates,\n errorBoundaries,\n notFoundPages,\n apiRoutes,\n generated: new Date().toISOString(),\n };\n}\n\n/**\n * Generate TypeScript route manifest file\n */\nexport function generateRoutesFile(manifest: RouteManifest, outputDir: string): void {\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate routes.ts content\n const routesContent = `/**\n * Auto-generated by Flight CLI\n * Do not edit manually\n * Generated: ${manifest.generated}\n */\n\nimport type { RouteDefinition } from '@flight-framework/router';\n\n// Page Routes\nexport const routes: RouteDefinition[] = [\n${manifest.routes.map(r => ` {\n path: '${r.path}',\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\n },`).join('\\n')}\n];\n\n// Layout Components\nexport const layouts = [\n${manifest.layouts.map(r => ` {\n path: '${r.path}',\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\n },`).join('\\n')}\n];\n\n// Loading State Components\nexport const loadingStates = [\n${manifest.loadingStates.map(r => ` {\n path: '${r.path}',\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\n },`).join('\\n')}\n];\n\n// Error Boundary Components\nexport const errorBoundaries = [\n${manifest.errorBoundaries.map(r => ` {\n path: '${r.path}',\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\n },`).join('\\n')}\n];\n\n// Not Found Page Components\nexport const notFoundPages = [\n${manifest.notFoundPages.map(r => ` {\n path: '${r.path}',\n component: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\n },`).join('\\n')}\n];\n\n// API Routes\nexport const apiRoutes = [\n${manifest.apiRoutes.map(r => ` {\n path: '${r.path}',\n method: '${r.httpMethod}',\n handler: () => import('../routes/${r.filePath.replace(/\\.(tsx?|jsx?)$/, '')}'),\n },`).join('\\n')}\n];\n\n// Type-safe route paths\nexport type AppRoutes = ${manifest.routes.length > 0\n ? manifest.routes.map(r => `'${r.path}'`).join(' | ')\n : 'never'};\n\n// Type-safe API route paths\nexport type ApiRoutes = ${manifest.apiRoutes.length > 0\n ? manifest.apiRoutes.map(r => `'${r.path}'`).join(' | ')\n : 'never'};\n`;\n\n writeFileSync(join(outputDir, 'routes.ts'), routesContent, 'utf-8');\n\n // Generate types.ts for enhanced type safety\n const typesContent = `/**\n * Auto-generated route types\n * Generated: ${manifest.generated}\n */\n\nimport type { RouteParams } from '@flight-framework/router';\n\n// Extract params from route patterns\n${manifest.routes\n .filter(r => r.isDynamic)\n .map(r => {\n const paramMatches = r.path.match(/:(\\w+)/g) || [];\n const params = paramMatches.map(p => p.slice(1));\n const typeName = r.path\n .replace(/[/:]/g, '_')\n .replace(/^_/, '')\n .replace(/_$/, '') || 'Root';\n return `export type ${typeName}Params = { ${params.map(p => `${p}: string`).join('; ')} };`;\n })\n .join('\\n')}\n`;\n\n writeFileSync(join(outputDir, 'types.ts'), typesContent, 'utf-8');\n}\n\n/**\n * Main function to generate routes\n */\nexport async function generateRoutes(options: {\n routesDir: string;\n outputDir: string;\n watch?: boolean;\n}): Promise<RouteManifest> {\n const { routesDir, outputDir } = options;\n\n console.log(`Scanning routes in: ${routesDir}`);\n\n const manifest = generateRouteManifest(routesDir);\n\n const stats = [\n `${manifest.routes.length} pages`,\n `${manifest.layouts.length} layouts`,\n `${manifest.loadingStates.length} loading states`,\n `${manifest.errorBoundaries.length} error boundaries`,\n `${manifest.notFoundPages.length} not-found pages`,\n `${manifest.apiRoutes.length} API routes`,\n ].join(', ');\n\n console.log(`Found: ${stats}`);\n\n generateRoutesFile(manifest, outputDir);\n\n console.log(`Generated route manifest in: ${outputDir}`);\n\n return manifest;\n}\n","/**\n * Types Generate Command\n *\n * Generates TypeScript declaration files for routes and environment variables.\n * This command is opt-in and explicit - follows Flight's toolbox philosophy.\n *\n * Usage:\n * flight types:generate # Generate route types (default)\n * flight types:generate --routes # Generate route types only\n * flight types:generate --env # Generate env types only\n * flight types:generate --watch # Watch mode for development\n *\n * Output:\n * src/.flight/routes.d.ts - Route type definitions\n * src/.flight/env.d.ts - Environment variable types\n */\n\nimport { resolve } from 'path';\nimport { generateTypes, watchAndGenerate } from '../generators/typegen.js';\n\nexport interface TypesGenerateOptions {\n /** Routes directory (default: src/routes) */\n routesDir?: string;\n\n /** Output directory (default: src/.flight) */\n outputDir?: string;\n\n /** Generate route types (default: true) */\n routes?: boolean;\n\n /** Generate environment variable types (default: false) */\n env?: boolean;\n\n /** Watch for changes and regenerate (default: false) */\n watch?: boolean;\n}\n\nexport async function typesGenerateCommand(options: TypesGenerateOptions = {}): Promise<void> {\n const cwd = process.cwd();\n\n const routesDir = options.routesDir\n ? resolve(cwd, options.routesDir)\n : resolve(cwd, 'src/routes');\n\n const outputDir = options.outputDir\n ? resolve(cwd, options.outputDir)\n : resolve(cwd, 'src/.flight');\n\n // Default to routes if no specific flag is set\n const includeRoutes = options.routes ?? (!options.env);\n const includeEnv = options.env ?? false;\n\n console.log('Flight Type Generator');\n console.log('---------------------');\n console.log(`Routes directory: ${routesDir}`);\n console.log(`Output directory: ${outputDir}`);\n console.log(`Generate routes: ${includeRoutes}`);\n console.log(`Generate env: ${includeEnv}`);\n console.log('');\n\n try {\n if (options.watch) {\n console.log('Watching for changes... (Ctrl+C to stop)');\n console.log('');\n\n const cleanup = watchAndGenerate({\n routesDir,\n outputDir,\n includeRoutes,\n includeEnv,\n projectRoot: cwd,\n onRegenerate: (result) => {\n console.log(`Regenerated: ${result.filesWritten.length} files`);\n },\n });\n\n // Handle graceful shutdown\n process.on('SIGINT', () => {\n console.log('\\nStopping watch mode...');\n cleanup();\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise(() => { });\n } else {\n const result = await generateTypes({\n routesDir,\n outputDir,\n includeRoutes,\n includeEnv,\n projectRoot: cwd,\n });\n\n console.log('Type generation complete!');\n console.log('');\n console.log('Files written:');\n for (const file of result.filesWritten) {\n console.log(` - ${file}`);\n }\n console.log('');\n console.log('Add to your tsconfig.json includes:');\n console.log(' \"include\": [\"src\", \"src/.flight/*.d.ts\"]');\n }\n } catch (error) {\n console.error('Type generation failed:', error);\n process.exit(1);\n }\n}\n","/**\n * Type Generation Module\n *\n * Generates TypeScript declaration files from route structure and environment files.\n * Follows Flight's toolbox philosophy: explicit, opt-in, no magic.\n *\n * @example CLI Usage\n * ```bash\n * flight types:generate --routes --env\n * flight types:generate --routes --watch\n * ```\n *\n * @example Programmatic Usage\n * ```typescript\n * import { generateTypes } from '@flight-framework/cli/generators/typegen';\n *\n * await generateTypes({\n * routesDir: './src/routes',\n * outputDir: './src/.flight',\n * includeRoutes: true,\n * includeEnv: true,\n * });\n * ```\n *\n * @module @flight-framework/cli/generators/typegen\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, watch } from 'fs';\nimport { join, resolve, dirname } from 'path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TypeGenOptions {\n /** Directory containing route files */\n routesDir: string;\n\n /** Output directory for generated types */\n outputDir: string;\n\n /** Generate route types (default: true) */\n includeRoutes?: boolean;\n\n /** Generate environment variable types (default: false) */\n includeEnv?: boolean;\n\n /** Project root for .env file discovery */\n projectRoot?: string;\n}\n\nexport interface TypeGenResult {\n /** Generated route types content */\n routeTypes: string;\n\n /** Generated env types content */\n envTypes: string;\n\n /** List of files written */\n filesWritten: string[];\n\n /** Number of routes processed */\n routeCount: number;\n\n /** Number of env variables processed */\n envVarCount: number;\n}\n\nexport interface ScannedRoute {\n path: string;\n filePath: string;\n isDynamic: boolean;\n isApiRoute: boolean;\n httpMethod?: string;\n}\n\ninterface EnvVariable {\n key: string;\n optional: boolean;\n}\n\ninterface ParsedEnv {\n server: EnvVariable[];\n client: EnvVariable[];\n}\n\n// ============================================================================\n// Route Type Generation\n// ============================================================================\n\n/**\n * Generate default header for auto-generated files\n */\nfunction generateHeader(command: string): string {\n const timestamp = new Date().toISOString();\n return `/**\n * Auto-generated by Flight CLI\n * Do not edit manually - changes will be overwritten\n *\n * Command: ${command}\n * Generated: ${timestamp}\n */`;\n}\n\n/**\n * Extract parameter names from a route path\n *\n * @example\n * extractParams('/users/:id') // ['id']\n * extractParams('/blog/:year/:slug') // ['year', 'slug']\n * extractParams('/docs/*path') // ['path']\n */\nexport function extractParams(routePath: string): string[] {\n const params: string[] = [];\n\n // Match :param patterns\n const dynamicMatches = routePath.match(/:(\\w+)/g);\n if (dynamicMatches) {\n params.push(...dynamicMatches.map((m) => m.slice(1)));\n }\n\n // Match *param patterns (catch-all)\n const catchAllMatches = routePath.match(/\\*(\\w+)/g);\n if (catchAllMatches) {\n params.push(...catchAllMatches.map((m) => m.slice(1)));\n }\n\n return params;\n}\n\n/**\n * Check if route has dynamic segments\n */\nfunction isDynamicRoute(routePath: string): boolean {\n return routePath.includes(':') || routePath.includes('*');\n}\n\n/**\n * Generate TypeScript route types from scanned routes\n */\nexport function generateRouteTypes(routes: ScannedRoute[]): string {\n const pageRoutes = routes.filter((r) => !r.isApiRoute);\n const apiRoutes = routes.filter((r) => r.isApiRoute);\n\n const staticRoutes = pageRoutes.filter((r) => !r.isDynamic);\n const dynamicRoutes = pageRoutes.filter((r) => r.isDynamic);\n\n // Generate route unions\n const appRoutesUnion =\n pageRoutes.length > 0\n ? pageRoutes.map((r) => ` | '${r.path}'`).join('\\n')\n : ' | never';\n\n const apiRoutesUnion =\n apiRoutes.length > 0\n ? apiRoutes.map((r) => ` | '${r.path}'`).join('\\n')\n : ' | never';\n\n const staticRoutesUnion =\n staticRoutes.length > 0\n ? staticRoutes.map((r) => ` | '${r.path}'`).join('\\n')\n : ' | never';\n\n const dynamicRoutesUnion =\n dynamicRoutes.length > 0\n ? dynamicRoutes.map((r) => ` | '${r.path}'`).join('\\n')\n : ' | never';\n\n // Generate param types for dynamic routes\n const paramTypes = dynamicRoutes\n .map((r) => {\n const params = extractParams(r.path);\n const typeName = routePathToTypeName(r.path);\n const paramDef = params.map((p) => `${p}: string`).join('; ');\n return `export type ${typeName}Params = { ${paramDef} };`;\n })\n .join('\\n');\n\n return `${generateHeader('flight types:generate --routes')}\n\n// ============================================================================\n// Route Types\n// ============================================================================\n\n/**\n * All available page routes in the application\n */\nexport type AppRoutes =\n${appRoutesUnion};\n\n/**\n * All available API routes in the application\n */\nexport type ApiRoutes =\n${apiRoutesUnion};\n\n/**\n * Static routes (no dynamic parameters)\n */\nexport type StaticRoutes =\n${staticRoutesUnion};\n\n/**\n * Dynamic routes (with parameters like :id or *slug)\n */\nexport type DynamicRoutes =\n${dynamicRoutesUnion};\n\n// ============================================================================\n// Route Parameter Extraction\n// ============================================================================\n\n/**\n * Extract route parameters from a route pattern using template literal types.\n *\n * @example\n * type Params = ExtractRouteParams<'/users/:id'>; // { id: string }\n * type BlogParams = ExtractRouteParams<'/blog/:year/:slug'>; // { year: string; slug: string }\n */\ntype ExtractRouteParams<T extends string> =\n // Handle :param/rest pattern\n T extends \\`\\${infer _Start}:\\${infer Param}/\\${infer Rest}\\`\n ? { [K in Param]: string } & ExtractRouteParams<\\`/\\${Rest}\\`>\n // Handle :param at end\n : T extends \\`\\${infer _Start}:\\${infer Param}\\`\n ? { [K in Param]: string }\n // Handle *param (catch-all)\n : T extends \\`\\${infer _Start}*\\${infer Param}\\`\n ? { [K in Param]: string }\n // No params\n : Record<string, never>;\n\n/**\n * Get typed parameters for a specific route.\n *\n * @example\n * const params: RouteParams<'/users/:id'> = { id: '123' };\n */\nexport type RouteParams<T extends AppRoutes | ApiRoutes> = ExtractRouteParams<T>;\n\n// ============================================================================\n// Helper Types\n// ============================================================================\n\n/**\n * Check if a route requires parameters\n */\nexport type RequiresParams<T extends AppRoutes | ApiRoutes> =\n RouteParams<T> extends Record<string, never> ? false : true;\n\n/**\n * Props for a type-safe Link component\n */\nexport type TypedLinkProps<T extends AppRoutes> =\n RequiresParams<T> extends true\n ? { to: T; params: RouteParams<T> }\n : { to: T; params?: never };\n\n/**\n * Build a URL from a route pattern and parameters\n */\nexport type BuildUrl<T extends AppRoutes> =\n RequiresParams<T> extends true\n ? (route: T, params: RouteParams<T>) => string\n : (route: T) => string;\n\n// ============================================================================\n// Individual Route Parameter Types\n// ============================================================================\n\n${paramTypes || '// No dynamic routes found'}\n`;\n}\n\n/**\n * Convert route path to a valid TypeScript type name\n *\n * @example\n * routePathToTypeName('/users/:id') // 'Users_Id'\n * routePathToTypeName('/blog/:year/:slug') // 'Blog_Year_Slug'\n */\nfunction routePathToTypeName(routePath: string): string {\n return routePath\n .split('/')\n .filter(Boolean)\n .map((segment) => {\n // Remove : and * prefixes, capitalize\n const clean = segment.replace(/^[:*]/, '');\n return clean.charAt(0).toUpperCase() + clean.slice(1);\n })\n .join('_') || 'Root';\n}\n\n// ============================================================================\n// Environment Variable Type Generation\n// ============================================================================\n\n/**\n * Parse .env file content and extract variable definitions\n */\nexport function parseEnvFile(content: string): ParsedEnv {\n const server: EnvVariable[] = [];\n const client: EnvVariable[] = [];\n\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip comments and empty lines\n if (!trimmed || trimmed.startsWith('#')) {\n continue;\n }\n\n // Match KEY=value or KEY?=value (optional)\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)(\\?)?=/i);\n if (!match) {\n continue;\n }\n\n const key = match[1];\n const optional = match[2] === '?';\n\n const envVar: EnvVariable = { key, optional };\n\n // PUBLIC_ prefix means client-side accessible\n if (key.startsWith('PUBLIC_')) {\n client.push(envVar);\n } else {\n server.push(envVar);\n }\n }\n\n return { server, client };\n}\n\n/**\n * Load and merge all .env files from project root\n */\nexport function loadEnvFiles(projectRoot: string): ParsedEnv {\n const envFiles = ['.env', '.env.local', '.env.development', '.env.production'];\n\n const merged: ParsedEnv = { server: [], client: [] };\n const seenKeys = new Set<string>();\n\n for (const envFile of envFiles) {\n const envPath = join(projectRoot, envFile);\n\n if (!existsSync(envPath)) {\n continue;\n }\n\n const content = readFileSync(envPath, 'utf-8');\n const parsed = parseEnvFile(content);\n\n // Add new keys only (first definition wins)\n for (const envVar of parsed.server) {\n if (!seenKeys.has(envVar.key)) {\n seenKeys.add(envVar.key);\n merged.server.push(envVar);\n }\n }\n\n for (const envVar of parsed.client) {\n if (!seenKeys.has(envVar.key)) {\n seenKeys.add(envVar.key);\n merged.client.push(envVar);\n }\n }\n }\n\n return merged;\n}\n\n/**\n * Generate TypeScript environment variable types\n */\nexport function generateEnvTypes(env: ParsedEnv): string {\n const serverVars = env.server\n .sort((a, b) => a.key.localeCompare(b.key))\n .map((v) => ` ${v.key}${v.optional ? '?' : ''}: string;`)\n .join('\\n');\n\n const clientVars = env.client\n .sort((a, b) => a.key.localeCompare(b.key))\n .map((v) => ` ${v.key}${v.optional ? '?' : ''}: string;`)\n .join('\\n');\n\n return `${generateHeader('flight types:generate --env')}\n\n// ============================================================================\n// Server-side Environment Variables\n// ============================================================================\n\n/**\n * Server-side environment variables accessible via process.env\n * These are NOT exposed to the client.\n */\ndeclare namespace NodeJS {\n interface ProcessEnv {\n${serverVars || ' // No server environment variables defined'}\n }\n}\n\n// ============================================================================\n// Client-side Environment Variables\n// ============================================================================\n\n/**\n * Client-side environment variables accessible via import.meta.env\n * Only variables with PUBLIC_ prefix are included.\n */\ninterface ImportMetaEnv {\n${clientVars || ' // No client environment variables defined'}\n}\n\ninterface ImportMeta {\n readonly env: ImportMetaEnv;\n}\n`;\n}\n\n// ============================================================================\n// Main Generation Functions\n// ============================================================================\n\n/**\n * Scan routes directory and extract route information\n */\nexport function scanRoutesForTypes(routesDir: string): ScannedRoute[] {\n if (!existsSync(routesDir)) {\n return [];\n }\n\n const routes: ScannedRoute[] = [];\n scanDirectoryRecursive(routesDir, '', routes);\n return routes;\n}\n\nfunction scanDirectoryRecursive(\n dir: string,\n basePath: string,\n results: ScannedRoute[]\n): void {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = join(basePath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip special directories\n if (entry.name.startsWith('.') || entry.name === 'node_modules') {\n continue;\n }\n scanDirectoryRecursive(fullPath, relativePath, results);\n } else if (entry.isFile()) {\n const route = parseRouteFile(entry.name, relativePath);\n if (route) {\n results.push(route);\n }\n }\n }\n}\n\nfunction parseRouteFile(filename: string, relativePath: string): ScannedRoute | null {\n // Check for page routes\n if (/\\.(page|route)\\.(tsx?|jsx?)$/.test(filename)) {\n const urlPath = filePathToUrlPath(relativePath);\n return {\n path: urlPath,\n filePath: relativePath.replace(/\\\\/g, '/'),\n isDynamic: isDynamicRoute(urlPath),\n isApiRoute: false,\n };\n }\n\n // Check for API routes\n const apiMatch = filename.match(/\\.(get|post|put|patch|delete|options|head)\\.(tsx?|jsx?)$/i);\n if (apiMatch) {\n const urlPath = filePathToUrlPath(relativePath);\n return {\n path: urlPath,\n filePath: relativePath.replace(/\\\\/g, '/'),\n isDynamic: isDynamicRoute(urlPath),\n isApiRoute: true,\n httpMethod: apiMatch[1].toUpperCase(),\n };\n }\n\n return null;\n}\n\nfunction filePathToUrlPath(filePath: string): string {\n let urlPath = filePath\n // Normalize slashes first (Windows compatibility)\n .replace(/\\\\/g, '/')\n // Remove file extension\n .replace(/\\.(page|route)\\.(tsx?|jsx?)$/, '')\n // Remove HTTP method suffix\n .replace(/\\.(get|post|put|patch|delete|options|head)$/i, '')\n // Remove index (after slash normalization)\n .replace(/\\/index$/, '')\n .replace(/^index$/, '')\n // Remove route groups\n .replace(/\\/?\\\\?\\([^)]+\\\\?\\)/g, '')\n // Convert [param] to :param\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*$1')\n .replace(/\\[(\\w+)\\]/g, ':$1');\n\n // Ensure leading slash\n if (!urlPath.startsWith('/')) {\n urlPath = '/' + urlPath;\n }\n\n // Clean double slashes\n urlPath = urlPath.replace(/\\/+/g, '/');\n\n return urlPath || '/';\n}\n\n/**\n * Generate types and write to output directory\n */\nexport async function generateTypes(options: TypeGenOptions): Promise<TypeGenResult> {\n const {\n routesDir,\n outputDir,\n includeRoutes = true,\n includeEnv = false,\n projectRoot = process.cwd(),\n } = options;\n\n const result: TypeGenResult = {\n routeTypes: '',\n envTypes: '',\n filesWritten: [],\n routeCount: 0,\n envVarCount: 0,\n };\n\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate route types\n if (includeRoutes) {\n const routes = scanRoutesForTypes(routesDir);\n result.routeCount = routes.length;\n result.routeTypes = generateRouteTypes(routes);\n\n const routeTypesPath = join(outputDir, 'routes.d.ts');\n writeFileSync(routeTypesPath, result.routeTypes, 'utf-8');\n result.filesWritten.push(routeTypesPath);\n\n console.log(`Generated route types: ${routes.length} routes`);\n }\n\n // Generate env types\n if (includeEnv) {\n const env = loadEnvFiles(projectRoot);\n result.envVarCount = env.server.length + env.client.length;\n result.envTypes = generateEnvTypes(env);\n\n const envTypesPath = join(outputDir, 'env.d.ts');\n writeFileSync(envTypesPath, result.envTypes, 'utf-8');\n result.filesWritten.push(envTypesPath);\n\n console.log(`Generated env types: ${env.server.length} server, ${env.client.length} client`);\n }\n\n return result;\n}\n\n// ============================================================================\n// Watch Mode\n// ============================================================================\n\nexport interface WatchOptions extends TypeGenOptions {\n /** Debounce delay in milliseconds */\n debounce?: number;\n\n /** Callback when types are regenerated */\n onRegenerate?: (result: TypeGenResult) => void;\n}\n\n/**\n * Watch for changes and regenerate types automatically\n */\nexport function watchAndGenerate(options: WatchOptions): () => void {\n const { routesDir, debounce = 100, onRegenerate } = options;\n\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n const regenerate = async () => {\n try {\n const result = await generateTypes(options);\n onRegenerate?.(result);\n } catch (error) {\n console.error('Type generation failed:', (error as Error).message);\n }\n };\n\n const debouncedRegenerate = () => {\n if (timeout) clearTimeout(timeout);\n timeout = setTimeout(regenerate, debounce);\n };\n\n // Initial generation\n regenerate();\n\n // Watch routes directory\n const watcher = watch(routesDir, { recursive: true }, (eventType: string, filename: string | null) => {\n if (filename && /\\.(tsx?|jsx?)$/.test(filename)) {\n console.log(`Route file changed: ${filename}`);\n debouncedRegenerate();\n }\n });\n\n // Return cleanup function\n return () => {\n watcher.close();\n if (timeout) clearTimeout(timeout);\n };\n}\n","/**\n * Flight CLI Binary Entry Point\n */\n\nimport { run } from './index.js';\n\nrun();\n"],"mappings":"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","names":["pc","resolve","join","readFileSync","existsSync","pc","pc","resolve","join","existsSync","readFileSync","resolve","existsSync","pc","loadConfig","resolve","existsSync","pc","loadConfig","resolve","pc","loadConfig","pc","resolve","loadConfig","resolve","readdirSync","statSync","existsSync","writeFileSync","mkdirSync","join","dirname","existsSync","readdirSync","join","statSync","dirname","mkdirSync","writeFileSync","resolve","resolve","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","join","filePathToUrlPath","resolve","pc"]}
package/dist/index.js CHANGED
File without changes