@teamvelix/cli 5.0.9 → 5.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -6,9 +6,13 @@ import path from "path";
6
6
  import { fileURLToPath } from "url";
7
7
  import pc from "picocolors";
8
8
  import prompts from "prompts";
9
+
10
+ // version.ts
11
+ var VERSION = "5.1.1";
12
+
13
+ // index.ts
9
14
  var __filename = fileURLToPath(import.meta.url);
10
15
  var __dirname = path.dirname(__filename);
11
- var VERSION = "5.0.9";
12
16
  var log = {
13
17
  info: (msg) => console.log(` ${pc.cyan("\u2139")} ${msg}`),
14
18
  success: (msg) => console.log(` ${pc.green("\u2714")} ${msg}`),
@@ -470,13 +474,12 @@ async function startDev() {
470
474
  const { spawn } = await import("child_process");
471
475
  const child = spawn("npx", ["tsx", "--no-cache", "node_modules/@teamvelix/velix/dist/runtime/start-dev.js"], {
472
476
  stdio: "inherit",
473
- cwd: process.cwd(),
474
- shell: true
477
+ cwd: process.cwd()
475
478
  });
476
479
  child.on("error", () => {
477
480
  const devScript = path.join(process.cwd(), "packages", "velix", "runtime", "start-dev.ts");
478
481
  if (fs.existsSync(devScript)) {
479
- spawn("npx", ["tsx", devScript], { stdio: "inherit", cwd: process.cwd(), shell: true });
482
+ spawn("npx", ["tsx", devScript], { stdio: "inherit", cwd: process.cwd() });
480
483
  } else {
481
484
  log.error("Could not find Velix runtime. Run `npm install` first.");
482
485
  process.exit(1);
@@ -489,13 +492,12 @@ async function buildProject() {
489
492
  const { spawn } = await import("child_process");
490
493
  const child = spawn("npx", ["tsx", "node_modules/@teamvelix/velix/dist/runtime/start-build.js"], {
491
494
  stdio: "inherit",
492
- cwd: process.cwd(),
493
- shell: true
495
+ cwd: process.cwd()
494
496
  });
495
497
  child.on("error", () => {
496
498
  const buildScript = path.join(process.cwd(), "packages", "velix", "runtime", "start-build.ts");
497
499
  if (fs.existsSync(buildScript)) {
498
- spawn("npx", ["tsx", buildScript], { stdio: "inherit", cwd: process.cwd(), shell: true });
500
+ spawn("npx", ["tsx", buildScript], { stdio: "inherit", cwd: process.cwd() });
499
501
  } else {
500
502
  log.error("Could not find Velix runtime. Run `npm install` first.");
501
503
  process.exit(1);
@@ -508,8 +510,7 @@ async function startProd() {
508
510
  const { spawn } = await import("child_process");
509
511
  const child = spawn("npx", ["tsx", "node_modules/@teamvelix/velix/dist/runtime/start-prod.js"], {
510
512
  stdio: "inherit",
511
- cwd: process.cwd(),
512
- shell: true
513
+ cwd: process.cwd()
513
514
  });
514
515
  child.on("error", () => {
515
516
  log.error("Could not start production server.");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\n/**\r\n * Velix v5 CLI\r\n *\r\n * Commands:\r\n * velix create <name> Create a new Velix project\r\n * velix dev Start development server\r\n * velix build Build for production\r\n * velix start Start production server\r\n * velix g <type> <name> Generate (page, component, api, layout, middleware, etc.)\r\n * velix doctor Health check\r\n * velix info Framework info\r\n * velix analyze Bundle analysis\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { fileURLToPath } from 'url';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = path.dirname(__filename);\r\n\r\nconst VERSION = '5.0.9';\r\n\r\n// ============================================================================\r\n// Logger (shared, single instance)\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 blank: () => console.log(''),\r\n};\r\n\r\n// ============================================================================\r\n// ASCII Banner\r\n// ============================================================================\r\n\r\nfunction showBanner() {\r\n console.log('');\r\n console.log(` ${pc.cyan('▲')} ${pc.bold('Velix')} ${pc.dim(`v${VERSION}`)}`);\r\n console.log(` ${pc.dim('──────────────────────────────────────────────')}`);\r\n console.log('');\r\n}\r\n\r\n// ============================================================================\r\n// Help\r\n// ============================================================================\r\n\r\nfunction showHelp() {\r\n showBanner();\r\n console.log(` ${pc.bold('Usage:')} velix <command> [options]`);\r\n console.log('');\r\n console.log(` ${pc.bold('Commands:')}`);\r\n console.log(` ${pc.cyan('create')} <name> Create a new Velix 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('g')} <type> <name> Generate component/page/api/...`);\r\n console.log(` ${pc.cyan('ui')} add <component> Install Shadcn-style UI components`);\r\n console.log(` ${pc.cyan('doctor')} Health check & diagnostics`);\r\n console.log(` ${pc.cyan('info')} Framework & environment info`);\r\n console.log(` ${pc.cyan('analyze')} Bundle analysis`);\r\n console.log('');\r\n console.log(` ${pc.bold('Generate types:')}`);\r\n console.log(` page, layout, component, hook, api, action, middleware, context, loading, error, not-found`);\r\n console.log('');\r\n console.log(` ${pc.bold('Examples:')}`);\r\n console.log(` ${pc.dim('$')} velix create my-app`);\r\n console.log(` ${pc.dim('$')} velix dev`);\r\n console.log(` ${pc.dim('$')} velix g page dashboard`);\r\n console.log(` ${pc.dim('$')} velix g api users`);\r\n console.log('');\r\n}\r\n\r\n// ============================================================================\r\n// Main CLI\r\n// ============================================================================\r\n\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n if (!command || command === '--help' || command === '-h') {\r\n showHelp();\r\n return;\r\n }\r\n\r\n if (command === '--version' || command === '-v') {\r\n console.log(`velix v${VERSION}`);\r\n return;\r\n }\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 startDev();\r\n break;\r\n\r\n case 'build':\r\n await buildProject();\r\n break;\r\n\r\n case 'start':\r\n await startProd();\r\n break;\r\n\r\n case 'g':\r\n case 'generate':\r\n await generate(args[1], args[2]);\r\n break;\r\n\r\n case 'doctor':\r\n await doctor();\r\n break;\r\n\r\n case 'info':\r\n await info();\r\n break;\r\n\r\n case 'analyze':\r\n log.info('Bundle analysis coming soon...');\r\n break;\r\n\r\n case 'ui':\r\n await handleUiCommand(args.slice(1));\r\n break;\r\n\r\n default:\r\n log.error(`Unknown command: ${command}`);\r\n showHelp();\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Commands\r\n// ============================================================================\r\n\r\nasync function createProject(name?: string) {\r\n showBanner();\r\n\r\n if (!name) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: 'Project name:',\r\n initial: 'my-velix-app',\r\n });\r\n name = response.name;\r\n if (!name) { log.error('Project name is required'); process.exit(1); }\r\n }\r\n\r\n const projectDir = path.resolve(process.cwd(), name);\r\n\r\n if (fs.existsSync(projectDir)) {\r\n log.error(`Directory ${name} already exists`);\r\n process.exit(1);\r\n }\r\n\r\n // Choose template\r\n const flags = process.argv.slice(3); // Flags start from the 4th argument (index 3)\r\n const templateFlag = flags.find(a => a.startsWith('--template='))?.split('=')[1];\r\n const tailwindFlag = flags.includes('--tailwind');\r\n const noTailwindFlag = flags.includes('--no-tailwind');\r\n\r\n let template = templateFlag;\r\n let useTailwind: boolean | undefined = tailwindFlag ? true : (noTailwindFlag ? false : undefined);\r\n\r\n if (!template) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'template',\r\n message: 'Select a template:',\r\n choices: [\r\n { title: '✨ Default - Full Velix app with examples', value: 'default' },\r\n { title: '⚡ Minimal', value: 'minimal' },\r\n ],\r\n });\r\n template = response.template;\r\n }\r\n\r\n if (!template) {\r\n log.error('No template selected');\r\n process.exit(1);\r\n }\r\n\r\n if (useTailwind === undefined) { // Only prompt if not specified by flags\r\n const twResponse = await prompts({\r\n type: 'confirm',\r\n name: 'useTailwind',\r\n message: 'Use Tailwind CSS?',\r\n initial: true\r\n });\r\n useTailwind = twResponse.useTailwind;\r\n }\r\n\r\n let useShadcn: boolean | undefined = flags.includes('--shadcn') ? true : (flags.includes('--no-shadcn') ? false : undefined);\r\n \r\n if (useTailwind && useShadcn === undefined) {\r\n const shResponse = await prompts({\r\n type: 'confirm',\r\n name: 'useShadcn',\r\n message: 'Use Shadcn UI components?',\r\n initial: true\r\n });\r\n useShadcn = shResponse.useShadcn;\r\n }\r\n\r\n const { default: ora } = await import('ora');\r\n const spinner = ora('Creating project...').start();\r\n\r\n try {\r\n fs.mkdirSync(projectDir, { recursive: true });\r\n\r\n // Generate project files based on template\r\n generateProjectFiles(projectDir, name, template, useTailwind, useShadcn);\r\n\r\n spinner.succeed(`Project ${pc.bold(name)} created!`);\r\n log.blank();\r\n console.log(` ${pc.bold('Next steps:')}`);\r\n console.log(` ${pc.dim('$')} cd ${name}`);\r\n console.log(` ${pc.dim('$')} npm install`);\r\n console.log(` ${pc.dim('$')} npm run dev`);\r\n log.blank();\r\n\r\n } catch (err: any) {\r\n spinner.fail('Failed to create project');\r\n log.error(err.message);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction generateProjectFiles(dir: string, name: string, template: string, useTailwind: boolean = true, useShadcn: boolean = false) {\r\n // package.json\r\n const pkg: any = {\r\n name,\r\n version: '0.1.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'velix dev',\r\n build: 'velix build',\r\n start: 'velix start',\r\n },\r\n dependencies: {\r\n '@teamvelix/velix': `^${VERSION}`,\r\n react: '^19.0.0',\r\n 'react-dom': '^19.0.0',\r\n },\r\n devDependencies: {\r\n '@teamvelix/cli': `^${VERSION}`,\r\n typescript: '^5.7.0',\r\n '@types/react': '^19.0.0',\r\n '@types/react-dom': '^19.0.0',\r\n },\r\n };\r\n\r\n if (useTailwind) {\r\n pkg.devDependencies = {\r\n ...pkg.devDependencies,\r\n 'tailwindcss': '^4.0.0',\r\n '@tailwindcss/cli': '^4.0.0',\r\n };\r\n }\r\n\r\n if (useShadcn) {\r\n pkg.dependencies = {\r\n ...pkg.dependencies,\r\n 'clsx': '^2.1.0',\r\n 'tailwind-merge': '^2.2.1',\r\n 'lucide-react': '^0.359.0'\r\n };\r\n }\r\n\r\n writeFile(path.join(dir, 'package.json'), JSON.stringify(pkg, null, 2));\r\n\r\n // velix.config.ts\r\n writeFile(path.join(dir, 'velix.config.ts'), `import { defineConfig${useTailwind ? ', tailwindPlugin' : ''} } from \"@teamvelix/velix\";\r\n\r\nexport default defineConfig({\r\n app: {\r\n name: \"${name}\",\r\n },\r\n server: {\r\n port: 3000,\r\n host: \"localhost\",\r\n },\r\n seo: {\r\n sitemap: true,\r\n robots: true,\r\n openGraph: true,\r\n },\r\n favicon: \"/favicon.webp\",\r\n ${useTailwind ? `plugins: [\\n tailwindPlugin()\\n ],` : 'plugins: [],'}\r\n});\r\n`);\r\n\r\n // tsconfig.json\r\n writeFile(path.join(dir, 'tsconfig.json'), JSON.stringify({\r\n compilerOptions: {\r\n target: 'ES2022',\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n jsx: 'react-jsx',\r\n strict: true,\r\n esModuleInterop: true,\r\n skipLibCheck: true,\r\n forceConsistentCasingInFileNames: true,\r\n },\r\n include: ['app/**/*.ts', 'app/**/*.tsx', 'server/**/*.ts'],\r\n exclude: ['node_modules', '.velix']\r\n }, null, 2));\r\n\r\n if (useTailwind) {\r\n // Tailwind v4 configuration (content auto-detection, theme in CSS)\r\n writeFile(path.join(dir, 'tailwind.config.ts'), `import type { Config } from \"tailwindcss\";\\n\\nexport default {\\n content: [\\n \"./index.html\",\\n \"./app/**/*.{js,ts,jsx,tsx}\",\\n \"./components/**/*.{js,ts,jsx,tsx}\",\\n \"./lib/**/*.{js,ts,jsx,tsx}\",\\n \"./src/**/*.{js,ts,jsx,tsx}\",\\n ],\\n} satisfies Config;\\n`);\r\n }\r\n \r\n // app/layout.tsx\r\n fs.mkdirSync(path.join(dir, 'app'), { recursive: true });\r\n writeFile(path.join(dir, 'app', 'globals.css'), useTailwind ? `@import \"tailwindcss\";\\n\\n@theme {\\n --color-velix-deep: #0B1120;\\n --color-velix-dark: #0F172A;\\n --color-velix-accent: #2563EB;\\n --color-velix-cyan: #22D3EE;\\n --color-velix-glow: #38BDF8;\\n}\\n` : `body { margin: 0; font-family: sans-serif; }\\n`);\r\n \r\n writeFile(path.join(dir, 'app', 'layout.tsx'), `import \"./globals.css\";\r\n\r\nexport const metadata = {\r\n title: \"${name}\",\r\n description: \"Built with Velix v5\",\r\n};\r\n\r\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\r\n return (\r\n <html lang=\"en\">\r\n <body className=\"${useTailwind ? 'bg-velix-deep text-slate-100' : 'bg-slate-900 text-white'} min-h-screen font-sans antialiased\">{children}</body>\r\n </html>\r\n );\r\n}\r\n`);\r\n\r\n // app/page.tsx\r\n if (template === 'minimal') {\r\n writeFile(path.join(dir, 'app', 'page.tsx'), `export const metadata = {\\n title: \"${name}\",\\n};\\n\\nexport default function MinimalPage() {\\n return (\\n <main className=\"min-h-screen flex flex-col items-center justify-center bg-[#0F172A] text-slate-100 font-sans\">\\n <h1 className=\"text-4xl font-bold tracking-tight text-white mb-2\">Velix</h1>\\n <p className=\"text-slate-400\">Minimal starter.</p>\\n </main>\\n );\\n}\\n`);\r\n } else {\r\n // Generate components\r\n fs.mkdirSync(path.join(dir, 'components', 'ui'), { recursive: true });\r\n \r\n // Default Button Component\r\n let buttonCode = `import React from 'react';\\n\\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\\n variant?: 'primary' | 'secondary';\\n}\\n\\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\\n ({ className = '', variant = 'primary', ...props }, ref) => {\\n const base = \"inline-flex flex-row gap-2 items-center justify-center font-medium transition-all duration-300 h-12 rounded-xl px-8 focus:outline-none focus:ring-2 focus:ring-velix-cyan/50\";\\n const variants = {\\n primary: \"bg-gradient-to-r from-velix-accent to-velix-cyan text-white shadow-[0_0_20px_rgba(34,211,238,0.25)] hover:shadow-[0_0_30px_rgba(34,211,238,0.45)]\",\\n secondary: \"bg-white/5 text-slate-200 border border-white/10 hover:bg-white/10 hover:border-velix-cyan/30\"\\n };\\n return <button ref={ref} className={\\`\\${base} \\${variants[variant]} \\${className}\\`} {...props} />;\\n }\\n);\\nButton.displayName = \"Button\";\\n`;\r\n \r\n // Overwrite with Shadcn baseline if chosen\r\n if (useShadcn) {\r\n fs.mkdirSync(path.join(dir, 'lib'), { recursive: true });\r\n writeFile(path.join(dir, 'lib', 'utils.ts'), `import { clsx, type ClassValue } from \"clsx\";\\nimport { twMerge } from \"tailwind-merge\";\\n\\nexport function cn(...inputs: ClassValue[]) {\\n return twMerge(clsx(inputs));\\n}\\n`);\r\n buttonCode = `import * as React from \"react\";\\nimport { cn } from \"../../lib/utils\";\\n\\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\\n variant?: 'primary' | 'secondary';\\n}\\n\\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\\n ({ className, variant = 'primary', ...props }, ref) => {\\n const classes = cn(\\n \"inline-flex flex-row gap-2 items-center justify-center font-medium transition-all duration-300 h-12 rounded-xl px-8 focus:outline-none focus:ring-2 focus:ring-velix-cyan/50\",\\n variant === 'primary' ? \"bg-gradient-to-r from-velix-accent to-velix-cyan text-white shadow-[0_0_20px_rgba(34,211,238,0.25)] hover:shadow-[0_0_30px_rgba(34,211,238,0.45)]\" : \"bg-white/5 text-slate-200 border border-white/10 hover:bg-white/10 hover:border-velix-cyan/30\",\\n className\\n );\\n return <button className={classes} ref={ref} {...props} />;\\n }\\n);\\nButton.displayName = \"Button\";\\n`;\r\n }\r\n writeFile(path.join(dir, 'components', 'ui', 'button.tsx'), buttonCode);\r\n\r\n // Default Card Component\r\n const cardClasses = \"group relative p-8 bg-velix-dark/60 border border-white/5 rounded-2xl hover:border-velix-cyan/20 transition-colors duration-300 overflow-hidden\";\r\n const cardGradient = \"absolute inset-0 bg-gradient-to-br from-velix-accent/0 to-velix-cyan/0 group-hover:from-velix-accent/5 group-hover:to-velix-cyan/5 transition-all duration-500\";\r\n let cardCode: string;\r\n if (useShadcn) {\r\n cardCode = [\r\n 'import React from \"react\";',\r\n 'import { cn } from \"../../lib/utils\";',\r\n '',\r\n \"export function Card({ title, description, className = '' }: { title: string; description: string; className?: string }) {\",\r\n ' return (',\r\n ' <div className={cn(\"' + cardClasses + '\", className)}>',\r\n ' <div className=\"' + cardGradient + '\"></div>',\r\n ' <h3 className=\"text-xl font-semibold text-slate-100 mb-3 relative z-10\">{title}</h3>',\r\n ' <p className=\"text-sm text-slate-400 leading-relaxed relative z-10\">{description}</p>',\r\n ' </div>',\r\n ' );',\r\n '}',\r\n '',\r\n ].join('\\n');\r\n } else {\r\n cardCode = [\r\n 'import React from \"react\";',\r\n '',\r\n \"export function Card({ title, description, className = '' }: { title: string; description: string; className?: string }) {\",\r\n ' return (',\r\n ' <div className={\"' + cardClasses + ' \" + className}>',\r\n ' <div className=\"' + cardGradient + '\"></div>',\r\n ' <h3 className=\"text-xl font-semibold text-slate-100 mb-3 relative z-10\">{title}</h3>',\r\n ' <p className=\"text-sm text-slate-400 leading-relaxed relative z-10\">{description}</p>',\r\n ' </div>',\r\n ' );',\r\n '}',\r\n '',\r\n ].join('\\n');\r\n }\r\n writeFile(path.join(dir, 'components', 'ui', 'card.tsx'), cardCode);\r\n\r\n // Default Layout logic\r\n writeFile(path.join(dir, 'app', 'page.tsx'), `import { Button } from \"../components/ui/button\";\r\nimport { Card } from \"../components/ui/card\";\r\n\r\nexport const metadata = {\r\n title: \"Welcome to Velix\",\r\n description: \"Build fast. Ship faster.\",\r\n};\r\n\r\nexport default function HomePage() {\r\n return (\r\n <main className=\"min-h-screen flex flex-col items-center justify-center p-8 bg-gradient-to-b from-[#0B1628] via-velix-dark to-velix-deep text-slate-100 font-sans relative overflow-hidden\">\r\n {/* Background glow effects */}\r\n <div className=\"absolute top-1/4 left-1/3 w-[500px] h-[500px] bg-velix-accent/15 rounded-full blur-[140px] pointer-events-none\"></div>\r\n <div className=\"absolute bottom-1/4 right-1/4 w-[400px] h-[400px] bg-velix-cyan/10 rounded-full blur-[120px] pointer-events-none\"></div>\r\n\r\n <div className=\"z-10 flex flex-col items-center max-w-5xl w-full text-center mt-12 mb-auto\">\r\n <div className=\"mb-10 w-24 h-24 bg-gradient-to-br from-velix-accent to-velix-cyan rounded-2xl shadow-[0_0_50px_rgba(34,211,238,0.3)] flex items-center justify-center relative group\">\r\n <div className=\"absolute inset-0 bg-velix-cyan/20 rounded-2xl blur-xl group-hover:blur-2xl transition-all duration-500\"></div>\r\n <span className=\"text-5xl font-black text-white relative z-10 tracking-tighter\">V</span>\r\n </div>\r\n\r\n <h1 className=\"text-5xl md:text-7xl font-extrabold mb-6 tracking-tight\">\r\n <span className=\"bg-clip-text text-transparent bg-gradient-to-r from-white to-slate-400\">Welcome to</span>{\" \"}\r\n <span className=\"bg-clip-text text-transparent bg-gradient-to-r from-velix-cyan via-velix-glow to-velix-accent\">Velix</span>\r\n </h1>\r\n\r\n <p className=\"text-xl md:text-2xl text-slate-400 mb-12 tracking-wide font-light\">\r\n Build fast. Ship faster.\r\n </p>\r\n\r\n <div className=\"flex flex-col sm:flex-row gap-5 mb-24 w-full sm:w-auto\">\r\n <a href=\"https://github.com/Velixteam/velix\" target=\"_blank\" rel=\"noreferrer\" className=\"w-full sm:w-auto\">\r\n <Button variant=\"primary\" className=\"w-full\">\r\n Get Started\r\n </Button>\r\n </a>\r\n <a href=\"https://teamvelix.vercel.app\" target=\"_blank\" rel=\"noreferrer\" className=\"w-full sm:w-auto\">\r\n <Button variant=\"secondary\" className=\"w-full\">\r\n Documentation\r\n </Button>\r\n </a>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 w-full text-left\">\r\n <Card title=\"Routing\" description=\"File-system based routing that feels instantly familiar and snappy.\" />\r\n <Card title=\"Actions\" description=\"Type-safe server actions mapped seamlessly directly to your client.\" />\r\n <Card title=\"Plugins\" description=\"Extend the framework capabilities with a simple yet powerful API.\" />\r\n <Card title=\"Deployment\" description=\"Deploy to any cloud provider or serverless edge with zero config.\" />\r\n </div>\r\n </div>\r\n\r\n <div className=\"mt-16 pb-8 text-slate-600 text-sm tracking-widest uppercase font-mono\">\r\n Velix &copy; ${new Date().getFullYear()}\r\n </div>\r\n </main>\r\n );\r\n}\r\n`);\r\n }\r\n\r\n if (template !== 'minimal') {\r\n // server/api/hello.ts\r\n fs.mkdirSync(path.join(dir, 'server', 'api'), { recursive: true });\r\n writeFile(path.join(dir, 'server', 'api', 'hello.ts'), `export function GET() {\r\n return Response.json({ message: \"Hello from Velix API!\" });\r\n}\r\n\r\nexport function POST(request: any) {\r\n return Response.json({ received: true });\r\n}\r\n`);\r\n\r\n // public directory\r\n fs.mkdirSync(path.join(dir, 'public'), { recursive: true });\r\n }\r\n\r\n // Copy favicon\r\n const logoSrc = path.join(__dirname, '..', 'assets', 'logo.webp');\r\n if (fs.existsSync(logoSrc)) {\r\n fs.mkdirSync(path.join(dir, 'public'), { recursive: true });\r\n fs.copyFileSync(logoSrc, path.join(dir, 'public', 'favicon.webp'));\r\n }\r\n}\r\n\r\nasync function startDev() {\r\n showBanner();\r\n log.info('Starting development server...');\r\n\r\n const { spawn } = await import('child_process');\r\n const child = spawn('npx', ['tsx', '--no-cache', 'node_modules/@teamvelix/velix/dist/runtime/start-dev.js'], {\r\n stdio: 'inherit', cwd: process.cwd(), shell: true,\r\n });\r\n\r\n child.on('error', () => {\r\n // Fallback: try running from packages\r\n const devScript = path.join(process.cwd(), 'packages', 'velix', 'runtime', 'start-dev.ts');\r\n if (fs.existsSync(devScript)) {\r\n spawn('npx', ['tsx', devScript], { stdio: 'inherit', cwd: process.cwd(), shell: true });\r\n } else {\r\n log.error('Could not find Velix runtime. Run `npm install` first.');\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function buildProject() {\r\n showBanner();\r\n log.info('Building for production...');\r\n\r\n const { spawn } = await import('child_process');\r\n const child = spawn('npx', ['tsx', 'node_modules/@teamvelix/velix/dist/runtime/start-build.js'], {\r\n stdio: 'inherit', cwd: process.cwd(), shell: true,\r\n });\r\n\r\n child.on('error', () => {\r\n const buildScript = path.join(process.cwd(), 'packages', 'velix', 'runtime', 'start-build.ts');\r\n if (fs.existsSync(buildScript)) {\r\n spawn('npx', ['tsx', buildScript], { stdio: 'inherit', cwd: process.cwd(), shell: true });\r\n } else {\r\n log.error('Could not find Velix runtime. Run `npm install` first.');\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function startProd() {\r\n showBanner();\r\n log.info('Starting production server...');\r\n\r\n const { spawn } = await import('child_process');\r\n const child = spawn('npx', ['tsx', 'node_modules/@teamvelix/velix/dist/runtime/start-prod.js'], {\r\n stdio: 'inherit', cwd: process.cwd(), shell: true,\r\n });\r\n\r\n child.on('error', () => {\r\n log.error('Could not start production server.');\r\n process.exit(1);\r\n });\r\n}\r\n\r\nasync function doctor() {\r\n showBanner();\r\n console.log(` ${pc.bold('Velix Doctor')}`);\r\n log.blank();\r\n\r\n const checks = [\r\n { name: 'Node.js version', check: () => { const v = parseInt(process.version.slice(1)); return v >= 18 ? '✔' : '✖'; }, info: process.version },\r\n { name: 'velix.config.ts', check: () => fs.existsSync('velix.config.ts') || fs.existsSync('velix.config.js') ? '✔' : '✖', info: '' },\r\n { name: 'app/ directory', check: () => fs.existsSync('app') ? '✔' : '✖', info: '' },\r\n { name: 'package.json', check: () => fs.existsSync('package.json') ? '✔' : '✖', info: '' },\r\n { name: 'tsconfig.json', check: () => fs.existsSync('tsconfig.json') ? '✔' : '✖', info: '' },\r\n { name: 'node_modules', check: () => fs.existsSync('node_modules') ? '✔' : '⚠ Run npm install', info: '' },\r\n ];\r\n\r\n for (const { name, check, info } of checks) {\r\n const result = check();\r\n const icon = result === '✔' ? pc.green('✔') : result.startsWith('✖') ? pc.red('✖') : pc.yellow('⚠');\r\n const infoStr = info ? ` ${pc.dim(info)}` : (result.length > 1 ? ` ${pc.yellow(result.slice(2))}` : '');\r\n console.log(` ${icon} ${name}${infoStr}`);\r\n }\r\n\r\n log.blank();\r\n}\r\n\r\nasync function info() {\r\n showBanner();\r\n console.log(` ${pc.bold('Environment:')}`);\r\n console.log(` Velix: ${pc.cyan(`v${VERSION}`)}`);\r\n console.log(` Node: ${pc.dim(process.version)}`);\r\n console.log(` Platform: ${pc.dim(process.platform)}`);\r\n console.log(` Arch: ${pc.dim(process.arch)}`);\r\n console.log(` CWD: ${pc.dim(process.cwd())}`);\r\n log.blank();\r\n}\r\n\r\n// ============================================================================\r\n// Generator\r\n// ============================================================================\r\n\r\nasync function generate(type?: string, name?: string) {\r\n const validTypes = ['page', 'layout', 'component', 'hook', 'api', 'action', 'middleware', 'context', 'loading', 'error', 'not-found'];\r\n\r\n if (!type) {\r\n const { type: selectedType } = await prompts({\r\n type: 'select',\r\n name: 'type',\r\n message: 'What do you want to generate?',\r\n choices: validTypes.map(t => ({ title: t, value: t })),\r\n });\r\n type = selectedType;\r\n if (!type) process.exit(0);\r\n }\r\n\r\n if (!validTypes.includes(type)) {\r\n log.error(`Invalid type: ${type}. Valid: ${validTypes.join(', ')}`);\r\n process.exit(1);\r\n }\r\n\r\n if (!name && !['loading', 'error', 'not-found'].includes(type)) {\r\n const { name: inputName } = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: `${type} name:`,\r\n });\r\n name = inputName;\r\n if (!name) process.exit(0);\r\n }\r\n\r\n const templates: Record<string, (n: string) => { path: string; content: string }> = {\r\n page: (n) => ({\r\n path: `app/${n}/page.tsx`,\r\n content: `export const metadata = {\\n title: \"${capitalize(n)}\",\\n};\\n\\nexport default function ${pascalCase(n)}Page() {\\n return (\\n <main>\\n <h1>${capitalize(n)}</h1>\\n </main>\\n );\\n}\\n`\r\n }),\r\n layout: (n) => ({\r\n path: `app/${n}/layout.tsx`,\r\n content: `export default function ${pascalCase(n)}Layout({ children }: { children: React.ReactNode }) {\\n return <div>{children}</div>;\\n}\\n`\r\n }),\r\n component: (n) => ({\r\n path: `components/${pascalCase(n)}.tsx`,\r\n content: `interface ${pascalCase(n)}Props {\\n // props\\n}\\n\\nexport default function ${pascalCase(n)}({}: ${pascalCase(n)}Props) {\\n return <div>${pascalCase(n)}</div>;\\n}\\n`\r\n }),\r\n hook: (n) => ({\r\n path: `hooks/use${pascalCase(n)}.ts`,\r\n content: `import { useState } from 'react';\\n\\nexport function use${pascalCase(n)}() {\\n const [state, setState] = useState(null);\\n return { state, setState };\\n}\\n`\r\n }),\r\n api: (n) => ({\r\n path: `server/api/${n}.ts`,\r\n content: `export function GET(request: any) {\\n return Response.json({ message: \"Hello from ${n}\" });\\n}\\n\\nexport function POST(request: any) {\\n return Response.json({ received: true });\\n}\\n`\r\n }),\r\n action: (n) => ({\r\n path: `server/actions/${n}.ts`,\r\n content: `'use server';\\n\\nexport async function ${camelCase(n)}Action(prevState: any, formData: FormData) {\\n // Server action logic\\n return { success: true };\\n}\\n`\r\n }),\r\n middleware: (n) => ({\r\n path: `middleware/${n}.ts`,\r\n content: `export default async function ${camelCase(n)}Middleware(req: any, res: any, next: () => Promise<void>) {\\n // Middleware logic\\n await next();\\n}\\n`\r\n }),\r\n context: (n) => ({\r\n path: `contexts/${pascalCase(n)}Context.tsx`,\r\n content: `'use client';\\nimport { createContext, useContext, useState, type ReactNode } from 'react';\\n\\ninterface ${pascalCase(n)}ContextType {\\n // context values\\n}\\n\\nconst ${pascalCase(n)}Context = createContext<${pascalCase(n)}ContextType | null>(null);\\n\\nexport function ${pascalCase(n)}Provider({ children }: { children: ReactNode }) {\\n return <${pascalCase(n)}Context.Provider value={{}}>{children}</${pascalCase(n)}Context.Provider>;\\n}\\n\\nexport function use${pascalCase(n)}() {\\n const ctx = useContext(${pascalCase(n)}Context);\\n if (!ctx) throw new Error('use${pascalCase(n)} must be used within ${pascalCase(n)}Provider');\\n return ctx;\\n}\\n`\r\n }),\r\n loading: () => ({\r\n path: `app/loading.tsx`,\r\n content: `export default function Loading() {\\n return <div>Loading...</div>;\\n}\\n`\r\n }),\r\n error: () => ({\r\n path: `app/error.tsx`,\r\n content: `'use client';\\n\\nexport default function Error({ error, reset }: { error: Error; reset: () => void }) {\\n return (\\n <div>\\n <h2>Something went wrong!</h2>\\n <p>{error.message}</p>\\n <button onClick={reset}>Try again</button>\\n </div>\\n );\\n}\\n`\r\n }),\r\n 'not-found': () => ({\r\n path: `app/not-found.tsx`,\r\n content: `export default function NotFound() {\\n return (\\n <div>\\n <h1>404 - Not Found</h1>\\n <p>The page you're looking for doesn't exist.</p>\\n </div>\\n );\\n}\\n`\r\n }),\r\n };\r\n\r\n const generator = templates[type!];\r\n if (!generator) { log.error(`No template for type: ${type}`); process.exit(1); }\r\n\r\n const { path: filePath, content } = generator(name || '');\r\n const fullPath = path.resolve(process.cwd(), filePath);\r\n\r\n if (fs.existsSync(fullPath)) {\r\n log.warn(`File already exists: ${filePath}`);\r\n const { overwrite } = await prompts({\r\n type: 'confirm', name: 'overwrite', message: 'Overwrite?', initial: false,\r\n });\r\n if (!overwrite) process.exit(0);\r\n }\r\n\r\n fs.mkdirSync(path.dirname(fullPath), { recursive: true });\r\n fs.writeFileSync(fullPath, content);\r\n log.success(`Created ${pc.cyan(filePath)}`);\r\n}\r\n\r\n// ============================================================================\r\n// Helpers\r\n// ============================================================================\r\n\r\nfunction writeFile(filePath: string, content: string) {\r\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\r\n fs.writeFileSync(filePath, content);\r\n}\r\n\r\nfunction capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\nfunction pascalCase(str: string): string {\r\n return str.split(/[-_\\/]/).map(s => capitalize(s)).join('');\r\n}\r\n\r\nfunction camelCase(str: string): string {\r\n const pascal = pascalCase(str);\r\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\r\n}\r\n\r\nasync function handleUiCommand(args: string[]) {\r\n const [subCommand, componentName] = args;\r\n if (subCommand !== 'add' || !componentName) {\r\n log.error('Usage: velix ui add <component>');\r\n return;\r\n }\r\n\r\n const cwd = process.cwd();\r\n const uiDir = path.join(cwd, 'components', 'ui');\r\n const utilsDir = path.join(cwd, 'lib');\r\n\r\n if (componentName === 'button') {\r\n // Ensure utils.ts exists\r\n if (!fs.existsSync(utilsDir)) fs.mkdirSync(utilsDir, { recursive: true });\r\n const utilsPath = path.join(utilsDir, 'utils.ts');\r\n if (!fs.existsSync(utilsPath)) {\r\n writeFile(utilsPath, `import { clsx, type ClassValue } from \"clsx\";\\nimport { twMerge } from \"tailwind-merge\";\\n\\nexport function cn(...inputs: ClassValue[]) {\\n return twMerge(clsx(inputs));\\n}\\n`);\r\n log.info('Created lib/utils.ts (please run in project: npm i clsx tailwind-merge)');\r\n }\r\n\r\n // Ensure ui dir exists\r\n if (!fs.existsSync(uiDir)) fs.mkdirSync(uiDir, { recursive: true });\r\n const buttonPath = path.join(uiDir, 'button.tsx');\r\n if (fs.existsSync(buttonPath)) {\r\n log.warn('Button component already exists.');\r\n return;\r\n }\r\n\r\n writeFile(buttonPath, `import * as React from \"react\";\\nimport { cn } from \"../../lib/utils\";\\n\\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\\n size?: 'default' | 'sm' | 'lg' | 'icon';\\n}\\n\\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\\n ({ className, variant = 'default', size = 'default', ...props }, ref) => {\\n const variants: Record<string, string> = {\\n default: 'bg-slate-900 text-slate-50 hover:bg-slate-900/90',\\n destructive: 'bg-red-500 text-slate-50 hover:bg-red-500/90',\\n outline: 'border border-slate-200 bg-white hover:bg-slate-100 hover:text-slate-900',\\n secondary: 'bg-slate-100 text-slate-900 hover:bg-slate-100/80',\\n ghost: 'hover:bg-slate-100 hover:text-slate-900',\\n link: 'text-slate-900 underline-offset-4 hover:underline',\\n };\\n const sizes: Record<string, string> = {\\n default: 'h-10 px-4 py-2',\\n sm: 'h-9 rounded-md px-3',\\n lg: 'h-11 rounded-md px-8',\\n icon: 'h-10 w-10',\\n };\\n const classes = cn(\\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\\n variants[variant],\\n sizes[size],\\n className\\n );\\n return <button className={classes} ref={ref} {...props} />;\\n }\\n);\\nButton.displayName = \"Button\";\\n`);\r\n log.success('Installed component: Button (components/ui/button.tsx)');\r\n } else {\r\n log.error(`Component \"${componentName}\" is not available yet in the mock registry.`);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Run\r\n// ============================================================================\r\n\r\nmain().catch(err => {\r\n log.error(err.message);\r\n process.exit(1);\r\n});\r\n"],"mappings":";;;AAgBA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,OAAO,aAAa;AAEpB,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,KAAK,QAAQ,UAAU;AAEzC,IAAM,UAAU;AAMhB,IAAM,MAAM;AAAA,EACV,MAAM,CAAC,QAAgB,QAAQ,IAAI,KAAK,GAAG,KAAK,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAC7D,SAAS,CAAC,QAAgB,QAAQ,IAAI,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EACjE,MAAM,CAAC,QAAgB,QAAQ,IAAI,KAAK,GAAG,OAAO,QAAG,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,EAAE;AAAA,EAC1E,OAAO,CAAC,QAAgB,QAAQ,IAAI,KAAK,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,EACrE,OAAO,MAAM,QAAQ,IAAI,EAAE;AAC7B;AAMA,SAAS,aAAa;AACpB,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,KAAK,GAAG,KAAK,QAAG,CAAC,IAAI,GAAG,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,EAAE;AAC5E,UAAQ,IAAI,KAAK,GAAG,IAAI,sRAAgD,CAAC,EAAE;AAC3E,UAAQ,IAAI,EAAE;AAChB;AAMA,SAAS,WAAW;AAClB,aAAW;AACX,UAAQ,IAAI,KAAK,GAAG,KAAK,QAAQ,CAAC,4BAA4B;AAC9D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,KAAK,GAAG,KAAK,WAAW,CAAC,EAAE;AACvC,UAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,6CAA6C;AACjF,UAAQ,IAAI,OAAO,GAAG,KAAK,KAAK,CAAC,8CAA8C;AAC/E,UAAQ,IAAI,OAAO,GAAG,KAAK,OAAO,CAAC,wCAAwC;AAC3E,UAAQ,IAAI,OAAO,GAAG,KAAK,OAAO,CAAC,2CAA2C;AAC9E,UAAQ,IAAI,OAAO,GAAG,KAAK,GAAG,CAAC,uDAAuD;AACtF,UAAQ,IAAI,OAAO,GAAG,KAAK,IAAI,CAAC,uDAAuD;AACvF,UAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,6CAA6C;AACjF,UAAQ,IAAI,OAAO,GAAG,KAAK,MAAM,CAAC,iDAAiD;AACnF,UAAQ,IAAI,OAAO,GAAG,KAAK,SAAS,CAAC,iCAAiC;AACtE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,KAAK,GAAG,KAAK,iBAAiB,CAAC,EAAE;AAC7C,UAAQ,IAAI,gGAAgG;AAC5G,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,KAAK,GAAG,KAAK,WAAW,CAAC,EAAE;AACvC,UAAQ,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,sBAAsB;AACpD,UAAQ,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY;AAC1C,UAAQ,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,yBAAyB;AACvD,UAAQ,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,oBAAoB;AAClD,UAAQ,IAAI,EAAE;AAChB;AAMA,eAAe,OAAO;AACpB,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,UAAU,KAAK,CAAC;AAEtB,MAAI,CAAC,WAAW,YAAY,YAAY,YAAY,MAAM;AACxD,aAAS;AACT;AAAA,EACF;AAEA,MAAI,YAAY,eAAe,YAAY,MAAM;AAC/C,YAAQ,IAAI,UAAU,OAAO,EAAE;AAC/B;AAAA,EACF;AAEA,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,YAAM,cAAc,KAAK,CAAC,CAAC;AAC3B;AAAA,IAEF,KAAK;AACH,YAAM,SAAS;AACf;AAAA,IAEF,KAAK;AACH,YAAM,aAAa;AACnB;AAAA,IAEF,KAAK;AACH,YAAM,UAAU;AAChB;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AACH,YAAM,SAAS,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAC/B;AAAA,IAEF,KAAK;AACH,YAAM,OAAO;AACb;AAAA,IAEF,KAAK;AACH,YAAM,KAAK;AACX;AAAA,IAEF,KAAK;AACH,UAAI,KAAK,gCAAgC;AACzC;AAAA,IAEF,KAAK;AACH,YAAM,gBAAgB,KAAK,MAAM,CAAC,CAAC;AACnC;AAAA,IAEF;AACE,UAAI,MAAM,oBAAoB,OAAO,EAAE;AACvC,eAAS;AACT,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAMA,eAAe,cAAc,MAAe;AAC1C,aAAW;AAEX,MAAI,CAAC,MAAM;AACT,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,WAAO,SAAS;AAChB,QAAI,CAAC,MAAM;AAAE,UAAI,MAAM,0BAA0B;AAAG,cAAQ,KAAK,CAAC;AAAA,IAAG;AAAA,EACvE;AAEA,QAAM,aAAa,KAAK,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAEnD,MAAI,GAAG,WAAW,UAAU,GAAG;AAC7B,QAAI,MAAM,aAAa,IAAI,iBAAiB;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGE,QAAM,QAAQ,QAAQ,KAAK,MAAM,CAAC;AAClC,QAAM,eAAe,MAAM,KAAK,OAAK,EAAE,WAAW,aAAa,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;AAC/E,QAAM,eAAe,MAAM,SAAS,YAAY;AAChD,QAAM,iBAAiB,MAAM,SAAS,eAAe;AAErD,MAAI,WAAW;AACf,MAAI,cAAmC,eAAe,OAAQ,iBAAiB,QAAQ;AAEvF,MAAI,CAAC,UAAU;AACb,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,iDAA4C,OAAO,UAAU;AAAA,QACtE,EAAE,OAAO,kBAAa,OAAO,UAAU;AAAA,MACzC;AAAA,IACF,CAAC;AACD,eAAW,SAAS;AAAA,EACtB;AAEA,MAAI,CAAC,UAAU;AACb,QAAI,MAAM,sBAAsB;AAChC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,gBAAgB,QAAW;AAC7B,UAAM,aAAa,MAAM,QAAQ;AAAA,MAC/B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,kBAAc,WAAW;AAAA,EAC3B;AAEA,MAAI,YAAiC,MAAM,SAAS,UAAU,IAAI,OAAQ,MAAM,SAAS,aAAa,IAAI,QAAQ;AAElH,MAAI,eAAe,cAAc,QAAW;AAC1C,UAAM,aAAa,MAAM,QAAQ;AAAA,MAC/B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,gBAAY,WAAW;AAAA,EACzB;AAEF,QAAM,EAAE,SAAS,IAAI,IAAI,MAAM,OAAO,KAAK;AAC3C,QAAM,UAAU,IAAI,qBAAqB,EAAE,MAAM;AAEjD,MAAI;AACF,OAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAG5C,yBAAqB,YAAY,MAAM,UAAU,aAAa,SAAS;AAEvE,YAAQ,QAAQ,WAAW,GAAG,KAAK,IAAI,CAAC,WAAW;AACnD,QAAI,MAAM;AACV,YAAQ,IAAI,KAAK,GAAG,KAAK,aAAa,CAAC,EAAE;AACzC,YAAQ,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE;AAC3C,YAAQ,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc;AAC5C,YAAQ,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc;AAC5C,QAAI,MAAM;AAAA,EAEZ,SAAS,KAAU;AACjB,YAAQ,KAAK,0BAA0B;AACvC,QAAI,MAAM,IAAI,OAAO;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,qBAAqB,KAAa,MAAc,UAAkB,cAAuB,MAAM,YAAqB,OAAO;AAElI,QAAM,MAAW;AAAA,IACf;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,cAAc;AAAA,MACZ,oBAAoB,IAAI,OAAO;AAAA,MAC/B,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,iBAAiB;AAAA,MACf,kBAAkB,IAAI,OAAO;AAAA,MAC7B,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,aAAa;AACf,QAAI,kBAAkB;AAAA,MACpB,GAAG,IAAI;AAAA,MACP,eAAe;AAAA,MACf,oBAAoB;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,WAAW;AACb,QAAI,eAAe;AAAA,MACjB,GAAG,IAAI;AAAA,MACP,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,YAAU,KAAK,KAAK,KAAK,cAAc,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAGtE,YAAU,KAAK,KAAK,KAAK,iBAAiB,GAAG,wBAAwB,cAAc,qBAAqB,EAAE;AAAA;AAAA;AAAA;AAAA,aAI/F,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYb,cAAc;AAAA;AAAA,QAA2C,cAAc;AAAA;AAAA,CAE1E;AAGC,YAAU,KAAK,KAAK,KAAK,eAAe,GAAG,KAAK,UAAU;AAAA,IACxD,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,kCAAkC;AAAA,IACpC;AAAA,IACA,SAAS,CAAC,eAAe,gBAAgB,gBAAgB;AAAA,IACzD,SAAS,CAAC,gBAAgB,QAAQ;AAAA,EACpC,GAAG,MAAM,CAAC,CAAC;AAEX,MAAI,aAAa;AAEf,cAAU,KAAK,KAAK,KAAK,oBAAoB,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAmR;AAAA,EACrU;AAGA,KAAG,UAAU,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,YAAU,KAAK,KAAK,KAAK,OAAO,aAAa,GAAG,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAA8M;AAAA,CAAgD;AAE5T,YAAU,KAAK,KAAK,KAAK,OAAO,YAAY,GAAG;AAAA;AAAA;AAAA,YAGrC,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOS,cAAc,iCAAiC,yBAAyB;AAAA;AAAA;AAAA;AAAA,CAIhG;AAGC,MAAI,aAAa,WAAW;AAC1B,cAAU,KAAK,KAAK,KAAK,OAAO,UAAU,GAAG;AAAA,YAAwC,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAA0V;AAAA,EACrb,OAAO;AAEL,OAAG,UAAU,KAAK,KAAK,KAAK,cAAc,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAGpE,QAAI,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGjB,QAAI,WAAW;AACb,SAAG,UAAU,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,gBAAU,KAAK,KAAK,KAAK,OAAO,UAAU,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAiL;AAC9N,mBAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IACf;AACA,cAAU,KAAK,KAAK,KAAK,cAAc,MAAM,YAAY,GAAG,UAAU;AAGtE,UAAM,cAAc;AACpB,UAAM,eAAe;AACrB,QAAI;AACJ,QAAI,WAAW;AACb,iBAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,6BAA6B,cAAc;AAAA,QAC3C,2BAA2B,eAAe;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb,OAAO;AACL,iBAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,0BAA0B,cAAc;AAAA,QACxC,2BAA2B,eAAe;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,cAAU,KAAK,KAAK,KAAK,cAAc,MAAM,UAAU,GAAG,QAAQ;AAGlE,cAAU,KAAK,KAAK,KAAK,OAAO,UAAU,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAoD1B,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,CAK9C;AAAA,EACC;AAEA,MAAI,aAAa,WAAW;AAE1B,OAAG,UAAU,KAAK,KAAK,KAAK,UAAU,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AACjE,cAAU,KAAK,KAAK,KAAK,UAAU,OAAO,UAAU,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAO1D;AAGG,OAAG,UAAU,KAAK,KAAK,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5D;AAGA,QAAM,UAAU,KAAK,KAAK,WAAW,MAAM,UAAU,WAAW;AAChE,MAAI,GAAG,WAAW,OAAO,GAAG;AAC1B,OAAG,UAAU,KAAK,KAAK,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,OAAG,aAAa,SAAS,KAAK,KAAK,KAAK,UAAU,cAAc,CAAC;AAAA,EACnE;AACF;AAEA,eAAe,WAAW;AACxB,aAAW;AACX,MAAI,KAAK,gCAAgC;AAEzC,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,eAAe;AAC9C,QAAM,QAAQ,MAAM,OAAO,CAAC,OAAO,cAAc,yDAAyD,GAAG;AAAA,IAC3G,OAAO;AAAA,IAAW,KAAK,QAAQ,IAAI;AAAA,IAAG,OAAO;AAAA,EAC/C,CAAC;AAED,QAAM,GAAG,SAAS,MAAM;AAEtB,UAAM,YAAY,KAAK,KAAK,QAAQ,IAAI,GAAG,YAAY,SAAS,WAAW,cAAc;AACzF,QAAI,GAAG,WAAW,SAAS,GAAG;AAC5B,YAAM,OAAO,CAAC,OAAO,SAAS,GAAG,EAAE,OAAO,WAAW,KAAK,QAAQ,IAAI,GAAG,OAAO,KAAK,CAAC;AAAA,IACxF,OAAO;AACL,UAAI,MAAM,wDAAwD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,eAAe;AAC5B,aAAW;AACX,MAAI,KAAK,4BAA4B;AAErC,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,eAAe;AAC9C,QAAM,QAAQ,MAAM,OAAO,CAAC,OAAO,2DAA2D,GAAG;AAAA,IAC/F,OAAO;AAAA,IAAW,KAAK,QAAQ,IAAI;AAAA,IAAG,OAAO;AAAA,EAC/C,CAAC;AAED,QAAM,GAAG,SAAS,MAAM;AACtB,UAAM,cAAc,KAAK,KAAK,QAAQ,IAAI,GAAG,YAAY,SAAS,WAAW,gBAAgB;AAC7F,QAAI,GAAG,WAAW,WAAW,GAAG;AAC9B,YAAM,OAAO,CAAC,OAAO,WAAW,GAAG,EAAE,OAAO,WAAW,KAAK,QAAQ,IAAI,GAAG,OAAO,KAAK,CAAC;AAAA,IAC1F,OAAO;AACL,UAAI,MAAM,wDAAwD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,YAAY;AACzB,aAAW;AACX,MAAI,KAAK,+BAA+B;AAExC,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,eAAe;AAC9C,QAAM,QAAQ,MAAM,OAAO,CAAC,OAAO,0DAA0D,GAAG;AAAA,IAC9F,OAAO;AAAA,IAAW,KAAK,QAAQ,IAAI;AAAA,IAAG,OAAO;AAAA,EAC/C,CAAC;AAED,QAAM,GAAG,SAAS,MAAM;AACtB,QAAI,MAAM,oCAAoC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;AAEA,eAAe,SAAS;AACtB,aAAW;AACX,UAAQ,IAAI,KAAK,GAAG,KAAK,cAAc,CAAC,EAAE;AAC1C,MAAI,MAAM;AAEV,QAAM,SAAS;AAAA,IACb,EAAE,MAAM,mBAAmB,OAAO,MAAM;AAAE,YAAM,IAAI,SAAS,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAAG,aAAO,KAAK,KAAK,WAAM;AAAA,IAAK,GAAG,MAAM,QAAQ,QAAQ;AAAA,IAC7I,EAAE,MAAM,mBAAmB,OAAO,MAAM,GAAG,WAAW,iBAAiB,KAAK,GAAG,WAAW,iBAAiB,IAAI,WAAM,UAAK,MAAM,GAAG;AAAA,IACnI,EAAE,MAAM,kBAAkB,OAAO,MAAM,GAAG,WAAW,KAAK,IAAI,WAAM,UAAK,MAAM,GAAG;AAAA,IAClF,EAAE,MAAM,gBAAgB,OAAO,MAAM,GAAG,WAAW,cAAc,IAAI,WAAM,UAAK,MAAM,GAAG;AAAA,IACzF,EAAE,MAAM,iBAAiB,OAAO,MAAM,GAAG,WAAW,eAAe,IAAI,WAAM,UAAK,MAAM,GAAG;AAAA,IAC3F,EAAE,MAAM,gBAAgB,OAAO,MAAM,GAAG,WAAW,cAAc,IAAI,WAAM,0BAAqB,MAAM,GAAG;AAAA,EAC3G;AAEA,aAAW,EAAE,MAAM,OAAO,MAAAA,MAAK,KAAK,QAAQ;AAC1C,UAAM,SAAS,MAAM;AACrB,UAAM,OAAO,WAAW,WAAM,GAAG,MAAM,QAAG,IAAI,OAAO,WAAW,QAAG,IAAI,GAAG,IAAI,QAAG,IAAI,GAAG,OAAO,QAAG;AAClG,UAAM,UAAUA,QAAO,IAAI,GAAG,IAAIA,KAAI,CAAC,KAAM,OAAO,SAAS,IAAI,IAAI,GAAG,OAAO,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK;AACpG,YAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,OAAO,EAAE;AAAA,EAC3C;AAEA,MAAI,MAAM;AACZ;AAEA,eAAe,OAAO;AACpB,aAAW;AACX,UAAQ,IAAI,KAAK,GAAG,KAAK,cAAc,CAAC,EAAE;AAC1C,UAAQ,IAAI,kBAAkB,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC,EAAE;AACtD,UAAQ,IAAI,kBAAkB,GAAG,IAAI,QAAQ,OAAO,CAAC,EAAE;AACvD,UAAQ,IAAI,kBAAkB,GAAG,IAAI,QAAQ,QAAQ,CAAC,EAAE;AACxD,UAAQ,IAAI,kBAAkB,GAAG,IAAI,QAAQ,IAAI,CAAC,EAAE;AACpD,UAAQ,IAAI,kBAAkB,GAAG,IAAI,QAAQ,IAAI,CAAC,CAAC,EAAE;AACrD,MAAI,MAAM;AACZ;AAMA,eAAe,SAAS,MAAe,MAAe;AACpD,QAAM,aAAa,CAAC,QAAQ,UAAU,aAAa,QAAQ,OAAO,UAAU,cAAc,WAAW,WAAW,SAAS,WAAW;AAEpI,MAAI,CAAC,MAAM;AACT,UAAM,EAAE,MAAM,aAAa,IAAI,MAAM,QAAQ;AAAA,MAC3C,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,WAAW,IAAI,QAAM,EAAE,OAAO,GAAG,OAAO,EAAE,EAAE;AAAA,IACvD,CAAC;AACD,WAAO;AACP,QAAI,CAAC,KAAM,SAAQ,KAAK,CAAC;AAAA,EAC3B;AAEA,MAAI,CAAC,WAAW,SAAS,IAAI,GAAG;AAC9B,QAAI,MAAM,iBAAiB,IAAI,YAAY,WAAW,KAAK,IAAI,CAAC,EAAE;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,SAAS,WAAW,EAAE,SAAS,IAAI,GAAG;AAC9D,UAAM,EAAE,MAAM,UAAU,IAAI,MAAM,QAAQ;AAAA,MACxC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AACD,WAAO;AACP,QAAI,CAAC,KAAM,SAAQ,KAAK,CAAC;AAAA,EAC3B;AAEA,QAAM,YAA8E;AAAA,IAClF,MAAM,CAAC,OAAO;AAAA,MACZ,MAAM,OAAO,CAAC;AAAA,MACd,SAAS;AAAA,YAAwC,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA,0BAAqC,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA,YAA+C,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAC9K;AAAA,IACA,QAAQ,CAAC,OAAO;AAAA,MACd,MAAM,OAAO,CAAC;AAAA,MACd,SAAS,2BAA2B,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,IACnD;AAAA,IACA,WAAW,CAAC,OAAO;AAAA,MACjB,MAAM,cAAc,WAAW,CAAC,CAAC;AAAA,MACjC,SAAS,aAAa,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,0BAAqD,WAAW,CAAC,CAAC,QAAQ,WAAW,CAAC,CAAC;AAAA,gBAA2B,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA,IACpK;AAAA,IACA,MAAM,CAAC,OAAO;AAAA,MACZ,MAAM,YAAY,WAAW,CAAC,CAAC;AAAA,MAC/B,SAAS;AAAA;AAAA,qBAA2D,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IACnF;AAAA,IACA,KAAK,CAAC,OAAO;AAAA,MACX,MAAM,cAAc,CAAC;AAAA,MACrB,SAAS;AAAA,gDAAsF,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAClG;AAAA,IACA,QAAQ,CAAC,OAAO;AAAA,MACd,MAAM,kBAAkB,CAAC;AAAA,MACzB,SAAS;AAAA;AAAA,wBAA0C,UAAU,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IACjE;AAAA,IACA,YAAY,CAAC,OAAO;AAAA,MAClB,MAAM,cAAc,CAAC;AAAA,MACrB,SAAS,iCAAiC,UAAU,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IACxD;AAAA,IACA,SAAS,CAAC,OAAO;AAAA,MACf,MAAM,YAAY,WAAW,CAAC,CAAC;AAAA,MAC/B,SAAS;AAAA;AAAA;AAAA,YAA4G,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,QAAkD,WAAW,CAAC,CAAC,2BAA2B,WAAW,CAAC,CAAC;AAAA;AAAA,kBAAiD,WAAW,CAAC,CAAC;AAAA,YAAgE,WAAW,CAAC,CAAC,2CAA2C,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA,qBAA+C,WAAW,CAAC,CAAC;AAAA,2BAAkC,WAAW,CAAC,CAAC;AAAA,kCAA8C,WAAW,CAAC,CAAC,wBAAwB,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,IACznB;AAAA,IACA,SAAS,OAAO;AAAA,MACd,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;AAAA;AAAA,IACX;AAAA,IACA,OAAO,OAAO;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IACX;AAAA,IACA,aAAa,OAAO;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IACX;AAAA,EACF;AAEA,QAAM,YAAY,UAAU,IAAK;AACjC,MAAI,CAAC,WAAW;AAAE,QAAI,MAAM,yBAAyB,IAAI,EAAE;AAAG,YAAQ,KAAK,CAAC;AAAA,EAAG;AAE/E,QAAM,EAAE,MAAM,UAAU,QAAQ,IAAI,UAAU,QAAQ,EAAE;AACxD,QAAM,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,QAAQ;AAErD,MAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,QAAI,KAAK,wBAAwB,QAAQ,EAAE;AAC3C,UAAM,EAAE,UAAU,IAAI,MAAM,QAAQ;AAAA,MAClC,MAAM;AAAA,MAAW,MAAM;AAAA,MAAa,SAAS;AAAA,MAAc,SAAS;AAAA,IACtE,CAAC;AACD,QAAI,CAAC,UAAW,SAAQ,KAAK,CAAC;AAAA,EAChC;AAEA,KAAG,UAAU,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,KAAG,cAAc,UAAU,OAAO;AAClC,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,CAAC,EAAE;AAC5C;AAMA,SAAS,UAAU,UAAkB,SAAiB;AACpD,KAAG,UAAU,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,KAAG,cAAc,UAAU,OAAO;AACpC;AAEA,SAAS,WAAW,KAAqB;AACvC,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD;AAEA,SAAS,WAAW,KAAqB;AACvC,SAAO,IAAI,MAAM,QAAQ,EAAE,IAAI,OAAK,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE;AAC5D;AAEA,SAAS,UAAU,KAAqB;AACtC,QAAM,SAAS,WAAW,GAAG;AAC7B,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AACxD;AAEA,eAAe,gBAAgB,MAAgB;AAC7C,QAAM,CAAC,YAAY,aAAa,IAAI;AACpC,MAAI,eAAe,SAAS,CAAC,eAAe;AAC1C,QAAI,MAAM,iCAAiC;AAC3C;AAAA,EACF;AAEA,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,QAAQ,KAAK,KAAK,KAAK,cAAc,IAAI;AAC/C,QAAM,WAAW,KAAK,KAAK,KAAK,KAAK;AAErC,MAAI,kBAAkB,UAAU;AAE9B,QAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,IAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACxE,UAAM,YAAY,KAAK,KAAK,UAAU,UAAU;AAChD,QAAI,CAAC,GAAG,WAAW,SAAS,GAAG;AAC7B,gBAAU,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAiL;AACtM,UAAI,KAAK,yEAAyE;AAAA,IACpF;AAGA,QAAI,CAAC,GAAG,WAAW,KAAK,EAAG,IAAG,UAAU,OAAO,EAAE,WAAW,KAAK,CAAC;AAClE,UAAM,aAAa,KAAK,KAAK,OAAO,YAAY;AAChD,QAAI,GAAG,WAAW,UAAU,GAAG;AAC7B,UAAI,KAAK,kCAAkC;AAC3C;AAAA,IACF;AAEA,cAAU,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAmkD;AACzlD,QAAI,QAAQ,wDAAwD;AAAA,EACtE,OAAO;AACL,QAAI,MAAM,cAAc,aAAa,8CAA8C;AAAA,EACrF;AACF;AAMA,KAAK,EAAE,MAAM,SAAO;AAClB,MAAI,MAAM,IAAI,OAAO;AACrB,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["info"]}
1
+ {"version":3,"sources":["../index.ts","../version.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\n/**\r\n * Velix v5 CLI\r\n *\r\n * Commands:\r\n * velix create <name> Create a new Velix project\r\n * velix dev Start development server\r\n * velix build Build for production\r\n * velix start Start production server\r\n * velix g <type> <name> Generate (page, component, api, layout, middleware, etc.)\r\n * velix doctor Health check\r\n * velix info Framework info\r\n * velix analyze Bundle analysis\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { fileURLToPath } from 'url';\r\nimport pc from 'picocolors';\r\nimport prompts from 'prompts';\r\nimport { VERSION } from './version.js';\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = path.dirname(__filename);\r\n\r\n// ============================================================================\r\n// Logger (shared, single instance)\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 blank: () => console.log(''),\r\n};\r\n\r\n// ============================================================================\r\n// ASCII Banner\r\n// ============================================================================\r\n\r\nfunction showBanner() {\r\n console.log('');\r\n console.log(` ${pc.cyan('▲')} ${pc.bold('Velix')} ${pc.dim(`v${VERSION}`)}`);\r\n console.log(` ${pc.dim('──────────────────────────────────────────────')}`);\r\n console.log('');\r\n}\r\n\r\n// ============================================================================\r\n// Help\r\n// ============================================================================\r\n\r\nfunction showHelp() {\r\n showBanner();\r\n console.log(` ${pc.bold('Usage:')} velix <command> [options]`);\r\n console.log('');\r\n console.log(` ${pc.bold('Commands:')}`);\r\n console.log(` ${pc.cyan('create')} <name> Create a new Velix 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('g')} <type> <name> Generate component/page/api/...`);\r\n console.log(` ${pc.cyan('ui')} add <component> Install Shadcn-style UI components`);\r\n console.log(` ${pc.cyan('doctor')} Health check & diagnostics`);\r\n console.log(` ${pc.cyan('info')} Framework & environment info`);\r\n console.log(` ${pc.cyan('analyze')} Bundle analysis`);\r\n console.log('');\r\n console.log(` ${pc.bold('Generate types:')}`);\r\n console.log(` page, layout, component, hook, api, action, middleware, context, loading, error, not-found`);\r\n console.log('');\r\n console.log(` ${pc.bold('Examples:')}`);\r\n console.log(` ${pc.dim('$')} velix create my-app`);\r\n console.log(` ${pc.dim('$')} velix dev`);\r\n console.log(` ${pc.dim('$')} velix g page dashboard`);\r\n console.log(` ${pc.dim('$')} velix g api users`);\r\n console.log('');\r\n}\r\n\r\n// ============================================================================\r\n// Main CLI\r\n// ============================================================================\r\n\r\nasync function main() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n if (!command || command === '--help' || command === '-h') {\r\n showHelp();\r\n return;\r\n }\r\n\r\n if (command === '--version' || command === '-v') {\r\n console.log(`velix v${VERSION}`);\r\n return;\r\n }\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 startDev();\r\n break;\r\n\r\n case 'build':\r\n await buildProject();\r\n break;\r\n\r\n case 'start':\r\n await startProd();\r\n break;\r\n\r\n case 'g':\r\n case 'generate':\r\n await generate(args[1], args[2]);\r\n break;\r\n\r\n case 'doctor':\r\n await doctor();\r\n break;\r\n\r\n case 'info':\r\n await info();\r\n break;\r\n\r\n case 'analyze':\r\n log.info('Bundle analysis coming soon...');\r\n break;\r\n\r\n case 'ui':\r\n await handleUiCommand(args.slice(1));\r\n break;\r\n\r\n default:\r\n log.error(`Unknown command: ${command}`);\r\n showHelp();\r\n process.exit(1);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Commands\r\n// ============================================================================\r\n\r\nasync function createProject(name?: string) {\r\n showBanner();\r\n\r\n if (!name) {\r\n const response = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: 'Project name:',\r\n initial: 'my-velix-app',\r\n });\r\n name = response.name;\r\n if (!name) { log.error('Project name is required'); process.exit(1); }\r\n }\r\n\r\n const projectDir = path.resolve(process.cwd(), name);\r\n\r\n if (fs.existsSync(projectDir)) {\r\n log.error(`Directory ${name} already exists`);\r\n process.exit(1);\r\n }\r\n\r\n // Choose template\r\n const flags = process.argv.slice(3); // Flags start from the 4th argument (index 3)\r\n const templateFlag = flags.find(a => a.startsWith('--template='))?.split('=')[1];\r\n const tailwindFlag = flags.includes('--tailwind');\r\n const noTailwindFlag = flags.includes('--no-tailwind');\r\n\r\n let template = templateFlag;\r\n let useTailwind: boolean | undefined = tailwindFlag ? true : (noTailwindFlag ? false : undefined);\r\n\r\n if (!template) {\r\n const response = await prompts({\r\n type: 'select',\r\n name: 'template',\r\n message: 'Select a template:',\r\n choices: [\r\n { title: '✨ Default - Full Velix app with examples', value: 'default' },\r\n { title: '⚡ Minimal', value: 'minimal' },\r\n ],\r\n });\r\n template = response.template;\r\n }\r\n\r\n if (!template) {\r\n log.error('No template selected');\r\n process.exit(1);\r\n }\r\n\r\n if (useTailwind === undefined) { // Only prompt if not specified by flags\r\n const twResponse = await prompts({\r\n type: 'confirm',\r\n name: 'useTailwind',\r\n message: 'Use Tailwind CSS?',\r\n initial: true\r\n });\r\n useTailwind = twResponse.useTailwind;\r\n }\r\n\r\n let useShadcn: boolean | undefined = flags.includes('--shadcn') ? true : (flags.includes('--no-shadcn') ? false : undefined);\r\n \r\n if (useTailwind && useShadcn === undefined) {\r\n const shResponse = await prompts({\r\n type: 'confirm',\r\n name: 'useShadcn',\r\n message: 'Use Shadcn UI components?',\r\n initial: true\r\n });\r\n useShadcn = shResponse.useShadcn;\r\n }\r\n\r\n const { default: ora } = await import('ora');\r\n const spinner = ora('Creating project...').start();\r\n\r\n try {\r\n fs.mkdirSync(projectDir, { recursive: true });\r\n\r\n // Generate project files based on template\r\n generateProjectFiles(projectDir, name, template, useTailwind, useShadcn);\r\n\r\n spinner.succeed(`Project ${pc.bold(name)} created!`);\r\n log.blank();\r\n console.log(` ${pc.bold('Next steps:')}`);\r\n console.log(` ${pc.dim('$')} cd ${name}`);\r\n console.log(` ${pc.dim('$')} npm install`);\r\n console.log(` ${pc.dim('$')} npm run dev`);\r\n log.blank();\r\n\r\n } catch (err: any) {\r\n spinner.fail('Failed to create project');\r\n log.error(err.message);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction generateProjectFiles(dir: string, name: string, template: string, useTailwind: boolean = true, useShadcn: boolean = false) {\r\n // package.json\r\n const pkg: any = {\r\n name,\r\n version: '0.1.0',\r\n private: true,\r\n type: 'module',\r\n scripts: {\r\n dev: 'velix dev',\r\n build: 'velix build',\r\n start: 'velix start',\r\n },\r\n dependencies: {\r\n '@teamvelix/velix': `^${VERSION}`,\r\n react: '^19.0.0',\r\n 'react-dom': '^19.0.0',\r\n },\r\n devDependencies: {\r\n '@teamvelix/cli': `^${VERSION}`,\r\n typescript: '^5.7.0',\r\n '@types/react': '^19.0.0',\r\n '@types/react-dom': '^19.0.0',\r\n },\r\n };\r\n\r\n if (useTailwind) {\r\n pkg.devDependencies = {\r\n ...pkg.devDependencies,\r\n 'tailwindcss': '^4.0.0',\r\n '@tailwindcss/cli': '^4.0.0',\r\n };\r\n }\r\n\r\n if (useShadcn) {\r\n pkg.dependencies = {\r\n ...pkg.dependencies,\r\n 'clsx': '^2.1.0',\r\n 'tailwind-merge': '^2.2.1',\r\n 'lucide-react': '^0.359.0'\r\n };\r\n }\r\n\r\n writeFile(path.join(dir, 'package.json'), JSON.stringify(pkg, null, 2));\r\n\r\n // velix.config.ts\r\n writeFile(path.join(dir, 'velix.config.ts'), `import { defineConfig${useTailwind ? ', tailwindPlugin' : ''} } from \"@teamvelix/velix\";\r\n\r\nexport default defineConfig({\r\n app: {\r\n name: \"${name}\",\r\n },\r\n server: {\r\n port: 3000,\r\n host: \"localhost\",\r\n },\r\n seo: {\r\n sitemap: true,\r\n robots: true,\r\n openGraph: true,\r\n },\r\n favicon: \"/favicon.webp\",\r\n ${useTailwind ? `plugins: [\\n tailwindPlugin()\\n ],` : 'plugins: [],'}\r\n});\r\n`);\r\n\r\n // tsconfig.json\r\n writeFile(path.join(dir, 'tsconfig.json'), JSON.stringify({\r\n compilerOptions: {\r\n target: 'ES2022',\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n jsx: 'react-jsx',\r\n strict: true,\r\n esModuleInterop: true,\r\n skipLibCheck: true,\r\n forceConsistentCasingInFileNames: true,\r\n },\r\n include: ['app/**/*.ts', 'app/**/*.tsx', 'server/**/*.ts'],\r\n exclude: ['node_modules', '.velix']\r\n }, null, 2));\r\n\r\n if (useTailwind) {\r\n // Tailwind v4 configuration (content auto-detection, theme in CSS)\r\n writeFile(path.join(dir, 'tailwind.config.ts'), `import type { Config } from \"tailwindcss\";\\n\\nexport default {\\n content: [\\n \"./index.html\",\\n \"./app/**/*.{js,ts,jsx,tsx}\",\\n \"./components/**/*.{js,ts,jsx,tsx}\",\\n \"./lib/**/*.{js,ts,jsx,tsx}\",\\n \"./src/**/*.{js,ts,jsx,tsx}\",\\n ],\\n} satisfies Config;\\n`);\r\n }\r\n \r\n // app/layout.tsx\r\n fs.mkdirSync(path.join(dir, 'app'), { recursive: true });\r\n writeFile(path.join(dir, 'app', 'globals.css'), useTailwind ? `@import \"tailwindcss\";\\n\\n@theme {\\n --color-velix-deep: #0B1120;\\n --color-velix-dark: #0F172A;\\n --color-velix-accent: #2563EB;\\n --color-velix-cyan: #22D3EE;\\n --color-velix-glow: #38BDF8;\\n}\\n` : `body { margin: 0; font-family: sans-serif; }\\n`);\r\n \r\n writeFile(path.join(dir, 'app', 'layout.tsx'), `import \"./globals.css\";\r\n\r\nexport const metadata = {\r\n title: \"${name}\",\r\n description: \"Built with Velix v5\",\r\n};\r\n\r\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\r\n return (\r\n <html lang=\"en\">\r\n <body className=\"${useTailwind ? 'bg-velix-deep text-slate-100' : 'bg-slate-900 text-white'} min-h-screen font-sans antialiased\">{children}</body>\r\n </html>\r\n );\r\n}\r\n`);\r\n\r\n // app/page.tsx\r\n if (template === 'minimal') {\r\n writeFile(path.join(dir, 'app', 'page.tsx'), `export const metadata = {\\n title: \"${name}\",\\n};\\n\\nexport default function MinimalPage() {\\n return (\\n <main className=\"min-h-screen flex flex-col items-center justify-center bg-[#0F172A] text-slate-100 font-sans\">\\n <h1 className=\"text-4xl font-bold tracking-tight text-white mb-2\">Velix</h1>\\n <p className=\"text-slate-400\">Minimal starter.</p>\\n </main>\\n );\\n}\\n`);\r\n } else {\r\n // Generate components\r\n fs.mkdirSync(path.join(dir, 'components', 'ui'), { recursive: true });\r\n \r\n // Default Button Component\r\n let buttonCode = `import React from 'react';\\n\\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\\n variant?: 'primary' | 'secondary';\\n}\\n\\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\\n ({ className = '', variant = 'primary', ...props }, ref) => {\\n const base = \"inline-flex flex-row gap-2 items-center justify-center font-medium transition-all duration-300 h-12 rounded-xl px-8 focus:outline-none focus:ring-2 focus:ring-velix-cyan/50\";\\n const variants = {\\n primary: \"bg-gradient-to-r from-velix-accent to-velix-cyan text-white shadow-[0_0_20px_rgba(34,211,238,0.25)] hover:shadow-[0_0_30px_rgba(34,211,238,0.45)]\",\\n secondary: \"bg-white/5 text-slate-200 border border-white/10 hover:bg-white/10 hover:border-velix-cyan/30\"\\n };\\n return <button ref={ref} className={\\`\\${base} \\${variants[variant]} \\${className}\\`} {...props} />;\\n }\\n);\\nButton.displayName = \"Button\";\\n`;\r\n \r\n // Overwrite with Shadcn baseline if chosen\r\n if (useShadcn) {\r\n fs.mkdirSync(path.join(dir, 'lib'), { recursive: true });\r\n writeFile(path.join(dir, 'lib', 'utils.ts'), `import { clsx, type ClassValue } from \"clsx\";\\nimport { twMerge } from \"tailwind-merge\";\\n\\nexport function cn(...inputs: ClassValue[]) {\\n return twMerge(clsx(inputs));\\n}\\n`);\r\n buttonCode = `import * as React from \"react\";\\nimport { cn } from \"../../lib/utils\";\\n\\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\\n variant?: 'primary' | 'secondary';\\n}\\n\\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\\n ({ className, variant = 'primary', ...props }, ref) => {\\n const classes = cn(\\n \"inline-flex flex-row gap-2 items-center justify-center font-medium transition-all duration-300 h-12 rounded-xl px-8 focus:outline-none focus:ring-2 focus:ring-velix-cyan/50\",\\n variant === 'primary' ? \"bg-gradient-to-r from-velix-accent to-velix-cyan text-white shadow-[0_0_20px_rgba(34,211,238,0.25)] hover:shadow-[0_0_30px_rgba(34,211,238,0.45)]\" : \"bg-white/5 text-slate-200 border border-white/10 hover:bg-white/10 hover:border-velix-cyan/30\",\\n className\\n );\\n return <button className={classes} ref={ref} {...props} />;\\n }\\n);\\nButton.displayName = \"Button\";\\n`;\r\n }\r\n writeFile(path.join(dir, 'components', 'ui', 'button.tsx'), buttonCode);\r\n\r\n // Default Card Component\r\n const cardClasses = \"group relative p-8 bg-velix-dark/60 border border-white/5 rounded-2xl hover:border-velix-cyan/20 transition-colors duration-300 overflow-hidden\";\r\n const cardGradient = \"absolute inset-0 bg-gradient-to-br from-velix-accent/0 to-velix-cyan/0 group-hover:from-velix-accent/5 group-hover:to-velix-cyan/5 transition-all duration-500\";\r\n let cardCode: string;\r\n if (useShadcn) {\r\n cardCode = [\r\n 'import React from \"react\";',\r\n 'import { cn } from \"../../lib/utils\";',\r\n '',\r\n \"export function Card({ title, description, className = '' }: { title: string; description: string; className?: string }) {\",\r\n ' return (',\r\n ' <div className={cn(\"' + cardClasses + '\", className)}>',\r\n ' <div className=\"' + cardGradient + '\"></div>',\r\n ' <h3 className=\"text-xl font-semibold text-slate-100 mb-3 relative z-10\">{title}</h3>',\r\n ' <p className=\"text-sm text-slate-400 leading-relaxed relative z-10\">{description}</p>',\r\n ' </div>',\r\n ' );',\r\n '}',\r\n '',\r\n ].join('\\n');\r\n } else {\r\n cardCode = [\r\n 'import React from \"react\";',\r\n '',\r\n \"export function Card({ title, description, className = '' }: { title: string; description: string; className?: string }) {\",\r\n ' return (',\r\n ' <div className={\"' + cardClasses + ' \" + className}>',\r\n ' <div className=\"' + cardGradient + '\"></div>',\r\n ' <h3 className=\"text-xl font-semibold text-slate-100 mb-3 relative z-10\">{title}</h3>',\r\n ' <p className=\"text-sm text-slate-400 leading-relaxed relative z-10\">{description}</p>',\r\n ' </div>',\r\n ' );',\r\n '}',\r\n '',\r\n ].join('\\n');\r\n }\r\n writeFile(path.join(dir, 'components', 'ui', 'card.tsx'), cardCode);\r\n\r\n // Default Layout logic\r\n writeFile(path.join(dir, 'app', 'page.tsx'), `import { Button } from \"../components/ui/button\";\r\nimport { Card } from \"../components/ui/card\";\r\n\r\nexport const metadata = {\r\n title: \"Welcome to Velix\",\r\n description: \"Build fast. Ship faster.\",\r\n};\r\n\r\nexport default function HomePage() {\r\n return (\r\n <main className=\"min-h-screen flex flex-col items-center justify-center p-8 bg-gradient-to-b from-[#0B1628] via-velix-dark to-velix-deep text-slate-100 font-sans relative overflow-hidden\">\r\n {/* Background glow effects */}\r\n <div className=\"absolute top-1/4 left-1/3 w-[500px] h-[500px] bg-velix-accent/15 rounded-full blur-[140px] pointer-events-none\"></div>\r\n <div className=\"absolute bottom-1/4 right-1/4 w-[400px] h-[400px] bg-velix-cyan/10 rounded-full blur-[120px] pointer-events-none\"></div>\r\n\r\n <div className=\"z-10 flex flex-col items-center max-w-5xl w-full text-center mt-12 mb-auto\">\r\n <div className=\"mb-10 w-24 h-24 bg-gradient-to-br from-velix-accent to-velix-cyan rounded-2xl shadow-[0_0_50px_rgba(34,211,238,0.3)] flex items-center justify-center relative group\">\r\n <div className=\"absolute inset-0 bg-velix-cyan/20 rounded-2xl blur-xl group-hover:blur-2xl transition-all duration-500\"></div>\r\n <span className=\"text-5xl font-black text-white relative z-10 tracking-tighter\">V</span>\r\n </div>\r\n\r\n <h1 className=\"text-5xl md:text-7xl font-extrabold mb-6 tracking-tight\">\r\n <span className=\"bg-clip-text text-transparent bg-gradient-to-r from-white to-slate-400\">Welcome to</span>{\" \"}\r\n <span className=\"bg-clip-text text-transparent bg-gradient-to-r from-velix-cyan via-velix-glow to-velix-accent\">Velix</span>\r\n </h1>\r\n\r\n <p className=\"text-xl md:text-2xl text-slate-400 mb-12 tracking-wide font-light\">\r\n Build fast. Ship faster.\r\n </p>\r\n\r\n <div className=\"flex flex-col sm:flex-row gap-5 mb-24 w-full sm:w-auto\">\r\n <a href=\"https://github.com/Velixteam/velix\" target=\"_blank\" rel=\"noreferrer\" className=\"w-full sm:w-auto\">\r\n <Button variant=\"primary\" className=\"w-full\">\r\n Get Started\r\n </Button>\r\n </a>\r\n <a href=\"https://teamvelix.vercel.app\" target=\"_blank\" rel=\"noreferrer\" className=\"w-full sm:w-auto\">\r\n <Button variant=\"secondary\" className=\"w-full\">\r\n Documentation\r\n </Button>\r\n </a>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 w-full text-left\">\r\n <Card title=\"Routing\" description=\"File-system based routing that feels instantly familiar and snappy.\" />\r\n <Card title=\"Actions\" description=\"Type-safe server actions mapped seamlessly directly to your client.\" />\r\n <Card title=\"Plugins\" description=\"Extend the framework capabilities with a simple yet powerful API.\" />\r\n <Card title=\"Deployment\" description=\"Deploy to any cloud provider or serverless edge with zero config.\" />\r\n </div>\r\n </div>\r\n\r\n <div className=\"mt-16 pb-8 text-slate-600 text-sm tracking-widest uppercase font-mono\">\r\n Velix &copy; ${new Date().getFullYear()}\r\n </div>\r\n </main>\r\n );\r\n}\r\n`);\r\n }\r\n\r\n if (template !== 'minimal') {\r\n // server/api/hello.ts\r\n fs.mkdirSync(path.join(dir, 'server', 'api'), { recursive: true });\r\n writeFile(path.join(dir, 'server', 'api', 'hello.ts'), `export function GET() {\r\n return Response.json({ message: \"Hello from Velix API!\" });\r\n}\r\n\r\nexport function POST(request: any) {\r\n return Response.json({ received: true });\r\n}\r\n`);\r\n\r\n // public directory\r\n fs.mkdirSync(path.join(dir, 'public'), { recursive: true });\r\n }\r\n\r\n // Copy favicon\r\n const logoSrc = path.join(__dirname, '..', 'assets', 'logo.webp');\r\n if (fs.existsSync(logoSrc)) {\r\n fs.mkdirSync(path.join(dir, 'public'), { recursive: true });\r\n fs.copyFileSync(logoSrc, path.join(dir, 'public', 'favicon.webp'));\r\n }\r\n}\r\n\r\nasync function startDev() {\r\n showBanner();\r\n log.info('Starting development server...');\r\n\r\n const { spawn } = await import('child_process');\r\n const child = spawn('npx', ['tsx', '--no-cache', 'node_modules/@teamvelix/velix/dist/runtime/start-dev.js'], {\r\n stdio: 'inherit', cwd: process.cwd(),\r\n });\r\n\r\n child.on('error', () => {\r\n // Fallback: try running from packages\r\n const devScript = path.join(process.cwd(), 'packages', 'velix', 'runtime', 'start-dev.ts');\r\n if (fs.existsSync(devScript)) {\r\n spawn('npx', ['tsx', devScript], { stdio: 'inherit', cwd: process.cwd() });\r\n } else {\r\n log.error('Could not find Velix runtime. Run `npm install` first.');\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function buildProject() {\r\n showBanner();\r\n log.info('Building for production...');\r\n\r\n const { spawn } = await import('child_process');\r\n const child = spawn('npx', ['tsx', 'node_modules/@teamvelix/velix/dist/runtime/start-build.js'], {\r\n stdio: 'inherit', cwd: process.cwd(),\r\n });\r\n\r\n child.on('error', () => {\r\n const buildScript = path.join(process.cwd(), 'packages', 'velix', 'runtime', 'start-build.ts');\r\n if (fs.existsSync(buildScript)) {\r\n spawn('npx', ['tsx', buildScript], { stdio: 'inherit', cwd: process.cwd() });\r\n } else {\r\n log.error('Could not find Velix runtime. Run `npm install` first.');\r\n process.exit(1);\r\n }\r\n });\r\n}\r\n\r\nasync function startProd() {\r\n showBanner();\r\n log.info('Starting production server...');\r\n\r\n const { spawn } = await import('child_process');\r\n const child = spawn('npx', ['tsx', 'node_modules/@teamvelix/velix/dist/runtime/start-prod.js'], {\r\n stdio: 'inherit', cwd: process.cwd(),\r\n });\r\n\r\n child.on('error', () => {\r\n log.error('Could not start production server.');\r\n process.exit(1);\r\n });\r\n}\r\n\r\nasync function doctor() {\r\n showBanner();\r\n console.log(` ${pc.bold('Velix Doctor')}`);\r\n log.blank();\r\n\r\n const checks = [\r\n { name: 'Node.js version', check: () => { const v = parseInt(process.version.slice(1)); return v >= 18 ? '✔' : '✖'; }, info: process.version },\r\n { name: 'velix.config.ts', check: () => fs.existsSync('velix.config.ts') || fs.existsSync('velix.config.js') ? '✔' : '✖', info: '' },\r\n { name: 'app/ directory', check: () => fs.existsSync('app') ? '✔' : '✖', info: '' },\r\n { name: 'package.json', check: () => fs.existsSync('package.json') ? '✔' : '✖', info: '' },\r\n { name: 'tsconfig.json', check: () => fs.existsSync('tsconfig.json') ? '✔' : '✖', info: '' },\r\n { name: 'node_modules', check: () => fs.existsSync('node_modules') ? '✔' : '⚠ Run npm install', info: '' },\r\n ];\r\n\r\n for (const { name, check, info } of checks) {\r\n const result = check();\r\n const icon = result === '✔' ? pc.green('✔') : result.startsWith('✖') ? pc.red('✖') : pc.yellow('⚠');\r\n const infoStr = info ? ` ${pc.dim(info)}` : (result.length > 1 ? ` ${pc.yellow(result.slice(2))}` : '');\r\n console.log(` ${icon} ${name}${infoStr}`);\r\n }\r\n\r\n log.blank();\r\n}\r\n\r\nasync function info() {\r\n showBanner();\r\n console.log(` ${pc.bold('Environment:')}`);\r\n console.log(` Velix: ${pc.cyan(`v${VERSION}`)}`);\r\n console.log(` Node: ${pc.dim(process.version)}`);\r\n console.log(` Platform: ${pc.dim(process.platform)}`);\r\n console.log(` Arch: ${pc.dim(process.arch)}`);\r\n console.log(` CWD: ${pc.dim(process.cwd())}`);\r\n log.blank();\r\n}\r\n\r\n// ============================================================================\r\n// Generator\r\n// ============================================================================\r\n\r\nasync function generate(type?: string, name?: string) {\r\n const validTypes = ['page', 'layout', 'component', 'hook', 'api', 'action', 'middleware', 'context', 'loading', 'error', 'not-found'];\r\n\r\n if (!type) {\r\n const { type: selectedType } = await prompts({\r\n type: 'select',\r\n name: 'type',\r\n message: 'What do you want to generate?',\r\n choices: validTypes.map(t => ({ title: t, value: t })),\r\n });\r\n type = selectedType;\r\n if (!type) process.exit(0);\r\n }\r\n\r\n if (!validTypes.includes(type)) {\r\n log.error(`Invalid type: ${type}. Valid: ${validTypes.join(', ')}`);\r\n process.exit(1);\r\n }\r\n\r\n if (!name && !['loading', 'error', 'not-found'].includes(type)) {\r\n const { name: inputName } = await prompts({\r\n type: 'text',\r\n name: 'name',\r\n message: `${type} name:`,\r\n });\r\n name = inputName;\r\n if (!name) process.exit(0);\r\n }\r\n\r\n const templates: Record<string, (n: string) => { path: string; content: string }> = {\r\n page: (n) => ({\r\n path: `app/${n}/page.tsx`,\r\n content: `export const metadata = {\\n title: \"${capitalize(n)}\",\\n};\\n\\nexport default function ${pascalCase(n)}Page() {\\n return (\\n <main>\\n <h1>${capitalize(n)}</h1>\\n </main>\\n );\\n}\\n`\r\n }),\r\n layout: (n) => ({\r\n path: `app/${n}/layout.tsx`,\r\n content: `export default function ${pascalCase(n)}Layout({ children }: { children: React.ReactNode }) {\\n return <div>{children}</div>;\\n}\\n`\r\n }),\r\n component: (n) => ({\r\n path: `components/${pascalCase(n)}.tsx`,\r\n content: `interface ${pascalCase(n)}Props {\\n // props\\n}\\n\\nexport default function ${pascalCase(n)}({}: ${pascalCase(n)}Props) {\\n return <div>${pascalCase(n)}</div>;\\n}\\n`\r\n }),\r\n hook: (n) => ({\r\n path: `hooks/use${pascalCase(n)}.ts`,\r\n content: `import { useState } from 'react';\\n\\nexport function use${pascalCase(n)}() {\\n const [state, setState] = useState(null);\\n return { state, setState };\\n}\\n`\r\n }),\r\n api: (n) => ({\r\n path: `server/api/${n}.ts`,\r\n content: `export function GET(request: any) {\\n return Response.json({ message: \"Hello from ${n}\" });\\n}\\n\\nexport function POST(request: any) {\\n return Response.json({ received: true });\\n}\\n`\r\n }),\r\n action: (n) => ({\r\n path: `server/actions/${n}.ts`,\r\n content: `'use server';\\n\\nexport async function ${camelCase(n)}Action(prevState: any, formData: FormData) {\\n // Server action logic\\n return { success: true };\\n}\\n`\r\n }),\r\n middleware: (n) => ({\r\n path: `middleware/${n}.ts`,\r\n content: `export default async function ${camelCase(n)}Middleware(req: any, res: any, next: () => Promise<void>) {\\n // Middleware logic\\n await next();\\n}\\n`\r\n }),\r\n context: (n) => ({\r\n path: `contexts/${pascalCase(n)}Context.tsx`,\r\n content: `'use client';\\nimport { createContext, useContext, useState, type ReactNode } from 'react';\\n\\ninterface ${pascalCase(n)}ContextType {\\n // context values\\n}\\n\\nconst ${pascalCase(n)}Context = createContext<${pascalCase(n)}ContextType | null>(null);\\n\\nexport function ${pascalCase(n)}Provider({ children }: { children: ReactNode }) {\\n return <${pascalCase(n)}Context.Provider value={{}}>{children}</${pascalCase(n)}Context.Provider>;\\n}\\n\\nexport function use${pascalCase(n)}() {\\n const ctx = useContext(${pascalCase(n)}Context);\\n if (!ctx) throw new Error('use${pascalCase(n)} must be used within ${pascalCase(n)}Provider');\\n return ctx;\\n}\\n`\r\n }),\r\n loading: () => ({\r\n path: `app/loading.tsx`,\r\n content: `export default function Loading() {\\n return <div>Loading...</div>;\\n}\\n`\r\n }),\r\n error: () => ({\r\n path: `app/error.tsx`,\r\n content: `'use client';\\n\\nexport default function Error({ error, reset }: { error: Error; reset: () => void }) {\\n return (\\n <div>\\n <h2>Something went wrong!</h2>\\n <p>{error.message}</p>\\n <button onClick={reset}>Try again</button>\\n </div>\\n );\\n}\\n`\r\n }),\r\n 'not-found': () => ({\r\n path: `app/not-found.tsx`,\r\n content: `export default function NotFound() {\\n return (\\n <div>\\n <h1>404 - Not Found</h1>\\n <p>The page you're looking for doesn't exist.</p>\\n </div>\\n );\\n}\\n`\r\n }),\r\n };\r\n\r\n const generator = templates[type!];\r\n if (!generator) { log.error(`No template for type: ${type}`); process.exit(1); }\r\n\r\n const { path: filePath, content } = generator(name || '');\r\n const fullPath = path.resolve(process.cwd(), filePath);\r\n\r\n if (fs.existsSync(fullPath)) {\r\n log.warn(`File already exists: ${filePath}`);\r\n const { overwrite } = await prompts({\r\n type: 'confirm', name: 'overwrite', message: 'Overwrite?', initial: false,\r\n });\r\n if (!overwrite) process.exit(0);\r\n }\r\n\r\n fs.mkdirSync(path.dirname(fullPath), { recursive: true });\r\n fs.writeFileSync(fullPath, content);\r\n log.success(`Created ${pc.cyan(filePath)}`);\r\n}\r\n\r\n// ============================================================================\r\n// Helpers\r\n// ============================================================================\r\n\r\nfunction writeFile(filePath: string, content: string) {\r\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\r\n fs.writeFileSync(filePath, content);\r\n}\r\n\r\nfunction capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\nfunction pascalCase(str: string): string {\r\n return str.split(/[-_\\/]/).map(s => capitalize(s)).join('');\r\n}\r\n\r\nfunction camelCase(str: string): string {\r\n const pascal = pascalCase(str);\r\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\r\n}\r\n\r\nasync function handleUiCommand(args: string[]) {\r\n const [subCommand, componentName] = args;\r\n if (subCommand !== 'add' || !componentName) {\r\n log.error('Usage: velix ui add <component>');\r\n return;\r\n }\r\n\r\n const cwd = process.cwd();\r\n const uiDir = path.join(cwd, 'components', 'ui');\r\n const utilsDir = path.join(cwd, 'lib');\r\n\r\n if (componentName === 'button') {\r\n // Ensure utils.ts exists\r\n if (!fs.existsSync(utilsDir)) fs.mkdirSync(utilsDir, { recursive: true });\r\n const utilsPath = path.join(utilsDir, 'utils.ts');\r\n if (!fs.existsSync(utilsPath)) {\r\n writeFile(utilsPath, `import { clsx, type ClassValue } from \"clsx\";\\nimport { twMerge } from \"tailwind-merge\";\\n\\nexport function cn(...inputs: ClassValue[]) {\\n return twMerge(clsx(inputs));\\n}\\n`);\r\n log.info('Created lib/utils.ts (please run in project: npm i clsx tailwind-merge)');\r\n }\r\n\r\n // Ensure ui dir exists\r\n if (!fs.existsSync(uiDir)) fs.mkdirSync(uiDir, { recursive: true });\r\n const buttonPath = path.join(uiDir, 'button.tsx');\r\n if (fs.existsSync(buttonPath)) {\r\n log.warn('Button component already exists.');\r\n return;\r\n }\r\n\r\n writeFile(buttonPath, `import * as React from \"react\";\\nimport { cn } from \"../../lib/utils\";\\n\\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\\n size?: 'default' | 'sm' | 'lg' | 'icon';\\n}\\n\\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\\n ({ className, variant = 'default', size = 'default', ...props }, ref) => {\\n const variants: Record<string, string> = {\\n default: 'bg-slate-900 text-slate-50 hover:bg-slate-900/90',\\n destructive: 'bg-red-500 text-slate-50 hover:bg-red-500/90',\\n outline: 'border border-slate-200 bg-white hover:bg-slate-100 hover:text-slate-900',\\n secondary: 'bg-slate-100 text-slate-900 hover:bg-slate-100/80',\\n ghost: 'hover:bg-slate-100 hover:text-slate-900',\\n link: 'text-slate-900 underline-offset-4 hover:underline',\\n };\\n const sizes: Record<string, string> = {\\n default: 'h-10 px-4 py-2',\\n sm: 'h-9 rounded-md px-3',\\n lg: 'h-11 rounded-md px-8',\\n icon: 'h-10 w-10',\\n };\\n const classes = cn(\\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\\n variants[variant],\\n sizes[size],\\n className\\n );\\n return <button className={classes} ref={ref} {...props} />;\\n }\\n);\\nButton.displayName = \"Button\";\\n`);\r\n log.success('Installed component: Button (components/ui/button.tsx)');\r\n } else {\r\n log.error(`Component \"${componentName}\" is not available yet in the mock registry.`);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Run\r\n// ============================================================================\r\n\r\nmain().catch(err => {\r\n log.error(err.message);\r\n process.exit(1);\r\n});\r\n","/**\n * Velix CLI version — single source of truth.\n * Keep in sync with packages/velix/version.ts.\n */\nexport const VERSION = '5.1.1';\n"],"mappings":"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","names":["info"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamvelix/cli",
3
- "version": "5.0.9",
3
+ "version": "5.1.1",
4
4
  "description": "Velix v5 CLI — Create, develop, and build Velix applications",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",