@object-ui/cli 0.5.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1337,18 +1337,18 @@ Available templates: ${Object.keys(templates).join(", ")}`
1337
1337
  console.log(chalk3.green("\u2713 Created app.json"));
1338
1338
  const readme = `# ${name}
1339
1339
 
1340
- A Object UI application built from JSON schemas.
1340
+ An Object UI application built from JSON schemas.
1341
1341
 
1342
1342
  ## Getting Started
1343
1343
 
1344
- 1. Install Object UI CLI globally (if you haven't already):
1344
+ 1. Install dependencies:
1345
1345
  \`\`\`bash
1346
- npm install -g @object-ui/cli
1346
+ npm install
1347
1347
  \`\`\`
1348
1348
 
1349
1349
  2. Start the development server:
1350
1350
  \`\`\`bash
1351
- objectui serve app.json
1351
+ npm run dev
1352
1352
  \`\`\`
1353
1353
 
1354
1354
  3. Open your browser and visit http://localhost:3000
@@ -1371,8 +1371,9 @@ Edit \`app.json\` to customize your application. The dev server will automatical
1371
1371
 
1372
1372
  ## Commands
1373
1373
 
1374
- - \`objectui serve [schema]\` - Start development server
1375
- - \`objectui init [name]\` - Create a new application
1374
+ - \`npm run dev\` - Start development server
1375
+ - \`npm run build\` - Build for production
1376
+ - \`npm run preview\` - Preview production build
1376
1377
 
1377
1378
  Built with \u2764\uFE0F using [Object UI](https://www.objectui.org)
1378
1379
  `;
@@ -1386,6 +1387,130 @@ dist
1386
1387
  `;
1387
1388
  writeFileSync2(join3(targetDir, ".gitignore"), gitignore);
1388
1389
  console.log(chalk3.green("\u2713 Created .gitignore"));
1390
+ const packageJson = {
1391
+ name,
1392
+ version: "0.1.0",
1393
+ private: true,
1394
+ type: "module",
1395
+ scripts: {
1396
+ dev: "vite",
1397
+ build: "tsc && vite build",
1398
+ preview: "vite preview"
1399
+ },
1400
+ dependencies: {
1401
+ "@object-ui/components": "^2.0.0",
1402
+ "@object-ui/react": "^2.0.0",
1403
+ react: "^19.2.0",
1404
+ "react-dom": "^19.2.0"
1405
+ },
1406
+ devDependencies: {
1407
+ "@tailwindcss/postcss": "^4.1.18",
1408
+ "@types/react": "^19.2.13",
1409
+ "@types/react-dom": "^19.2.6",
1410
+ "@vitejs/plugin-react": "^5.1.3",
1411
+ autoprefixer: "^10.4.23",
1412
+ postcss: "^8.5.6",
1413
+ tailwindcss: "^4.1.18",
1414
+ typescript: "^5.9.3",
1415
+ vite: "^7.3.1"
1416
+ }
1417
+ };
1418
+ writeFileSync2(join3(targetDir, "package.json"), JSON.stringify(packageJson, null, 2));
1419
+ console.log(chalk3.green("\u2713 Created package.json"));
1420
+ const viteConfig = `import { defineConfig } from 'vite';
1421
+ import react from '@vitejs/plugin-react';
1422
+
1423
+ export default defineConfig({
1424
+ plugins: [react()],
1425
+ server: {
1426
+ port: 3000,
1427
+ },
1428
+ });
1429
+ `;
1430
+ writeFileSync2(join3(targetDir, "vite.config.ts"), viteConfig);
1431
+ console.log(chalk3.green("\u2713 Created vite.config.ts"));
1432
+ const tailwindConfig = `/** @type {import('tailwindcss').Config} */
1433
+ export default {
1434
+ content: ['./index.html', './src/**/*.{ts,tsx}'],
1435
+ };
1436
+ `;
1437
+ writeFileSync2(join3(targetDir, "tailwind.config.js"), tailwindConfig);
1438
+ console.log(chalk3.green("\u2713 Created tailwind.config.js"));
1439
+ const postcssConfig = `export default {
1440
+ plugins: {
1441
+ '@tailwindcss/postcss': {},
1442
+ autoprefixer: {},
1443
+ },
1444
+ };
1445
+ `;
1446
+ writeFileSync2(join3(targetDir, "postcss.config.js"), postcssConfig);
1447
+ console.log(chalk3.green("\u2713 Created postcss.config.js"));
1448
+ const indexHtml = `<!doctype html>
1449
+ <html lang="en">
1450
+ <head>
1451
+ <meta charset="UTF-8" />
1452
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
1453
+ <title>${name}</title>
1454
+ </head>
1455
+ <body>
1456
+ <div id="root"></div>
1457
+ <script type="module" src="/src/main.tsx"></script>
1458
+ </body>
1459
+ </html>
1460
+ `;
1461
+ writeFileSync2(join3(targetDir, "index.html"), indexHtml);
1462
+ console.log(chalk3.green("\u2713 Created index.html"));
1463
+ const srcDir = join3(targetDir, "src");
1464
+ mkdirSync3(srcDir, { recursive: true });
1465
+ const indexCss = `@import 'tailwindcss';
1466
+ `;
1467
+ writeFileSync2(join3(srcDir, "index.css"), indexCss);
1468
+ console.log(chalk3.green("\u2713 Created src/index.css"));
1469
+ const mainTsx = `import { StrictMode } from 'react';
1470
+ import { createRoot } from 'react-dom/client';
1471
+ import App from './App';
1472
+ import './index.css';
1473
+
1474
+ createRoot(document.getElementById('root')!).render(
1475
+ <StrictMode>
1476
+ <App />
1477
+ </StrictMode>,
1478
+ );
1479
+ `;
1480
+ writeFileSync2(join3(srcDir, "main.tsx"), mainTsx);
1481
+ console.log(chalk3.green("\u2713 Created src/main.tsx"));
1482
+ const appTsx = `import { SchemaRenderer } from '@object-ui/react';
1483
+ import schema from '../app.json';
1484
+
1485
+ export default function App() {
1486
+ return <SchemaRenderer schema={schema} />;
1487
+ }
1488
+ `;
1489
+ writeFileSync2(join3(srcDir, "App.tsx"), appTsx);
1490
+ console.log(chalk3.green("\u2713 Created src/App.tsx"));
1491
+ const tsconfig = {
1492
+ compilerOptions: {
1493
+ target: "ES2020",
1494
+ useDefineForClassFields: true,
1495
+ lib: ["ES2020", "DOM", "DOM.Iterable"],
1496
+ module: "ESNext",
1497
+ skipLibCheck: true,
1498
+ moduleResolution: "bundler",
1499
+ allowImportingTsExtensions: true,
1500
+ isolatedModules: true,
1501
+ moduleDetection: "force",
1502
+ noEmit: true,
1503
+ jsx: "react-jsx",
1504
+ strict: true,
1505
+ noUnusedLocals: true,
1506
+ noUnusedParameters: true,
1507
+ noFallthroughCasesInSwitch: true,
1508
+ resolveJsonModule: true
1509
+ },
1510
+ include: ["src"]
1511
+ };
1512
+ writeFileSync2(join3(targetDir, "tsconfig.json"), JSON.stringify(tsconfig, null, 2));
1513
+ console.log(chalk3.green("\u2713 Created tsconfig.json"));
1389
1514
  console.log();
1390
1515
  console.log(chalk3.green("\u2728 Application created successfully!"));
1391
1516
  console.log();
@@ -1394,7 +1519,8 @@ dist
1394
1519
  if (name !== ".") {
1395
1520
  console.log(chalk3.cyan(` cd ${name}`));
1396
1521
  }
1397
- console.log(chalk3.cyan(" objectui serve app.json"));
1522
+ console.log(chalk3.cyan(" npm install"));
1523
+ console.log(chalk3.cyan(" npm run dev"));
1398
1524
  console.log();
1399
1525
  console.log(chalk3.dim(" The development server will start on http://localhost:3000"));
1400
1526
  console.log();
@@ -1408,4 +1534,4 @@ export {
1408
1534
  serve,
1409
1535
  init
1410
1536
  };
1411
- //# sourceMappingURL=chunk-O3QIU2WQ.js.map
1537
+ //# sourceMappingURL=chunk-LWXDPPSW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/serve.ts","../src/utils/app-generator.ts","../src/commands/init.ts"],"sourcesContent":["/**\n * ObjectUI\n * Copyright (c) 2024-present ObjectStack Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { createServer } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport { existsSync, mkdirSync } from 'fs';\nimport { join, resolve, relative } from 'path';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { scanPagesDirectory, createTempAppWithRouting, createTempApp, parseSchemaFile, type RouteInfo } from '../utils/app-generator.js';\n\ninterface ServeOptions {\n port: string;\n host: string;\n}\n\nexport async function serve(schemaPath: string, options: ServeOptions) {\n const cwd = process.cwd();\n \n // Check if pages directory exists for file-system routing\n const pagesDir = join(cwd, 'pages');\n const hasPagesDir = existsSync(pagesDir);\n \n let routes: RouteInfo[] = [];\n let schema: unknown = null;\n let useFileSystemRouting = false;\n\n if (hasPagesDir) {\n // File-system based routing\n console.log(chalk.blue('📁 Detected pages/ directory - using file-system routing'));\n routes = scanPagesDirectory(pagesDir);\n useFileSystemRouting = true;\n \n if (routes.length === 0) {\n throw new Error('No schema files found in pages/ directory');\n }\n \n console.log(chalk.green(`✓ Found ${routes.length} route(s)`));\n routes.forEach(route => {\n console.log(chalk.dim(` ${route.path} → ${relative(cwd, route.filePath)}`));\n });\n } else {\n // Single schema file mode\n const fullSchemaPath = resolve(cwd, schemaPath);\n\n // Check if schema file exists\n if (!existsSync(fullSchemaPath)) {\n throw new Error(`Schema file not found: ${schemaPath}\\nRun 'objectui init' to create a sample schema.`);\n }\n\n console.log(chalk.blue('📋 Loading schema:'), chalk.cyan(schemaPath));\n\n // Read and validate schema\n try {\n schema = parseSchemaFile(fullSchemaPath);\n } catch (error) {\n throw new Error(`Invalid schema file: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Create temporary app directory\n const tmpDir = join(cwd, '.objectui-tmp');\n mkdirSync(tmpDir, { recursive: true });\n\n // Create temporary app files\n if (useFileSystemRouting) {\n createTempAppWithRouting(tmpDir, routes);\n } else {\n createTempApp(tmpDir, schema);\n }\n\n // Install dependencies\n console.log(chalk.blue('📦 Installing dependencies...'));\n console.log(chalk.dim(' This may take a moment on first run...'));\n try {\n execSync('npm install --silent --prefer-offline', { \n cwd: tmpDir, \n stdio: 'inherit',\n });\n console.log(chalk.green('✓ Dependencies installed'));\n } catch {\n throw new Error('Failed to install dependencies. Please check your internet connection and try again.');\n }\n\n console.log(chalk.green('✓ Schema loaded successfully'));\n console.log(chalk.blue('🚀 Starting development server...\\n'));\n\n // Create Vite config\n const viteConfig = {\n root: tmpDir,\n server: {\n port: parseInt(options.port),\n host: options.host,\n open: true,\n },\n plugins: [react()],\n };\n\n // Create Vite server\n const server = await createServer(viteConfig);\n\n await server.listen();\n\n const { port, host } = server.config.server;\n const protocol = server.config.server.https ? 'https' : 'http';\n const displayHost = host === '0.0.0.0' ? 'localhost' : host;\n\n console.log();\n console.log(chalk.green('✓ Server started successfully!'));\n console.log();\n console.log(chalk.bold(' Local: ') + chalk.cyan(`${protocol}://${displayHost}:${port}`));\n console.log();\n console.log(chalk.dim(' Press Ctrl+C to stop the server'));\n console.log();\n}\n","/**\n * ObjectUI\n * Copyright (c) 2024-present ObjectStack Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, readdirSync, statSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport * as yaml from 'js-yaml';\n\nexport interface RouteInfo {\n path: string;\n filePath: string;\n schema: unknown;\n isDynamic: boolean;\n paramName?: string;\n}\n\n// Helper function to check if a file is a supported schema file\nexport function isSupportedSchemaFile(filename: string): boolean {\n return filename.endsWith('.json') || \n filename.endsWith('.yml') ||\n filename.endsWith('.yaml');\n}\n\n// Helper function to extract the base filename without extension\nexport function getBaseFileName(filename: string): string {\n // Remove supported extensions\n return filename\n .replace(/\\.(json|yml|yaml)$/, '');\n}\n\n// Helper function to parse schema file (JSON or YAML)\nexport function parseSchemaFile(filePath: string): unknown {\n const content = readFileSync(filePath, 'utf-8');\n \n if (filePath.endsWith('.json')) {\n return JSON.parse(content);\n } else if (filePath.endsWith('.yml') || filePath.endsWith('.yaml')) {\n return yaml.load(content);\n }\n \n throw new Error(`Unsupported file format: ${filePath}`);\n}\n\nexport function scanPagesDirectory(pagesDir: string): RouteInfo[] {\n const routes: RouteInfo[] = [];\n \n const scanDir = (dir: string, routePrefix: string = '') => {\n const entries = readdirSync(dir);\n \n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n \n if (stat.isDirectory()) {\n // Recursively scan subdirectories\n const newPrefix = routePrefix + '/' + entry;\n scanDir(fullPath, newPrefix);\n } else if (isSupportedSchemaFile(entry)) {\n // Process schema file\n const fileName = getBaseFileName(entry);\n let routePath: string;\n let isDynamic = false;\n let paramName: string | undefined;\n \n if (fileName === 'index') {\n // index.schema.json or index.page.json maps to the directory path\n routePath = routePrefix || '/';\n } else if (fileName.startsWith('[') && fileName.endsWith(']')) {\n // Dynamic route: [id].schema.json -> /:id\n paramName = fileName.slice(1, -1);\n routePath = routePrefix + '/:' + paramName;\n isDynamic = true;\n } else {\n // Regular file: about.schema.json -> /about\n routePath = routePrefix + '/' + fileName;\n }\n \n // Read and parse schema\n try {\n const schema = parseSchemaFile(fullPath);\n \n routes.push({\n path: routePath,\n filePath: fullPath,\n schema,\n isDynamic,\n paramName,\n });\n } catch (error) {\n console.warn(chalk.yellow(`⚠ Warning: Failed to parse ${fullPath}: ${error instanceof Error ? error.message : error}`));\n }\n }\n }\n };\n \n scanDir(pagesDir);\n \n // Sort routes: exact routes first, then dynamic routes\n routes.sort((a, b) => {\n if (a.isDynamic && !b.isDynamic) return 1;\n if (!a.isDynamic && b.isDynamic) return -1;\n return a.path.localeCompare(b.path);\n });\n \n return routes;\n}\n\nexport function createTempApp(tmpDir: string, schema: unknown) {\n // Create index.html\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Object UI App</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>`;\n\n writeFileSync(join(tmpDir, 'index.html'), html);\n\n // Create src directory\n const srcDir = join(tmpDir, 'src');\n mkdirSync(srcDir, { recursive: true });\n\n // Create main.tsx\n const mainTsx = `import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport './index.css';\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>\n);`;\n\n writeFileSync(join(srcDir, 'main.tsx'), mainTsx);\n\n // Create App.tsx\n const appTsx = `import { SchemaRenderer } from '@object-ui/react';\nimport '@object-ui/components';\nimport '@object-ui/plugin-charts';\nimport '@object-ui/plugin-editor';\nimport '@object-ui/plugin-kanban';\nimport '@object-ui/plugin-markdown';\nimport '@object-ui/plugin-form';\nimport '@object-ui/plugin-grid';\nimport '@object-ui/plugin-view';\n\nconst schema = ${JSON.stringify(schema, null, 2)};\n\nfunction App() {\n return <SchemaRenderer schema={schema} />;\n}\n\nexport default App;`;\n\n writeFileSync(join(srcDir, 'App.tsx'), appTsx);\n\n // Create index.css\n const indexCss = `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --accent: 210 40% 96.1%;\n --accent-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 222.2 84% 4.9%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n\n .dark {\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --card: 222.2 84% 4.9%;\n --card-foreground: 210 40% 98%;\n --popover: 222.2 84% 4.9%;\n --popover-foreground: 210 40% 98%;\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 11.2%;\n --secondary: 217.2 32.6% 17.5%;\n --secondary-foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --accent: 217.2 32.6% 17.5%;\n --accent-foreground: 210 40% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n --border: 217.2 32.6% 17.5%;\n --input: 217.2 32.6% 17.5%;\n --ring: 212.7 26.8% 83.9%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}`;\n\n writeFileSync(join(srcDir, 'index.css'), indexCss);\n\n // Create tailwind.config.js\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\nexport default {\n darkMode: ['class'],\n content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],\n theme: {\n extend: {\n borderRadius: {\n lg: 'var(--radius)',\n md: 'calc(var(--radius) - 2px)',\n sm: 'calc(var(--radius) - 4px)',\n },\n colors: {\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n chart: {\n 1: 'hsl(var(--chart-1))',\n 2: 'hsl(var(--chart-2))',\n 3: 'hsl(var(--chart-3))',\n 4: 'hsl(var(--chart-4))',\n 5: 'hsl(var(--chart-5))',\n },\n },\n },\n },\n plugins: [],\n};`;\n\n const cwd = process.cwd();\n const isMonorepo = existsSync(join(cwd, 'pnpm-workspace.yaml'));\n\n // Define Tailwind Content Paths\n // Include JSON files specifically\n const contentPaths = [\"'./index.html'\", \"'./src/**/*.{js,ts,jsx,tsx,json}'\"];\n if (isMonorepo) {\n const componentsPath = join(cwd, 'packages/components/src/**/*.{ts,tsx}');\n const pluginsPath = join(cwd, 'packages/plugin-*/src/**/*.{ts,tsx}');\n contentPaths.push(`'${componentsPath}'`);\n contentPaths.push(`'${pluginsPath}'`); \n }\n\n // Create tailwind.config.js\n const finalTailwindConfig = `/** @type {import('tailwindcss').Config} */\nexport default {\n darkMode: ['class'],\n content: [${contentPaths.join(', ')}],\n theme: {\n extend: {\n borderRadius: {\n lg: 'var(--radius)',\n md: 'calc(var(--radius) - 2px)',\n sm: 'calc(var(--radius) - 4px)',\n },\n colors: {\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n chart: {\n 1: 'hsl(var(--chart-1))',\n 2: 'hsl(var(--chart-2))',\n 3: 'hsl(var(--chart-3))',\n 4: 'hsl(var(--chart-4))',\n 5: 'hsl(var(--chart-5))',\n },\n },\n },\n },\n plugins: [],\n};`;\n\n writeFileSync(join(tmpDir, 'tailwind.config.js'), finalTailwindConfig);\n\n // Create postcss.config.js\n const finalPostcssConfig = `export default {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n};`;\n \n writeFileSync(join(tmpDir, 'postcss.config.js'), finalPostcssConfig);\n\n // Create package.json\n const baseDependencies = {\n react: '^18.3.1',\n 'react-dom': '^18.3.1',\n '@object-ui/react': '^0.1.0',\n '@object-ui/components': '^0.1.0',\n };\n\n const baseDevDependencies = {\n '@types/react': '^18.3.12',\n '@types/react-dom': '^18.3.1',\n '@vitejs/plugin-react': '^4.2.1',\n autoprefixer: '^10.4.23',\n postcss: '^8.5.6',\n tailwindcss: '^3.4.19',\n typescript: '~5.7.3',\n vite: '^5.0.0',\n };\n\n const packageJson = {\n name: 'objectui-temp-app',\n private: true,\n type: 'module',\n // In monorepo, we use root node_modules, so we don't need dependencies here\n dependencies: isMonorepo ? {} : baseDependencies,\n devDependencies: isMonorepo ? {} : baseDevDependencies,\n };\n\n writeFileSync(join(tmpDir, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n };\n\n writeFileSync(join(tmpDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));\n}\n\nexport function createTempAppWithRouting(tmpDir: string, routes: RouteInfo[], appConfig?: unknown) {\n // Create index.html\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${(appConfig as any)?.title || 'Object UI App'}</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>`;\n\n writeFileSync(join(tmpDir, 'index.html'), html);\n\n // Create src directory\n const srcDir = join(tmpDir, 'src');\n mkdirSync(srcDir, { recursive: true });\n\n // Create schemas directory and copy all schemas\n const schemasDir = join(srcDir, 'schemas');\n mkdirSync(schemasDir, { recursive: true });\n \n const schemaImports: string[] = [];\n const routeComponents: string[] = [];\n \n routes.forEach((route, index) => {\n const schemaVarName = `schema${index}`;\n const schemaFileName = `page${index}.json`;\n \n // Write schema to schemas directory\n writeFileSync(\n join(schemasDir, schemaFileName),\n JSON.stringify(route.schema, null, 2)\n );\n \n // Add import statement\n schemaImports.push(`import ${schemaVarName} from './schemas/${schemaFileName}';`);\n \n // Add route component\n routeComponents.push(` <Route path=\"${route.path}\" element={<SchemaRenderer schema={${schemaVarName}} />} />`);\n });\n\n // Create theme-provider.tsx\n const themeProviderTsx = `import { createContext, useContext, useEffect, useState } from \"react\"\n\ntype Theme = \"dark\" | \"light\" | \"system\"\n\ntype ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n}\n\ntype ThemeProviderState = {\n theme: Theme\n setTheme: (theme: Theme) => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"system\",\n setTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"vite-ui-theme\",\n ...props\n}: ThemeProviderProps) {\n const [theme, setTheme] = useState<Theme>(\n () => (localStorage.getItem(storageKey) as Theme) || defaultTheme\n )\n\n useEffect(() => {\n const root = window.document.documentElement\n\n root.classList.remove(\"light\", \"dark\")\n\n if (theme === \"system\") {\n const systemTheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\"\n\n root.classList.add(systemTheme)\n return\n }\n\n root.classList.add(theme)\n }, [theme])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n localStorage.setItem(storageKey, theme)\n setTheme(theme)\n },\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const context = useContext(ThemeProviderContext)\n\n if (context === undefined)\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n\n return context\n}`;\n writeFileSync(join(srcDir, 'theme-provider.tsx'), themeProviderTsx);\n\n // Create main.tsx\n const mainTsx = `import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport './index.css';\nimport { ThemeProvider } from \"./theme-provider\"\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <ThemeProvider defaultTheme=\"dark\" storageKey=\"vite-ui-theme\">\n <App />\n </ThemeProvider>\n </React.StrictMode>\n);`;\n\n writeFileSync(join(srcDir, 'main.tsx'), mainTsx);\n\n // Generate Layout Code if appConfig is present\n let layoutImport = '';\n let layoutWrapperStart = '';\n let layoutWrapperEnd = '';\n \n if (appConfig) {\n // Very basic Layout implementation for now\n // Logic: If appConfig is present, current version assumes it's just a config object, \n // but we need a Layout component that renders navigation.\n // Since we don't have a Layout component in @object-ui/components yet, we generate a simple one.\n\n const layoutCode = `\nimport { Link, useLocation } from 'react-router-dom';\nimport * as LucideIcons from 'lucide-react';\nimport { Moon, Sun } from \"lucide-react\"\nimport { useTheme } from \"./theme-provider\"\nimport { \n cn,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n SidebarProvider,\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarHeader,\n SidebarRail,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n SidebarMenuSub,\n SidebarMenuSubItem,\n SidebarMenuSubButton,\n SidebarInset,\n SidebarTrigger,\n Separator,\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent\n} from '@object-ui/components'; \n\nconst DynamicIcon = ({ name, className }) => {\n // @ts-expect-error - Dynamic icon lookup from Lucide icons\n const Icon = LucideIcons[name];\n if (!Icon) return null;\n return <Icon className={className} />;\n};\n\nexport function ModeToggle() {\n const { setTheme } = useTheme()\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton size=\"lg\" className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\">\n <div className=\"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\n <Sun className=\"h-4 w-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute h-4 w-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">Switch Theme</span>\n <span className=\"truncate text-xs\">Light / Dark</span>\n </div>\n <LucideIcons.ChevronsUpDown className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg\" side=\"bottom\" align=\"end\" sideOffset={4}>\n <DropdownMenuItem onClick={() => setTheme(\"light\")}>\n <LucideIcons.Sun className=\"mr-2 size-4\" />\n Light\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"dark\")}>\n <LucideIcons.Moon className=\"mr-2 size-4\" />\n Dark\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"system\")}>\n <LucideIcons.Monitor className=\"mr-2 size-4\" />\n System\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nconst AppLayout = ({ app, children }) => {\n const location = useLocation();\n const menu = app.menu || [];\n \n return (\n <SidebarProvider>\n <Sidebar collapsible=\"icon\">\n <SidebarHeader>\n <div className=\"flex items-center gap-2 px-2 py-2\">\n <div className=\"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\n {app.logo && <DynamicIcon name={app.logo} className=\"size-4\" />}\n {!app.logo && <span className=\"text-xl font-bold\">O</span>}\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">{app.title || \"Object UI\"}</span>\n <span className=\"truncate text-xs\">Showcase</span>\n </div>\n </div>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>\n <SidebarMenu>\n {menu.map((item, idx) => {\n // Collapsible Item (Children present)\n if (item.children && item.children.length > 0) {\n const isActive = item.children.some(child => child.path === location.pathname);\n return (\n <Collapsible key={idx} asChild defaultOpen={isActive} className=\"group/collapsible\">\n <SidebarMenuItem>\n <CollapsibleTrigger asChild>\n <SidebarMenuButton tooltip={item.label}>\n {item.icon && <DynamicIcon name={item.icon} />}\n <span>{item.label}</span>\n <DynamicIcon name=\"ChevronRight\" className=\"ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90\" />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n {item.children.map((child, cIdx) => (\n <SidebarMenuSubItem key={cIdx}>\n <SidebarMenuSubButton asChild isActive={location.pathname === child.path}>\n <Link to={child.path || '#'}>\n <span>{child.label}</span>\n </Link>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n ))}\n </SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n );\n }\n\n // Single Item\n if (item.path) {\n return (\n <SidebarMenuItem key={idx}>\n <SidebarMenuButton asChild isActive={location.pathname === item.path} tooltip={item.label}>\n <Link to={item.path}>\n {item.icon && <DynamicIcon name={item.icon} />}\n <span>{item.label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n }\n return null;\n })}\n </SidebarMenu>\n </SidebarGroup>\n </SidebarContent>\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem>\n <ModeToggle />\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n <SidebarRail />\n </Sidebar>\n \n <SidebarInset>\n <header className=\"flex h-16 shrink-0 items-center gap-2 border-b bg-background px-4\">\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\n <div className=\"flex flex-1 items-center justify-between\">\n <span className=\"font-medium\">{app.title}</span>\n </div>\n </header>\n <div className=\"flex-1 flex flex-col min-h-0 bg-muted/20 p-4\">\n <div className=\"mx-auto max-w-full w-full\">\n {children}\n </div>\n </div>\n </SidebarInset>\n </SidebarProvider>\n );\n};\n\nexport default AppLayout;\n`;\n writeFileSync(join(srcDir, 'Layout.tsx'), layoutCode);\n \n layoutImport = `import AppLayout from './Layout';\\nconst appConfig = ${JSON.stringify(appConfig)};`;\n layoutWrapperStart = `<AppLayout app={appConfig}>`;\n layoutWrapperEnd = `</AppLayout>`;\n }\n\n // Create App.tsx with routing\n const appTsx = `import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';\nimport { SchemaRenderer } from '@object-ui/react';\nimport '@object-ui/components';\nimport '@object-ui/plugin-charts';\nimport '@object-ui/plugin-editor';\nimport '@object-ui/plugin-kanban';\nimport '@object-ui/plugin-markdown';\nimport '@object-ui/plugin-form';\nimport '@object-ui/plugin-grid';\nimport '@object-ui/plugin-view';\n${schemaImports.join('\\n')}\n${layoutImport}\n\nfunction App() {\n return (\n <BrowserRouter>\n ${layoutWrapperStart}\n <Routes>\n${routeComponents.join('\\n')}\n </Routes>\n ${layoutWrapperEnd}\n </BrowserRouter>\n );\n}\n\nexport default App;`;\n\n writeFileSync(join(srcDir, 'App.tsx'), appTsx);\n\n // Create index.css with Tailwind\n const indexCss = `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --accent: 210 40% 96.1%;\n --accent-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 222.2 84% 4.9%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n\n .dark {\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --card: 222.2 84% 4.9%;\n --card-foreground: 210 40% 98%;\n --popover: 222.2 84% 4.9%;\n --popover-foreground: 210 40% 98%;\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 11.2%;\n --secondary: 217.2 32.6% 17.5%;\n --secondary-foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --accent: 217.2 32.6% 17.5%;\n --accent-foreground: 210 40% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n --border: 217.2 32.6% 17.5%;\n --input: 217.2 32.6% 17.5%;\n --ring: 212.7 26.8% 83.9%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground font-sans antialiased min-h-screen;\n }\n}`;\n\n writeFileSync(join(srcDir, 'index.css'), indexCss);\n\n const cwd = process.cwd();\n const isMonorepo = existsSync(join(cwd, 'pnpm-workspace.yaml'));\n\n // Define Tailwind Content Paths\n // Include JSON files specifically\n const contentPaths = [\"'./index.html'\", \"'./src/**/*.{js,ts,jsx,tsx,json}'\"];\n if (isMonorepo) {\n const componentsPath = join(cwd, 'packages/components/src/**/*.{ts,tsx}');\n const pluginsPath = join(cwd, 'packages/plugin-*/src/**/*.{ts,tsx}');\n contentPaths.push(`'${componentsPath}'`);\n contentPaths.push(`'${pluginsPath}'`); \n }\n\n // Create tailwind.config.js\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\nexport default {\n darkMode: ['class'],\n content: [${contentPaths.join(', ')}],\n theme: {\n extend: {\n borderRadius: {\n lg: 'var(--radius)',\n md: 'calc(var(--radius) - 2px)',\n sm: 'calc(var(--radius) - 4px)',\n },\n colors: {\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n chart: {\n 1: 'hsl(var(--chart-1))',\n 2: 'hsl(var(--chart-2))',\n 3: 'hsl(var(--chart-3))',\n 4: 'hsl(var(--chart-4))',\n 5: 'hsl(var(--chart-5))',\n },\n },\n },\n },\n plugins: [],\n};`;\n\n writeFileSync(join(tmpDir, 'tailwind.config.js'), tailwindConfig);\n\n // Create postcss.config.js\n const postcssConfig = `export default {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n};`;\n \n writeFileSync(join(tmpDir, 'postcss.config.js'), postcssConfig);\n\n // Create package.json with react-router-dom\n const packageJson = {\n name: 'objectui-temp-app',\n private: true,\n type: 'module',\n dependencies: {\n react: '^18.3.1',\n 'react-dom': '^18.3.1',\n 'react-router-dom': '^7.12.0',\n '@object-ui/react': '^0.1.0',\n '@object-ui/components': '^0.1.0',\n },\n devDependencies: {\n '@types/react': '^18.3.12',\n '@types/react-dom': '^18.3.1',\n '@vitejs/plugin-react': '^4.2.1',\n autoprefixer: '^10.4.23',\n postcss: '^8.5.6',\n tailwindcss: '^3.4.19',\n typescript: '~5.7.3',\n vite: '^5.0.0',\n },\n };\n\n writeFileSync(join(tmpDir, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n };\n\n writeFileSync(join(tmpDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));\n}\n","/**\n * ObjectUI\n * Copyright (c) 2024-present ObjectStack Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { existsSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\n\ninterface InitOptions {\n template: string;\n}\n\nconst templates = {\n simple: {\n type: 'div',\n className: 'min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100',\n body: {\n type: 'card',\n className: 'w-full max-w-md shadow-lg',\n title: 'Welcome to Object UI',\n description: 'Start building your application with JSON schemas',\n body: {\n type: 'div',\n className: 'p-6 space-y-4',\n body: [\n {\n type: 'text',\n content: 'This is a simple example. Edit app.json to customize your application.',\n className: 'text-sm text-muted-foreground',\n },\n {\n type: 'button',\n label: 'Get Started',\n className: 'w-full',\n },\n ],\n },\n },\n },\n form: {\n type: 'div',\n className: 'min-h-screen flex items-center justify-center bg-gradient-to-br from-purple-50 to-pink-100 p-4',\n body: {\n type: 'card',\n className: 'w-full max-w-2xl shadow-xl',\n title: 'Contact Form',\n description: 'Fill out the form below to get in touch',\n body: {\n type: 'div',\n className: 'p-6 space-y-6',\n body: [\n {\n type: 'div',\n className: 'grid grid-cols-2 gap-4',\n body: [\n {\n type: 'input',\n label: 'First Name',\n placeholder: 'John',\n required: true,\n },\n {\n type: 'input',\n label: 'Last Name',\n placeholder: 'Doe',\n required: true,\n },\n ],\n },\n {\n type: 'input',\n label: 'Email Address',\n inputType: 'email',\n placeholder: 'john.doe@example.com',\n required: true,\n },\n {\n type: 'input',\n label: 'Phone Number',\n inputType: 'tel',\n placeholder: '+1 (555) 000-0000',\n },\n {\n type: 'textarea',\n label: 'Message',\n placeholder: 'Tell us what you need...',\n rows: 4,\n },\n {\n type: 'div',\n className: 'flex gap-3',\n body: [\n {\n type: 'button',\n label: 'Submit',\n className: 'flex-1',\n },\n {\n type: 'button',\n label: 'Reset',\n variant: 'outline',\n className: 'flex-1',\n },\n ],\n },\n ],\n },\n },\n },\n dashboard: {\n type: 'div',\n className: 'min-h-screen bg-muted/10',\n body: [\n {\n type: 'div',\n className: 'border-b bg-background',\n body: {\n type: 'div',\n className: 'container mx-auto px-6 py-4',\n body: {\n type: 'div',\n className: 'flex items-center justify-between',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: 'Dashboard' },\n },\n {\n type: 'button',\n label: 'New Item',\n size: 'sm',\n },\n ],\n },\n },\n },\n {\n type: 'div',\n className: 'container mx-auto p-6 space-y-6',\n body: [\n {\n type: 'div',\n className: 'grid gap-4 md:grid-cols-2 lg:grid-cols-4',\n body: [\n {\n type: 'card',\n className: 'shadow-sm',\n body: [\n {\n type: 'div',\n className: 'p-6 pb-2',\n body: {\n type: 'div',\n className: 'text-sm font-medium text-muted-foreground',\n body: { type: 'text', content: 'Total Revenue' },\n },\n },\n {\n type: 'div',\n className: 'p-6 pt-0',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: '$45,231.89' },\n },\n {\n type: 'div',\n className: 'text-xs text-muted-foreground mt-1',\n body: { type: 'text', content: '+20.1% from last month' },\n },\n ],\n },\n ],\n },\n {\n type: 'card',\n className: 'shadow-sm',\n body: [\n {\n type: 'div',\n className: 'p-6 pb-2',\n body: {\n type: 'div',\n className: 'text-sm font-medium text-muted-foreground',\n body: { type: 'text', content: 'Active Users' },\n },\n },\n {\n type: 'div',\n className: 'p-6 pt-0',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: '+2,350' },\n },\n {\n type: 'div',\n className: 'text-xs text-muted-foreground mt-1',\n body: { type: 'text', content: '+180.1% from last month' },\n },\n ],\n },\n ],\n },\n {\n type: 'card',\n className: 'shadow-sm',\n body: [\n {\n type: 'div',\n className: 'p-6 pb-2',\n body: {\n type: 'div',\n className: 'text-sm font-medium text-muted-foreground',\n body: { type: 'text', content: 'Sales' },\n },\n },\n {\n type: 'div',\n className: 'p-6 pt-0',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: '+12,234' },\n },\n {\n type: 'div',\n className: 'text-xs text-muted-foreground mt-1',\n body: { type: 'text', content: '+19% from last month' },\n },\n ],\n },\n ],\n },\n {\n type: 'card',\n className: 'shadow-sm',\n body: [\n {\n type: 'div',\n className: 'p-6 pb-2',\n body: {\n type: 'div',\n className: 'text-sm font-medium text-muted-foreground',\n body: { type: 'text', content: 'Active Now' },\n },\n },\n {\n type: 'div',\n className: 'p-6 pt-0',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: '+573' },\n },\n {\n type: 'div',\n className: 'text-xs text-muted-foreground mt-1',\n body: { type: 'text', content: '+201 since last hour' },\n },\n ],\n },\n ],\n },\n ],\n },\n {\n type: 'card',\n className: 'shadow-sm',\n title: 'Recent Activity',\n description: 'Your latest updates and notifications',\n body: {\n type: 'div',\n className: 'p-6 pt-0 space-y-4',\n body: [\n {\n type: 'div',\n className: 'flex items-center gap-4 border-b pb-4',\n body: [\n {\n type: 'div',\n className: 'flex-1',\n body: [\n {\n type: 'div',\n className: 'font-medium',\n body: { type: 'text', content: 'New user registration' },\n },\n {\n type: 'div',\n className: 'text-sm text-muted-foreground',\n body: { type: 'text', content: '2 minutes ago' },\n },\n ],\n },\n ],\n },\n {\n type: 'div',\n className: 'flex items-center gap-4 border-b pb-4',\n body: [\n {\n type: 'div',\n className: 'flex-1',\n body: [\n {\n type: 'div',\n className: 'font-medium',\n body: { type: 'text', content: 'Payment received' },\n },\n {\n type: 'div',\n className: 'text-sm text-muted-foreground',\n body: { type: 'text', content: '15 minutes ago' },\n },\n ],\n },\n ],\n },\n {\n type: 'div',\n className: 'flex items-center gap-4',\n body: [\n {\n type: 'div',\n className: 'flex-1',\n body: [\n {\n type: 'div',\n className: 'font-medium',\n body: { type: 'text', content: 'New order placed' },\n },\n {\n type: 'div',\n className: 'text-sm text-muted-foreground',\n body: { type: 'text', content: '1 hour ago' },\n },\n ],\n },\n ],\n },\n ],\n },\n },\n ],\n },\n ],\n },\n};\n\nexport async function init(name: string, options: InitOptions) {\n const cwd = process.cwd();\n const projectDir = join(cwd, name);\n\n // Check if directory already exists\n if (existsSync(projectDir) && name !== '.') {\n throw new Error(`Directory \"${name}\" already exists. Please choose a different name.`);\n }\n\n const targetDir = name === '.' ? cwd : projectDir;\n\n // Create project directory if needed\n if (name !== '.') {\n mkdirSync(projectDir, { recursive: true });\n }\n\n console.log(chalk.blue('🎨 Creating Object UI application...'));\n console.log(chalk.dim(` Template: ${options.template}`));\n console.log();\n\n // Get template\n const template = templates[options.template as keyof typeof templates];\n if (!template) {\n throw new Error(\n `Unknown template: ${options.template}\\nAvailable templates: ${Object.keys(templates).join(', ')}`\n );\n }\n\n // Create schema file\n const schemaPath = join(targetDir, 'app.json');\n writeFileSync(schemaPath, JSON.stringify(template, null, 2));\n\n console.log(chalk.green('✓ Created app.json'));\n\n // Create README\n const readme = `# ${name}\n\nA Object UI application built from JSON schemas.\n\n## Getting Started\n\n1. Install Object UI CLI globally (if you haven't already):\n \\`\\`\\`bash\n npm install -g @object-ui/cli\n \\`\\`\\`\n\n2. Start the development server:\n \\`\\`\\`bash\n objectui serve app.json\n \\`\\`\\`\n\n3. Open your browser and visit http://localhost:3000\n\n## Customize Your App\n\nEdit \\`app.json\\` to customize your application. The dev server will automatically reload when you save changes.\n\n## Available Templates\n\n- **simple**: A minimal getting started template\n- **form**: A contact form example\n- **dashboard**: A full dashboard with metrics and activity feed\n\n## Learn More\n\n- [Object UI Documentation](https://www.objectui.org)\n- [Schema Reference](https://www.objectui.org/docs/protocol/overview)\n- [Component Library](https://www.objectui.org/docs/api/components)\n\n## Commands\n\n- \\`objectui serve [schema]\\` - Start development server\n- \\`objectui init [name]\\` - Create a new application\n\nBuilt with ❤️ using [Object UI](https://www.objectui.org)\n`;\n\n writeFileSync(join(targetDir, 'README.md'), readme);\n console.log(chalk.green('✓ Created README.md'));\n\n // Create .gitignore\n const gitignore = `.objectui-tmp\nnode_modules\ndist\n.DS_Store\n*.log\n`;\n\n writeFileSync(join(targetDir, '.gitignore'), gitignore);\n console.log(chalk.green('✓ Created .gitignore'));\n\n console.log();\n console.log(chalk.green('✨ Application created successfully!'));\n console.log();\n console.log(chalk.bold('Next steps:'));\n console.log();\n if (name !== '.') {\n console.log(chalk.cyan(` cd ${name}`));\n }\n console.log(chalk.cyan(' objectui serve app.json'));\n console.log();\n console.log(chalk.dim(' The development server will start on http://localhost:3000'));\n console.log();\n}\n"],"mappings":";AAQA,SAAS,oBAAoB;AAC7B,OAAO,WAAW;AAClB,SAAS,cAAAA,aAAY,aAAAC,kBAAiB;AACtC,SAAS,QAAAC,OAAM,SAAS,gBAAgB;AACxC,OAAOC,YAAW;AAClB,SAAS,gBAAgB;;;ACLzB,SAAS,cAAc,eAAe,WAAW,aAAa,UAAU,kBAAkB;AAC1F,SAAS,YAAY;AACrB,OAAO,WAAW;AAClB,YAAY,UAAU;AAWf,SAAS,sBAAsB,UAA2B;AAC/D,SAAO,SAAS,SAAS,OAAO,KACzB,SAAS,SAAS,MAAM,KACxB,SAAS,SAAS,OAAO;AAClC;AAGO,SAAS,gBAAgB,UAA0B;AAExD,SAAO,SACJ,QAAQ,sBAAsB,EAAE;AACrC;AAGO,SAAS,gBAAgB,UAA2B;AACzD,QAAM,UAAU,aAAa,UAAU,OAAO;AAE9C,MAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,WAAW,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,OAAO,GAAG;AAClE,WAAY,UAAK,OAAO;AAAA,EAC1B;AAEA,QAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AACxD;AAEO,SAAS,mBAAmB,UAA+B;AAChE,QAAM,SAAsB,CAAC;AAE7B,QAAM,UAAU,CAAC,KAAa,cAAsB,OAAO;AACzD,UAAM,UAAU,YAAY,GAAG;AAE/B,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,KAAK,KAAK;AAChC,YAAM,OAAO,SAAS,QAAQ;AAE9B,UAAI,KAAK,YAAY,GAAG;AAEtB,cAAM,YAAY,cAAc,MAAM;AACtC,gBAAQ,UAAU,SAAS;AAAA,MAC7B,WAAW,sBAAsB,KAAK,GAAG;AAEvC,cAAM,WAAW,gBAAgB,KAAK;AACtC,YAAI;AACJ,YAAI,YAAY;AAChB,YAAI;AAEJ,YAAI,aAAa,SAAS;AAExB,sBAAY,eAAe;AAAA,QAC7B,WAAW,SAAS,WAAW,GAAG,KAAK,SAAS,SAAS,GAAG,GAAG;AAE7D,sBAAY,SAAS,MAAM,GAAG,EAAE;AAChC,sBAAY,cAAc,OAAO;AACjC,sBAAY;AAAA,QACd,OAAO;AAEL,sBAAY,cAAc,MAAM;AAAA,QAClC;AAGA,YAAI;AACF,gBAAM,SAAS,gBAAgB,QAAQ;AAEvC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,SAAS,OAAO;AACd,kBAAQ,KAAK,MAAM,OAAO,mCAA8B,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,QACxH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,QAAQ;AAGhB,SAAO,KAAK,CAAC,GAAG,MAAM;AACpB,QAAI,EAAE,aAAa,CAAC,EAAE,UAAW,QAAO;AACxC,QAAI,CAAC,EAAE,aAAa,EAAE,UAAW,QAAO;AACxC,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AAED,SAAO;AACT;AAEO,SAAS,cAAc,QAAgB,QAAiB;AAE7D,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAab,gBAAc,KAAK,QAAQ,YAAY,GAAG,IAAI;AAG9C,QAAM,SAAS,KAAK,QAAQ,KAAK;AACjC,YAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAGrC,QAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWhB,gBAAc,KAAK,QAAQ,UAAU,GAAG,OAAO;AAG/C,QAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAUA,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ9C,gBAAc,KAAK,QAAQ,SAAS,GAAG,MAAM;AAG7C,QAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsEjB,gBAAc,KAAK,QAAQ,WAAW,GAAG,QAAQ;AAGjD,QAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0DvB,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,aAAa,WAAW,KAAK,KAAK,qBAAqB,CAAC;AAI9D,QAAM,eAAe,CAAC,kBAAkB,mCAAmC;AAC3E,MAAI,YAAY;AACb,UAAM,iBAAiB,KAAK,KAAK,uCAAuC;AACxE,UAAM,cAAc,KAAK,KAAK,qCAAqC;AACnE,iBAAa,KAAK,IAAI,cAAc,GAAG;AACvC,iBAAa,KAAK,IAAI,WAAW,GAAG;AAAA,EACvC;AAGA,QAAM,sBAAsB;AAAA;AAAA;AAAA,cAGhB,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuDnC,gBAAc,KAAK,QAAQ,oBAAoB,GAAG,mBAAmB;AAGrE,QAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO3B,gBAAc,KAAK,QAAQ,mBAAmB,GAAG,kBAAkB;AAGnE,QAAM,mBAAmB;AAAA,IACvB,OAAO;AAAA,IACP,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,EAC3B;AAEA,QAAM,sBAAsB;AAAA,IAC1B,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,MAAM;AAAA,EACR;AAEA,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA;AAAA,IAEN,cAAc,aAAa,CAAC,IAAI;AAAA,IAChC,iBAAiB,aAAa,CAAC,IAAI;AAAA,EACrC;AAEA,gBAAc,KAAK,QAAQ,cAAc,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAGhF,QAAM,WAAW;AAAA,IACf,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,yBAAyB;AAAA,MACzB,KAAK,CAAC,UAAU,OAAO,cAAc;AAAA,MACrC,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,4BAA4B;AAAA,MAC5B,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,4BAA4B;AAAA,IAC9B;AAAA,IACA,SAAS,CAAC,KAAK;AAAA,EACjB;AAEA,gBAAc,KAAK,QAAQ,eAAe,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAChF;AAEO,SAAS,yBAAyB,QAAgB,QAAqB,WAAqB;AAEjG,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKD,WAAmB,SAAS,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQvD,gBAAc,KAAK,QAAQ,YAAY,GAAG,IAAI;AAG9C,QAAM,SAAS,KAAK,QAAQ,KAAK;AACjC,YAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAGrC,QAAM,aAAa,KAAK,QAAQ,SAAS;AACzC,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,QAAM,gBAA0B,CAAC;AACjC,QAAM,kBAA4B,CAAC;AAEnC,SAAO,QAAQ,CAAC,OAAO,UAAU;AAC/B,UAAM,gBAAgB,SAAS,KAAK;AACpC,UAAM,iBAAiB,OAAO,KAAK;AAGnC;AAAA,MACE,KAAK,YAAY,cAAc;AAAA,MAC/B,KAAK,UAAU,MAAM,QAAQ,MAAM,CAAC;AAAA,IACtC;AAGA,kBAAc,KAAK,UAAU,aAAa,oBAAoB,cAAc,IAAI;AAGhF,oBAAgB,KAAK,wBAAwB,MAAM,IAAI,sCAAsC,aAAa,UAAU;AAAA,EACtH,CAAC;AAGD,QAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyEzB,gBAAc,KAAK,QAAQ,oBAAoB,GAAG,gBAAgB;AAGlE,QAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAchB,gBAAc,KAAK,QAAQ,UAAU,GAAG,OAAO;AAG/C,MAAI,eAAe;AACnB,MAAI,qBAAqB;AACzB,MAAI,mBAAmB;AAEvB,MAAI,WAAW;AAMX,UAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoLnB,kBAAc,KAAK,QAAQ,YAAY,GAAG,UAAU;AAEpD,mBAAe;AAAA,oBAAwD,KAAK,UAAU,SAAS,CAAC;AAChG,yBAAqB;AACrB,uBAAmB;AAAA,EACvB;AAGA,QAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUf,cAAc,KAAK,IAAI,CAAC;AAAA,EACxB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,QAKN,kBAAkB;AAAA;AAAA,EAExB,gBAAgB,KAAK,IAAI,CAAC;AAAA;AAAA,QAEpB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOtB,gBAAc,KAAK,QAAQ,SAAS,GAAG,MAAM;AAG7C,QAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsEjB,gBAAc,KAAK,QAAQ,WAAW,GAAG,QAAQ;AAEjD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,aAAa,WAAW,KAAK,KAAK,qBAAqB,CAAC;AAI9D,QAAM,eAAe,CAAC,kBAAkB,mCAAmC;AAC3E,MAAI,YAAY;AACb,UAAM,iBAAiB,KAAK,KAAK,uCAAuC;AACxE,UAAM,cAAc,KAAK,KAAK,qCAAqC;AACnE,iBAAa,KAAK,IAAI,cAAc,GAAG;AACvC,iBAAa,KAAK,IAAI,WAAW,GAAG;AAAA,EACvC;AAGA,QAAM,iBAAiB;AAAA;AAAA;AAAA,cAGX,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuDnC,gBAAc,KAAK,QAAQ,oBAAoB,GAAG,cAAc;AAGhE,QAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOtB,gBAAc,KAAK,QAAQ,mBAAmB,GAAG,aAAa;AAG9D,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,MACpB,yBAAyB;AAAA,IAC3B;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,wBAAwB;AAAA,MACxB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,MAAM;AAAA,IACR;AAAA,EACF;AAEA,gBAAc,KAAK,QAAQ,cAAc,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAGhF,QAAM,WAAW;AAAA,IACf,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,yBAAyB;AAAA,MACzB,KAAK,CAAC,UAAU,OAAO,cAAc;AAAA,MACrC,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,4BAA4B;AAAA,MAC5B,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,4BAA4B;AAAA,IAC9B;AAAA,IACA,SAAS,CAAC,KAAK;AAAA,EACjB;AAEA,gBAAc,KAAK,QAAQ,eAAe,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAChF;;;AD99BA,eAAsB,MAAM,YAAoB,SAAuB;AACrE,QAAM,MAAM,QAAQ,IAAI;AAGxB,QAAM,WAAWC,MAAK,KAAK,OAAO;AAClC,QAAM,cAAcC,YAAW,QAAQ;AAEvC,MAAI,SAAsB,CAAC;AAC3B,MAAI,SAAkB;AACtB,MAAI,uBAAuB;AAE3B,MAAI,aAAa;AAEf,YAAQ,IAAIC,OAAM,KAAK,iEAA0D,CAAC;AAClF,aAAS,mBAAmB,QAAQ;AACpC,2BAAuB;AAEvB,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,YAAQ,IAAIA,OAAM,MAAM,gBAAW,OAAO,MAAM,WAAW,CAAC;AAC5D,WAAO,QAAQ,WAAS;AACtB,cAAQ,IAAIA,OAAM,IAAI,KAAK,MAAM,IAAI,WAAM,SAAS,KAAK,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC7E,CAAC;AAAA,EACH,OAAO;AAEL,UAAM,iBAAiB,QAAQ,KAAK,UAAU;AAG9C,QAAI,CAACD,YAAW,cAAc,GAAG;AAC/B,YAAM,IAAI,MAAM,0BAA0B,UAAU;AAAA,+CAAkD;AAAA,IACxG;AAEA,YAAQ,IAAIC,OAAM,KAAK,2BAAoB,GAAGA,OAAM,KAAK,UAAU,CAAC;AAGpE,QAAI;AACF,eAAS,gBAAgB,cAAc;AAAA,IACzC,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE;AAAA,IAC1F;AAAA,EACF;AAGA,QAAM,SAASF,MAAK,KAAK,eAAe;AACxC,EAAAG,WAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAGrC,MAAI,sBAAsB;AACxB,6BAAyB,QAAQ,MAAM;AAAA,EACzC,OAAO;AACL,kBAAc,QAAQ,MAAM;AAAA,EAC9B;AAGA,UAAQ,IAAID,OAAM,KAAK,sCAA+B,CAAC;AACvD,UAAQ,IAAIA,OAAM,IAAI,0CAA0C,CAAC;AACjE,MAAI;AACF,aAAS,yCAAyC;AAAA,MAChD,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AACD,YAAQ,IAAIA,OAAM,MAAM,+BAA0B,CAAC;AAAA,EACrD,QAAQ;AACN,UAAM,IAAI,MAAM,sFAAsF;AAAA,EACxG;AAEA,UAAQ,IAAIA,OAAM,MAAM,mCAA8B,CAAC;AACvD,UAAQ,IAAIA,OAAM,KAAK,4CAAqC,CAAC;AAG7D,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,MAAM,SAAS,QAAQ,IAAI;AAAA,MAC3B,MAAM,QAAQ;AAAA,MACd,MAAM;AAAA,IACR;AAAA,IACA,SAAS,CAAC,MAAM,CAAC;AAAA,EACnB;AAGA,QAAM,SAAS,MAAM,aAAa,UAAU;AAE5C,QAAM,OAAO,OAAO;AAEpB,QAAM,EAAE,MAAM,KAAK,IAAI,OAAO,OAAO;AACrC,QAAM,WAAW,OAAO,OAAO,OAAO,QAAQ,UAAU;AACxD,QAAM,cAAc,SAAS,YAAY,cAAc;AAEvD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,MAAM,qCAAgC,CAAC;AACzD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,aAAa,IAAIA,OAAM,KAAK,GAAG,QAAQ,MAAM,WAAW,IAAI,IAAI,EAAE,CAAC;AAC1F,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,IAAI,mCAAmC,CAAC;AAC1D,UAAQ,IAAI;AACd;;;AE/GA,SAAS,cAAAE,aAAY,iBAAAC,gBAAe,aAAAC,kBAAiB;AACrD,SAAS,QAAAC,aAAY;AACrB,OAAOC,YAAW;AAMlB,IAAM,YAAY;AAAA,EAChB,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,YACP,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,MAAM;AAAA,YACN,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,aAAa;AAAA,gBACb,UAAU;AAAA,cACZ;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,aAAa;AAAA,gBACb,UAAU;AAAA,cACZ;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,YACP,WAAW;AAAA,YACX,aAAa;AAAA,YACb,UAAU;AAAA,UACZ;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,YACP,WAAW;AAAA,YACX,aAAa;AAAA,UACf;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,YACb,MAAM;AAAA,UACR;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,WAAW;AAAA,cACb;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,WAAW;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,MACJ;AAAA,QACE,MAAM;AAAA,QACN,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,YAAY;AAAA,cAC7C;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,MAAM;AAAA,YACN,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,MAAM;AAAA,kBACJ;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,gBAAgB;AAAA,oBACjD;AAAA,kBACF;AAAA,kBACA;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ;AAAA,wBACE,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,aAAa;AAAA,sBAC9C;AAAA,sBACA;AAAA,wBACE,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,yBAAyB;AAAA,sBAC1D;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,MAAM;AAAA,kBACJ;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,eAAe;AAAA,oBAChD;AAAA,kBACF;AAAA,kBACA;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ;AAAA,wBACE,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,SAAS;AAAA,sBAC1C;AAAA,sBACA;AAAA,wBACE,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,0BAA0B;AAAA,sBAC3D;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,MAAM;AAAA,kBACJ;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,QAAQ;AAAA,oBACzC;AAAA,kBACF;AAAA,kBACA;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ;AAAA,wBACE,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,UAAU;AAAA,sBAC3C;AAAA,sBACA;AAAA,wBACE,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,uBAAuB;AAAA,sBACxD;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,MAAM;AAAA,kBACJ;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,aAAa;AAAA,oBAC9C;AAAA,kBACF;AAAA,kBACA;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ;AAAA,wBACE,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,OAAO;AAAA,sBACxC;AAAA,sBACA;AAAA,wBACE,MAAM;AAAA,wBACN,WAAW;AAAA,wBACX,MAAM,EAAE,MAAM,QAAQ,SAAS,uBAAuB;AAAA,sBACxD;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,WAAW;AAAA,YACX,OAAO;AAAA,YACP,aAAa;AAAA,YACb,MAAM;AAAA,cACJ,MAAM;AAAA,cACN,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ;AAAA,kBACE,MAAM;AAAA,kBACN,WAAW;AAAA,kBACX,MAAM;AAAA,oBACJ;AAAA,sBACE,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,MAAM;AAAA,wBACJ;AAAA,0BACE,MAAM;AAAA,0BACN,WAAW;AAAA,0BACX,MAAM,EAAE,MAAM,QAAQ,SAAS,wBAAwB;AAAA,wBACzD;AAAA,wBACA;AAAA,0BACE,MAAM;AAAA,0BACN,WAAW;AAAA,0BACX,MAAM,EAAE,MAAM,QAAQ,SAAS,gBAAgB;AAAA,wBACjD;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,MAAM;AAAA,kBACN,WAAW;AAAA,kBACX,MAAM;AAAA,oBACJ;AAAA,sBACE,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,MAAM;AAAA,wBACJ;AAAA,0BACE,MAAM;AAAA,0BACN,WAAW;AAAA,0BACX,MAAM,EAAE,MAAM,QAAQ,SAAS,mBAAmB;AAAA,wBACpD;AAAA,wBACA;AAAA,0BACE,MAAM;AAAA,0BACN,WAAW;AAAA,0BACX,MAAM,EAAE,MAAM,QAAQ,SAAS,iBAAiB;AAAA,wBAClD;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,MAAM;AAAA,kBACN,WAAW;AAAA,kBACX,MAAM;AAAA,oBACJ;AAAA,sBACE,MAAM;AAAA,sBACN,WAAW;AAAA,sBACX,MAAM;AAAA,wBACJ;AAAA,0BACE,MAAM;AAAA,0BACN,WAAW;AAAA,0BACX,MAAM,EAAE,MAAM,QAAQ,SAAS,mBAAmB;AAAA,wBACpD;AAAA,wBACA;AAAA,0BACE,MAAM;AAAA,0BACN,WAAW;AAAA,0BACX,MAAM,EAAE,MAAM,QAAQ,SAAS,aAAa;AAAA,wBAC9C;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,KAAK,MAAc,SAAsB;AAC7D,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,aAAaD,MAAK,KAAK,IAAI;AAGjC,MAAIH,YAAW,UAAU,KAAK,SAAS,KAAK;AAC1C,UAAM,IAAI,MAAM,cAAc,IAAI,mDAAmD;AAAA,EACvF;AAEA,QAAM,YAAY,SAAS,MAAM,MAAM;AAGvC,MAAI,SAAS,KAAK;AAChB,IAAAE,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AAEA,UAAQ,IAAIE,OAAM,KAAK,6CAAsC,CAAC;AAC9D,UAAQ,IAAIA,OAAM,IAAI,gBAAgB,QAAQ,QAAQ,EAAE,CAAC;AACzD,UAAQ,IAAI;AAGZ,QAAM,WAAW,UAAU,QAAQ,QAAkC;AACrE,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,qBAAqB,QAAQ,QAAQ;AAAA,uBAA0B,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,IAClG;AAAA,EACF;AAGA,QAAM,aAAaD,MAAK,WAAW,UAAU;AAC7C,EAAAF,eAAc,YAAY,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAE3D,UAAQ,IAAIG,OAAM,MAAM,yBAAoB,CAAC;AAG7C,QAAM,SAAS,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CxB,EAAAH,eAAcE,MAAK,WAAW,WAAW,GAAG,MAAM;AAClD,UAAQ,IAAIC,OAAM,MAAM,0BAAqB,CAAC;AAG9C,QAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAOlB,EAAAH,eAAcE,MAAK,WAAW,YAAY,GAAG,SAAS;AACtD,UAAQ,IAAIC,OAAM,MAAM,2BAAsB,CAAC;AAE/C,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,MAAM,0CAAqC,CAAC;AAC9D,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,aAAa,CAAC;AACrC,UAAQ,IAAI;AACZ,MAAI,SAAS,KAAK;AAChB,YAAQ,IAAIA,OAAM,KAAK,QAAQ,IAAI,EAAE,CAAC;AAAA,EACxC;AACA,UAAQ,IAAIA,OAAM,KAAK,2BAA2B,CAAC;AACnD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,IAAI,8DAA8D,CAAC;AACrF,UAAQ,IAAI;AACd;","names":["existsSync","mkdirSync","join","chalk","join","existsSync","chalk","mkdirSync","existsSync","writeFileSync","mkdirSync","join","chalk"]}
1
+ {"version":3,"sources":["../src/commands/serve.ts","../src/utils/app-generator.ts","../src/commands/init.ts"],"sourcesContent":["/**\n * ObjectUI\n * Copyright (c) 2024-present ObjectStack Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { createServer } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport { existsSync, mkdirSync } from 'fs';\nimport { join, resolve, relative } from 'path';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { scanPagesDirectory, createTempAppWithRouting, createTempApp, parseSchemaFile, type RouteInfo } from '../utils/app-generator.js';\n\ninterface ServeOptions {\n port: string;\n host: string;\n}\n\nexport async function serve(schemaPath: string, options: ServeOptions) {\n const cwd = process.cwd();\n \n // Check if pages directory exists for file-system routing\n const pagesDir = join(cwd, 'pages');\n const hasPagesDir = existsSync(pagesDir);\n \n let routes: RouteInfo[] = [];\n let schema: unknown = null;\n let useFileSystemRouting = false;\n\n if (hasPagesDir) {\n // File-system based routing\n console.log(chalk.blue('📁 Detected pages/ directory - using file-system routing'));\n routes = scanPagesDirectory(pagesDir);\n useFileSystemRouting = true;\n \n if (routes.length === 0) {\n throw new Error('No schema files found in pages/ directory');\n }\n \n console.log(chalk.green(`✓ Found ${routes.length} route(s)`));\n routes.forEach(route => {\n console.log(chalk.dim(` ${route.path} → ${relative(cwd, route.filePath)}`));\n });\n } else {\n // Single schema file mode\n const fullSchemaPath = resolve(cwd, schemaPath);\n\n // Check if schema file exists\n if (!existsSync(fullSchemaPath)) {\n throw new Error(`Schema file not found: ${schemaPath}\\nRun 'objectui init' to create a sample schema.`);\n }\n\n console.log(chalk.blue('📋 Loading schema:'), chalk.cyan(schemaPath));\n\n // Read and validate schema\n try {\n schema = parseSchemaFile(fullSchemaPath);\n } catch (error) {\n throw new Error(`Invalid schema file: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Create temporary app directory\n const tmpDir = join(cwd, '.objectui-tmp');\n mkdirSync(tmpDir, { recursive: true });\n\n // Create temporary app files\n if (useFileSystemRouting) {\n createTempAppWithRouting(tmpDir, routes);\n } else {\n createTempApp(tmpDir, schema);\n }\n\n // Install dependencies\n console.log(chalk.blue('📦 Installing dependencies...'));\n console.log(chalk.dim(' This may take a moment on first run...'));\n try {\n execSync('npm install --silent --prefer-offline', { \n cwd: tmpDir, \n stdio: 'inherit',\n });\n console.log(chalk.green('✓ Dependencies installed'));\n } catch {\n throw new Error('Failed to install dependencies. Please check your internet connection and try again.');\n }\n\n console.log(chalk.green('✓ Schema loaded successfully'));\n console.log(chalk.blue('🚀 Starting development server...\\n'));\n\n // Create Vite config\n const viteConfig = {\n root: tmpDir,\n server: {\n port: parseInt(options.port),\n host: options.host,\n open: true,\n },\n plugins: [react()],\n };\n\n // Create Vite server\n const server = await createServer(viteConfig);\n\n await server.listen();\n\n const { port, host } = server.config.server;\n const protocol = server.config.server.https ? 'https' : 'http';\n const displayHost = host === '0.0.0.0' ? 'localhost' : host;\n\n console.log();\n console.log(chalk.green('✓ Server started successfully!'));\n console.log();\n console.log(chalk.bold(' Local: ') + chalk.cyan(`${protocol}://${displayHost}:${port}`));\n console.log();\n console.log(chalk.dim(' Press Ctrl+C to stop the server'));\n console.log();\n}\n","/**\n * ObjectUI\n * Copyright (c) 2024-present ObjectStack Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, readdirSync, statSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport * as yaml from 'js-yaml';\n\nexport interface RouteInfo {\n path: string;\n filePath: string;\n schema: unknown;\n isDynamic: boolean;\n paramName?: string;\n}\n\n// Helper function to check if a file is a supported schema file\nexport function isSupportedSchemaFile(filename: string): boolean {\n return filename.endsWith('.json') || \n filename.endsWith('.yml') ||\n filename.endsWith('.yaml');\n}\n\n// Helper function to extract the base filename without extension\nexport function getBaseFileName(filename: string): string {\n // Remove supported extensions\n return filename\n .replace(/\\.(json|yml|yaml)$/, '');\n}\n\n// Helper function to parse schema file (JSON or YAML)\nexport function parseSchemaFile(filePath: string): unknown {\n const content = readFileSync(filePath, 'utf-8');\n \n if (filePath.endsWith('.json')) {\n return JSON.parse(content);\n } else if (filePath.endsWith('.yml') || filePath.endsWith('.yaml')) {\n return yaml.load(content);\n }\n \n throw new Error(`Unsupported file format: ${filePath}`);\n}\n\nexport function scanPagesDirectory(pagesDir: string): RouteInfo[] {\n const routes: RouteInfo[] = [];\n \n const scanDir = (dir: string, routePrefix: string = '') => {\n const entries = readdirSync(dir);\n \n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n \n if (stat.isDirectory()) {\n // Recursively scan subdirectories\n const newPrefix = routePrefix + '/' + entry;\n scanDir(fullPath, newPrefix);\n } else if (isSupportedSchemaFile(entry)) {\n // Process schema file\n const fileName = getBaseFileName(entry);\n let routePath: string;\n let isDynamic = false;\n let paramName: string | undefined;\n \n if (fileName === 'index') {\n // index.schema.json or index.page.json maps to the directory path\n routePath = routePrefix || '/';\n } else if (fileName.startsWith('[') && fileName.endsWith(']')) {\n // Dynamic route: [id].schema.json -> /:id\n paramName = fileName.slice(1, -1);\n routePath = routePrefix + '/:' + paramName;\n isDynamic = true;\n } else {\n // Regular file: about.schema.json -> /about\n routePath = routePrefix + '/' + fileName;\n }\n \n // Read and parse schema\n try {\n const schema = parseSchemaFile(fullPath);\n \n routes.push({\n path: routePath,\n filePath: fullPath,\n schema,\n isDynamic,\n paramName,\n });\n } catch (error) {\n console.warn(chalk.yellow(`⚠ Warning: Failed to parse ${fullPath}: ${error instanceof Error ? error.message : error}`));\n }\n }\n }\n };\n \n scanDir(pagesDir);\n \n // Sort routes: exact routes first, then dynamic routes\n routes.sort((a, b) => {\n if (a.isDynamic && !b.isDynamic) return 1;\n if (!a.isDynamic && b.isDynamic) return -1;\n return a.path.localeCompare(b.path);\n });\n \n return routes;\n}\n\nexport function createTempApp(tmpDir: string, schema: unknown) {\n // Create index.html\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Object UI App</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>`;\n\n writeFileSync(join(tmpDir, 'index.html'), html);\n\n // Create src directory\n const srcDir = join(tmpDir, 'src');\n mkdirSync(srcDir, { recursive: true });\n\n // Create main.tsx\n const mainTsx = `import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport './index.css';\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>\n);`;\n\n writeFileSync(join(srcDir, 'main.tsx'), mainTsx);\n\n // Create App.tsx\n const appTsx = `import { SchemaRenderer } from '@object-ui/react';\nimport '@object-ui/components';\nimport '@object-ui/plugin-charts';\nimport '@object-ui/plugin-editor';\nimport '@object-ui/plugin-kanban';\nimport '@object-ui/plugin-markdown';\nimport '@object-ui/plugin-form';\nimport '@object-ui/plugin-grid';\nimport '@object-ui/plugin-view';\n\nconst schema = ${JSON.stringify(schema, null, 2)};\n\nfunction App() {\n return <SchemaRenderer schema={schema} />;\n}\n\nexport default App;`;\n\n writeFileSync(join(srcDir, 'App.tsx'), appTsx);\n\n // Create index.css\n const indexCss = `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --accent: 210 40% 96.1%;\n --accent-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 222.2 84% 4.9%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n\n .dark {\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --card: 222.2 84% 4.9%;\n --card-foreground: 210 40% 98%;\n --popover: 222.2 84% 4.9%;\n --popover-foreground: 210 40% 98%;\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 11.2%;\n --secondary: 217.2 32.6% 17.5%;\n --secondary-foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --accent: 217.2 32.6% 17.5%;\n --accent-foreground: 210 40% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n --border: 217.2 32.6% 17.5%;\n --input: 217.2 32.6% 17.5%;\n --ring: 212.7 26.8% 83.9%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}`;\n\n writeFileSync(join(srcDir, 'index.css'), indexCss);\n\n // Create tailwind.config.js\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\nexport default {\n darkMode: ['class'],\n content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],\n theme: {\n extend: {\n borderRadius: {\n lg: 'var(--radius)',\n md: 'calc(var(--radius) - 2px)',\n sm: 'calc(var(--radius) - 4px)',\n },\n colors: {\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n chart: {\n 1: 'hsl(var(--chart-1))',\n 2: 'hsl(var(--chart-2))',\n 3: 'hsl(var(--chart-3))',\n 4: 'hsl(var(--chart-4))',\n 5: 'hsl(var(--chart-5))',\n },\n },\n },\n },\n plugins: [],\n};`;\n\n const cwd = process.cwd();\n const isMonorepo = existsSync(join(cwd, 'pnpm-workspace.yaml'));\n\n // Define Tailwind Content Paths\n // Include JSON files specifically\n const contentPaths = [\"'./index.html'\", \"'./src/**/*.{js,ts,jsx,tsx,json}'\"];\n if (isMonorepo) {\n const componentsPath = join(cwd, 'packages/components/src/**/*.{ts,tsx}');\n const pluginsPath = join(cwd, 'packages/plugin-*/src/**/*.{ts,tsx}');\n contentPaths.push(`'${componentsPath}'`);\n contentPaths.push(`'${pluginsPath}'`); \n }\n\n // Create tailwind.config.js\n const finalTailwindConfig = `/** @type {import('tailwindcss').Config} */\nexport default {\n darkMode: ['class'],\n content: [${contentPaths.join(', ')}],\n theme: {\n extend: {\n borderRadius: {\n lg: 'var(--radius)',\n md: 'calc(var(--radius) - 2px)',\n sm: 'calc(var(--radius) - 4px)',\n },\n colors: {\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n chart: {\n 1: 'hsl(var(--chart-1))',\n 2: 'hsl(var(--chart-2))',\n 3: 'hsl(var(--chart-3))',\n 4: 'hsl(var(--chart-4))',\n 5: 'hsl(var(--chart-5))',\n },\n },\n },\n },\n plugins: [],\n};`;\n\n writeFileSync(join(tmpDir, 'tailwind.config.js'), finalTailwindConfig);\n\n // Create postcss.config.js\n const finalPostcssConfig = `export default {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n};`;\n \n writeFileSync(join(tmpDir, 'postcss.config.js'), finalPostcssConfig);\n\n // Create package.json\n const baseDependencies = {\n react: '^18.3.1',\n 'react-dom': '^18.3.1',\n '@object-ui/react': '^0.1.0',\n '@object-ui/components': '^0.1.0',\n };\n\n const baseDevDependencies = {\n '@types/react': '^18.3.12',\n '@types/react-dom': '^18.3.1',\n '@vitejs/plugin-react': '^4.2.1',\n autoprefixer: '^10.4.23',\n postcss: '^8.5.6',\n tailwindcss: '^3.4.19',\n typescript: '~5.7.3',\n vite: '^5.0.0',\n };\n\n const packageJson = {\n name: 'objectui-temp-app',\n private: true,\n type: 'module',\n // In monorepo, we use root node_modules, so we don't need dependencies here\n dependencies: isMonorepo ? {} : baseDependencies,\n devDependencies: isMonorepo ? {} : baseDevDependencies,\n };\n\n writeFileSync(join(tmpDir, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n };\n\n writeFileSync(join(tmpDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));\n}\n\nexport function createTempAppWithRouting(tmpDir: string, routes: RouteInfo[], appConfig?: unknown) {\n // Create index.html\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${(appConfig as any)?.title || 'Object UI App'}</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>`;\n\n writeFileSync(join(tmpDir, 'index.html'), html);\n\n // Create src directory\n const srcDir = join(tmpDir, 'src');\n mkdirSync(srcDir, { recursive: true });\n\n // Create schemas directory and copy all schemas\n const schemasDir = join(srcDir, 'schemas');\n mkdirSync(schemasDir, { recursive: true });\n \n const schemaImports: string[] = [];\n const routeComponents: string[] = [];\n \n routes.forEach((route, index) => {\n const schemaVarName = `schema${index}`;\n const schemaFileName = `page${index}.json`;\n \n // Write schema to schemas directory\n writeFileSync(\n join(schemasDir, schemaFileName),\n JSON.stringify(route.schema, null, 2)\n );\n \n // Add import statement\n schemaImports.push(`import ${schemaVarName} from './schemas/${schemaFileName}';`);\n \n // Add route component\n routeComponents.push(` <Route path=\"${route.path}\" element={<SchemaRenderer schema={${schemaVarName}} />} />`);\n });\n\n // Create theme-provider.tsx\n const themeProviderTsx = `import { createContext, useContext, useEffect, useState } from \"react\"\n\ntype Theme = \"dark\" | \"light\" | \"system\"\n\ntype ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n}\n\ntype ThemeProviderState = {\n theme: Theme\n setTheme: (theme: Theme) => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"system\",\n setTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"vite-ui-theme\",\n ...props\n}: ThemeProviderProps) {\n const [theme, setTheme] = useState<Theme>(\n () => (localStorage.getItem(storageKey) as Theme) || defaultTheme\n )\n\n useEffect(() => {\n const root = window.document.documentElement\n\n root.classList.remove(\"light\", \"dark\")\n\n if (theme === \"system\") {\n const systemTheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\"\n\n root.classList.add(systemTheme)\n return\n }\n\n root.classList.add(theme)\n }, [theme])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n localStorage.setItem(storageKey, theme)\n setTheme(theme)\n },\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const context = useContext(ThemeProviderContext)\n\n if (context === undefined)\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n\n return context\n}`;\n writeFileSync(join(srcDir, 'theme-provider.tsx'), themeProviderTsx);\n\n // Create main.tsx\n const mainTsx = `import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport './index.css';\nimport { ThemeProvider } from \"./theme-provider\"\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <ThemeProvider defaultTheme=\"dark\" storageKey=\"vite-ui-theme\">\n <App />\n </ThemeProvider>\n </React.StrictMode>\n);`;\n\n writeFileSync(join(srcDir, 'main.tsx'), mainTsx);\n\n // Generate Layout Code if appConfig is present\n let layoutImport = '';\n let layoutWrapperStart = '';\n let layoutWrapperEnd = '';\n \n if (appConfig) {\n // Very basic Layout implementation for now\n // Logic: If appConfig is present, current version assumes it's just a config object, \n // but we need a Layout component that renders navigation.\n // Since we don't have a Layout component in @object-ui/components yet, we generate a simple one.\n\n const layoutCode = `\nimport { Link, useLocation } from 'react-router-dom';\nimport * as LucideIcons from 'lucide-react';\nimport { Moon, Sun } from \"lucide-react\"\nimport { useTheme } from \"./theme-provider\"\nimport { \n cn,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n SidebarProvider,\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarHeader,\n SidebarRail,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n SidebarMenuSub,\n SidebarMenuSubItem,\n SidebarMenuSubButton,\n SidebarInset,\n SidebarTrigger,\n Separator,\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent\n} from '@object-ui/components'; \n\nconst DynamicIcon = ({ name, className }) => {\n // @ts-expect-error - Dynamic icon lookup from Lucide icons\n const Icon = LucideIcons[name];\n if (!Icon) return null;\n return <Icon className={className} />;\n};\n\nexport function ModeToggle() {\n const { setTheme } = useTheme()\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton size=\"lg\" className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\">\n <div className=\"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\n <Sun className=\"h-4 w-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute h-4 w-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">Switch Theme</span>\n <span className=\"truncate text-xs\">Light / Dark</span>\n </div>\n <LucideIcons.ChevronsUpDown className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg\" side=\"bottom\" align=\"end\" sideOffset={4}>\n <DropdownMenuItem onClick={() => setTheme(\"light\")}>\n <LucideIcons.Sun className=\"mr-2 size-4\" />\n Light\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"dark\")}>\n <LucideIcons.Moon className=\"mr-2 size-4\" />\n Dark\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"system\")}>\n <LucideIcons.Monitor className=\"mr-2 size-4\" />\n System\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nconst AppLayout = ({ app, children }) => {\n const location = useLocation();\n const menu = app.menu || [];\n \n return (\n <SidebarProvider>\n <Sidebar collapsible=\"icon\">\n <SidebarHeader>\n <div className=\"flex items-center gap-2 px-2 py-2\">\n <div className=\"flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground\">\n {app.logo && <DynamicIcon name={app.logo} className=\"size-4\" />}\n {!app.logo && <span className=\"text-xl font-bold\">O</span>}\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-semibold\">{app.title || \"Object UI\"}</span>\n <span className=\"truncate text-xs\">Showcase</span>\n </div>\n </div>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>\n <SidebarMenu>\n {menu.map((item, idx) => {\n // Collapsible Item (Children present)\n if (item.children && item.children.length > 0) {\n const isActive = item.children.some(child => child.path === location.pathname);\n return (\n <Collapsible key={idx} asChild defaultOpen={isActive} className=\"group/collapsible\">\n <SidebarMenuItem>\n <CollapsibleTrigger asChild>\n <SidebarMenuButton tooltip={item.label}>\n {item.icon && <DynamicIcon name={item.icon} />}\n <span>{item.label}</span>\n <DynamicIcon name=\"ChevronRight\" className=\"ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90\" />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n {item.children.map((child, cIdx) => (\n <SidebarMenuSubItem key={cIdx}>\n <SidebarMenuSubButton asChild isActive={location.pathname === child.path}>\n <Link to={child.path || '#'}>\n <span>{child.label}</span>\n </Link>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n ))}\n </SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n );\n }\n\n // Single Item\n if (item.path) {\n return (\n <SidebarMenuItem key={idx}>\n <SidebarMenuButton asChild isActive={location.pathname === item.path} tooltip={item.label}>\n <Link to={item.path}>\n {item.icon && <DynamicIcon name={item.icon} />}\n <span>{item.label}</span>\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n );\n }\n return null;\n })}\n </SidebarMenu>\n </SidebarGroup>\n </SidebarContent>\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem>\n <ModeToggle />\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n <SidebarRail />\n </Sidebar>\n \n <SidebarInset>\n <header className=\"flex h-16 shrink-0 items-center gap-2 border-b bg-background px-4\">\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\n <div className=\"flex flex-1 items-center justify-between\">\n <span className=\"font-medium\">{app.title}</span>\n </div>\n </header>\n <div className=\"flex-1 flex flex-col min-h-0 bg-muted/20 p-4\">\n <div className=\"mx-auto max-w-full w-full\">\n {children}\n </div>\n </div>\n </SidebarInset>\n </SidebarProvider>\n );\n};\n\nexport default AppLayout;\n`;\n writeFileSync(join(srcDir, 'Layout.tsx'), layoutCode);\n \n layoutImport = `import AppLayout from './Layout';\\nconst appConfig = ${JSON.stringify(appConfig)};`;\n layoutWrapperStart = `<AppLayout app={appConfig}>`;\n layoutWrapperEnd = `</AppLayout>`;\n }\n\n // Create App.tsx with routing\n const appTsx = `import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';\nimport { SchemaRenderer } from '@object-ui/react';\nimport '@object-ui/components';\nimport '@object-ui/plugin-charts';\nimport '@object-ui/plugin-editor';\nimport '@object-ui/plugin-kanban';\nimport '@object-ui/plugin-markdown';\nimport '@object-ui/plugin-form';\nimport '@object-ui/plugin-grid';\nimport '@object-ui/plugin-view';\n${schemaImports.join('\\n')}\n${layoutImport}\n\nfunction App() {\n return (\n <BrowserRouter>\n ${layoutWrapperStart}\n <Routes>\n${routeComponents.join('\\n')}\n </Routes>\n ${layoutWrapperEnd}\n </BrowserRouter>\n );\n}\n\nexport default App;`;\n\n writeFileSync(join(srcDir, 'App.tsx'), appTsx);\n\n // Create index.css with Tailwind\n const indexCss = `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 222.2 84% 4.9%;\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n --accent: 210 40% 96.1%;\n --accent-foreground: 222.2 47.4% 11.2%;\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n --ring: 222.2 84% 4.9%;\n --radius: 0.5rem;\n --chart-1: 12 76% 61%;\n --chart-2: 173 58% 39%;\n --chart-3: 197 37% 24%;\n --chart-4: 43 74% 66%;\n --chart-5: 27 87% 67%;\n }\n\n .dark {\n --background: 222.2 84% 4.9%;\n --foreground: 210 40% 98%;\n --card: 222.2 84% 4.9%;\n --card-foreground: 210 40% 98%;\n --popover: 222.2 84% 4.9%;\n --popover-foreground: 210 40% 98%;\n --primary: 210 40% 98%;\n --primary-foreground: 222.2 47.4% 11.2%;\n --secondary: 217.2 32.6% 17.5%;\n --secondary-foreground: 210 40% 98%;\n --muted: 217.2 32.6% 17.5%;\n --muted-foreground: 215 20.2% 65.1%;\n --accent: 217.2 32.6% 17.5%;\n --accent-foreground: 210 40% 98%;\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 210 40% 98%;\n --border: 217.2 32.6% 17.5%;\n --input: 217.2 32.6% 17.5%;\n --ring: 212.7 26.8% 83.9%;\n --chart-1: 220 70% 50%;\n --chart-2: 160 60% 45%;\n --chart-3: 30 80% 55%;\n --chart-4: 280 65% 60%;\n --chart-5: 340 75% 55%;\n }\n}\n\n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground font-sans antialiased min-h-screen;\n }\n}`;\n\n writeFileSync(join(srcDir, 'index.css'), indexCss);\n\n const cwd = process.cwd();\n const isMonorepo = existsSync(join(cwd, 'pnpm-workspace.yaml'));\n\n // Define Tailwind Content Paths\n // Include JSON files specifically\n const contentPaths = [\"'./index.html'\", \"'./src/**/*.{js,ts,jsx,tsx,json}'\"];\n if (isMonorepo) {\n const componentsPath = join(cwd, 'packages/components/src/**/*.{ts,tsx}');\n const pluginsPath = join(cwd, 'packages/plugin-*/src/**/*.{ts,tsx}');\n contentPaths.push(`'${componentsPath}'`);\n contentPaths.push(`'${pluginsPath}'`); \n }\n\n // Create tailwind.config.js\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\nexport default {\n darkMode: ['class'],\n content: [${contentPaths.join(', ')}],\n theme: {\n extend: {\n borderRadius: {\n lg: 'var(--radius)',\n md: 'calc(var(--radius) - 2px)',\n sm: 'calc(var(--radius) - 4px)',\n },\n colors: {\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n chart: {\n 1: 'hsl(var(--chart-1))',\n 2: 'hsl(var(--chart-2))',\n 3: 'hsl(var(--chart-3))',\n 4: 'hsl(var(--chart-4))',\n 5: 'hsl(var(--chart-5))',\n },\n },\n },\n },\n plugins: [],\n};`;\n\n writeFileSync(join(tmpDir, 'tailwind.config.js'), tailwindConfig);\n\n // Create postcss.config.js\n const postcssConfig = `export default {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n};`;\n \n writeFileSync(join(tmpDir, 'postcss.config.js'), postcssConfig);\n\n // Create package.json with react-router-dom\n const packageJson = {\n name: 'objectui-temp-app',\n private: true,\n type: 'module',\n dependencies: {\n react: '^18.3.1',\n 'react-dom': '^18.3.1',\n 'react-router-dom': '^7.12.0',\n '@object-ui/react': '^0.1.0',\n '@object-ui/components': '^0.1.0',\n },\n devDependencies: {\n '@types/react': '^18.3.12',\n '@types/react-dom': '^18.3.1',\n '@vitejs/plugin-react': '^4.2.1',\n autoprefixer: '^10.4.23',\n postcss: '^8.5.6',\n tailwindcss: '^3.4.19',\n typescript: '~5.7.3',\n vite: '^5.0.0',\n },\n };\n\n writeFileSync(join(tmpDir, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n };\n\n writeFileSync(join(tmpDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));\n}\n","/**\n * ObjectUI\n * Copyright (c) 2024-present ObjectStack Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { existsSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\n\ninterface InitOptions {\n template: string;\n}\n\nconst templates = {\n simple: {\n type: 'div',\n className: 'min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100',\n body: {\n type: 'card',\n className: 'w-full max-w-md shadow-lg',\n title: 'Welcome to Object UI',\n description: 'Start building your application with JSON schemas',\n body: {\n type: 'div',\n className: 'p-6 space-y-4',\n body: [\n {\n type: 'text',\n content: 'This is a simple example. Edit app.json to customize your application.',\n className: 'text-sm text-muted-foreground',\n },\n {\n type: 'button',\n label: 'Get Started',\n className: 'w-full',\n },\n ],\n },\n },\n },\n form: {\n type: 'div',\n className: 'min-h-screen flex items-center justify-center bg-gradient-to-br from-purple-50 to-pink-100 p-4',\n body: {\n type: 'card',\n className: 'w-full max-w-2xl shadow-xl',\n title: 'Contact Form',\n description: 'Fill out the form below to get in touch',\n body: {\n type: 'div',\n className: 'p-6 space-y-6',\n body: [\n {\n type: 'div',\n className: 'grid grid-cols-2 gap-4',\n body: [\n {\n type: 'input',\n label: 'First Name',\n placeholder: 'John',\n required: true,\n },\n {\n type: 'input',\n label: 'Last Name',\n placeholder: 'Doe',\n required: true,\n },\n ],\n },\n {\n type: 'input',\n label: 'Email Address',\n inputType: 'email',\n placeholder: 'john.doe@example.com',\n required: true,\n },\n {\n type: 'input',\n label: 'Phone Number',\n inputType: 'tel',\n placeholder: '+1 (555) 000-0000',\n },\n {\n type: 'textarea',\n label: 'Message',\n placeholder: 'Tell us what you need...',\n rows: 4,\n },\n {\n type: 'div',\n className: 'flex gap-3',\n body: [\n {\n type: 'button',\n label: 'Submit',\n className: 'flex-1',\n },\n {\n type: 'button',\n label: 'Reset',\n variant: 'outline',\n className: 'flex-1',\n },\n ],\n },\n ],\n },\n },\n },\n dashboard: {\n type: 'div',\n className: 'min-h-screen bg-muted/10',\n body: [\n {\n type: 'div',\n className: 'border-b bg-background',\n body: {\n type: 'div',\n className: 'container mx-auto px-6 py-4',\n body: {\n type: 'div',\n className: 'flex items-center justify-between',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: 'Dashboard' },\n },\n {\n type: 'button',\n label: 'New Item',\n size: 'sm',\n },\n ],\n },\n },\n },\n {\n type: 'div',\n className: 'container mx-auto p-6 space-y-6',\n body: [\n {\n type: 'div',\n className: 'grid gap-4 md:grid-cols-2 lg:grid-cols-4',\n body: [\n {\n type: 'card',\n className: 'shadow-sm',\n body: [\n {\n type: 'div',\n className: 'p-6 pb-2',\n body: {\n type: 'div',\n className: 'text-sm font-medium text-muted-foreground',\n body: { type: 'text', content: 'Total Revenue' },\n },\n },\n {\n type: 'div',\n className: 'p-6 pt-0',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: '$45,231.89' },\n },\n {\n type: 'div',\n className: 'text-xs text-muted-foreground mt-1',\n body: { type: 'text', content: '+20.1% from last month' },\n },\n ],\n },\n ],\n },\n {\n type: 'card',\n className: 'shadow-sm',\n body: [\n {\n type: 'div',\n className: 'p-6 pb-2',\n body: {\n type: 'div',\n className: 'text-sm font-medium text-muted-foreground',\n body: { type: 'text', content: 'Active Users' },\n },\n },\n {\n type: 'div',\n className: 'p-6 pt-0',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: '+2,350' },\n },\n {\n type: 'div',\n className: 'text-xs text-muted-foreground mt-1',\n body: { type: 'text', content: '+180.1% from last month' },\n },\n ],\n },\n ],\n },\n {\n type: 'card',\n className: 'shadow-sm',\n body: [\n {\n type: 'div',\n className: 'p-6 pb-2',\n body: {\n type: 'div',\n className: 'text-sm font-medium text-muted-foreground',\n body: { type: 'text', content: 'Sales' },\n },\n },\n {\n type: 'div',\n className: 'p-6 pt-0',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: '+12,234' },\n },\n {\n type: 'div',\n className: 'text-xs text-muted-foreground mt-1',\n body: { type: 'text', content: '+19% from last month' },\n },\n ],\n },\n ],\n },\n {\n type: 'card',\n className: 'shadow-sm',\n body: [\n {\n type: 'div',\n className: 'p-6 pb-2',\n body: {\n type: 'div',\n className: 'text-sm font-medium text-muted-foreground',\n body: { type: 'text', content: 'Active Now' },\n },\n },\n {\n type: 'div',\n className: 'p-6 pt-0',\n body: [\n {\n type: 'div',\n className: 'text-2xl font-bold',\n body: { type: 'text', content: '+573' },\n },\n {\n type: 'div',\n className: 'text-xs text-muted-foreground mt-1',\n body: { type: 'text', content: '+201 since last hour' },\n },\n ],\n },\n ],\n },\n ],\n },\n {\n type: 'card',\n className: 'shadow-sm',\n title: 'Recent Activity',\n description: 'Your latest updates and notifications',\n body: {\n type: 'div',\n className: 'p-6 pt-0 space-y-4',\n body: [\n {\n type: 'div',\n className: 'flex items-center gap-4 border-b pb-4',\n body: [\n {\n type: 'div',\n className: 'flex-1',\n body: [\n {\n type: 'div',\n className: 'font-medium',\n body: { type: 'text', content: 'New user registration' },\n },\n {\n type: 'div',\n className: 'text-sm text-muted-foreground',\n body: { type: 'text', content: '2 minutes ago' },\n },\n ],\n },\n ],\n },\n {\n type: 'div',\n className: 'flex items-center gap-4 border-b pb-4',\n body: [\n {\n type: 'div',\n className: 'flex-1',\n body: [\n {\n type: 'div',\n className: 'font-medium',\n body: { type: 'text', content: 'Payment received' },\n },\n {\n type: 'div',\n className: 'text-sm text-muted-foreground',\n body: { type: 'text', content: '15 minutes ago' },\n },\n ],\n },\n ],\n },\n {\n type: 'div',\n className: 'flex items-center gap-4',\n body: [\n {\n type: 'div',\n className: 'flex-1',\n body: [\n {\n type: 'div',\n className: 'font-medium',\n body: { type: 'text', content: 'New order placed' },\n },\n {\n type: 'div',\n className: 'text-sm text-muted-foreground',\n body: { type: 'text', content: '1 hour ago' },\n },\n ],\n },\n ],\n },\n ],\n },\n },\n ],\n },\n ],\n },\n};\n\nexport async function init(name: string, options: InitOptions) {\n const cwd = process.cwd();\n const projectDir = join(cwd, name);\n\n // Check if directory already exists\n if (existsSync(projectDir) && name !== '.') {\n throw new Error(`Directory \"${name}\" already exists. Please choose a different name.`);\n }\n\n const targetDir = name === '.' ? cwd : projectDir;\n\n // Create project directory if needed\n if (name !== '.') {\n mkdirSync(projectDir, { recursive: true });\n }\n\n console.log(chalk.blue('🎨 Creating Object UI application...'));\n console.log(chalk.dim(` Template: ${options.template}`));\n console.log();\n\n // Get template\n const template = templates[options.template as keyof typeof templates];\n if (!template) {\n throw new Error(\n `Unknown template: ${options.template}\\nAvailable templates: ${Object.keys(templates).join(', ')}`\n );\n }\n\n // Create schema file\n const schemaPath = join(targetDir, 'app.json');\n writeFileSync(schemaPath, JSON.stringify(template, null, 2));\n\n console.log(chalk.green('✓ Created app.json'));\n\n // Create README\n const readme = `# ${name}\n\nAn Object UI application built from JSON schemas.\n\n## Getting Started\n\n1. Install dependencies:\n \\`\\`\\`bash\n npm install\n \\`\\`\\`\n\n2. Start the development server:\n \\`\\`\\`bash\n npm run dev\n \\`\\`\\`\n\n3. Open your browser and visit http://localhost:3000\n\n## Customize Your App\n\nEdit \\`app.json\\` to customize your application. The dev server will automatically reload when you save changes.\n\n## Available Templates\n\n- **simple**: A minimal getting started template\n- **form**: A contact form example\n- **dashboard**: A full dashboard with metrics and activity feed\n\n## Learn More\n\n- [Object UI Documentation](https://www.objectui.org)\n- [Schema Reference](https://www.objectui.org/docs/protocol/overview)\n- [Component Library](https://www.objectui.org/docs/api/components)\n\n## Commands\n\n- \\`npm run dev\\` - Start development server\n- \\`npm run build\\` - Build for production\n- \\`npm run preview\\` - Preview production build\n\nBuilt with ❤️ using [Object UI](https://www.objectui.org)\n`;\n\n writeFileSync(join(targetDir, 'README.md'), readme);\n console.log(chalk.green('✓ Created README.md'));\n\n // Create .gitignore\n const gitignore = `.objectui-tmp\nnode_modules\ndist\n.DS_Store\n*.log\n`;\n\n writeFileSync(join(targetDir, '.gitignore'), gitignore);\n console.log(chalk.green('✓ Created .gitignore'));\n\n // Create package.json\n const packageJson = {\n name,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc && vite build',\n preview: 'vite preview',\n },\n dependencies: {\n '@object-ui/components': '^2.0.0',\n '@object-ui/react': '^2.0.0',\n react: '^19.2.0',\n 'react-dom': '^19.2.0',\n },\n devDependencies: {\n '@tailwindcss/postcss': '^4.1.18',\n '@types/react': '^19.2.13',\n '@types/react-dom': '^19.2.6',\n '@vitejs/plugin-react': '^5.1.3',\n autoprefixer: '^10.4.23',\n postcss: '^8.5.6',\n tailwindcss: '^4.1.18',\n typescript: '^5.9.3',\n vite: '^7.3.1',\n },\n };\n\n writeFileSync(join(targetDir, 'package.json'), JSON.stringify(packageJson, null, 2));\n console.log(chalk.green('✓ Created package.json'));\n\n // Create vite.config.ts\n const viteConfig = `import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n plugins: [react()],\n server: {\n port: 3000,\n },\n});\n`;\n\n writeFileSync(join(targetDir, 'vite.config.ts'), viteConfig);\n console.log(chalk.green('✓ Created vite.config.ts'));\n\n // Create tailwind.config.js\n const tailwindConfig = `/** @type {import('tailwindcss').Config} */\nexport default {\n content: ['./index.html', './src/**/*.{ts,tsx}'],\n};\n`;\n\n writeFileSync(join(targetDir, 'tailwind.config.js'), tailwindConfig);\n console.log(chalk.green('✓ Created tailwind.config.js'));\n\n // Create postcss.config.js\n const postcssConfig = `export default {\n plugins: {\n '@tailwindcss/postcss': {},\n autoprefixer: {},\n },\n};\n`;\n\n writeFileSync(join(targetDir, 'postcss.config.js'), postcssConfig);\n console.log(chalk.green('✓ Created postcss.config.js'));\n\n // Create index.html\n const indexHtml = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${name}</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`;\n\n writeFileSync(join(targetDir, 'index.html'), indexHtml);\n console.log(chalk.green('✓ Created index.html'));\n\n // Create src directory and source files\n const srcDir = join(targetDir, 'src');\n mkdirSync(srcDir, { recursive: true });\n\n // Create src/index.css\n const indexCss = `@import 'tailwindcss';\n`;\n\n writeFileSync(join(srcDir, 'index.css'), indexCss);\n console.log(chalk.green('✓ Created src/index.css'));\n\n // Create src/main.tsx\n const mainTsx = `import { StrictMode } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport App from './App';\nimport './index.css';\n\ncreateRoot(document.getElementById('root')!).render(\n <StrictMode>\n <App />\n </StrictMode>,\n);\n`;\n\n writeFileSync(join(srcDir, 'main.tsx'), mainTsx);\n console.log(chalk.green('✓ Created src/main.tsx'));\n\n // Create src/App.tsx\n const appTsx = `import { SchemaRenderer } from '@object-ui/react';\nimport schema from '../app.json';\n\nexport default function App() {\n return <SchemaRenderer schema={schema} />;\n}\n`;\n\n writeFileSync(join(srcDir, 'App.tsx'), appTsx);\n console.log(chalk.green('✓ Created src/App.tsx'));\n\n // Create tsconfig.json\n const tsconfig = {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n isolatedModules: true,\n moduleDetection: 'force',\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n resolveJsonModule: true,\n },\n include: ['src'],\n };\n\n writeFileSync(join(targetDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2));\n console.log(chalk.green('✓ Created tsconfig.json'));\n\n console.log();\n console.log(chalk.green('✨ Application created successfully!'));\n console.log();\n console.log(chalk.bold('Next steps:'));\n console.log();\n if (name !== '.') {\n console.log(chalk.cyan(` cd ${name}`));\n }\n console.log(chalk.cyan(' npm install'));\n console.log(chalk.cyan(' npm run dev'));\n console.log();\n console.log(chalk.dim(' The development server will start on http://localhost:3000'));\n console.log();\n}\n"],"mappings":"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","names":["existsSync","mkdirSync","join","chalk","join","existsSync","chalk","mkdirSync","existsSync","writeFileSync","mkdirSync","join","chalk"]}