@flight-framework/cli 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.js CHANGED
@@ -263,9 +263,15 @@ async function startSSRServer(vite, root, port, host) {
263
263
  let pageRouter = null;
264
264
  try {
265
265
  const { createFileRouter } = await import("@flight-framework/core/file-router");
266
+ const moduleLoader = async (filePath) => {
267
+ const relativePath = filePath.replace(root, "").replace(/\\/g, "/");
268
+ return vite.ssrLoadModule(relativePath);
269
+ };
266
270
  pageRouter = await createFileRouter({
267
271
  directory: join2(root, "src", "routes"),
268
- extensions: [".tsx", ".ts", ".jsx", ".js"]
272
+ extensions: [".tsx", ".ts", ".jsx", ".js"],
273
+ moduleLoader
274
+ // Use Vite's ssrLoadModule
269
275
  });
270
276
  console.log(pc2.green(` \u2713 Page router loaded: ${pageRouter.routes.filter((r) => r.type === "page").length} pages`));
271
277
  } catch {
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/bin.ts"],"sourcesContent":["/**\r\n * Flight CLI - Command-line interface\r\n */\r\n\r\nimport { cac } from 'cac';\r\nimport pc from 'picocolors';\r\nimport { VERSION } from './version.js';\r\nimport { createCommand } from './commands/create.js';\r\nimport { devCommand } from './commands/dev.js';\r\nimport { buildCommand } from './commands/build.js';\r\nimport { previewCommand } from './commands/preview.js';\r\n\r\nconst cli = cac('flight');\r\n\r\n// Logo\r\nconst LOGO = `\r\n${pc.cyan(' ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗')}\r\n${pc.cyan(' ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝')}\r\n${pc.cyan(' █████╗ ██║ ██║██║ ███╗███████║ ██║ ')}\r\n${pc.cyan(' ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ ')}\r\n${pc.cyan(' ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ ')}\r\n${pc.cyan(' ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ')}\r\n \r\n ${pc.dim('The Agnostic Full-Stack Framework')}\r\n ${pc.dim('Maximum Flexibility. Zero Lock-in.')}\r\n`;\r\n\r\nexport function printLogo(): void {\r\n console.log(LOGO);\r\n}\r\n\r\n// Version\r\ncli.version(VERSION);\r\ncli.help();\r\n\r\n// Commands\r\ncli\r\n .command('create [name]', 'Create a new Flight project')\r\n .option('-t, --template <template>', 'Project template to use', { default: 'basic' })\r\n .option('--ui <framework>', 'UI framework (react, vue, svelte, solid, vanilla)')\r\n .option('--ts', 'Use TypeScript', { default: true })\r\n .option('--git', 'Initialize git repository', { default: true })\r\n .option('--install', 'Install dependencies', { default: true })\r\n .action(createCommand);\r\n\r\ncli\r\n .command('dev', 'Start development server')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .option('--https', 'Enable HTTPS')\r\n .option('--ssr', 'Enable Server-Side Rendering')\r\n .action(devCommand);\r\n\r\ncli\r\n .command('build', 'Build for production')\r\n .option('--outDir <dir>', 'Output directory')\r\n .option('--sourcemap', 'Generate source maps')\r\n .option('--minify', 'Minify output', { default: true })\r\n .action(buildCommand);\r\n\r\ncli\r\n .command('preview', 'Preview production build')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .action(previewCommand);\r\n\r\n// Parse and run\r\nexport function run(): void {\r\n try {\r\n cli.parse(process.argv, { run: false });\r\n\r\n // Show logo for help\r\n if (cli.options.help || process.argv.length <= 2) {\r\n printLogo();\r\n }\r\n\r\n cli.runMatchedCommand();\r\n } catch (error) {\r\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { VERSION };\r\n","export const VERSION = '0.0.1';\r\n","/**\r\n * Flight CLI - Create Command\r\n * \r\n * Scaffold a new Flight project using external templates.\r\n * Follows 2026 best practices: external templates, minimal CLI logic.\r\n */\r\n\r\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, copyFileSync, statSync, unlinkSync } from 'node:fs';\r\nimport { join, resolve, dirname } from 'node:path';\r\nimport { execSync } from 'node:child_process';\r\nimport { fileURLToPath } from 'node:url';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport { printLogo } from '../index.js';\r\n\r\nconst __dirname = dirname(fileURLToPath(import.meta.url));\r\nconst TEMPLATES_DIR = resolve(__dirname, '../../templates');\r\n\r\ninterface CreateOptions {\r\n template: string;\r\n ui?: string;\r\n ts: boolean;\r\n git: boolean;\r\n install: boolean;\r\n}\r\n\r\nconst UI_FRAMEWORKS = [\r\n { title: 'React', value: 'react', description: 'The library for web and native user interfaces' },\r\n { title: 'Vue', value: 'vue', description: 'The progressive JavaScript framework' },\r\n { title: 'Svelte', value: 'svelte', description: 'Cybernetically enhanced web apps' },\r\n { title: 'Solid', value: 'solid', description: 'Simple and performant reactivity' },\r\n { title: 'Preact', value: 'preact', description: 'Fast 3kB alternative to React' },\r\n { title: 'Qwik', value: 'qwik', description: 'Resumable framework with O(1) loading' },\r\n { title: 'Lit', value: 'lit', description: 'Fast, lightweight Web Components' },\r\n { title: 'Htmx', value: 'htmx', description: 'HTML over the wire, no JavaScript' },\r\n { title: 'Vanilla', value: 'vanilla', description: 'No framework, just TypeScript' },\r\n];\r\n\r\nexport async function createCommand(\r\n name: string | undefined,\r\n options: CreateOptions\r\n): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Creating a new Flight project...\\n'));\r\n\r\n // Interactive prompts\r\n let projectName = name;\r\n let uiFramework = options.ui;\r\n\r\n if (!projectName) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: 'Project name:',\r\n initial: 'my-flight-app',\r\n validate: (value: string) => {\r\n if (!value) return 'Project name is required';\r\n if (!/^[a-z0-9-_]+$/i.test(value)) return 'Invalid project name';\r\n return true;\r\n },\r\n });\r\n projectName = response.name;\r\n }\r\n\r\n if (!projectName) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n if (!uiFramework) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'ui',\r\n message: 'Choose your UI framework:',\r\n choices: UI_FRAMEWORKS,\r\n initial: 0,\r\n });\r\n uiFramework = response.ui;\r\n }\r\n\r\n if (!uiFramework) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n const projectPath = resolve(process.cwd(), projectName);\r\n\r\n // Check if directory exists and is not empty\r\n if (existsSync(projectPath)) {\r\n const files = readdirSync(projectPath);\r\n if (files.length > 0) {\r\n const response = await prompts({\r\n type: 'confirm',\r\n name: 'overwrite',\r\n message: `Directory ${projectName} is not empty. Continue anyway?`,\r\n initial: false,\r\n });\r\n if (!response.overwrite) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n }\r\n }\r\n\r\n console.log(pc.dim(`\\nCreating project in ${projectPath}...\\n`));\r\n\r\n try {\r\n // Copy templates\r\n copyTemplate(projectPath, uiFramework, projectName);\r\n console.log(pc.green('✓') + ' Project structure created');\r\n\r\n // Initialize git\r\n if (options.git) {\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n console.log(pc.green('✓') + ' Git repository initialized');\r\n } catch {\r\n console.log(pc.yellow('[!]') + ' Could not initialize git repository');\r\n }\r\n }\r\n\r\n // Install dependencies\r\n if (options.install) {\r\n console.log(pc.dim('\\nInstalling dependencies...\\n'));\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n console.log(pc.green('\\n✓') + ' Dependencies installed');\r\n } catch {\r\n console.log(pc.yellow('\\n[!]') + ' Could not install dependencies. Run `npm install` manually.');\r\n }\r\n }\r\n\r\n // Success message\r\n console.log(`\r\n${pc.green('[OK] Project created successfully!')}\r\n\r\n${pc.cyan('Next steps:')}\r\n\r\n ${pc.dim('$')} cd ${projectName}\r\n ${pc.dim('$')} ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\n${pc.dim('Your project is 100% yours:')}\r\n ${pc.dim('•')} No telemetry\r\n ${pc.dim('•')} No lock-in\r\n ${pc.dim('•')} Deploy anywhere\r\n\r\n${pc.cyan('Happy flying!')}\r\n`);\r\n } catch (error) {\r\n console.error(pc.red('Failed to create project:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction detectPackageManager(): string {\r\n if (process.env.npm_config_user_agent?.includes('pnpm')) return 'pnpm';\r\n if (process.env.npm_config_user_agent?.includes('yarn')) return 'yarn';\r\n if (process.env.npm_config_user_agent?.includes('bun')) return 'bun';\r\n return 'npm';\r\n}\r\n\r\n/**\r\n * Copy template files to project directory\r\n */\r\nfunction copyTemplate(projectPath: string, ui: string, projectName: string): void {\r\n const baseDir = join(TEMPLATES_DIR, 'base');\r\n const uiDir = join(TEMPLATES_DIR, ui);\r\n\r\n // Ensure directories exist\r\n mkdirSync(projectPath, { recursive: true });\r\n mkdirSync(join(projectPath, 'src'), { recursive: true });\r\n mkdirSync(join(projectPath, 'src/styles'), { recursive: true });\r\n mkdirSync(join(projectPath, 'public'), { recursive: true });\r\n\r\n // Variables for template substitution\r\n const vars = {\r\n '{{PROJECT_NAME}}': projectName,\r\n '{{UI_FRAMEWORK}}': ui,\r\n '{{LANGUAGE}}': 'TypeScript',\r\n };\r\n\r\n // Copy base files\r\n copyDirWithTemplates(baseDir, projectPath, vars);\r\n\r\n // Copy UI-specific files (override base if needed)\r\n copyDirWithTemplates(uiDir, projectPath, vars);\r\n\r\n // Rename special files\r\n const gitignoreSrc = join(projectPath, '_gitignore');\r\n const gitignoreDest = join(projectPath, '.gitignore');\r\n if (existsSync(gitignoreSrc)) {\r\n copyFileSync(gitignoreSrc, gitignoreDest);\r\n unlinkSync(gitignoreSrc);\r\n }\r\n}\r\n\r\n/**\r\n * Recursively copy directory, processing .template files\r\n */\r\nfunction copyDirWithTemplates(\r\n srcDir: string,\r\n destDir: string,\r\n vars: Record<string, string>\r\n): void {\r\n if (!existsSync(srcDir)) return;\r\n\r\n const entries = readdirSync(srcDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const srcPath = join(srcDir, entry.name);\r\n let destName = entry.name;\r\n let isTemplate = false;\r\n\r\n // Handle .template extension\r\n if (destName.endsWith('.template')) {\r\n destName = destName.replace('.template', '');\r\n isTemplate = true;\r\n }\r\n\r\n const destPath = join(destDir, destName);\r\n\r\n if (entry.isDirectory()) {\r\n mkdirSync(destPath, { recursive: true });\r\n copyDirWithTemplates(srcPath, destPath, vars);\r\n } else {\r\n let content = readFileSync(srcPath, 'utf-8');\r\n\r\n // Apply template substitutions\r\n if (isTemplate || destName.endsWith('.json') || destName.endsWith('.html') || destName.endsWith('.md')) {\r\n for (const [key, value] of Object.entries(vars)) {\r\n content = content.replaceAll(key, value);\r\n }\r\n }\r\n\r\n writeFileSync(destPath, content);\r\n }\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Dev Command (SSR Enhanced)\r\n * \r\n * Start the development server with:\r\n * - Server-Side Rendering (renderToPipeableStream)\r\n * - Vite for HMR and asset transformation\r\n * - @flight-framework/http integration\r\n */\r\n\r\nimport { resolve, join } from 'node:path';\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface DevOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n https?: boolean;\r\n ssr?: boolean;\r\n}\r\n\r\nexport async function devCommand(options: DevOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight development server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n // Merge CLI options with config\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? config.dev.open;\r\n\r\n // Check if SSR mode is enabled\r\n const ssrEnabled = options.ssr ?? config.rendering?.default === 'ssr';\r\n const entryServerPath = join(root, 'src', 'entry-server.tsx');\r\n const hasSSREntry = existsSync(entryServerPath);\r\n\r\n // Dynamic import vite to avoid bundling issues\r\n const { createServer: createViteServer } = await import('vite');\r\n\r\n // Try to import Flight HTTP and file router\r\n let flightHttpAvailable = false;\r\n let flightRouterAvailable = false;\r\n\r\n try {\r\n await import('@flight-framework/http');\r\n flightHttpAvailable = true;\r\n } catch {\r\n // @flight-framework/http not installed\r\n }\r\n\r\n try {\r\n await import('@flight-framework/core/file-router');\r\n flightRouterAvailable = true;\r\n } catch {\r\n // file-router not available\r\n }\r\n\r\n // Create Vite dev server in middleware mode for SSR\r\n const vite = await createViteServer({\r\n root,\r\n mode: 'development',\r\n server: {\r\n middlewareMode: ssrEnabled && hasSSREntry,\r\n port: ssrEnabled && hasSSREntry ? undefined : port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open: ssrEnabled && hasSSREntry ? false : open,\r\n https: options.https ? {} : undefined,\r\n },\r\n appType: ssrEnabled && hasSSREntry ? 'custom' : 'spa',\r\n plugins: [\r\n // Add Flight plugin when @flight-framework/http is available\r\n flightHttpAvailable ? flightDevPlugin(root) : null,\r\n ].filter(Boolean),\r\n });\r\n\r\n // SSR Mode with custom server\r\n if (ssrEnabled && hasSSREntry) {\r\n await startSSRServer(vite, root, port, host);\r\n } else {\r\n // CSR Mode - standard Vite server\r\n await vite.listen();\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const isSSR = ssrEnabled && hasSSREntry;\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight dev server ready in ${pc.bold(elapsed + 'ms')}\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://${getNetworkAddress()}:${port}/`)}` : ''}\r\n \r\n ${isSSR ? pc.green('✓') : pc.yellow('○')} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}\r\n ${flightHttpAvailable ? pc.green('✓') : pc.yellow('○')} @flight-framework/http ${flightHttpAvailable ? 'enabled' : 'not installed'}\r\n ${flightRouterAvailable ? pc.green('✓') : pc.yellow('○')} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}\r\n\r\n ${pc.dim('press')} ${pc.bold('h')} ${pc.dim('to show help')}\r\n`);\r\n\r\n // Handle server shortcuts\r\n if (!isSSR) {\r\n vite.bindCLIShortcuts({ print: true });\r\n }\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start dev server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Start SSR server with Vite middleware and file-based page routing\r\n */\r\nasync function startSSRServer(\r\n vite: any,\r\n root: string,\r\n port: number,\r\n host: string | boolean\r\n): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n // Try to load file-based page router\r\n let pageRouter: any = null;\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n pageRouter = await createFileRouter({\r\n directory: join(root, 'src', 'routes'),\r\n extensions: ['.tsx', '.ts', '.jsx', '.js']\r\n });\r\n console.log(pc.green(` ✓ Page router loaded: ${pageRouter.routes.filter((r: any) => r.type === 'page').length} pages`));\r\n } catch {\r\n // File router not available, use entry-server only\r\n }\r\n\r\n // Create a simple connect-like middleware handler\r\n const server = createHttpServer(async (req, res) => {\r\n const url = req.url || '/';\r\n const pathname = url.split('?')[0];\r\n\r\n // Let Vite handle HMR and static assets\r\n if (url.startsWith('/@') ||\r\n url.startsWith('/node_modules') ||\r\n (url.startsWith('/src') && !url.includes('entry-server'))) {\r\n vite.middlewares(req, res);\r\n return;\r\n }\r\n\r\n try {\r\n // 1. Read index.html template\r\n let template = readFileSync(\r\n join(root, 'index.html'),\r\n 'utf-8'\r\n );\r\n\r\n // 2. Apply Vite HTML transforms (HMR client injection)\r\n template = await vite.transformIndexHtml(url, template);\r\n\r\n let appHtml = '';\r\n\r\n // 3. Try file-based page routing first\r\n if (pageRouter) {\r\n const pageRoute = pageRouter.routes.find((r: any) =>\r\n r.type === 'page' && matchPath(r.path, pathname)\r\n );\r\n\r\n if (pageRoute && pageRoute.component) {\r\n // Load component via Vite for HMR\r\n const mod = await vite.ssrLoadModule(pageRoute.filePath.replace(root, ''));\r\n const Component = mod.default;\r\n\r\n // Get render function for the UI framework\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n\r\n if (typeof render === 'function' && Component) {\r\n appHtml = await render(url, { Component });\r\n }\r\n }\r\n }\r\n\r\n // 4. Fallback to entry-server.tsx if no page matched\r\n if (!appHtml) {\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n if (typeof render === 'function') {\r\n appHtml = await render(url);\r\n }\r\n }\r\n\r\n // 5. Inject rendered app into template\r\n if (appHtml) {\r\n const html = template.replace('<!--ssr-outlet-->', appHtml);\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(html);\r\n } else {\r\n // Fallback to CSR if no render\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(template);\r\n }\r\n\r\n } catch (e: any) {\r\n // Fix Vite stack trace\r\n vite.ssrFixStacktrace(e);\r\n console.error(pc.red('[SSR Error]'), e.stack);\r\n\r\n if (!res.headersSent) {\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end(`SSR Error: ${e.message}\\n\\n${e.stack}`);\r\n }\r\n }\r\n });\r\n\r\n const listenHost = host === true ? '0.0.0.0' : (host || 'localhost');\r\n\r\n server.listen(port, listenHost as string, () => {\r\n console.log(pc.green(` ✓ SSR server listening`));\r\n });\r\n}\r\n\r\n/**\r\n * Flight development plugin for Vite\r\n */\r\nfunction flightDevPlugin(root: string) {\r\n return {\r\n name: 'flight:dev',\r\n\r\n configureServer(server: any) {\r\n // Add middleware to handle Flight API routes\r\n server.middlewares.use(async (req: any, res: any, next: any) => {\r\n const url = req.url || '/';\r\n\r\n // Handle Flight action requests\r\n if (url.startsWith('/__flight_action/')) {\r\n try {\r\n const { handleActionRequest } = await import('@flight-framework/core');\r\n\r\n // Convert Node request to Web Request\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await handleActionRequest(webRequest);\r\n\r\n // Write response\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n } catch (error) {\r\n console.error('[Flight] Action error:', error);\r\n res.statusCode = 500;\r\n res.end(JSON.stringify({ error: 'Internal server error' }));\r\n }\r\n return;\r\n }\r\n\r\n // Handle API routes from file-router\r\n if (url.startsWith('/api/')) {\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n const routesDir = join(root, 'src', 'routes');\r\n\r\n const router = await createFileRouter({ directory: routesDir });\r\n const route = router.routes.find(r => {\r\n // Simple path matching (production would use radix matching)\r\n return matchPath(r.path, url);\r\n });\r\n\r\n if (route && route.handler) {\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await route.handler({ req: webRequest, params: {} });\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n return;\r\n }\r\n } catch (error) {\r\n // File router not set up, continue to next middleware\r\n }\r\n }\r\n\r\n next();\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Convert Node.js request to Web Standard Request\r\n */\r\nasync function nodeToWebRequest(req: any): Promise<Request> {\r\n const host = req.headers.host || 'localhost';\r\n const protocol = 'http';\r\n const url = new URL(req.url || '/', `${protocol}://${host}`);\r\n\r\n let body: BodyInit | null = null;\r\n\r\n if (req.method !== 'GET' && req.method !== 'HEAD') {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of req) {\r\n chunks.push(chunk);\r\n }\r\n body = Buffer.concat(chunks);\r\n }\r\n\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n if (Array.isArray(value)) {\r\n for (const v of value) {\r\n headers.append(key, v);\r\n }\r\n } else {\r\n headers.set(key, value as string);\r\n }\r\n }\r\n }\r\n\r\n return new Request(url.toString(), {\r\n method: req.method || 'GET',\r\n headers,\r\n body,\r\n });\r\n}\r\n\r\n/**\r\n * Simple path matching\r\n */\r\nfunction matchPath(pattern: string, path: string): boolean {\r\n // Remove query string\r\n const cleanPath = path.split('?')[0];\r\n\r\n // Convert pattern params to regex\r\n const regexPattern = pattern\r\n .replace(/:\\w+/g, '[^/]+')\r\n .replace(/\\*/g, '.*');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(cleanPath || '/');\r\n}\r\n\r\nfunction getNetworkAddress(): string {\r\n try {\r\n const { networkInterfaces } = require('os');\r\n const nets = networkInterfaces();\r\n\r\n for (const name of Object.keys(nets)) {\r\n for (const net of nets[name]) {\r\n if (net.family === 'IPv4' && !net.internal) {\r\n return net.address;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore\r\n }\r\n return '0.0.0.0';\r\n}\r\n\r\n","/**\r\n * Flight CLI - Build Command\r\n * \r\n * Build for production.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface BuildOptions {\r\n outDir?: string;\r\n sourcemap?: boolean;\r\n minify?: boolean;\r\n}\r\n\r\nexport async function buildCommand(options: BuildOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Building Flight project for production...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const outDir = options.outDir ?? config.build.outDir;\r\n const sourcemap = options.sourcemap ?? config.build.sourcemap;\r\n const minify = options.minify ?? config.build.minify;\r\n\r\n // Dynamic import vite\r\n const { build } = await import('vite');\r\n\r\n console.log(pc.dim(`Output directory: ${outDir}`));\r\n console.log(pc.dim(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`));\r\n console.log(pc.dim(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`));\r\n\r\n // Client build\r\n console.log(pc.cyan('Building client...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/client`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n rollupOptions: {\r\n input: resolve(root, 'index.html'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Client build complete');\r\n\r\n // SSR build (if applicable)\r\n if (config.rendering.default !== 'csr') {\r\n console.log(pc.cyan('\\nBuilding server...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/server`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n ssr: true,\r\n rollupOptions: {\r\n input: resolve(root, config.build.srcDir, 'entry-server.ts'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Server build complete');\r\n }\r\n\r\n // Run adapter if configured\r\n if (config.adapter) {\r\n console.log(pc.cyan(`\\nRunning ${config.adapter.name} adapter...`));\r\n // TODO: Implement adapter execution\r\n console.log(pc.green('✓') + ` ${config.adapter.name} adapter complete`);\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\r\n\r\n console.log(`\r\n${pc.green('[OK] Build complete!')} ${pc.dim(`(${elapsedSeconds}s)`)}\r\n\r\n${pc.cyan('Output:')} ${resolve(root, outDir)}\r\n\r\n${pc.dim('To preview the build:')}\r\n ${pc.dim('$')} flight preview\r\n\r\n${pc.dim('To deploy:')}\r\n ${pc.dim('•')} Upload ${outDir}/ to your server\r\n ${pc.dim('•')} Or use your configured adapter\r\n`);\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nBuild failed:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Preview Command\r\n * \r\n * Preview production build locally.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface PreviewOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n}\r\n\r\nexport async function previewCommand(options: PreviewOptions): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight preview server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port + 1;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? false;\r\n\r\n // Dynamic import vite\r\n const { preview } = await import('vite');\r\n\r\n const server = await preview({\r\n root,\r\n preview: {\r\n port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open,\r\n },\r\n build: {\r\n outDir: config.build.outDir,\r\n },\r\n });\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight preview server ready\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://0.0.0.0:${port}/`)}` : ''}\r\n\r\n ${pc.dim('This is a preview of your production build.')}\r\n ${pc.dim('For development, use')} ${pc.bold('flight dev')}\r\n`);\r\n\r\n // Keep server running\r\n server.printUrls();\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start preview server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI Binary Entry Point\r\n */\r\n\r\nimport { run } from './index.js';\r\n\r\nrun();\r\n"],"mappings":"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","names":["pc","resolve","join","readFileSync","existsSync","pc","pc","resolve","join","existsSync","readFileSync","resolve","pc","loadConfig","pc","resolve","loadConfig","resolve","pc","loadConfig","pc","resolve","loadConfig","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/version.ts","../src/commands/create.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/preview.ts","../src/bin.ts"],"sourcesContent":["/**\r\n * Flight CLI - Command-line interface\r\n */\r\n\r\nimport { cac } from 'cac';\r\nimport pc from 'picocolors';\r\nimport { VERSION } from './version.js';\r\nimport { createCommand } from './commands/create.js';\r\nimport { devCommand } from './commands/dev.js';\r\nimport { buildCommand } from './commands/build.js';\r\nimport { previewCommand } from './commands/preview.js';\r\n\r\nconst cli = cac('flight');\r\n\r\n// Logo\r\nconst LOGO = `\r\n${pc.cyan(' ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗')}\r\n${pc.cyan(' ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝')}\r\n${pc.cyan(' █████╗ ██║ ██║██║ ███╗███████║ ██║ ')}\r\n${pc.cyan(' ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ ')}\r\n${pc.cyan(' ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ ')}\r\n${pc.cyan(' ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ')}\r\n \r\n ${pc.dim('The Agnostic Full-Stack Framework')}\r\n ${pc.dim('Maximum Flexibility. Zero Lock-in.')}\r\n`;\r\n\r\nexport function printLogo(): void {\r\n console.log(LOGO);\r\n}\r\n\r\n// Version\r\ncli.version(VERSION);\r\ncli.help();\r\n\r\n// Commands\r\ncli\r\n .command('create [name]', 'Create a new Flight project')\r\n .option('-t, --template <template>', 'Project template to use', { default: 'basic' })\r\n .option('--ui <framework>', 'UI framework (react, vue, svelte, solid, vanilla)')\r\n .option('--ts', 'Use TypeScript', { default: true })\r\n .option('--git', 'Initialize git repository', { default: true })\r\n .option('--install', 'Install dependencies', { default: true })\r\n .action(createCommand);\r\n\r\ncli\r\n .command('dev', 'Start development server')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .option('--https', 'Enable HTTPS')\r\n .option('--ssr', 'Enable Server-Side Rendering')\r\n .action(devCommand);\r\n\r\ncli\r\n .command('build', 'Build for production')\r\n .option('--outDir <dir>', 'Output directory')\r\n .option('--sourcemap', 'Generate source maps')\r\n .option('--minify', 'Minify output', { default: true })\r\n .action(buildCommand);\r\n\r\ncli\r\n .command('preview', 'Preview production build')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .action(previewCommand);\r\n\r\n// Parse and run\r\nexport function run(): void {\r\n try {\r\n cli.parse(process.argv, { run: false });\r\n\r\n // Show logo for help\r\n if (cli.options.help || process.argv.length <= 2) {\r\n printLogo();\r\n }\r\n\r\n cli.runMatchedCommand();\r\n } catch (error) {\r\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { VERSION };\r\n","export const VERSION = '0.0.1';\r\n","/**\r\n * Flight CLI - Create Command\r\n * \r\n * Scaffold a new Flight project using external templates.\r\n * Follows 2026 best practices: external templates, minimal CLI logic.\r\n */\r\n\r\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, copyFileSync, statSync, unlinkSync } from 'node:fs';\r\nimport { join, resolve, dirname } from 'node:path';\r\nimport { execSync } from 'node:child_process';\r\nimport { fileURLToPath } from 'node:url';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport { printLogo } from '../index.js';\r\n\r\nconst __dirname = dirname(fileURLToPath(import.meta.url));\r\nconst TEMPLATES_DIR = resolve(__dirname, '../../templates');\r\n\r\ninterface CreateOptions {\r\n template: string;\r\n ui?: string;\r\n ts: boolean;\r\n git: boolean;\r\n install: boolean;\r\n}\r\n\r\nconst UI_FRAMEWORKS = [\r\n { title: 'React', value: 'react', description: 'The library for web and native user interfaces' },\r\n { title: 'Vue', value: 'vue', description: 'The progressive JavaScript framework' },\r\n { title: 'Svelte', value: 'svelte', description: 'Cybernetically enhanced web apps' },\r\n { title: 'Solid', value: 'solid', description: 'Simple and performant reactivity' },\r\n { title: 'Preact', value: 'preact', description: 'Fast 3kB alternative to React' },\r\n { title: 'Qwik', value: 'qwik', description: 'Resumable framework with O(1) loading' },\r\n { title: 'Lit', value: 'lit', description: 'Fast, lightweight Web Components' },\r\n { title: 'Htmx', value: 'htmx', description: 'HTML over the wire, no JavaScript' },\r\n { title: 'Vanilla', value: 'vanilla', description: 'No framework, just TypeScript' },\r\n];\r\n\r\nexport async function createCommand(\r\n name: string | undefined,\r\n options: CreateOptions\r\n): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Creating a new Flight project...\\n'));\r\n\r\n // Interactive prompts\r\n let projectName = name;\r\n let uiFramework = options.ui;\r\n\r\n if (!projectName) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: 'Project name:',\r\n initial: 'my-flight-app',\r\n validate: (value: string) => {\r\n if (!value) return 'Project name is required';\r\n if (!/^[a-z0-9-_]+$/i.test(value)) return 'Invalid project name';\r\n return true;\r\n },\r\n });\r\n projectName = response.name;\r\n }\r\n\r\n if (!projectName) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n if (!uiFramework) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'ui',\r\n message: 'Choose your UI framework:',\r\n choices: UI_FRAMEWORKS,\r\n initial: 0,\r\n });\r\n uiFramework = response.ui;\r\n }\r\n\r\n if (!uiFramework) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n const projectPath = resolve(process.cwd(), projectName);\r\n\r\n // Check if directory exists and is not empty\r\n if (existsSync(projectPath)) {\r\n const files = readdirSync(projectPath);\r\n if (files.length > 0) {\r\n const response = await prompts({\r\n type: 'confirm',\r\n name: 'overwrite',\r\n message: `Directory ${projectName} is not empty. Continue anyway?`,\r\n initial: false,\r\n });\r\n if (!response.overwrite) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n }\r\n }\r\n\r\n console.log(pc.dim(`\\nCreating project in ${projectPath}...\\n`));\r\n\r\n try {\r\n // Copy templates\r\n copyTemplate(projectPath, uiFramework, projectName);\r\n console.log(pc.green('✓') + ' Project structure created');\r\n\r\n // Initialize git\r\n if (options.git) {\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n console.log(pc.green('✓') + ' Git repository initialized');\r\n } catch {\r\n console.log(pc.yellow('[!]') + ' Could not initialize git repository');\r\n }\r\n }\r\n\r\n // Install dependencies\r\n if (options.install) {\r\n console.log(pc.dim('\\nInstalling dependencies...\\n'));\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n console.log(pc.green('\\n✓') + ' Dependencies installed');\r\n } catch {\r\n console.log(pc.yellow('\\n[!]') + ' Could not install dependencies. Run `npm install` manually.');\r\n }\r\n }\r\n\r\n // Success message\r\n console.log(`\r\n${pc.green('[OK] Project created successfully!')}\r\n\r\n${pc.cyan('Next steps:')}\r\n\r\n ${pc.dim('$')} cd ${projectName}\r\n ${pc.dim('$')} ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\n${pc.dim('Your project is 100% yours:')}\r\n ${pc.dim('•')} No telemetry\r\n ${pc.dim('•')} No lock-in\r\n ${pc.dim('•')} Deploy anywhere\r\n\r\n${pc.cyan('Happy flying!')}\r\n`);\r\n } catch (error) {\r\n console.error(pc.red('Failed to create project:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction detectPackageManager(): string {\r\n if (process.env.npm_config_user_agent?.includes('pnpm')) return 'pnpm';\r\n if (process.env.npm_config_user_agent?.includes('yarn')) return 'yarn';\r\n if (process.env.npm_config_user_agent?.includes('bun')) return 'bun';\r\n return 'npm';\r\n}\r\n\r\n/**\r\n * Copy template files to project directory\r\n */\r\nfunction copyTemplate(projectPath: string, ui: string, projectName: string): void {\r\n const baseDir = join(TEMPLATES_DIR, 'base');\r\n const uiDir = join(TEMPLATES_DIR, ui);\r\n\r\n // Ensure directories exist\r\n mkdirSync(projectPath, { recursive: true });\r\n mkdirSync(join(projectPath, 'src'), { recursive: true });\r\n mkdirSync(join(projectPath, 'src/styles'), { recursive: true });\r\n mkdirSync(join(projectPath, 'public'), { recursive: true });\r\n\r\n // Variables for template substitution\r\n const vars = {\r\n '{{PROJECT_NAME}}': projectName,\r\n '{{UI_FRAMEWORK}}': ui,\r\n '{{LANGUAGE}}': 'TypeScript',\r\n };\r\n\r\n // Copy base files\r\n copyDirWithTemplates(baseDir, projectPath, vars);\r\n\r\n // Copy UI-specific files (override base if needed)\r\n copyDirWithTemplates(uiDir, projectPath, vars);\r\n\r\n // Rename special files\r\n const gitignoreSrc = join(projectPath, '_gitignore');\r\n const gitignoreDest = join(projectPath, '.gitignore');\r\n if (existsSync(gitignoreSrc)) {\r\n copyFileSync(gitignoreSrc, gitignoreDest);\r\n unlinkSync(gitignoreSrc);\r\n }\r\n}\r\n\r\n/**\r\n * Recursively copy directory, processing .template files\r\n */\r\nfunction copyDirWithTemplates(\r\n srcDir: string,\r\n destDir: string,\r\n vars: Record<string, string>\r\n): void {\r\n if (!existsSync(srcDir)) return;\r\n\r\n const entries = readdirSync(srcDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const srcPath = join(srcDir, entry.name);\r\n let destName = entry.name;\r\n let isTemplate = false;\r\n\r\n // Handle .template extension\r\n if (destName.endsWith('.template')) {\r\n destName = destName.replace('.template', '');\r\n isTemplate = true;\r\n }\r\n\r\n const destPath = join(destDir, destName);\r\n\r\n if (entry.isDirectory()) {\r\n mkdirSync(destPath, { recursive: true });\r\n copyDirWithTemplates(srcPath, destPath, vars);\r\n } else {\r\n let content = readFileSync(srcPath, 'utf-8');\r\n\r\n // Apply template substitutions\r\n if (isTemplate || destName.endsWith('.json') || destName.endsWith('.html') || destName.endsWith('.md')) {\r\n for (const [key, value] of Object.entries(vars)) {\r\n content = content.replaceAll(key, value);\r\n }\r\n }\r\n\r\n writeFileSync(destPath, content);\r\n }\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Dev Command (SSR Enhanced)\r\n * \r\n * Start the development server with:\r\n * - Server-Side Rendering (renderToPipeableStream)\r\n * - Vite for HMR and asset transformation\r\n * - @flight-framework/http integration\r\n */\r\n\r\nimport { resolve, join } from 'node:path';\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface DevOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n https?: boolean;\r\n ssr?: boolean;\r\n}\r\n\r\nexport async function devCommand(options: DevOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight development server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n // Merge CLI options with config\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? config.dev.open;\r\n\r\n // Check if SSR mode is enabled\r\n const ssrEnabled = options.ssr ?? config.rendering?.default === 'ssr';\r\n const entryServerPath = join(root, 'src', 'entry-server.tsx');\r\n const hasSSREntry = existsSync(entryServerPath);\r\n\r\n // Dynamic import vite to avoid bundling issues\r\n const { createServer: createViteServer } = await import('vite');\r\n\r\n // Try to import Flight HTTP and file router\r\n let flightHttpAvailable = false;\r\n let flightRouterAvailable = false;\r\n\r\n try {\r\n await import('@flight-framework/http');\r\n flightHttpAvailable = true;\r\n } catch {\r\n // @flight-framework/http not installed\r\n }\r\n\r\n try {\r\n await import('@flight-framework/core/file-router');\r\n flightRouterAvailable = true;\r\n } catch {\r\n // file-router not available\r\n }\r\n\r\n // Create Vite dev server in middleware mode for SSR\r\n const vite = await createViteServer({\r\n root,\r\n mode: 'development',\r\n server: {\r\n middlewareMode: ssrEnabled && hasSSREntry,\r\n port: ssrEnabled && hasSSREntry ? undefined : port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open: ssrEnabled && hasSSREntry ? false : open,\r\n https: options.https ? {} : undefined,\r\n },\r\n appType: ssrEnabled && hasSSREntry ? 'custom' : 'spa',\r\n plugins: [\r\n // Add Flight plugin when @flight-framework/http is available\r\n flightHttpAvailable ? flightDevPlugin(root) : null,\r\n ].filter(Boolean),\r\n });\r\n\r\n // SSR Mode with custom server\r\n if (ssrEnabled && hasSSREntry) {\r\n await startSSRServer(vite, root, port, host);\r\n } else {\r\n // CSR Mode - standard Vite server\r\n await vite.listen();\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const isSSR = ssrEnabled && hasSSREntry;\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight dev server ready in ${pc.bold(elapsed + 'ms')}\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://${getNetworkAddress()}:${port}/`)}` : ''}\r\n \r\n ${isSSR ? pc.green('✓') : pc.yellow('○')} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}\r\n ${flightHttpAvailable ? pc.green('✓') : pc.yellow('○')} @flight-framework/http ${flightHttpAvailable ? 'enabled' : 'not installed'}\r\n ${flightRouterAvailable ? pc.green('✓') : pc.yellow('○')} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}\r\n\r\n ${pc.dim('press')} ${pc.bold('h')} ${pc.dim('to show help')}\r\n`);\r\n\r\n // Handle server shortcuts\r\n if (!isSSR) {\r\n vite.bindCLIShortcuts({ print: true });\r\n }\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start dev server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Start SSR server with Vite middleware and file-based page routing\r\n */\r\nasync function startSSRServer(\r\n vite: any,\r\n root: string,\r\n port: number,\r\n host: string | boolean\r\n): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n // Try to load file-based page router\r\n let pageRouter: any = null;\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n\r\n // Create module loader that uses Vite's ssrLoadModule for TSX support\r\n const moduleLoader = async (filePath: string) => {\r\n // Convert absolute path to relative for Vite\r\n const relativePath = filePath.replace(root, '').replace(/\\\\/g, '/');\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 // Let Vite handle HMR and static assets\r\n if (url.startsWith('/@') ||\r\n url.startsWith('/node_modules') ||\r\n (url.startsWith('/src') && !url.includes('entry-server'))) {\r\n vite.middlewares(req, res);\r\n return;\r\n }\r\n\r\n try {\r\n // 1. Read index.html template\r\n let template = readFileSync(\r\n join(root, 'index.html'),\r\n 'utf-8'\r\n );\r\n\r\n // 2. Apply Vite HTML transforms (HMR client injection)\r\n template = await vite.transformIndexHtml(url, template);\r\n\r\n let appHtml = '';\r\n\r\n // 3. Try file-based page routing first\r\n if (pageRouter) {\r\n const pageRoute = pageRouter.routes.find((r: any) =>\r\n r.type === 'page' && matchPath(r.path, pathname)\r\n );\r\n\r\n if (pageRoute && pageRoute.component) {\r\n // Load component via Vite for HMR\r\n const mod = await vite.ssrLoadModule(pageRoute.filePath.replace(root, ''));\r\n const Component = mod.default;\r\n\r\n // Get render function for the UI framework\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n\r\n if (typeof render === 'function' && Component) {\r\n appHtml = await render(url, { Component });\r\n }\r\n }\r\n }\r\n\r\n // 4. Fallback to entry-server.tsx if no page matched\r\n if (!appHtml) {\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n if (typeof render === 'function') {\r\n appHtml = await render(url);\r\n }\r\n }\r\n\r\n // 5. Inject rendered app into template\r\n if (appHtml) {\r\n const html = template.replace('<!--ssr-outlet-->', appHtml);\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(html);\r\n } else {\r\n // Fallback to CSR if no render\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(template);\r\n }\r\n\r\n } catch (e: any) {\r\n // Fix Vite stack trace\r\n vite.ssrFixStacktrace(e);\r\n console.error(pc.red('[SSR Error]'), e.stack);\r\n\r\n if (!res.headersSent) {\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end(`SSR Error: ${e.message}\\n\\n${e.stack}`);\r\n }\r\n }\r\n });\r\n\r\n const listenHost = host === true ? '0.0.0.0' : (host || 'localhost');\r\n\r\n server.listen(port, listenHost as string, () => {\r\n console.log(pc.green(` ✓ SSR server listening`));\r\n });\r\n}\r\n\r\n/**\r\n * Flight development plugin for Vite\r\n */\r\nfunction flightDevPlugin(root: string) {\r\n return {\r\n name: 'flight:dev',\r\n\r\n configureServer(server: any) {\r\n // Add middleware to handle Flight API routes\r\n server.middlewares.use(async (req: any, res: any, next: any) => {\r\n const url = req.url || '/';\r\n\r\n // Handle Flight action requests\r\n if (url.startsWith('/__flight_action/')) {\r\n try {\r\n const { handleActionRequest } = await import('@flight-framework/core');\r\n\r\n // Convert Node request to Web Request\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await handleActionRequest(webRequest);\r\n\r\n // Write response\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n } catch (error) {\r\n console.error('[Flight] Action error:', error);\r\n res.statusCode = 500;\r\n res.end(JSON.stringify({ error: 'Internal server error' }));\r\n }\r\n return;\r\n }\r\n\r\n // Handle API routes from file-router\r\n if (url.startsWith('/api/')) {\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n const routesDir = join(root, 'src', 'routes');\r\n\r\n const router = await createFileRouter({ directory: routesDir });\r\n const route = router.routes.find(r => {\r\n // Simple path matching (production would use radix matching)\r\n return matchPath(r.path, url);\r\n });\r\n\r\n if (route && route.handler) {\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await route.handler({ req: webRequest, params: {} });\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n return;\r\n }\r\n } catch (error) {\r\n // File router not set up, continue to next middleware\r\n }\r\n }\r\n\r\n next();\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Convert Node.js request to Web Standard Request\r\n */\r\nasync function nodeToWebRequest(req: any): Promise<Request> {\r\n const host = req.headers.host || 'localhost';\r\n const protocol = 'http';\r\n const url = new URL(req.url || '/', `${protocol}://${host}`);\r\n\r\n let body: BodyInit | null = null;\r\n\r\n if (req.method !== 'GET' && req.method !== 'HEAD') {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of req) {\r\n chunks.push(chunk);\r\n }\r\n body = Buffer.concat(chunks);\r\n }\r\n\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n if (Array.isArray(value)) {\r\n for (const v of value) {\r\n headers.append(key, v);\r\n }\r\n } else {\r\n headers.set(key, value as string);\r\n }\r\n }\r\n }\r\n\r\n return new Request(url.toString(), {\r\n method: req.method || 'GET',\r\n headers,\r\n body,\r\n });\r\n}\r\n\r\n/**\r\n * Simple path matching\r\n */\r\nfunction matchPath(pattern: string, path: string): boolean {\r\n // Remove query string\r\n const cleanPath = path.split('?')[0];\r\n\r\n // Convert pattern params to regex\r\n const regexPattern = pattern\r\n .replace(/:\\w+/g, '[^/]+')\r\n .replace(/\\*/g, '.*');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(cleanPath || '/');\r\n}\r\n\r\nfunction getNetworkAddress(): string {\r\n try {\r\n const { networkInterfaces } = require('os');\r\n const nets = networkInterfaces();\r\n\r\n for (const name of Object.keys(nets)) {\r\n for (const net of nets[name]) {\r\n if (net.family === 'IPv4' && !net.internal) {\r\n return net.address;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore\r\n }\r\n return '0.0.0.0';\r\n}\r\n\r\n","/**\r\n * Flight CLI - Build Command\r\n * \r\n * Build for production.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface BuildOptions {\r\n outDir?: string;\r\n sourcemap?: boolean;\r\n minify?: boolean;\r\n}\r\n\r\nexport async function buildCommand(options: BuildOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Building Flight project for production...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const outDir = options.outDir ?? config.build.outDir;\r\n const sourcemap = options.sourcemap ?? config.build.sourcemap;\r\n const minify = options.minify ?? config.build.minify;\r\n\r\n // Dynamic import vite\r\n const { build } = await import('vite');\r\n\r\n console.log(pc.dim(`Output directory: ${outDir}`));\r\n console.log(pc.dim(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`));\r\n console.log(pc.dim(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`));\r\n\r\n // Client build\r\n console.log(pc.cyan('Building client...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/client`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n rollupOptions: {\r\n input: resolve(root, 'index.html'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Client build complete');\r\n\r\n // SSR build (if applicable)\r\n if (config.rendering.default !== 'csr') {\r\n console.log(pc.cyan('\\nBuilding server...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/server`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n ssr: true,\r\n rollupOptions: {\r\n input: resolve(root, config.build.srcDir, 'entry-server.ts'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Server build complete');\r\n }\r\n\r\n // Run adapter if configured\r\n if (config.adapter) {\r\n console.log(pc.cyan(`\\nRunning ${config.adapter.name} adapter...`));\r\n // TODO: Implement adapter execution\r\n console.log(pc.green('✓') + ` ${config.adapter.name} adapter complete`);\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\r\n\r\n console.log(`\r\n${pc.green('[OK] Build complete!')} ${pc.dim(`(${elapsedSeconds}s)`)}\r\n\r\n${pc.cyan('Output:')} ${resolve(root, outDir)}\r\n\r\n${pc.dim('To preview the build:')}\r\n ${pc.dim('$')} flight preview\r\n\r\n${pc.dim('To deploy:')}\r\n ${pc.dim('•')} Upload ${outDir}/ to your server\r\n ${pc.dim('•')} Or use your configured adapter\r\n`);\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nBuild failed:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Preview Command\r\n * \r\n * Preview production build locally.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface PreviewOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n}\r\n\r\nexport async function previewCommand(options: PreviewOptions): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight preview server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port + 1;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? false;\r\n\r\n // Dynamic import vite\r\n const { preview } = await import('vite');\r\n\r\n const server = await preview({\r\n root,\r\n preview: {\r\n port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open,\r\n },\r\n build: {\r\n outDir: config.build.outDir,\r\n },\r\n });\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight preview server ready\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://0.0.0.0:${port}/`)}` : ''}\r\n\r\n ${pc.dim('This is a preview of your production build.')}\r\n ${pc.dim('For development, use')} ${pc.bold('flight dev')}\r\n`);\r\n\r\n // Keep server running\r\n server.printUrls();\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start preview server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI Binary Entry Point\r\n */\r\n\r\nimport { run } from './index.js';\r\n\r\nrun();\r\n"],"mappings":"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","names":["pc","resolve","join","readFileSync","existsSync","pc","pc","resolve","join","existsSync","readFileSync","resolve","pc","loadConfig","pc","resolve","loadConfig","resolve","pc","loadConfig","pc","resolve","loadConfig","pc"]}
package/dist/index.js CHANGED
@@ -263,9 +263,15 @@ async function startSSRServer(vite, root, port, host) {
263
263
  let pageRouter = null;
264
264
  try {
265
265
  const { createFileRouter } = await import("@flight-framework/core/file-router");
266
+ const moduleLoader = async (filePath) => {
267
+ const relativePath = filePath.replace(root, "").replace(/\\/g, "/");
268
+ return vite.ssrLoadModule(relativePath);
269
+ };
266
270
  pageRouter = await createFileRouter({
267
271
  directory: join2(root, "src", "routes"),
268
- extensions: [".tsx", ".ts", ".jsx", ".js"]
272
+ extensions: [".tsx", ".ts", ".jsx", ".js"],
273
+ moduleLoader
274
+ // Use Vite's ssrLoadModule
269
275
  });
270
276
  console.log(pc2.green(` \u2713 Page router loaded: ${pageRouter.routes.filter((r) => r.type === "page").length} pages`));
271
277
  } catch {
package/dist/index.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"],"sourcesContent":["/**\r\n * Flight CLI - Command-line interface\r\n */\r\n\r\nimport { cac } from 'cac';\r\nimport pc from 'picocolors';\r\nimport { VERSION } from './version.js';\r\nimport { createCommand } from './commands/create.js';\r\nimport { devCommand } from './commands/dev.js';\r\nimport { buildCommand } from './commands/build.js';\r\nimport { previewCommand } from './commands/preview.js';\r\n\r\nconst cli = cac('flight');\r\n\r\n// Logo\r\nconst LOGO = `\r\n${pc.cyan(' ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗')}\r\n${pc.cyan(' ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝')}\r\n${pc.cyan(' █████╗ ██║ ██║██║ ███╗███████║ ██║ ')}\r\n${pc.cyan(' ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ ')}\r\n${pc.cyan(' ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ ')}\r\n${pc.cyan(' ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ')}\r\n \r\n ${pc.dim('The Agnostic Full-Stack Framework')}\r\n ${pc.dim('Maximum Flexibility. Zero Lock-in.')}\r\n`;\r\n\r\nexport function printLogo(): void {\r\n console.log(LOGO);\r\n}\r\n\r\n// Version\r\ncli.version(VERSION);\r\ncli.help();\r\n\r\n// Commands\r\ncli\r\n .command('create [name]', 'Create a new Flight project')\r\n .option('-t, --template <template>', 'Project template to use', { default: 'basic' })\r\n .option('--ui <framework>', 'UI framework (react, vue, svelte, solid, vanilla)')\r\n .option('--ts', 'Use TypeScript', { default: true })\r\n .option('--git', 'Initialize git repository', { default: true })\r\n .option('--install', 'Install dependencies', { default: true })\r\n .action(createCommand);\r\n\r\ncli\r\n .command('dev', 'Start development server')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .option('--https', 'Enable HTTPS')\r\n .option('--ssr', 'Enable Server-Side Rendering')\r\n .action(devCommand);\r\n\r\ncli\r\n .command('build', 'Build for production')\r\n .option('--outDir <dir>', 'Output directory')\r\n .option('--sourcemap', 'Generate source maps')\r\n .option('--minify', 'Minify output', { default: true })\r\n .action(buildCommand);\r\n\r\ncli\r\n .command('preview', 'Preview production build')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .action(previewCommand);\r\n\r\n// Parse and run\r\nexport function run(): void {\r\n try {\r\n cli.parse(process.argv, { run: false });\r\n\r\n // Show logo for help\r\n if (cli.options.help || process.argv.length <= 2) {\r\n printLogo();\r\n }\r\n\r\n cli.runMatchedCommand();\r\n } catch (error) {\r\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { VERSION };\r\n","export const VERSION = '0.0.1';\r\n","/**\r\n * Flight CLI - Create Command\r\n * \r\n * Scaffold a new Flight project using external templates.\r\n * Follows 2026 best practices: external templates, minimal CLI logic.\r\n */\r\n\r\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, copyFileSync, statSync, unlinkSync } from 'node:fs';\r\nimport { join, resolve, dirname } from 'node:path';\r\nimport { execSync } from 'node:child_process';\r\nimport { fileURLToPath } from 'node:url';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport { printLogo } from '../index.js';\r\n\r\nconst __dirname = dirname(fileURLToPath(import.meta.url));\r\nconst TEMPLATES_DIR = resolve(__dirname, '../../templates');\r\n\r\ninterface CreateOptions {\r\n template: string;\r\n ui?: string;\r\n ts: boolean;\r\n git: boolean;\r\n install: boolean;\r\n}\r\n\r\nconst UI_FRAMEWORKS = [\r\n { title: 'React', value: 'react', description: 'The library for web and native user interfaces' },\r\n { title: 'Vue', value: 'vue', description: 'The progressive JavaScript framework' },\r\n { title: 'Svelte', value: 'svelte', description: 'Cybernetically enhanced web apps' },\r\n { title: 'Solid', value: 'solid', description: 'Simple and performant reactivity' },\r\n { title: 'Preact', value: 'preact', description: 'Fast 3kB alternative to React' },\r\n { title: 'Qwik', value: 'qwik', description: 'Resumable framework with O(1) loading' },\r\n { title: 'Lit', value: 'lit', description: 'Fast, lightweight Web Components' },\r\n { title: 'Htmx', value: 'htmx', description: 'HTML over the wire, no JavaScript' },\r\n { title: 'Vanilla', value: 'vanilla', description: 'No framework, just TypeScript' },\r\n];\r\n\r\nexport async function createCommand(\r\n name: string | undefined,\r\n options: CreateOptions\r\n): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Creating a new Flight project...\\n'));\r\n\r\n // Interactive prompts\r\n let projectName = name;\r\n let uiFramework = options.ui;\r\n\r\n if (!projectName) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: 'Project name:',\r\n initial: 'my-flight-app',\r\n validate: (value: string) => {\r\n if (!value) return 'Project name is required';\r\n if (!/^[a-z0-9-_]+$/i.test(value)) return 'Invalid project name';\r\n return true;\r\n },\r\n });\r\n projectName = response.name;\r\n }\r\n\r\n if (!projectName) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n if (!uiFramework) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'ui',\r\n message: 'Choose your UI framework:',\r\n choices: UI_FRAMEWORKS,\r\n initial: 0,\r\n });\r\n uiFramework = response.ui;\r\n }\r\n\r\n if (!uiFramework) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n const projectPath = resolve(process.cwd(), projectName);\r\n\r\n // Check if directory exists and is not empty\r\n if (existsSync(projectPath)) {\r\n const files = readdirSync(projectPath);\r\n if (files.length > 0) {\r\n const response = await prompts({\r\n type: 'confirm',\r\n name: 'overwrite',\r\n message: `Directory ${projectName} is not empty. Continue anyway?`,\r\n initial: false,\r\n });\r\n if (!response.overwrite) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n }\r\n }\r\n\r\n console.log(pc.dim(`\\nCreating project in ${projectPath}...\\n`));\r\n\r\n try {\r\n // Copy templates\r\n copyTemplate(projectPath, uiFramework, projectName);\r\n console.log(pc.green('✓') + ' Project structure created');\r\n\r\n // Initialize git\r\n if (options.git) {\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n console.log(pc.green('✓') + ' Git repository initialized');\r\n } catch {\r\n console.log(pc.yellow('[!]') + ' Could not initialize git repository');\r\n }\r\n }\r\n\r\n // Install dependencies\r\n if (options.install) {\r\n console.log(pc.dim('\\nInstalling dependencies...\\n'));\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n console.log(pc.green('\\n✓') + ' Dependencies installed');\r\n } catch {\r\n console.log(pc.yellow('\\n[!]') + ' Could not install dependencies. Run `npm install` manually.');\r\n }\r\n }\r\n\r\n // Success message\r\n console.log(`\r\n${pc.green('[OK] Project created successfully!')}\r\n\r\n${pc.cyan('Next steps:')}\r\n\r\n ${pc.dim('$')} cd ${projectName}\r\n ${pc.dim('$')} ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\n${pc.dim('Your project is 100% yours:')}\r\n ${pc.dim('•')} No telemetry\r\n ${pc.dim('•')} No lock-in\r\n ${pc.dim('•')} Deploy anywhere\r\n\r\n${pc.cyan('Happy flying!')}\r\n`);\r\n } catch (error) {\r\n console.error(pc.red('Failed to create project:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction detectPackageManager(): string {\r\n if (process.env.npm_config_user_agent?.includes('pnpm')) return 'pnpm';\r\n if (process.env.npm_config_user_agent?.includes('yarn')) return 'yarn';\r\n if (process.env.npm_config_user_agent?.includes('bun')) return 'bun';\r\n return 'npm';\r\n}\r\n\r\n/**\r\n * Copy template files to project directory\r\n */\r\nfunction copyTemplate(projectPath: string, ui: string, projectName: string): void {\r\n const baseDir = join(TEMPLATES_DIR, 'base');\r\n const uiDir = join(TEMPLATES_DIR, ui);\r\n\r\n // Ensure directories exist\r\n mkdirSync(projectPath, { recursive: true });\r\n mkdirSync(join(projectPath, 'src'), { recursive: true });\r\n mkdirSync(join(projectPath, 'src/styles'), { recursive: true });\r\n mkdirSync(join(projectPath, 'public'), { recursive: true });\r\n\r\n // Variables for template substitution\r\n const vars = {\r\n '{{PROJECT_NAME}}': projectName,\r\n '{{UI_FRAMEWORK}}': ui,\r\n '{{LANGUAGE}}': 'TypeScript',\r\n };\r\n\r\n // Copy base files\r\n copyDirWithTemplates(baseDir, projectPath, vars);\r\n\r\n // Copy UI-specific files (override base if needed)\r\n copyDirWithTemplates(uiDir, projectPath, vars);\r\n\r\n // Rename special files\r\n const gitignoreSrc = join(projectPath, '_gitignore');\r\n const gitignoreDest = join(projectPath, '.gitignore');\r\n if (existsSync(gitignoreSrc)) {\r\n copyFileSync(gitignoreSrc, gitignoreDest);\r\n unlinkSync(gitignoreSrc);\r\n }\r\n}\r\n\r\n/**\r\n * Recursively copy directory, processing .template files\r\n */\r\nfunction copyDirWithTemplates(\r\n srcDir: string,\r\n destDir: string,\r\n vars: Record<string, string>\r\n): void {\r\n if (!existsSync(srcDir)) return;\r\n\r\n const entries = readdirSync(srcDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const srcPath = join(srcDir, entry.name);\r\n let destName = entry.name;\r\n let isTemplate = false;\r\n\r\n // Handle .template extension\r\n if (destName.endsWith('.template')) {\r\n destName = destName.replace('.template', '');\r\n isTemplate = true;\r\n }\r\n\r\n const destPath = join(destDir, destName);\r\n\r\n if (entry.isDirectory()) {\r\n mkdirSync(destPath, { recursive: true });\r\n copyDirWithTemplates(srcPath, destPath, vars);\r\n } else {\r\n let content = readFileSync(srcPath, 'utf-8');\r\n\r\n // Apply template substitutions\r\n if (isTemplate || destName.endsWith('.json') || destName.endsWith('.html') || destName.endsWith('.md')) {\r\n for (const [key, value] of Object.entries(vars)) {\r\n content = content.replaceAll(key, value);\r\n }\r\n }\r\n\r\n writeFileSync(destPath, content);\r\n }\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Dev Command (SSR Enhanced)\r\n * \r\n * Start the development server with:\r\n * - Server-Side Rendering (renderToPipeableStream)\r\n * - Vite for HMR and asset transformation\r\n * - @flight-framework/http integration\r\n */\r\n\r\nimport { resolve, join } from 'node:path';\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface DevOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n https?: boolean;\r\n ssr?: boolean;\r\n}\r\n\r\nexport async function devCommand(options: DevOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight development server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n // Merge CLI options with config\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? config.dev.open;\r\n\r\n // Check if SSR mode is enabled\r\n const ssrEnabled = options.ssr ?? config.rendering?.default === 'ssr';\r\n const entryServerPath = join(root, 'src', 'entry-server.tsx');\r\n const hasSSREntry = existsSync(entryServerPath);\r\n\r\n // Dynamic import vite to avoid bundling issues\r\n const { createServer: createViteServer } = await import('vite');\r\n\r\n // Try to import Flight HTTP and file router\r\n let flightHttpAvailable = false;\r\n let flightRouterAvailable = false;\r\n\r\n try {\r\n await import('@flight-framework/http');\r\n flightHttpAvailable = true;\r\n } catch {\r\n // @flight-framework/http not installed\r\n }\r\n\r\n try {\r\n await import('@flight-framework/core/file-router');\r\n flightRouterAvailable = true;\r\n } catch {\r\n // file-router not available\r\n }\r\n\r\n // Create Vite dev server in middleware mode for SSR\r\n const vite = await createViteServer({\r\n root,\r\n mode: 'development',\r\n server: {\r\n middlewareMode: ssrEnabled && hasSSREntry,\r\n port: ssrEnabled && hasSSREntry ? undefined : port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open: ssrEnabled && hasSSREntry ? false : open,\r\n https: options.https ? {} : undefined,\r\n },\r\n appType: ssrEnabled && hasSSREntry ? 'custom' : 'spa',\r\n plugins: [\r\n // Add Flight plugin when @flight-framework/http is available\r\n flightHttpAvailable ? flightDevPlugin(root) : null,\r\n ].filter(Boolean),\r\n });\r\n\r\n // SSR Mode with custom server\r\n if (ssrEnabled && hasSSREntry) {\r\n await startSSRServer(vite, root, port, host);\r\n } else {\r\n // CSR Mode - standard Vite server\r\n await vite.listen();\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const isSSR = ssrEnabled && hasSSREntry;\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight dev server ready in ${pc.bold(elapsed + 'ms')}\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://${getNetworkAddress()}:${port}/`)}` : ''}\r\n \r\n ${isSSR ? pc.green('✓') : pc.yellow('○')} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}\r\n ${flightHttpAvailable ? pc.green('✓') : pc.yellow('○')} @flight-framework/http ${flightHttpAvailable ? 'enabled' : 'not installed'}\r\n ${flightRouterAvailable ? pc.green('✓') : pc.yellow('○')} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}\r\n\r\n ${pc.dim('press')} ${pc.bold('h')} ${pc.dim('to show help')}\r\n`);\r\n\r\n // Handle server shortcuts\r\n if (!isSSR) {\r\n vite.bindCLIShortcuts({ print: true });\r\n }\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start dev server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Start SSR server with Vite middleware and file-based page routing\r\n */\r\nasync function startSSRServer(\r\n vite: any,\r\n root: string,\r\n port: number,\r\n host: string | boolean\r\n): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n // Try to load file-based page router\r\n let pageRouter: any = null;\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n pageRouter = await createFileRouter({\r\n directory: join(root, 'src', 'routes'),\r\n extensions: ['.tsx', '.ts', '.jsx', '.js']\r\n });\r\n console.log(pc.green(` ✓ Page router loaded: ${pageRouter.routes.filter((r: any) => r.type === 'page').length} pages`));\r\n } catch {\r\n // File router not available, use entry-server only\r\n }\r\n\r\n // Create a simple connect-like middleware handler\r\n const server = createHttpServer(async (req, res) => {\r\n const url = req.url || '/';\r\n const pathname = url.split('?')[0];\r\n\r\n // Let Vite handle HMR and static assets\r\n if (url.startsWith('/@') ||\r\n url.startsWith('/node_modules') ||\r\n (url.startsWith('/src') && !url.includes('entry-server'))) {\r\n vite.middlewares(req, res);\r\n return;\r\n }\r\n\r\n try {\r\n // 1. Read index.html template\r\n let template = readFileSync(\r\n join(root, 'index.html'),\r\n 'utf-8'\r\n );\r\n\r\n // 2. Apply Vite HTML transforms (HMR client injection)\r\n template = await vite.transformIndexHtml(url, template);\r\n\r\n let appHtml = '';\r\n\r\n // 3. Try file-based page routing first\r\n if (pageRouter) {\r\n const pageRoute = pageRouter.routes.find((r: any) =>\r\n r.type === 'page' && matchPath(r.path, pathname)\r\n );\r\n\r\n if (pageRoute && pageRoute.component) {\r\n // Load component via Vite for HMR\r\n const mod = await vite.ssrLoadModule(pageRoute.filePath.replace(root, ''));\r\n const Component = mod.default;\r\n\r\n // Get render function for the UI framework\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n\r\n if (typeof render === 'function' && Component) {\r\n appHtml = await render(url, { Component });\r\n }\r\n }\r\n }\r\n\r\n // 4. Fallback to entry-server.tsx if no page matched\r\n if (!appHtml) {\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n if (typeof render === 'function') {\r\n appHtml = await render(url);\r\n }\r\n }\r\n\r\n // 5. Inject rendered app into template\r\n if (appHtml) {\r\n const html = template.replace('<!--ssr-outlet-->', appHtml);\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(html);\r\n } else {\r\n // Fallback to CSR if no render\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(template);\r\n }\r\n\r\n } catch (e: any) {\r\n // Fix Vite stack trace\r\n vite.ssrFixStacktrace(e);\r\n console.error(pc.red('[SSR Error]'), e.stack);\r\n\r\n if (!res.headersSent) {\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end(`SSR Error: ${e.message}\\n\\n${e.stack}`);\r\n }\r\n }\r\n });\r\n\r\n const listenHost = host === true ? '0.0.0.0' : (host || 'localhost');\r\n\r\n server.listen(port, listenHost as string, () => {\r\n console.log(pc.green(` ✓ SSR server listening`));\r\n });\r\n}\r\n\r\n/**\r\n * Flight development plugin for Vite\r\n */\r\nfunction flightDevPlugin(root: string) {\r\n return {\r\n name: 'flight:dev',\r\n\r\n configureServer(server: any) {\r\n // Add middleware to handle Flight API routes\r\n server.middlewares.use(async (req: any, res: any, next: any) => {\r\n const url = req.url || '/';\r\n\r\n // Handle Flight action requests\r\n if (url.startsWith('/__flight_action/')) {\r\n try {\r\n const { handleActionRequest } = await import('@flight-framework/core');\r\n\r\n // Convert Node request to Web Request\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await handleActionRequest(webRequest);\r\n\r\n // Write response\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n } catch (error) {\r\n console.error('[Flight] Action error:', error);\r\n res.statusCode = 500;\r\n res.end(JSON.stringify({ error: 'Internal server error' }));\r\n }\r\n return;\r\n }\r\n\r\n // Handle API routes from file-router\r\n if (url.startsWith('/api/')) {\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n const routesDir = join(root, 'src', 'routes');\r\n\r\n const router = await createFileRouter({ directory: routesDir });\r\n const route = router.routes.find(r => {\r\n // Simple path matching (production would use radix matching)\r\n return matchPath(r.path, url);\r\n });\r\n\r\n if (route && route.handler) {\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await route.handler({ req: webRequest, params: {} });\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n return;\r\n }\r\n } catch (error) {\r\n // File router not set up, continue to next middleware\r\n }\r\n }\r\n\r\n next();\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Convert Node.js request to Web Standard Request\r\n */\r\nasync function nodeToWebRequest(req: any): Promise<Request> {\r\n const host = req.headers.host || 'localhost';\r\n const protocol = 'http';\r\n const url = new URL(req.url || '/', `${protocol}://${host}`);\r\n\r\n let body: BodyInit | null = null;\r\n\r\n if (req.method !== 'GET' && req.method !== 'HEAD') {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of req) {\r\n chunks.push(chunk);\r\n }\r\n body = Buffer.concat(chunks);\r\n }\r\n\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n if (Array.isArray(value)) {\r\n for (const v of value) {\r\n headers.append(key, v);\r\n }\r\n } else {\r\n headers.set(key, value as string);\r\n }\r\n }\r\n }\r\n\r\n return new Request(url.toString(), {\r\n method: req.method || 'GET',\r\n headers,\r\n body,\r\n });\r\n}\r\n\r\n/**\r\n * Simple path matching\r\n */\r\nfunction matchPath(pattern: string, path: string): boolean {\r\n // Remove query string\r\n const cleanPath = path.split('?')[0];\r\n\r\n // Convert pattern params to regex\r\n const regexPattern = pattern\r\n .replace(/:\\w+/g, '[^/]+')\r\n .replace(/\\*/g, '.*');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(cleanPath || '/');\r\n}\r\n\r\nfunction getNetworkAddress(): string {\r\n try {\r\n const { networkInterfaces } = require('os');\r\n const nets = networkInterfaces();\r\n\r\n for (const name of Object.keys(nets)) {\r\n for (const net of nets[name]) {\r\n if (net.family === 'IPv4' && !net.internal) {\r\n return net.address;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore\r\n }\r\n return '0.0.0.0';\r\n}\r\n\r\n","/**\r\n * Flight CLI - Build Command\r\n * \r\n * Build for production.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface BuildOptions {\r\n outDir?: string;\r\n sourcemap?: boolean;\r\n minify?: boolean;\r\n}\r\n\r\nexport async function buildCommand(options: BuildOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Building Flight project for production...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const outDir = options.outDir ?? config.build.outDir;\r\n const sourcemap = options.sourcemap ?? config.build.sourcemap;\r\n const minify = options.minify ?? config.build.minify;\r\n\r\n // Dynamic import vite\r\n const { build } = await import('vite');\r\n\r\n console.log(pc.dim(`Output directory: ${outDir}`));\r\n console.log(pc.dim(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`));\r\n console.log(pc.dim(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`));\r\n\r\n // Client build\r\n console.log(pc.cyan('Building client...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/client`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n rollupOptions: {\r\n input: resolve(root, 'index.html'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Client build complete');\r\n\r\n // SSR build (if applicable)\r\n if (config.rendering.default !== 'csr') {\r\n console.log(pc.cyan('\\nBuilding server...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/server`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n ssr: true,\r\n rollupOptions: {\r\n input: resolve(root, config.build.srcDir, 'entry-server.ts'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Server build complete');\r\n }\r\n\r\n // Run adapter if configured\r\n if (config.adapter) {\r\n console.log(pc.cyan(`\\nRunning ${config.adapter.name} adapter...`));\r\n // TODO: Implement adapter execution\r\n console.log(pc.green('✓') + ` ${config.adapter.name} adapter complete`);\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\r\n\r\n console.log(`\r\n${pc.green('[OK] Build complete!')} ${pc.dim(`(${elapsedSeconds}s)`)}\r\n\r\n${pc.cyan('Output:')} ${resolve(root, outDir)}\r\n\r\n${pc.dim('To preview the build:')}\r\n ${pc.dim('$')} flight preview\r\n\r\n${pc.dim('To deploy:')}\r\n ${pc.dim('•')} Upload ${outDir}/ to your server\r\n ${pc.dim('•')} Or use your configured adapter\r\n`);\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nBuild failed:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Preview Command\r\n * \r\n * Preview production build locally.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface PreviewOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n}\r\n\r\nexport async function previewCommand(options: PreviewOptions): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight preview server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port + 1;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? false;\r\n\r\n // Dynamic import vite\r\n const { preview } = await import('vite');\r\n\r\n const server = await preview({\r\n root,\r\n preview: {\r\n port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open,\r\n },\r\n build: {\r\n outDir: config.build.outDir,\r\n },\r\n });\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight preview server ready\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://0.0.0.0:${port}/`)}` : ''}\r\n\r\n ${pc.dim('This is a preview of your production build.')}\r\n ${pc.dim('For development, use')} ${pc.bold('flight dev')}\r\n`);\r\n\r\n // Keep server running\r\n server.printUrls();\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start preview server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n"],"mappings":"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","names":["pc","resolve","join","readFileSync","existsSync","pc","pc","resolve","join","existsSync","readFileSync","resolve","pc","loadConfig","pc","resolve","loadConfig","resolve","pc","loadConfig","pc","resolve","loadConfig","pc"]}
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"],"sourcesContent":["/**\r\n * Flight CLI - Command-line interface\r\n */\r\n\r\nimport { cac } from 'cac';\r\nimport pc from 'picocolors';\r\nimport { VERSION } from './version.js';\r\nimport { createCommand } from './commands/create.js';\r\nimport { devCommand } from './commands/dev.js';\r\nimport { buildCommand } from './commands/build.js';\r\nimport { previewCommand } from './commands/preview.js';\r\n\r\nconst cli = cac('flight');\r\n\r\n// Logo\r\nconst LOGO = `\r\n${pc.cyan(' ███████╗██╗ ██╗ ██████╗ ██╗ ██╗████████╗')}\r\n${pc.cyan(' ██╔════╝██║ ██║██╔════╝ ██║ ██║╚══██╔══╝')}\r\n${pc.cyan(' █████╗ ██║ ██║██║ ███╗███████║ ██║ ')}\r\n${pc.cyan(' ██╔══╝ ██║ ██║██║ ██║██╔══██║ ██║ ')}\r\n${pc.cyan(' ██║ ███████╗██║╚██████╔╝██║ ██║ ██║ ')}\r\n${pc.cyan(' ╚═╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ')}\r\n \r\n ${pc.dim('The Agnostic Full-Stack Framework')}\r\n ${pc.dim('Maximum Flexibility. Zero Lock-in.')}\r\n`;\r\n\r\nexport function printLogo(): void {\r\n console.log(LOGO);\r\n}\r\n\r\n// Version\r\ncli.version(VERSION);\r\ncli.help();\r\n\r\n// Commands\r\ncli\r\n .command('create [name]', 'Create a new Flight project')\r\n .option('-t, --template <template>', 'Project template to use', { default: 'basic' })\r\n .option('--ui <framework>', 'UI framework (react, vue, svelte, solid, vanilla)')\r\n .option('--ts', 'Use TypeScript', { default: true })\r\n .option('--git', 'Initialize git repository', { default: true })\r\n .option('--install', 'Install dependencies', { default: true })\r\n .action(createCommand);\r\n\r\ncli\r\n .command('dev', 'Start development server')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .option('--https', 'Enable HTTPS')\r\n .option('--ssr', 'Enable Server-Side Rendering')\r\n .action(devCommand);\r\n\r\ncli\r\n .command('build', 'Build for production')\r\n .option('--outDir <dir>', 'Output directory')\r\n .option('--sourcemap', 'Generate source maps')\r\n .option('--minify', 'Minify output', { default: true })\r\n .action(buildCommand);\r\n\r\ncli\r\n .command('preview', 'Preview production build')\r\n .option('-p, --port <port>', 'Port to listen on')\r\n .option('-h, --host <host>', 'Host to bind to')\r\n .option('--open', 'Open browser on start')\r\n .action(previewCommand);\r\n\r\n// Parse and run\r\nexport function run(): void {\r\n try {\r\n cli.parse(process.argv, { run: false });\r\n\r\n // Show logo for help\r\n if (cli.options.help || process.argv.length <= 2) {\r\n printLogo();\r\n }\r\n\r\n cli.runMatchedCommand();\r\n } catch (error) {\r\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nexport { VERSION };\r\n","export const VERSION = '0.0.1';\r\n","/**\r\n * Flight CLI - Create Command\r\n * \r\n * Scaffold a new Flight project using external templates.\r\n * Follows 2026 best practices: external templates, minimal CLI logic.\r\n */\r\n\r\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, copyFileSync, statSync, unlinkSync } from 'node:fs';\r\nimport { join, resolve, dirname } from 'node:path';\r\nimport { execSync } from 'node:child_process';\r\nimport { fileURLToPath } from 'node:url';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport { printLogo } from '../index.js';\r\n\r\nconst __dirname = dirname(fileURLToPath(import.meta.url));\r\nconst TEMPLATES_DIR = resolve(__dirname, '../../templates');\r\n\r\ninterface CreateOptions {\r\n template: string;\r\n ui?: string;\r\n ts: boolean;\r\n git: boolean;\r\n install: boolean;\r\n}\r\n\r\nconst UI_FRAMEWORKS = [\r\n { title: 'React', value: 'react', description: 'The library for web and native user interfaces' },\r\n { title: 'Vue', value: 'vue', description: 'The progressive JavaScript framework' },\r\n { title: 'Svelte', value: 'svelte', description: 'Cybernetically enhanced web apps' },\r\n { title: 'Solid', value: 'solid', description: 'Simple and performant reactivity' },\r\n { title: 'Preact', value: 'preact', description: 'Fast 3kB alternative to React' },\r\n { title: 'Qwik', value: 'qwik', description: 'Resumable framework with O(1) loading' },\r\n { title: 'Lit', value: 'lit', description: 'Fast, lightweight Web Components' },\r\n { title: 'Htmx', value: 'htmx', description: 'HTML over the wire, no JavaScript' },\r\n { title: 'Vanilla', value: 'vanilla', description: 'No framework, just TypeScript' },\r\n];\r\n\r\nexport async function createCommand(\r\n name: string | undefined,\r\n options: CreateOptions\r\n): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Creating a new Flight project...\\n'));\r\n\r\n // Interactive prompts\r\n let projectName = name;\r\n let uiFramework = options.ui;\r\n\r\n if (!projectName) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: 'Project name:',\r\n initial: 'my-flight-app',\r\n validate: (value: string) => {\r\n if (!value) return 'Project name is required';\r\n if (!/^[a-z0-9-_]+$/i.test(value)) return 'Invalid project name';\r\n return true;\r\n },\r\n });\r\n projectName = response.name;\r\n }\r\n\r\n if (!projectName) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n if (!uiFramework) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'ui',\r\n message: 'Choose your UI framework:',\r\n choices: UI_FRAMEWORKS,\r\n initial: 0,\r\n });\r\n uiFramework = response.ui;\r\n }\r\n\r\n if (!uiFramework) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n\r\n const projectPath = resolve(process.cwd(), projectName);\r\n\r\n // Check if directory exists and is not empty\r\n if (existsSync(projectPath)) {\r\n const files = readdirSync(projectPath);\r\n if (files.length > 0) {\r\n const response = await prompts({\r\n type: 'confirm',\r\n name: 'overwrite',\r\n message: `Directory ${projectName} is not empty. Continue anyway?`,\r\n initial: false,\r\n });\r\n if (!response.overwrite) {\r\n console.log(pc.red('Project creation cancelled.'));\r\n return;\r\n }\r\n }\r\n }\r\n\r\n console.log(pc.dim(`\\nCreating project in ${projectPath}...\\n`));\r\n\r\n try {\r\n // Copy templates\r\n copyTemplate(projectPath, uiFramework, projectName);\r\n console.log(pc.green('✓') + ' Project structure created');\r\n\r\n // Initialize git\r\n if (options.git) {\r\n try {\r\n execSync('git init', { cwd: projectPath, stdio: 'ignore' });\r\n console.log(pc.green('✓') + ' Git repository initialized');\r\n } catch {\r\n console.log(pc.yellow('[!]') + ' Could not initialize git repository');\r\n }\r\n }\r\n\r\n // Install dependencies\r\n if (options.install) {\r\n console.log(pc.dim('\\nInstalling dependencies...\\n'));\r\n try {\r\n const pm = detectPackageManager();\r\n execSync(`${pm} install`, { cwd: projectPath, stdio: 'inherit' });\r\n console.log(pc.green('\\n✓') + ' Dependencies installed');\r\n } catch {\r\n console.log(pc.yellow('\\n[!]') + ' Could not install dependencies. Run `npm install` manually.');\r\n }\r\n }\r\n\r\n // Success message\r\n console.log(`\r\n${pc.green('[OK] Project created successfully!')}\r\n\r\n${pc.cyan('Next steps:')}\r\n\r\n ${pc.dim('$')} cd ${projectName}\r\n ${pc.dim('$')} ${options.install ? '' : 'npm install && '}npm run dev\r\n\r\n${pc.dim('Your project is 100% yours:')}\r\n ${pc.dim('•')} No telemetry\r\n ${pc.dim('•')} No lock-in\r\n ${pc.dim('•')} Deploy anywhere\r\n\r\n${pc.cyan('Happy flying!')}\r\n`);\r\n } catch (error) {\r\n console.error(pc.red('Failed to create project:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction detectPackageManager(): string {\r\n if (process.env.npm_config_user_agent?.includes('pnpm')) return 'pnpm';\r\n if (process.env.npm_config_user_agent?.includes('yarn')) return 'yarn';\r\n if (process.env.npm_config_user_agent?.includes('bun')) return 'bun';\r\n return 'npm';\r\n}\r\n\r\n/**\r\n * Copy template files to project directory\r\n */\r\nfunction copyTemplate(projectPath: string, ui: string, projectName: string): void {\r\n const baseDir = join(TEMPLATES_DIR, 'base');\r\n const uiDir = join(TEMPLATES_DIR, ui);\r\n\r\n // Ensure directories exist\r\n mkdirSync(projectPath, { recursive: true });\r\n mkdirSync(join(projectPath, 'src'), { recursive: true });\r\n mkdirSync(join(projectPath, 'src/styles'), { recursive: true });\r\n mkdirSync(join(projectPath, 'public'), { recursive: true });\r\n\r\n // Variables for template substitution\r\n const vars = {\r\n '{{PROJECT_NAME}}': projectName,\r\n '{{UI_FRAMEWORK}}': ui,\r\n '{{LANGUAGE}}': 'TypeScript',\r\n };\r\n\r\n // Copy base files\r\n copyDirWithTemplates(baseDir, projectPath, vars);\r\n\r\n // Copy UI-specific files (override base if needed)\r\n copyDirWithTemplates(uiDir, projectPath, vars);\r\n\r\n // Rename special files\r\n const gitignoreSrc = join(projectPath, '_gitignore');\r\n const gitignoreDest = join(projectPath, '.gitignore');\r\n if (existsSync(gitignoreSrc)) {\r\n copyFileSync(gitignoreSrc, gitignoreDest);\r\n unlinkSync(gitignoreSrc);\r\n }\r\n}\r\n\r\n/**\r\n * Recursively copy directory, processing .template files\r\n */\r\nfunction copyDirWithTemplates(\r\n srcDir: string,\r\n destDir: string,\r\n vars: Record<string, string>\r\n): void {\r\n if (!existsSync(srcDir)) return;\r\n\r\n const entries = readdirSync(srcDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const srcPath = join(srcDir, entry.name);\r\n let destName = entry.name;\r\n let isTemplate = false;\r\n\r\n // Handle .template extension\r\n if (destName.endsWith('.template')) {\r\n destName = destName.replace('.template', '');\r\n isTemplate = true;\r\n }\r\n\r\n const destPath = join(destDir, destName);\r\n\r\n if (entry.isDirectory()) {\r\n mkdirSync(destPath, { recursive: true });\r\n copyDirWithTemplates(srcPath, destPath, vars);\r\n } else {\r\n let content = readFileSync(srcPath, 'utf-8');\r\n\r\n // Apply template substitutions\r\n if (isTemplate || destName.endsWith('.json') || destName.endsWith('.html') || destName.endsWith('.md')) {\r\n for (const [key, value] of Object.entries(vars)) {\r\n content = content.replaceAll(key, value);\r\n }\r\n }\r\n\r\n writeFileSync(destPath, content);\r\n }\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Dev Command (SSR Enhanced)\r\n * \r\n * Start the development server with:\r\n * - Server-Side Rendering (renderToPipeableStream)\r\n * - Vite for HMR and asset transformation\r\n * - @flight-framework/http integration\r\n */\r\n\r\nimport { resolve, join } from 'node:path';\r\nimport { readFileSync, existsSync } from 'node:fs';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface DevOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n https?: boolean;\r\n ssr?: boolean;\r\n}\r\n\r\nexport async function devCommand(options: DevOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight development server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n // Merge CLI options with config\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? config.dev.open;\r\n\r\n // Check if SSR mode is enabled\r\n const ssrEnabled = options.ssr ?? config.rendering?.default === 'ssr';\r\n const entryServerPath = join(root, 'src', 'entry-server.tsx');\r\n const hasSSREntry = existsSync(entryServerPath);\r\n\r\n // Dynamic import vite to avoid bundling issues\r\n const { createServer: createViteServer } = await import('vite');\r\n\r\n // Try to import Flight HTTP and file router\r\n let flightHttpAvailable = false;\r\n let flightRouterAvailable = false;\r\n\r\n try {\r\n await import('@flight-framework/http');\r\n flightHttpAvailable = true;\r\n } catch {\r\n // @flight-framework/http not installed\r\n }\r\n\r\n try {\r\n await import('@flight-framework/core/file-router');\r\n flightRouterAvailable = true;\r\n } catch {\r\n // file-router not available\r\n }\r\n\r\n // Create Vite dev server in middleware mode for SSR\r\n const vite = await createViteServer({\r\n root,\r\n mode: 'development',\r\n server: {\r\n middlewareMode: ssrEnabled && hasSSREntry,\r\n port: ssrEnabled && hasSSREntry ? undefined : port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open: ssrEnabled && hasSSREntry ? false : open,\r\n https: options.https ? {} : undefined,\r\n },\r\n appType: ssrEnabled && hasSSREntry ? 'custom' : 'spa',\r\n plugins: [\r\n // Add Flight plugin when @flight-framework/http is available\r\n flightHttpAvailable ? flightDevPlugin(root) : null,\r\n ].filter(Boolean),\r\n });\r\n\r\n // SSR Mode with custom server\r\n if (ssrEnabled && hasSSREntry) {\r\n await startSSRServer(vite, root, port, host);\r\n } else {\r\n // CSR Mode - standard Vite server\r\n await vite.listen();\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const isSSR = ssrEnabled && hasSSREntry;\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight dev server ready in ${pc.bold(elapsed + 'ms')}\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://${getNetworkAddress()}:${port}/`)}` : ''}\r\n \r\n ${isSSR ? pc.green('✓') : pc.yellow('○')} SSR ${isSSR ? 'enabled (streaming)' : 'disabled (CSR mode)'}\r\n ${flightHttpAvailable ? pc.green('✓') : pc.yellow('○')} @flight-framework/http ${flightHttpAvailable ? 'enabled' : 'not installed'}\r\n ${flightRouterAvailable ? pc.green('✓') : pc.yellow('○')} File-based routing ${flightRouterAvailable ? 'enabled' : 'not available'}\r\n\r\n ${pc.dim('press')} ${pc.bold('h')} ${pc.dim('to show help')}\r\n`);\r\n\r\n // Handle server shortcuts\r\n if (!isSSR) {\r\n vite.bindCLIShortcuts({ print: true });\r\n }\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start dev server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\n/**\r\n * Start SSR server with Vite middleware and file-based page routing\r\n */\r\nasync function startSSRServer(\r\n vite: any,\r\n root: string,\r\n port: number,\r\n host: string | boolean\r\n): Promise<void> {\r\n const { createServer: createHttpServer } = await import('node:http');\r\n\r\n // Try to load file-based page router\r\n let pageRouter: any = null;\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n\r\n // Create module loader that uses Vite's ssrLoadModule for TSX support\r\n const moduleLoader = async (filePath: string) => {\r\n // Convert absolute path to relative for Vite\r\n const relativePath = filePath.replace(root, '').replace(/\\\\/g, '/');\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 // Let Vite handle HMR and static assets\r\n if (url.startsWith('/@') ||\r\n url.startsWith('/node_modules') ||\r\n (url.startsWith('/src') && !url.includes('entry-server'))) {\r\n vite.middlewares(req, res);\r\n return;\r\n }\r\n\r\n try {\r\n // 1. Read index.html template\r\n let template = readFileSync(\r\n join(root, 'index.html'),\r\n 'utf-8'\r\n );\r\n\r\n // 2. Apply Vite HTML transforms (HMR client injection)\r\n template = await vite.transformIndexHtml(url, template);\r\n\r\n let appHtml = '';\r\n\r\n // 3. Try file-based page routing first\r\n if (pageRouter) {\r\n const pageRoute = pageRouter.routes.find((r: any) =>\r\n r.type === 'page' && matchPath(r.path, pathname)\r\n );\r\n\r\n if (pageRoute && pageRoute.component) {\r\n // Load component via Vite for HMR\r\n const mod = await vite.ssrLoadModule(pageRoute.filePath.replace(root, ''));\r\n const Component = mod.default;\r\n\r\n // Get render function for the UI framework\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n\r\n if (typeof render === 'function' && Component) {\r\n appHtml = await render(url, { Component });\r\n }\r\n }\r\n }\r\n\r\n // 4. Fallback to entry-server.tsx if no page matched\r\n if (!appHtml) {\r\n const { render } = await vite.ssrLoadModule('/src/entry-server.tsx');\r\n if (typeof render === 'function') {\r\n appHtml = await render(url);\r\n }\r\n }\r\n\r\n // 5. Inject rendered app into template\r\n if (appHtml) {\r\n const html = template.replace('<!--ssr-outlet-->', appHtml);\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(html);\r\n } else {\r\n // Fallback to CSR if no render\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(template);\r\n }\r\n\r\n } catch (e: any) {\r\n // Fix Vite stack trace\r\n vite.ssrFixStacktrace(e);\r\n console.error(pc.red('[SSR Error]'), e.stack);\r\n\r\n if (!res.headersSent) {\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end(`SSR Error: ${e.message}\\n\\n${e.stack}`);\r\n }\r\n }\r\n });\r\n\r\n const listenHost = host === true ? '0.0.0.0' : (host || 'localhost');\r\n\r\n server.listen(port, listenHost as string, () => {\r\n console.log(pc.green(` ✓ SSR server listening`));\r\n });\r\n}\r\n\r\n/**\r\n * Flight development plugin for Vite\r\n */\r\nfunction flightDevPlugin(root: string) {\r\n return {\r\n name: 'flight:dev',\r\n\r\n configureServer(server: any) {\r\n // Add middleware to handle Flight API routes\r\n server.middlewares.use(async (req: any, res: any, next: any) => {\r\n const url = req.url || '/';\r\n\r\n // Handle Flight action requests\r\n if (url.startsWith('/__flight_action/')) {\r\n try {\r\n const { handleActionRequest } = await import('@flight-framework/core');\r\n\r\n // Convert Node request to Web Request\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await handleActionRequest(webRequest);\r\n\r\n // Write response\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n } catch (error) {\r\n console.error('[Flight] Action error:', error);\r\n res.statusCode = 500;\r\n res.end(JSON.stringify({ error: 'Internal server error' }));\r\n }\r\n return;\r\n }\r\n\r\n // Handle API routes from file-router\r\n if (url.startsWith('/api/')) {\r\n try {\r\n const { createFileRouter } = await import('@flight-framework/core/file-router');\r\n const routesDir = join(root, 'src', 'routes');\r\n\r\n const router = await createFileRouter({ directory: routesDir });\r\n const route = router.routes.find(r => {\r\n // Simple path matching (production would use radix matching)\r\n return matchPath(r.path, url);\r\n });\r\n\r\n if (route && route.handler) {\r\n const webRequest = await nodeToWebRequest(req);\r\n const response = await route.handler({ req: webRequest, params: {} });\r\n\r\n res.statusCode = response.status;\r\n response.headers.forEach((value: string, key: string) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const body = await response.text();\r\n res.end(body);\r\n return;\r\n }\r\n } catch (error) {\r\n // File router not set up, continue to next middleware\r\n }\r\n }\r\n\r\n next();\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Convert Node.js request to Web Standard Request\r\n */\r\nasync function nodeToWebRequest(req: any): Promise<Request> {\r\n const host = req.headers.host || 'localhost';\r\n const protocol = 'http';\r\n const url = new URL(req.url || '/', `${protocol}://${host}`);\r\n\r\n let body: BodyInit | null = null;\r\n\r\n if (req.method !== 'GET' && req.method !== 'HEAD') {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of req) {\r\n chunks.push(chunk);\r\n }\r\n body = Buffer.concat(chunks);\r\n }\r\n\r\n const headers = new Headers();\r\n for (const [key, value] of Object.entries(req.headers)) {\r\n if (value) {\r\n if (Array.isArray(value)) {\r\n for (const v of value) {\r\n headers.append(key, v);\r\n }\r\n } else {\r\n headers.set(key, value as string);\r\n }\r\n }\r\n }\r\n\r\n return new Request(url.toString(), {\r\n method: req.method || 'GET',\r\n headers,\r\n body,\r\n });\r\n}\r\n\r\n/**\r\n * Simple path matching\r\n */\r\nfunction matchPath(pattern: string, path: string): boolean {\r\n // Remove query string\r\n const cleanPath = path.split('?')[0];\r\n\r\n // Convert pattern params to regex\r\n const regexPattern = pattern\r\n .replace(/:\\w+/g, '[^/]+')\r\n .replace(/\\*/g, '.*');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(cleanPath || '/');\r\n}\r\n\r\nfunction getNetworkAddress(): string {\r\n try {\r\n const { networkInterfaces } = require('os');\r\n const nets = networkInterfaces();\r\n\r\n for (const name of Object.keys(nets)) {\r\n for (const net of nets[name]) {\r\n if (net.family === 'IPv4' && !net.internal) {\r\n return net.address;\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore\r\n }\r\n return '0.0.0.0';\r\n}\r\n\r\n","/**\r\n * Flight CLI - Build Command\r\n * \r\n * Build for production.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface BuildOptions {\r\n outDir?: string;\r\n sourcemap?: boolean;\r\n minify?: boolean;\r\n}\r\n\r\nexport async function buildCommand(options: BuildOptions): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n printLogo();\r\n console.log(pc.cyan('\\n[*] Building Flight project for production...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const outDir = options.outDir ?? config.build.outDir;\r\n const sourcemap = options.sourcemap ?? config.build.sourcemap;\r\n const minify = options.minify ?? config.build.minify;\r\n\r\n // Dynamic import vite\r\n const { build } = await import('vite');\r\n\r\n console.log(pc.dim(`Output directory: ${outDir}`));\r\n console.log(pc.dim(`Sourcemaps: ${sourcemap ? 'enabled' : 'disabled'}`));\r\n console.log(pc.dim(`Minification: ${minify ? 'enabled' : 'disabled'}\\n`));\r\n\r\n // Client build\r\n console.log(pc.cyan('Building client...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/client`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n rollupOptions: {\r\n input: resolve(root, 'index.html'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Client build complete');\r\n\r\n // SSR build (if applicable)\r\n if (config.rendering.default !== 'csr') {\r\n console.log(pc.cyan('\\nBuilding server...'));\r\n await build({\r\n root,\r\n mode: 'production',\r\n build: {\r\n outDir: `${outDir}/server`,\r\n sourcemap,\r\n minify: minify ? 'esbuild' : false,\r\n ssr: true,\r\n rollupOptions: {\r\n input: resolve(root, config.build.srcDir, 'entry-server.ts'),\r\n },\r\n },\r\n });\r\n console.log(pc.green('✓') + ' Server build complete');\r\n }\r\n\r\n // Run adapter if configured\r\n if (config.adapter) {\r\n console.log(pc.cyan(`\\nRunning ${config.adapter.name} adapter...`));\r\n // TODO: Implement adapter execution\r\n console.log(pc.green('✓') + ` ${config.adapter.name} adapter complete`);\r\n }\r\n\r\n const elapsed = Date.now() - startTime;\r\n const elapsedSeconds = (elapsed / 1000).toFixed(2);\r\n\r\n console.log(`\r\n${pc.green('[OK] Build complete!')} ${pc.dim(`(${elapsedSeconds}s)`)}\r\n\r\n${pc.cyan('Output:')} ${resolve(root, outDir)}\r\n\r\n${pc.dim('To preview the build:')}\r\n ${pc.dim('$')} flight preview\r\n\r\n${pc.dim('To deploy:')}\r\n ${pc.dim('•')} Upload ${outDir}/ to your server\r\n ${pc.dim('•')} Or use your configured adapter\r\n`);\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nBuild failed:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n","/**\r\n * Flight CLI - Preview Command\r\n * \r\n * Preview production build locally.\r\n */\r\n\r\nimport { resolve } from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { loadConfig } from '@flight-framework/core/config';\r\nimport { printLogo } from '../index.js';\r\n\r\ninterface PreviewOptions {\r\n port?: string;\r\n host?: string;\r\n open?: boolean;\r\n}\r\n\r\nexport async function previewCommand(options: PreviewOptions): Promise<void> {\r\n printLogo();\r\n console.log(pc.cyan('\\n✈️ Starting Flight preview server...\\n'));\r\n\r\n try {\r\n // Load config\r\n const root = resolve(process.cwd());\r\n const config = await loadConfig(root);\r\n\r\n const port = options.port ? parseInt(options.port, 10) : config.dev.port + 1;\r\n const host = options.host ?? config.dev.host;\r\n const open = options.open ?? false;\r\n\r\n // Dynamic import vite\r\n const { preview } = await import('vite');\r\n\r\n const server = await preview({\r\n root,\r\n preview: {\r\n port,\r\n host: host === true ? '0.0.0.0' : host,\r\n open,\r\n },\r\n build: {\r\n outDir: config.build.outDir,\r\n },\r\n });\r\n\r\n console.log(`\r\n ${pc.green('✓')} Flight preview server ready\r\n\r\n ${pc.cyan('➜')} Local: ${pc.cyan(`http://localhost:${port}/`)}\r\n ${host === true || host === '0.0.0.0' ? ` ${pc.cyan('➜')} Network: ${pc.cyan(`http://0.0.0.0:${port}/`)}` : ''}\r\n\r\n ${pc.dim('This is a preview of your production build.')}\r\n ${pc.dim('For development, use')} ${pc.bold('flight dev')}\r\n`);\r\n\r\n // Keep server running\r\n server.printUrls();\r\n\r\n } catch (error) {\r\n console.error(pc.red('\\nFailed to start preview server:'), error);\r\n process.exit(1);\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;AAIA,SAAS,WAAW;AACpB,OAAOA,SAAQ;;;ACLR,IAAM,UAAU;;;ACOvB,SAAS,YAAY,WAAW,aAAa,cAAc,eAAe,cAAwB,kBAAkB;AACpH,SAAS,MAAM,SAAS,eAAe;AACvC,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,OAAO,aAAa;AAGpB,IAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,IAAM,gBAAgB,QAAQ,WAAW,iBAAiB;AAU1D,IAAM,gBAAgB;AAAA,EAClB,EAAE,OAAO,SAAS,OAAO,SAAS,aAAa,iDAAiD;AAAA,EAChG,EAAE,OAAO,OAAO,OAAO,OAAO,aAAa,uCAAuC;AAAA,EAClF,EAAE,OAAO,UAAU,OAAO,UAAU,aAAa,mCAAmC;AAAA,EACpF,EAAE,OAAO,SAAS,OAAO,SAAS,aAAa,mCAAmC;AAAA,EAClF,EAAE,OAAO,UAAU,OAAO,UAAU,aAAa,gCAAgC;AAAA,EACjF,EAAE,OAAO,QAAQ,OAAO,QAAQ,aAAa,wCAAwC;AAAA,EACrF,EAAE,OAAO,OAAO,OAAO,OAAO,aAAa,mCAAmC;AAAA,EAC9E,EAAE,OAAO,QAAQ,OAAO,QAAQ,aAAa,oCAAoC;AAAA,EACjF,EAAE,OAAO,WAAW,OAAO,WAAW,aAAa,gCAAgC;AACvF;AAEA,eAAsB,cAClB,MACA,SACa;AACb,YAAU;AACV,UAAQ,IAAI,GAAG,KAAK,0CAA0C,CAAC;AAG/D,MAAI,cAAc;AAClB,MAAI,cAAc,QAAQ;AAE1B,MAAI,CAAC,aAAa;AACd,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC3B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU,CAAC,UAAkB;AACzB,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI,CAAC,iBAAiB,KAAK,KAAK,EAAG,QAAO;AAC1C,eAAO;AAAA,MACX;AAAA,IACJ,CAAC;AACD,kBAAc,SAAS;AAAA,EAC3B;AAEA,MAAI,CAAC,aAAa;AACd,YAAQ,IAAI,GAAG,IAAI,6BAA6B,CAAC;AACjD;AAAA,EACJ;AAEA,MAAI,CAAC,aAAa;AACd,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC3B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AACD,kBAAc,SAAS;AAAA,EAC3B;AAEA,MAAI,CAAC,aAAa;AACd,YAAQ,IAAI,GAAG,IAAI,6BAA6B,CAAC;AACjD;AAAA,EACJ;AAEA,QAAM,cAAc,QAAQ,QAAQ,IAAI,GAAG,WAAW;AAGtD,MAAI,WAAW,WAAW,GAAG;AACzB,UAAM,QAAQ,YAAY,WAAW;AACrC,QAAI,MAAM,SAAS,GAAG;AAClB,YAAM,WAAW,MAAM,QAAQ;AAAA,QAC3B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,aAAa,WAAW;AAAA,QACjC,SAAS;AAAA,MACb,CAAC;AACD,UAAI,CAAC,SAAS,WAAW;AACrB,gBAAQ,IAAI,GAAG,IAAI,6BAA6B,CAAC;AACjD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,UAAQ,IAAI,GAAG,IAAI;AAAA,sBAAyB,WAAW;AAAA,CAAO,CAAC;AAE/D,MAAI;AAEA,iBAAa,aAAa,aAAa,WAAW;AAClD,YAAQ,IAAI,GAAG,MAAM,QAAG,IAAI,4BAA4B;AAGxD,QAAI,QAAQ,KAAK;AACb,UAAI;AACA,iBAAS,YAAY,EAAE,KAAK,aAAa,OAAO,SAAS,CAAC;AAC1D,gBAAQ,IAAI,GAAG,MAAM,QAAG,IAAI,6BAA6B;AAAA,MAC7D,QAAQ;AACJ,gBAAQ,IAAI,GAAG,OAAO,KAAK,IAAI,sCAAsC;AAAA,MACzE;AAAA,IACJ;AAGA,QAAI,QAAQ,SAAS;AACjB,cAAQ,IAAI,GAAG,IAAI,gCAAgC,CAAC;AACpD,UAAI;AACA,cAAM,KAAK,qBAAqB;AAChC,iBAAS,GAAG,EAAE,YAAY,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAChE,gBAAQ,IAAI,GAAG,MAAM,UAAK,IAAI,yBAAyB;AAAA,MAC3D,QAAQ;AACJ,gBAAQ,IAAI,GAAG,OAAO,OAAO,IAAI,8DAA8D;AAAA,MACnG;AAAA,IACJ;AAGA,YAAQ,IAAI;AAAA,EAClB,GAAG,MAAM,oCAAoC,CAAC;AAAA;AAAA,EAE9C,GAAG,KAAK,aAAa,CAAC;AAAA;AAAA,IAEpB,GAAG,IAAI,GAAG,CAAC,OAAO,WAAW;AAAA,IAC7B,GAAG,IAAI,GAAG,CAAC,IAAI,QAAQ,UAAU,KAAK,iBAAiB;AAAA;AAAA,EAEzD,GAAG,IAAI,6BAA6B,CAAC;AAAA,IACnC,GAAG,IAAI,QAAG,CAAC;AAAA,IACX,GAAG,IAAI,QAAG,CAAC;AAAA,IACX,GAAG,IAAI,QAAG,CAAC;AAAA;AAAA,EAEb,GAAG,KAAK,eAAe,CAAC;AAAA,CACzB;AAAA,EACG,SAAS,OAAO;AACZ,YAAQ,MAAM,GAAG,IAAI,2BAA2B,GAAG,KAAK;AACxD,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAEA,SAAS,uBAA+B;AACpC,MAAI,QAAQ,IAAI,uBAAuB,SAAS,MAAM,EAAG,QAAO;AAChE,MAAI,QAAQ,IAAI,uBAAuB,SAAS,MAAM,EAAG,QAAO;AAChE,MAAI,QAAQ,IAAI,uBAAuB,SAAS,KAAK,EAAG,QAAO;AAC/D,SAAO;AACX;AAKA,SAAS,aAAa,aAAqB,IAAY,aAA2B;AAC9E,QAAM,UAAU,KAAK,eAAe,MAAM;AAC1C,QAAM,QAAQ,KAAK,eAAe,EAAE;AAGpC,YAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC1C,YAAU,KAAK,aAAa,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,YAAU,KAAK,aAAa,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,YAAU,KAAK,aAAa,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAG1D,QAAM,OAAO;AAAA,IACT,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,EACpB;AAGA,uBAAqB,SAAS,aAAa,IAAI;AAG/C,uBAAqB,OAAO,aAAa,IAAI;AAG7C,QAAM,eAAe,KAAK,aAAa,YAAY;AACnD,QAAM,gBAAgB,KAAK,aAAa,YAAY;AACpD,MAAI,WAAW,YAAY,GAAG;AAC1B,iBAAa,cAAc,aAAa;AACxC,eAAW,YAAY;AAAA,EAC3B;AACJ;AAKA,SAAS,qBACL,QACA,SACA,MACI;AACJ,MAAI,CAAC,WAAW,MAAM,EAAG;AAEzB,QAAM,UAAU,YAAY,QAAQ,EAAE,eAAe,KAAK,CAAC;AAE3D,aAAW,SAAS,SAAS;AACzB,UAAM,UAAU,KAAK,QAAQ,MAAM,IAAI;AACvC,QAAI,WAAW,MAAM;AACrB,QAAI,aAAa;AAGjB,QAAI,SAAS,SAAS,WAAW,GAAG;AAChC,iBAAW,SAAS,QAAQ,aAAa,EAAE;AAC3C,mBAAa;AAAA,IACjB;AAEA,UAAM,WAAW,KAAK,SAAS,QAAQ;AAEvC,QAAI,MAAM,YAAY,GAAG;AACrB,gBAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,2BAAqB,SAAS,UAAU,IAAI;AAAA,IAChD,OAAO;AACH,UAAI,UAAU,aAAa,SAAS,OAAO;AAG3C,UAAI,cAAc,SAAS,SAAS,OAAO,KAAK,SAAS,SAAS,OAAO,KAAK,SAAS,SAAS,KAAK,GAAG;AACpG,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC7C,oBAAU,QAAQ,WAAW,KAAK,KAAK;AAAA,QAC3C;AAAA,MACJ;AAEA,oBAAc,UAAU,OAAO;AAAA,IACnC;AAAA,EACJ;AACJ;;;ACrOA,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAC9B,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,OAAOC,SAAQ;AACf,SAAS,kBAAkB;AAW3B,eAAsB,WAAW,SAAoC;AACjE,QAAM,YAAY,KAAK,IAAI;AAE3B,YAAU;AACV,UAAQ,IAAIC,IAAG,KAAK,yDAA+C,CAAC;AAEpE,MAAI;AAEA,UAAM,OAAOC,SAAQ,QAAQ,IAAI,CAAC;AAClC,UAAM,SAAS,MAAM,WAAW,IAAI;AAGpC,UAAM,OAAO,QAAQ,OAAO,SAAS,QAAQ,MAAM,EAAE,IAAI,OAAO,IAAI;AACpE,UAAM,OAAO,QAAQ,QAAQ,OAAO,IAAI;AACxC,UAAM,OAAO,QAAQ,QAAQ,OAAO,IAAI;AAGxC,UAAM,aAAa,QAAQ,OAAO,OAAO,WAAW,YAAY;AAChE,UAAM,kBAAkBC,MAAK,MAAM,OAAO,kBAAkB;AAC5D,UAAM,cAAcC,YAAW,eAAe;AAG9C,UAAM,EAAE,cAAc,iBAAiB,IAAI,MAAM,OAAO,MAAM;AAG9D,QAAI,sBAAsB;AAC1B,QAAI,wBAAwB;AAE5B,QAAI;AACA,YAAM,OAAO,wBAAwB;AACrC,4BAAsB;AAAA,IAC1B,QAAQ;AAAA,IAER;AAEA,QAAI;AACA,YAAM,OAAO,oCAAoC;AACjD,8BAAwB;AAAA,IAC5B,QAAQ;AAAA,IAER;AAGA,UAAM,OAAO,MAAM,iBAAiB;AAAA,MAChC;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,QACJ,gBAAgB,cAAc;AAAA,QAC9B,MAAM,cAAc,cAAc,SAAY;AAAA,QAC9C,MAAM,SAAS,OAAO,YAAY;AAAA,QAClC,MAAM,cAAc,cAAc,QAAQ;AAAA,QAC1C,OAAO,QAAQ,QAAQ,CAAC,IAAI;AAAA,MAChC;AAAA,MACA,SAAS,cAAc,cAAc,WAAW;AAAA,MAChD,SAAS;AAAA;AAAA,QAEL,sBAAsB,gBAAgB,IAAI,IAAI;AAAA,MAClD,EAAE,OAAO,OAAO;AAAA,IACpB,CAAC;AAGD,QAAI,cAAc,aAAa;AAC3B,YAAM,eAAe,MAAM,MAAM,MAAM,IAAI;AAAA,IAC/C,OAAO;AAEH,YAAM,KAAK,OAAO;AAAA,IACtB;AAEA,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,UAAM,QAAQ,cAAc;AAE5B,YAAQ,IAAI;AAAA,IAChBH,IAAG,MAAM,QAAG,CAAC,+BAA+BA,IAAG,KAAK,UAAU,IAAI,CAAC;AAAA;AAAA,IAEnEA,IAAG,KAAK,QAAG,CAAC,aAAaA,IAAG,KAAK,oBAAoB,IAAI,GAAG,CAAC;AAAA,IAC7D,SAAS,QAAQ,SAAS,YAAY,KAAKA,IAAG,KAAK,QAAG,CAAC,aAAaA,IAAG,KAAK,UAAU,kBAAkB,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE;AAAA;AAAA,IAE5H,QAAQA,IAAG,MAAM,QAAG,IAAIA,IAAG,OAAO,QAAG,CAAC,QAAQ,QAAQ,wBAAwB,qBAAqB;AAAA,IACnG,sBAAsBA,IAAG,MAAM,QAAG,IAAIA,IAAG,OAAO,QAAG,CAAC,2BAA2B,sBAAsB,YAAY,eAAe;AAAA,IAChI,wBAAwBA,IAAG,MAAM,QAAG,IAAIA,IAAG,OAAO,QAAG,CAAC,uBAAuB,wBAAwB,YAAY,eAAe;AAAA;AAAA,IAEhIA,IAAG,IAAI,OAAO,CAAC,IAAIA,IAAG,KAAK,GAAG,CAAC,IAAIA,IAAG,IAAI,cAAc,CAAC;AAAA,CAC5D;AAGO,QAAI,CAAC,OAAO;AACR,WAAK,iBAAiB,EAAE,OAAO,KAAK,CAAC;AAAA,IACzC;AAAA,EAEJ,SAAS,OAAO;AACZ,YAAQ,MAAMA,IAAG,IAAI,+BAA+B,GAAG,KAAK;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAKA,eAAe,eACX,MACA,MACA,MACA,MACa;AACb,QAAM,EAAE,cAAc,iBAAiB,IAAI,MAAM,OAAO,MAAW;AAGnE,MAAI,aAAkB;AACtB,MAAI;AACA,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,oCAAoC;AAG9E,UAAM,eAAe,OAAO,aAAqB;AAE7C,YAAM,eAAe,SAAS,QAAQ,MAAM,EAAE,EAAE,QAAQ,OAAO,GAAG;AAClE,aAAO,KAAK,cAAc,YAAY;AAAA,IAC1C;AAEA,iBAAa,MAAM,iBAAiB;AAAA,MAChC,WAAWE,MAAK,MAAM,OAAO,QAAQ;AAAA,MACrC,YAAY,CAAC,QAAQ,OAAO,QAAQ,KAAK;AAAA,MACzC;AAAA;AAAA,IACJ,CAAC;AACD,YAAQ,IAAIF,IAAG,MAAM,gCAA2B,WAAW,OAAO,OAAO,CAAC,MAAW,EAAE,SAAS,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC3H,QAAQ;AAAA,EAER;AAGA,QAAM,SAAS,iBAAiB,OAAO,KAAK,QAAQ;AAChD,UAAM,MAAM,IAAI,OAAO;AACvB,UAAM,WAAW,IAAI,MAAM,GAAG,EAAE,CAAC;AAGjC,QAAI,IAAI,WAAW,IAAI,KACnB,IAAI,WAAW,eAAe,KAC7B,IAAI,WAAW,MAAM,KAAK,CAAC,IAAI,SAAS,cAAc,GAAI;AAC3D,WAAK,YAAY,KAAK,GAAG;AACzB;AAAA,IACJ;AAEA,QAAI;AAEA,UAAI,WAAWI;AAAA,QACXF,MAAK,MAAM,YAAY;AAAA,QACvB;AAAA,MACJ;AAGA,iBAAW,MAAM,KAAK,mBAAmB,KAAK,QAAQ;AAEtD,UAAI,UAAU;AAGd,UAAI,YAAY;AACZ,cAAM,YAAY,WAAW,OAAO;AAAA,UAAK,CAAC,MACtC,EAAE,SAAS,UAAU,UAAU,EAAE,MAAM,QAAQ;AAAA,QACnD;AAEA,YAAI,aAAa,UAAU,WAAW;AAElC,gBAAM,MAAM,MAAM,KAAK,cAAc,UAAU,SAAS,QAAQ,MAAM,EAAE,CAAC;AACzE,gBAAM,YAAY,IAAI;AAGtB,gBAAM,EAAE,OAAO,IAAI,MAAM,KAAK,cAAc,uBAAuB;AAEnE,cAAI,OAAO,WAAW,cAAc,WAAW;AAC3C,sBAAU,MAAM,OAAO,KAAK,EAAE,UAAU,CAAC;AAAA,UAC7C;AAAA,QACJ;AAAA,MACJ;AAGA,UAAI,CAAC,SAAS;AACV,cAAM,EAAE,OAAO,IAAI,MAAM,KAAK,cAAc,uBAAuB;AACnE,YAAI,OAAO,WAAW,YAAY;AAC9B,oBAAU,MAAM,OAAO,GAAG;AAAA,QAC9B;AAAA,MACJ;AAGA,UAAI,SAAS;AACT,cAAM,OAAO,SAAS,QAAQ,qBAAqB,OAAO;AAC1D,YAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,YAAI,IAAI,IAAI;AAAA,MAChB,OAAO;AAEH,YAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,YAAI,IAAI,QAAQ;AAAA,MACpB;AAAA,IAEJ,SAAS,GAAQ;AAEb,WAAK,iBAAiB,CAAC;AACvB,cAAQ,MAAMF,IAAG,IAAI,aAAa,GAAG,EAAE,KAAK;AAE5C,UAAI,CAAC,IAAI,aAAa;AAClB,YAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,YAAI,IAAI,cAAc,EAAE,OAAO;AAAA;AAAA,EAAO,EAAE,KAAK,EAAE;AAAA,MACnD;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,QAAM,aAAa,SAAS,OAAO,YAAa,QAAQ;AAExD,SAAO,OAAO,MAAM,YAAsB,MAAM;AAC5C,YAAQ,IAAIA,IAAG,MAAM,+BAA0B,CAAC;AAAA,EACpD,CAAC;AACL;AAKA,SAAS,gBAAgB,MAAc;AACnC,SAAO;AAAA,IACH,MAAM;AAAA,IAEN,gBAAgB,QAAa;AAEzB,aAAO,YAAY,IAAI,OAAO,KAAU,KAAU,SAAc;AAC5D,cAAM,MAAM,IAAI,OAAO;AAGvB,YAAI,IAAI,WAAW,mBAAmB,GAAG;AACrC,cAAI;AACA,kBAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,wBAAwB;AAGrE,kBAAM,aAAa,MAAM,iBAAiB,GAAG;AAC7C,kBAAM,WAAW,MAAM,oBAAoB,UAAU;AAGrD,gBAAI,aAAa,SAAS;AAC1B,qBAAS,QAAQ,QAAQ,CAAC,OAAe,QAAgB;AACrD,kBAAI,UAAU,KAAK,KAAK;AAAA,YAC5B,CAAC;AAED,kBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,gBAAI,IAAI,IAAI;AAAA,UAChB,SAAS,OAAO;AACZ,oBAAQ,MAAM,0BAA0B,KAAK;AAC7C,gBAAI,aAAa;AACjB,gBAAI,IAAI,KAAK,UAAU,EAAE,OAAO,wBAAwB,CAAC,CAAC;AAAA,UAC9D;AACA;AAAA,QACJ;AAGA,YAAI,IAAI,WAAW,OAAO,GAAG;AACzB,cAAI;AACA,kBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,oCAAoC;AAC9E,kBAAM,YAAYE,MAAK,MAAM,OAAO,QAAQ;AAE5C,kBAAM,SAAS,MAAM,iBAAiB,EAAE,WAAW,UAAU,CAAC;AAC9D,kBAAM,QAAQ,OAAO,OAAO,KAAK,OAAK;AAElC,qBAAO,UAAU,EAAE,MAAM,GAAG;AAAA,YAChC,CAAC;AAED,gBAAI,SAAS,MAAM,SAAS;AACxB,oBAAM,aAAa,MAAM,iBAAiB,GAAG;AAC7C,oBAAM,WAAW,MAAM,MAAM,QAAQ,EAAE,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;AAEpE,kBAAI,aAAa,SAAS;AAC1B,uBAAS,QAAQ,QAAQ,CAAC,OAAe,QAAgB;AACrD,oBAAI,UAAU,KAAK,KAAK;AAAA,cAC5B,CAAC;AAED,oBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,kBAAI,IAAI,IAAI;AACZ;AAAA,YACJ;AAAA,UACJ,SAAS,OAAO;AAAA,UAEhB;AAAA,QACJ;AAEA,aAAK;AAAA,MACT,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;AAKA,eAAe,iBAAiB,KAA4B;AACxD,QAAM,OAAO,IAAI,QAAQ,QAAQ;AACjC,QAAM,WAAW;AACjB,QAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,GAAG,QAAQ,MAAM,IAAI,EAAE;AAE3D,MAAI,OAAwB;AAE5B,MAAI,IAAI,WAAW,SAAS,IAAI,WAAW,QAAQ;AAC/C,UAAM,SAAmB,CAAC;AAC1B,qBAAiB,SAAS,KAAK;AAC3B,aAAO,KAAK,KAAK;AAAA,IACrB;AACA,WAAO,OAAO,OAAO,MAAM;AAAA,EAC/B;AAEA,QAAM,UAAU,IAAI,QAAQ;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACpD,QAAI,OAAO;AACP,UAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,mBAAW,KAAK,OAAO;AACnB,kBAAQ,OAAO,KAAK,CAAC;AAAA,QACzB;AAAA,MACJ,OAAO;AACH,gBAAQ,IAAI,KAAK,KAAe;AAAA,MACpC;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,IAAI,QAAQ,IAAI,SAAS,GAAG;AAAA,IAC/B,QAAQ,IAAI,UAAU;AAAA,IACtB;AAAA,IACA;AAAA,EACJ,CAAC;AACL;AAKA,SAAS,UAAU,SAAiB,MAAuB;AAEvD,QAAM,YAAY,KAAK,MAAM,GAAG,EAAE,CAAC;AAGnC,QAAM,eAAe,QAChB,QAAQ,SAAS,OAAO,EACxB,QAAQ,OAAO,IAAI;AAExB,QAAM,QAAQ,IAAI,OAAO,IAAI,YAAY,GAAG;AAC5C,SAAO,MAAM,KAAK,aAAa,GAAG;AACtC;AAEA,SAAS,oBAA4B;AACjC,MAAI;AACA,UAAM,EAAE,kBAAkB,IAAI,UAAQ,IAAI;AAC1C,UAAM,OAAO,kBAAkB;AAE/B,eAAW,QAAQ,OAAO,KAAK,IAAI,GAAG;AAClC,iBAAW,OAAO,KAAK,IAAI,GAAG;AAC1B,YAAI,IAAI,WAAW,UAAU,CAAC,IAAI,UAAU;AACxC,iBAAO,IAAI;AAAA,QACf;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,QAAQ;AAAA,EAER;AACA,SAAO;AACX;;;ACnXA,SAAS,WAAAG,gBAAe;AACxB,OAAOC,SAAQ;AACf,SAAS,cAAAC,mBAAkB;AAS3B,eAAsB,aAAa,SAAsC;AACrE,QAAM,YAAY,KAAK,IAAI;AAE3B,YAAU;AACV,UAAQ,IAAIC,IAAG,KAAK,mDAAmD,CAAC;AAExE,MAAI;AAEA,UAAM,OAAOC,SAAQ,QAAQ,IAAI,CAAC;AAClC,UAAM,SAAS,MAAMC,YAAW,IAAI;AAEpC,UAAM,SAAS,QAAQ,UAAU,OAAO,MAAM;AAC9C,UAAM,YAAY,QAAQ,aAAa,OAAO,MAAM;AACpD,UAAM,SAAS,QAAQ,UAAU,OAAO,MAAM;AAG9C,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,MAAM;AAErC,YAAQ,IAAIF,IAAG,IAAI,qBAAqB,MAAM,EAAE,CAAC;AACjD,YAAQ,IAAIA,IAAG,IAAI,eAAe,YAAY,YAAY,UAAU,EAAE,CAAC;AACvE,YAAQ,IAAIA,IAAG,IAAI,iBAAiB,SAAS,YAAY,UAAU;AAAA,CAAI,CAAC;AAGxE,YAAQ,IAAIA,IAAG,KAAK,oBAAoB,CAAC;AACzC,UAAM,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,QACH,QAAQ,GAAG,MAAM;AAAA,QACjB;AAAA,QACA,QAAQ,SAAS,YAAY;AAAA,QAC7B,eAAe;AAAA,UACX,OAAOC,SAAQ,MAAM,YAAY;AAAA,QACrC;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,YAAQ,IAAID,IAAG,MAAM,QAAG,IAAI,wBAAwB;AAGpD,QAAI,OAAO,UAAU,YAAY,OAAO;AACpC,cAAQ,IAAIA,IAAG,KAAK,sBAAsB,CAAC;AAC3C,YAAM,MAAM;AAAA,QACR;AAAA,QACA,MAAM;AAAA,QACN,OAAO;AAAA,UACH,QAAQ,GAAG,MAAM;AAAA,UACjB;AAAA,UACA,QAAQ,SAAS,YAAY;AAAA,UAC7B,KAAK;AAAA,UACL,eAAe;AAAA,YACX,OAAOC,SAAQ,MAAM,OAAO,MAAM,QAAQ,iBAAiB;AAAA,UAC/D;AAAA,QACJ;AAAA,MACJ,CAAC;AACD,cAAQ,IAAID,IAAG,MAAM,QAAG,IAAI,wBAAwB;AAAA,IACxD;AAGA,QAAI,OAAO,SAAS;AAChB,cAAQ,IAAIA,IAAG,KAAK;AAAA,UAAa,OAAO,QAAQ,IAAI,aAAa,CAAC;AAElE,cAAQ,IAAIA,IAAG,MAAM,QAAG,IAAI,IAAI,OAAO,QAAQ,IAAI,mBAAmB;AAAA,IAC1E;AAEA,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,UAAM,kBAAkB,UAAU,KAAM,QAAQ,CAAC;AAEjD,YAAQ,IAAI;AAAA,EAClBA,IAAG,MAAM,sBAAsB,CAAC,IAAIA,IAAG,IAAI,IAAI,cAAc,IAAI,CAAC;AAAA;AAAA,EAElEA,IAAG,KAAK,SAAS,CAAC,IAAIC,SAAQ,MAAM,MAAM,CAAC;AAAA;AAAA,EAE3CD,IAAG,IAAI,uBAAuB,CAAC;AAAA,IAC7BA,IAAG,IAAI,GAAG,CAAC;AAAA;AAAA,EAEbA,IAAG,IAAI,YAAY,CAAC;AAAA,IAClBA,IAAG,IAAI,QAAG,CAAC,WAAW,MAAM;AAAA,IAC5BA,IAAG,IAAI,QAAG,CAAC;AAAA,CACd;AAAA,EAEG,SAAS,OAAO;AACZ,YAAQ,MAAMA,IAAG,IAAI,iBAAiB,GAAG,KAAK;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;;;AC/FA,SAAS,WAAAG,gBAAe;AACxB,OAAOC,SAAQ;AACf,SAAS,cAAAC,mBAAkB;AAS3B,eAAsB,eAAe,SAAwC;AACzE,YAAU;AACV,UAAQ,IAAIC,IAAG,KAAK,qDAA2C,CAAC;AAEhE,MAAI;AAEA,UAAM,OAAOC,SAAQ,QAAQ,IAAI,CAAC;AAClC,UAAM,SAAS,MAAMC,YAAW,IAAI;AAEpC,UAAM,OAAO,QAAQ,OAAO,SAAS,QAAQ,MAAM,EAAE,IAAI,OAAO,IAAI,OAAO;AAC3E,UAAM,OAAO,QAAQ,QAAQ,OAAO,IAAI;AACxC,UAAM,OAAO,QAAQ,QAAQ;AAG7B,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,MAAM;AAEvC,UAAM,SAAS,MAAM,QAAQ;AAAA,MACzB;AAAA,MACA,SAAS;AAAA,QACL;AAAA,QACA,MAAM,SAAS,OAAO,YAAY;AAAA,QAClC;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACH,QAAQ,OAAO,MAAM;AAAA,MACzB;AAAA,IACJ,CAAC;AAED,YAAQ,IAAI;AAAA,IAChBF,IAAG,MAAM,QAAG,CAAC;AAAA;AAAA,IAEbA,IAAG,KAAK,QAAG,CAAC,aAAaA,IAAG,KAAK,oBAAoB,IAAI,GAAG,CAAC;AAAA,IAC7D,SAAS,QAAQ,SAAS,YAAY,KAAKA,IAAG,KAAK,QAAG,CAAC,aAAaA,IAAG,KAAK,kBAAkB,IAAI,GAAG,CAAC,KAAK,EAAE;AAAA;AAAA,IAE7GA,IAAG,IAAI,6CAA6C,CAAC;AAAA,IACrDA,IAAG,IAAI,sBAAsB,CAAC,IAAIA,IAAG,KAAK,YAAY,CAAC;AAAA,CAC1D;AAGO,WAAO,UAAU;AAAA,EAErB,SAAS,OAAO;AACZ,YAAQ,MAAMA,IAAG,IAAI,mCAAmC,GAAG,KAAK;AAChE,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;;;ALlDA,IAAM,MAAM,IAAI,QAAQ;AAGxB,IAAM,OAAO;AAAA,EACXG,IAAG,KAAK,qOAAiD,CAAC;AAAA,EAC1DA,IAAG,KAAK,0OAAiD,CAAC;AAAA,EAC1DA,IAAG,KAAK,uMAAiD,CAAC;AAAA,EAC1DA,IAAG,KAAK,kMAAiD,CAAC;AAAA,EAC1DA,IAAG,KAAK,iNAAiD,CAAC;AAAA,EAC1DA,IAAG,KAAK,uMAAiD,CAAC;AAAA;AAAA,IAExDA,IAAG,IAAI,mCAAmC,CAAC;AAAA,IAC3CA,IAAG,IAAI,oCAAoC,CAAC;AAAA;AAGzC,SAAS,YAAkB;AAC9B,UAAQ,IAAI,IAAI;AACpB;AAGA,IAAI,QAAQ,OAAO;AACnB,IAAI,KAAK;AAGT,IACK,QAAQ,iBAAiB,6BAA6B,EACtD,OAAO,6BAA6B,2BAA2B,EAAE,SAAS,QAAQ,CAAC,EACnF,OAAO,oBAAoB,mDAAmD,EAC9E,OAAO,QAAQ,kBAAkB,EAAE,SAAS,KAAK,CAAC,EAClD,OAAO,SAAS,6BAA6B,EAAE,SAAS,KAAK,CAAC,EAC9D,OAAO,aAAa,wBAAwB,EAAE,SAAS,KAAK,CAAC,EAC7D,OAAO,aAAa;AAEzB,IACK,QAAQ,OAAO,0BAA0B,EACzC,OAAO,qBAAqB,mBAAmB,EAC/C,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,UAAU,uBAAuB,EACxC,OAAO,WAAW,cAAc,EAChC,OAAO,SAAS,8BAA8B,EAC9C,OAAO,UAAU;AAEtB,IACK,QAAQ,SAAS,sBAAsB,EACvC,OAAO,kBAAkB,kBAAkB,EAC3C,OAAO,eAAe,sBAAsB,EAC5C,OAAO,YAAY,iBAAiB,EAAE,SAAS,KAAK,CAAC,EACrD,OAAO,YAAY;AAExB,IACK,QAAQ,WAAW,0BAA0B,EAC7C,OAAO,qBAAqB,mBAAmB,EAC/C,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,UAAU,uBAAuB,EACxC,OAAO,cAAc;AAGnB,SAAS,MAAY;AACxB,MAAI;AACA,QAAI,MAAM,QAAQ,MAAM,EAAE,KAAK,MAAM,CAAC;AAGtC,QAAI,IAAI,QAAQ,QAAQ,QAAQ,KAAK,UAAU,GAAG;AAC9C,gBAAU;AAAA,IACd;AAEA,QAAI,kBAAkB;AAAA,EAC1B,SAAS,OAAO;AACZ,YAAQ,MAAMA,IAAG,IAAI,QAAQ,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;","names":["pc","resolve","join","readFileSync","existsSync","pc","pc","resolve","join","existsSync","readFileSync","resolve","pc","loadConfig","pc","resolve","loadConfig","resolve","pc","loadConfig","pc","resolve","loadConfig","pc"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flight-framework/cli",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Command-line interface for Flight Framework",
5
5
  "keywords": [
6
6
  "flight",
@@ -34,8 +34,8 @@
34
34
  "typecheck": "tsc --noEmit"
35
35
  },
36
36
  "dependencies": {
37
- "@flight-framework/core": "workspace:*",
38
- "@flight-framework/http": "workspace:*",
37
+ "@flight-framework/core": "0.0.3",
38
+ "@flight-framework/http": "0.0.1",
39
39
  "cac": "^6.7.14",
40
40
  "picocolors": "^1.1.0",
41
41
  "prompts": "^2.4.2"