@flexireact/core 3.0.2 → 3.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/cli/index.js +14 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/core/build/index.js +689 -0
- package/dist/core/build/index.js.map +1 -0
- package/dist/core/config.js +86 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/start-dev.js +3092 -0
- package/dist/core/start-dev.js.map +1 -0
- package/dist/core/start-prod.js +3092 -0
- package/dist/core/start-prod.js.map +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -147,7 +147,7 @@ Open [http://localhost:3000](http://localhost:3000) 🎉
|
|
|
147
147
|
| 🎣 **Lifecycle Hooks** | `beforeRender`, `afterRender`, `onError` hooks |
|
|
148
148
|
| 📦 **Custom Templates** | Create and share your own project templates |
|
|
149
149
|
| 🔄 **Migration Tools** | Automatic migration from Next.js, CRA, Vite |
|
|
150
|
-
| ⚙️ **Config API** | Fully customizable
|
|
150
|
+
| ⚙️ **Config API** | Fully customizable `@flexireact/core.config.ts` |
|
|
151
151
|
|
|
152
152
|
---
|
|
153
153
|
|
|
@@ -746,7 +746,7 @@ export default {
|
|
|
746
746
|
### Built-in Plugins
|
|
747
747
|
|
|
748
748
|
```js
|
|
749
|
-
import { builtinPlugins } from 'flexireact';
|
|
749
|
+
import { builtinPlugins } from '@flexireact/core';
|
|
750
750
|
|
|
751
751
|
export default {
|
|
752
752
|
plugins: [
|
|
@@ -859,7 +859,7 @@ Islands provide partial hydration:
|
|
|
859
859
|
|
|
860
860
|
| Package | Version | Description |
|
|
861
861
|
|---------|---------|-------------|
|
|
862
|
-
| [
|
|
862
|
+
| [flexireact](https://www.npmjs.com/package/flexireact) |  | Core framework |
|
|
863
863
|
| [@flexireact/flexi-ui](https://www.npmjs.com/package/@flexireact/flexi-ui) |  | UI components |
|
|
864
864
|
| [create-flexireact](https://www.npmjs.com/package/create-flexireact) |  | Project scaffolding |
|
|
865
865
|
|
package/dist/cli/index.js
CHANGED
|
@@ -1254,10 +1254,14 @@ ${pc2.cyan(" \u2502")} ${pc2.dim("The Modern React Framework")} ${p
|
|
|
1254
1254
|
${pc2.cyan(" \u2502")} ${pc2.cyan("\u2502")}
|
|
1255
1255
|
${pc2.cyan(" \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F")}
|
|
1256
1256
|
`);
|
|
1257
|
-
const
|
|
1257
|
+
const isBuilt = __dirname2.includes("dist");
|
|
1258
|
+
const ext = isBuilt ? "js" : "ts";
|
|
1259
|
+
const startDevDir = isBuilt ? path2.join(__dirname2, "..", "core") : path2.join(__dirname2, "..", "core");
|
|
1260
|
+
const startDevPath = path2.join(startDevDir, `start-dev.${ext}`);
|
|
1261
|
+
const tsxBin = "tsx";
|
|
1258
1262
|
const child = spawn(
|
|
1259
1263
|
"npx",
|
|
1260
|
-
[
|
|
1264
|
+
[tsxBin, startDevPath],
|
|
1261
1265
|
{
|
|
1262
1266
|
stdio: "inherit",
|
|
1263
1267
|
cwd: process.cwd(),
|
|
@@ -1282,8 +1286,11 @@ async function runBuild(options = {}) {
|
|
|
1282
1286
|
log2.blank();
|
|
1283
1287
|
const spinner = ora({ text: "Compiling...", color: "cyan" }).start();
|
|
1284
1288
|
try {
|
|
1285
|
-
const
|
|
1286
|
-
const
|
|
1289
|
+
const isBuilt = __dirname2.includes("dist");
|
|
1290
|
+
const ext = isBuilt ? "js" : "ts";
|
|
1291
|
+
const coreDir = isBuilt ? path2.join(__dirname2, "..", "core") : path2.join(__dirname2, "..", "core");
|
|
1292
|
+
const buildPath = path2.join(coreDir, "build", `index.${ext}`);
|
|
1293
|
+
const configPath = path2.join(coreDir, `config.${ext}`);
|
|
1287
1294
|
const buildModule = await import(pathToFileURL(buildPath).href);
|
|
1288
1295
|
const configModule = await import(pathToFileURL(configPath).href);
|
|
1289
1296
|
const projectRoot = process.cwd();
|
|
@@ -1338,7 +1345,9 @@ async function runStart() {
|
|
|
1338
1345
|
log2.blank();
|
|
1339
1346
|
log2.info("Starting production server...");
|
|
1340
1347
|
log2.blank();
|
|
1341
|
-
const
|
|
1348
|
+
const isBuilt = __dirname2.includes("dist");
|
|
1349
|
+
const ext = isBuilt ? "js" : "ts";
|
|
1350
|
+
const startProdPath = path2.join(__dirname2, "..", "core", `start-prod.${ext}`);
|
|
1342
1351
|
const child = spawn(
|
|
1343
1352
|
"npx",
|
|
1344
1353
|
["tsx", startProdPath],
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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 const startDevPath = path.join(__dirname, '..', 'core', 'start-dev.ts');\r\n\r\n const child = spawn(\r\n 'npx',\r\n ['tsx', 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 // Dynamic import of build module\r\n const buildPath = path.join(__dirname, '..', 'core', 'build', 'index.js');\r\n const configPath = path.join(__dirname, '..', 'core', 'config.js');\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 const startProdPath = path.join(__dirname, '..', 'core', 'start-prod.ts');\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"]}
|
|
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":"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","names":["fs","path","pc","prompts","__filename","__dirname","path","pc","log","fs","prompts"]}
|