@lytjs/cli 6.5.0 → 6.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create.cjs +1 -1
- package/dist/create.cjs.map +1 -1
- package/dist/create.mjs +1 -1
- package/dist/create.mjs.map +1 -1
- package/dist/index.cjs +128 -85
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +130 -87
- package/dist/index.mjs.map +1 -1
- package/dist/lyt.cjs +128 -85
- package/dist/lyt.cjs.map +1 -1
- package/dist/lyt.mjs +130 -87
- package/dist/lyt.mjs.map +1 -1
- package/lyt-cli.js +4 -3
- package/package.json +3 -3
- package/dist/create.d.mts +0 -2
- package/dist/create.d.ts +0 -2
- package/dist/index.d.mts +0 -208
- package/dist/index.d.ts +0 -208
- package/dist/lyt.d.mts +0 -1
- package/dist/lyt.d.ts +0 -1
package/dist/create.cjs
CHANGED
package/dist/create.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/package.ts","../src/commands/create.ts","../src/create.ts"],"names":["existsSync","mkdirSync","dirname","writeFileSync","readdirSync","join","execSync","resolve"],"mappings":"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","file":"create.cjs","sourcesContent":["/**\r\n * @lytjs/cli - Logger utilities\r\n */\r\n\r\nconst colors = {\r\n reset: '\\x1b[0m',\r\n bright: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n cyan: '\\x1b[36m',\r\n};\r\n\r\nfunction colorize(text: string, color: keyof typeof colors): string {\r\n if (!isColorSupported()) return text;\r\n return `${colors[color]}${text}${colors.reset}`;\r\n}\r\n\r\nexport const logger = {\r\n info(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.log(colorize('ℹ ', 'blue') + message);\r\n },\r\n \r\n success(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.log(colorize('✔ ', 'green') + message);\r\n },\r\n \r\n warning(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.log(colorize('⚠ ', 'yellow') + message);\r\n },\r\n \r\n error(message: string): void {\r\n console.error(colorize('✖ ', 'red') + message);\r\n },\r\n \r\n dim(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.log(colorize(message, 'dim'));\r\n },\r\n \r\n bold(message: string): string {\r\n return colorize(message, 'bright');\r\n },\r\n};\r\n\r\n/**\r\n * Check if terminal supports colors\r\n */\r\nexport function isColorSupported(): boolean {\r\n return process.stdout.isTTY && process.env.NO_COLOR !== '1';\r\n}\r\n","/**\r\n * @lytjs/cli - File system utilities\r\n */\r\n\r\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from 'fs';\r\nimport { join, dirname } from 'path';\r\n\r\n/**\r\n * Ensure directory exists (create if not)\r\n */\r\nexport function ensureDir(dir: string): void {\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Write a file with content, creating parent directories if needed\r\n */\r\nexport function writeFile(filePath: string, content: string): void {\r\n ensureDir(dirname(filePath));\r\n writeFileSync(filePath, content, 'utf-8');\r\n}\r\n\r\n/**\r\n * Read a file as string\r\n */\r\nexport function readFile(filePath: string): string {\r\n return readFileSync(filePath, 'utf-8');\r\n}\r\n\r\n/**\r\n * Check if path exists\r\n */\r\nexport function exists(path: string): boolean {\r\n return existsSync(path);\r\n}\r\n\r\n/**\r\n * Copy directory recursively\r\n */\r\nexport function copyDir(src: string, dest: string): void {\r\n ensureDir(dest);\r\n const entries = readdirSync(src, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const srcPath = join(src, entry.name);\r\n const destPath = join(dest, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n copyDir(srcPath, destPath);\r\n } else {\r\n writeFile(destPath, readFileSync(srcPath, 'utf-8'));\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Check if directory is empty\r\n */\r\nexport function isEmptyDir(dir: string): boolean {\r\n if (!existsSync(dir)) return true;\r\n const files = readdirSync(dir);\r\n return files.length === 0;\r\n}\r\n","/**\r\n * @lytjs/cli - Package manager utilities\r\n */\r\n\r\nimport { execSync } from 'child_process';\r\nimport { existsSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm';\r\n\r\n/**\r\n * Detect which package manager to use\r\n */\r\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManager {\r\n // Check for lock files\r\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\r\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\r\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\r\n \r\n // Default to pnpm if available\r\n try {\r\n execSync('pnpm --version', { stdio: 'ignore' });\r\n return 'pnpm';\r\n } catch {\r\n // Fall back to npm\r\n return 'npm';\r\n }\r\n}\r\n\r\n/**\r\n * Get install command for package manager\r\n */\r\nexport function getInstallCommand(pm: PackageManager): string {\r\n switch (pm) {\r\n case 'pnpm': return 'pnpm install';\r\n case 'yarn': return 'yarn';\r\n case 'npm': return 'npm install';\r\n }\r\n}\r\n\r\n/**\r\n * Get run command for package manager\r\n */\r\nexport function getRunCommand(pm: PackageManager, script: string): string {\r\n switch (pm) {\r\n case 'pnpm': return `pnpm run ${script}`;\r\n case 'yarn': return `yarn ${script}`;\r\n case 'npm': return `npm run ${script}`;\r\n }\r\n}\r\n\r\n/**\r\n * Get add dependency command\r\n */\r\nexport function getAddCommand(pm: PackageManager, dep: string, dev: boolean = false): string {\r\n const devFlag = dev ? ' -D' : '';\r\n switch (pm) {\r\n case 'pnpm': return `pnpm add${devFlag} ${dep}`;\r\n case 'yarn': return `yarn add${devFlag} ${dep}`;\r\n case 'npm': return `npm install${devFlag} ${dep}`;\r\n }\r\n}\r\n","/**\r\n * @lytjs/cli - create command\r\n *\r\n * Creates a new LytJS project from a template.\r\n */\r\n\r\nimport type { CreateOptions } from '../types';\r\nimport { logger } from '../utils/logger';\r\nimport { ensureDir, writeFile, exists, isEmptyDir } from '../utils/fs';\r\nimport { detectPackageManager, getInstallCommand } from '../utils/package';\r\nimport { join, resolve } from 'path';\r\nimport { execSync } from 'child_process';\r\n\r\nconst TEMPLATES = {\r\n default: 'Default template with TypeScript and Vite',\r\n minimal: 'Minimal template without extra dependencies',\r\n ssr: 'SSR-enabled template',\r\n router: 'Template with Router integration',\r\n store: 'Template with Store integration',\r\n full: 'Full-featured template with Router, Store, and UI components',\r\n};\r\n\r\n/**\r\n * Create a new LytJS project\r\n */\r\nexport async function create(projectName?: string, options: Partial<CreateOptions> = {}): Promise<void> {\r\n if (!projectName) {\r\n logger.error('Please provide a project name.');\r\n logger.info('Usage: lyt create <project-name>');\r\n process.exit(1);\r\n }\r\n const targetDir = resolve(process.cwd(), projectName);\r\n \r\n // Check if directory exists and is not empty\r\n if (exists(targetDir) && !isEmptyDir(targetDir) && !options.force) {\r\n logger.error(`Directory \"${projectName}\" already exists and is not empty.`);\r\n logger.info('Use --force to overwrite.');\r\n process.exit(1);\r\n }\r\n \r\n logger.info(`Creating a new LytJS project in ${targetDir}...`);\r\n \r\n // Create directory\r\n ensureDir(targetDir);\r\n \r\n // Generate project files\r\n generateProjectFiles(targetDir, projectName, options.template || 'default');\r\n \r\n // Install dependencies\r\n logger.info('Installing dependencies...');\r\n const pm = detectPackageManager();\r\n try {\r\n execSync(getInstallCommand(pm), { cwd: targetDir, stdio: 'inherit' });\r\n logger.success('Dependencies installed successfully!');\r\n } catch (_error) {\r\n logger.warning('Failed to install dependencies automatically.');\r\n logger.info(`Please run \"${getInstallCommand(pm)}\" manually.`);\r\n }\r\n \r\n // Print next steps\r\n logger.success(`Project \"${projectName}\" created successfully!`);\r\n logger.info('');\r\n logger.bold('Next steps:');\r\n logger.info(` cd ${projectName}`);\r\n logger.info(` ${pm === 'npm' ? 'npm run' : pm} dev`);\r\n}\r\n\r\n/**\r\n * Generate project files\r\n */\r\nfunction generateProjectFiles(targetDir: string, projectName: string, template: string): void {\r\n // Determine template-specific settings\r\n const isMinimal = template === 'minimal';\r\n const isSsr = template === 'ssr';\r\n const isRouter = template === 'router' || template === 'full';\r\n const isStore = template === 'store' || template === 'full';\r\n const isFull = template === 'full';\r\n\r\n // package.json - use explicit type to allow property access\r\n interface PackageJsonTemplate {\r\n name: string;\r\n version: string;\r\n type: string;\r\n scripts: Record<string, string>;\r\n dependencies: Record<string, string>;\r\n devDependencies: Record<string, string>;\r\n }\r\n\r\n const packageJson: PackageJsonTemplate = {\r\n name: projectName,\r\n version: '0.0.0',\r\n type: 'module',\r\n scripts: {\r\n dev: 'vite',\r\n build: 'vite build',\r\n preview: 'vite preview',\r\n },\r\n dependencies: {\r\n '@lytjs/core': '^6.0.0',\r\n },\r\n devDependencies: {\r\n '@lytjs/plugin-vite': '^6.0.0',\r\n 'vite': '^5.0.0',\r\n },\r\n };\r\n\r\n // Minimal template: no vitest, no test script\r\n if (!isMinimal) {\r\n packageJson.scripts.test = 'vitest';\r\n packageJson.devDependencies.vitest = '^1.0.0';\r\n }\r\n\r\n // SSR template: add @lytjs/server dependency\r\n if (isSsr) {\r\n packageJson.dependencies['@lytjs/server'] = '^6.0.0';\r\n packageJson.scripts['build:client'] = 'vite build --ssrManifest';\r\n packageJson.scripts['build:server'] = 'vite build --ssr src/entry-server.ts';\r\n packageJson.scripts['build'] = 'npm run build:client && npm run build:server';\r\n packageJson.scripts['preview'] = 'node server';\r\n }\r\n\r\n // Router template: add @lytjs/router\r\n if (isRouter) {\r\n packageJson.dependencies['@lytjs/router'] = '^1.0.0';\r\n }\r\n\r\n // Store template: add @lytjs/store\r\n if (isStore) {\r\n packageJson.dependencies['@lytjs/store'] = '^1.0.0';\r\n }\r\n\r\n // Full template: add @lytjs/ui\r\n if (isFull) {\r\n packageJson.dependencies['@lytjs/ui'] = '^0.4.0';\r\n }\r\n\r\n writeFile(join(targetDir, 'package.json'), JSON.stringify(packageJson, null, 2));\r\n\r\n // vite.config.ts\r\n let viteConfig: string;\r\n if (isSsr) {\r\n viteConfig = `import { defineConfig } from 'vite';\r\nimport lytjs from '@lytjs/plugin-vite';\r\n\r\nexport default defineConfig({\r\n plugins: [lytjs()],\r\n build: {\r\n ssrManifest: true,\r\n },\r\n});\r\n`;\r\n } else {\r\n viteConfig = `import { defineConfig } from 'vite';\r\nimport lytjs from '@lytjs/plugin-vite';\r\n\r\nexport default defineConfig({\r\n plugins: [lytjs()],\r\n});\r\n`;\r\n }\r\n writeFile(join(targetDir, 'vite.config.ts'), viteConfig);\r\n\r\n // index.html\r\n const indexHtml = `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>${projectName}</title>\r\n </head>\r\n <body>\r\n <div id=\"app\"></div>\r\n <script type=\"module\" src=\"/src/main.ts\"></script>\r\n </body>\r\n</html>\r\n`;\r\n writeFile(join(targetDir, 'index.html'), indexHtml);\r\n\r\n // src/main.ts\r\n let mainTs: string;\r\n if (isSsr) {\r\n mainTs = `import { createApp } from '@lytjs/core';\r\nimport App from './App.lyt';\r\nimport { createSSRApp } from '@lytjs/server';\r\n${isRouter ? \"import { createRouter, createWebHistory } from '@lytjs/router';\" : ''}\r\n${isStore ? \"import { createPinia } from '@lytjs/store';\" : ''}\r\n\r\nconst app = createSSRApp(App);\r\n${isStore ? 'app.use(createPinia());' : ''}\r\n${isRouter ? `\r\nconst router = createRouter({\r\n history: createWebHistory(),\r\n routes: [\r\n { path: '/', component: () => import('./pages/Home.lyt') },\r\n { path: '/about', component: () => import('./pages/About.lyt') },\r\n ],\r\n});\r\napp.use(router);\r\n` : ''}\r\napp.mount('#app');\r\n`;\r\n } else if (isRouter || isStore) {\r\n mainTs = `import { createApp } from '@lytjs/core';\r\nimport App from './App.lyt';\r\n${isRouter ? \"import { createRouter, createWebHistory } from '@lytjs/router';\" : ''}\r\n${isStore ? \"import { createPinia } from '@lytjs/store';\" : ''}\r\n\r\nconst app = createApp(App);\r\n${isStore ? 'app.use(createPinia());' : ''}\r\n${isRouter ? `\r\nconst router = createRouter({\r\n history: createWebHistory(),\r\n routes: [\r\n { path: '/', component: () => import('./pages/Home.lyt') },\r\n { path: '/about', component: () => import('./pages/About.lyt') },\r\n ],\r\n});\r\napp.use(router);\r\n` : ''}\r\napp.mount('#app');\r\n`;\r\n } else {\r\n mainTs = `import { createApp } from '@lytjs/core';\r\nimport App from './App.lyt';\r\n\r\ncreateApp(App).mount('#app');\r\n`;\r\n }\r\n writeFile(join(targetDir, 'src/main.ts'), mainTs);\r\n\r\n // src/App.lyt\r\n let appLyt: string;\r\n if (isMinimal) {\r\n appLyt = `<template>\r\n <div class=\"app\">\r\n <h1>{{ title }}</h1>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nconst title = 'Hello LytJS!';\r\n</script>\r\n\r\n<style scoped>\r\n.app {\r\n text-align: center;\r\n}\r\n</style>\r\n`;\r\n } else if (isRouter) {\r\n appLyt = `<template>\r\n <div class=\"app\">\r\n <nav class=\"nav\">\r\n <router-link to=\"/\">Home</router-link>\r\n <router-link to=\"/about\">About</router-link>\r\n </nav>\r\n <router-view />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { RouterLink, RouterView } from '@lytjs/router';\r\n</script>\r\n\r\n<style scoped>\r\n.app {\r\n text-align: center;\r\n padding: 2rem;\r\n}\r\n\r\n.nav {\r\n margin-bottom: 2rem;\r\n}\r\n\r\n.nav a {\r\n margin: 0 1rem;\r\n color: #42b883;\r\n text-decoration: none;\r\n}\r\n\r\n.nav a:hover {\r\n text-decoration: underline;\r\n}\r\n</style>\r\n`;\r\n } else {\r\n appLyt = `<template>\r\n <div class=\"app\">\r\n <h1>{{ title }}</h1>\r\n <p>Welcome to your LytJS app!</p>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nconst title = 'Hello LytJS!';\r\n</script>\r\n\r\n<style scoped>\r\n.app {\r\n text-align: center;\r\n padding: 2rem;\r\n}\r\n\r\nh1 {\r\n color: #42b883;\r\n}\r\n</style>\r\n`;\r\n }\r\n writeFile(join(targetDir, 'src/App.lyt'), appLyt);\r\n\r\n // Router template: add pages and store\r\n if (isRouter) {\r\n // Home page\r\n const homePage = `<template>\r\n <div class=\"home\">\r\n <h1>Home</h1>\r\n ${isStore ? `\r\n <p>Count: {{ count }}</p>\r\n <button @click=\"increment\">Increment</button>\r\n <button @click=\"decrement\">Decrement</button>\r\n ` : ''}\r\n <p>Welcome to the Home page!</p>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n${isStore ? `import { useCounterStore } from '../stores/counter';\r\nconst counterStore = useCounterStore();\r\nconst { count, increment, decrement } = counterStore;\r\n` : ''}\r\n</script>\r\n\r\n<style scoped>\r\n.home {\r\n padding: 1rem;\r\n}\r\n</style>\r\n`;\r\n ensureDir(join(targetDir, 'src', 'pages'));\r\n writeFile(join(targetDir, 'src', 'pages', 'Home.lyt'), homePage);\r\n\r\n // About page\r\n const aboutPage = `<template>\r\n <div class=\"about\">\r\n <h1>About</h1>\r\n <p>This is the About page!</p>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n</script>\r\n\r\n<style scoped>\r\n.about {\r\n padding: 1rem;\r\n}\r\n</style>\r\n`;\r\n writeFile(join(targetDir, 'src', 'pages', 'About.lyt'), aboutPage);\r\n }\r\n\r\n // Store template: add example store\r\n if (isStore) {\r\n const counterStore = `import { defineStore } from '@lytjs/store';\r\nimport { signal, computed } from '@lytjs/reactivity';\r\n\r\nexport const useCounterStore = defineStore('counter', () => {\r\n // State\r\n const count = signal(0);\r\n\r\n // Getters\r\n const doubleCount = computed(() => count.value * 2);\r\n\r\n // Actions\r\n function increment() {\r\n count.value++;\r\n }\r\n\r\n function decrement() {\r\n count.value--;\r\n }\r\n\r\n function reset() {\r\n count.value = 0;\r\n }\r\n\r\n return {\r\n count,\r\n doubleCount,\r\n increment,\r\n decrement,\r\n reset,\r\n };\r\n});\r\n`;\r\n ensureDir(join(targetDir, 'src', 'stores'));\r\n writeFile(join(targetDir, 'src', 'stores', 'counter.ts'), counterStore);\r\n }\r\n\r\n // SSR-specific files\r\n if (isSsr) {\r\n // src/entry-server.ts\r\n const entryServer = `import { createSSRApp, h } from '@lytjs/core';\r\nimport { renderToString } from '@lytjs/ssr';\r\nimport App from './App.lyt';\r\n\r\nexport async function render(url: string) {\r\n const app = createSSRApp({\r\n render() {\r\n return h(App);\r\n }\r\n });\r\n\r\n const html = await renderToString(app);\r\n return html;\r\n}\r\n`;\r\n writeFile(join(targetDir, 'src/entry-server.ts'), entryServer);\r\n\r\n // src/entry-client.ts\r\n const entryClient = `import { createApp } from '@lytjs/core';\r\nimport App from './App.lyt';\r\n\r\nconst app = createApp(App);\r\napp.mount('#app');\r\n`;\r\n writeFile(join(targetDir, 'src/entry-client.ts'), entryClient);\r\n\r\n // server.ts - complete SSR server implementation\r\n const serverTs = `/**\r\n * LytJS SSR Server\r\n *\r\n * Complete SSR server with Vite dev server and production build support.\r\n * Supports streaming SSR, route prefetching, and static file serving.\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { fileURLToPath } from 'url';\r\nimport http from 'http';\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\nconst isProduction = process.env.NODE_ENV === 'production';\r\nconst DIST_DIR = path.join(__dirname, 'dist');\r\nconst PORT = parseInt(process.env.PORT || '3000', 10);\r\n\r\ninterface RenderOptions {\r\n url: string;\r\n template: string;\r\n manifest?: Record<string, string[]>;\r\n}\r\n\r\nasync function renderPage({ url, template, manifest }: RenderOptions): Promise<string> {\r\n let app: any;\r\n let vite: any;\r\n\r\n if (!isProduction) {\r\n const { createServer: createViteServer } = await import('vite');\r\n vite = await createViteServer({\r\n server: { middlewareMode: true },\r\n appType: 'custom',\r\n });\r\n app = (await vite.ssrLoadModule(path.join(__dirname, 'src/entry-server.ts'))).default;\r\n } else {\r\n app = (await import(path.join(DIST_DIR, 'server/entry-server.js'))).default;\r\n }\r\n\r\n const html = await app.render(url);\r\n return template.replace('<!--app-html-->', html);\r\n}\r\n\r\nasync function createServer() {\r\n let vite: any;\r\n\r\n // Load index.html template\r\n let template: string;\r\n\r\n if (!isProduction) {\r\n const { createServer: createViteServer } = await import('vite');\r\n vite = await createViteServer({\r\n server: { middlewareMode: true },\r\n appType: 'custom',\r\n });\r\n template = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf-8');\r\n } else {\r\n template = fs.readFileSync(path.join(DIST_DIR, 'client/index.html'), 'utf-8');\r\n }\r\n\r\n const server = http.createServer(async (req, res) => {\r\n const url = req.url || '/';\r\n\r\n try {\r\n if (!isProduction && url.startsWith('/@')) {\r\n // Vite dev server requests\r\n return;\r\n }\r\n\r\n // Static assets\r\n if (url.startsWith('/assets/') || url.endsWith('.js') || url.endsWith('.css')) {\r\n const filePath = isProduction\r\n ? path.join(DIST_DIR, 'client', url)\r\n : path.join(__dirname, url);\r\n\r\n if (fs.existsSync(filePath)) {\r\n const ext = path.extname(filePath);\r\n const contentType = ext === '.css' ? 'text/css' : 'application/javascript';\r\n res.writeHead(200, { 'Content-Type': contentType });\r\n res.end(fs.readFileSync(filePath));\r\n return;\r\n }\r\n }\r\n\r\n // SSR rendering\r\n const html = await renderPage({\r\n url,\r\n template,\r\n manifest: isProduction\r\n ? JSON.parse(fs.readFileSync(path.join(DIST_DIR, 'client/ssr-manifest.json'), 'utf-8'))\r\n : undefined\r\n });\r\n\r\n res.writeHead(200, { 'Content-Type': 'text/html' });\r\n res.end(html);\r\n } catch (err: any) {\r\n if (!isProduction && vite) {\r\n vite.ssrFixStacktrace(err);\r\n }\r\n console.error('SSR Error:', err);\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end('Internal Server Error');\r\n }\r\n });\r\n\r\n server.listen(PORT, () => {\r\n console.log(\\`LytJS SSR server running at http://localhost:\\${PORT}\\`);\r\n console.log(\\`Mode: \\${isProduction ? 'Production' : 'Development'}\\`);\r\n });\r\n}\r\n\r\ncreateServer().catch(console.error);\r\n`;\r\n writeFile(join(targetDir, 'server.ts'), serverTs);\r\n }\r\n\r\n // tsconfig.json\r\n const tsConfig = {\r\n compilerOptions: {\r\n target: 'ES2020',\r\n useDefineForClassFields: true,\r\n module: 'ESNext',\r\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\r\n skipLibCheck: true,\r\n moduleResolution: 'bundler',\r\n allowImportingTsExtensions: true,\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n noEmit: true,\r\n strict: true,\r\n noUnusedLocals: true,\r\n noUnusedParameters: true,\r\n noFallthroughCasesInSwitch: true,\r\n },\r\n include: ['src/**/*.ts', 'src/**/*.lyt'],\r\n references: [{ path: './tsconfig.node.json' }],\r\n };\r\n writeFile(join(targetDir, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2));\r\n\r\n // tsconfig.node.json\r\n const tsConfigNode = {\r\n compilerOptions: {\r\n composite: true,\r\n skipLibCheck: true,\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n allowSyntheticDefaultImports: true,\r\n },\r\n include: ['vite.config.ts'],\r\n };\r\n writeFile(join(targetDir, 'tsconfig.node.json'), JSON.stringify(tsConfigNode, null, 2));\r\n\r\n // .gitignore\r\n const gitignore = `# Logs\r\nlogs\r\n*.log\r\nnpm-debug.log*\r\nyarn-debug.log*\r\nyarn-error.log*\r\npnpm-debug.log*\r\nlerna-debug.log*\r\n\r\nnode_modules\r\ndist\r\ndist-ssr\r\n*.local\r\n\r\n# Editor directories and files\r\n.vscode/*\r\n!.vscode/extensions.json\r\n.idea\r\n.DS_Store\r\n*.suo\r\n*.ntvs*\r\n*.njsproj\r\n*.sln\r\n*.sw?\r\n`;\r\n writeFile(join(targetDir, '.gitignore'), gitignore);\r\n}\r\n\r\n/**\r\n * List available templates\r\n */\r\nexport function listTemplates(): void {\r\n logger.bold('Available templates:');\r\n for (const [name, description] of Object.entries(TEMPLATES)) {\r\n logger.info(` ${name.padEnd(10)} - ${description}`);\r\n }\r\n}\r\n","import { create } from './commands/create';\r\n\r\ncreate().catch(console.error);"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/package.ts","../src/commands/create.ts","../src/create.ts"],"names":["existsSync","mkdirSync","dirname","writeFileSync","readdirSync","join","execSync","resolve"],"mappings":"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","file":"create.cjs","sourcesContent":["/**\n * @lytjs/cli - Logger utilities\n */\n\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n};\n\nfunction colorize(text: string, color: keyof typeof colors): string {\n if (!isColorSupported()) return text;\n return `${colors[color]}${text}${colors.reset}`;\n}\n\nexport const logger = {\n info(message: string): void {\n // eslint-disable-next-line no-console\n console.log(colorize('ℹ ', 'blue') + message);\n },\n\n success(message: string): void {\n // eslint-disable-next-line no-console\n console.log(colorize('✔ ', 'green') + message);\n },\n\n warning(message: string): void {\n // eslint-disable-next-line no-console\n console.log(colorize('⚠ ', 'yellow') + message);\n },\n\n error(message: string): void {\n console.error(colorize('✖ ', 'red') + message);\n },\n\n dim(message: string): void {\n // eslint-disable-next-line no-console\n console.log(colorize(message, 'dim'));\n },\n\n bold(message: string): string {\n return colorize(message, 'bright');\n },\n};\n\n/**\n * Check if terminal supports colors\n */\nexport function isColorSupported(): boolean {\n return process.stdout.isTTY && process.env.NO_COLOR !== '1';\n}\n","/**\n * @lytjs/cli - File system utilities\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from 'fs';\nimport { join, dirname } from 'path';\n\n/**\n * Ensure directory exists (create if not)\n */\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Write a file with content, creating parent directories if needed\n */\nexport function writeFile(filePath: string, content: string): void {\n ensureDir(dirname(filePath));\n writeFileSync(filePath, content, 'utf-8');\n}\n\n/**\n * Read a file as string\n */\nexport function readFile(filePath: string): string {\n return readFileSync(filePath, 'utf-8');\n}\n\n/**\n * Check if path exists\n */\nexport function exists(path: string): boolean {\n return existsSync(path);\n}\n\n/**\n * Copy directory recursively\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath);\n } else {\n writeFile(destPath, readFileSync(srcPath, 'utf-8'));\n }\n }\n}\n\n/**\n * Check if directory is empty\n */\nexport function isEmptyDir(dir: string): boolean {\n if (!existsSync(dir)) return true;\n const files = readdirSync(dir);\n return files.length === 0;\n}\n","/**\n * @lytjs/cli - Package manager utilities\n */\n\nimport { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\n/**\n * Detect which package manager to use\n */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManager {\n // Check for lock files\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\n\n // Default to pnpm if available\n try {\n execSync('pnpm --version', { stdio: 'ignore' });\n return 'pnpm';\n } catch {\n // Fall back to npm\n return 'npm';\n }\n}\n\n/**\n * Get install command for package manager\n */\nexport function getInstallCommand(pm: PackageManager): string {\n switch (pm) {\n case 'pnpm':\n return 'pnpm install';\n case 'yarn':\n return 'yarn';\n case 'npm':\n return 'npm install';\n }\n}\n\n/**\n * Get run command for package manager\n */\nexport function getRunCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case 'pnpm':\n return `pnpm run ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'npm':\n return `npm run ${script}`;\n }\n}\n\n/**\n * Get add dependency command\n */\nexport function getAddCommand(pm: PackageManager, dep: string, dev: boolean = false): string {\n const devFlag = dev ? ' -D' : '';\n switch (pm) {\n case 'pnpm':\n return `pnpm add${devFlag} ${dep}`;\n case 'yarn':\n return `yarn add${devFlag} ${dep}`;\n case 'npm':\n return `npm install${devFlag} ${dep}`;\n }\n}\n","/**\n * @lytjs/cli - create command\n *\n * Creates a new LytJS project from a template.\n */\n\nimport type { CreateOptions } from '../types';\nimport { logger } from '../utils/logger';\nimport { ensureDir, writeFile, exists, isEmptyDir } from '../utils/fs';\nimport { detectPackageManager, getInstallCommand } from '../utils/package';\nimport { join, resolve } from 'path';\nimport { execSync } from 'child_process';\n\nconst TEMPLATES = {\n default: 'Default template with TypeScript and Vite',\n minimal: 'Minimal template without extra dependencies',\n ssr: 'SSR-enabled template',\n router: 'Template with Router integration',\n store: 'Template with Store integration',\n full: 'Full-featured template with Router, Store, and UI components',\n};\n\n/**\n * Create a new LytJS project\n */\nexport async function create(\n projectName?: string,\n options: Partial<CreateOptions> = {},\n): Promise<void> {\n if (!projectName) {\n logger.error('Please provide a project name.');\n logger.info('Usage: lyt create <project-name>');\n process.exit(1);\n }\n const targetDir = resolve(process.cwd(), projectName);\n\n // Check if directory exists and is not empty\n if (exists(targetDir) && !isEmptyDir(targetDir) && !options.force) {\n logger.error(`Directory \"${projectName}\" already exists and is not empty.`);\n logger.info('Use --force to overwrite.');\n process.exit(1);\n }\n\n logger.info(`Creating a new LytJS project in ${targetDir}...`);\n\n // Create directory\n ensureDir(targetDir);\n\n // Generate project files\n generateProjectFiles(targetDir, projectName, options.template || 'default');\n\n // Install dependencies\n logger.info('Installing dependencies...');\n const pm = detectPackageManager();\n try {\n execSync(getInstallCommand(pm), { cwd: targetDir, stdio: 'inherit' });\n logger.success('Dependencies installed successfully!');\n } catch (_error) {\n logger.warning('Failed to install dependencies automatically.');\n logger.info(`Please run \"${getInstallCommand(pm)}\" manually.`);\n }\n\n // Print next steps\n logger.success(`Project \"${projectName}\" created successfully!`);\n logger.info('');\n logger.bold('Next steps:');\n logger.info(` cd ${projectName}`);\n logger.info(` ${pm === 'npm' ? 'npm run' : pm} dev`);\n}\n\n/**\n * Generate project files\n */\nfunction generateProjectFiles(targetDir: string, projectName: string, template: string): void {\n // Determine template-specific settings\n const isMinimal = template === 'minimal';\n const isSsr = template === 'ssr';\n const isRouter = template === 'router' || template === 'full';\n const isStore = template === 'store' || template === 'full';\n const isFull = template === 'full';\n\n // package.json - use explicit type to allow property access\n interface PackageJsonTemplate {\n name: string;\n version: string;\n type: string;\n scripts: Record<string, string>;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n }\n\n const packageJson: PackageJsonTemplate = {\n name: projectName,\n version: '0.0.0',\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'vite build',\n preview: 'vite preview',\n },\n dependencies: {\n '@lytjs/core': '^6.0.0',\n },\n devDependencies: {\n '@lytjs/plugin-vite': '^6.0.0',\n vite: '^5.0.0',\n },\n };\n\n // Minimal template: no vitest, no test script\n if (!isMinimal) {\n packageJson.scripts.test = 'vitest';\n packageJson.devDependencies.vitest = '^1.0.0';\n }\n\n // SSR template: add @lytjs/server dependency\n if (isSsr) {\n packageJson.dependencies['@lytjs/server'] = '^6.0.0';\n packageJson.scripts['build:client'] = 'vite build --ssrManifest';\n packageJson.scripts['build:server'] = 'vite build --ssr src/entry-server.ts';\n packageJson.scripts['build'] = 'npm run build:client && npm run build:server';\n packageJson.scripts['preview'] = 'node server';\n }\n\n // Router template: add @lytjs/router\n if (isRouter) {\n packageJson.dependencies['@lytjs/router'] = '^1.0.0';\n }\n\n // Store template: add @lytjs/store\n if (isStore) {\n packageJson.dependencies['@lytjs/store'] = '^1.0.0';\n }\n\n // Full template: add @lytjs/ui\n if (isFull) {\n packageJson.dependencies['@lytjs/ui'] = '^0.4.0';\n }\n\n writeFile(join(targetDir, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n // vite.config.ts\n let viteConfig: string;\n if (isSsr) {\n viteConfig = `import { defineConfig } from 'vite';\nimport lytjs from '@lytjs/plugin-vite';\n\nexport default defineConfig({\n plugins: [lytjs()],\n build: {\n ssrManifest: true,\n },\n});\n`;\n } else {\n viteConfig = `import { defineConfig } from 'vite';\nimport lytjs from '@lytjs/plugin-vite';\n\nexport default defineConfig({\n plugins: [lytjs()],\n});\n`;\n }\n writeFile(join(targetDir, 'vite.config.ts'), viteConfig);\n\n // index.html\n const indexHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${projectName}</title>\n </head>\n <body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/src/main.ts\"></script>\n </body>\n</html>\n`;\n writeFile(join(targetDir, 'index.html'), indexHtml);\n\n // src/main.ts\n let mainTs: string;\n if (isSsr) {\n mainTs = `import { createApp } from '@lytjs/core';\nimport App from './App.lyt';\nimport { createSSRApp } from '@lytjs/server';\n${isRouter ? \"import { createRouter, createWebHistory } from '@lytjs/router';\" : ''}\n${isStore ? \"import { createPinia } from '@lytjs/store';\" : ''}\n\nconst app = createSSRApp(App);\n${isStore ? 'app.use(createPinia());' : ''}\n${\n isRouter\n ? `\nconst router = createRouter({\n history: createWebHistory(),\n routes: [\n { path: '/', component: () => import('./pages/Home.lyt') },\n { path: '/about', component: () => import('./pages/About.lyt') },\n ],\n});\napp.use(router);\n`\n : ''\n}\napp.mount('#app');\n`;\n } else if (isRouter || isStore) {\n mainTs = `import { createApp } from '@lytjs/core';\nimport App from './App.lyt';\n${isRouter ? \"import { createRouter, createWebHistory } from '@lytjs/router';\" : ''}\n${isStore ? \"import { createPinia } from '@lytjs/store';\" : ''}\n\nconst app = createApp(App);\n${isStore ? 'app.use(createPinia());' : ''}\n${\n isRouter\n ? `\nconst router = createRouter({\n history: createWebHistory(),\n routes: [\n { path: '/', component: () => import('./pages/Home.lyt') },\n { path: '/about', component: () => import('./pages/About.lyt') },\n ],\n});\napp.use(router);\n`\n : ''\n}\napp.mount('#app');\n`;\n } else {\n mainTs = `import { createApp } from '@lytjs/core';\nimport App from './App.lyt';\n\ncreateApp(App).mount('#app');\n`;\n }\n writeFile(join(targetDir, 'src/main.ts'), mainTs);\n\n // src/App.lyt\n let appLyt: string;\n if (isMinimal) {\n appLyt = `<template>\n <div class=\"app\">\n <h1>{{ title }}</h1>\n </div>\n</template>\n\n<script setup>\nconst title = 'Hello LytJS!';\n</script>\n\n<style scoped>\n.app {\n text-align: center;\n}\n</style>\n`;\n } else if (isRouter) {\n appLyt = `<template>\n <div class=\"app\">\n <nav class=\"nav\">\n <router-link to=\"/\">Home</router-link>\n <router-link to=\"/about\">About</router-link>\n </nav>\n <router-view />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { RouterLink, RouterView } from '@lytjs/router';\n</script>\n\n<style scoped>\n.app {\n text-align: center;\n padding: 2rem;\n}\n\n.nav {\n margin-bottom: 2rem;\n}\n\n.nav a {\n margin: 0 1rem;\n color: #42b883;\n text-decoration: none;\n}\n\n.nav a:hover {\n text-decoration: underline;\n}\n</style>\n`;\n } else {\n appLyt = `<template>\n <div class=\"app\">\n <h1>{{ title }}</h1>\n <p>Welcome to your LytJS app!</p>\n </div>\n</template>\n\n<script setup>\nconst title = 'Hello LytJS!';\n</script>\n\n<style scoped>\n.app {\n text-align: center;\n padding: 2rem;\n}\n\nh1 {\n color: #42b883;\n}\n</style>\n`;\n }\n writeFile(join(targetDir, 'src/App.lyt'), appLyt);\n\n // Router template: add pages and store\n if (isRouter) {\n // Home page\n const homePage = `<template>\n <div class=\"home\">\n <h1>Home</h1>\n ${\n isStore\n ? `\n <p>Count: {{ count }}</p>\n <button @click=\"increment\">Increment</button>\n <button @click=\"decrement\">Decrement</button>\n `\n : ''\n }\n <p>Welcome to the Home page!</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n${\n isStore\n ? `import { useCounterStore } from '../stores/counter';\nconst counterStore = useCounterStore();\nconst { count, increment, decrement } = counterStore;\n`\n : ''\n}\n</script>\n\n<style scoped>\n.home {\n padding: 1rem;\n}\n</style>\n`;\n ensureDir(join(targetDir, 'src', 'pages'));\n writeFile(join(targetDir, 'src', 'pages', 'Home.lyt'), homePage);\n\n // About page\n const aboutPage = `<template>\n <div class=\"about\">\n <h1>About</h1>\n <p>This is the About page!</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n</script>\n\n<style scoped>\n.about {\n padding: 1rem;\n}\n</style>\n`;\n writeFile(join(targetDir, 'src', 'pages', 'About.lyt'), aboutPage);\n }\n\n // Store template: add example store\n if (isStore) {\n const counterStore = `import { defineStore } from '@lytjs/store';\nimport { signal, computed } from '@lytjs/reactivity';\n\nexport const useCounterStore = defineStore('counter', () => {\n // State\n const count = signal(0);\n\n // Getters\n const doubleCount = computed(() => count.value * 2);\n\n // Actions\n function increment() {\n count.value++;\n }\n\n function decrement() {\n count.value--;\n }\n\n function reset() {\n count.value = 0;\n }\n\n return {\n count,\n doubleCount,\n increment,\n decrement,\n reset,\n };\n});\n`;\n ensureDir(join(targetDir, 'src', 'stores'));\n writeFile(join(targetDir, 'src', 'stores', 'counter.ts'), counterStore);\n }\n\n // SSR-specific files\n if (isSsr) {\n // src/entry-server.ts\n const entryServer = `import { createSSRApp, h } from '@lytjs/core';\nimport { renderToString } from '@lytjs/ssr';\nimport App from './App.lyt';\n\nexport async function render(url: string) {\n const app = createSSRApp({\n render() {\n return h(App);\n }\n });\n\n const html = await renderToString(app);\n return html;\n}\n`;\n writeFile(join(targetDir, 'src/entry-server.ts'), entryServer);\n\n // src/entry-client.ts\n const entryClient = `import { createApp } from '@lytjs/core';\nimport App from './App.lyt';\n\nconst app = createApp(App);\napp.mount('#app');\n`;\n writeFile(join(targetDir, 'src/entry-client.ts'), entryClient);\n\n // server.ts - complete SSR server implementation\n const serverTs = `/**\n * LytJS SSR Server\n *\n * Complete SSR server with Vite dev server and production build support.\n * Supports streaming SSR, route prefetching, and static file serving.\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport http from 'http';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst isProduction = process.env.NODE_ENV === 'production';\nconst DIST_DIR = path.join(__dirname, 'dist');\nconst PORT = parseInt(process.env.PORT || '3000', 10);\n\ninterface RenderOptions {\n url: string;\n template: string;\n manifest?: Record<string, string[]>;\n}\n\nasync function renderPage({ url, template, manifest }: RenderOptions): Promise<string> {\n let app: any;\n let vite: any;\n\n if (!isProduction) {\n const { createServer: createViteServer } = await import('vite');\n vite = await createViteServer({\n server: { middlewareMode: true },\n appType: 'custom',\n });\n app = (await vite.ssrLoadModule(path.join(__dirname, 'src/entry-server.ts'))).default;\n } else {\n app = (await import(path.join(DIST_DIR, 'server/entry-server.js'))).default;\n }\n\n const html = await app.render(url);\n return template.replace('<!--app-html-->', html);\n}\n\nasync function createServer() {\n let vite: any;\n\n // Load index.html template\n let template: string;\n\n if (!isProduction) {\n const { createServer: createViteServer } = await import('vite');\n vite = await createViteServer({\n server: { middlewareMode: true },\n appType: 'custom',\n });\n template = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf-8');\n } else {\n template = fs.readFileSync(path.join(DIST_DIR, 'client/index.html'), 'utf-8');\n }\n\n const server = http.createServer(async (req, res) => {\n const url = req.url || '/';\n\n try {\n if (!isProduction && url.startsWith('/@')) {\n // Vite dev server requests\n return;\n }\n\n // Static assets\n if (url.startsWith('/assets/') || url.endsWith('.js') || url.endsWith('.css')) {\n const filePath = isProduction\n ? path.join(DIST_DIR, 'client', url)\n : path.join(__dirname, url);\n\n if (fs.existsSync(filePath)) {\n const ext = path.extname(filePath);\n const contentType = ext === '.css' ? 'text/css' : 'application/javascript';\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(fs.readFileSync(filePath));\n return;\n }\n }\n\n // SSR rendering\n const html = await renderPage({\n url,\n template,\n manifest: isProduction\n ? JSON.parse(fs.readFileSync(path.join(DIST_DIR, 'client/ssr-manifest.json'), 'utf-8'))\n : undefined\n });\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(html);\n } catch (err: any) {\n if (!isProduction && vite) {\n vite.ssrFixStacktrace(err);\n }\n console.error('SSR Error:', err);\n res.writeHead(500, { 'Content-Type': 'text/plain' });\n res.end('Internal Server Error');\n }\n });\n\n server.listen(PORT, () => {\n console.log(\\`LytJS SSR server running at http://localhost:\\${PORT}\\`);\n console.log(\\`Mode: \\${isProduction ? 'Production' : 'Development'}\\`);\n });\n}\n\ncreateServer().catch(console.error);\n`;\n writeFile(join(targetDir, 'server.ts'), serverTs);\n }\n\n // tsconfig.json\n const tsConfig = {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n module: 'ESNext',\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src/**/*.ts', 'src/**/*.lyt'],\n references: [{ path: './tsconfig.node.json' }],\n };\n writeFile(join(targetDir, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2));\n\n // tsconfig.node.json\n const tsConfigNode = {\n compilerOptions: {\n composite: true,\n skipLibCheck: true,\n module: 'ESNext',\n moduleResolution: 'bundler',\n allowSyntheticDefaultImports: true,\n },\n include: ['vite.config.ts'],\n };\n writeFile(join(targetDir, 'tsconfig.node.json'), JSON.stringify(tsConfigNode, null, 2));\n\n // .gitignore\n const gitignore = `# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n`;\n writeFile(join(targetDir, '.gitignore'), gitignore);\n}\n\n/**\n * List available templates\n */\nexport function listTemplates(): void {\n logger.bold('Available templates:');\n for (const [name, description] of Object.entries(TEMPLATES)) {\n logger.info(` ${name.padEnd(10)} - ${description}`);\n }\n}\n","import { create } from './commands/create';\n\ncreate().catch(console.error);\n"]}
|
package/dist/create.mjs
CHANGED
package/dist/create.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/package.ts","../src/commands/create.ts","../src/create.ts"],"names":["existsSync","join","execSync"],"mappings":"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","file":"create.mjs","sourcesContent":["/**\r\n * @lytjs/cli - Logger utilities\r\n */\r\n\r\nconst colors = {\r\n reset: '\\x1b[0m',\r\n bright: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n cyan: '\\x1b[36m',\r\n};\r\n\r\nfunction colorize(text: string, color: keyof typeof colors): string {\r\n if (!isColorSupported()) return text;\r\n return `${colors[color]}${text}${colors.reset}`;\r\n}\r\n\r\nexport const logger = {\r\n info(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.log(colorize('ℹ ', 'blue') + message);\r\n },\r\n \r\n success(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.log(colorize('✔ ', 'green') + message);\r\n },\r\n \r\n warning(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.log(colorize('⚠ ', 'yellow') + message);\r\n },\r\n \r\n error(message: string): void {\r\n console.error(colorize('✖ ', 'red') + message);\r\n },\r\n \r\n dim(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.log(colorize(message, 'dim'));\r\n },\r\n \r\n bold(message: string): string {\r\n return colorize(message, 'bright');\r\n },\r\n};\r\n\r\n/**\r\n * Check if terminal supports colors\r\n */\r\nexport function isColorSupported(): boolean {\r\n return process.stdout.isTTY && process.env.NO_COLOR !== '1';\r\n}\r\n","/**\r\n * @lytjs/cli - File system utilities\r\n */\r\n\r\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from 'fs';\r\nimport { join, dirname } from 'path';\r\n\r\n/**\r\n * Ensure directory exists (create if not)\r\n */\r\nexport function ensureDir(dir: string): void {\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Write a file with content, creating parent directories if needed\r\n */\r\nexport function writeFile(filePath: string, content: string): void {\r\n ensureDir(dirname(filePath));\r\n writeFileSync(filePath, content, 'utf-8');\r\n}\r\n\r\n/**\r\n * Read a file as string\r\n */\r\nexport function readFile(filePath: string): string {\r\n return readFileSync(filePath, 'utf-8');\r\n}\r\n\r\n/**\r\n * Check if path exists\r\n */\r\nexport function exists(path: string): boolean {\r\n return existsSync(path);\r\n}\r\n\r\n/**\r\n * Copy directory recursively\r\n */\r\nexport function copyDir(src: string, dest: string): void {\r\n ensureDir(dest);\r\n const entries = readdirSync(src, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const srcPath = join(src, entry.name);\r\n const destPath = join(dest, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n copyDir(srcPath, destPath);\r\n } else {\r\n writeFile(destPath, readFileSync(srcPath, 'utf-8'));\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Check if directory is empty\r\n */\r\nexport function isEmptyDir(dir: string): boolean {\r\n if (!existsSync(dir)) return true;\r\n const files = readdirSync(dir);\r\n return files.length === 0;\r\n}\r\n","/**\r\n * @lytjs/cli - Package manager utilities\r\n */\r\n\r\nimport { execSync } from 'child_process';\r\nimport { existsSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm';\r\n\r\n/**\r\n * Detect which package manager to use\r\n */\r\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManager {\r\n // Check for lock files\r\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\r\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\r\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\r\n \r\n // Default to pnpm if available\r\n try {\r\n execSync('pnpm --version', { stdio: 'ignore' });\r\n return 'pnpm';\r\n } catch {\r\n // Fall back to npm\r\n return 'npm';\r\n }\r\n}\r\n\r\n/**\r\n * Get install command for package manager\r\n */\r\nexport function getInstallCommand(pm: PackageManager): string {\r\n switch (pm) {\r\n case 'pnpm': return 'pnpm install';\r\n case 'yarn': return 'yarn';\r\n case 'npm': return 'npm install';\r\n }\r\n}\r\n\r\n/**\r\n * Get run command for package manager\r\n */\r\nexport function getRunCommand(pm: PackageManager, script: string): string {\r\n switch (pm) {\r\n case 'pnpm': return `pnpm run ${script}`;\r\n case 'yarn': return `yarn ${script}`;\r\n case 'npm': return `npm run ${script}`;\r\n }\r\n}\r\n\r\n/**\r\n * Get add dependency command\r\n */\r\nexport function getAddCommand(pm: PackageManager, dep: string, dev: boolean = false): string {\r\n const devFlag = dev ? ' -D' : '';\r\n switch (pm) {\r\n case 'pnpm': return `pnpm add${devFlag} ${dep}`;\r\n case 'yarn': return `yarn add${devFlag} ${dep}`;\r\n case 'npm': return `npm install${devFlag} ${dep}`;\r\n }\r\n}\r\n","/**\r\n * @lytjs/cli - create command\r\n *\r\n * Creates a new LytJS project from a template.\r\n */\r\n\r\nimport type { CreateOptions } from '../types';\r\nimport { logger } from '../utils/logger';\r\nimport { ensureDir, writeFile, exists, isEmptyDir } from '../utils/fs';\r\nimport { detectPackageManager, getInstallCommand } from '../utils/package';\r\nimport { join, resolve } from 'path';\r\nimport { execSync } from 'child_process';\r\n\r\nconst TEMPLATES = {\r\n default: 'Default template with TypeScript and Vite',\r\n minimal: 'Minimal template without extra dependencies',\r\n ssr: 'SSR-enabled template',\r\n router: 'Template with Router integration',\r\n store: 'Template with Store integration',\r\n full: 'Full-featured template with Router, Store, and UI components',\r\n};\r\n\r\n/**\r\n * Create a new LytJS project\r\n */\r\nexport async function create(projectName?: string, options: Partial<CreateOptions> = {}): Promise<void> {\r\n if (!projectName) {\r\n logger.error('Please provide a project name.');\r\n logger.info('Usage: lyt create <project-name>');\r\n process.exit(1);\r\n }\r\n const targetDir = resolve(process.cwd(), projectName);\r\n \r\n // Check if directory exists and is not empty\r\n if (exists(targetDir) && !isEmptyDir(targetDir) && !options.force) {\r\n logger.error(`Directory \"${projectName}\" already exists and is not empty.`);\r\n logger.info('Use --force to overwrite.');\r\n process.exit(1);\r\n }\r\n \r\n logger.info(`Creating a new LytJS project in ${targetDir}...`);\r\n \r\n // Create directory\r\n ensureDir(targetDir);\r\n \r\n // Generate project files\r\n generateProjectFiles(targetDir, projectName, options.template || 'default');\r\n \r\n // Install dependencies\r\n logger.info('Installing dependencies...');\r\n const pm = detectPackageManager();\r\n try {\r\n execSync(getInstallCommand(pm), { cwd: targetDir, stdio: 'inherit' });\r\n logger.success('Dependencies installed successfully!');\r\n } catch (_error) {\r\n logger.warning('Failed to install dependencies automatically.');\r\n logger.info(`Please run \"${getInstallCommand(pm)}\" manually.`);\r\n }\r\n \r\n // Print next steps\r\n logger.success(`Project \"${projectName}\" created successfully!`);\r\n logger.info('');\r\n logger.bold('Next steps:');\r\n logger.info(` cd ${projectName}`);\r\n logger.info(` ${pm === 'npm' ? 'npm run' : pm} dev`);\r\n}\r\n\r\n/**\r\n * Generate project files\r\n */\r\nfunction generateProjectFiles(targetDir: string, projectName: string, template: string): void {\r\n // Determine template-specific settings\r\n const isMinimal = template === 'minimal';\r\n const isSsr = template === 'ssr';\r\n const isRouter = template === 'router' || template === 'full';\r\n const isStore = template === 'store' || template === 'full';\r\n const isFull = template === 'full';\r\n\r\n // package.json - use explicit type to allow property access\r\n interface PackageJsonTemplate {\r\n name: string;\r\n version: string;\r\n type: string;\r\n scripts: Record<string, string>;\r\n dependencies: Record<string, string>;\r\n devDependencies: Record<string, string>;\r\n }\r\n\r\n const packageJson: PackageJsonTemplate = {\r\n name: projectName,\r\n version: '0.0.0',\r\n type: 'module',\r\n scripts: {\r\n dev: 'vite',\r\n build: 'vite build',\r\n preview: 'vite preview',\r\n },\r\n dependencies: {\r\n '@lytjs/core': '^6.0.0',\r\n },\r\n devDependencies: {\r\n '@lytjs/plugin-vite': '^6.0.0',\r\n 'vite': '^5.0.0',\r\n },\r\n };\r\n\r\n // Minimal template: no vitest, no test script\r\n if (!isMinimal) {\r\n packageJson.scripts.test = 'vitest';\r\n packageJson.devDependencies.vitest = '^1.0.0';\r\n }\r\n\r\n // SSR template: add @lytjs/server dependency\r\n if (isSsr) {\r\n packageJson.dependencies['@lytjs/server'] = '^6.0.0';\r\n packageJson.scripts['build:client'] = 'vite build --ssrManifest';\r\n packageJson.scripts['build:server'] = 'vite build --ssr src/entry-server.ts';\r\n packageJson.scripts['build'] = 'npm run build:client && npm run build:server';\r\n packageJson.scripts['preview'] = 'node server';\r\n }\r\n\r\n // Router template: add @lytjs/router\r\n if (isRouter) {\r\n packageJson.dependencies['@lytjs/router'] = '^1.0.0';\r\n }\r\n\r\n // Store template: add @lytjs/store\r\n if (isStore) {\r\n packageJson.dependencies['@lytjs/store'] = '^1.0.0';\r\n }\r\n\r\n // Full template: add @lytjs/ui\r\n if (isFull) {\r\n packageJson.dependencies['@lytjs/ui'] = '^0.4.0';\r\n }\r\n\r\n writeFile(join(targetDir, 'package.json'), JSON.stringify(packageJson, null, 2));\r\n\r\n // vite.config.ts\r\n let viteConfig: string;\r\n if (isSsr) {\r\n viteConfig = `import { defineConfig } from 'vite';\r\nimport lytjs from '@lytjs/plugin-vite';\r\n\r\nexport default defineConfig({\r\n plugins: [lytjs()],\r\n build: {\r\n ssrManifest: true,\r\n },\r\n});\r\n`;\r\n } else {\r\n viteConfig = `import { defineConfig } from 'vite';\r\nimport lytjs from '@lytjs/plugin-vite';\r\n\r\nexport default defineConfig({\r\n plugins: [lytjs()],\r\n});\r\n`;\r\n }\r\n writeFile(join(targetDir, 'vite.config.ts'), viteConfig);\r\n\r\n // index.html\r\n const indexHtml = `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>${projectName}</title>\r\n </head>\r\n <body>\r\n <div id=\"app\"></div>\r\n <script type=\"module\" src=\"/src/main.ts\"></script>\r\n </body>\r\n</html>\r\n`;\r\n writeFile(join(targetDir, 'index.html'), indexHtml);\r\n\r\n // src/main.ts\r\n let mainTs: string;\r\n if (isSsr) {\r\n mainTs = `import { createApp } from '@lytjs/core';\r\nimport App from './App.lyt';\r\nimport { createSSRApp } from '@lytjs/server';\r\n${isRouter ? \"import { createRouter, createWebHistory } from '@lytjs/router';\" : ''}\r\n${isStore ? \"import { createPinia } from '@lytjs/store';\" : ''}\r\n\r\nconst app = createSSRApp(App);\r\n${isStore ? 'app.use(createPinia());' : ''}\r\n${isRouter ? `\r\nconst router = createRouter({\r\n history: createWebHistory(),\r\n routes: [\r\n { path: '/', component: () => import('./pages/Home.lyt') },\r\n { path: '/about', component: () => import('./pages/About.lyt') },\r\n ],\r\n});\r\napp.use(router);\r\n` : ''}\r\napp.mount('#app');\r\n`;\r\n } else if (isRouter || isStore) {\r\n mainTs = `import { createApp } from '@lytjs/core';\r\nimport App from './App.lyt';\r\n${isRouter ? \"import { createRouter, createWebHistory } from '@lytjs/router';\" : ''}\r\n${isStore ? \"import { createPinia } from '@lytjs/store';\" : ''}\r\n\r\nconst app = createApp(App);\r\n${isStore ? 'app.use(createPinia());' : ''}\r\n${isRouter ? `\r\nconst router = createRouter({\r\n history: createWebHistory(),\r\n routes: [\r\n { path: '/', component: () => import('./pages/Home.lyt') },\r\n { path: '/about', component: () => import('./pages/About.lyt') },\r\n ],\r\n});\r\napp.use(router);\r\n` : ''}\r\napp.mount('#app');\r\n`;\r\n } else {\r\n mainTs = `import { createApp } from '@lytjs/core';\r\nimport App from './App.lyt';\r\n\r\ncreateApp(App).mount('#app');\r\n`;\r\n }\r\n writeFile(join(targetDir, 'src/main.ts'), mainTs);\r\n\r\n // src/App.lyt\r\n let appLyt: string;\r\n if (isMinimal) {\r\n appLyt = `<template>\r\n <div class=\"app\">\r\n <h1>{{ title }}</h1>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nconst title = 'Hello LytJS!';\r\n</script>\r\n\r\n<style scoped>\r\n.app {\r\n text-align: center;\r\n}\r\n</style>\r\n`;\r\n } else if (isRouter) {\r\n appLyt = `<template>\r\n <div class=\"app\">\r\n <nav class=\"nav\">\r\n <router-link to=\"/\">Home</router-link>\r\n <router-link to=\"/about\">About</router-link>\r\n </nav>\r\n <router-view />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { RouterLink, RouterView } from '@lytjs/router';\r\n</script>\r\n\r\n<style scoped>\r\n.app {\r\n text-align: center;\r\n padding: 2rem;\r\n}\r\n\r\n.nav {\r\n margin-bottom: 2rem;\r\n}\r\n\r\n.nav a {\r\n margin: 0 1rem;\r\n color: #42b883;\r\n text-decoration: none;\r\n}\r\n\r\n.nav a:hover {\r\n text-decoration: underline;\r\n}\r\n</style>\r\n`;\r\n } else {\r\n appLyt = `<template>\r\n <div class=\"app\">\r\n <h1>{{ title }}</h1>\r\n <p>Welcome to your LytJS app!</p>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nconst title = 'Hello LytJS!';\r\n</script>\r\n\r\n<style scoped>\r\n.app {\r\n text-align: center;\r\n padding: 2rem;\r\n}\r\n\r\nh1 {\r\n color: #42b883;\r\n}\r\n</style>\r\n`;\r\n }\r\n writeFile(join(targetDir, 'src/App.lyt'), appLyt);\r\n\r\n // Router template: add pages and store\r\n if (isRouter) {\r\n // Home page\r\n const homePage = `<template>\r\n <div class=\"home\">\r\n <h1>Home</h1>\r\n ${isStore ? `\r\n <p>Count: {{ count }}</p>\r\n <button @click=\"increment\">Increment</button>\r\n <button @click=\"decrement\">Decrement</button>\r\n ` : ''}\r\n <p>Welcome to the Home page!</p>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n${isStore ? `import { useCounterStore } from '../stores/counter';\r\nconst counterStore = useCounterStore();\r\nconst { count, increment, decrement } = counterStore;\r\n` : ''}\r\n</script>\r\n\r\n<style scoped>\r\n.home {\r\n padding: 1rem;\r\n}\r\n</style>\r\n`;\r\n ensureDir(join(targetDir, 'src', 'pages'));\r\n writeFile(join(targetDir, 'src', 'pages', 'Home.lyt'), homePage);\r\n\r\n // About page\r\n const aboutPage = `<template>\r\n <div class=\"about\">\r\n <h1>About</h1>\r\n <p>This is the About page!</p>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n</script>\r\n\r\n<style scoped>\r\n.about {\r\n padding: 1rem;\r\n}\r\n</style>\r\n`;\r\n writeFile(join(targetDir, 'src', 'pages', 'About.lyt'), aboutPage);\r\n }\r\n\r\n // Store template: add example store\r\n if (isStore) {\r\n const counterStore = `import { defineStore } from '@lytjs/store';\r\nimport { signal, computed } from '@lytjs/reactivity';\r\n\r\nexport const useCounterStore = defineStore('counter', () => {\r\n // State\r\n const count = signal(0);\r\n\r\n // Getters\r\n const doubleCount = computed(() => count.value * 2);\r\n\r\n // Actions\r\n function increment() {\r\n count.value++;\r\n }\r\n\r\n function decrement() {\r\n count.value--;\r\n }\r\n\r\n function reset() {\r\n count.value = 0;\r\n }\r\n\r\n return {\r\n count,\r\n doubleCount,\r\n increment,\r\n decrement,\r\n reset,\r\n };\r\n});\r\n`;\r\n ensureDir(join(targetDir, 'src', 'stores'));\r\n writeFile(join(targetDir, 'src', 'stores', 'counter.ts'), counterStore);\r\n }\r\n\r\n // SSR-specific files\r\n if (isSsr) {\r\n // src/entry-server.ts\r\n const entryServer = `import { createSSRApp, h } from '@lytjs/core';\r\nimport { renderToString } from '@lytjs/ssr';\r\nimport App from './App.lyt';\r\n\r\nexport async function render(url: string) {\r\n const app = createSSRApp({\r\n render() {\r\n return h(App);\r\n }\r\n });\r\n\r\n const html = await renderToString(app);\r\n return html;\r\n}\r\n`;\r\n writeFile(join(targetDir, 'src/entry-server.ts'), entryServer);\r\n\r\n // src/entry-client.ts\r\n const entryClient = `import { createApp } from '@lytjs/core';\r\nimport App from './App.lyt';\r\n\r\nconst app = createApp(App);\r\napp.mount('#app');\r\n`;\r\n writeFile(join(targetDir, 'src/entry-client.ts'), entryClient);\r\n\r\n // server.ts - complete SSR server implementation\r\n const serverTs = `/**\r\n * LytJS SSR Server\r\n *\r\n * Complete SSR server with Vite dev server and production build support.\r\n * Supports streaming SSR, route prefetching, and static file serving.\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { fileURLToPath } from 'url';\r\nimport http from 'http';\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\nconst isProduction = process.env.NODE_ENV === 'production';\r\nconst DIST_DIR = path.join(__dirname, 'dist');\r\nconst PORT = parseInt(process.env.PORT || '3000', 10);\r\n\r\ninterface RenderOptions {\r\n url: string;\r\n template: string;\r\n manifest?: Record<string, string[]>;\r\n}\r\n\r\nasync function renderPage({ url, template, manifest }: RenderOptions): Promise<string> {\r\n let app: any;\r\n let vite: any;\r\n\r\n if (!isProduction) {\r\n const { createServer: createViteServer } = await import('vite');\r\n vite = await createViteServer({\r\n server: { middlewareMode: true },\r\n appType: 'custom',\r\n });\r\n app = (await vite.ssrLoadModule(path.join(__dirname, 'src/entry-server.ts'))).default;\r\n } else {\r\n app = (await import(path.join(DIST_DIR, 'server/entry-server.js'))).default;\r\n }\r\n\r\n const html = await app.render(url);\r\n return template.replace('<!--app-html-->', html);\r\n}\r\n\r\nasync function createServer() {\r\n let vite: any;\r\n\r\n // Load index.html template\r\n let template: string;\r\n\r\n if (!isProduction) {\r\n const { createServer: createViteServer } = await import('vite');\r\n vite = await createViteServer({\r\n server: { middlewareMode: true },\r\n appType: 'custom',\r\n });\r\n template = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf-8');\r\n } else {\r\n template = fs.readFileSync(path.join(DIST_DIR, 'client/index.html'), 'utf-8');\r\n }\r\n\r\n const server = http.createServer(async (req, res) => {\r\n const url = req.url || '/';\r\n\r\n try {\r\n if (!isProduction && url.startsWith('/@')) {\r\n // Vite dev server requests\r\n return;\r\n }\r\n\r\n // Static assets\r\n if (url.startsWith('/assets/') || url.endsWith('.js') || url.endsWith('.css')) {\r\n const filePath = isProduction\r\n ? path.join(DIST_DIR, 'client', url)\r\n : path.join(__dirname, url);\r\n\r\n if (fs.existsSync(filePath)) {\r\n const ext = path.extname(filePath);\r\n const contentType = ext === '.css' ? 'text/css' : 'application/javascript';\r\n res.writeHead(200, { 'Content-Type': contentType });\r\n res.end(fs.readFileSync(filePath));\r\n return;\r\n }\r\n }\r\n\r\n // SSR rendering\r\n const html = await renderPage({\r\n url,\r\n template,\r\n manifest: isProduction\r\n ? JSON.parse(fs.readFileSync(path.join(DIST_DIR, 'client/ssr-manifest.json'), 'utf-8'))\r\n : undefined\r\n });\r\n\r\n res.writeHead(200, { 'Content-Type': 'text/html' });\r\n res.end(html);\r\n } catch (err: any) {\r\n if (!isProduction && vite) {\r\n vite.ssrFixStacktrace(err);\r\n }\r\n console.error('SSR Error:', err);\r\n res.writeHead(500, { 'Content-Type': 'text/plain' });\r\n res.end('Internal Server Error');\r\n }\r\n });\r\n\r\n server.listen(PORT, () => {\r\n console.log(\\`LytJS SSR server running at http://localhost:\\${PORT}\\`);\r\n console.log(\\`Mode: \\${isProduction ? 'Production' : 'Development'}\\`);\r\n });\r\n}\r\n\r\ncreateServer().catch(console.error);\r\n`;\r\n writeFile(join(targetDir, 'server.ts'), serverTs);\r\n }\r\n\r\n // tsconfig.json\r\n const tsConfig = {\r\n compilerOptions: {\r\n target: 'ES2020',\r\n useDefineForClassFields: true,\r\n module: 'ESNext',\r\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\r\n skipLibCheck: true,\r\n moduleResolution: 'bundler',\r\n allowImportingTsExtensions: true,\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n noEmit: true,\r\n strict: true,\r\n noUnusedLocals: true,\r\n noUnusedParameters: true,\r\n noFallthroughCasesInSwitch: true,\r\n },\r\n include: ['src/**/*.ts', 'src/**/*.lyt'],\r\n references: [{ path: './tsconfig.node.json' }],\r\n };\r\n writeFile(join(targetDir, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2));\r\n\r\n // tsconfig.node.json\r\n const tsConfigNode = {\r\n compilerOptions: {\r\n composite: true,\r\n skipLibCheck: true,\r\n module: 'ESNext',\r\n moduleResolution: 'bundler',\r\n allowSyntheticDefaultImports: true,\r\n },\r\n include: ['vite.config.ts'],\r\n };\r\n writeFile(join(targetDir, 'tsconfig.node.json'), JSON.stringify(tsConfigNode, null, 2));\r\n\r\n // .gitignore\r\n const gitignore = `# Logs\r\nlogs\r\n*.log\r\nnpm-debug.log*\r\nyarn-debug.log*\r\nyarn-error.log*\r\npnpm-debug.log*\r\nlerna-debug.log*\r\n\r\nnode_modules\r\ndist\r\ndist-ssr\r\n*.local\r\n\r\n# Editor directories and files\r\n.vscode/*\r\n!.vscode/extensions.json\r\n.idea\r\n.DS_Store\r\n*.suo\r\n*.ntvs*\r\n*.njsproj\r\n*.sln\r\n*.sw?\r\n`;\r\n writeFile(join(targetDir, '.gitignore'), gitignore);\r\n}\r\n\r\n/**\r\n * List available templates\r\n */\r\nexport function listTemplates(): void {\r\n logger.bold('Available templates:');\r\n for (const [name, description] of Object.entries(TEMPLATES)) {\r\n logger.info(` ${name.padEnd(10)} - ${description}`);\r\n }\r\n}\r\n","import { create } from './commands/create';\r\n\r\ncreate().catch(console.error);"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/package.ts","../src/commands/create.ts","../src/create.ts"],"names":["existsSync","join","execSync"],"mappings":"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","file":"create.mjs","sourcesContent":["/**\n * @lytjs/cli - Logger utilities\n */\n\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n};\n\nfunction colorize(text: string, color: keyof typeof colors): string {\n if (!isColorSupported()) return text;\n return `${colors[color]}${text}${colors.reset}`;\n}\n\nexport const logger = {\n info(message: string): void {\n // eslint-disable-next-line no-console\n console.log(colorize('ℹ ', 'blue') + message);\n },\n\n success(message: string): void {\n // eslint-disable-next-line no-console\n console.log(colorize('✔ ', 'green') + message);\n },\n\n warning(message: string): void {\n // eslint-disable-next-line no-console\n console.log(colorize('⚠ ', 'yellow') + message);\n },\n\n error(message: string): void {\n console.error(colorize('✖ ', 'red') + message);\n },\n\n dim(message: string): void {\n // eslint-disable-next-line no-console\n console.log(colorize(message, 'dim'));\n },\n\n bold(message: string): string {\n return colorize(message, 'bright');\n },\n};\n\n/**\n * Check if terminal supports colors\n */\nexport function isColorSupported(): boolean {\n return process.stdout.isTTY && process.env.NO_COLOR !== '1';\n}\n","/**\n * @lytjs/cli - File system utilities\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from 'fs';\nimport { join, dirname } from 'path';\n\n/**\n * Ensure directory exists (create if not)\n */\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Write a file with content, creating parent directories if needed\n */\nexport function writeFile(filePath: string, content: string): void {\n ensureDir(dirname(filePath));\n writeFileSync(filePath, content, 'utf-8');\n}\n\n/**\n * Read a file as string\n */\nexport function readFile(filePath: string): string {\n return readFileSync(filePath, 'utf-8');\n}\n\n/**\n * Check if path exists\n */\nexport function exists(path: string): boolean {\n return existsSync(path);\n}\n\n/**\n * Copy directory recursively\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath);\n } else {\n writeFile(destPath, readFileSync(srcPath, 'utf-8'));\n }\n }\n}\n\n/**\n * Check if directory is empty\n */\nexport function isEmptyDir(dir: string): boolean {\n if (!existsSync(dir)) return true;\n const files = readdirSync(dir);\n return files.length === 0;\n}\n","/**\n * @lytjs/cli - Package manager utilities\n */\n\nimport { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\n/**\n * Detect which package manager to use\n */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManager {\n // Check for lock files\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\n\n // Default to pnpm if available\n try {\n execSync('pnpm --version', { stdio: 'ignore' });\n return 'pnpm';\n } catch {\n // Fall back to npm\n return 'npm';\n }\n}\n\n/**\n * Get install command for package manager\n */\nexport function getInstallCommand(pm: PackageManager): string {\n switch (pm) {\n case 'pnpm':\n return 'pnpm install';\n case 'yarn':\n return 'yarn';\n case 'npm':\n return 'npm install';\n }\n}\n\n/**\n * Get run command for package manager\n */\nexport function getRunCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case 'pnpm':\n return `pnpm run ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'npm':\n return `npm run ${script}`;\n }\n}\n\n/**\n * Get add dependency command\n */\nexport function getAddCommand(pm: PackageManager, dep: string, dev: boolean = false): string {\n const devFlag = dev ? ' -D' : '';\n switch (pm) {\n case 'pnpm':\n return `pnpm add${devFlag} ${dep}`;\n case 'yarn':\n return `yarn add${devFlag} ${dep}`;\n case 'npm':\n return `npm install${devFlag} ${dep}`;\n }\n}\n","/**\n * @lytjs/cli - create command\n *\n * Creates a new LytJS project from a template.\n */\n\nimport type { CreateOptions } from '../types';\nimport { logger } from '../utils/logger';\nimport { ensureDir, writeFile, exists, isEmptyDir } from '../utils/fs';\nimport { detectPackageManager, getInstallCommand } from '../utils/package';\nimport { join, resolve } from 'path';\nimport { execSync } from 'child_process';\n\nconst TEMPLATES = {\n default: 'Default template with TypeScript and Vite',\n minimal: 'Minimal template without extra dependencies',\n ssr: 'SSR-enabled template',\n router: 'Template with Router integration',\n store: 'Template with Store integration',\n full: 'Full-featured template with Router, Store, and UI components',\n};\n\n/**\n * Create a new LytJS project\n */\nexport async function create(\n projectName?: string,\n options: Partial<CreateOptions> = {},\n): Promise<void> {\n if (!projectName) {\n logger.error('Please provide a project name.');\n logger.info('Usage: lyt create <project-name>');\n process.exit(1);\n }\n const targetDir = resolve(process.cwd(), projectName);\n\n // Check if directory exists and is not empty\n if (exists(targetDir) && !isEmptyDir(targetDir) && !options.force) {\n logger.error(`Directory \"${projectName}\" already exists and is not empty.`);\n logger.info('Use --force to overwrite.');\n process.exit(1);\n }\n\n logger.info(`Creating a new LytJS project in ${targetDir}...`);\n\n // Create directory\n ensureDir(targetDir);\n\n // Generate project files\n generateProjectFiles(targetDir, projectName, options.template || 'default');\n\n // Install dependencies\n logger.info('Installing dependencies...');\n const pm = detectPackageManager();\n try {\n execSync(getInstallCommand(pm), { cwd: targetDir, stdio: 'inherit' });\n logger.success('Dependencies installed successfully!');\n } catch (_error) {\n logger.warning('Failed to install dependencies automatically.');\n logger.info(`Please run \"${getInstallCommand(pm)}\" manually.`);\n }\n\n // Print next steps\n logger.success(`Project \"${projectName}\" created successfully!`);\n logger.info('');\n logger.bold('Next steps:');\n logger.info(` cd ${projectName}`);\n logger.info(` ${pm === 'npm' ? 'npm run' : pm} dev`);\n}\n\n/**\n * Generate project files\n */\nfunction generateProjectFiles(targetDir: string, projectName: string, template: string): void {\n // Determine template-specific settings\n const isMinimal = template === 'minimal';\n const isSsr = template === 'ssr';\n const isRouter = template === 'router' || template === 'full';\n const isStore = template === 'store' || template === 'full';\n const isFull = template === 'full';\n\n // package.json - use explicit type to allow property access\n interface PackageJsonTemplate {\n name: string;\n version: string;\n type: string;\n scripts: Record<string, string>;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n }\n\n const packageJson: PackageJsonTemplate = {\n name: projectName,\n version: '0.0.0',\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'vite build',\n preview: 'vite preview',\n },\n dependencies: {\n '@lytjs/core': '^6.0.0',\n },\n devDependencies: {\n '@lytjs/plugin-vite': '^6.0.0',\n vite: '^5.0.0',\n },\n };\n\n // Minimal template: no vitest, no test script\n if (!isMinimal) {\n packageJson.scripts.test = 'vitest';\n packageJson.devDependencies.vitest = '^1.0.0';\n }\n\n // SSR template: add @lytjs/server dependency\n if (isSsr) {\n packageJson.dependencies['@lytjs/server'] = '^6.0.0';\n packageJson.scripts['build:client'] = 'vite build --ssrManifest';\n packageJson.scripts['build:server'] = 'vite build --ssr src/entry-server.ts';\n packageJson.scripts['build'] = 'npm run build:client && npm run build:server';\n packageJson.scripts['preview'] = 'node server';\n }\n\n // Router template: add @lytjs/router\n if (isRouter) {\n packageJson.dependencies['@lytjs/router'] = '^1.0.0';\n }\n\n // Store template: add @lytjs/store\n if (isStore) {\n packageJson.dependencies['@lytjs/store'] = '^1.0.0';\n }\n\n // Full template: add @lytjs/ui\n if (isFull) {\n packageJson.dependencies['@lytjs/ui'] = '^0.4.0';\n }\n\n writeFile(join(targetDir, 'package.json'), JSON.stringify(packageJson, null, 2));\n\n // vite.config.ts\n let viteConfig: string;\n if (isSsr) {\n viteConfig = `import { defineConfig } from 'vite';\nimport lytjs from '@lytjs/plugin-vite';\n\nexport default defineConfig({\n plugins: [lytjs()],\n build: {\n ssrManifest: true,\n },\n});\n`;\n } else {\n viteConfig = `import { defineConfig } from 'vite';\nimport lytjs from '@lytjs/plugin-vite';\n\nexport default defineConfig({\n plugins: [lytjs()],\n});\n`;\n }\n writeFile(join(targetDir, 'vite.config.ts'), viteConfig);\n\n // index.html\n const indexHtml = `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${projectName}</title>\n </head>\n <body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/src/main.ts\"></script>\n </body>\n</html>\n`;\n writeFile(join(targetDir, 'index.html'), indexHtml);\n\n // src/main.ts\n let mainTs: string;\n if (isSsr) {\n mainTs = `import { createApp } from '@lytjs/core';\nimport App from './App.lyt';\nimport { createSSRApp } from '@lytjs/server';\n${isRouter ? \"import { createRouter, createWebHistory } from '@lytjs/router';\" : ''}\n${isStore ? \"import { createPinia } from '@lytjs/store';\" : ''}\n\nconst app = createSSRApp(App);\n${isStore ? 'app.use(createPinia());' : ''}\n${\n isRouter\n ? `\nconst router = createRouter({\n history: createWebHistory(),\n routes: [\n { path: '/', component: () => import('./pages/Home.lyt') },\n { path: '/about', component: () => import('./pages/About.lyt') },\n ],\n});\napp.use(router);\n`\n : ''\n}\napp.mount('#app');\n`;\n } else if (isRouter || isStore) {\n mainTs = `import { createApp } from '@lytjs/core';\nimport App from './App.lyt';\n${isRouter ? \"import { createRouter, createWebHistory } from '@lytjs/router';\" : ''}\n${isStore ? \"import { createPinia } from '@lytjs/store';\" : ''}\n\nconst app = createApp(App);\n${isStore ? 'app.use(createPinia());' : ''}\n${\n isRouter\n ? `\nconst router = createRouter({\n history: createWebHistory(),\n routes: [\n { path: '/', component: () => import('./pages/Home.lyt') },\n { path: '/about', component: () => import('./pages/About.lyt') },\n ],\n});\napp.use(router);\n`\n : ''\n}\napp.mount('#app');\n`;\n } else {\n mainTs = `import { createApp } from '@lytjs/core';\nimport App from './App.lyt';\n\ncreateApp(App).mount('#app');\n`;\n }\n writeFile(join(targetDir, 'src/main.ts'), mainTs);\n\n // src/App.lyt\n let appLyt: string;\n if (isMinimal) {\n appLyt = `<template>\n <div class=\"app\">\n <h1>{{ title }}</h1>\n </div>\n</template>\n\n<script setup>\nconst title = 'Hello LytJS!';\n</script>\n\n<style scoped>\n.app {\n text-align: center;\n}\n</style>\n`;\n } else if (isRouter) {\n appLyt = `<template>\n <div class=\"app\">\n <nav class=\"nav\">\n <router-link to=\"/\">Home</router-link>\n <router-link to=\"/about\">About</router-link>\n </nav>\n <router-view />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { RouterLink, RouterView } from '@lytjs/router';\n</script>\n\n<style scoped>\n.app {\n text-align: center;\n padding: 2rem;\n}\n\n.nav {\n margin-bottom: 2rem;\n}\n\n.nav a {\n margin: 0 1rem;\n color: #42b883;\n text-decoration: none;\n}\n\n.nav a:hover {\n text-decoration: underline;\n}\n</style>\n`;\n } else {\n appLyt = `<template>\n <div class=\"app\">\n <h1>{{ title }}</h1>\n <p>Welcome to your LytJS app!</p>\n </div>\n</template>\n\n<script setup>\nconst title = 'Hello LytJS!';\n</script>\n\n<style scoped>\n.app {\n text-align: center;\n padding: 2rem;\n}\n\nh1 {\n color: #42b883;\n}\n</style>\n`;\n }\n writeFile(join(targetDir, 'src/App.lyt'), appLyt);\n\n // Router template: add pages and store\n if (isRouter) {\n // Home page\n const homePage = `<template>\n <div class=\"home\">\n <h1>Home</h1>\n ${\n isStore\n ? `\n <p>Count: {{ count }}</p>\n <button @click=\"increment\">Increment</button>\n <button @click=\"decrement\">Decrement</button>\n `\n : ''\n }\n <p>Welcome to the Home page!</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n${\n isStore\n ? `import { useCounterStore } from '../stores/counter';\nconst counterStore = useCounterStore();\nconst { count, increment, decrement } = counterStore;\n`\n : ''\n}\n</script>\n\n<style scoped>\n.home {\n padding: 1rem;\n}\n</style>\n`;\n ensureDir(join(targetDir, 'src', 'pages'));\n writeFile(join(targetDir, 'src', 'pages', 'Home.lyt'), homePage);\n\n // About page\n const aboutPage = `<template>\n <div class=\"about\">\n <h1>About</h1>\n <p>This is the About page!</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n</script>\n\n<style scoped>\n.about {\n padding: 1rem;\n}\n</style>\n`;\n writeFile(join(targetDir, 'src', 'pages', 'About.lyt'), aboutPage);\n }\n\n // Store template: add example store\n if (isStore) {\n const counterStore = `import { defineStore } from '@lytjs/store';\nimport { signal, computed } from '@lytjs/reactivity';\n\nexport const useCounterStore = defineStore('counter', () => {\n // State\n const count = signal(0);\n\n // Getters\n const doubleCount = computed(() => count.value * 2);\n\n // Actions\n function increment() {\n count.value++;\n }\n\n function decrement() {\n count.value--;\n }\n\n function reset() {\n count.value = 0;\n }\n\n return {\n count,\n doubleCount,\n increment,\n decrement,\n reset,\n };\n});\n`;\n ensureDir(join(targetDir, 'src', 'stores'));\n writeFile(join(targetDir, 'src', 'stores', 'counter.ts'), counterStore);\n }\n\n // SSR-specific files\n if (isSsr) {\n // src/entry-server.ts\n const entryServer = `import { createSSRApp, h } from '@lytjs/core';\nimport { renderToString } from '@lytjs/ssr';\nimport App from './App.lyt';\n\nexport async function render(url: string) {\n const app = createSSRApp({\n render() {\n return h(App);\n }\n });\n\n const html = await renderToString(app);\n return html;\n}\n`;\n writeFile(join(targetDir, 'src/entry-server.ts'), entryServer);\n\n // src/entry-client.ts\n const entryClient = `import { createApp } from '@lytjs/core';\nimport App from './App.lyt';\n\nconst app = createApp(App);\napp.mount('#app');\n`;\n writeFile(join(targetDir, 'src/entry-client.ts'), entryClient);\n\n // server.ts - complete SSR server implementation\n const serverTs = `/**\n * LytJS SSR Server\n *\n * Complete SSR server with Vite dev server and production build support.\n * Supports streaming SSR, route prefetching, and static file serving.\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport http from 'http';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst isProduction = process.env.NODE_ENV === 'production';\nconst DIST_DIR = path.join(__dirname, 'dist');\nconst PORT = parseInt(process.env.PORT || '3000', 10);\n\ninterface RenderOptions {\n url: string;\n template: string;\n manifest?: Record<string, string[]>;\n}\n\nasync function renderPage({ url, template, manifest }: RenderOptions): Promise<string> {\n let app: any;\n let vite: any;\n\n if (!isProduction) {\n const { createServer: createViteServer } = await import('vite');\n vite = await createViteServer({\n server: { middlewareMode: true },\n appType: 'custom',\n });\n app = (await vite.ssrLoadModule(path.join(__dirname, 'src/entry-server.ts'))).default;\n } else {\n app = (await import(path.join(DIST_DIR, 'server/entry-server.js'))).default;\n }\n\n const html = await app.render(url);\n return template.replace('<!--app-html-->', html);\n}\n\nasync function createServer() {\n let vite: any;\n\n // Load index.html template\n let template: string;\n\n if (!isProduction) {\n const { createServer: createViteServer } = await import('vite');\n vite = await createViteServer({\n server: { middlewareMode: true },\n appType: 'custom',\n });\n template = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf-8');\n } else {\n template = fs.readFileSync(path.join(DIST_DIR, 'client/index.html'), 'utf-8');\n }\n\n const server = http.createServer(async (req, res) => {\n const url = req.url || '/';\n\n try {\n if (!isProduction && url.startsWith('/@')) {\n // Vite dev server requests\n return;\n }\n\n // Static assets\n if (url.startsWith('/assets/') || url.endsWith('.js') || url.endsWith('.css')) {\n const filePath = isProduction\n ? path.join(DIST_DIR, 'client', url)\n : path.join(__dirname, url);\n\n if (fs.existsSync(filePath)) {\n const ext = path.extname(filePath);\n const contentType = ext === '.css' ? 'text/css' : 'application/javascript';\n res.writeHead(200, { 'Content-Type': contentType });\n res.end(fs.readFileSync(filePath));\n return;\n }\n }\n\n // SSR rendering\n const html = await renderPage({\n url,\n template,\n manifest: isProduction\n ? JSON.parse(fs.readFileSync(path.join(DIST_DIR, 'client/ssr-manifest.json'), 'utf-8'))\n : undefined\n });\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(html);\n } catch (err: any) {\n if (!isProduction && vite) {\n vite.ssrFixStacktrace(err);\n }\n console.error('SSR Error:', err);\n res.writeHead(500, { 'Content-Type': 'text/plain' });\n res.end('Internal Server Error');\n }\n });\n\n server.listen(PORT, () => {\n console.log(\\`LytJS SSR server running at http://localhost:\\${PORT}\\`);\n console.log(\\`Mode: \\${isProduction ? 'Production' : 'Development'}\\`);\n });\n}\n\ncreateServer().catch(console.error);\n`;\n writeFile(join(targetDir, 'server.ts'), serverTs);\n }\n\n // tsconfig.json\n const tsConfig = {\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n module: 'ESNext',\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src/**/*.ts', 'src/**/*.lyt'],\n references: [{ path: './tsconfig.node.json' }],\n };\n writeFile(join(targetDir, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2));\n\n // tsconfig.node.json\n const tsConfigNode = {\n compilerOptions: {\n composite: true,\n skipLibCheck: true,\n module: 'ESNext',\n moduleResolution: 'bundler',\n allowSyntheticDefaultImports: true,\n },\n include: ['vite.config.ts'],\n };\n writeFile(join(targetDir, 'tsconfig.node.json'), JSON.stringify(tsConfigNode, null, 2));\n\n // .gitignore\n const gitignore = `# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n`;\n writeFile(join(targetDir, '.gitignore'), gitignore);\n}\n\n/**\n * List available templates\n */\nexport function listTemplates(): void {\n logger.bold('Available templates:');\n for (const [name, description] of Object.entries(TEMPLATES)) {\n logger.info(` ${name.padEnd(10)} - ${description}`);\n }\n}\n","import { create } from './commands/create';\n\ncreate().catch(console.error);\n"]}
|