@flexireact/core 3.0.4 → 4.1.0

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  <img src="./assets/flexireact.webp" alt="FlexiReact Logo" width="400" />
3
3
  </p>
4
4
 
5
- <h1 align="center">⚡ FlexiReact v3</h1>
5
+ <h1 align="center">⚡ FlexiReact v4</h1>
6
6
 
7
7
  <p align="center">
8
8
  <strong>The Future of React Development</strong>
@@ -48,16 +48,14 @@ Open [http://localhost:3000](http://localhost:3000) 🎉
48
48
 
49
49
  ---
50
50
 
51
- ## 🆕 What's New in v3.0
51
+ ## 🆕 What's New in v4
52
52
 
53
- ### v3.0.0 — The Future of React
54
- - **🌐 Universal Edge Runtime** — Deploy anywhere: Node.js, Bun, Deno, Cloudflare Workers, Vercel Edge
55
- - **⚡ Smart Caching** — TTL, stale-while-revalidate, tag-based invalidation
56
- - **🎯 Partial Prerendering (PPR)** — Static shell + streaming dynamic content
57
- - **🛠️ CLI Scaffolding** — Generate pages, components, hooks, APIs with `flexi g`
58
- - **🔧 Advanced DevTools** — Routes, Components, Network, Performance monitoring
59
- - **🎨 FlexiUI Integration** — 50+ beautiful, accessible React components
60
- - **📱 Sexy Templates** — Modern, responsive landing pages out of the box
53
+ ### v4.0.0 — React 19 Native Edition
54
+ - **⚛️ React 19 Native** — Full support for React 19 (Actions, `useActionState`, `useOptimistic`, `useFormStatus`, `use()`)
55
+ - **🚀 Enhanced Actions** — Simplified server action handling with native React 19 primitives
56
+ - **🔄 Improved Hydration** — Leveraging React 19 `onRecoverableError` for better error resilience
57
+ - **📦 New Hooks API** — Centralized `core/hooks` module for React 19 + FlexiReact utilities
58
+ - **⚡ Version 4.0** — Major release with stability improvements and updated CLI templates
61
59
 
62
60
  ## ✨ Features
63
61
 
@@ -92,8 +90,9 @@ Open [http://localhost:3000](http://localhost:3000) 🎉
92
90
  | 🚀 **Prefetch** | Automatic link prefetching for instant navigation |
93
91
  | 🔍 **TanStack Query** | Built-in support for useQuery, useMutation, and caching |
94
92
  | 🐻 **Zustand / Jotai** | Lightweight state management integration |
95
- | ⚡ **Optimistic Updates** | Instant UI feedback with automatic rollback |
96
- | ⏳ **Suspense Ready** | React Suspense for loading states and streaming |
93
+ | ⚡ **Optimistic Updates** | Instant UI feedback with `useOptimistic` (React 19) |
94
+ | ⏳ **Suspense Ready** | React Suspense and `use()` hook for async data |
95
+ | 🏗️ **Actions State** | Native `useActionState` and `useFormStatus` support |
97
96
 
98
97
  ### 🛡️ Middleware & Security
99
98
 
package/dist/cli/index.js CHANGED
@@ -730,8 +730,8 @@ async function createDefaultTemplate(projectPath, name, useTypeScript) {
730
730
  doctor: "flexi doctor"
731
731
  },
732
732
  dependencies: {
733
- react: "^18.3.1",
734
- "react-dom": "^18.3.1",
733
+ react: "^19.0.0",
734
+ "react-dom": "^19.0.0",
735
735
  "class-variance-authority": "^0.7.0",
736
736
  clsx: "^2.1.1",
737
737
  "tailwind-merge": "^2.5.5",
@@ -743,8 +743,8 @@ async function createDefaultTemplate(projectPath, name, useTypeScript) {
743
743
  autoprefixer: "^10.4.20",
744
744
  ...useTypeScript ? {
745
745
  typescript: "^5.7.2",
746
- "@types/react": "^18.3.14",
747
- "@types/react-dom": "^18.3.2",
746
+ "@types/react": "^19.0.0",
747
+ "@types/react-dom": "^19.0.0",
748
748
  "@types/node": "^22.10.1"
749
749
  } : {}
750
750
  }
@@ -1104,7 +1104,7 @@ const styles = {
1104
1104
  fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
1105
1105
  },
1106
1106
  nav: {
1107
- position: 'fixed' as const,
1107
+ position: 'fixed',
1108
1108
  top: 0,
1109
1109
  left: 0,
1110
1110
  right: 0,
@@ -1136,10 +1136,10 @@ const styles = {
1136
1136
  navLink: { color: '#94a3b8', textDecoration: 'none', fontSize: 14 },
1137
1137
  hero: {
1138
1138
  display: 'flex',
1139
- flexDirection: 'column' as const,
1139
+ flexDirection: 'column',
1140
1140
  alignItems: 'center',
1141
1141
  justifyContent: 'center',
1142
- textAlign: 'center' as const,
1142
+ textAlign: 'center',
1143
1143
  padding: '140px 24px 80px',
1144
1144
  },
1145
1145
  badge: {
@@ -1168,7 +1168,7 @@ const styles = {
1168
1168
  lineHeight: 1.6,
1169
1169
  marginBottom: 32,
1170
1170
  },
1171
- buttons: { display: 'flex', gap: 16, flexWrap: 'wrap' as const, justifyContent: 'center' },
1171
+ buttons: { display: 'flex', gap: 16, flexWrap: 'wrap', justifyContent: 'center' },
1172
1172
  primaryBtn: {
1173
1173
  background: 'linear-gradient(135deg, #6366f1, #8b5cf6)',
1174
1174
  color: '#fff',
@@ -1195,7 +1195,7 @@ const styles = {
1195
1195
  featuresTitle: {
1196
1196
  fontSize: 32,
1197
1197
  fontWeight: 700,
1198
- textAlign: 'center' as const,
1198
+ textAlign: 'center',
1199
1199
  marginBottom: 48,
1200
1200
  },
1201
1201
  grid: {
@@ -1213,7 +1213,7 @@ const styles = {
1213
1213
  cardTitle: { fontSize: 18, fontWeight: 600, marginBottom: 8 },
1214
1214
  cardDesc: { fontSize: 14, color: '#94a3b8', lineHeight: 1.5 },
1215
1215
  footer: {
1216
- textAlign: 'center' as const,
1216
+ textAlign: 'center',
1217
1217
  padding: 32,
1218
1218
  color: '#64748b',
1219
1219
  borderTop: '1px solid rgba(255,255,255,0.1)',
@@ -1229,7 +1229,7 @@ export function get(req${ext === "tsx" ? ": any" : ""}, res${ext === "tsx" ? ":
1229
1229
  res.json({
1230
1230
  message: 'Hello from FlexiReact API! \u{1F680}',
1231
1231
  timestamp: new Date().toISOString(),
1232
- framework: 'FlexiReact v2.1'
1232
+ framework: 'FlexiReact v3.1'
1233
1233
  });
1234
1234
  }
1235
1235
 
@@ -1266,7 +1266,12 @@ ${pc2.cyan(" \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u250
1266
1266
  stdio: "inherit",
1267
1267
  cwd: process.cwd(),
1268
1268
  shell: true,
1269
- env: { ...process.env, NODE_ENV: "development", FORCE_COLOR: "1" }
1269
+ env: {
1270
+ ...process.env,
1271
+ NODE_ENV: "development",
1272
+ FORCE_COLOR: "1",
1273
+ NODE_PATH: path2.join(process.cwd(), "node_modules")
1274
+ }
1270
1275
  }
1271
1276
  );
1272
1277
  child.on("error", (error) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../cli/index.ts","../../cli/generators.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\n/**\r\n * FlexiReact CLI v2.1\r\n * Professional CLI with TypeScript, colors, prompts, and progress indicators\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { fileURLToPath, pathToFileURL } from 'url';\r\nimport { execSync, spawn } from 'child_process';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport ora from 'ora';\r\nimport { runGenerate, listGenerators } from './generators.js';\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = path.dirname(__filename);\r\nconst VERSION = '3.0.0';\r\n\r\n// ============================================================================\r\n// ASCII Logo & Branding\r\n// ============================================================================\r\n\r\nconst LOGO = `\r\n${pc.cyan('╔═══════════════════════════════════════════════════════════╗')}\r\n${pc.cyan('║')} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.bold(pc.magenta('⚡'))} ${pc.bold(pc.white('F L E X I R E A C T'))} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.dim('The Modern React Framework')} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.dim('TypeScript • Tailwind • SSR • Islands')} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.cyan('║')}\r\n${pc.cyan('╚═══════════════════════════════════════════════════════════╝')}\r\n`;\r\n\r\nconst MINI_LOGO = `${pc.magenta('⚡')} ${pc.bold('FlexiReact')}`;\r\n\r\n// ============================================================================\r\n// Logger Utilities\r\n// ============================================================================\r\n\r\nconst log = {\r\n info: (msg: string) => console.log(`${pc.cyan('ℹ')} ${msg}`),\r\n success: (msg: string) => console.log(`${pc.green('✓')} ${msg}`),\r\n warn: (msg: string) => console.log(`${pc.yellow('⚠')} ${pc.yellow(msg)}`),\r\n error: (msg: string) => console.log(`${pc.red('✗')} ${pc.red(msg)}`),\r\n step: (num: number, total: number, msg: string) =>\r\n console.log(`${pc.dim(`[${num}/${total}]`)} ${msg}`),\r\n blank: () => console.log(''),\r\n divider: () => console.log(pc.dim('─'.repeat(60))),\r\n};\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\nfunction copyDirectory(src: string, dest: string): void {\r\n if (!fs.existsSync(dest)) {\r\n fs.mkdirSync(dest, { recursive: true });\r\n }\r\n\r\n const entries = fs.readdirSync(src, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const srcPath = path.join(src, entry.name);\r\n const destPath = path.join(dest, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n copyDirectory(srcPath, destPath);\r\n } else {\r\n fs.copyFileSync(srcPath, destPath);\r\n }\r\n }\r\n}\r\n\r\nasync function runCommand(cmd: string, cwd: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const child = spawn(cmd, {\r\n shell: true,\r\n cwd,\r\n stdio: 'pipe'\r\n });\r\n\r\n child.on('close', (code) => {\r\n if (code === 0) resolve();\r\n else reject(new Error(`Command failed with code ${code}`));\r\n });\r\n\r\n child.on('error', reject);\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Create Command\r\n// ============================================================================\r\n\r\ninterface CreateOptions {\r\n template: 'default' | 'minimal' | 'flexi-ui';\r\n typescript: boolean;\r\n tailwind: boolean;\r\n shadcn: boolean;\r\n}\r\n\r\nasync function createProject(projectName?: string): Promise<void> {\r\n console.log(LOGO);\r\n log.blank();\r\n\r\n // Get project name\r\n let name = projectName;\r\n if (!name) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'projectName',\r\n message: 'Project name:',\r\n initial: 'my-flexi-app',\r\n validate: (value: string) => value.length > 0 || 'Project name is required'\r\n });\r\n name = response.projectName;\r\n if (!name) process.exit(1);\r\n }\r\n\r\n const projectPath = path.resolve(process.cwd(), name);\r\n\r\n // Check if directory exists\r\n if (fs.existsSync(projectPath)) {\r\n log.error(`Directory \"${name}\" already exists.`);\r\n process.exit(1);\r\n }\r\n\r\n // Get options\r\n const options = await prompts([\r\n {\r\n type: 'select',\r\n name: 'template',\r\n message: 'Select a template:',\r\n choices: [\r\n { title: '🚀 Default (Tailwind + shadcn/ui)', value: 'default' },\r\n { title: '💚 FlexiUI (Landing page + @flexireact/flexi-ui)', value: 'flexi-ui' },\r\n { title: '📦 Minimal (Clean slate)', value: 'minimal' }\r\n ],\r\n initial: 0\r\n },\r\n {\r\n type: 'toggle',\r\n name: 'typescript',\r\n message: 'Use TypeScript?',\r\n initial: true,\r\n active: 'Yes',\r\n inactive: 'No'\r\n }\r\n ]);\r\n\r\n if (options.template === undefined) process.exit(1);\r\n\r\n log.blank();\r\n log.divider();\r\n log.blank();\r\n\r\n const totalSteps = options.template === 'default' ? 6 : (options.template === 'flexi-ui' ? 5 : 4);\r\n let currentStep = 0;\r\n\r\n // Step 1: Create directory\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Creating project directory...');\r\n fs.mkdirSync(projectPath, { recursive: true });\r\n log.success(`Created ${pc.cyan(name)}/`);\r\n\r\n // Step 2: Copy template\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Setting up project structure...');\r\n const templateName = options.template;\r\n const templatePath = path.resolve(__dirname, '..', 'templates', templateName);\r\n\r\n if (fs.existsSync(templatePath)) {\r\n copyDirectory(templatePath, projectPath);\r\n log.success('Project structure created');\r\n } else {\r\n // Create basic structure if template doesn't exist\r\n await createDefaultTemplate(projectPath, name, options.typescript);\r\n log.success('Project structure created');\r\n }\r\n\r\n // Step 3: Update package.json\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Configuring project...');\r\n const packageJsonPath = path.join(projectPath, 'package.json');\r\n if (fs.existsSync(packageJsonPath)) {\r\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\r\n pkg.name = name;\r\n fs.writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2));\r\n }\r\n log.success('Project configured');\r\n\r\n // Step 4: Install dependencies\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Installing dependencies...');\r\n const spinner = ora({ text: 'Installing packages...', color: 'cyan' }).start();\r\n\r\n try {\r\n await runCommand('npm install', projectPath);\r\n spinner.succeed('Dependencies installed');\r\n } catch {\r\n spinner.fail('Failed to install dependencies');\r\n log.warn('Run \"npm install\" manually in the project directory');\r\n }\r\n\r\n // Step 5: Link FlexiReact (for development)\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Linking FlexiReact...');\r\n const linkSpinner = ora({ text: 'Linking framework...', color: 'cyan' }).start();\r\n\r\n try {\r\n const frameworkRoot = path.resolve(__dirname, '..');\r\n await runCommand(`npm link \"${frameworkRoot}\"`, projectPath);\r\n linkSpinner.succeed('FlexiReact linked');\r\n } catch {\r\n linkSpinner.fail('Failed to link FlexiReact');\r\n log.warn('Run \"npm link flexireact\" manually');\r\n }\r\n\r\n // Step 6: Initialize shadcn/ui (if default template)\r\n if (options.template === 'default') {\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Setting up shadcn/ui components...');\r\n log.success('shadcn/ui configured');\r\n }\r\n\r\n // Success message\r\n log.blank();\r\n log.divider();\r\n log.blank();\r\n\r\n console.log(` ${pc.green('✨')} ${pc.bold('Success!')} Your FlexiReact app is ready.`);\r\n log.blank();\r\n\r\n console.log(` ${pc.dim('$')} ${pc.cyan(`cd ${name}`)}`);\r\n console.log(` ${pc.dim('$')} ${pc.cyan('npm run dev')}`);\r\n log.blank();\r\n\r\n console.log(` ${pc.dim('Then open')} ${pc.cyan('http://localhost:3000')} ${pc.dim('in your browser.')}`);\r\n log.blank();\r\n\r\n console.log(` ${pc.dim('Documentation:')} ${pc.cyan('https://github.com/flexireact/flexireact')}`);\r\n log.blank();\r\n}\r\n\r\nasync function createDefaultTemplate(projectPath: string, name: string, useTypeScript: boolean): Promise<void> {\r\n const ext = useTypeScript ? 'tsx' : 'jsx';\r\n const configExt = useTypeScript ? 'ts' : 'js';\r\n\r\n // Create directories\r\n const dirs = [\r\n 'app/components',\r\n 'app/styles',\r\n 'pages/api',\r\n 'public',\r\n ];\r\n\r\n for (const dir of dirs) {\r\n fs.mkdirSync(path.join(projectPath, dir), { recursive: true });\r\n }\r\n\r\n // package.json\r\n const packageJson = {\r\n name,\r\n version: '0.1.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'flexi dev',\r\n build: 'flexi build',\r\n start: 'flexi start',\r\n doctor: 'flexi doctor'\r\n },\r\n dependencies: {\r\n react: '^18.3.1',\r\n 'react-dom': '^18.3.1',\r\n 'class-variance-authority': '^0.7.0',\r\n clsx: '^2.1.1',\r\n 'tailwind-merge': '^2.5.5',\r\n 'lucide-react': '^0.468.0'\r\n },\r\n devDependencies: {\r\n tailwindcss: '^3.4.16',\r\n postcss: '^8.4.49',\r\n autoprefixer: '^10.4.20',\r\n ...(useTypeScript ? {\r\n typescript: '^5.7.2',\r\n '@types/react': '^18.3.14',\r\n '@types/react-dom': '^18.3.2',\r\n '@types/node': '^22.10.1'\r\n } : {})\r\n }\r\n };\r\n fs.writeFileSync(\r\n path.join(projectPath, 'package.json'),\r\n JSON.stringify(packageJson, null, 2)\r\n );\r\n\r\n // TypeScript config\r\n if (useTypeScript) {\r\n const tsconfig = {\r\n compilerOptions: {\r\n target: 'ES2022',\r\n lib: ['dom', 'dom.iterable', 'ES2022'],\r\n allowJs: true,\r\n skipLibCheck: true,\r\n strict: true,\r\n noEmit: true,\r\n esModuleInterop: true,\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n jsx: 'react-jsx',\r\n baseUrl: '.',\r\n paths: {\r\n '@/*': ['./*'],\r\n '@/components/*': ['./app/components/*']\r\n }\r\n },\r\n include: ['**/*.ts', '**/*.tsx'],\r\n exclude: ['node_modules']\r\n };\r\n fs.writeFileSync(\r\n path.join(projectPath, 'tsconfig.json'),\r\n JSON.stringify(tsconfig, null, 2)\r\n );\r\n }\r\n\r\n // Tailwind config\r\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\r\nexport default {\r\n content: [\r\n './app/**/*.{js,ts,jsx,tsx}',\r\n './pages/**/*.{js,ts,jsx,tsx}',\r\n './components/**/*.{js,ts,jsx,tsx}',\r\n ],\r\n darkMode: 'class',\r\n theme: {\r\n extend: {\r\n colors: {\r\n border: 'hsl(var(--border))',\r\n background: 'hsl(var(--background))',\r\n foreground: 'hsl(var(--foreground))',\r\n primary: {\r\n DEFAULT: 'hsl(var(--primary))',\r\n foreground: 'hsl(var(--primary-foreground))',\r\n },\r\n secondary: {\r\n DEFAULT: 'hsl(var(--secondary))',\r\n foreground: 'hsl(var(--secondary-foreground))',\r\n },\r\n muted: {\r\n DEFAULT: 'hsl(var(--muted))',\r\n foreground: 'hsl(var(--muted-foreground))',\r\n },\r\n accent: {\r\n DEFAULT: 'hsl(var(--accent))',\r\n foreground: 'hsl(var(--accent-foreground))',\r\n },\r\n },\r\n borderRadius: {\r\n lg: 'var(--radius)',\r\n md: 'calc(var(--radius) - 2px)',\r\n sm: 'calc(var(--radius) - 4px)',\r\n },\r\n },\r\n },\r\n plugins: [],\r\n};\r\n`;\r\n fs.writeFileSync(path.join(projectPath, 'tailwind.config.js'), tailwindConfig);\r\n\r\n // PostCSS config\r\n const postcssConfig = `export default {\r\n plugins: {\r\n tailwindcss: {},\r\n autoprefixer: {},\r\n },\r\n};\r\n`;\r\n fs.writeFileSync(path.join(projectPath, 'postcss.config.js'), postcssConfig);\r\n\r\n // Global CSS\r\n const globalsCss = `@tailwind base;\r\n@tailwind components;\r\n@tailwind utilities;\r\n\r\n@layer base {\r\n :root {\r\n --background: 222 47% 11%;\r\n --foreground: 210 40% 98%;\r\n --primary: 263 70% 50%;\r\n --primary-foreground: 210 40% 98%;\r\n --secondary: 217 33% 17%;\r\n --secondary-foreground: 210 40% 98%;\r\n --muted: 217 33% 17%;\r\n --muted-foreground: 215 20% 65%;\r\n --accent: 263 70% 50%;\r\n --accent-foreground: 210 40% 98%;\r\n --border: 217 33% 17%;\r\n --radius: 0.5rem;\r\n }\r\n}\r\n\r\n@layer base {\r\n * {\r\n @apply border-border;\r\n }\r\n body {\r\n @apply bg-background text-foreground antialiased;\r\n font-feature-settings: \"rlig\" 1, \"calt\" 1;\r\n }\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, 'app/styles/globals.css'), globalsCss);\r\n\r\n // FlexiReact config\r\n const flexiConfig = `export default {\r\n server: {\r\n port: 3000,\r\n host: 'localhost'\r\n },\r\n islands: {\r\n enabled: true\r\n },\r\n rsc: {\r\n enabled: true\r\n }\r\n};\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `flexireact.config.${configExt}`), flexiConfig);\r\n\r\n // Create components\r\n await createComponents(projectPath, ext);\r\n\r\n // Create pages\r\n await createPages(projectPath, ext);\r\n}\r\n\r\nasync function createComponents(projectPath: string, ext: string): Promise<void> {\r\n // Button component\r\n const buttonComponent = `import React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\nfunction cn(...inputs${ext === 'tsx' ? ': (string | undefined)[]' : ''}) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\nconst buttonVariants = cva(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n outline: 'border border-border bg-transparent hover:bg-accent hover:text-accent-foreground',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n },\r\n size: {\r\n default: 'h-10 px-4 py-2',\r\n sm: 'h-9 rounded-md px-3',\r\n lg: 'h-11 rounded-md px-8',\r\n icon: 'h-10 w-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n);\r\n\r\n${ext === 'tsx' ? `interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {}` : ''}\r\n\r\nexport function Button({ className, variant, size, ...props }${ext === 'tsx' ? ': ButtonProps' : ''}) {\r\n return (\r\n <button\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n {...props}\r\n />\r\n );\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `app/components/Button.${ext}`), buttonComponent);\r\n\r\n // Card component\r\n const cardComponent = `import React from 'react';\r\n\r\n${ext === 'tsx' ? `interface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}` : ''}\r\n\r\nexport function Card({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return (\r\n <div className={\\`rounded-lg border border-border bg-secondary/50 p-6 backdrop-blur-sm \\${className}\\`}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport function CardHeader({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return <div className={\\`mb-4 \\${className}\\`}>{children}</div>;\r\n}\r\n\r\nexport function CardTitle({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return <h3 className={\\`text-xl font-semibold \\${className}\\`}>{children}</h3>;\r\n}\r\n\r\nexport function CardDescription({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return <p className={\\`text-muted-foreground \\${className}\\`}>{children}</p>;\r\n}\r\n\r\nexport function CardContent({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return <div className={className}>{children}</div>;\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `app/components/Card.${ext}`), cardComponent);\r\n\r\n // Navbar component\r\n const navbarComponent = `import React from 'react';\r\n\r\nexport function Navbar() {\r\n return (\r\n <nav className=\"fixed top-0 left-0 right-0 z-50 border-b border-border bg-background/80 backdrop-blur-md\">\r\n <div className=\"mx-auto flex h-16 max-w-7xl items-center justify-between px-4\">\r\n <a href=\"/\" className=\"flex items-center gap-2 text-xl font-bold\">\r\n <span className=\"text-2xl\">⚡</span>\r\n <span className=\"bg-gradient-to-r from-purple-400 to-pink-400 bg-clip-text text-transparent\">\r\n FlexiReact\r\n </span>\r\n </a>\r\n \r\n <div className=\"flex items-center gap-6\">\r\n <a href=\"/\" className=\"text-muted-foreground hover:text-foreground transition-colors\">\r\n Home\r\n </a>\r\n <a href=\"/docs\" className=\"text-muted-foreground hover:text-foreground transition-colors\">\r\n Docs\r\n </a>\r\n <a href=\"/api/hello\" className=\"text-muted-foreground hover:text-foreground transition-colors\">\r\n API\r\n </a>\r\n <a \r\n href=\"https://github.com/flexireact/flexireact\" \r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-muted-foreground hover:text-foreground transition-colors\"\r\n >\r\n GitHub\r\n </a>\r\n </div>\r\n </div>\r\n </nav>\r\n );\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `app/components/Navbar.${ext}`), navbarComponent);\r\n}\r\n\r\nasync function createPages(projectPath: string, ext: string): Promise<void> {\r\n // Home page with INLINE STYLES (works without Tailwind build)\r\n const homePage = `import React from 'react';\r\n\r\nexport const title = 'FlexiReact - The Modern React Framework';\r\n\r\nconst features = [\r\n { icon: '⚡', title: 'Lightning Fast', desc: 'Powered by esbuild for instant builds.' },\r\n { icon: '📘', title: 'TypeScript', desc: 'First-class TypeScript support.' },\r\n { icon: '🏝️', title: 'Islands', desc: 'Partial hydration for minimal JS.' },\r\n { icon: '📁', title: 'File Routing', desc: 'Create a file, get a route.' },\r\n { icon: '🔌', title: 'API Routes', desc: 'Build your API alongside frontend.' },\r\n { icon: '🚀', title: 'SSR/SSG', desc: 'Server rendering and static generation.' },\r\n];\r\n\r\nexport default function HomePage() {\r\n return (\r\n <div style={styles.container}>\r\n {/* Navbar */}\r\n <nav style={styles.nav}>\r\n <a href=\"/\" style={styles.logo}>\r\n <svg style={{ width: 32, height: 32 }} viewBox=\"0 0 200 200\" fill=\"none\">\r\n <defs>\r\n <linearGradient id=\"g\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\r\n <stop offset=\"0%\" stopColor=\"#61DAFB\"/>\r\n <stop offset=\"100%\" stopColor=\"#21A1F1\"/>\r\n </linearGradient>\r\n </defs>\r\n <circle cx=\"100\" cy=\"100\" r=\"12\" fill=\"url(#g)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#g)\" strokeWidth=\"6\" transform=\"rotate(-30 100 100)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#g)\" strokeWidth=\"6\" transform=\"rotate(30 100 100)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#g)\" strokeWidth=\"6\" transform=\"rotate(90 100 100)\"/>\r\n </svg>\r\n <span style={styles.logoText}>FlexiReact</span>\r\n </a>\r\n <div style={styles.navLinks}>\r\n <a href=\"/\" style={styles.navLink}>Home</a>\r\n <a href=\"/api/hello\" style={styles.navLink}>API</a>\r\n </div>\r\n </nav>\r\n\r\n {/* Hero */}\r\n <section style={styles.hero}>\r\n <svg style={{ width: 120, height: 120, marginBottom: 24 }} viewBox=\"0 0 200 200\" fill=\"none\">\r\n <defs>\r\n <linearGradient id=\"hero\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\r\n <stop offset=\"0%\" stopColor=\"#61DAFB\"/>\r\n <stop offset=\"100%\" stopColor=\"#21A1F1\"/>\r\n </linearGradient>\r\n </defs>\r\n <circle cx=\"100\" cy=\"100\" r=\"12\" fill=\"url(#hero)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#hero)\" strokeWidth=\"6\" transform=\"rotate(-30 100 100)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#hero)\" strokeWidth=\"6\" transform=\"rotate(30 100 100)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#hero)\" strokeWidth=\"6\" transform=\"rotate(90 100 100)\"/>\r\n <circle cx=\"28\" cy=\"70\" r=\"8\" fill=\"url(#hero)\"/>\r\n <circle cx=\"172\" cy=\"130\" r=\"8\" fill=\"url(#hero)\"/>\r\n <circle cx=\"100\" cy=\"20\" r=\"8\" fill=\"url(#hero)\"/>\r\n </svg>\r\n \r\n <div style={styles.badge}>🚀 v2.1 — TypeScript & Islands</div>\r\n \r\n <h1 style={styles.title}>\r\n Build faster with<br/>\r\n <span style={styles.titleGradient}>FlexiReact</span>\r\n </h1>\r\n \r\n <p style={styles.subtitle}>\r\n The modern React framework with SSR, SSG, Islands architecture,<br/>\r\n and file-based routing. Simple and powerful.\r\n </p>\r\n \r\n <div style={styles.buttons}>\r\n <a href=\"/docs\" style={styles.primaryBtn}>Get Started →</a>\r\n <a href=\"/api/hello\" style={styles.secondaryBtn}>View API</a>\r\n </div>\r\n </section>\r\n\r\n {/* Features */}\r\n <section style={styles.features}>\r\n <h2 style={styles.featuresTitle}>Everything you need</h2>\r\n <div style={styles.grid}>\r\n {features.map((f, i) => (\r\n <div key={i} style={styles.card}>\r\n <div style={styles.cardIcon}>{f.icon}</div>\r\n <h3 style={styles.cardTitle}>{f.title}</h3>\r\n <p style={styles.cardDesc}>{f.desc}</p>\r\n </div>\r\n ))}\r\n </div>\r\n </section>\r\n\r\n {/* Footer */}\r\n <footer style={styles.footer}>\r\n Built with ❤️ using FlexiReact\r\n </footer>\r\n </div>\r\n );\r\n}\r\n\r\nconst styles = {\r\n container: {\r\n minHeight: '100vh',\r\n background: 'linear-gradient(180deg, #0f172a 0%, #1e293b 100%)',\r\n color: '#f8fafc',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n nav: {\r\n position: 'fixed' as const,\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n height: 64,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '0 24px',\r\n background: 'rgba(15, 23, 42, 0.8)',\r\n backdropFilter: 'blur(12px)',\r\n borderBottom: '1px solid rgba(255,255,255,0.1)',\r\n zIndex: 100,\r\n },\r\n logo: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n textDecoration: 'none',\r\n color: '#f8fafc',\r\n },\r\n logoText: {\r\n fontSize: 20,\r\n fontWeight: 700,\r\n background: 'linear-gradient(90deg, #61DAFB, #21A1F1)',\r\n WebkitBackgroundClip: 'text',\r\n WebkitTextFillColor: 'transparent',\r\n },\r\n navLinks: { display: 'flex', gap: 24 },\r\n navLink: { color: '#94a3b8', textDecoration: 'none', fontSize: 14 },\r\n hero: {\r\n display: 'flex',\r\n flexDirection: 'column' as const,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n textAlign: 'center' as const,\r\n padding: '140px 24px 80px',\r\n },\r\n badge: {\r\n background: 'rgba(99, 102, 241, 0.2)',\r\n border: '1px solid rgba(99, 102, 241, 0.3)',\r\n borderRadius: 9999,\r\n padding: '8px 16px',\r\n fontSize: 14,\r\n marginBottom: 24,\r\n },\r\n title: {\r\n fontSize: 'clamp(2.5rem, 8vw, 4.5rem)',\r\n fontWeight: 800,\r\n lineHeight: 1.1,\r\n marginBottom: 24,\r\n },\r\n titleGradient: {\r\n background: 'linear-gradient(90deg, #61DAFB, #a78bfa, #61DAFB)',\r\n WebkitBackgroundClip: 'text',\r\n WebkitTextFillColor: 'transparent',\r\n },\r\n subtitle: {\r\n fontSize: 18,\r\n color: '#94a3b8',\r\n maxWidth: 600,\r\n lineHeight: 1.6,\r\n marginBottom: 32,\r\n },\r\n buttons: { display: 'flex', gap: 16, flexWrap: 'wrap' as const, justifyContent: 'center' },\r\n primaryBtn: {\r\n background: 'linear-gradient(135deg, #6366f1, #8b5cf6)',\r\n color: '#fff',\r\n padding: '14px 28px',\r\n borderRadius: 12,\r\n textDecoration: 'none',\r\n fontWeight: 600,\r\n boxShadow: '0 4px 20px rgba(99, 102, 241, 0.4)',\r\n },\r\n secondaryBtn: {\r\n background: 'transparent',\r\n color: '#f8fafc',\r\n padding: '14px 28px',\r\n borderRadius: 12,\r\n textDecoration: 'none',\r\n fontWeight: 600,\r\n border: '1px solid rgba(255,255,255,0.2)',\r\n },\r\n features: {\r\n padding: '80px 24px',\r\n maxWidth: 1200,\r\n margin: '0 auto',\r\n },\r\n featuresTitle: {\r\n fontSize: 32,\r\n fontWeight: 700,\r\n textAlign: 'center' as const,\r\n marginBottom: 48,\r\n },\r\n grid: {\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))',\r\n gap: 24,\r\n },\r\n card: {\r\n background: 'rgba(255,255,255,0.05)',\r\n border: '1px solid rgba(255,255,255,0.1)',\r\n borderRadius: 16,\r\n padding: 24,\r\n },\r\n cardIcon: { fontSize: 32, marginBottom: 12 },\r\n cardTitle: { fontSize: 18, fontWeight: 600, marginBottom: 8 },\r\n cardDesc: { fontSize: 14, color: '#94a3b8', lineHeight: 1.5 },\r\n footer: {\r\n textAlign: 'center' as const,\r\n padding: 32,\r\n color: '#64748b',\r\n borderTop: '1px solid rgba(255,255,255,0.1)',\r\n },\r\n};\r\n`;\r\n // Always use .jsx for pages (simpler, works without TS config)\r\n fs.writeFileSync(path.join(projectPath, 'pages/index.jsx'), homePage);\r\n\r\n // API route\r\n const apiRoute = `/**\r\n * API Route: /api/hello\r\n */\r\n\r\nexport function get(req${ext === 'tsx' ? ': any' : ''}, res${ext === 'tsx' ? ': any' : ''}) {\r\n res.json({\r\n message: 'Hello from FlexiReact API! 🚀',\r\n timestamp: new Date().toISOString(),\r\n framework: 'FlexiReact v2.1'\r\n });\r\n}\r\n\r\nexport function post(req${ext === 'tsx' ? ': any' : ''}, res${ext === 'tsx' ? ': any' : ''}) {\r\n const { name } = req.body || {};\r\n res.json({\r\n message: \\`Hello, \\${name || 'World'}!\\`,\r\n timestamp: new Date().toISOString()\r\n });\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `pages/api/hello.${ext === 'tsx' ? 'ts' : 'js'}`), apiRoute);\r\n\r\n // .gitkeep for public\r\n fs.writeFileSync(path.join(projectPath, 'public/.gitkeep'), '');\r\n}\r\n\r\n// ============================================================================\r\n// Dev Command\r\n// ============================================================================\r\n\r\nasync function runDev(): Promise<void> {\r\n // Show styled logo\r\n console.log(`\r\n${pc.cyan(' ╭─────────────────────────────────────────╮')}\r\n${pc.cyan(' │')} ${pc.cyan('│')}\r\n${pc.cyan(' │')} ${pc.bold(pc.cyan('⚛'))} ${pc.bold(pc.white('F L E X I R E A C T'))} ${pc.cyan('│')}\r\n${pc.cyan(' │')} ${pc.cyan('│')}\r\n${pc.cyan(' │')} ${pc.dim('The Modern React Framework')} ${pc.cyan('│')}\r\n${pc.cyan(' │')} ${pc.cyan('│')}\r\n${pc.cyan(' ╰─────────────────────────────────────────╯')}\r\n`);\r\n\r\n // Determine if we are running from dist or source\r\n const isBuilt = __dirname.includes('dist');\r\n const ext = isBuilt ? 'js' : 'ts';\r\n const startDevDir = isBuilt ? path.join(__dirname, '..', 'core') : path.join(__dirname, '..', 'core');\r\n const startDevPath = path.join(startDevDir, `start-dev.${ext}`);\r\n\r\n // Find tsx binary\r\n const tsxBin = 'tsx'; // rely on dependency in node_modules\r\n\r\n const child = spawn(\r\n 'npx',\r\n [tsxBin, startDevPath],\r\n {\r\n stdio: 'inherit',\r\n cwd: process.cwd(),\r\n shell: true,\r\n env: { ...process.env, NODE_ENV: 'development', FORCE_COLOR: '1' }\r\n }\r\n );\r\n\r\n child.on('error', (error) => {\r\n log.error(`Failed to start dev server: ${error.message}`);\r\n process.exit(1);\r\n });\r\n\r\n process.on('SIGINT', () => child.kill('SIGINT'));\r\n process.on('SIGTERM', () => child.kill('SIGTERM'));\r\n}\r\n\r\n// ============================================================================\r\n// Build Command\r\n// ============================================================================\r\n\r\nasync function runBuild(options: { analyze?: boolean } = {}): Promise<void> {\r\n console.log(MINI_LOGO);\r\n log.blank();\r\n log.info('Building for production...');\r\n if (options.analyze) {\r\n log.info('Bundle analysis enabled');\r\n }\r\n log.blank();\r\n\r\n const spinner = ora({ text: 'Compiling...', color: 'cyan' }).start();\r\n\r\n try {\r\n // Determine if we are running from dist or source\r\n const isBuilt = __dirname.includes('dist');\r\n const ext = isBuilt ? 'js' : 'ts';\r\n const coreDir = isBuilt ? path.join(__dirname, '..', 'core') : path.join(__dirname, '..', 'core');\r\n\r\n const buildPath = path.join(coreDir, 'build', `index.${ext}`);\r\n const configPath = path.join(coreDir, `config.${ext}`);\r\n\r\n const buildModule = await import(pathToFileURL(buildPath).href);\r\n const configModule = await import(pathToFileURL(configPath).href);\r\n\r\n const projectRoot = process.cwd();\r\n const rawConfig = await configModule.loadConfig(projectRoot);\r\n const config = configModule.resolvePaths(rawConfig, projectRoot);\r\n\r\n const result = await buildModule.build({\r\n projectRoot,\r\n config,\r\n mode: 'production',\r\n analyze: options.analyze\r\n });\r\n\r\n spinner.succeed('Build complete!');\r\n log.blank();\r\n log.success(`Output: ${pc.cyan('.flexi/')}`);\r\n\r\n // Show bundle analysis if enabled\r\n if (options.analyze && result?.analysis) {\r\n log.blank();\r\n log.info('📊 Bundle Analysis:');\r\n log.blank();\r\n\r\n const analysis = result.analysis;\r\n\r\n // Sort by size\r\n const sorted = Object.entries(analysis.files || {})\r\n .sort((a: any, b: any) => b[1].size - a[1].size);\r\n\r\n console.log(pc.dim(' ─────────────────────────────────────────────────'));\r\n console.log(` ${pc.bold('File')}${' '.repeat(35)}${pc.bold('Size')}`);\r\n console.log(pc.dim(' ─────────────────────────────────────────────────'));\r\n\r\n for (const [file, info] of sorted.slice(0, 15) as any) {\r\n const name = file.length > 35 ? '...' + file.slice(-32) : file;\r\n const size = formatBytes(info.size);\r\n const gzip = info.gzipSize ? pc.dim(` (${formatBytes(info.gzipSize)} gzip)`) : '';\r\n console.log(` ${name.padEnd(38)} ${pc.cyan(size)}${gzip}`);\r\n }\r\n\r\n console.log(pc.dim(' ─────────────────────────────────────────────────'));\r\n console.log(` ${pc.bold('Total:')}${' '.repeat(31)} ${pc.green(formatBytes(analysis.totalSize || 0))}`);\r\n\r\n if (analysis.totalGzipSize) {\r\n console.log(` ${pc.dim('Gzipped:')}${' '.repeat(29)} ${pc.dim(formatBytes(analysis.totalGzipSize))}`);\r\n }\r\n\r\n log.blank();\r\n }\r\n\r\n } catch (error: any) {\r\n spinner.fail('Build failed');\r\n log.error(error.message);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\r\n}\r\n\r\n// ============================================================================\r\n// Start Command\r\n// ============================================================================\r\n\r\nasync function runStart(): Promise<void> {\r\n console.log(MINI_LOGO);\r\n log.blank();\r\n log.info('Starting production server...');\r\n log.blank();\r\n\r\n // Determine if we are running from dist or source\r\n const isBuilt = __dirname.includes('dist');\r\n const ext = isBuilt ? 'js' : 'ts';\r\n const startProdPath = path.join(__dirname, '..', 'core', `start-prod.${ext}`);\r\n\r\n const child = spawn(\r\n 'npx',\r\n ['tsx', startProdPath],\r\n {\r\n stdio: 'inherit',\r\n cwd: process.cwd(),\r\n shell: true,\r\n env: { ...process.env, NODE_ENV: 'production' }\r\n }\r\n );\r\n\r\n child.on('error', (error) => {\r\n log.error(`Failed to start server: ${error.message}`);\r\n process.exit(1);\r\n });\r\n\r\n process.on('SIGINT', () => child.kill('SIGINT'));\r\n process.on('SIGTERM', () => child.kill('SIGTERM'));\r\n}\r\n\r\n// ============================================================================\r\n// Doctor Command\r\n// ============================================================================\r\n\r\nasync function runDoctor(): Promise<void> {\r\n console.log(MINI_LOGO);\r\n log.blank();\r\n log.info('Checking your project...');\r\n log.blank();\r\n\r\n interface Check {\r\n name: string;\r\n status: 'pass' | 'fail' | 'warn' | 'info';\r\n message: string;\r\n }\r\n\r\n const checks: Check[] = [];\r\n const projectRoot = process.cwd();\r\n\r\n // Node.js version\r\n const nodeVersion = process.version;\r\n const nodeMajor = parseInt(nodeVersion.slice(1).split('.')[0]);\r\n checks.push({\r\n name: 'Node.js version',\r\n status: nodeMajor >= 18 ? 'pass' : 'fail',\r\n message: nodeMajor >= 18 ? `${nodeVersion} ✓` : `${nodeVersion} (requires 18+)`\r\n });\r\n\r\n // package.json\r\n const packageJsonPath = path.join(projectRoot, 'package.json');\r\n const hasPackageJson = fs.existsSync(packageJsonPath);\r\n checks.push({\r\n name: 'package.json',\r\n status: hasPackageJson ? 'pass' : 'fail',\r\n message: hasPackageJson ? 'Found' : 'Not found'\r\n });\r\n\r\n // pages directory\r\n const pagesDir = path.join(projectRoot, 'pages');\r\n const hasPages = fs.existsSync(pagesDir);\r\n checks.push({\r\n name: 'pages/ directory',\r\n status: hasPages ? 'pass' : 'warn',\r\n message: hasPages ? 'Found' : 'Not found'\r\n });\r\n\r\n // TypeScript\r\n const tsconfigPath = path.join(projectRoot, 'tsconfig.json');\r\n const hasTypeScript = fs.existsSync(tsconfigPath);\r\n checks.push({\r\n name: 'TypeScript',\r\n status: 'info',\r\n message: hasTypeScript ? 'Enabled' : 'Not configured'\r\n });\r\n\r\n // Tailwind\r\n const tailwindPath = path.join(projectRoot, 'tailwind.config.js');\r\n const hasTailwind = fs.existsSync(tailwindPath);\r\n checks.push({\r\n name: 'Tailwind CSS',\r\n status: 'info',\r\n message: hasTailwind ? 'Configured' : 'Not configured'\r\n });\r\n\r\n // Print results\r\n let hasErrors = false;\r\n let hasWarnings = false;\r\n\r\n for (const check of checks) {\r\n let icon: string;\r\n let color: (s: string) => string;\r\n\r\n switch (check.status) {\r\n case 'pass':\r\n icon = '✓';\r\n color = pc.green;\r\n break;\r\n case 'fail':\r\n icon = '✗';\r\n color = pc.red;\r\n hasErrors = true;\r\n break;\r\n case 'warn':\r\n icon = '⚠';\r\n color = pc.yellow;\r\n hasWarnings = true;\r\n break;\r\n default:\r\n icon = '○';\r\n color = pc.cyan;\r\n }\r\n\r\n console.log(` ${color(icon)} ${check.name}: ${pc.dim(check.message)}`);\r\n }\r\n\r\n log.blank();\r\n\r\n if (hasErrors) {\r\n log.error('Some checks failed. Please fix the issues above.');\r\n } else if (hasWarnings) {\r\n log.warn('All critical checks passed with some warnings.');\r\n } else {\r\n log.success('All checks passed! Your project is ready.');\r\n }\r\n\r\n log.blank();\r\n}\r\n\r\n// ============================================================================\r\n// Help Command\r\n// ============================================================================\r\n\r\nfunction showHelp(): void {\r\n console.log(LOGO);\r\n\r\n console.log(` ${pc.bold('Usage:')}`);\r\n console.log(` ${pc.cyan('flexi')} ${pc.dim('<command>')} ${pc.dim('[options]')}`);\r\n log.blank();\r\n\r\n console.log(` ${pc.bold('Commands:')}`);\r\n console.log(` ${pc.cyan('create')} ${pc.dim('<name>')} Create a new FlexiReact project`);\r\n console.log(` ${pc.cyan('dev')} Start development server`);\r\n console.log(` ${pc.cyan('build')} Build for production`);\r\n console.log(` ${pc.cyan('start')} Start production server`);\r\n console.log(` ${pc.cyan('generate')} ${pc.dim('<type>')} Generate component/page/hook/etc (alias: g)`);\r\n console.log(` ${pc.cyan('doctor')} Check project health`);\r\n console.log(` ${pc.cyan('help')} Show this help message`);\r\n log.blank();\r\n\r\n console.log(` ${pc.bold('Generate Types:')}`);\r\n console.log(` ${pc.dim('page, layout, component, hook, api, action, middleware, context')}`);\r\n console.log(` ${pc.dim('loading, error, not-found')}`);\r\n log.blank();\r\n\r\n console.log(` ${pc.bold('Examples:')}`);\r\n console.log(` ${pc.dim('$')} flexi create my-app`);\r\n console.log(` ${pc.dim('$')} flexi dev`);\r\n console.log(` ${pc.dim('$')} flexi g component Button`);\r\n console.log(` ${pc.dim('$')} flexi g page dashboard`);\r\n console.log(` ${pc.dim('$')} flexi build --analyze`);\r\n log.blank();\r\n}\r\n\r\n// ============================================================================\r\n// Main Entry Point\r\n// ============================================================================\r\n\r\nasync function main(): Promise<void> {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n switch (command) {\r\n case 'create':\r\n await createProject(args[1]);\r\n break;\r\n\r\n case 'dev':\r\n await runDev();\r\n break;\r\n\r\n case 'build':\r\n const analyzeFlag = args.includes('--analyze') || args.includes('-a');\r\n await runBuild({ analyze: analyzeFlag });\r\n break;\r\n\r\n case 'start':\r\n await runStart();\r\n break;\r\n\r\n case 'doctor':\r\n await runDoctor();\r\n break;\r\n\r\n case 'generate':\r\n case 'g':\r\n await runGenerate(args[1], args[2]);\r\n break;\r\n\r\n case 'generate:list':\r\n case 'g:list':\r\n listGenerators();\r\n break;\r\n\r\n case 'version':\r\n case '-v':\r\n case '--version':\r\n console.log(`${MINI_LOGO} ${pc.dim(`v${VERSION}`)}`);\r\n break;\r\n\r\n case 'help':\r\n case '--help':\r\n case '-h':\r\n showHelp();\r\n break;\r\n\r\n default:\r\n if (command) {\r\n log.error(`Unknown command: ${command}`);\r\n log.blank();\r\n }\r\n showHelp();\r\n process.exit(command ? 1 : 0);\r\n }\r\n}\r\n\r\nmain().catch((error) => {\r\n log.error(error.message);\r\n process.exit(1);\r\n});\r\n","/**\r\n * FlexiReact CLI Generators\r\n * Scaffolding commands for rapid development\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\n\r\nconst log = {\r\n info: (msg: string) => console.log(`${pc.cyan('ℹ')} ${msg}`),\r\n success: (msg: string) => console.log(`${pc.green('✓')} ${msg}`),\r\n warn: (msg: string) => console.log(`${pc.yellow('⚠')} ${pc.yellow(msg)}`),\r\n error: (msg: string) => console.log(`${pc.red('✗')} ${pc.red(msg)}`),\r\n blank: () => console.log(''),\r\n};\r\n\r\n// ============================================================================\r\n// Templates\r\n// ============================================================================\r\n\r\nconst templates = {\r\n // Page template\r\n page: (name: string, options: { client?: boolean }) => `${options.client ? \"'use client';\\n\\n\" : ''}import React from 'react';\r\n\r\nexport default function ${toPascalCase(name)}Page() {\r\n return (\r\n <div className=\"min-h-screen p-8\">\r\n <h1 className=\"text-4xl font-bold\">${toPascalCase(name)}</h1>\r\n <p className=\"text-gray-400 mt-4\">Welcome to ${name} page</p>\r\n </div>\r\n );\r\n}\r\n`,\r\n\r\n // Layout template\r\n layout: (name: string) => `import React from 'react';\r\n\r\ninterface ${toPascalCase(name)}LayoutProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport default function ${toPascalCase(name)}Layout({ children }: ${toPascalCase(name)}LayoutProps) {\r\n return (\r\n <div className=\"${name}-layout\">\r\n {/* Add your layout wrapper here */}\r\n {children}\r\n </div>\r\n );\r\n}\r\n`,\r\n\r\n // Component template\r\n component: (name: string, options: { client?: boolean; props?: boolean }) => {\r\n const propsInterface = options.props ? `\r\ninterface ${toPascalCase(name)}Props {\r\n className?: string;\r\n children?: React.ReactNode;\r\n}\r\n` : '';\r\n const propsType = options.props ? `{ className, children }: ${toPascalCase(name)}Props` : '{}';\r\n \r\n return `${options.client ? \"'use client';\\n\\n\" : ''}import React from 'react';\r\nimport { cn } from '@/lib/utils';\r\n${propsInterface}\r\nexport function ${toPascalCase(name)}(${propsType}) {\r\n return (\r\n <div className={cn('${toKebabCase(name)}', ${options.props ? 'className' : \"''\"})}>\r\n ${options.props ? '{children}' : `{/* ${toPascalCase(name)} content */}`}\r\n </div>\r\n );\r\n}\r\n\r\nexport default ${toPascalCase(name)};\r\n`;\r\n },\r\n\r\n // Hook template\r\n hook: (name: string) => `import { useState, useEffect, useCallback } from 'react';\r\n\r\nexport function use${toPascalCase(name)}() {\r\n const [state, setState] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const execute = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n // Add your logic here\r\n setState(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error('Unknown error'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n return { state, loading, error, execute };\r\n}\r\n\r\nexport default use${toPascalCase(name)};\r\n`,\r\n\r\n // API route template\r\n api: (name: string) => `import type { IncomingMessage, ServerResponse } from 'http';\r\n\r\nexport default async function handler(req: IncomingMessage, res: ServerResponse) {\r\n const method = req.method;\r\n\r\n switch (method) {\r\n case 'GET':\r\n return handleGet(req, res);\r\n case 'POST':\r\n return handlePost(req, res);\r\n default:\r\n res.statusCode = 405;\r\n res.setHeader('Content-Type', 'application/json');\r\n res.end(JSON.stringify({ error: 'Method not allowed' }));\r\n }\r\n}\r\n\r\nasync function handleGet(req: IncomingMessage, res: ServerResponse) {\r\n res.statusCode = 200;\r\n res.setHeader('Content-Type', 'application/json');\r\n res.end(JSON.stringify({ message: '${name} API - GET' }));\r\n}\r\n\r\nasync function handlePost(req: IncomingMessage, res: ServerResponse) {\r\n // Parse body\r\n let body = '';\r\n for await (const chunk of req) {\r\n body += chunk;\r\n }\r\n const data = body ? JSON.parse(body) : {};\r\n\r\n res.statusCode = 200;\r\n res.setHeader('Content-Type', 'application/json');\r\n res.end(JSON.stringify({ message: '${name} API - POST', data }));\r\n}\r\n`,\r\n\r\n // Server Action template\r\n action: (name: string) => `'use server';\r\n\r\nimport { revalidatePath } from '@flexireact/core';\r\n\r\nexport async function ${toCamelCase(name)}Action(formData: FormData) {\r\n // Validate input\r\n const data = Object.fromEntries(formData);\r\n \r\n try {\r\n // Add your server logic here\r\n console.log('${toPascalCase(name)} action executed:', data);\r\n \r\n // Revalidate cache if needed\r\n // revalidatePath('/');\r\n \r\n return { success: true, data };\r\n } catch (error) {\r\n return { \r\n success: false, \r\n error: error instanceof Error ? error.message : 'Unknown error' \r\n };\r\n }\r\n}\r\n`,\r\n\r\n // Middleware template\r\n middleware: (name: string) => `import type { IncomingMessage, ServerResponse } from 'http';\r\n\r\nexport interface ${toPascalCase(name)}MiddlewareOptions {\r\n // Add your options here\r\n}\r\n\r\nexport function ${toCamelCase(name)}Middleware(options: ${toPascalCase(name)}MiddlewareOptions = {}) {\r\n return async (\r\n req: IncomingMessage,\r\n res: ServerResponse,\r\n next: () => Promise<void>\r\n ) => {\r\n // Before request handling\r\n console.log('[${toPascalCase(name)}] Request:', req.url);\r\n \r\n // Continue to next middleware/handler\r\n await next();\r\n \r\n // After request handling (optional)\r\n };\r\n}\r\n\r\nexport default ${toCamelCase(name)}Middleware;\r\n`,\r\n\r\n // Context template\r\n context: (name: string) => `'use client';\r\n\r\nimport React, { createContext, useContext, useState, useCallback } from 'react';\r\n\r\ninterface ${toPascalCase(name)}State {\r\n // Add your state properties here\r\n value: string | null;\r\n}\r\n\r\ninterface ${toPascalCase(name)}ContextValue extends ${toPascalCase(name)}State {\r\n setValue: (value: string) => void;\r\n reset: () => void;\r\n}\r\n\r\nconst ${toPascalCase(name)}Context = createContext<${toPascalCase(name)}ContextValue | null>(null);\r\n\r\nexport function ${toPascalCase(name)}Provider({ children }: { children: React.ReactNode }) {\r\n const [state, setState] = useState<${toPascalCase(name)}State>({\r\n value: null,\r\n });\r\n\r\n const setValue = useCallback((value: string) => {\r\n setState(prev => ({ ...prev, value }));\r\n }, []);\r\n\r\n const reset = useCallback(() => {\r\n setState({ value: null });\r\n }, []);\r\n\r\n return (\r\n <${toPascalCase(name)}Context.Provider value={{ ...state, setValue, reset }}>\r\n {children}\r\n </${toPascalCase(name)}Context.Provider>\r\n );\r\n}\r\n\r\nexport function use${toPascalCase(name)}() {\r\n const context = useContext(${toPascalCase(name)}Context);\r\n if (!context) {\r\n throw new Error('use${toPascalCase(name)} must be used within a ${toPascalCase(name)}Provider');\r\n }\r\n return context;\r\n}\r\n`,\r\n\r\n // Loading template\r\n loading: () => `import React from 'react';\r\nimport { Spinner } from '@flexireact/flexi-ui';\r\n\r\nexport default function Loading() {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center\">\r\n <Spinner size=\"lg\" />\r\n </div>\r\n );\r\n}\r\n`,\r\n\r\n // Error template\r\n error: () => `'use client';\r\n\r\nimport React from 'react';\r\nimport { Button, Alert } from '@flexireact/flexi-ui';\r\n\r\ninterface ErrorProps {\r\n error: Error;\r\n reset: () => void;\r\n}\r\n\r\nexport default function Error({ error, reset }: ErrorProps) {\r\n return (\r\n <div className=\"min-h-screen flex flex-col items-center justify-center p-8\">\r\n <Alert variant=\"error\" className=\"max-w-md mb-8\">\r\n <h2 className=\"font-bold text-lg mb-2\">Something went wrong</h2>\r\n <p className=\"text-sm\">{error.message}</p>\r\n </Alert>\r\n <Button onClick={reset}>Try again</Button>\r\n </div>\r\n );\r\n}\r\n`,\r\n\r\n // Not found template\r\n notFound: () => `import React from 'react';\r\nimport { Button } from '@flexireact/flexi-ui';\r\n\r\nexport default function NotFound() {\r\n return (\r\n <div className=\"min-h-screen flex flex-col items-center justify-center p-8\">\r\n <h1 className=\"text-8xl font-bold text-primary mb-4\">404</h1>\r\n <p className=\"text-gray-400 text-xl mb-8\">Page not found</p>\r\n <Button asChild>\r\n <a href=\"/\">← Back Home</a>\r\n </Button>\r\n </div>\r\n );\r\n}\r\n`,\r\n};\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\nfunction toPascalCase(str: string): string {\r\n return str\r\n .replace(/[-_](.)/g, (_, c) => c.toUpperCase())\r\n .replace(/^(.)/, (_, c) => c.toUpperCase());\r\n}\r\n\r\nfunction toCamelCase(str: string): string {\r\n return str\r\n .replace(/[-_](.)/g, (_, c) => c.toUpperCase())\r\n .replace(/^(.)/, (_, c) => c.toLowerCase());\r\n}\r\n\r\nfunction toKebabCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[_\\s]+/g, '-')\r\n .toLowerCase();\r\n}\r\n\r\nfunction ensureDir(filePath: string): void {\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n}\r\n\r\nfunction writeFile(filePath: string, content: string): void {\r\n ensureDir(filePath);\r\n fs.writeFileSync(filePath, content);\r\n}\r\n\r\n// ============================================================================\r\n// Generator Commands\r\n// ============================================================================\r\n\r\nexport type GeneratorType = \r\n | 'page' \r\n | 'layout' \r\n | 'component' \r\n | 'hook' \r\n | 'api' \r\n | 'action' \r\n | 'middleware' \r\n | 'context'\r\n | 'loading'\r\n | 'error'\r\n | 'not-found';\r\n\r\nexport async function runGenerate(type?: string, name?: string): Promise<void> {\r\n const cwd = process.cwd();\r\n \r\n // Check if we're in a FlexiReact project\r\n if (!fs.existsSync(path.join(cwd, 'package.json'))) {\r\n log.error('Not in a FlexiReact project. Run this command in your project root.');\r\n process.exit(1);\r\n }\r\n\r\n // Interactive mode if no type provided\r\n if (!type) {\r\n const response = await prompts([\r\n {\r\n type: 'select',\r\n name: 'type',\r\n message: 'What do you want to generate?',\r\n choices: [\r\n { title: '📄 Page', value: 'page', description: 'A new page in app/ or pages/' },\r\n { title: '📐 Layout', value: 'layout', description: 'A layout wrapper component' },\r\n { title: '🧩 Component', value: 'component', description: 'A reusable React component' },\r\n { title: '🪝 Hook', value: 'hook', description: 'A custom React hook' },\r\n { title: '🔌 API Route', value: 'api', description: 'An API endpoint' },\r\n { title: '⚡ Server Action', value: 'action', description: 'A server action function' },\r\n { title: '🛡️ Middleware', value: 'middleware', description: 'Request middleware' },\r\n { title: '🌐 Context', value: 'context', description: 'React context provider' },\r\n { title: '⏳ Loading', value: 'loading', description: 'Loading state component' },\r\n { title: '❌ Error', value: 'error', description: 'Error boundary component' },\r\n { title: '🔍 Not Found', value: 'not-found', description: '404 page component' },\r\n ],\r\n },\r\n {\r\n type: (prev) => ['loading', 'error', 'not-found'].includes(prev) ? null : 'text',\r\n name: 'name',\r\n message: 'Name:',\r\n validate: (v: string) => v.length > 0 || 'Name is required',\r\n },\r\n ]);\r\n\r\n if (!response.type) process.exit(0);\r\n type = response.type;\r\n name = response.name;\r\n }\r\n\r\n // Validate type\r\n const validTypes: GeneratorType[] = [\r\n 'page', 'layout', 'component', 'hook', 'api', \r\n 'action', 'middleware', 'context', 'loading', 'error', 'not-found'\r\n ];\r\n \r\n if (!validTypes.includes(type as GeneratorType)) {\r\n log.error(`Invalid type: ${type}`);\r\n log.info(`Valid types: ${validTypes.join(', ')}`);\r\n process.exit(1);\r\n }\r\n\r\n // Special types that don't need a name\r\n if (type && ['loading', 'error', 'not-found'].includes(type)) {\r\n await generateSpecialFile(type as 'loading' | 'error' | 'not-found', cwd);\r\n return;\r\n }\r\n\r\n // Get name if not provided\r\n let finalName = name;\r\n if (!finalName) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: `${toPascalCase(type || 'item')} name:`,\r\n validate: (v: string) => v.length > 0 || 'Name is required',\r\n });\r\n finalName = response.name;\r\n if (!finalName) process.exit(0);\r\n }\r\n\r\n // Generate based on type\r\n switch (type) {\r\n case 'page':\r\n await generatePage(finalName, cwd);\r\n break;\r\n case 'layout':\r\n await generateLayout(finalName, cwd);\r\n break;\r\n case 'component':\r\n await generateComponent(finalName, cwd);\r\n break;\r\n case 'hook':\r\n await generateHook(finalName, cwd);\r\n break;\r\n case 'api':\r\n await generateApi(finalName, cwd);\r\n break;\r\n case 'action':\r\n await generateAction(finalName, cwd);\r\n break;\r\n case 'middleware':\r\n await generateMiddleware(finalName, cwd);\r\n break;\r\n case 'context':\r\n await generateContext(finalName, cwd);\r\n break;\r\n }\r\n}\r\n\r\nasync function generatePage(name: string, cwd: string): Promise<void> {\r\n const response = await prompts([\r\n {\r\n type: 'select',\r\n name: 'directory',\r\n message: 'Where to create the page?',\r\n choices: [\r\n { title: 'app/ (App Router)', value: 'app' },\r\n { title: 'pages/ (Pages Router)', value: 'pages' },\r\n ],\r\n },\r\n {\r\n type: 'toggle',\r\n name: 'client',\r\n message: 'Client component? (use client)',\r\n initial: false,\r\n active: 'Yes',\r\n inactive: 'No',\r\n },\r\n ]);\r\n\r\n const fileName = response.directory === 'app' ? 'page.tsx' : `${toKebabCase(name)}.tsx`;\r\n const filePath = response.directory === 'app' \r\n ? path.join(cwd, 'app', toKebabCase(name), fileName)\r\n : path.join(cwd, 'pages', fileName);\r\n\r\n writeFile(filePath, templates.page(name, { client: response.client }));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateLayout(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'app', toKebabCase(name), 'layout.tsx');\r\n writeFile(filePath, templates.layout(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateComponent(name: string, cwd: string): Promise<void> {\r\n const response = await prompts([\r\n {\r\n type: 'select',\r\n name: 'directory',\r\n message: 'Where to create the component?',\r\n choices: [\r\n { title: 'components/', value: 'components' },\r\n { title: 'app/components/', value: 'app/components' },\r\n ],\r\n },\r\n {\r\n type: 'toggle',\r\n name: 'client',\r\n message: 'Client component?',\r\n initial: true,\r\n active: 'Yes',\r\n inactive: 'No',\r\n },\r\n {\r\n type: 'toggle',\r\n name: 'props',\r\n message: 'Include props interface?',\r\n initial: true,\r\n active: 'Yes',\r\n inactive: 'No',\r\n },\r\n ]);\r\n\r\n const filePath = path.join(cwd, response.directory, `${toPascalCase(name)}.tsx`);\r\n writeFile(filePath, templates.component(name, { client: response.client, props: response.props }));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateHook(name: string, cwd: string): Promise<void> {\r\n const hookName = name.startsWith('use') ? name : `use-${name}`;\r\n const filePath = path.join(cwd, 'hooks', `${toKebabCase(hookName)}.ts`);\r\n writeFile(filePath, templates.hook(hookName.replace(/^use-?/, '')));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateApi(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'pages', 'api', `${toKebabCase(name)}.ts`);\r\n writeFile(filePath, templates.api(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateAction(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'actions', `${toKebabCase(name)}.ts`);\r\n writeFile(filePath, templates.action(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateMiddleware(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'middleware', `${toKebabCase(name)}.ts`);\r\n writeFile(filePath, templates.middleware(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateContext(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'contexts', `${toPascalCase(name)}Context.tsx`);\r\n writeFile(filePath, templates.context(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateSpecialFile(type: 'loading' | 'error' | 'not-found', cwd: string): Promise<void> {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'path',\r\n message: 'Path (relative to app/):',\r\n initial: '',\r\n });\r\n\r\n const basePath = response.path ? path.join(cwd, 'app', response.path) : path.join(cwd, 'app');\r\n \r\n let fileName: string;\r\n let content: string;\r\n \r\n switch (type) {\r\n case 'loading':\r\n fileName = 'loading.tsx';\r\n content = templates.loading();\r\n break;\r\n case 'error':\r\n fileName = 'error.tsx';\r\n content = templates.error();\r\n break;\r\n case 'not-found':\r\n fileName = 'not-found.tsx';\r\n content = templates.notFound();\r\n break;\r\n }\r\n\r\n const filePath = path.join(basePath, fileName);\r\n writeFile(filePath, content);\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\n// ============================================================================\r\n// List Generators\r\n// ============================================================================\r\n\r\nexport function listGenerators(): void {\r\n console.log(`\r\n${pc.bold('Available Generators:')}\r\n\r\n ${pc.cyan('page')} Create a new page (app/ or pages/)\r\n ${pc.cyan('layout')} Create a layout wrapper\r\n ${pc.cyan('component')} Create a React component\r\n ${pc.cyan('hook')} Create a custom hook\r\n ${pc.cyan('api')} Create an API route\r\n ${pc.cyan('action')} Create a server action\r\n ${pc.cyan('middleware')} Create request middleware\r\n ${pc.cyan('context')} Create a React context\r\n ${pc.cyan('loading')} Create a loading component\r\n ${pc.cyan('error')} Create an error boundary\r\n ${pc.cyan('not-found')} Create a 404 page\r\n\r\n${pc.bold('Usage:')}\r\n ${pc.dim('$')} flexi generate ${pc.cyan('<type>')} ${pc.dim('[name]')}\r\n ${pc.dim('$')} flexi g ${pc.cyan('<type>')} ${pc.dim('[name]')}\r\n\r\n${pc.bold('Examples:')}\r\n ${pc.dim('$')} flexi g page dashboard\r\n ${pc.dim('$')} flexi g component Button\r\n ${pc.dim('$')} flexi g hook auth\r\n ${pc.dim('$')} flexi g api users\r\n`);\r\n}\r\n"],"mappings":";;;AAOA,OAAOA,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,eAAe,qBAAqB;AAC7C,SAAmB,aAAa;AAChC,OAAOC,SAAQ;AACf,OAAOC,cAAa;AACpB,OAAO,SAAS;;;ACRhB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,OAAO,aAAa;AAEpB,IAAM,MAAM;AAAA,EACV,MAAM,CAAC,QAAgB,QAAQ,IAAI,GAAG,GAAG,KAAK,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAC3D,SAAS,CAAC,QAAgB,QAAQ,IAAI,GAAG,GAAG,MAAM,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAC/D,MAAM,CAAC,QAAgB,QAAQ,IAAI,GAAG,GAAG,OAAO,QAAG,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,EAAE;AAAA,EACxE,OAAO,CAAC,QAAgB,QAAQ,IAAI,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,EACnE,OAAO,MAAM,QAAQ,IAAI,EAAE;AAC7B;AAMA,IAAM,YAAY;AAAA;AAAA,EAEhB,MAAM,CAAC,MAAc,YAAkC,GAAG,QAAQ,SAAS,sBAAsB,EAAE;AAAA;AAAA,0BAE3E,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA,2CAGD,aAAa,IAAI,CAAC;AAAA,qDACR,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvD,QAAQ,CAAC,SAAiB;AAAA;AAAA,YAEhB,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,0BAIJ,aAAa,IAAI,CAAC,wBAAwB,aAAa,IAAI,CAAC;AAAA;AAAA,sBAEhE,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASxB,WAAW,CAAC,MAAc,YAAmD;AAC3E,UAAM,iBAAiB,QAAQ,QAAQ;AAAA,YAC/B,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,IAI1B;AACA,UAAM,YAAY,QAAQ,QAAQ,4BAA4B,aAAa,IAAI,CAAC,UAAU;AAE1F,WAAO,GAAG,QAAQ,SAAS,sBAAsB,EAAE;AAAA;AAAA,EAErD,cAAc;AAAA,kBACE,aAAa,IAAI,CAAC,IAAI,SAAS;AAAA;AAAA,0BAEvB,YAAY,IAAI,CAAC,MAAM,QAAQ,QAAQ,cAAc,IAAI;AAAA,QAC3E,QAAQ,QAAQ,eAAe,OAAO,aAAa,IAAI,CAAC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,iBAK7D,aAAa,IAAI,CAAC;AAAA;AAAA,EAEjC;AAAA;AAAA,EAGA,MAAM,CAAC,SAAiB;AAAA;AAAA,qBAEL,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAqBnB,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA,EAIpC,KAAK,CAAC,SAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAoBc,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAaJ,IAAI;AAAA;AAAA;AAAA;AAAA,EAKzC,QAAQ,CAAC,SAAiB;AAAA;AAAA;AAAA;AAAA,wBAIJ,YAAY,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAMtB,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBnC,YAAY,CAAC,SAAiB;AAAA;AAAA,mBAEb,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,kBAInB,YAAY,IAAI,CAAC,uBAAuB,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAOxD,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBASrB,YAAY,IAAI,CAAC;AAAA;AAAA;AAAA,EAIhC,SAAS,CAAC,SAAiB;AAAA;AAAA;AAAA;AAAA,YAIjB,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAKlB,aAAa,IAAI,CAAC,wBAAwB,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,QAKhE,aAAa,IAAI,CAAC,2BAA2B,aAAa,IAAI,CAAC;AAAA;AAAA,kBAErD,aAAa,IAAI,CAAC;AAAA,uCACG,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAalD,aAAa,IAAI,CAAC;AAAA;AAAA,QAEjB,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,qBAIL,aAAa,IAAI,CAAC;AAAA,+BACR,aAAa,IAAI,CAAC;AAAA;AAAA,0BAEvB,aAAa,IAAI,CAAC,0BAA0B,aAAa,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOtF,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaf,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBb,UAAU,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAelB;AAMA,SAAS,aAAa,KAAqB;AACzC,SAAO,IACJ,QAAQ,YAAY,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC,EAC7C,QAAQ,QAAQ,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AAC9C;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,IACJ,QAAQ,YAAY,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC,EAC7C,QAAQ,QAAQ,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AAC9C;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,IACJ,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,WAAW,GAAG,EACtB,YAAY;AACjB;AAEA,SAAS,UAAU,UAAwB;AACzC,QAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,MAAI,CAAC,GAAG,WAAW,GAAG,GAAG;AACvB,OAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AACF;AAEA,SAAS,UAAU,UAAkB,SAAuB;AAC1D,YAAU,QAAQ;AAClB,KAAG,cAAc,UAAU,OAAO;AACpC;AAmBA,eAAsB,YAAY,MAAe,MAA8B;AAC7E,QAAM,MAAM,QAAQ,IAAI;AAGxB,MAAI,CAAC,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AAClD,QAAI,MAAM,qEAAqE;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,CAAC,MAAM;AACT,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,OAAO,kBAAW,OAAO,QAAQ,aAAa,+BAA+B;AAAA,UAC/E,EAAE,OAAO,oBAAa,OAAO,UAAU,aAAa,6BAA6B;AAAA,UACjF,EAAE,OAAO,uBAAgB,OAAO,aAAa,aAAa,6BAA6B;AAAA,UACvF,EAAE,OAAO,kBAAW,OAAO,QAAQ,aAAa,sBAAsB;AAAA,UACtE,EAAE,OAAO,uBAAgB,OAAO,OAAO,aAAa,kBAAkB;AAAA,UACtE,EAAE,OAAO,wBAAmB,OAAO,UAAU,aAAa,2BAA2B;AAAA,UACrF,EAAE,OAAO,8BAAkB,OAAO,cAAc,aAAa,qBAAqB;AAAA,UAClF,EAAE,OAAO,qBAAc,OAAO,WAAW,aAAa,yBAAyB;AAAA,UAC/E,EAAE,OAAO,kBAAa,OAAO,WAAW,aAAa,0BAA0B;AAAA,UAC/E,EAAE,OAAO,gBAAW,OAAO,SAAS,aAAa,2BAA2B;AAAA,UAC5E,EAAE,OAAO,uBAAgB,OAAO,aAAa,aAAa,qBAAqB;AAAA,QACjF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM,CAAC,SAAS,CAAC,WAAW,SAAS,WAAW,EAAE,SAAS,IAAI,IAAI,OAAO;AAAA,QAC1E,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU,CAAC,MAAc,EAAE,SAAS,KAAK;AAAA,MAC3C;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,KAAM,SAAQ,KAAK,CAAC;AAClC,WAAO,SAAS;AAChB,WAAO,SAAS;AAAA,EAClB;AAGA,QAAM,aAA8B;AAAA,IAClC;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAa;AAAA,IAAQ;AAAA,IACvC;AAAA,IAAU;AAAA,IAAc;AAAA,IAAW;AAAA,IAAW;AAAA,IAAS;AAAA,EACzD;AAEA,MAAI,CAAC,WAAW,SAAS,IAAqB,GAAG;AAC/C,QAAI,MAAM,iBAAiB,IAAI,EAAE;AACjC,QAAI,KAAK,gBAAgB,WAAW,KAAK,IAAI,CAAC,EAAE;AAChD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,QAAQ,CAAC,WAAW,SAAS,WAAW,EAAE,SAAS,IAAI,GAAG;AAC5D,UAAM,oBAAoB,MAA2C,GAAG;AACxE;AAAA,EACF;AAGA,MAAI,YAAY;AAChB,MAAI,CAAC,WAAW;AACd,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,GAAG,aAAa,QAAQ,MAAM,CAAC;AAAA,MACxC,UAAU,CAAC,MAAc,EAAE,SAAS,KAAK;AAAA,IAC3C,CAAC;AACD,gBAAY,SAAS;AACrB,QAAI,CAAC,UAAW,SAAQ,KAAK,CAAC;AAAA,EAChC;AAGA,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,YAAM,aAAa,WAAW,GAAG;AACjC;AAAA,IACF,KAAK;AACH,YAAM,eAAe,WAAW,GAAG;AACnC;AAAA,IACF,KAAK;AACH,YAAM,kBAAkB,WAAW,GAAG;AACtC;AAAA,IACF,KAAK;AACH,YAAM,aAAa,WAAW,GAAG;AACjC;AAAA,IACF,KAAK;AACH,YAAM,YAAY,WAAW,GAAG;AAChC;AAAA,IACF,KAAK;AACH,YAAM,eAAe,WAAW,GAAG;AACnC;AAAA,IACF,KAAK;AACH,YAAM,mBAAmB,WAAW,GAAG;AACvC;AAAA,IACF,KAAK;AACH,YAAM,gBAAgB,WAAW,GAAG;AACpC;AAAA,EACJ;AACF;AAEA,eAAe,aAAa,MAAc,KAA4B;AACpE,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,qBAAqB,OAAO,MAAM;AAAA,QAC3C,EAAE,OAAO,yBAAyB,OAAO,QAAQ;AAAA,MACnD;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAED,QAAM,WAAW,SAAS,cAAc,QAAQ,aAAa,GAAG,YAAY,IAAI,CAAC;AACjF,QAAM,WAAW,SAAS,cAAc,QACpC,KAAK,KAAK,KAAK,OAAO,YAAY,IAAI,GAAG,QAAQ,IACjD,KAAK,KAAK,KAAK,SAAS,QAAQ;AAEpC,YAAU,UAAU,UAAU,KAAK,MAAM,EAAE,QAAQ,SAAS,OAAO,CAAC,CAAC;AACrE,MAAI,QAAQ,WAAW,GAAG,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAChE;AAEA,eAAe,eAAe,MAAc,KAA4B;AACtE,QAAM,WAAW,KAAK,KAAK,KAAK,OAAO,YAAY,IAAI,GAAG,YAAY;AACtE,YAAU,UAAU,UAAU,OAAO,IAAI,CAAC;AAC1C,MAAI,QAAQ,WAAW,GAAG,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAChE;AAEA,eAAe,kBAAkB,MAAc,KAA4B;AACzE,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,eAAe,OAAO,aAAa;AAAA,QAC5C,EAAE,OAAO,mBAAmB,OAAO,iBAAiB;AAAA,MACtD;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAED,QAAM,WAAW,KAAK,KAAK,KAAK,SAAS,WAAW,GAAG,aAAa,IAAI,CAAC,MAAM;AAC/E,YAAU,UAAU,UAAU,UAAU,MAAM,EAAE,QAAQ,SAAS,QAAQ,OAAO,SAAS,MAAM,CAAC,CAAC;AACjG,MAAI,QAAQ,WAAW,GAAG,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAChE;AAEA,eAAe,aAAa,MAAc,KAA4B;AACpE,QAAM,WAAW,KAAK,WAAW,KAAK,IAAI,OAAO,OAAO,IAAI;AAC5D,QAAM,WAAW,KAAK,KAAK,KAAK,SAAS,GAAG,YAAY,QAAQ,CAAC,KAAK;AACtE,YAAU,UAAU,UAAU,KAAK,SAAS,QAAQ,UAAU,EAAE,CAAC,CAAC;AAClE,MAAI,QAAQ,WAAW,GAAG,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAChE;AAEA,eAAe,YAAY,MAAc,KAA4B;AACnE,QAAM,WAAW,KAAK,KAAK,KAAK,SAAS,OAAO,GAAG,YAAY,IAAI,CAAC,KAAK;AACzE,YAAU,UAAU,UAAU,IAAI,IAAI,CAAC;AACvC,MAAI,QAAQ,WAAW,GAAG,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAChE;AAEA,eAAe,eAAe,MAAc,KAA4B;AACtE,QAAM,WAAW,KAAK,KAAK,KAAK,WAAW,GAAG,YAAY,IAAI,CAAC,KAAK;AACpE,YAAU,UAAU,UAAU,OAAO,IAAI,CAAC;AAC1C,MAAI,QAAQ,WAAW,GAAG,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAChE;AAEA,eAAe,mBAAmB,MAAc,KAA4B;AAC1E,QAAM,WAAW,KAAK,KAAK,KAAK,cAAc,GAAG,YAAY,IAAI,CAAC,KAAK;AACvE,YAAU,UAAU,UAAU,WAAW,IAAI,CAAC;AAC9C,MAAI,QAAQ,WAAW,GAAG,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAChE;AAEA,eAAe,gBAAgB,MAAc,KAA4B;AACvE,QAAM,WAAW,KAAK,KAAK,KAAK,YAAY,GAAG,aAAa,IAAI,CAAC,aAAa;AAC9E,YAAU,UAAU,UAAU,QAAQ,IAAI,CAAC;AAC3C,MAAI,QAAQ,WAAW,GAAG,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAChE;AAEA,eAAe,oBAAoB,MAAyC,KAA4B;AACtG,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,WAAW,SAAS,OAAO,KAAK,KAAK,KAAK,OAAO,SAAS,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK;AAE5F,MAAI;AACJ,MAAI;AAEJ,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,iBAAW;AACX,gBAAU,UAAU,QAAQ;AAC5B;AAAA,IACF,KAAK;AACH,iBAAW;AACX,gBAAU,UAAU,MAAM;AAC1B;AAAA,IACF,KAAK;AACH,iBAAW;AACX,gBAAU,UAAU,SAAS;AAC7B;AAAA,EACJ;AAEA,QAAM,WAAW,KAAK,KAAK,UAAU,QAAQ;AAC7C,YAAU,UAAU,OAAO;AAC3B,MAAI,QAAQ,WAAW,GAAG,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,EAAE;AAChE;AAMO,SAAS,iBAAuB;AACrC,UAAQ,IAAI;AAAA,EACZ,GAAG,KAAK,uBAAuB,CAAC;AAAA;AAAA,IAE9B,GAAG,KAAK,MAAM,CAAC;AAAA,IACf,GAAG,KAAK,QAAQ,CAAC;AAAA,IACjB,GAAG,KAAK,WAAW,CAAC;AAAA,IACpB,GAAG,KAAK,MAAM,CAAC;AAAA,IACf,GAAG,KAAK,KAAK,CAAC;AAAA,IACd,GAAG,KAAK,QAAQ,CAAC;AAAA,IACjB,GAAG,KAAK,YAAY,CAAC;AAAA,IACrB,GAAG,KAAK,SAAS,CAAC;AAAA,IAClB,GAAG,KAAK,SAAS,CAAC;AAAA,IAClB,GAAG,KAAK,OAAO,CAAC;AAAA,IAChB,GAAG,KAAK,WAAW,CAAC;AAAA;AAAA,EAEtB,GAAG,KAAK,QAAQ,CAAC;AAAA,IACf,GAAG,IAAI,GAAG,CAAC,mBAAmB,GAAG,KAAK,QAAQ,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC;AAAA,IACnE,GAAG,IAAI,GAAG,CAAC,YAAY,GAAG,KAAK,QAAQ,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC;AAAA;AAAA,EAE9D,GAAG,KAAK,WAAW,CAAC;AAAA,IAClB,GAAG,IAAI,GAAG,CAAC;AAAA,IACX,GAAG,IAAI,GAAG,CAAC;AAAA,IACX,GAAG,IAAI,GAAG,CAAC;AAAA,IACX,GAAG,IAAI,GAAG,CAAC;AAAA,CACd;AACD;;;ADvlBA,IAAMC,cAAa,cAAc,YAAY,GAAG;AAChD,IAAMC,aAAYC,MAAK,QAAQF,WAAU;AACzC,IAAM,UAAU;AAMhB,IAAM,OAAO;AAAA,EACXG,IAAG,KAAK,gXAA+D,CAAC;AAAA,EACxEA,IAAG,KAAK,QAAG,CAAC,gEAAgEA,IAAG,KAAK,QAAG,CAAC;AAAA,EACxFA,IAAG,KAAK,QAAG,CAAC,MAAMA,IAAG,KAAKA,IAAG,QAAQ,QAAG,CAAC,CAAC,IAAIA,IAAG,KAAKA,IAAG,MAAM,qBAAqB,CAAC,CAAC,qCAAqCA,IAAG,KAAK,QAAG,CAAC;AAAA,EACvIA,IAAG,KAAK,QAAG,CAAC,gEAAgEA,IAAG,KAAK,QAAG,CAAC;AAAA,EACxFA,IAAG,KAAK,QAAG,CAAC,MAAMA,IAAG,IAAI,4BAA4B,CAAC,iCAAiCA,IAAG,KAAK,QAAG,CAAC;AAAA,EACnGA,IAAG,KAAK,QAAG,CAAC,MAAMA,IAAG,IAAI,sDAAuC,CAAC,sBAAsBA,IAAG,KAAK,QAAG,CAAC;AAAA,EACnGA,IAAG,KAAK,QAAG,CAAC,gEAAgEA,IAAG,KAAK,QAAG,CAAC;AAAA,EACxFA,IAAG,KAAK,gXAA+D,CAAC;AAAA;AAG1E,IAAM,YAAY,GAAGA,IAAG,QAAQ,QAAG,CAAC,IAAIA,IAAG,KAAK,YAAY,CAAC;AAM7D,IAAMC,OAAM;AAAA,EACV,MAAM,CAAC,QAAgB,QAAQ,IAAI,GAAGD,IAAG,KAAK,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAC3D,SAAS,CAAC,QAAgB,QAAQ,IAAI,GAAGA,IAAG,MAAM,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAC/D,MAAM,CAAC,QAAgB,QAAQ,IAAI,GAAGA,IAAG,OAAO,QAAG,CAAC,IAAIA,IAAG,OAAO,GAAG,CAAC,EAAE;AAAA,EACxE,OAAO,CAAC,QAAgB,QAAQ,IAAI,GAAGA,IAAG,IAAI,QAAG,CAAC,IAAIA,IAAG,IAAI,GAAG,CAAC,EAAE;AAAA,EACnE,MAAM,CAAC,KAAa,OAAe,QACjC,QAAQ,IAAI,GAAGA,IAAG,IAAI,IAAI,GAAG,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EACrD,OAAO,MAAM,QAAQ,IAAI,EAAE;AAAA,EAC3B,SAAS,MAAM,QAAQ,IAAIA,IAAG,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACnD;AAMA,SAAS,cAAc,KAAa,MAAoB;AACtD,MAAI,CAACE,IAAG,WAAW,IAAI,GAAG;AACxB,IAAAA,IAAG,UAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EACxC;AAEA,QAAM,UAAUA,IAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAE3D,aAAW,SAAS,SAAS;AAC3B,UAAM,UAAUH,MAAK,KAAK,KAAK,MAAM,IAAI;AACzC,UAAM,WAAWA,MAAK,KAAK,MAAM,MAAM,IAAI;AAE3C,QAAI,MAAM,YAAY,GAAG;AACvB,oBAAc,SAAS,QAAQ;AAAA,IACjC,OAAO;AACL,MAAAG,IAAG,aAAa,SAAS,QAAQ;AAAA,IACnC;AAAA,EACF;AACF;AAEA,eAAe,WAAW,KAAa,KAA4B;AACjE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,KAAK;AAAA,MACvB,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,EAAG,SAAQ;AAAA,UACnB,QAAO,IAAI,MAAM,4BAA4B,IAAI,EAAE,CAAC;AAAA,IAC3D,CAAC;AAED,UAAM,GAAG,SAAS,MAAM;AAAA,EAC1B,CAAC;AACH;AAaA,eAAe,cAAc,aAAqC;AAChE,UAAQ,IAAI,IAAI;AAChB,EAAAD,KAAI,MAAM;AAGV,MAAI,OAAO;AACX,MAAI,CAAC,MAAM;AACT,UAAM,WAAW,MAAME,SAAQ;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU,CAAC,UAAkB,MAAM,SAAS,KAAK;AAAA,IACnD,CAAC;AACD,WAAO,SAAS;AAChB,QAAI,CAAC,KAAM,SAAQ,KAAK,CAAC;AAAA,EAC3B;AAEA,QAAM,cAAcJ,MAAK,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAGpD,MAAIG,IAAG,WAAW,WAAW,GAAG;AAC9B,IAAAD,KAAI,MAAM,cAAc,IAAI,mBAAmB;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,UAAU,MAAME,SAAQ;AAAA,IAC5B;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,4CAAqC,OAAO,UAAU;AAAA,QAC/D,EAAE,OAAO,2DAAoD,OAAO,WAAW;AAAA,QAC/E,EAAE,OAAO,mCAA4B,OAAO,UAAU;AAAA,MACxD;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAED,MAAI,QAAQ,aAAa,OAAW,SAAQ,KAAK,CAAC;AAElD,EAAAF,KAAI,MAAM;AACV,EAAAA,KAAI,QAAQ;AACZ,EAAAA,KAAI,MAAM;AAEV,QAAM,aAAa,QAAQ,aAAa,YAAY,IAAK,QAAQ,aAAa,aAAa,IAAI;AAC/F,MAAI,cAAc;AAGlB;AACA,EAAAA,KAAI,KAAK,aAAa,YAAY,+BAA+B;AACjE,EAAAC,IAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC7C,EAAAD,KAAI,QAAQ,WAAWD,IAAG,KAAK,IAAI,CAAC,GAAG;AAGvC;AACA,EAAAC,KAAI,KAAK,aAAa,YAAY,iCAAiC;AACnE,QAAM,eAAe,QAAQ;AAC7B,QAAM,eAAeF,MAAK,QAAQD,YAAW,MAAM,aAAa,YAAY;AAE5E,MAAII,IAAG,WAAW,YAAY,GAAG;AAC/B,kBAAc,cAAc,WAAW;AACvC,IAAAD,KAAI,QAAQ,2BAA2B;AAAA,EACzC,OAAO;AAEL,UAAM,sBAAsB,aAAa,MAAM,QAAQ,UAAU;AACjE,IAAAA,KAAI,QAAQ,2BAA2B;AAAA,EACzC;AAGA;AACA,EAAAA,KAAI,KAAK,aAAa,YAAY,wBAAwB;AAC1D,QAAM,kBAAkBF,MAAK,KAAK,aAAa,cAAc;AAC7D,MAAIG,IAAG,WAAW,eAAe,GAAG;AAClC,UAAM,MAAM,KAAK,MAAMA,IAAG,aAAa,iBAAiB,OAAO,CAAC;AAChE,QAAI,OAAO;AACX,IAAAA,IAAG,cAAc,iBAAiB,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,EAChE;AACA,EAAAD,KAAI,QAAQ,oBAAoB;AAGhC;AACA,EAAAA,KAAI,KAAK,aAAa,YAAY,4BAA4B;AAC9D,QAAM,UAAU,IAAI,EAAE,MAAM,0BAA0B,OAAO,OAAO,CAAC,EAAE,MAAM;AAE7E,MAAI;AACF,UAAM,WAAW,eAAe,WAAW;AAC3C,YAAQ,QAAQ,wBAAwB;AAAA,EAC1C,QAAQ;AACN,YAAQ,KAAK,gCAAgC;AAC7C,IAAAA,KAAI,KAAK,qDAAqD;AAAA,EAChE;AAGA;AACA,EAAAA,KAAI,KAAK,aAAa,YAAY,uBAAuB;AACzD,QAAM,cAAc,IAAI,EAAE,MAAM,wBAAwB,OAAO,OAAO,CAAC,EAAE,MAAM;AAE/E,MAAI;AACF,UAAM,gBAAgBF,MAAK,QAAQD,YAAW,IAAI;AAClD,UAAM,WAAW,aAAa,aAAa,KAAK,WAAW;AAC3D,gBAAY,QAAQ,mBAAmB;AAAA,EACzC,QAAQ;AACN,gBAAY,KAAK,2BAA2B;AAC5C,IAAAG,KAAI,KAAK,oCAAoC;AAAA,EAC/C;AAGA,MAAI,QAAQ,aAAa,WAAW;AAClC;AACA,IAAAA,KAAI,KAAK,aAAa,YAAY,oCAAoC;AACtE,IAAAA,KAAI,QAAQ,sBAAsB;AAAA,EACpC;AAGA,EAAAA,KAAI,MAAM;AACV,EAAAA,KAAI,QAAQ;AACZ,EAAAA,KAAI,MAAM;AAEV,UAAQ,IAAI,KAAKD,IAAG,MAAM,QAAG,CAAC,IAAIA,IAAG,KAAK,UAAU,CAAC,gCAAgC;AACrF,EAAAC,KAAI,MAAM;AAEV,UAAQ,IAAI,KAAKD,IAAG,IAAI,GAAG,CAAC,IAAIA,IAAG,KAAK,MAAM,IAAI,EAAE,CAAC,EAAE;AACvD,UAAQ,IAAI,KAAKA,IAAG,IAAI,GAAG,CAAC,IAAIA,IAAG,KAAK,aAAa,CAAC,EAAE;AACxD,EAAAC,KAAI,MAAM;AAEV,UAAQ,IAAI,KAAKD,IAAG,IAAI,WAAW,CAAC,IAAIA,IAAG,KAAK,uBAAuB,CAAC,IAAIA,IAAG,IAAI,kBAAkB,CAAC,EAAE;AACxG,EAAAC,KAAI,MAAM;AAEV,UAAQ,IAAI,KAAKD,IAAG,IAAI,gBAAgB,CAAC,IAAIA,IAAG,KAAK,0CAA0C,CAAC,EAAE;AAClG,EAAAC,KAAI,MAAM;AACZ;AAEA,eAAe,sBAAsB,aAAqB,MAAc,eAAuC;AAC7G,QAAM,MAAM,gBAAgB,QAAQ;AACpC,QAAM,YAAY,gBAAgB,OAAO;AAGzC,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,OAAO,MAAM;AACtB,IAAAC,IAAG,UAAUH,MAAK,KAAK,aAAa,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/D;AAGA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,4BAA4B;AAAA,MAC5B,MAAM;AAAA,MACN,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAClB;AAAA,IACA,iBAAiB;AAAA,MACf,aAAa;AAAA,MACb,SAAS;AAAA,MACT,cAAc;AAAA,MACd,GAAI,gBAAgB;AAAA,QAClB,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,eAAe;AAAA,MACjB,IAAI,CAAC;AAAA,IACP;AAAA,EACF;AACA,EAAAG,IAAG;AAAA,IACDH,MAAK,KAAK,aAAa,cAAc;AAAA,IACrC,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,EACrC;AAGA,MAAI,eAAe;AACjB,UAAM,WAAW;AAAA,MACf,iBAAiB;AAAA,QACf,QAAQ;AAAA,QACR,KAAK,CAAC,OAAO,gBAAgB,QAAQ;AAAA,QACrC,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,QACjB,KAAK;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO,CAAC,KAAK;AAAA,UACb,kBAAkB,CAAC,oBAAoB;AAAA,QACzC;AAAA,MACF;AAAA,MACA,SAAS,CAAC,WAAW,UAAU;AAAA,MAC/B,SAAS,CAAC,cAAc;AAAA,IAC1B;AACA,IAAAG,IAAG;AAAA,MACDH,MAAK,KAAK,aAAa,eAAe;AAAA,MACtC,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyCvB,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,oBAAoB,GAAG,cAAc;AAG7E,QAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOtB,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,mBAAmB,GAAG,aAAa;AAG3E,QAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BnB,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,wBAAwB,GAAG,UAAU;AAG7E,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAapB,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,qBAAqB,SAAS,EAAE,GAAG,WAAW;AAGtF,QAAM,iBAAiB,aAAa,GAAG;AAGvC,QAAM,YAAY,aAAa,GAAG;AACpC;AAEA,eAAe,iBAAiB,aAAqB,KAA4B;AAE/E,QAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,uBAKH,QAAQ,QAAQ,6BAA6B,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BpE,QAAQ,QAAQ,wHAAwH,EAAE;AAAA;AAAA,+DAE7E,QAAQ,QAAQ,kBAAkB,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASjG,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,yBAAyB,GAAG,EAAE,GAAG,eAAe;AAGxF,QAAM,gBAAgB;AAAA;AAAA,EAEtB,QAAQ,QAAQ;AAAA;AAAA;AAAA,KAGb,EAAE;AAAA;AAAA,mDAE4C,QAAQ,QAAQ,gBAAgB,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yDAQ5B,QAAQ,QAAQ,gBAAgB,EAAE;AAAA;AAAA;AAAA;AAAA,wDAInC,QAAQ,QAAQ,gBAAgB,EAAE;AAAA;AAAA;AAAA;AAAA,8DAI5B,QAAQ,QAAQ,gBAAgB,EAAE;AAAA;AAAA;AAAA;AAAA,0DAItC,QAAQ,QAAQ,gBAAgB,EAAE;AAAA;AAAA;AAAA;AAI1F,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,uBAAuB,GAAG,EAAE,GAAG,aAAa;AAGpF,QAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqCxB,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,yBAAyB,GAAG,EAAE,GAAG,eAAe;AAC1F;AAEA,eAAe,YAAY,aAAqB,KAA4B;AAE1E,QAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8NjB,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,iBAAiB,GAAG,QAAQ;AAGpE,QAAM,WAAW;AAAA;AAAA;AAAA;AAAA,yBAIM,QAAQ,QAAQ,UAAU,EAAE,QAAQ,QAAQ,QAAQ,UAAU,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAQ/D,QAAQ,QAAQ,UAAU,EAAE,QAAQ,QAAQ,QAAQ,UAAU,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxF,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,mBAAmB,QAAQ,QAAQ,OAAO,IAAI,EAAE,GAAG,QAAQ;AAGnG,EAAAG,IAAG,cAAcH,MAAK,KAAK,aAAa,iBAAiB,GAAG,EAAE;AAChE;AAMA,eAAe,SAAwB;AAErC,UAAQ,IAAI;AAAA,EACZC,IAAG,KAAK,uQAAgD,CAAC;AAAA,EACzDA,IAAG,KAAK,WAAM,CAAC,4CAA4CA,IAAG,KAAK,QAAG,CAAC;AAAA,EACvEA,IAAG,KAAK,WAAM,CAAC,MAAMA,IAAG,KAAKA,IAAG,KAAK,QAAG,CAAC,CAAC,KAAKA,IAAG,KAAKA,IAAG,MAAM,qBAAqB,CAAC,CAAC,eAAeA,IAAG,KAAK,QAAG,CAAC;AAAA,EAClHA,IAAG,KAAK,WAAM,CAAC,4CAA4CA,IAAG,KAAK,QAAG,CAAC;AAAA,EACvEA,IAAG,KAAK,WAAM,CAAC,MAAMA,IAAG,IAAI,4BAA4B,CAAC,aAAaA,IAAG,KAAK,QAAG,CAAC;AAAA,EAClFA,IAAG,KAAK,WAAM,CAAC,4CAA4CA,IAAG,KAAK,QAAG,CAAC;AAAA,EACvEA,IAAG,KAAK,uQAAgD,CAAC;AAAA,CAC1D;AAGC,QAAM,UAAUF,WAAU,SAAS,MAAM;AACzC,QAAM,MAAM,UAAU,OAAO;AAC7B,QAAM,cAAc,UAAUC,MAAK,KAAKD,YAAW,MAAM,MAAM,IAAIC,MAAK,KAAKD,YAAW,MAAM,MAAM;AACpG,QAAM,eAAeC,MAAK,KAAK,aAAa,aAAa,GAAG,EAAE;AAG9D,QAAM,SAAS;AAEf,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,IACrB;AAAA,MACE,OAAO;AAAA,MACP,KAAK,QAAQ,IAAI;AAAA,MACjB,OAAO;AAAA,MACP,KAAK,EAAE,GAAG,QAAQ,KAAK,UAAU,eAAe,aAAa,IAAI;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,IAAAE,KAAI,MAAM,+BAA+B,MAAM,OAAO,EAAE;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,UAAQ,GAAG,UAAU,MAAM,MAAM,KAAK,QAAQ,CAAC;AAC/C,UAAQ,GAAG,WAAW,MAAM,MAAM,KAAK,SAAS,CAAC;AACnD;AAMA,eAAe,SAAS,UAAiC,CAAC,GAAkB;AAC1E,UAAQ,IAAI,SAAS;AACrB,EAAAA,KAAI,MAAM;AACV,EAAAA,KAAI,KAAK,4BAA4B;AACrC,MAAI,QAAQ,SAAS;AACnB,IAAAA,KAAI,KAAK,yBAAyB;AAAA,EACpC;AACA,EAAAA,KAAI,MAAM;AAEV,QAAM,UAAU,IAAI,EAAE,MAAM,gBAAgB,OAAO,OAAO,CAAC,EAAE,MAAM;AAEnE,MAAI;AAEF,UAAM,UAAUH,WAAU,SAAS,MAAM;AACzC,UAAM,MAAM,UAAU,OAAO;AAC7B,UAAM,UAAU,UAAUC,MAAK,KAAKD,YAAW,MAAM,MAAM,IAAIC,MAAK,KAAKD,YAAW,MAAM,MAAM;AAEhG,UAAM,YAAYC,MAAK,KAAK,SAAS,SAAS,SAAS,GAAG,EAAE;AAC5D,UAAM,aAAaA,MAAK,KAAK,SAAS,UAAU,GAAG,EAAE;AAErD,UAAM,cAAc,MAAM,OAAO,cAAc,SAAS,EAAE;AAC1D,UAAM,eAAe,MAAM,OAAO,cAAc,UAAU,EAAE;AAE5D,UAAM,cAAc,QAAQ,IAAI;AAChC,UAAM,YAAY,MAAM,aAAa,WAAW,WAAW;AAC3D,UAAM,SAAS,aAAa,aAAa,WAAW,WAAW;AAE/D,UAAM,SAAS,MAAM,YAAY,MAAM;AAAA,MACrC;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,SAAS,QAAQ;AAAA,IACnB,CAAC;AAED,YAAQ,QAAQ,iBAAiB;AACjC,IAAAE,KAAI,MAAM;AACV,IAAAA,KAAI,QAAQ,WAAWD,IAAG,KAAK,SAAS,CAAC,EAAE;AAG3C,QAAI,QAAQ,WAAW,QAAQ,UAAU;AACvC,MAAAC,KAAI,MAAM;AACV,MAAAA,KAAI,KAAK,4BAAqB;AAC9B,MAAAA,KAAI,MAAM;AAEV,YAAM,WAAW,OAAO;AAGxB,YAAM,SAAS,OAAO,QAAQ,SAAS,SAAS,CAAC,CAAC,EAC/C,KAAK,CAAC,GAAQ,MAAW,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAEjD,cAAQ,IAAID,IAAG,IAAI,0SAAqD,CAAC;AACzE,cAAQ,IAAI,KAAKA,IAAG,KAAK,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC,GAAGA,IAAG,KAAK,MAAM,CAAC,EAAE;AACrE,cAAQ,IAAIA,IAAG,IAAI,0SAAqD,CAAC;AAEzE,iBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,MAAM,GAAG,EAAE,GAAU;AACrD,cAAM,OAAO,KAAK,SAAS,KAAK,QAAQ,KAAK,MAAM,GAAG,IAAI;AAC1D,cAAM,OAAO,YAAY,KAAK,IAAI;AAClC,cAAM,OAAO,KAAK,WAAWA,IAAG,IAAI,KAAK,YAAY,KAAK,QAAQ,CAAC,QAAQ,IAAI;AAC/E,gBAAQ,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC,IAAIA,IAAG,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE;AAAA,MAC5D;AAEA,cAAQ,IAAIA,IAAG,IAAI,0SAAqD,CAAC;AACzE,cAAQ,IAAI,KAAKA,IAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC,IAAIA,IAAG,MAAM,YAAY,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE;AAEvG,UAAI,SAAS,eAAe;AAC1B,gBAAQ,IAAI,KAAKA,IAAG,IAAI,UAAU,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC,IAAIA,IAAG,IAAI,YAAY,SAAS,aAAa,CAAC,CAAC,EAAE;AAAA,MACvG;AAEA,MAAAC,KAAI,MAAM;AAAA,IACZ;AAAA,EAEF,SAAS,OAAY;AACnB,YAAQ,KAAK,cAAc;AAC3B,IAAAA,KAAI,MAAM,MAAM,OAAO;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;AACxE;AAMA,eAAe,WAA0B;AACvC,UAAQ,IAAI,SAAS;AACrB,EAAAA,KAAI,MAAM;AACV,EAAAA,KAAI,KAAK,+BAA+B;AACxC,EAAAA,KAAI,MAAM;AAGV,QAAM,UAAUH,WAAU,SAAS,MAAM;AACzC,QAAM,MAAM,UAAU,OAAO;AAC7B,QAAM,gBAAgBC,MAAK,KAAKD,YAAW,MAAM,QAAQ,cAAc,GAAG,EAAE;AAE5E,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,CAAC,OAAO,aAAa;AAAA,IACrB;AAAA,MACE,OAAO;AAAA,MACP,KAAK,QAAQ,IAAI;AAAA,MACjB,OAAO;AAAA,MACP,KAAK,EAAE,GAAG,QAAQ,KAAK,UAAU,aAAa;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,IAAAG,KAAI,MAAM,2BAA2B,MAAM,OAAO,EAAE;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,UAAQ,GAAG,UAAU,MAAM,MAAM,KAAK,QAAQ,CAAC;AAC/C,UAAQ,GAAG,WAAW,MAAM,MAAM,KAAK,SAAS,CAAC;AACnD;AAMA,eAAe,YAA2B;AACxC,UAAQ,IAAI,SAAS;AACrB,EAAAA,KAAI,MAAM;AACV,EAAAA,KAAI,KAAK,0BAA0B;AACnC,EAAAA,KAAI,MAAM;AAQV,QAAM,SAAkB,CAAC;AACzB,QAAM,cAAc,QAAQ,IAAI;AAGhC,QAAM,cAAc,QAAQ;AAC5B,QAAM,YAAY,SAAS,YAAY,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7D,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,QAAQ,aAAa,KAAK,SAAS;AAAA,IACnC,SAAS,aAAa,KAAK,GAAG,WAAW,YAAO,GAAG,WAAW;AAAA,EAChE,CAAC;AAGD,QAAM,kBAAkBF,MAAK,KAAK,aAAa,cAAc;AAC7D,QAAM,iBAAiBG,IAAG,WAAW,eAAe;AACpD,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,QAAQ,iBAAiB,SAAS;AAAA,IAClC,SAAS,iBAAiB,UAAU;AAAA,EACtC,CAAC;AAGD,QAAM,WAAWH,MAAK,KAAK,aAAa,OAAO;AAC/C,QAAM,WAAWG,IAAG,WAAW,QAAQ;AACvC,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,QAAQ,WAAW,SAAS;AAAA,IAC5B,SAAS,WAAW,UAAU;AAAA,EAChC,CAAC;AAGD,QAAM,eAAeH,MAAK,KAAK,aAAa,eAAe;AAC3D,QAAM,gBAAgBG,IAAG,WAAW,YAAY;AAChD,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,gBAAgB,YAAY;AAAA,EACvC,CAAC;AAGD,QAAM,eAAeH,MAAK,KAAK,aAAa,oBAAoB;AAChE,QAAM,cAAcG,IAAG,WAAW,YAAY;AAC9C,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,cAAc,eAAe;AAAA,EACxC,CAAC;AAGD,MAAI,YAAY;AAChB,MAAI,cAAc;AAElB,aAAW,SAAS,QAAQ;AAC1B,QAAI;AACJ,QAAI;AAEJ,YAAQ,MAAM,QAAQ;AAAA,MACpB,KAAK;AACH,eAAO;AACP,gBAAQF,IAAG;AACX;AAAA,MACF,KAAK;AACH,eAAO;AACP,gBAAQA,IAAG;AACX,oBAAY;AACZ;AAAA,MACF,KAAK;AACH,eAAO;AACP,gBAAQA,IAAG;AACX,sBAAc;AACd;AAAA,MACF;AACE,eAAO;AACP,gBAAQA,IAAG;AAAA,IACf;AAEA,YAAQ,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,KAAKA,IAAG,IAAI,MAAM,OAAO,CAAC,EAAE;AAAA,EACxE;AAEA,EAAAC,KAAI,MAAM;AAEV,MAAI,WAAW;AACb,IAAAA,KAAI,MAAM,kDAAkD;AAAA,EAC9D,WAAW,aAAa;AACtB,IAAAA,KAAI,KAAK,gDAAgD;AAAA,EAC3D,OAAO;AACL,IAAAA,KAAI,QAAQ,2CAA2C;AAAA,EACzD;AAEA,EAAAA,KAAI,MAAM;AACZ;AAMA,SAAS,WAAiB;AACxB,UAAQ,IAAI,IAAI;AAEhB,UAAQ,IAAI,KAAKD,IAAG,KAAK,QAAQ,CAAC,EAAE;AACpC,UAAQ,IAAI,OAAOA,IAAG,KAAK,OAAO,CAAC,IAAIA,IAAG,IAAI,WAAW,CAAC,IAAIA,IAAG,IAAI,WAAW,CAAC,EAAE;AACnF,EAAAC,KAAI,MAAM;AAEV,UAAQ,IAAI,KAAKD,IAAG,KAAK,WAAW,CAAC,EAAE;AACvC,UAAQ,IAAI,OAAOA,IAAG,KAAK,QAAQ,CAAC,IAAIA,IAAG,IAAI,QAAQ,CAAC,wCAAwC;AAChG,UAAQ,IAAI,OAAOA,IAAG,KAAK,KAAK,CAAC,4CAA4C;AAC7E,UAAQ,IAAI,OAAOA,IAAG,KAAK,OAAO,CAAC,sCAAsC;AACzE,UAAQ,IAAI,OAAOA,IAAG,KAAK,OAAO,CAAC,yCAAyC;AAC5E,UAAQ,IAAI,OAAOA,IAAG,KAAK,UAAU,CAAC,IAAIA,IAAG,IAAI,QAAQ,CAAC,kDAAkD;AAC5G,UAAQ,IAAI,OAAOA,IAAG,KAAK,QAAQ,CAAC,qCAAqC;AACzE,UAAQ,IAAI,OAAOA,IAAG,KAAK,MAAM,CAAC,yCAAyC;AAC3E,EAAAC,KAAI,MAAM;AAEV,UAAQ,IAAI,KAAKD,IAAG,KAAK,iBAAiB,CAAC,EAAE;AAC7C,UAAQ,IAAI,OAAOA,IAAG,IAAI,iEAAiE,CAAC,EAAE;AAC9F,UAAQ,IAAI,OAAOA,IAAG,IAAI,2BAA2B,CAAC,EAAE;AACxD,EAAAC,KAAI,MAAM;AAEV,UAAQ,IAAI,KAAKD,IAAG,KAAK,WAAW,CAAC,EAAE;AACvC,UAAQ,IAAI,OAAOA,IAAG,IAAI,GAAG,CAAC,sBAAsB;AACpD,UAAQ,IAAI,OAAOA,IAAG,IAAI,GAAG,CAAC,YAAY;AAC1C,UAAQ,IAAI,OAAOA,IAAG,IAAI,GAAG,CAAC,2BAA2B;AACzD,UAAQ,IAAI,OAAOA,IAAG,IAAI,GAAG,CAAC,yBAAyB;AACvD,UAAQ,IAAI,OAAOA,IAAG,IAAI,GAAG,CAAC,wBAAwB;AACtD,EAAAC,KAAI,MAAM;AACZ;AAMA,eAAe,OAAsB;AACnC,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,UAAU,KAAK,CAAC;AAEtB,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,YAAM,cAAc,KAAK,CAAC,CAAC;AAC3B;AAAA,IAEF,KAAK;AACH,YAAM,OAAO;AACb;AAAA,IAEF,KAAK;AACH,YAAM,cAAc,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,IAAI;AACpE,YAAM,SAAS,EAAE,SAAS,YAAY,CAAC;AACvC;AAAA,IAEF,KAAK;AACH,YAAM,SAAS;AACf;AAAA,IAEF,KAAK;AACH,YAAM,UAAU;AAChB;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AACH,YAAM,YAAY,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAClC;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AACH,qBAAe;AACf;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,cAAQ,IAAI,GAAG,SAAS,IAAID,IAAG,IAAI,IAAI,OAAO,EAAE,CAAC,EAAE;AACnD;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,eAAS;AACT;AAAA,IAEF;AACE,UAAI,SAAS;AACX,QAAAC,KAAI,MAAM,oBAAoB,OAAO,EAAE;AACvC,QAAAA,KAAI,MAAM;AAAA,MACZ;AACA,eAAS;AACT,cAAQ,KAAK,UAAU,IAAI,CAAC;AAAA,EAChC;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,EAAAA,KAAI,MAAM,MAAM,OAAO;AACvB,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["fs","path","pc","prompts","__filename","__dirname","path","pc","log","fs","prompts"]}
1
+ {"version":3,"sources":["../../cli/index.ts","../../cli/generators.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\n/**\r\n * FlexiReact CLI v2.1\r\n * Professional CLI with TypeScript, colors, prompts, and progress indicators\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { fileURLToPath, pathToFileURL } from 'url';\r\nimport { execSync, spawn } from 'child_process';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport ora from 'ora';\r\nimport { runGenerate, listGenerators } from './generators.js';\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = path.dirname(__filename);\r\nconst VERSION = '3.0.0';\r\n\r\n// ============================================================================\r\n// ASCII Logo & Branding\r\n// ============================================================================\r\n\r\nconst LOGO = `\r\n${pc.cyan('╔═══════════════════════════════════════════════════════════╗')}\r\n${pc.cyan('║')} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.bold(pc.magenta('⚡'))} ${pc.bold(pc.white('F L E X I R E A C T'))} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.dim('The Modern React Framework')} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.dim('TypeScript • Tailwind • SSR • Islands')} ${pc.cyan('║')}\r\n${pc.cyan('║')} ${pc.cyan('║')}\r\n${pc.cyan('╚═══════════════════════════════════════════════════════════╝')}\r\n`;\r\n\r\nconst MINI_LOGO = `${pc.magenta('⚡')} ${pc.bold('FlexiReact')}`;\r\n\r\n// ============================================================================\r\n// Logger Utilities\r\n// ============================================================================\r\n\r\nconst log = {\r\n info: (msg: string) => console.log(`${pc.cyan('ℹ')} ${msg}`),\r\n success: (msg: string) => console.log(`${pc.green('✓')} ${msg}`),\r\n warn: (msg: string) => console.log(`${pc.yellow('⚠')} ${pc.yellow(msg)}`),\r\n error: (msg: string) => console.log(`${pc.red('✗')} ${pc.red(msg)}`),\r\n step: (num: number, total: number, msg: string) =>\r\n console.log(`${pc.dim(`[${num}/${total}]`)} ${msg}`),\r\n blank: () => console.log(''),\r\n divider: () => console.log(pc.dim('─'.repeat(60))),\r\n};\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\nfunction copyDirectory(src: string, dest: string): void {\r\n if (!fs.existsSync(dest)) {\r\n fs.mkdirSync(dest, { recursive: true });\r\n }\r\n\r\n const entries = fs.readdirSync(src, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const srcPath = path.join(src, entry.name);\r\n const destPath = path.join(dest, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n copyDirectory(srcPath, destPath);\r\n } else {\r\n fs.copyFileSync(srcPath, destPath);\r\n }\r\n }\r\n}\r\n\r\nasync function runCommand(cmd: string, cwd: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const child = spawn(cmd, {\r\n shell: true,\r\n cwd,\r\n stdio: 'pipe'\r\n });\r\n\r\n child.on('close', (code) => {\r\n if (code === 0) resolve();\r\n else reject(new Error(`Command failed with code ${code}`));\r\n });\r\n\r\n child.on('error', reject);\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Create Command\r\n// ============================================================================\r\n\r\ninterface CreateOptions {\r\n template: 'default' | 'minimal' | 'flexi-ui';\r\n typescript: boolean;\r\n tailwind: boolean;\r\n shadcn: boolean;\r\n}\r\n\r\nasync function createProject(projectName?: string): Promise<void> {\r\n console.log(LOGO);\r\n log.blank();\r\n\r\n // Get project name\r\n let name = projectName;\r\n if (!name) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'projectName',\r\n message: 'Project name:',\r\n initial: 'my-flexi-app',\r\n validate: (value: string) => value.length > 0 || 'Project name is required'\r\n });\r\n name = response.projectName;\r\n if (!name) process.exit(1);\r\n }\r\n\r\n const projectPath = path.resolve(process.cwd(), name);\r\n\r\n // Check if directory exists\r\n if (fs.existsSync(projectPath)) {\r\n log.error(`Directory \"${name}\" already exists.`);\r\n process.exit(1);\r\n }\r\n\r\n // Get options\r\n const options = await prompts([\r\n {\r\n type: 'select',\r\n name: 'template',\r\n message: 'Select a template:',\r\n choices: [\r\n { title: '🚀 Default (Tailwind + shadcn/ui)', value: 'default' },\r\n { title: '💚 FlexiUI (Landing page + @flexireact/flexi-ui)', value: 'flexi-ui' },\r\n { title: '📦 Minimal (Clean slate)', value: 'minimal' }\r\n ],\r\n initial: 0\r\n },\r\n {\r\n type: 'toggle',\r\n name: 'typescript',\r\n message: 'Use TypeScript?',\r\n initial: true,\r\n active: 'Yes',\r\n inactive: 'No'\r\n }\r\n ]);\r\n\r\n if (options.template === undefined) process.exit(1);\r\n\r\n log.blank();\r\n log.divider();\r\n log.blank();\r\n\r\n const totalSteps = options.template === 'default' ? 6 : (options.template === 'flexi-ui' ? 5 : 4);\r\n let currentStep = 0;\r\n\r\n // Step 1: Create directory\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Creating project directory...');\r\n fs.mkdirSync(projectPath, { recursive: true });\r\n log.success(`Created ${pc.cyan(name)}/`);\r\n\r\n // Step 2: Copy template\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Setting up project structure...');\r\n const templateName = options.template;\r\n const templatePath = path.resolve(__dirname, '..', 'templates', templateName);\r\n\r\n if (fs.existsSync(templatePath)) {\r\n copyDirectory(templatePath, projectPath);\r\n log.success('Project structure created');\r\n } else {\r\n // Create basic structure if template doesn't exist\r\n await createDefaultTemplate(projectPath, name, options.typescript);\r\n log.success('Project structure created');\r\n }\r\n\r\n // Step 3: Update package.json\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Configuring project...');\r\n const packageJsonPath = path.join(projectPath, 'package.json');\r\n if (fs.existsSync(packageJsonPath)) {\r\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\r\n pkg.name = name;\r\n fs.writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2));\r\n }\r\n log.success('Project configured');\r\n\r\n // Step 4: Install dependencies\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Installing dependencies...');\r\n const spinner = ora({ text: 'Installing packages...', color: 'cyan' }).start();\r\n\r\n try {\r\n await runCommand('npm install', projectPath);\r\n spinner.succeed('Dependencies installed');\r\n } catch {\r\n spinner.fail('Failed to install dependencies');\r\n log.warn('Run \"npm install\" manually in the project directory');\r\n }\r\n\r\n // Step 5: Link FlexiReact (for development)\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Linking FlexiReact...');\r\n const linkSpinner = ora({ text: 'Linking framework...', color: 'cyan' }).start();\r\n\r\n try {\r\n const frameworkRoot = path.resolve(__dirname, '..');\r\n await runCommand(`npm link \"${frameworkRoot}\"`, projectPath);\r\n linkSpinner.succeed('FlexiReact linked');\r\n } catch {\r\n linkSpinner.fail('Failed to link FlexiReact');\r\n log.warn('Run \"npm link flexireact\" manually');\r\n }\r\n\r\n // Step 6: Initialize shadcn/ui (if default template)\r\n if (options.template === 'default') {\r\n currentStep++;\r\n log.step(currentStep, totalSteps, 'Setting up shadcn/ui components...');\r\n log.success('shadcn/ui configured');\r\n }\r\n\r\n // Success message\r\n log.blank();\r\n log.divider();\r\n log.blank();\r\n\r\n console.log(` ${pc.green('✨')} ${pc.bold('Success!')} Your FlexiReact app is ready.`);\r\n log.blank();\r\n\r\n console.log(` ${pc.dim('$')} ${pc.cyan(`cd ${name}`)}`);\r\n console.log(` ${pc.dim('$')} ${pc.cyan('npm run dev')}`);\r\n log.blank();\r\n\r\n console.log(` ${pc.dim('Then open')} ${pc.cyan('http://localhost:3000')} ${pc.dim('in your browser.')}`);\r\n log.blank();\r\n\r\n console.log(` ${pc.dim('Documentation:')} ${pc.cyan('https://github.com/flexireact/flexireact')}`);\r\n log.blank();\r\n}\r\n\r\nasync function createDefaultTemplate(projectPath: string, name: string, useTypeScript: boolean): Promise<void> {\r\n const ext = useTypeScript ? 'tsx' : 'jsx';\r\n const configExt = useTypeScript ? 'ts' : 'js';\r\n\r\n // Create directories\r\n const dirs = [\r\n 'app/components',\r\n 'app/styles',\r\n 'pages/api',\r\n 'public',\r\n ];\r\n\r\n for (const dir of dirs) {\r\n fs.mkdirSync(path.join(projectPath, dir), { recursive: true });\r\n }\r\n\r\n // package.json\r\n const packageJson = {\r\n name,\r\n version: '0.1.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'flexi dev',\r\n build: 'flexi build',\r\n start: 'flexi start',\r\n doctor: 'flexi doctor'\r\n },\r\n dependencies: {\r\n react: '^19.0.0',\r\n 'react-dom': '^19.0.0',\r\n 'class-variance-authority': '^0.7.0',\r\n clsx: '^2.1.1',\r\n 'tailwind-merge': '^2.5.5',\r\n 'lucide-react': '^0.468.0'\r\n },\r\n devDependencies: {\r\n tailwindcss: '^3.4.16',\r\n postcss: '^8.4.49',\r\n autoprefixer: '^10.4.20',\r\n ...(useTypeScript ? {\r\n typescript: '^5.7.2',\r\n '@types/react': '^19.0.0',\r\n '@types/react-dom': '^19.0.0',\r\n '@types/node': '^22.10.1'\r\n } : {})\r\n }\r\n };\r\n fs.writeFileSync(\r\n path.join(projectPath, 'package.json'),\r\n JSON.stringify(packageJson, null, 2)\r\n );\r\n\r\n // TypeScript config\r\n if (useTypeScript) {\r\n const tsconfig = {\r\n compilerOptions: {\r\n target: 'ES2022',\r\n lib: ['dom', 'dom.iterable', 'ES2022'],\r\n allowJs: true,\r\n skipLibCheck: true,\r\n strict: true,\r\n noEmit: true,\r\n esModuleInterop: true,\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n jsx: 'react-jsx',\r\n baseUrl: '.',\r\n paths: {\r\n '@/*': ['./*'],\r\n '@/components/*': ['./app/components/*']\r\n }\r\n },\r\n include: ['**/*.ts', '**/*.tsx'],\r\n exclude: ['node_modules']\r\n };\r\n fs.writeFileSync(\r\n path.join(projectPath, 'tsconfig.json'),\r\n JSON.stringify(tsconfig, null, 2)\r\n );\r\n }\r\n\r\n // Tailwind config\r\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\r\nexport default {\r\n content: [\r\n './app/**/*.{js,ts,jsx,tsx}',\r\n './pages/**/*.{js,ts,jsx,tsx}',\r\n './components/**/*.{js,ts,jsx,tsx}',\r\n ],\r\n darkMode: 'class',\r\n theme: {\r\n extend: {\r\n colors: {\r\n border: 'hsl(var(--border))',\r\n background: 'hsl(var(--background))',\r\n foreground: 'hsl(var(--foreground))',\r\n primary: {\r\n DEFAULT: 'hsl(var(--primary))',\r\n foreground: 'hsl(var(--primary-foreground))',\r\n },\r\n secondary: {\r\n DEFAULT: 'hsl(var(--secondary))',\r\n foreground: 'hsl(var(--secondary-foreground))',\r\n },\r\n muted: {\r\n DEFAULT: 'hsl(var(--muted))',\r\n foreground: 'hsl(var(--muted-foreground))',\r\n },\r\n accent: {\r\n DEFAULT: 'hsl(var(--accent))',\r\n foreground: 'hsl(var(--accent-foreground))',\r\n },\r\n },\r\n borderRadius: {\r\n lg: 'var(--radius)',\r\n md: 'calc(var(--radius) - 2px)',\r\n sm: 'calc(var(--radius) - 4px)',\r\n },\r\n },\r\n },\r\n plugins: [],\r\n};\r\n`;\r\n fs.writeFileSync(path.join(projectPath, 'tailwind.config.js'), tailwindConfig);\r\n\r\n // PostCSS config\r\n const postcssConfig = `export default {\r\n plugins: {\r\n tailwindcss: {},\r\n autoprefixer: {},\r\n },\r\n};\r\n`;\r\n fs.writeFileSync(path.join(projectPath, 'postcss.config.js'), postcssConfig);\r\n\r\n // Global CSS\r\n const globalsCss = `@tailwind base;\r\n@tailwind components;\r\n@tailwind utilities;\r\n\r\n@layer base {\r\n :root {\r\n --background: 222 47% 11%;\r\n --foreground: 210 40% 98%;\r\n --primary: 263 70% 50%;\r\n --primary-foreground: 210 40% 98%;\r\n --secondary: 217 33% 17%;\r\n --secondary-foreground: 210 40% 98%;\r\n --muted: 217 33% 17%;\r\n --muted-foreground: 215 20% 65%;\r\n --accent: 263 70% 50%;\r\n --accent-foreground: 210 40% 98%;\r\n --border: 217 33% 17%;\r\n --radius: 0.5rem;\r\n }\r\n}\r\n\r\n@layer base {\r\n * {\r\n @apply border-border;\r\n }\r\n body {\r\n @apply bg-background text-foreground antialiased;\r\n font-feature-settings: \"rlig\" 1, \"calt\" 1;\r\n }\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, 'app/styles/globals.css'), globalsCss);\r\n\r\n // FlexiReact config\r\n const flexiConfig = `export default {\r\n server: {\r\n port: 3000,\r\n host: 'localhost'\r\n },\r\n islands: {\r\n enabled: true\r\n },\r\n rsc: {\r\n enabled: true\r\n }\r\n};\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `flexireact.config.${configExt}`), flexiConfig);\r\n\r\n // Create components\r\n await createComponents(projectPath, ext);\r\n\r\n // Create pages\r\n await createPages(projectPath, ext);\r\n}\r\n\r\nasync function createComponents(projectPath: string, ext: string): Promise<void> {\r\n // Button component\r\n const buttonComponent = `import React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\nfunction cn(...inputs${ext === 'tsx' ? ': (string | undefined)[]' : ''}) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\nconst buttonVariants = cva(\r\n 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n outline: 'border border-border bg-transparent hover:bg-accent hover:text-accent-foreground',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n },\r\n size: {\r\n default: 'h-10 px-4 py-2',\r\n sm: 'h-9 rounded-md px-3',\r\n lg: 'h-11 rounded-md px-8',\r\n icon: 'h-10 w-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n);\r\n\r\n${ext === 'tsx' ? `interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {}` : ''}\r\n\r\nexport function Button({ className, variant, size, ...props }${ext === 'tsx' ? ': ButtonProps' : ''}) {\r\n return (\r\n <button\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n {...props}\r\n />\r\n );\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `app/components/Button.${ext}`), buttonComponent);\r\n\r\n // Card component\r\n const cardComponent = `import React from 'react';\r\n\r\n${ext === 'tsx' ? `interface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}` : ''}\r\n\r\nexport function Card({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return (\r\n <div className={\\`rounded-lg border border-border bg-secondary/50 p-6 backdrop-blur-sm \\${className}\\`}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nexport function CardHeader({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return <div className={\\`mb-4 \\${className}\\`}>{children}</div>;\r\n}\r\n\r\nexport function CardTitle({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return <h3 className={\\`text-xl font-semibold \\${className}\\`}>{children}</h3>;\r\n}\r\n\r\nexport function CardDescription({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return <p className={\\`text-muted-foreground \\${className}\\`}>{children}</p>;\r\n}\r\n\r\nexport function CardContent({ children, className = '' }${ext === 'tsx' ? ': CardProps' : ''}) {\r\n return <div className={className}>{children}</div>;\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `app/components/Card.${ext}`), cardComponent);\r\n\r\n // Navbar component\r\n const navbarComponent = `import React from 'react';\r\n\r\nexport function Navbar() {\r\n return (\r\n <nav className=\"fixed top-0 left-0 right-0 z-50 border-b border-border bg-background/80 backdrop-blur-md\">\r\n <div className=\"mx-auto flex h-16 max-w-7xl items-center justify-between px-4\">\r\n <a href=\"/\" className=\"flex items-center gap-2 text-xl font-bold\">\r\n <span className=\"text-2xl\">⚡</span>\r\n <span className=\"bg-gradient-to-r from-purple-400 to-pink-400 bg-clip-text text-transparent\">\r\n FlexiReact\r\n </span>\r\n </a>\r\n \r\n <div className=\"flex items-center gap-6\">\r\n <a href=\"/\" className=\"text-muted-foreground hover:text-foreground transition-colors\">\r\n Home\r\n </a>\r\n <a href=\"/docs\" className=\"text-muted-foreground hover:text-foreground transition-colors\">\r\n Docs\r\n </a>\r\n <a href=\"/api/hello\" className=\"text-muted-foreground hover:text-foreground transition-colors\">\r\n API\r\n </a>\r\n <a \r\n href=\"https://github.com/flexireact/flexireact\" \r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-muted-foreground hover:text-foreground transition-colors\"\r\n >\r\n GitHub\r\n </a>\r\n </div>\r\n </div>\r\n </nav>\r\n );\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `app/components/Navbar.${ext}`), navbarComponent);\r\n}\r\n\r\nasync function createPages(projectPath: string, ext: string): Promise<void> {\r\n // Home page with INLINE STYLES (works without Tailwind build)\r\n const homePage = `import React from 'react';\r\n\r\nexport const title = 'FlexiReact - The Modern React Framework';\r\n\r\nconst features = [\r\n { icon: '⚡', title: 'Lightning Fast', desc: 'Powered by esbuild for instant builds.' },\r\n { icon: '📘', title: 'TypeScript', desc: 'First-class TypeScript support.' },\r\n { icon: '🏝️', title: 'Islands', desc: 'Partial hydration for minimal JS.' },\r\n { icon: '📁', title: 'File Routing', desc: 'Create a file, get a route.' },\r\n { icon: '🔌', title: 'API Routes', desc: 'Build your API alongside frontend.' },\r\n { icon: '🚀', title: 'SSR/SSG', desc: 'Server rendering and static generation.' },\r\n];\r\n\r\nexport default function HomePage() {\r\n return (\r\n <div style={styles.container}>\r\n {/* Navbar */}\r\n <nav style={styles.nav}>\r\n <a href=\"/\" style={styles.logo}>\r\n <svg style={{ width: 32, height: 32 }} viewBox=\"0 0 200 200\" fill=\"none\">\r\n <defs>\r\n <linearGradient id=\"g\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\r\n <stop offset=\"0%\" stopColor=\"#61DAFB\"/>\r\n <stop offset=\"100%\" stopColor=\"#21A1F1\"/>\r\n </linearGradient>\r\n </defs>\r\n <circle cx=\"100\" cy=\"100\" r=\"12\" fill=\"url(#g)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#g)\" strokeWidth=\"6\" transform=\"rotate(-30 100 100)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#g)\" strokeWidth=\"6\" transform=\"rotate(30 100 100)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#g)\" strokeWidth=\"6\" transform=\"rotate(90 100 100)\"/>\r\n </svg>\r\n <span style={styles.logoText}>FlexiReact</span>\r\n </a>\r\n <div style={styles.navLinks}>\r\n <a href=\"/\" style={styles.navLink}>Home</a>\r\n <a href=\"/api/hello\" style={styles.navLink}>API</a>\r\n </div>\r\n </nav>\r\n\r\n {/* Hero */}\r\n <section style={styles.hero}>\r\n <svg style={{ width: 120, height: 120, marginBottom: 24 }} viewBox=\"0 0 200 200\" fill=\"none\">\r\n <defs>\r\n <linearGradient id=\"hero\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\r\n <stop offset=\"0%\" stopColor=\"#61DAFB\"/>\r\n <stop offset=\"100%\" stopColor=\"#21A1F1\"/>\r\n </linearGradient>\r\n </defs>\r\n <circle cx=\"100\" cy=\"100\" r=\"12\" fill=\"url(#hero)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#hero)\" strokeWidth=\"6\" transform=\"rotate(-30 100 100)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#hero)\" strokeWidth=\"6\" transform=\"rotate(30 100 100)\"/>\r\n <ellipse cx=\"100\" cy=\"100\" rx=\"80\" ry=\"30\" fill=\"none\" stroke=\"url(#hero)\" strokeWidth=\"6\" transform=\"rotate(90 100 100)\"/>\r\n <circle cx=\"28\" cy=\"70\" r=\"8\" fill=\"url(#hero)\"/>\r\n <circle cx=\"172\" cy=\"130\" r=\"8\" fill=\"url(#hero)\"/>\r\n <circle cx=\"100\" cy=\"20\" r=\"8\" fill=\"url(#hero)\"/>\r\n </svg>\r\n \r\n <div style={styles.badge}>🚀 v2.1 — TypeScript & Islands</div>\r\n \r\n <h1 style={styles.title}>\r\n Build faster with<br/>\r\n <span style={styles.titleGradient}>FlexiReact</span>\r\n </h1>\r\n \r\n <p style={styles.subtitle}>\r\n The modern React framework with SSR, SSG, Islands architecture,<br/>\r\n and file-based routing. Simple and powerful.\r\n </p>\r\n \r\n <div style={styles.buttons}>\r\n <a href=\"/docs\" style={styles.primaryBtn}>Get Started →</a>\r\n <a href=\"/api/hello\" style={styles.secondaryBtn}>View API</a>\r\n </div>\r\n </section>\r\n\r\n {/* Features */}\r\n <section style={styles.features}>\r\n <h2 style={styles.featuresTitle}>Everything you need</h2>\r\n <div style={styles.grid}>\r\n {features.map((f, i) => (\r\n <div key={i} style={styles.card}>\r\n <div style={styles.cardIcon}>{f.icon}</div>\r\n <h3 style={styles.cardTitle}>{f.title}</h3>\r\n <p style={styles.cardDesc}>{f.desc}</p>\r\n </div>\r\n ))}\r\n </div>\r\n </section>\r\n\r\n {/* Footer */}\r\n <footer style={styles.footer}>\r\n Built with ❤️ using FlexiReact\r\n </footer>\r\n </div>\r\n );\r\n}\r\n\r\nconst styles = {\r\n container: {\r\n minHeight: '100vh',\r\n background: 'linear-gradient(180deg, #0f172a 0%, #1e293b 100%)',\r\n color: '#f8fafc',\r\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n },\r\n nav: {\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n height: 64,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '0 24px',\r\n background: 'rgba(15, 23, 42, 0.8)',\r\n backdropFilter: 'blur(12px)',\r\n borderBottom: '1px solid rgba(255,255,255,0.1)',\r\n zIndex: 100,\r\n },\r\n logo: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n textDecoration: 'none',\r\n color: '#f8fafc',\r\n },\r\n logoText: {\r\n fontSize: 20,\r\n fontWeight: 700,\r\n background: 'linear-gradient(90deg, #61DAFB, #21A1F1)',\r\n WebkitBackgroundClip: 'text',\r\n WebkitTextFillColor: 'transparent',\r\n },\r\n navLinks: { display: 'flex', gap: 24 },\r\n navLink: { color: '#94a3b8', textDecoration: 'none', fontSize: 14 },\r\n hero: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n textAlign: 'center',\r\n padding: '140px 24px 80px',\r\n },\r\n badge: {\r\n background: 'rgba(99, 102, 241, 0.2)',\r\n border: '1px solid rgba(99, 102, 241, 0.3)',\r\n borderRadius: 9999,\r\n padding: '8px 16px',\r\n fontSize: 14,\r\n marginBottom: 24,\r\n },\r\n title: {\r\n fontSize: 'clamp(2.5rem, 8vw, 4.5rem)',\r\n fontWeight: 800,\r\n lineHeight: 1.1,\r\n marginBottom: 24,\r\n },\r\n titleGradient: {\r\n background: 'linear-gradient(90deg, #61DAFB, #a78bfa, #61DAFB)',\r\n WebkitBackgroundClip: 'text',\r\n WebkitTextFillColor: 'transparent',\r\n },\r\n subtitle: {\r\n fontSize: 18,\r\n color: '#94a3b8',\r\n maxWidth: 600,\r\n lineHeight: 1.6,\r\n marginBottom: 32,\r\n },\r\n buttons: { display: 'flex', gap: 16, flexWrap: 'wrap', justifyContent: 'center' },\r\n primaryBtn: {\r\n background: 'linear-gradient(135deg, #6366f1, #8b5cf6)',\r\n color: '#fff',\r\n padding: '14px 28px',\r\n borderRadius: 12,\r\n textDecoration: 'none',\r\n fontWeight: 600,\r\n boxShadow: '0 4px 20px rgba(99, 102, 241, 0.4)',\r\n },\r\n secondaryBtn: {\r\n background: 'transparent',\r\n color: '#f8fafc',\r\n padding: '14px 28px',\r\n borderRadius: 12,\r\n textDecoration: 'none',\r\n fontWeight: 600,\r\n border: '1px solid rgba(255,255,255,0.2)',\r\n },\r\n features: {\r\n padding: '80px 24px',\r\n maxWidth: 1200,\r\n margin: '0 auto',\r\n },\r\n featuresTitle: {\r\n fontSize: 32,\r\n fontWeight: 700,\r\n textAlign: 'center',\r\n marginBottom: 48,\r\n },\r\n grid: {\r\n display: 'grid',\r\n gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))',\r\n gap: 24,\r\n },\r\n card: {\r\n background: 'rgba(255,255,255,0.05)',\r\n border: '1px solid rgba(255,255,255,0.1)',\r\n borderRadius: 16,\r\n padding: 24,\r\n },\r\n cardIcon: { fontSize: 32, marginBottom: 12 },\r\n cardTitle: { fontSize: 18, fontWeight: 600, marginBottom: 8 },\r\n cardDesc: { fontSize: 14, color: '#94a3b8', lineHeight: 1.5 },\r\n footer: {\r\n textAlign: 'center',\r\n padding: 32,\r\n color: '#64748b',\r\n borderTop: '1px solid rgba(255,255,255,0.1)',\r\n },\r\n};\r\n`;\r\n // Always use .jsx for pages (simpler, works without TS config)\r\n fs.writeFileSync(path.join(projectPath, 'pages/index.jsx'), homePage);\r\n\r\n // API route\r\n const apiRoute = `/**\r\n * API Route: /api/hello\r\n */\r\n\r\nexport function get(req${ext === 'tsx' ? ': any' : ''}, res${ext === 'tsx' ? ': any' : ''}) {\r\n res.json({\r\n message: 'Hello from FlexiReact API! 🚀',\r\n timestamp: new Date().toISOString(),\r\n framework: 'FlexiReact v3.1'\r\n });\r\n}\r\n\r\nexport function post(req${ext === 'tsx' ? ': any' : ''}, res${ext === 'tsx' ? ': any' : ''}) {\r\n const { name } = req.body || {};\r\n res.json({\r\n message: \\`Hello, \\${name || 'World'}!\\`,\r\n timestamp: new Date().toISOString()\r\n });\r\n}\r\n`;\r\n fs.writeFileSync(path.join(projectPath, `pages/api/hello.${ext === 'tsx' ? 'ts' : 'js'}`), apiRoute);\r\n\r\n // .gitkeep for public\r\n fs.writeFileSync(path.join(projectPath, 'public/.gitkeep'), '');\r\n}\r\n\r\n// ============================================================================\r\n// Dev Command\r\n// ============================================================================\r\n\r\nasync function runDev(): Promise<void> {\r\n // Show styled logo\r\n console.log(`\r\n${pc.cyan(' ╭─────────────────────────────────────────╮')}\r\n${pc.cyan(' │')} ${pc.cyan('│')}\r\n${pc.cyan(' │')} ${pc.bold(pc.cyan('⚛'))} ${pc.bold(pc.white('F L E X I R E A C T'))} ${pc.cyan('│')}\r\n${pc.cyan(' │')} ${pc.cyan('│')}\r\n${pc.cyan(' │')} ${pc.dim('The Modern React Framework')} ${pc.cyan('│')}\r\n${pc.cyan(' │')} ${pc.cyan('│')}\r\n${pc.cyan(' ╰─────────────────────────────────────────╯')}\r\n`);\r\n\r\n // Determine if we are running from dist or source\r\n const isBuilt = __dirname.includes('dist');\r\n const ext = isBuilt ? 'js' : 'ts';\r\n const startDevDir = isBuilt ? path.join(__dirname, '..', 'core') : path.join(__dirname, '..', 'core');\r\n const startDevPath = path.join(startDevDir, `start-dev.${ext}`);\r\n\r\n // Find tsx binary\r\n const tsxBin = 'tsx'; // rely on dependency in node_modules\r\n\r\n const child = spawn(\r\n 'npx',\r\n [tsxBin, startDevPath],\r\n {\r\n stdio: 'inherit',\r\n cwd: process.cwd(),\r\n shell: true,\r\n env: {\r\n ...process.env,\r\n NODE_ENV: 'development',\r\n FORCE_COLOR: '1',\r\n NODE_PATH: path.join(process.cwd(), 'node_modules')\r\n }\r\n }\r\n );\r\n\r\n child.on('error', (error) => {\r\n log.error(`Failed to start dev server: ${error.message}`);\r\n process.exit(1);\r\n });\r\n\r\n process.on('SIGINT', () => child.kill('SIGINT'));\r\n process.on('SIGTERM', () => child.kill('SIGTERM'));\r\n}\r\n\r\n// ============================================================================\r\n// Build Command\r\n// ============================================================================\r\n\r\nasync function runBuild(options: { analyze?: boolean } = {}): Promise<void> {\r\n console.log(MINI_LOGO);\r\n log.blank();\r\n log.info('Building for production...');\r\n if (options.analyze) {\r\n log.info('Bundle analysis enabled');\r\n }\r\n log.blank();\r\n\r\n const spinner = ora({ text: 'Compiling...', color: 'cyan' }).start();\r\n\r\n try {\r\n // Determine if we are running from dist or source\r\n const isBuilt = __dirname.includes('dist');\r\n const ext = isBuilt ? 'js' : 'ts';\r\n const coreDir = isBuilt ? path.join(__dirname, '..', 'core') : path.join(__dirname, '..', 'core');\r\n\r\n const buildPath = path.join(coreDir, 'build', `index.${ext}`);\r\n const configPath = path.join(coreDir, `config.${ext}`);\r\n\r\n const buildModule = await import(pathToFileURL(buildPath).href);\r\n const configModule = await import(pathToFileURL(configPath).href);\r\n\r\n const projectRoot = process.cwd();\r\n const rawConfig = await configModule.loadConfig(projectRoot);\r\n const config = configModule.resolvePaths(rawConfig, projectRoot);\r\n\r\n const result = await buildModule.build({\r\n projectRoot,\r\n config,\r\n mode: 'production',\r\n analyze: options.analyze\r\n });\r\n\r\n spinner.succeed('Build complete!');\r\n log.blank();\r\n log.success(`Output: ${pc.cyan('.flexi/')}`);\r\n\r\n // Show bundle analysis if enabled\r\n if (options.analyze && result?.analysis) {\r\n log.blank();\r\n log.info('📊 Bundle Analysis:');\r\n log.blank();\r\n\r\n const analysis = result.analysis;\r\n\r\n // Sort by size\r\n const sorted = Object.entries(analysis.files || {})\r\n .sort((a: any, b: any) => b[1].size - a[1].size);\r\n\r\n console.log(pc.dim(' ─────────────────────────────────────────────────'));\r\n console.log(` ${pc.bold('File')}${' '.repeat(35)}${pc.bold('Size')}`);\r\n console.log(pc.dim(' ─────────────────────────────────────────────────'));\r\n\r\n for (const [file, info] of sorted.slice(0, 15) as any) {\r\n const name = file.length > 35 ? '...' + file.slice(-32) : file;\r\n const size = formatBytes(info.size);\r\n const gzip = info.gzipSize ? pc.dim(` (${formatBytes(info.gzipSize)} gzip)`) : '';\r\n console.log(` ${name.padEnd(38)} ${pc.cyan(size)}${gzip}`);\r\n }\r\n\r\n console.log(pc.dim(' ─────────────────────────────────────────────────'));\r\n console.log(` ${pc.bold('Total:')}${' '.repeat(31)} ${pc.green(formatBytes(analysis.totalSize || 0))}`);\r\n\r\n if (analysis.totalGzipSize) {\r\n console.log(` ${pc.dim('Gzipped:')}${' '.repeat(29)} ${pc.dim(formatBytes(analysis.totalGzipSize))}`);\r\n }\r\n\r\n log.blank();\r\n }\r\n\r\n } catch (error: any) {\r\n spinner.fail('Build failed');\r\n log.error(error.message);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\r\n}\r\n\r\n// ============================================================================\r\n// Start Command\r\n// ============================================================================\r\n\r\nasync function runStart(): Promise<void> {\r\n console.log(MINI_LOGO);\r\n log.blank();\r\n log.info('Starting production server...');\r\n log.blank();\r\n\r\n // Determine if we are running from dist or source\r\n const isBuilt = __dirname.includes('dist');\r\n const ext = isBuilt ? 'js' : 'ts';\r\n const startProdPath = path.join(__dirname, '..', 'core', `start-prod.${ext}`);\r\n\r\n const child = spawn(\r\n 'npx',\r\n ['tsx', startProdPath],\r\n {\r\n stdio: 'inherit',\r\n cwd: process.cwd(),\r\n shell: true,\r\n env: { ...process.env, NODE_ENV: 'production' }\r\n }\r\n );\r\n\r\n child.on('error', (error) => {\r\n log.error(`Failed to start server: ${error.message}`);\r\n process.exit(1);\r\n });\r\n\r\n process.on('SIGINT', () => child.kill('SIGINT'));\r\n process.on('SIGTERM', () => child.kill('SIGTERM'));\r\n}\r\n\r\n// ============================================================================\r\n// Doctor Command\r\n// ============================================================================\r\n\r\nasync function runDoctor(): Promise<void> {\r\n console.log(MINI_LOGO);\r\n log.blank();\r\n log.info('Checking your project...');\r\n log.blank();\r\n\r\n interface Check {\r\n name: string;\r\n status: 'pass' | 'fail' | 'warn' | 'info';\r\n message: string;\r\n }\r\n\r\n const checks: Check[] = [];\r\n const projectRoot = process.cwd();\r\n\r\n // Node.js version\r\n const nodeVersion = process.version;\r\n const nodeMajor = parseInt(nodeVersion.slice(1).split('.')[0]);\r\n checks.push({\r\n name: 'Node.js version',\r\n status: nodeMajor >= 18 ? 'pass' : 'fail',\r\n message: nodeMajor >= 18 ? `${nodeVersion} ✓` : `${nodeVersion} (requires 18+)`\r\n });\r\n\r\n // package.json\r\n const packageJsonPath = path.join(projectRoot, 'package.json');\r\n const hasPackageJson = fs.existsSync(packageJsonPath);\r\n checks.push({\r\n name: 'package.json',\r\n status: hasPackageJson ? 'pass' : 'fail',\r\n message: hasPackageJson ? 'Found' : 'Not found'\r\n });\r\n\r\n // pages directory\r\n const pagesDir = path.join(projectRoot, 'pages');\r\n const hasPages = fs.existsSync(pagesDir);\r\n checks.push({\r\n name: 'pages/ directory',\r\n status: hasPages ? 'pass' : 'warn',\r\n message: hasPages ? 'Found' : 'Not found'\r\n });\r\n\r\n // TypeScript\r\n const tsconfigPath = path.join(projectRoot, 'tsconfig.json');\r\n const hasTypeScript = fs.existsSync(tsconfigPath);\r\n checks.push({\r\n name: 'TypeScript',\r\n status: 'info',\r\n message: hasTypeScript ? 'Enabled' : 'Not configured'\r\n });\r\n\r\n // Tailwind\r\n const tailwindPath = path.join(projectRoot, 'tailwind.config.js');\r\n const hasTailwind = fs.existsSync(tailwindPath);\r\n checks.push({\r\n name: 'Tailwind CSS',\r\n status: 'info',\r\n message: hasTailwind ? 'Configured' : 'Not configured'\r\n });\r\n\r\n // Print results\r\n let hasErrors = false;\r\n let hasWarnings = false;\r\n\r\n for (const check of checks) {\r\n let icon: string;\r\n let color: (s: string) => string;\r\n\r\n switch (check.status) {\r\n case 'pass':\r\n icon = '✓';\r\n color = pc.green;\r\n break;\r\n case 'fail':\r\n icon = '✗';\r\n color = pc.red;\r\n hasErrors = true;\r\n break;\r\n case 'warn':\r\n icon = '⚠';\r\n color = pc.yellow;\r\n hasWarnings = true;\r\n break;\r\n default:\r\n icon = '○';\r\n color = pc.cyan;\r\n }\r\n\r\n console.log(` ${color(icon)} ${check.name}: ${pc.dim(check.message)}`);\r\n }\r\n\r\n log.blank();\r\n\r\n if (hasErrors) {\r\n log.error('Some checks failed. Please fix the issues above.');\r\n } else if (hasWarnings) {\r\n log.warn('All critical checks passed with some warnings.');\r\n } else {\r\n log.success('All checks passed! Your project is ready.');\r\n }\r\n\r\n log.blank();\r\n}\r\n\r\n// ============================================================================\r\n// Help Command\r\n// ============================================================================\r\n\r\nfunction showHelp(): void {\r\n console.log(LOGO);\r\n\r\n console.log(` ${pc.bold('Usage:')}`);\r\n console.log(` ${pc.cyan('flexi')} ${pc.dim('<command>')} ${pc.dim('[options]')}`);\r\n log.blank();\r\n\r\n console.log(` ${pc.bold('Commands:')}`);\r\n console.log(` ${pc.cyan('create')} ${pc.dim('<name>')} Create a new FlexiReact project`);\r\n console.log(` ${pc.cyan('dev')} Start development server`);\r\n console.log(` ${pc.cyan('build')} Build for production`);\r\n console.log(` ${pc.cyan('start')} Start production server`);\r\n console.log(` ${pc.cyan('generate')} ${pc.dim('<type>')} Generate component/page/hook/etc (alias: g)`);\r\n console.log(` ${pc.cyan('doctor')} Check project health`);\r\n console.log(` ${pc.cyan('help')} Show this help message`);\r\n log.blank();\r\n\r\n console.log(` ${pc.bold('Generate Types:')}`);\r\n console.log(` ${pc.dim('page, layout, component, hook, api, action, middleware, context')}`);\r\n console.log(` ${pc.dim('loading, error, not-found')}`);\r\n log.blank();\r\n\r\n console.log(` ${pc.bold('Examples:')}`);\r\n console.log(` ${pc.dim('$')} flexi create my-app`);\r\n console.log(` ${pc.dim('$')} flexi dev`);\r\n console.log(` ${pc.dim('$')} flexi g component Button`);\r\n console.log(` ${pc.dim('$')} flexi g page dashboard`);\r\n console.log(` ${pc.dim('$')} flexi build --analyze`);\r\n log.blank();\r\n}\r\n\r\n// ============================================================================\r\n// Main Entry Point\r\n// ============================================================================\r\n\r\nasync function main(): Promise<void> {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n switch (command) {\r\n case 'create':\r\n await createProject(args[1]);\r\n break;\r\n\r\n case 'dev':\r\n await runDev();\r\n break;\r\n\r\n case 'build':\r\n const analyzeFlag = args.includes('--analyze') || args.includes('-a');\r\n await runBuild({ analyze: analyzeFlag });\r\n break;\r\n\r\n case 'start':\r\n await runStart();\r\n break;\r\n\r\n case 'doctor':\r\n await runDoctor();\r\n break;\r\n\r\n case 'generate':\r\n case 'g':\r\n await runGenerate(args[1], args[2]);\r\n break;\r\n\r\n case 'generate:list':\r\n case 'g:list':\r\n listGenerators();\r\n break;\r\n\r\n case 'version':\r\n case '-v':\r\n case '--version':\r\n console.log(`${MINI_LOGO} ${pc.dim(`v${VERSION}`)}`);\r\n break;\r\n\r\n case 'help':\r\n case '--help':\r\n case '-h':\r\n showHelp();\r\n break;\r\n\r\n default:\r\n if (command) {\r\n log.error(`Unknown command: ${command}`);\r\n log.blank();\r\n }\r\n showHelp();\r\n process.exit(command ? 1 : 0);\r\n }\r\n}\r\n\r\nmain().catch((error) => {\r\n log.error(error.message);\r\n process.exit(1);\r\n});\r\n","/**\r\n * FlexiReact CLI Generators\r\n * Scaffolding commands for rapid development\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\n\r\nconst log = {\r\n info: (msg: string) => console.log(`${pc.cyan('ℹ')} ${msg}`),\r\n success: (msg: string) => console.log(`${pc.green('✓')} ${msg}`),\r\n warn: (msg: string) => console.log(`${pc.yellow('⚠')} ${pc.yellow(msg)}`),\r\n error: (msg: string) => console.log(`${pc.red('✗')} ${pc.red(msg)}`),\r\n blank: () => console.log(''),\r\n};\r\n\r\n// ============================================================================\r\n// Templates\r\n// ============================================================================\r\n\r\nconst templates = {\r\n // Page template\r\n page: (name: string, options: { client?: boolean }) => `${options.client ? \"'use client';\\n\\n\" : ''}import React from 'react';\r\n\r\nexport default function ${toPascalCase(name)}Page() {\r\n return (\r\n <div className=\"min-h-screen p-8\">\r\n <h1 className=\"text-4xl font-bold\">${toPascalCase(name)}</h1>\r\n <p className=\"text-gray-400 mt-4\">Welcome to ${name} page</p>\r\n </div>\r\n );\r\n}\r\n`,\r\n\r\n // Layout template\r\n layout: (name: string) => `import React from 'react';\r\n\r\ninterface ${toPascalCase(name)}LayoutProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport default function ${toPascalCase(name)}Layout({ children }: ${toPascalCase(name)}LayoutProps) {\r\n return (\r\n <div className=\"${name}-layout\">\r\n {/* Add your layout wrapper here */}\r\n {children}\r\n </div>\r\n );\r\n}\r\n`,\r\n\r\n // Component template\r\n component: (name: string, options: { client?: boolean; props?: boolean }) => {\r\n const propsInterface = options.props ? `\r\ninterface ${toPascalCase(name)}Props {\r\n className?: string;\r\n children?: React.ReactNode;\r\n}\r\n` : '';\r\n const propsType = options.props ? `{ className, children }: ${toPascalCase(name)}Props` : '{}';\r\n \r\n return `${options.client ? \"'use client';\\n\\n\" : ''}import React from 'react';\r\nimport { cn } from '@/lib/utils';\r\n${propsInterface}\r\nexport function ${toPascalCase(name)}(${propsType}) {\r\n return (\r\n <div className={cn('${toKebabCase(name)}', ${options.props ? 'className' : \"''\"})}>\r\n ${options.props ? '{children}' : `{/* ${toPascalCase(name)} content */}`}\r\n </div>\r\n );\r\n}\r\n\r\nexport default ${toPascalCase(name)};\r\n`;\r\n },\r\n\r\n // Hook template\r\n hook: (name: string) => `import { useState, useEffect, useCallback } from 'react';\r\n\r\nexport function use${toPascalCase(name)}() {\r\n const [state, setState] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const execute = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n // Add your logic here\r\n setState(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error('Unknown error'));\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n return { state, loading, error, execute };\r\n}\r\n\r\nexport default use${toPascalCase(name)};\r\n`,\r\n\r\n // API route template\r\n api: (name: string) => `import type { IncomingMessage, ServerResponse } from 'http';\r\n\r\nexport default async function handler(req: IncomingMessage, res: ServerResponse) {\r\n const method = req.method;\r\n\r\n switch (method) {\r\n case 'GET':\r\n return handleGet(req, res);\r\n case 'POST':\r\n return handlePost(req, res);\r\n default:\r\n res.statusCode = 405;\r\n res.setHeader('Content-Type', 'application/json');\r\n res.end(JSON.stringify({ error: 'Method not allowed' }));\r\n }\r\n}\r\n\r\nasync function handleGet(req: IncomingMessage, res: ServerResponse) {\r\n res.statusCode = 200;\r\n res.setHeader('Content-Type', 'application/json');\r\n res.end(JSON.stringify({ message: '${name} API - GET' }));\r\n}\r\n\r\nasync function handlePost(req: IncomingMessage, res: ServerResponse) {\r\n // Parse body\r\n let body = '';\r\n for await (const chunk of req) {\r\n body += chunk;\r\n }\r\n const data = body ? JSON.parse(body) : {};\r\n\r\n res.statusCode = 200;\r\n res.setHeader('Content-Type', 'application/json');\r\n res.end(JSON.stringify({ message: '${name} API - POST', data }));\r\n}\r\n`,\r\n\r\n // Server Action template\r\n action: (name: string) => `'use server';\r\n\r\nimport { revalidatePath } from '@flexireact/core';\r\n\r\nexport async function ${toCamelCase(name)}Action(formData: FormData) {\r\n // Validate input\r\n const data = Object.fromEntries(formData);\r\n \r\n try {\r\n // Add your server logic here\r\n console.log('${toPascalCase(name)} action executed:', data);\r\n \r\n // Revalidate cache if needed\r\n // revalidatePath('/');\r\n \r\n return { success: true, data };\r\n } catch (error) {\r\n return { \r\n success: false, \r\n error: error instanceof Error ? error.message : 'Unknown error' \r\n };\r\n }\r\n}\r\n`,\r\n\r\n // Middleware template\r\n middleware: (name: string) => `import type { IncomingMessage, ServerResponse } from 'http';\r\n\r\nexport interface ${toPascalCase(name)}MiddlewareOptions {\r\n // Add your options here\r\n}\r\n\r\nexport function ${toCamelCase(name)}Middleware(options: ${toPascalCase(name)}MiddlewareOptions = {}) {\r\n return async (\r\n req: IncomingMessage,\r\n res: ServerResponse,\r\n next: () => Promise<void>\r\n ) => {\r\n // Before request handling\r\n console.log('[${toPascalCase(name)}] Request:', req.url);\r\n \r\n // Continue to next middleware/handler\r\n await next();\r\n \r\n // After request handling (optional)\r\n };\r\n}\r\n\r\nexport default ${toCamelCase(name)}Middleware;\r\n`,\r\n\r\n // Context template\r\n context: (name: string) => `'use client';\r\n\r\nimport React, { createContext, useContext, useState, useCallback } from 'react';\r\n\r\ninterface ${toPascalCase(name)}State {\r\n // Add your state properties here\r\n value: string | null;\r\n}\r\n\r\ninterface ${toPascalCase(name)}ContextValue extends ${toPascalCase(name)}State {\r\n setValue: (value: string) => void;\r\n reset: () => void;\r\n}\r\n\r\nconst ${toPascalCase(name)}Context = createContext<${toPascalCase(name)}ContextValue | null>(null);\r\n\r\nexport function ${toPascalCase(name)}Provider({ children }: { children: React.ReactNode }) {\r\n const [state, setState] = useState<${toPascalCase(name)}State>({\r\n value: null,\r\n });\r\n\r\n const setValue = useCallback((value: string) => {\r\n setState(prev => ({ ...prev, value }));\r\n }, []);\r\n\r\n const reset = useCallback(() => {\r\n setState({ value: null });\r\n }, []);\r\n\r\n return (\r\n <${toPascalCase(name)}Context.Provider value={{ ...state, setValue, reset }}>\r\n {children}\r\n </${toPascalCase(name)}Context.Provider>\r\n );\r\n}\r\n\r\nexport function use${toPascalCase(name)}() {\r\n const context = useContext(${toPascalCase(name)}Context);\r\n if (!context) {\r\n throw new Error('use${toPascalCase(name)} must be used within a ${toPascalCase(name)}Provider');\r\n }\r\n return context;\r\n}\r\n`,\r\n\r\n // Loading template\r\n loading: () => `import React from 'react';\r\nimport { Spinner } from '@flexireact/flexi-ui';\r\n\r\nexport default function Loading() {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center\">\r\n <Spinner size=\"lg\" />\r\n </div>\r\n );\r\n}\r\n`,\r\n\r\n // Error template\r\n error: () => `'use client';\r\n\r\nimport React from 'react';\r\nimport { Button, Alert } from '@flexireact/flexi-ui';\r\n\r\ninterface ErrorProps {\r\n error: Error;\r\n reset: () => void;\r\n}\r\n\r\nexport default function Error({ error, reset }: ErrorProps) {\r\n return (\r\n <div className=\"min-h-screen flex flex-col items-center justify-center p-8\">\r\n <Alert variant=\"error\" className=\"max-w-md mb-8\">\r\n <h2 className=\"font-bold text-lg mb-2\">Something went wrong</h2>\r\n <p className=\"text-sm\">{error.message}</p>\r\n </Alert>\r\n <Button onClick={reset}>Try again</Button>\r\n </div>\r\n );\r\n}\r\n`,\r\n\r\n // Not found template\r\n notFound: () => `import React from 'react';\r\nimport { Button } from '@flexireact/flexi-ui';\r\n\r\nexport default function NotFound() {\r\n return (\r\n <div className=\"min-h-screen flex flex-col items-center justify-center p-8\">\r\n <h1 className=\"text-8xl font-bold text-primary mb-4\">404</h1>\r\n <p className=\"text-gray-400 text-xl mb-8\">Page not found</p>\r\n <Button asChild>\r\n <a href=\"/\">← Back Home</a>\r\n </Button>\r\n </div>\r\n );\r\n}\r\n`,\r\n};\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\nfunction toPascalCase(str: string): string {\r\n return str\r\n .replace(/[-_](.)/g, (_, c) => c.toUpperCase())\r\n .replace(/^(.)/, (_, c) => c.toUpperCase());\r\n}\r\n\r\nfunction toCamelCase(str: string): string {\r\n return str\r\n .replace(/[-_](.)/g, (_, c) => c.toUpperCase())\r\n .replace(/^(.)/, (_, c) => c.toLowerCase());\r\n}\r\n\r\nfunction toKebabCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[_\\s]+/g, '-')\r\n .toLowerCase();\r\n}\r\n\r\nfunction ensureDir(filePath: string): void {\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n}\r\n\r\nfunction writeFile(filePath: string, content: string): void {\r\n ensureDir(filePath);\r\n fs.writeFileSync(filePath, content);\r\n}\r\n\r\n// ============================================================================\r\n// Generator Commands\r\n// ============================================================================\r\n\r\nexport type GeneratorType = \r\n | 'page' \r\n | 'layout' \r\n | 'component' \r\n | 'hook' \r\n | 'api' \r\n | 'action' \r\n | 'middleware' \r\n | 'context'\r\n | 'loading'\r\n | 'error'\r\n | 'not-found';\r\n\r\nexport async function runGenerate(type?: string, name?: string): Promise<void> {\r\n const cwd = process.cwd();\r\n \r\n // Check if we're in a FlexiReact project\r\n if (!fs.existsSync(path.join(cwd, 'package.json'))) {\r\n log.error('Not in a FlexiReact project. Run this command in your project root.');\r\n process.exit(1);\r\n }\r\n\r\n // Interactive mode if no type provided\r\n if (!type) {\r\n const response = await prompts([\r\n {\r\n type: 'select',\r\n name: 'type',\r\n message: 'What do you want to generate?',\r\n choices: [\r\n { title: '📄 Page', value: 'page', description: 'A new page in app/ or pages/' },\r\n { title: '📐 Layout', value: 'layout', description: 'A layout wrapper component' },\r\n { title: '🧩 Component', value: 'component', description: 'A reusable React component' },\r\n { title: '🪝 Hook', value: 'hook', description: 'A custom React hook' },\r\n { title: '🔌 API Route', value: 'api', description: 'An API endpoint' },\r\n { title: '⚡ Server Action', value: 'action', description: 'A server action function' },\r\n { title: '🛡️ Middleware', value: 'middleware', description: 'Request middleware' },\r\n { title: '🌐 Context', value: 'context', description: 'React context provider' },\r\n { title: '⏳ Loading', value: 'loading', description: 'Loading state component' },\r\n { title: '❌ Error', value: 'error', description: 'Error boundary component' },\r\n { title: '🔍 Not Found', value: 'not-found', description: '404 page component' },\r\n ],\r\n },\r\n {\r\n type: (prev) => ['loading', 'error', 'not-found'].includes(prev) ? null : 'text',\r\n name: 'name',\r\n message: 'Name:',\r\n validate: (v: string) => v.length > 0 || 'Name is required',\r\n },\r\n ]);\r\n\r\n if (!response.type) process.exit(0);\r\n type = response.type;\r\n name = response.name;\r\n }\r\n\r\n // Validate type\r\n const validTypes: GeneratorType[] = [\r\n 'page', 'layout', 'component', 'hook', 'api', \r\n 'action', 'middleware', 'context', 'loading', 'error', 'not-found'\r\n ];\r\n \r\n if (!validTypes.includes(type as GeneratorType)) {\r\n log.error(`Invalid type: ${type}`);\r\n log.info(`Valid types: ${validTypes.join(', ')}`);\r\n process.exit(1);\r\n }\r\n\r\n // Special types that don't need a name\r\n if (type && ['loading', 'error', 'not-found'].includes(type)) {\r\n await generateSpecialFile(type as 'loading' | 'error' | 'not-found', cwd);\r\n return;\r\n }\r\n\r\n // Get name if not provided\r\n let finalName = name;\r\n if (!finalName) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: `${toPascalCase(type || 'item')} name:`,\r\n validate: (v: string) => v.length > 0 || 'Name is required',\r\n });\r\n finalName = response.name;\r\n if (!finalName) process.exit(0);\r\n }\r\n\r\n // Generate based on type\r\n switch (type) {\r\n case 'page':\r\n await generatePage(finalName, cwd);\r\n break;\r\n case 'layout':\r\n await generateLayout(finalName, cwd);\r\n break;\r\n case 'component':\r\n await generateComponent(finalName, cwd);\r\n break;\r\n case 'hook':\r\n await generateHook(finalName, cwd);\r\n break;\r\n case 'api':\r\n await generateApi(finalName, cwd);\r\n break;\r\n case 'action':\r\n await generateAction(finalName, cwd);\r\n break;\r\n case 'middleware':\r\n await generateMiddleware(finalName, cwd);\r\n break;\r\n case 'context':\r\n await generateContext(finalName, cwd);\r\n break;\r\n }\r\n}\r\n\r\nasync function generatePage(name: string, cwd: string): Promise<void> {\r\n const response = await prompts([\r\n {\r\n type: 'select',\r\n name: 'directory',\r\n message: 'Where to create the page?',\r\n choices: [\r\n { title: 'app/ (App Router)', value: 'app' },\r\n { title: 'pages/ (Pages Router)', value: 'pages' },\r\n ],\r\n },\r\n {\r\n type: 'toggle',\r\n name: 'client',\r\n message: 'Client component? (use client)',\r\n initial: false,\r\n active: 'Yes',\r\n inactive: 'No',\r\n },\r\n ]);\r\n\r\n const fileName = response.directory === 'app' ? 'page.tsx' : `${toKebabCase(name)}.tsx`;\r\n const filePath = response.directory === 'app' \r\n ? path.join(cwd, 'app', toKebabCase(name), fileName)\r\n : path.join(cwd, 'pages', fileName);\r\n\r\n writeFile(filePath, templates.page(name, { client: response.client }));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateLayout(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'app', toKebabCase(name), 'layout.tsx');\r\n writeFile(filePath, templates.layout(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateComponent(name: string, cwd: string): Promise<void> {\r\n const response = await prompts([\r\n {\r\n type: 'select',\r\n name: 'directory',\r\n message: 'Where to create the component?',\r\n choices: [\r\n { title: 'components/', value: 'components' },\r\n { title: 'app/components/', value: 'app/components' },\r\n ],\r\n },\r\n {\r\n type: 'toggle',\r\n name: 'client',\r\n message: 'Client component?',\r\n initial: true,\r\n active: 'Yes',\r\n inactive: 'No',\r\n },\r\n {\r\n type: 'toggle',\r\n name: 'props',\r\n message: 'Include props interface?',\r\n initial: true,\r\n active: 'Yes',\r\n inactive: 'No',\r\n },\r\n ]);\r\n\r\n const filePath = path.join(cwd, response.directory, `${toPascalCase(name)}.tsx`);\r\n writeFile(filePath, templates.component(name, { client: response.client, props: response.props }));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateHook(name: string, cwd: string): Promise<void> {\r\n const hookName = name.startsWith('use') ? name : `use-${name}`;\r\n const filePath = path.join(cwd, 'hooks', `${toKebabCase(hookName)}.ts`);\r\n writeFile(filePath, templates.hook(hookName.replace(/^use-?/, '')));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateApi(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'pages', 'api', `${toKebabCase(name)}.ts`);\r\n writeFile(filePath, templates.api(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateAction(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'actions', `${toKebabCase(name)}.ts`);\r\n writeFile(filePath, templates.action(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateMiddleware(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'middleware', `${toKebabCase(name)}.ts`);\r\n writeFile(filePath, templates.middleware(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateContext(name: string, cwd: string): Promise<void> {\r\n const filePath = path.join(cwd, 'contexts', `${toPascalCase(name)}Context.tsx`);\r\n writeFile(filePath, templates.context(name));\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\nasync function generateSpecialFile(type: 'loading' | 'error' | 'not-found', cwd: string): Promise<void> {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'path',\r\n message: 'Path (relative to app/):',\r\n initial: '',\r\n });\r\n\r\n const basePath = response.path ? path.join(cwd, 'app', response.path) : path.join(cwd, 'app');\r\n \r\n let fileName: string;\r\n let content: string;\r\n \r\n switch (type) {\r\n case 'loading':\r\n fileName = 'loading.tsx';\r\n content = templates.loading();\r\n break;\r\n case 'error':\r\n fileName = 'error.tsx';\r\n content = templates.error();\r\n break;\r\n case 'not-found':\r\n fileName = 'not-found.tsx';\r\n content = templates.notFound();\r\n break;\r\n }\r\n\r\n const filePath = path.join(basePath, fileName);\r\n writeFile(filePath, content);\r\n log.success(`Created ${pc.cyan(path.relative(cwd, filePath))}`);\r\n}\r\n\r\n// ============================================================================\r\n// List Generators\r\n// ============================================================================\r\n\r\nexport function listGenerators(): void {\r\n console.log(`\r\n${pc.bold('Available Generators:')}\r\n\r\n ${pc.cyan('page')} Create a new page (app/ or pages/)\r\n ${pc.cyan('layout')} Create a layout wrapper\r\n ${pc.cyan('component')} Create a React component\r\n ${pc.cyan('hook')} Create a custom hook\r\n ${pc.cyan('api')} Create an API route\r\n ${pc.cyan('action')} Create a server action\r\n ${pc.cyan('middleware')} Create request middleware\r\n ${pc.cyan('context')} Create a React context\r\n ${pc.cyan('loading')} Create a loading component\r\n ${pc.cyan('error')} Create an error boundary\r\n ${pc.cyan('not-found')} Create a 404 page\r\n\r\n${pc.bold('Usage:')}\r\n ${pc.dim('$')} flexi generate ${pc.cyan('<type>')} ${pc.dim('[name]')}\r\n ${pc.dim('$')} flexi g ${pc.cyan('<type>')} ${pc.dim('[name]')}\r\n\r\n${pc.bold('Examples:')}\r\n ${pc.dim('$')} flexi g page dashboard\r\n ${pc.dim('$')} flexi g component Button\r\n ${pc.dim('$')} flexi g hook auth\r\n ${pc.dim('$')} flexi g api users\r\n`);\r\n}\r\n"],"mappings":"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","names":["fs","path","pc","prompts","__filename","__dirname","path","pc","log","fs","prompts"]}