@object-ui/cli 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-WOV6EOMH.js → chunk-R3ECPDRL.js} +141 -2
- package/dist/chunk-R3ECPDRL.js.map +1 -0
- package/dist/cli.js +9 -11
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +14 -0
- package/dist/index.js +1 -1
- package/package.json +14 -5
- package/dist/chunk-WOV6EOMH.js.map +0 -1
|
@@ -102,6 +102,13 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
|
102
102
|
writeFileSync(join(srcDir, "main.tsx"), mainTsx);
|
|
103
103
|
const appTsx = `import { SchemaRenderer } from '@object-ui/react';
|
|
104
104
|
import '@object-ui/components';
|
|
105
|
+
import '@object-ui/plugin-charts';
|
|
106
|
+
import '@object-ui/plugin-editor';
|
|
107
|
+
import '@object-ui/plugin-kanban';
|
|
108
|
+
import '@object-ui/plugin-markdown';
|
|
109
|
+
import '@object-ui/plugin-form';
|
|
110
|
+
import '@object-ui/plugin-grid';
|
|
111
|
+
import '@object-ui/plugin-view';
|
|
105
112
|
|
|
106
113
|
const schema = ${JSON.stringify(schema, null, 2)};
|
|
107
114
|
|
|
@@ -389,14 +396,91 @@ function createTempAppWithRouting(tmpDir, routes, appConfig) {
|
|
|
389
396
|
schemaImports.push(`import ${schemaVarName} from './schemas/${schemaFileName}';`);
|
|
390
397
|
routeComponents.push(` <Route path="${route.path}" element={<SchemaRenderer schema={${schemaVarName}} />} />`);
|
|
391
398
|
});
|
|
399
|
+
const themeProviderTsx = `import { createContext, useContext, useEffect, useState } from "react"
|
|
400
|
+
|
|
401
|
+
type Theme = "dark" | "light" | "system"
|
|
402
|
+
|
|
403
|
+
type ThemeProviderProps = {
|
|
404
|
+
children: React.ReactNode
|
|
405
|
+
defaultTheme?: Theme
|
|
406
|
+
storageKey?: string
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
type ThemeProviderState = {
|
|
410
|
+
theme: Theme
|
|
411
|
+
setTheme: (theme: Theme) => void
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const initialState: ThemeProviderState = {
|
|
415
|
+
theme: "system",
|
|
416
|
+
setTheme: () => null,
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const ThemeProviderContext = createContext<ThemeProviderState>(initialState)
|
|
420
|
+
|
|
421
|
+
export function ThemeProvider({
|
|
422
|
+
children,
|
|
423
|
+
defaultTheme = "system",
|
|
424
|
+
storageKey = "vite-ui-theme",
|
|
425
|
+
...props
|
|
426
|
+
}: ThemeProviderProps) {
|
|
427
|
+
const [theme, setTheme] = useState<Theme>(
|
|
428
|
+
() => (localStorage.getItem(storageKey) as Theme) || defaultTheme
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
useEffect(() => {
|
|
432
|
+
const root = window.document.documentElement
|
|
433
|
+
|
|
434
|
+
root.classList.remove("light", "dark")
|
|
435
|
+
|
|
436
|
+
if (theme === "system") {
|
|
437
|
+
const systemTheme = window.matchMedia("(prefers-color-scheme: dark)")
|
|
438
|
+
.matches
|
|
439
|
+
? "dark"
|
|
440
|
+
: "light"
|
|
441
|
+
|
|
442
|
+
root.classList.add(systemTheme)
|
|
443
|
+
return
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
root.classList.add(theme)
|
|
447
|
+
}, [theme])
|
|
448
|
+
|
|
449
|
+
const value = {
|
|
450
|
+
theme,
|
|
451
|
+
setTheme: (theme: Theme) => {
|
|
452
|
+
localStorage.setItem(storageKey, theme)
|
|
453
|
+
setTheme(theme)
|
|
454
|
+
},
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
return (
|
|
458
|
+
<ThemeProviderContext.Provider {...props} value={value}>
|
|
459
|
+
{children}
|
|
460
|
+
</ThemeProviderContext.Provider>
|
|
461
|
+
)
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
export const useTheme = () => {
|
|
465
|
+
const context = useContext(ThemeProviderContext)
|
|
466
|
+
|
|
467
|
+
if (context === undefined)
|
|
468
|
+
throw new Error("useTheme must be used within a ThemeProvider")
|
|
469
|
+
|
|
470
|
+
return context
|
|
471
|
+
}`;
|
|
472
|
+
writeFileSync(join(srcDir, "theme-provider.tsx"), themeProviderTsx);
|
|
392
473
|
const mainTsx = `import React from 'react';
|
|
393
474
|
import ReactDOM from 'react-dom/client';
|
|
394
475
|
import App from './App';
|
|
395
476
|
import './index.css';
|
|
477
|
+
import { ThemeProvider } from "./theme-provider"
|
|
396
478
|
|
|
397
479
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
398
480
|
<React.StrictMode>
|
|
399
|
-
<
|
|
481
|
+
<ThemeProvider defaultTheme="dark" storageKey="vite-ui-theme">
|
|
482
|
+
<App />
|
|
483
|
+
</ThemeProvider>
|
|
400
484
|
</React.StrictMode>
|
|
401
485
|
);`;
|
|
402
486
|
writeFileSync(join(srcDir, "main.tsx"), mainTsx);
|
|
@@ -407,8 +491,15 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
|
407
491
|
const layoutCode = `
|
|
408
492
|
import { Link, useLocation } from 'react-router-dom';
|
|
409
493
|
import * as LucideIcons from 'lucide-react';
|
|
494
|
+
import { Moon, Sun } from "lucide-react"
|
|
495
|
+
import { useTheme } from "./theme-provider"
|
|
410
496
|
import {
|
|
411
497
|
cn,
|
|
498
|
+
Button,
|
|
499
|
+
DropdownMenu,
|
|
500
|
+
DropdownMenuContent,
|
|
501
|
+
DropdownMenuItem,
|
|
502
|
+
DropdownMenuTrigger,
|
|
412
503
|
SidebarProvider,
|
|
413
504
|
Sidebar,
|
|
414
505
|
SidebarContent,
|
|
@@ -439,6 +530,42 @@ const DynamicIcon = ({ name, className }) => {
|
|
|
439
530
|
return <Icon className={className} />;
|
|
440
531
|
};
|
|
441
532
|
|
|
533
|
+
export function ModeToggle() {
|
|
534
|
+
const { setTheme } = useTheme()
|
|
535
|
+
|
|
536
|
+
return (
|
|
537
|
+
<DropdownMenu>
|
|
538
|
+
<DropdownMenuTrigger asChild>
|
|
539
|
+
<SidebarMenuButton size="lg" className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground">
|
|
540
|
+
<div className="flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground">
|
|
541
|
+
<Sun className="h-4 w-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
|
|
542
|
+
<Moon className="absolute h-4 w-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
|
|
543
|
+
</div>
|
|
544
|
+
<div className="grid flex-1 text-left text-sm leading-tight">
|
|
545
|
+
<span className="truncate font-semibold">Switch Theme</span>
|
|
546
|
+
<span className="truncate text-xs">Light / Dark</span>
|
|
547
|
+
</div>
|
|
548
|
+
<LucideIcons.ChevronsUpDown className="ml-auto size-4" />
|
|
549
|
+
</SidebarMenuButton>
|
|
550
|
+
</DropdownMenuTrigger>
|
|
551
|
+
<DropdownMenuContent className="w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg" side="bottom" align="end" sideOffset={4}>
|
|
552
|
+
<DropdownMenuItem onClick={() => setTheme("light")}>
|
|
553
|
+
<LucideIcons.Sun className="mr-2 size-4" />
|
|
554
|
+
Light
|
|
555
|
+
</DropdownMenuItem>
|
|
556
|
+
<DropdownMenuItem onClick={() => setTheme("dark")}>
|
|
557
|
+
<LucideIcons.Moon className="mr-2 size-4" />
|
|
558
|
+
Dark
|
|
559
|
+
</DropdownMenuItem>
|
|
560
|
+
<DropdownMenuItem onClick={() => setTheme("system")}>
|
|
561
|
+
<LucideIcons.Monitor className="mr-2 size-4" />
|
|
562
|
+
System
|
|
563
|
+
</DropdownMenuItem>
|
|
564
|
+
</DropdownMenuContent>
|
|
565
|
+
</DropdownMenu>
|
|
566
|
+
)
|
|
567
|
+
}
|
|
568
|
+
|
|
442
569
|
const AppLayout = ({ app, children }) => {
|
|
443
570
|
const location = useLocation();
|
|
444
571
|
const menu = app.menu || [];
|
|
@@ -512,6 +639,11 @@ const AppLayout = ({ app, children }) => {
|
|
|
512
639
|
</SidebarGroup>
|
|
513
640
|
</SidebarContent>
|
|
514
641
|
<SidebarFooter>
|
|
642
|
+
<SidebarMenu>
|
|
643
|
+
<SidebarMenuItem>
|
|
644
|
+
<ModeToggle />
|
|
645
|
+
</SidebarMenuItem>
|
|
646
|
+
</SidebarMenu>
|
|
515
647
|
</SidebarFooter>
|
|
516
648
|
<SidebarRail />
|
|
517
649
|
</Sidebar>
|
|
@@ -545,6 +677,13 @@ const appConfig = ${JSON.stringify(appConfig)};`;
|
|
|
545
677
|
const appTsx = `import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
|
|
546
678
|
import { SchemaRenderer } from '@object-ui/react';
|
|
547
679
|
import '@object-ui/components';
|
|
680
|
+
import '@object-ui/plugin-charts';
|
|
681
|
+
import '@object-ui/plugin-editor';
|
|
682
|
+
import '@object-ui/plugin-kanban';
|
|
683
|
+
import '@object-ui/plugin-markdown';
|
|
684
|
+
import '@object-ui/plugin-form';
|
|
685
|
+
import '@object-ui/plugin-grid';
|
|
686
|
+
import '@object-ui/plugin-view';
|
|
548
687
|
${schemaImports.join("\n")}
|
|
549
688
|
${layoutImport}
|
|
550
689
|
|
|
@@ -1269,4 +1408,4 @@ export {
|
|
|
1269
1408
|
serve,
|
|
1270
1409
|
init
|
|
1271
1410
|
};
|
|
1272
|
-
//# sourceMappingURL=chunk-
|
|
1411
|
+
//# sourceMappingURL=chunk-R3ECPDRL.js.map
|
|
@@ -0,0 +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-ignore\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":"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","names":["existsSync","mkdirSync","join","chalk","join","existsSync","chalk","mkdirSync","existsSync","writeFileSync","mkdirSync","join","chalk"]}
|
package/dist/cli.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
parseSchemaFile,
|
|
7
7
|
scanPagesDirectory,
|
|
8
8
|
serve
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-R3ECPDRL.js";
|
|
10
10
|
|
|
11
11
|
// src/cli.ts
|
|
12
12
|
import { Command } from "commander";
|
|
@@ -130,7 +130,14 @@ Run 'objectui init' to create a sample schema.`);
|
|
|
130
130
|
"@object-ui/react": join(cwd, "packages/react/src/index.ts"),
|
|
131
131
|
"@object-ui/components": join(cwd, "packages/components/src/index.ts"),
|
|
132
132
|
"@object-ui/core": join(cwd, "packages/core/src/index.ts"),
|
|
133
|
-
"@object-ui/types": join(cwd, "packages/types/src/index.ts")
|
|
133
|
+
"@object-ui/types": join(cwd, "packages/types/src/index.ts"),
|
|
134
|
+
"@object-ui/plugin-charts": join(cwd, "packages/plugin-charts/src/index.tsx"),
|
|
135
|
+
"@object-ui/plugin-editor": join(cwd, "packages/plugin-editor/src/index.tsx"),
|
|
136
|
+
"@object-ui/plugin-kanban": join(cwd, "packages/plugin-kanban/src/index.tsx"),
|
|
137
|
+
"@object-ui/plugin-markdown": join(cwd, "packages/plugin-markdown/src/index.tsx"),
|
|
138
|
+
"@object-ui/plugin-form": join(cwd, "packages/plugin-form/src/index.tsx"),
|
|
139
|
+
"@object-ui/plugin-grid": join(cwd, "packages/plugin-grid/src/index.tsx"),
|
|
140
|
+
"@object-ui/plugin-view": join(cwd, "packages/plugin-view/src/index.tsx")
|
|
134
141
|
};
|
|
135
142
|
try {
|
|
136
143
|
const lucidePath = require2.resolve("lucide-react", { paths: [join(cwd, "packages/components")] });
|
|
@@ -695,14 +702,5 @@ program.command("check").description("Validate schema files").action(async () =>
|
|
|
695
702
|
process.exit(1);
|
|
696
703
|
}
|
|
697
704
|
});
|
|
698
|
-
program.command("showcase").description("Start the built-in showcase example").option("-p, --port <port>", "Port to run the server on", "3000").option("-h, --host <host>", "Host to bind the server to", "localhost").option("--no-open", "Do not open browser automatically").action(async (options) => {
|
|
699
|
-
try {
|
|
700
|
-
const showcaseSchema = join9(__dirname, "../../..", "examples", "showcase", "app.json");
|
|
701
|
-
await dev(showcaseSchema, options);
|
|
702
|
-
} catch (error) {
|
|
703
|
-
console.error(chalk11.red("Error:"), error instanceof Error ? error.message : error);
|
|
704
|
-
process.exit(1);
|
|
705
|
-
}
|
|
706
|
-
});
|
|
707
705
|
program.parse();
|
|
708
706
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/start.ts","../src/commands/lint.ts","../src/commands/test.ts","../src/commands/generate.ts","../src/commands/doctor.ts","../src/commands/add.ts","../src/commands/studio.ts","../src/commands/check.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { serve } from './commands/serve.js';\nimport { init } from './commands/init.js';\nimport { dev } from './commands/dev.js';\nimport { buildApp } from './commands/build.js';\nimport { start } from './commands/start.js';\nimport { lint } from './commands/lint.js';\nimport { test } from './commands/test.js';\nimport { generate } from './commands/generate.js';\nimport { doctor } from './commands/doctor.js';\nimport { add } from './commands/add.js';\nimport { studio } from './commands/studio.js';\nimport { check } from './commands/check.js';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read package.json for version\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../package.json'), 'utf-8')\n);\n\nconst program = new Command();\n\nprogram\n .name('objectui')\n .description('CLI tool for Object UI - Build applications from JSON schemas')\n .version(packageJson.version);\n\nprogram\n .command('serve')\n .description('Start a development server with your JSON/YAML schema')\n .argument('[schema]', 'Path to JSON/YAML schema file', 'app.json')\n .option('-p, --port <port>', 'Port to run the server on', '3000')\n .option('-h, --host <host>', 'Host to bind the server to', 'localhost')\n .action(async (schema, options) => {\n try {\n await serve(schema, options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('dev')\n .description('Start development server (alias for serve)')\n .argument('[schema]', 'Path to JSON/YAML schema file', 'app.json')\n .option('-p, --port <port>', 'Port to run the server on', '3000')\n .option('-h, --host <host>', 'Host to bind the server to', 'localhost')\n .option('--no-open', 'Do not open browser automatically')\n .action(async (schema, options) => {\n try {\n await dev(schema, options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('build')\n .description('Build application for production')\n .argument('[schema]', 'Path to JSON/YAML schema file', 'app.json')\n .option('-o, --out-dir <dir>', 'Output directory', 'dist')\n .option('--clean', 'Clean output directory before build', false)\n .action(async (schema, options) => {\n try {\n await buildApp(schema, options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('start')\n .description('Start production server')\n .option('-p, --port <port>', 'Port to run the server on', '3000')\n .option('-h, --host <host>', 'Host to bind the server to', '0.0.0.0')\n .option('-d, --dir <dir>', 'Directory to serve', 'dist')\n .action(async (options) => {\n try {\n await start(options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('init')\n .description('初始化新的Object UI应用 / Initialize a new Object UI application with sample schema')\n .argument('[name]', '应用名称 / Application name', 'my-app')\n .option('-t, --template <template>', '使用的模板 / Template to use (dashboard, form, simple)', 'dashboard')\n .action(async (name, options) => {\n try {\n await init(name, options);\n } catch (error) {\n console.error(chalk.red('错误 Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('lint')\n .description('Lint the generated application code')\n .option('--fix', 'Automatically fix linting issues')\n .action(async (options) => {\n try {\n await lint(options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('test')\n .description('Run tests for the application')\n .option('-w, --watch', 'Run tests in watch mode')\n .option('-c, --coverage', 'Generate test coverage report')\n .option('--ui', 'Run tests with Vitest UI')\n .action(async (options) => {\n try {\n await test(options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .alias('g')\n .description('Generate new resources (objects, pages, plugins)')\n .argument('<type>', 'Type of resource to generate (resource/object, page, plugin)')\n .argument('<name>', 'Name of the resource')\n .action(async (type, name) => {\n try {\n await generate(type, name);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('doctor')\n .description('Diagnose and fix common issues')\n .action(async () => {\n try {\n await doctor();\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('add')\n .description('Add a new component renderer to your project')\n .argument('<component>', 'Component name (e.g. Input, Grid)')\n .action(async (component) => {\n try {\n await add(component);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('studio')\n .description('Start the visual designer')\n .action(async () => {\n try {\n await studio();\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('check')\n .description('Validate schema files')\n .action(async () => {\n try {\n await check();\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('showcase')\n .description('Start the built-in showcase example')\n .option('-p, --port <port>', 'Port to run the server on', '3000')\n .option('-h, --host <host>', 'Host to bind the server to', 'localhost')\n .option('--no-open', 'Do not open browser automatically')\n .action(async (options) => {\n try {\n // Locate repository root relative to this file and point to examples/showcase/app.json\n const showcaseSchema = join(__dirname, '../../..', 'examples', 'showcase', 'app.json');\n await dev(showcaseSchema, options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import { createServer } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport { existsSync, mkdirSync, unlinkSync, statSync } from 'fs';\nimport { join, resolve, dirname } from 'path';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { createRequire } from 'module';\nimport { scanPagesDirectory, createTempAppWithRouting, createTempApp, parseSchemaFile, type RouteInfo } from '../utils/app-generator.js';\n\ninterface DevOptions {\n port: string;\n host: string;\n open?: boolean;\n}\n\nexport async function dev(schemaPath: string, options: DevOptions) {\n const cwd = process.cwd();\n \n // Resolve the actual project root and schema file\n let _projectRoot = cwd;\n const targetSchemaPath = schemaPath;\n let hasPagesDir = false;\n let pagesDir = '';\n let appConfig: unknown = null;\n\n // 1. Determine Project Root & Mode\n const absoluteSchemaPath = resolve(cwd, schemaPath);\n \n if (existsSync(absoluteSchemaPath) && statSync(absoluteSchemaPath).isFile()) {\n // If input is a file (e.g. examples/showcase/app.json)\n const fileDir = dirname(absoluteSchemaPath);\n const potentialPagesDir = join(fileDir, 'pages');\n\n if (existsSync(potentialPagesDir)) {\n console.log(chalk.blue(`📂 Detected project structure at ${fileDir}`));\n _projectRoot = fileDir;\n hasPagesDir = true;\n pagesDir = potentialPagesDir;\n \n // Try to load app.json as config\n try {\n appConfig = parseSchemaFile(absoluteSchemaPath);\n console.log(chalk.blue('⚙️ Loaded App Config from app.json'));\n } catch (_e) {\n console.warn('Failed to parse app config');\n }\n }\n } \n \n // Fallback: Check detect pages dir in current cwd if not found above\n if (!hasPagesDir) {\n const localPagesDir = join(cwd, 'pages');\n if (existsSync(localPagesDir)) {\n hasPagesDir = true;\n pagesDir = localPagesDir;\n // Try to find app.json in cwd\n // TODO: Load app.json if exists\n }\n }\n\n const require = createRequire(join(cwd, 'package.json'));\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(`📁 Using file-system routing from ${pagesDir}`));\n routes = scanPagesDirectory(pagesDir);\n useFileSystemRouting = true;\n \n if (routes.length === 0) {\n throw new Error(`No schema files found in ${pagesDir}`);\n }\n \n console.log(chalk.green(`✓ Found ${routes.length} route(s)`));\n routes.forEach(route => {\n console.log(chalk.dim(` ${route.path} → ${route.filePath.replace(cwd, '.')}`));\n });\n } else {\n // Single schema file mode\n const fullSchemaPath = resolve(cwd, schemaPath);\n // ... (rest of the logic)\n if (!existsSync(fullSchemaPath)) {\n throw new Error(`Schema file not found: ${schemaPath}\\nRun 'objectui init' to create a sample schema.`);\n }\n console.log(chalk.blue('📋 Loading schema:'), chalk.cyan(schemaPath));\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 (always in cwd to keep node_modules access)\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, appConfig);\n } else {\n createTempApp(tmpDir, schema);\n }\n\n\n // Install dependencies\n const isMonorepo = existsSync(join(cwd, 'pnpm-workspace.yaml'));\n \n if (isMonorepo) {\n console.log(chalk.blue('📦 Detected monorepo - using root node_modules'));\n } else {\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\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: any = {\n root: tmpDir,\n server: {\n port: parseInt(options.port),\n host: options.host,\n open: options.open !== false,\n fs: {\n // Allow serving files from workspace root\n allow: [cwd],\n }\n },\n resolve: {\n alias: {}\n },\n plugins: [react()],\n };\n\n if (isMonorepo) {\n console.log(chalk.blue('📦 Detected monorepo - configuring workspace aliases'));\n \n // Remove postcss.config.js to prevent interference with programmatic config\n const postcssPath = join(tmpDir, 'postcss.config.js');\n if (existsSync(postcssPath)) {\n unlinkSync(postcssPath);\n }\n\n // Add aliases for workspace packages\n viteConfig.resolve.alias = {\n '@object-ui/react': join(cwd, 'packages/react/src/index.ts'),\n '@object-ui/components': join(cwd, 'packages/components/src/index.ts'),\n '@object-ui/core': join(cwd, 'packages/core/src/index.ts'),\n '@object-ui/types': join(cwd, 'packages/types/src/index.ts'),\n };\n\n // Fix: Resolve lucide-react from components package to avoid \"dependency not found\" in temp app\n try {\n // Trying to find lucide-react in the components' node_modules or hoist\n // checking specifically in packages/components context\n const lucidePath = require.resolve('lucide-react', { paths: [join(cwd, 'packages/components')] });\n // We might get the cjs entry, but for aliasing usually fine. \n // Better yet, if we can find the package root, but require.resolve gives file.\n // Let's just use what require.resolve gives.\n // @ts-expect-error - lucidePath is dynamically resolved\n viteConfig.resolve.alias['lucide-react'] = lucidePath;\n } catch (e) {\n console.warn('⚠️ Could not resolve lucide-react automatically:', e);\n }\n \n // Debug aliases\n // console.log('Aliases:', viteConfig.resolve.alias);\n\n // Configure PostCSS programmatically reusing root dependencies\n try {\n const tailwindcss = require('tailwindcss');\n const autoprefixer = require('autoprefixer');\n \n viteConfig.css = {\n postcss: {\n plugins: [\n tailwindcss(join(tmpDir, 'tailwind.config.js')),\n autoprefixer(),\n ],\n },\n };\n } catch (_e) {\n console.warn(chalk.yellow('⚠️ Failed to load PostCSS plugins from root node_modules. Styles might not work correctly.'));\n }\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('✓ Development 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","import { build as viteBuild } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport { existsSync, mkdirSync, cpSync, rmSync } from 'fs';\nimport { join, resolve } 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 BuildOptions {\n outDir?: string;\n clean?: boolean;\n}\n\nexport async function buildApp(schemaPath: string, options: BuildOptions) {\n const cwd = process.cwd();\n const outDir = options.outDir || 'dist';\n const outputPath = resolve(cwd, outDir);\n \n console.log(chalk.blue('🔨 Building application for production...'));\n console.log();\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('📁 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 } 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 try {\n execSync('npm install --silent --prefer-offline', { \n cwd: tmpDir, \n stdio: 'pipe',\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.blue('⚙️ Building with Vite...'));\n console.log();\n\n // Clean output directory if requested\n if (options.clean && existsSync(outputPath)) {\n console.log(chalk.dim(` Cleaning ${outDir}/ directory...`));\n rmSync(outputPath, { recursive: true, force: true });\n }\n\n // Build with Vite\n try {\n await viteBuild({\n root: tmpDir,\n build: {\n outDir: join(tmpDir, 'dist'),\n emptyOutDir: true,\n reportCompressedSize: true,\n },\n plugins: [react()],\n logLevel: 'info',\n });\n\n // Copy built files to output directory\n mkdirSync(outputPath, { recursive: true });\n cpSync(join(tmpDir, 'dist'), outputPath, { recursive: true });\n\n console.log();\n console.log(chalk.green('✓ Build completed successfully!'));\n console.log();\n console.log(chalk.bold(' Output: ') + chalk.cyan(outDir + '/'));\n console.log();\n console.log(chalk.dim(' To serve the production build, run:'));\n console.log(chalk.cyan(` objectui start --dir ${outDir}`));\n console.log();\n } catch (error) {\n throw new Error(`Build failed: ${error instanceof Error ? error.message : error}`);\n }\n}\n","import express from 'express';\nimport rateLimit from 'express-rate-limit';\nimport { existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport chalk from 'chalk';\n\ninterface StartOptions {\n port: string;\n host: string;\n dir?: string;\n}\n\nexport async function start(options: StartOptions) {\n const cwd = process.cwd();\n const distDir = options.dir || 'dist';\n const distPath = resolve(cwd, distDir);\n\n // Check if dist directory exists\n if (!existsSync(distPath)) {\n throw new Error(\n `Build directory not found: ${distDir}\\n` +\n `Run 'objectui build' first to create a production build.`\n );\n }\n\n // Check if index.html exists\n const indexPath = join(distPath, 'index.html');\n if (!existsSync(indexPath)) {\n throw new Error(\n `index.html not found in ${distDir}/\\n` +\n `Make sure you have a valid production build.`\n );\n }\n\n console.log(chalk.blue('🚀 Starting production server...\\n'));\n\n const app = express();\n const port = parseInt(options.port);\n const host = options.host;\n\n // Configure rate limiting to prevent abuse\n const limiter = rateLimit({\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 1000, // Limit each IP to 1000 requests per windowMs\n message: 'Too many requests from this IP, please try again later.',\n standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers\n legacyHeaders: false, // Disable the `X-RateLimit-*` headers\n });\n\n // Apply rate limiting to all routes\n app.use(limiter);\n\n // Serve static files from dist directory\n app.use(express.static(distPath));\n\n // SPA fallback - serve index.html for all routes\n app.get('*', (req, res) => {\n res.sendFile(indexPath);\n });\n\n // Start server\n app.listen(port, host, () => {\n const protocol = 'http';\n const displayHost = host === '0.0.0.0' ? 'localhost' : host;\n\n console.log(chalk.green('✓ Production server started successfully!'));\n console.log();\n console.log(chalk.bold(' Local: ') + chalk.cyan(`${protocol}://${displayHost}:${port}`));\n console.log(chalk.bold(' Serving: ') + chalk.dim(distDir + '/'));\n console.log();\n console.log(chalk.dim(' Press Ctrl+C to stop the server'));\n console.log();\n });\n}\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\n\ninterface LintOptions {\n fix?: boolean;\n}\n\nexport async function lint(options: LintOptions) {\n const cwd = process.cwd();\n \n console.log(chalk.blue('🔍 Running linter...\\n'));\n\n // Check if the generated temp app exists\n const tmpDir = join(cwd, '.objectui-tmp');\n const hasTempApp = existsSync(tmpDir);\n\n if (!hasTempApp) {\n throw new Error(\n 'No Object UI application found. Run \\'objectui dev\\' first to generate the application.'\n );\n }\n\n // Check if package.json and node_modules exist\n const packageJsonPath = join(tmpDir, 'package.json');\n const nodeModulesPath = join(tmpDir, 'node_modules');\n \n if (!existsSync(packageJsonPath) || !existsSync(nodeModulesPath)) {\n throw new Error(\n 'Dependencies not installed. Run \\'objectui dev\\' first to set up the application.'\n );\n }\n\n try {\n const fixFlag = options.fix ? '--fix' : '';\n const command = `npx eslint \"src/**/*.{js,jsx,ts,tsx}\" ${fixFlag}`.trim();\n \n console.log(chalk.dim(` Running: ${command}\\n`));\n \n execSync(command, {\n cwd: tmpDir,\n stdio: 'inherit',\n });\n\n console.log();\n console.log(chalk.green('✓ Linting completed successfully!'));\n console.log();\n } catch {\n // ESLint returns non-zero exit code when there are linting errors\n console.log();\n console.log(chalk.yellow('⚠ Linting found issues.'));\n if (!options.fix) {\n console.log(chalk.dim(' Run \\'objectui lint --fix\\' to automatically fix some issues.'));\n }\n console.log();\n process.exit(1);\n }\n}\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\n\ninterface TestOptions {\n watch?: boolean;\n coverage?: boolean;\n ui?: boolean;\n}\n\nexport async function test(options: TestOptions) {\n const cwd = process.cwd();\n \n console.log(chalk.blue('🧪 Running tests...\\n'));\n\n // Check if the generated temp app exists\n const tmpDir = join(cwd, '.objectui-tmp');\n const hasTempApp = existsSync(tmpDir);\n\n if (!hasTempApp) {\n throw new Error(\n 'No Object UI application found. Run \\'objectui dev\\' first to generate the application.'\n );\n }\n\n // Check if package.json and node_modules exist\n const packageJsonPath = join(tmpDir, 'package.json');\n const nodeModulesPath = join(tmpDir, 'node_modules');\n \n if (!existsSync(packageJsonPath) || !existsSync(nodeModulesPath)) {\n throw new Error(\n 'Dependencies not installed. Run \\'objectui dev\\' first to set up the application.'\n );\n }\n\n try {\n let command = 'npx vitest';\n \n if (options.watch) {\n command += ' --watch';\n } else if (options.ui) {\n command += ' --ui';\n } else {\n command += ' run';\n }\n\n if (options.coverage) {\n command += ' --coverage';\n }\n\n console.log(chalk.dim(` Running: ${command}\\n`));\n \n execSync(command, {\n cwd: tmpDir,\n stdio: 'inherit',\n });\n\n if (!options.watch && !options.ui) {\n console.log();\n console.log(chalk.green('✓ Tests completed successfully!'));\n console.log();\n }\n } catch {\n // Vitest returns non-zero exit code when tests fail\n console.log();\n console.log(chalk.red('✗ Some tests failed.'));\n console.log();\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\nexport async function generate(type: string, name: string) {\n const cwd = process.cwd();\n\n switch (type) {\n case 'resource':\n case 'object':\n generateResource(cwd, name);\n break;\n case 'page':\n generatePage(cwd, name);\n break;\n case 'plugin':\n generatePlugin(cwd, name);\n break;\n default:\n console.log(chalk.red(`Unknown type: ${type}`));\n console.log(`Available types: resource, page, plugin`);\n process.exit(1);\n }\n}\n\nfunction generateResource(cwd: string, name: string) {\n const dir = join(cwd, 'objects');\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n const fileName = `${name.toLowerCase()}.json`;\n const filePath = join(dir, fileName);\n\n if (existsSync(filePath)) {\n console.log(chalk.yellow(`Object ${name} already exists at ${filePath}`));\n return;\n }\n\n const content = {\n name: name,\n fields: {\n name: { type: 'text', label: 'Name', required: true }\n }\n };\n\n writeFileSync(filePath, JSON.stringify(content, null, 2));\n console.log(chalk.green(`✓ Generated resource schema: ${filePath}`));\n}\n\nfunction generatePage(cwd: string, name: string) {\n const dir = join(cwd, 'pages');\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n const fileName = `${name.toLowerCase()}.json`;\n const filePath = join(dir, fileName);\n\n if (existsSync(filePath)) {\n console.log(chalk.yellow(`Page ${name} already exists at ${filePath}`));\n return;\n }\n\n const content = {\n type: \"page\",\n title: name,\n body: [\n {\n type: \"markdown\",\n content: `# Welcome to ${name}`\n }\n ]\n };\n\n writeFileSync(filePath, JSON.stringify(content, null, 2));\n console.log(chalk.green(`✓ Generated page schema: ${filePath}`));\n}\n\nfunction generatePlugin(cwd: string, name: string) {\n const dir = join(cwd, 'plugins', name);\n if (existsSync(dir)) {\n console.log(chalk.yellow(`Plugin ${name} already exists`));\n return;\n }\n mkdirSync(dir, { recursive: true });\n\n const content = `\nexport const ${name}Plugin = {\n name: '${name}',\n install(app) {\n console.log('${name} plugin installed');\n }\n};\n`;\n\n writeFileSync(join(dir, 'index.ts'), content.trim());\n console.log(chalk.green(`✓ Generated plugin: ${dir}`));\n}\n","import chalk from 'chalk';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\nexport async function doctor() {\n console.log(chalk.bold('Object UI Doctor'));\n console.log('Diagnosis in progress...\\n');\n \n const cwd = process.cwd();\n let issues = 0;\n\n // 1. Check package.json\n const pkgPath = join(cwd, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n \n // Check React version\n const reactVer = pkg.dependencies?.react || pkg.devDependencies?.react;\n if (reactVer) {\n console.log(chalk.green('✓ React installed'));\n } else {\n console.log(chalk.yellow('⚠️ React not found in dependencies'));\n issues++;\n }\n\n // Check Tailwind\n const tailwindVer = pkg.dependencies?.tailwindcss || pkg.devDependencies?.tailwindcss;\n if (tailwindVer) {\n console.log(chalk.green('✓ Tailwind CSS installed'));\n } else {\n console.log(chalk.yellow('⚠️ Tailwind CSS not found'));\n issues++;\n }\n } catch (e) {\n console.log(chalk.red('x Failed to read package.json'));\n issues++;\n }\n } else {\n console.log(chalk.red('x package.json not found'));\n issues++;\n }\n\n // 2. Check tailwind.config.js\n const tailwindConfigPath = join(cwd, 'tailwind.config.js');\n if (existsSync(tailwindConfigPath)) {\n console.log(chalk.green('✓ tailwind.config.js found'));\n // TODO: Check content configuration\n } else {\n console.log(chalk.yellow('⚠️ tailwind.config.js not found'));\n issues++;\n }\n\n // Summary\n console.log('\\nResult:');\n if (issues === 0) {\n console.log(chalk.green('Everything looks good! ✨'));\n } else {\n console.log(chalk.yellow(`Found ${issues} issue(s).`));\n }\n}\n","import chalk from 'chalk';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\nexport async function add(component: string) {\n console.log(chalk.bold(`Object UI Add: ${component}`));\n console.log(chalk.yellow('Feature not implemented yet.'));\n console.log(`This command will download the source code for ${component}Renderer to your project.`);\n}\n","import chalk from 'chalk';\nimport { serve } from './serve.js';\n\nexport async function studio() {\n console.log(chalk.bold('Starting Object UI Studio...'));\n \n // Logic to start designer server\n // This might reuse 'serve' but with a special mode or different root\n \n console.log(chalk.yellow('Studio mode is experimental.'));\n \n // For now, we can just point to the designer URL if it was hosted, \n // or start the local dev server with a flag.\n // Assuming designer is a static app that connects to the local API.\n}\n","import chalk from 'chalk';\nimport { globSync } from 'glob';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\n\nexport async function check() {\n console.log(chalk.bold('Object UI Schema Check'));\n const cwd = process.cwd();\n \n // 1. Find all JSON/YAML files\n const files = globSync('**/*.{json,yaml,yml}', { \n cwd, \n ignore: ['node_modules/**', 'dist/**', '.git/**'] \n });\n \n console.log(`Analyzing ${files.length} files...`);\n \n let errors = 0;\n \n for (const file of files) {\n try {\n // Basic JSON parsing check\n if (file.endsWith('.json')) {\n JSON.parse(readFileSync(join(cwd, file), 'utf-8'));\n }\n // TODO: Schema validation logic\n } catch (e) {\n console.log(chalk.red(`x Invalid JSON in ${file}: ${(e as Error).message}`));\n errors++;\n }\n }\n \n if (errors === 0) {\n console.log(chalk.green('✓ All checks passed'));\n } else {\n console.log(chalk.red(`Found ${errors} errors`));\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["chalk","require","react","existsSync","mkdirSync","join","resolve","chalk","execSync","resolve","chalk","join","existsSync","mkdirSync","execSync","react","existsSync","join","resolve","chalk","execSync","existsSync","join","chalk","execSync","existsSync","join","chalk","chalk","existsSync","mkdirSync","join","chalk","existsSync","join","chalk","chalk","chalk","readFileSync","join","readFileSync","dirname","join","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/start.ts","../src/commands/lint.ts","../src/commands/test.ts","../src/commands/generate.ts","../src/commands/doctor.ts","../src/commands/add.ts","../src/commands/studio.ts","../src/commands/check.ts"],"sourcesContent":["#!/usr/bin/env node\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 */\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { serve } from './commands/serve.js';\nimport { init } from './commands/init.js';\nimport { dev } from './commands/dev.js';\nimport { buildApp } from './commands/build.js';\nimport { start } from './commands/start.js';\nimport { lint } from './commands/lint.js';\nimport { test } from './commands/test.js';\nimport { generate } from './commands/generate.js';\nimport { doctor } from './commands/doctor.js';\nimport { add } from './commands/add.js';\nimport { studio } from './commands/studio.js';\nimport { check } from './commands/check.js';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read package.json for version\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../package.json'), 'utf-8')\n);\n\nconst program = new Command();\n\nprogram\n .name('objectui')\n .description('CLI tool for Object UI - Build applications from JSON schemas')\n .version(packageJson.version);\n\nprogram\n .command('serve')\n .description('Start a development server with your JSON/YAML schema')\n .argument('[schema]', 'Path to JSON/YAML schema file', 'app.json')\n .option('-p, --port <port>', 'Port to run the server on', '3000')\n .option('-h, --host <host>', 'Host to bind the server to', 'localhost')\n .action(async (schema, options) => {\n try {\n await serve(schema, options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('dev')\n .description('Start development server (alias for serve)')\n .argument('[schema]', 'Path to JSON/YAML schema file', 'app.json')\n .option('-p, --port <port>', 'Port to run the server on', '3000')\n .option('-h, --host <host>', 'Host to bind the server to', 'localhost')\n .option('--no-open', 'Do not open browser automatically')\n .action(async (schema, options) => {\n try {\n await dev(schema, options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('build')\n .description('Build application for production')\n .argument('[schema]', 'Path to JSON/YAML schema file', 'app.json')\n .option('-o, --out-dir <dir>', 'Output directory', 'dist')\n .option('--clean', 'Clean output directory before build', false)\n .action(async (schema, options) => {\n try {\n await buildApp(schema, options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('start')\n .description('Start production server')\n .option('-p, --port <port>', 'Port to run the server on', '3000')\n .option('-h, --host <host>', 'Host to bind the server to', '0.0.0.0')\n .option('-d, --dir <dir>', 'Directory to serve', 'dist')\n .action(async (options) => {\n try {\n await start(options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('init')\n .description('初始化新的Object UI应用 / Initialize a new Object UI application with sample schema')\n .argument('[name]', '应用名称 / Application name', 'my-app')\n .option('-t, --template <template>', '使用的模板 / Template to use (dashboard, form, simple)', 'dashboard')\n .action(async (name, options) => {\n try {\n await init(name, options);\n } catch (error) {\n console.error(chalk.red('错误 Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('lint')\n .description('Lint the generated application code')\n .option('--fix', 'Automatically fix linting issues')\n .action(async (options) => {\n try {\n await lint(options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('test')\n .description('Run tests for the application')\n .option('-w, --watch', 'Run tests in watch mode')\n .option('-c, --coverage', 'Generate test coverage report')\n .option('--ui', 'Run tests with Vitest UI')\n .action(async (options) => {\n try {\n await test(options);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .alias('g')\n .description('Generate new resources (objects, pages, plugins)')\n .argument('<type>', 'Type of resource to generate (resource/object, page, plugin)')\n .argument('<name>', 'Name of the resource')\n .action(async (type, name) => {\n try {\n await generate(type, name);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('doctor')\n .description('Diagnose and fix common issues')\n .action(async () => {\n try {\n await doctor();\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('add')\n .description('Add a new component renderer to your project')\n .argument('<component>', 'Component name (e.g. Input, Grid)')\n .action(async (component) => {\n try {\n await add(component);\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('studio')\n .description('Start the visual designer')\n .action(async () => {\n try {\n await studio();\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('check')\n .description('Validate schema files')\n .action(async () => {\n try {\n await check();\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n\nprogram.parse();\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 { createServer } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport { existsSync, mkdirSync, unlinkSync, statSync } from 'fs';\nimport { join, resolve, dirname } from 'path';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { createRequire } from 'module';\nimport { scanPagesDirectory, createTempAppWithRouting, createTempApp, parseSchemaFile, type RouteInfo } from '../utils/app-generator.js';\n\ninterface DevOptions {\n port: string;\n host: string;\n open?: boolean;\n}\n\nexport async function dev(schemaPath: string, options: DevOptions) {\n const cwd = process.cwd();\n \n // Resolve the actual project root and schema file\n let _projectRoot = cwd;\n const targetSchemaPath = schemaPath;\n let hasPagesDir = false;\n let pagesDir = '';\n let appConfig: unknown = null;\n\n // 1. Determine Project Root & Mode\n const absoluteSchemaPath = resolve(cwd, schemaPath);\n \n if (existsSync(absoluteSchemaPath) && statSync(absoluteSchemaPath).isFile()) {\n // If input is a file (e.g. examples/showcase/app.json)\n const fileDir = dirname(absoluteSchemaPath);\n const potentialPagesDir = join(fileDir, 'pages');\n\n if (existsSync(potentialPagesDir)) {\n console.log(chalk.blue(`📂 Detected project structure at ${fileDir}`));\n _projectRoot = fileDir;\n hasPagesDir = true;\n pagesDir = potentialPagesDir;\n \n // Try to load app.json as config\n try {\n appConfig = parseSchemaFile(absoluteSchemaPath);\n console.log(chalk.blue('⚙️ Loaded App Config from app.json'));\n } catch (_e) {\n console.warn('Failed to parse app config');\n }\n }\n } \n \n // Fallback: Check detect pages dir in current cwd if not found above\n if (!hasPagesDir) {\n const localPagesDir = join(cwd, 'pages');\n if (existsSync(localPagesDir)) {\n hasPagesDir = true;\n pagesDir = localPagesDir;\n // Try to find app.json in cwd\n // TODO: Load app.json if exists\n }\n }\n\n const require = createRequire(join(cwd, 'package.json'));\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(`📁 Using file-system routing from ${pagesDir}`));\n routes = scanPagesDirectory(pagesDir);\n useFileSystemRouting = true;\n \n if (routes.length === 0) {\n throw new Error(`No schema files found in ${pagesDir}`);\n }\n \n console.log(chalk.green(`✓ Found ${routes.length} route(s)`));\n routes.forEach(route => {\n console.log(chalk.dim(` ${route.path} → ${route.filePath.replace(cwd, '.')}`));\n });\n } else {\n // Single schema file mode\n const fullSchemaPath = resolve(cwd, schemaPath);\n // ... (rest of the logic)\n if (!existsSync(fullSchemaPath)) {\n throw new Error(`Schema file not found: ${schemaPath}\\nRun 'objectui init' to create a sample schema.`);\n }\n console.log(chalk.blue('📋 Loading schema:'), chalk.cyan(schemaPath));\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 (always in cwd to keep node_modules access)\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, appConfig);\n } else {\n createTempApp(tmpDir, schema);\n }\n\n\n // Install dependencies\n const isMonorepo = existsSync(join(cwd, 'pnpm-workspace.yaml'));\n \n if (isMonorepo) {\n console.log(chalk.blue('📦 Detected monorepo - using root node_modules'));\n } else {\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\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: any = {\n root: tmpDir,\n server: {\n port: parseInt(options.port),\n host: options.host,\n open: options.open !== false,\n fs: {\n // Allow serving files from workspace root\n allow: [cwd],\n }\n },\n resolve: {\n alias: {}\n },\n plugins: [react()],\n };\n\n if (isMonorepo) {\n console.log(chalk.blue('📦 Detected monorepo - configuring workspace aliases'));\n \n // Remove postcss.config.js to prevent interference with programmatic config\n const postcssPath = join(tmpDir, 'postcss.config.js');\n if (existsSync(postcssPath)) {\n unlinkSync(postcssPath);\n }\n\n // Add aliases for workspace packages\n viteConfig.resolve.alias = {\n '@object-ui/react': join(cwd, 'packages/react/src/index.ts'),\n '@object-ui/components': join(cwd, 'packages/components/src/index.ts'),\n '@object-ui/core': join(cwd, 'packages/core/src/index.ts'),\n '@object-ui/types': join(cwd, 'packages/types/src/index.ts'),\n '@object-ui/plugin-charts': join(cwd, 'packages/plugin-charts/src/index.tsx'),\n '@object-ui/plugin-editor': join(cwd, 'packages/plugin-editor/src/index.tsx'),\n '@object-ui/plugin-kanban': join(cwd, 'packages/plugin-kanban/src/index.tsx'),\n '@object-ui/plugin-markdown': join(cwd, 'packages/plugin-markdown/src/index.tsx'),\n '@object-ui/plugin-form': join(cwd, 'packages/plugin-form/src/index.tsx'),\n '@object-ui/plugin-grid': join(cwd, 'packages/plugin-grid/src/index.tsx'),\n '@object-ui/plugin-view': join(cwd, 'packages/plugin-view/src/index.tsx'),\n };\n\n // Fix: Resolve lucide-react from components package to avoid \"dependency not found\" in temp app\n try {\n // Trying to find lucide-react in the components' node_modules or hoist\n // checking specifically in packages/components context\n const lucidePath = require.resolve('lucide-react', { paths: [join(cwd, 'packages/components')] });\n // We might get the cjs entry, but for aliasing usually fine. \n // Better yet, if we can find the package root, but require.resolve gives file.\n // Let's just use what require.resolve gives.\n // @ts-expect-error - lucidePath is dynamically resolved\n viteConfig.resolve.alias['lucide-react'] = lucidePath;\n } catch (e) {\n console.warn('⚠️ Could not resolve lucide-react automatically:', e);\n }\n \n // Debug aliases\n // console.log('Aliases:', viteConfig.resolve.alias);\n\n // Configure PostCSS programmatically reusing root dependencies\n try {\n const tailwindcss = require('tailwindcss');\n const autoprefixer = require('autoprefixer');\n \n viteConfig.css = {\n postcss: {\n plugins: [\n tailwindcss(join(tmpDir, 'tailwind.config.js')),\n autoprefixer(),\n ],\n },\n };\n } catch (_e) {\n console.warn(chalk.yellow('⚠️ Failed to load PostCSS plugins from root node_modules. Styles might not work correctly.'));\n }\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('✓ Development 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 { build as viteBuild } from 'vite';\nimport react from '@vitejs/plugin-react';\nimport { existsSync, mkdirSync, cpSync, rmSync } from 'fs';\nimport { join, resolve } 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 BuildOptions {\n outDir?: string;\n clean?: boolean;\n}\n\nexport async function buildApp(schemaPath: string, options: BuildOptions) {\n const cwd = process.cwd();\n const outDir = options.outDir || 'dist';\n const outputPath = resolve(cwd, outDir);\n \n console.log(chalk.blue('🔨 Building application for production...'));\n console.log();\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('📁 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 } 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 try {\n execSync('npm install --silent --prefer-offline', { \n cwd: tmpDir, \n stdio: 'pipe',\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.blue('⚙️ Building with Vite...'));\n console.log();\n\n // Clean output directory if requested\n if (options.clean && existsSync(outputPath)) {\n console.log(chalk.dim(` Cleaning ${outDir}/ directory...`));\n rmSync(outputPath, { recursive: true, force: true });\n }\n\n // Build with Vite\n try {\n await viteBuild({\n root: tmpDir,\n build: {\n outDir: join(tmpDir, 'dist'),\n emptyOutDir: true,\n reportCompressedSize: true,\n },\n plugins: [react()],\n logLevel: 'info',\n });\n\n // Copy built files to output directory\n mkdirSync(outputPath, { recursive: true });\n cpSync(join(tmpDir, 'dist'), outputPath, { recursive: true });\n\n console.log();\n console.log(chalk.green('✓ Build completed successfully!'));\n console.log();\n console.log(chalk.bold(' Output: ') + chalk.cyan(outDir + '/'));\n console.log();\n console.log(chalk.dim(' To serve the production build, run:'));\n console.log(chalk.cyan(` objectui start --dir ${outDir}`));\n console.log();\n } catch (error) {\n throw new Error(`Build failed: ${error instanceof Error ? error.message : error}`);\n }\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 express from 'express';\nimport rateLimit from 'express-rate-limit';\nimport { existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport chalk from 'chalk';\n\ninterface StartOptions {\n port: string;\n host: string;\n dir?: string;\n}\n\nexport async function start(options: StartOptions) {\n const cwd = process.cwd();\n const distDir = options.dir || 'dist';\n const distPath = resolve(cwd, distDir);\n\n // Check if dist directory exists\n if (!existsSync(distPath)) {\n throw new Error(\n `Build directory not found: ${distDir}\\n` +\n `Run 'objectui build' first to create a production build.`\n );\n }\n\n // Check if index.html exists\n const indexPath = join(distPath, 'index.html');\n if (!existsSync(indexPath)) {\n throw new Error(\n `index.html not found in ${distDir}/\\n` +\n `Make sure you have a valid production build.`\n );\n }\n\n console.log(chalk.blue('🚀 Starting production server...\\n'));\n\n const app = express();\n const port = parseInt(options.port);\n const host = options.host;\n\n // Configure rate limiting to prevent abuse\n const limiter = rateLimit({\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 1000, // Limit each IP to 1000 requests per windowMs\n message: 'Too many requests from this IP, please try again later.',\n standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers\n legacyHeaders: false, // Disable the `X-RateLimit-*` headers\n });\n\n // Apply rate limiting to all routes\n app.use(limiter);\n\n // Serve static files from dist directory\n app.use(express.static(distPath));\n\n // SPA fallback - serve index.html for all routes\n app.get('*', (req, res) => {\n res.sendFile(indexPath);\n });\n\n // Start server\n app.listen(port, host, () => {\n const protocol = 'http';\n const displayHost = host === '0.0.0.0' ? 'localhost' : host;\n\n console.log(chalk.green('✓ Production server started successfully!'));\n console.log();\n console.log(chalk.bold(' Local: ') + chalk.cyan(`${protocol}://${displayHost}:${port}`));\n console.log(chalk.bold(' Serving: ') + chalk.dim(distDir + '/'));\n console.log();\n console.log(chalk.dim(' Press Ctrl+C to stop the server'));\n console.log();\n });\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 { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\n\ninterface LintOptions {\n fix?: boolean;\n}\n\nexport async function lint(options: LintOptions) {\n const cwd = process.cwd();\n \n console.log(chalk.blue('🔍 Running linter...\\n'));\n\n // Check if the generated temp app exists\n const tmpDir = join(cwd, '.objectui-tmp');\n const hasTempApp = existsSync(tmpDir);\n\n if (!hasTempApp) {\n throw new Error(\n 'No Object UI application found. Run \\'objectui dev\\' first to generate the application.'\n );\n }\n\n // Check if package.json and node_modules exist\n const packageJsonPath = join(tmpDir, 'package.json');\n const nodeModulesPath = join(tmpDir, 'node_modules');\n \n if (!existsSync(packageJsonPath) || !existsSync(nodeModulesPath)) {\n throw new Error(\n 'Dependencies not installed. Run \\'objectui dev\\' first to set up the application.'\n );\n }\n\n try {\n const fixFlag = options.fix ? '--fix' : '';\n const command = `npx eslint \"src/**/*.{js,jsx,ts,tsx}\" ${fixFlag}`.trim();\n \n console.log(chalk.dim(` Running: ${command}\\n`));\n \n execSync(command, {\n cwd: tmpDir,\n stdio: 'inherit',\n });\n\n console.log();\n console.log(chalk.green('✓ Linting completed successfully!'));\n console.log();\n } catch {\n // ESLint returns non-zero exit code when there are linting errors\n console.log();\n console.log(chalk.yellow('⚠ Linting found issues.'));\n if (!options.fix) {\n console.log(chalk.dim(' Run \\'objectui lint --fix\\' to automatically fix some issues.'));\n }\n console.log();\n process.exit(1);\n }\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 { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport chalk from 'chalk';\n\ninterface TestOptions {\n watch?: boolean;\n coverage?: boolean;\n ui?: boolean;\n}\n\nexport async function test(options: TestOptions) {\n const cwd = process.cwd();\n \n console.log(chalk.blue('🧪 Running tests...\\n'));\n\n // Check if the generated temp app exists\n const tmpDir = join(cwd, '.objectui-tmp');\n const hasTempApp = existsSync(tmpDir);\n\n if (!hasTempApp) {\n throw new Error(\n 'No Object UI application found. Run \\'objectui dev\\' first to generate the application.'\n );\n }\n\n // Check if package.json and node_modules exist\n const packageJsonPath = join(tmpDir, 'package.json');\n const nodeModulesPath = join(tmpDir, 'node_modules');\n \n if (!existsSync(packageJsonPath) || !existsSync(nodeModulesPath)) {\n throw new Error(\n 'Dependencies not installed. Run \\'objectui dev\\' first to set up the application.'\n );\n }\n\n try {\n let command = 'npx vitest';\n \n if (options.watch) {\n command += ' --watch';\n } else if (options.ui) {\n command += ' --ui';\n } else {\n command += ' run';\n }\n\n if (options.coverage) {\n command += ' --coverage';\n }\n\n console.log(chalk.dim(` Running: ${command}\\n`));\n \n execSync(command, {\n cwd: tmpDir,\n stdio: 'inherit',\n });\n\n if (!options.watch && !options.ui) {\n console.log();\n console.log(chalk.green('✓ Tests completed successfully!'));\n console.log();\n }\n } catch {\n // Vitest returns non-zero exit code when tests fail\n console.log();\n console.log(chalk.red('✗ Some tests failed.'));\n console.log();\n process.exit(1);\n }\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 chalk from 'chalk';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\nexport async function generate(type: string, name: string) {\n const cwd = process.cwd();\n\n switch (type) {\n case 'resource':\n case 'object':\n generateResource(cwd, name);\n break;\n case 'page':\n generatePage(cwd, name);\n break;\n case 'plugin':\n generatePlugin(cwd, name);\n break;\n default:\n console.log(chalk.red(`Unknown type: ${type}`));\n console.log(`Available types: resource, page, plugin`);\n process.exit(1);\n }\n}\n\nfunction generateResource(cwd: string, name: string) {\n const dir = join(cwd, 'objects');\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n const fileName = `${name.toLowerCase()}.json`;\n const filePath = join(dir, fileName);\n\n if (existsSync(filePath)) {\n console.log(chalk.yellow(`Object ${name} already exists at ${filePath}`));\n return;\n }\n\n const content = {\n name: name,\n fields: {\n name: { type: 'text', label: 'Name', required: true }\n }\n };\n\n writeFileSync(filePath, JSON.stringify(content, null, 2));\n console.log(chalk.green(`✓ Generated resource schema: ${filePath}`));\n}\n\nfunction generatePage(cwd: string, name: string) {\n const dir = join(cwd, 'pages');\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n const fileName = `${name.toLowerCase()}.json`;\n const filePath = join(dir, fileName);\n\n if (existsSync(filePath)) {\n console.log(chalk.yellow(`Page ${name} already exists at ${filePath}`));\n return;\n }\n\n const content = {\n type: \"page\",\n title: name,\n body: [\n {\n type: \"markdown\",\n content: `# Welcome to ${name}`\n }\n ]\n };\n\n writeFileSync(filePath, JSON.stringify(content, null, 2));\n console.log(chalk.green(`✓ Generated page schema: ${filePath}`));\n}\n\nfunction generatePlugin(cwd: string, name: string) {\n const dir = join(cwd, 'plugins', name);\n if (existsSync(dir)) {\n console.log(chalk.yellow(`Plugin ${name} already exists`));\n return;\n }\n mkdirSync(dir, { recursive: true });\n\n const content = `\nexport const ${name}Plugin = {\n name: '${name}',\n install(app) {\n console.log('${name} plugin installed');\n }\n};\n`;\n\n writeFileSync(join(dir, 'index.ts'), content.trim());\n console.log(chalk.green(`✓ Generated plugin: ${dir}`));\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 chalk from 'chalk';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\nexport async function doctor() {\n console.log(chalk.bold('Object UI Doctor'));\n console.log('Diagnosis in progress...\\n');\n \n const cwd = process.cwd();\n let issues = 0;\n\n // 1. Check package.json\n const pkgPath = join(cwd, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n \n // Check React version\n const reactVer = pkg.dependencies?.react || pkg.devDependencies?.react;\n if (reactVer) {\n console.log(chalk.green('✓ React installed'));\n } else {\n console.log(chalk.yellow('⚠️ React not found in dependencies'));\n issues++;\n }\n\n // Check Tailwind\n const tailwindVer = pkg.dependencies?.tailwindcss || pkg.devDependencies?.tailwindcss;\n if (tailwindVer) {\n console.log(chalk.green('✓ Tailwind CSS installed'));\n } else {\n console.log(chalk.yellow('⚠️ Tailwind CSS not found'));\n issues++;\n }\n } catch (e) {\n console.log(chalk.red('x Failed to read package.json'));\n issues++;\n }\n } else {\n console.log(chalk.red('x package.json not found'));\n issues++;\n }\n\n // 2. Check tailwind.config.js\n const tailwindConfigPath = join(cwd, 'tailwind.config.js');\n if (existsSync(tailwindConfigPath)) {\n console.log(chalk.green('✓ tailwind.config.js found'));\n // TODO: Check content configuration\n } else {\n console.log(chalk.yellow('⚠️ tailwind.config.js not found'));\n issues++;\n }\n\n // Summary\n console.log('\\nResult:');\n if (issues === 0) {\n console.log(chalk.green('Everything looks good! ✨'));\n } else {\n console.log(chalk.yellow(`Found ${issues} issue(s).`));\n }\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 chalk from 'chalk';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\nexport async function add(component: string) {\n console.log(chalk.bold(`Object UI Add: ${component}`));\n console.log(chalk.yellow('Feature not implemented yet.'));\n console.log(`This command will download the source code for ${component}Renderer to your project.`);\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 chalk from 'chalk';\nimport { serve } from './serve.js';\n\nexport async function studio() {\n console.log(chalk.bold('Starting Object UI Studio...'));\n \n // Logic to start designer server\n // This might reuse 'serve' but with a special mode or different root\n \n console.log(chalk.yellow('Studio mode is experimental.'));\n \n // For now, we can just point to the designer URL if it was hosted, \n // or start the local dev server with a flag.\n // Assuming designer is a static app that connects to the local API.\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 chalk from 'chalk';\nimport { globSync } from 'glob';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\n\nexport async function check() {\n console.log(chalk.bold('Object UI Schema Check'));\n const cwd = process.cwd();\n \n // 1. Find all JSON/YAML files\n const files = globSync('**/*.{json,yaml,yml}', { \n cwd, \n ignore: ['node_modules/**', 'dist/**', '.git/**'] \n });\n \n console.log(`Analyzing ${files.length} files...`);\n \n let errors = 0;\n \n for (const file of files) {\n try {\n // Basic JSON parsing check\n if (file.endsWith('.json')) {\n JSON.parse(readFileSync(join(cwd, file), 'utf-8'));\n }\n // TODO: Schema validation logic\n } catch (e) {\n console.log(chalk.red(`x Invalid JSON in ${file}: ${(e as Error).message}`));\n errors++;\n }\n }\n \n if (errors === 0) {\n console.log(chalk.green('✓ All checks passed'));\n } else {\n console.log(chalk.red(`Found ${errors} errors`));\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["chalk","require","react","existsSync","mkdirSync","join","resolve","chalk","execSync","resolve","chalk","join","existsSync","mkdirSync","execSync","react","existsSync","join","resolve","chalk","execSync","existsSync","join","chalk","execSync","existsSync","join","chalk","chalk","existsSync","mkdirSync","join","chalk","existsSync","join","chalk","chalk","chalk","readFileSync","join","readFileSync","dirname","join","chalk"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
1
8
|
interface ServeOptions {
|
|
2
9
|
port: string;
|
|
3
10
|
host: string;
|
|
4
11
|
}
|
|
5
12
|
declare function serve(schemaPath: string, options: ServeOptions): Promise<void>;
|
|
6
13
|
|
|
14
|
+
/**
|
|
15
|
+
* ObjectUI
|
|
16
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
17
|
+
*
|
|
18
|
+
* This source code is licensed under the MIT license found in the
|
|
19
|
+
* LICENSE file in the root directory of this source tree.
|
|
20
|
+
*/
|
|
7
21
|
interface InitOptions {
|
|
8
22
|
template: string;
|
|
9
23
|
}
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "CLI tool for Object UI - Build applications from JSON schemas",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"homepage": "https://www.objectui.org",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/objectstack-ai/objectui.git",
|
|
10
|
+
"directory": "packages/cli"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/objectstack-ai/objectui/issues"
|
|
14
|
+
},
|
|
6
15
|
"bin": {
|
|
7
16
|
"objectui": "./dist/cli.js"
|
|
8
17
|
},
|
|
@@ -31,17 +40,17 @@
|
|
|
31
40
|
"chalk": "^5.4.1",
|
|
32
41
|
"commander": "^14.0.2",
|
|
33
42
|
"express": "^4.21.2",
|
|
34
|
-
"express-rate-limit": "^
|
|
43
|
+
"express-rate-limit": "^8.2.1",
|
|
35
44
|
"glob": "^13.0.0",
|
|
36
45
|
"js-yaml": "^4.1.0",
|
|
37
46
|
"vite": "^7.3.1",
|
|
38
|
-
"@object-ui/components": "0.3.
|
|
39
|
-
"@object-ui/react": "0.3.
|
|
47
|
+
"@object-ui/components": "0.3.1",
|
|
48
|
+
"@object-ui/react": "0.3.1"
|
|
40
49
|
},
|
|
41
50
|
"devDependencies": {
|
|
42
51
|
"@types/express": "^4.17.21",
|
|
43
52
|
"@types/js-yaml": "^4.0.9",
|
|
44
|
-
"@types/node": "^25.0.
|
|
53
|
+
"@types/node": "^25.0.10",
|
|
45
54
|
"tsup": "^8.0.0",
|
|
46
55
|
"typescript": "^5.9.3"
|
|
47
56
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/serve.ts","../src/utils/app-generator.ts","../src/commands/init.ts"],"sourcesContent":["import { 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","import { 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';\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 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 // 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 { \n cn,\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-ignore\n const Icon = LucideIcons[name];\n if (!Icon) return null;\n return <Icon className={className} />;\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 </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';\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","import { 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":"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","names":["existsSync","mkdirSync","join","chalk","join","existsSync","chalk","mkdirSync","existsSync","writeFileSync","mkdirSync","join","chalk"]}
|