@vobs/cli 1.2.1 → 1.2.2

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.
Files changed (61) hide show
  1. package/dist/banner.cjs +31 -7
  2. package/dist/banner.cjs.map +1 -1
  3. package/dist/banner.js +5 -3
  4. package/dist/banner.js.map +1 -1
  5. package/dist/cli.cjs +130 -98
  6. package/dist/cli.cjs.map +1 -1
  7. package/dist/cli.js +65 -40
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/add.cjs +63 -49
  10. package/dist/commands/add.cjs.map +1 -1
  11. package/dist/commands/add.js +14 -9
  12. package/dist/commands/add.js.map +1 -1
  13. package/dist/commands/build.cjs +50 -19
  14. package/dist/commands/build.cjs.map +1 -1
  15. package/dist/commands/build.js +9 -6
  16. package/dist/commands/build.js.map +1 -1
  17. package/dist/commands/dev.cjs +50 -19
  18. package/dist/commands/dev.cjs.map +1 -1
  19. package/dist/commands/dev.js +9 -6
  20. package/dist/commands/dev.js.map +1 -1
  21. package/dist/commands/generate.cjs +76 -63
  22. package/dist/commands/generate.cjs.map +1 -1
  23. package/dist/commands/generate.js +24 -18
  24. package/dist/commands/generate.js.map +1 -1
  25. package/dist/commands/index.cjs +136 -100
  26. package/dist/commands/index.cjs.map +1 -1
  27. package/dist/commands/index.js +66 -39
  28. package/dist/commands/index.js.map +1 -1
  29. package/dist/commands/init.cjs +89 -71
  30. package/dist/commands/init.cjs.map +1 -1
  31. package/dist/commands/init.js +28 -17
  32. package/dist/commands/init.js.map +1 -1
  33. package/dist/index.cjs +187 -132
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.js +94 -48
  36. package/dist/index.js.map +1 -1
  37. package/dist/repl.cjs +139 -111
  38. package/dist/repl.cjs.map +1 -1
  39. package/dist/repl.js +67 -46
  40. package/dist/repl.js.map +1 -1
  41. package/dist/start.cjs +151 -114
  42. package/dist/start.cjs.map +1 -1
  43. package/dist/start.js +76 -48
  44. package/dist/start.js.map +1 -1
  45. package/dist/types.cjs +18 -2
  46. package/dist/types.cjs.map +1 -1
  47. package/dist/types.js +0 -2
  48. package/dist/types.js.map +1 -1
  49. package/dist/utils/file.cjs +67 -34
  50. package/dist/utils/file.cjs.map +1 -1
  51. package/dist/utils/file.js +18 -12
  52. package/dist/utils/file.js.map +1 -1
  53. package/dist/utils/logger.cjs +56 -22
  54. package/dist/utils/logger.cjs.map +1 -1
  55. package/dist/utils/logger.js +11 -5
  56. package/dist/utils/logger.js.map +1 -1
  57. package/dist/utils/pm.cjs +41 -16
  58. package/dist/utils/pm.cjs.map +1 -1
  59. package/dist/utils/pm.js +10 -7
  60. package/dist/utils/pm.js.map +1 -1
  61. package/package.json +1 -1
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/logger.ts","../src/utils/file.ts","../src/utils/pm.ts","../src/commands/init.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/generate.ts","../src/commands/add.ts","../src/banner.ts","../src/cli.ts"],"names":["pc","__dirname","dirname","fileURLToPath","resolve","readFileSync","Handlebars","mkdirSync","writeFileSync","existsSync","execSync","p","createServer","build","p2","p3","cac"],"mappings":"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","file":"cli.cjs","sourcesContent":["import pc from 'picocolors'\n\nfunction timestamp(): string {\n return pc.dim(`[${new Date().toLocaleTimeString()}]`)\n}\n\nexport function info(msg: string): void {\n console.log(`${timestamp()} ${pc.cyan('ℹ')} ${msg}`)\n}\n\nexport function success(msg: string): void {\n console.log(`${timestamp()} ${pc.green('✔')} ${msg}`)\n}\n\nexport function warn(msg: string): void {\n console.log(`${timestamp()} ${pc.yellow('⚠')} ${msg}`)\n}\n\nexport function error(msg: string): void {\n console.error(`${timestamp()} ${pc.red('✖')} ${msg}`)\n}\n\nexport function step(msg: string): void {\n console.log(`\\n ${pc.bold(pc.cyan(msg))}`)\n}\n\nexport const logger = { info, success, warn, error, step }","import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport Handlebars from 'handlebars'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst TEMPLATES_ROOT = resolve(__dirname, '..', 'templates')\n\n/** Get the absolute path to the templates directory */\nexport function getTemplatesDir(): string {\n return TEMPLATES_ROOT\n}\n\n/** Read a template file and compile it with Handlebars */\nexport function renderTemplate(\n templatePath: string,\n context: Record<string, unknown>\n): string {\n const source = readFileSync(templatePath, 'utf-8')\n const template = Handlebars.compile(source)\n return template(context)\n}\n\n/** Write a file, creating parent directories if needed */\nexport function writeFile(dir: string, filename: string, content: string): void {\n const filePath = resolve(dir, filename)\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content, 'utf-8')\n}\n\n/** Ensure a directory exists */\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n}\n\n/** Check if a path exists */\nexport function pathExists(path: string): boolean {\n return existsSync(path)\n}\n\n/** Copy a template directory recursively, rendering each .hbs file */\nasync function copyDirRecursive(srcDir: string, destDir: string, context: Record<string, unknown>): Promise<void> {\n const { readdirSync } = await import('node:fs')\n const { join } = await import('node:path')\n\n const entries = readdirSync(srcDir, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const isHbs = entry.name.endsWith('.hbs')\n const destName = isHbs ? entry.name.slice(0, -4) : entry.name\n const destPath = join(destDir, destName)\n\n if (entry.isDirectory()) {\n ensureDir(destPath)\n await copyDirRecursive(srcPath, destPath, context)\n } else if (isHbs) {\n const content = renderTemplate(srcPath, context)\n writeFile(destDir, destName, content)\n } else {\n const content = readFileSync(srcPath, 'utf-8')\n writeFile(destDir, destName, content)\n }\n }\n}\n\n/** Scaffold a project from the basic template */\nexport async function scaffoldProject(\n targetDir: string,\n context: Record<string, unknown>\n): Promise<void> {\n const templateDir = resolve(TEMPLATES_ROOT, 'basic')\n ensureDir(targetDir)\n await copyDirRecursive(templateDir, targetDir, context)\n}","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn'\n\n/** Detect the package manager to use */\nexport function detectPackageManager(targetDir?: string): PackageManager {\n // Check if a specific package manager is locked\n if (targetDir) {\n if (existsSync(resolve(targetDir, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(resolve(targetDir, 'yarn.lock'))) return 'yarn'\n if (existsSync(resolve(targetDir, 'package-lock.json'))) return 'npm'\n }\n\n // Check for global preference\n const userAgent = process.env.npm_config_user_agent || ''\n if (userAgent.startsWith('pnpm')) return 'pnpm'\n if (userAgent.startsWith('yarn')) return 'yarn'\n if (userAgent.startsWith('npm')) return 'npm'\n\n // Default to pnpm\n return 'pnpm'\n}\n\n/** Install dependencies in a directory */\nexport function installDependencies(targetDir: string, pm: PackageManager): void {\n const cmd = pm === 'yarn' ? 'yarn' : `${pm} install`\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}\n\n/** Add a package as a dependency */\nexport function addPackage(targetDir: string, pm: PackageManager, pkg: string, dev: boolean): void {\n const installFlag = dev ? '-D' : ''\n const cmd = pm === 'npm'\n ? `npm install ${installFlag} ${pkg}`\n : pm === 'yarn'\n ? `yarn add ${installFlag} ${pkg}`\n : `pnpm add ${installFlag} ${pkg}`\n\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}","import { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { scaffoldProject } from '../utils/file.js'\nimport { installDependencies } from '../utils/pm.js'\nimport type { InitOptions } from '../types.js'\n\nexport async function initCommand(options: Partial<InitOptions>): Promise<void> {\n const projectName = options.name || (await p.text({\n message: 'Project name:',\n placeholder: 'my-vobs-app',\n validate: (v) => !v ? 'Project name is required' : undefined\n })) as string\n\n if (p.isCancel(projectName)) {\n p.cancel('Cancelled')\n return\n }\n\n const targetDir = options.targetDir || resolve(process.cwd(), projectName)\n\n const packageManager = options.packageManager || (await p.select({\n message: 'Package manager:',\n options: [\n { value: 'pnpm', label: 'pnpm' },\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' }\n ]\n })) as 'pnpm' | 'npm' | 'yarn'\n\n if (p.isCancel(packageManager)) {\n p.cancel('Cancelled')\n return\n }\n\n const useTypescript = options.typescript ?? (await p.confirm({\n message: 'Use TypeScript?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(useTypescript)) {\n p.cancel('Cancelled')\n return\n }\n\n const initGit = options.git ?? (await p.confirm({\n message: 'Initialize a git repository?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(initGit)) {\n p.cancel('Cancelled')\n return\n }\n\n logger.step(`Creating project ${projectName}...`)\n\n await scaffoldProject(targetDir, {\n name: projectName,\n packageName: projectName.toLowerCase().replace(/\\s+/g, '-'),\n typescript: useTypescript,\n vobsVersion: '1.0.0'\n })\n\n logger.success('Project scaffolded')\n\n logger.step('Installing dependencies...')\n installDependencies(targetDir, packageManager)\n logger.success('Dependencies installed')\n\n if (initGit) {\n logger.step('Initializing git repository...')\n try {\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n logger.success('Git repository initialized')\n } catch {\n logger.warn('Git not found, skipping git init')\n }\n }\n\n logger.step('Done!')\n console.log(`\\n ${packageManager === 'pnpm' ? 'pnpm' : packageManager === 'yarn' ? 'yarn' : 'npm run'} dev\\n`)\n}","import { createServer } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { DevOptions } from '../types.js'\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n logger.info('Starting dev server...')\n\n const server = await createServer({\n configFile: options.config,\n server: {\n port: options.port,\n open: options.open\n }\n })\n\n await server.listen()\n server.printUrls()\n logger.success('Dev server is running')\n}","import { build } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { BuildOptions } from '../types.js'\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n logger.info('Building for production...')\n\n await build({\n configFile: options.config,\n build: {\n outDir: options.outDir\n },\n mode: options.mode || 'production'\n })\n\n logger.success('Build complete')\n}","import { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { renderTemplate, writeFile, getTemplatesDir, ensureDir } from '../utils/file.js'\nimport type { GenerateOptions, ComponentTemplateContext, PageTemplateContext } from '../types.js'\n\nexport async function generateCommand(options: Partial<GenerateOptions>): Promise<void> {\n const type = options.type || (await p.select({\n message: 'What to generate?',\n options: [\n { value: 'component', label: 'Component' },\n { value: 'page', label: 'Page' }\n ]\n })) as 'component' | 'page'\n\n if (p.isCancel(type)) {\n p.cancel('Cancelled')\n return\n }\n\n const name = options.name || (await p.text({\n message: 'Name:',\n placeholder: type === 'component' ? 'Button' : 'AboutPage',\n validate: (v) => !v ? 'Name is required' : undefined\n })) as string\n\n if (p.isCancel(name)) {\n p.cancel('Cancelled')\n return\n }\n\n const templatesDir = getTemplatesDir()\n\n if (type === 'component') {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/components')\n ensureDir(targetDir)\n\n const context: ComponentTemplateContext = {\n name: toPascalCase(name),\n kebabName: toKebabCase(name)\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'component.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n } else {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/pages')\n ensureDir(targetDir)\n\n const context: PageTemplateContext = {\n name: toPascalCase(name),\n path: `/${toKebabCase(name)}`\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'page.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '')\n}","import * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { detectPackageManager, addPackage } from '../utils/pm.js'\nimport type { AddOptions } from '../types.js'\n\nexport async function addCommand(options: Partial<AddOptions>): Promise<void> {\n const pkg = options.package || (await p.text({\n message: 'Package to add:',\n placeholder: '@vobs/ui',\n validate: (v) => !v ? 'Package name is required' : undefined\n })) as string\n\n if (p.isCancel(pkg)) {\n p.cancel('Cancelled')\n return\n }\n\n const isDev = options.dev ?? (await p.confirm({\n message: 'Save as dev dependency?',\n initialValue: false\n })) as boolean\n\n if (p.isCancel(isDev)) {\n p.cancel('Cancelled')\n return\n }\n\n const pm = detectPackageManager(process.cwd())\n\n logger.step(`Installing ${pkg}...`)\n addPackage(process.cwd(), pm, pkg, isDev)\n\n logger.success(`Installed ${pkg}`)\n console.log(`\\n Import it in your code:\\n`)\n console.log(` import { ... } from '${pkg}'`)\n console.log()\n}","/**\n * VOBS CLI Banner — Mathematical Bold Sans-Serif\n * 𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬\n * Signals First · Zero Re-renders · Ultra Lightweight\n *\n * The banner is left-aligned with a fixed indent rather than horizontally\n * centered. Centering depends on the terminal column width and per-glyph\n * render width, neither of which is reliably knowable, so it drifts as the\n * window resizes. Fixed indent is stable across any terminal size.\n */\n\nconst BANNER_LINE1 = '𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬'\nconst BANNER_TAGLINE = 'Signals First · Zero Re-renders · Ultra Lightweight'\n\n/** Fixed left indent applied to every banner line (2 spaces). */\nconst INDENT = ' '\nconst DIM = '\\x1b[2m'\nconst RESET = '\\x1b[0m'\n\n/** Show full banner (used for logo command, --help) */\nexport function showLogo(): void {\n console.log()\n console.log()\n console.log(`${INDENT}${BANNER_LINE1}`)\n console.log()\n console.log(`${INDENT}${DIM}${BANNER_TAGLINE}${RESET}`)\n console.log()\n console.log()\n}\n\n/** Show single-line version banner (used for --version) */\nexport function showBanner(): void {\n console.log(`${INDENT}${BANNER_LINE1}`)\n}\n\n/** Show the dev server start banner */\nexport function showDevBanner(): void {\n console.log()\n console.log(`${INDENT}${BANNER_LINE1}`)\n console.log()\n}","import { cac } from 'cac'\nimport { initCommand } from './commands/init.js'\nimport { devCommand } from './commands/dev.js'\nimport { buildCommand } from './commands/build.js'\nimport { generateCommand } from './commands/generate.js'\nimport { addCommand } from './commands/add.js'\nimport { showBanner, showLogo, showDevBanner } from './banner.js'\n\nexport function createCLI(): ReturnType<typeof cac> {\n const cli = cac('vobs')\n\n cli\n .command('init [name]', 'Create a new vobs project')\n .option('--dir <dir>', 'Target directory')\n .option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')\n .option('--no-typescript', 'Do not use TypeScript')\n .option('--no-git', 'Do not initialize git')\n .action(async (name: string, options: Record<string, unknown>) => {\n await initCommand({\n name,\n targetDir: options.dir as string | undefined,\n packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,\n typescript: options.typescript !== false,\n git: options.git !== false\n })\n })\n\n cli\n .command('create [name]', 'Alias for init')\n .option('--dir <dir>', 'Target directory')\n .option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')\n .option('--no-typescript', 'Do not use TypeScript')\n .option('--no-git', 'Do not initialize git')\n .action(async (name: string, options: Record<string, unknown>) => {\n await initCommand({\n name,\n targetDir: options.dir as string | undefined,\n packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,\n typescript: options.typescript !== false,\n git: options.git !== false\n })\n })\n\n cli\n .command('dev', 'Start the dev server')\n .option('--config <path>', 'Vite config file')\n .option('--port <port>', 'Port to listen on')\n .option('--open', 'Open browser on start')\n .action(async (options: Record<string, unknown>) => {\n showDevBanner()\n await devCommand({\n config: options.config as string | undefined,\n port: options.port as number | undefined,\n open: options.open as boolean | undefined\n })\n })\n\n cli\n .command('build', 'Build for production')\n .option('--config <path>', 'Vite config file')\n .option('--outDir <dir>', 'Output directory')\n .option('--mode <mode>', 'Build mode')\n .action(async (options: Record<string, unknown>) => {\n await buildCommand({\n config: options.config as string | undefined,\n outDir: options.outDir as string | undefined,\n mode: options.mode as string | undefined\n })\n })\n\n cli\n .command('generate [name]', 'Generate code (component/page)')\n .alias('g')\n .option('--type <type>', 'Type: component or page')\n .option('--dir <dir>', 'Target directory')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generateCommand({\n name,\n type: (options.type as 'component' | 'page') || undefined,\n targetDir: options.dir as string | undefined\n })\n })\n\n cli\n .command('add [package]', 'Add a package')\n .option('-D, --dev', 'Save as dev dependency')\n .action(async (pkg: string, options: Record<string, unknown>) => {\n await addCommand({\n package: pkg,\n dev: options.dev as boolean | undefined\n })\n })\n\n cli\n .command('logo', 'Show the vobs CLI logo and version info')\n .action(() => {\n showLogo()\n })\n\n cli.on('--help', () => {\n showBanner()\n })\n\n cli.help()\n cli.version('1.0.0')\n\n return cli\n}"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/utils/logger.ts","../src/utils/file.ts","../src/utils/pm.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/generate.ts","../src/commands/add.ts","../src/banner.ts"],"sourcesContent":["import { cac } from 'cac'\nimport { initCommand } from './commands/init.js'\nimport { devCommand } from './commands/dev.js'\nimport { buildCommand } from './commands/build.js'\nimport { generateCommand } from './commands/generate.js'\nimport { addCommand } from './commands/add.js'\nimport { showBanner, showLogo, showDevBanner } from './banner.js'\n\nexport function createCLI(): ReturnType<typeof cac> {\n const cli = cac('vobs')\n\n cli\n .command('init [name]', 'Create a new vobs project')\n .option('--dir <dir>', 'Target directory')\n .option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')\n .option('--no-typescript', 'Do not use TypeScript')\n .option('--no-git', 'Do not initialize git')\n .action(async (name: string, options: Record<string, unknown>) => {\n await initCommand({\n name,\n targetDir: options.dir as string | undefined,\n packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,\n typescript: options.typescript !== false,\n git: options.git !== false\n })\n })\n\n cli\n .command('create [name]', 'Alias for init')\n .option('--dir <dir>', 'Target directory')\n .option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')\n .option('--no-typescript', 'Do not use TypeScript')\n .option('--no-git', 'Do not initialize git')\n .action(async (name: string, options: Record<string, unknown>) => {\n await initCommand({\n name,\n targetDir: options.dir as string | undefined,\n packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,\n typescript: options.typescript !== false,\n git: options.git !== false\n })\n })\n\n cli\n .command('dev', 'Start the dev server')\n .option('--config <path>', 'Vite config file')\n .option('--port <port>', 'Port to listen on')\n .option('--open', 'Open browser on start')\n .action(async (options: Record<string, unknown>) => {\n showDevBanner()\n await devCommand({\n config: options.config as string | undefined,\n port: options.port as number | undefined,\n open: options.open as boolean | undefined\n })\n })\n\n cli\n .command('build', 'Build for production')\n .option('--config <path>', 'Vite config file')\n .option('--outDir <dir>', 'Output directory')\n .option('--mode <mode>', 'Build mode')\n .action(async (options: Record<string, unknown>) => {\n await buildCommand({\n config: options.config as string | undefined,\n outDir: options.outDir as string | undefined,\n mode: options.mode as string | undefined\n })\n })\n\n cli\n .command('generate [name]', 'Generate code (component/page)')\n .alias('g')\n .option('--type <type>', 'Type: component or page')\n .option('--dir <dir>', 'Target directory')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generateCommand({\n name,\n type: (options.type as 'component' | 'page') || undefined,\n targetDir: options.dir as string | undefined\n })\n })\n\n cli\n .command('add [package]', 'Add a package')\n .option('-D, --dev', 'Save as dev dependency')\n .action(async (pkg: string, options: Record<string, unknown>) => {\n await addCommand({\n package: pkg,\n dev: options.dev as boolean | undefined\n })\n })\n\n cli\n .command('logo', 'Show the vobs CLI logo and version info')\n .action(() => {\n showLogo()\n })\n\n cli.on('--help', () => {\n showBanner()\n })\n\n cli.help()\n cli.version('1.0.0')\n\n return cli\n}","import { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { scaffoldProject } from '../utils/file.js'\nimport { installDependencies } from '../utils/pm.js'\nimport type { InitOptions } from '../types.js'\n\nexport async function initCommand(options: Partial<InitOptions>): Promise<void> {\n const projectName = options.name || (await p.text({\n message: 'Project name:',\n placeholder: 'my-vobs-app',\n validate: (v) => !v ? 'Project name is required' : undefined\n })) as string\n\n if (p.isCancel(projectName)) {\n p.cancel('Cancelled')\n return\n }\n\n const targetDir = options.targetDir || resolve(process.cwd(), projectName)\n\n const packageManager = options.packageManager || (await p.select({\n message: 'Package manager:',\n options: [\n { value: 'pnpm', label: 'pnpm' },\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' }\n ]\n })) as 'pnpm' | 'npm' | 'yarn'\n\n if (p.isCancel(packageManager)) {\n p.cancel('Cancelled')\n return\n }\n\n const useTypescript = options.typescript ?? (await p.confirm({\n message: 'Use TypeScript?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(useTypescript)) {\n p.cancel('Cancelled')\n return\n }\n\n const initGit = options.git ?? (await p.confirm({\n message: 'Initialize a git repository?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(initGit)) {\n p.cancel('Cancelled')\n return\n }\n\n logger.step(`Creating project ${projectName}...`)\n\n await scaffoldProject(targetDir, {\n name: projectName,\n packageName: projectName.toLowerCase().replace(/\\s+/g, '-'),\n typescript: useTypescript,\n vobsVersion: '1.0.0'\n })\n\n logger.success('Project scaffolded')\n\n logger.step('Installing dependencies...')\n installDependencies(targetDir, packageManager)\n logger.success('Dependencies installed')\n\n if (initGit) {\n logger.step('Initializing git repository...')\n try {\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n logger.success('Git repository initialized')\n } catch {\n logger.warn('Git not found, skipping git init')\n }\n }\n\n logger.step('Done!')\n console.log(`\\n ${packageManager === 'pnpm' ? 'pnpm' : packageManager === 'yarn' ? 'yarn' : 'npm run'} dev\\n`)\n}","import pc from 'picocolors'\n\nfunction timestamp(): string {\n return pc.dim(`[${new Date().toLocaleTimeString()}]`)\n}\n\nexport function info(msg: string): void {\n console.log(`${timestamp()} ${pc.cyan('ℹ')} ${msg}`)\n}\n\nexport function success(msg: string): void {\n console.log(`${timestamp()} ${pc.green('✔')} ${msg}`)\n}\n\nexport function warn(msg: string): void {\n console.log(`${timestamp()} ${pc.yellow('⚠')} ${msg}`)\n}\n\nexport function error(msg: string): void {\n console.error(`${timestamp()} ${pc.red('✖')} ${msg}`)\n}\n\nexport function step(msg: string): void {\n console.log(`\\n ${pc.bold(pc.cyan(msg))}`)\n}\n\nexport const logger = { info, success, warn, error, step }","import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport Handlebars from 'handlebars'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst TEMPLATES_ROOT = resolve(__dirname, '..', 'templates')\n\n/** Get the absolute path to the templates directory */\nexport function getTemplatesDir(): string {\n return TEMPLATES_ROOT\n}\n\n/** Read a template file and compile it with Handlebars */\nexport function renderTemplate(\n templatePath: string,\n context: Record<string, unknown>\n): string {\n const source = readFileSync(templatePath, 'utf-8')\n const template = Handlebars.compile(source)\n return template(context)\n}\n\n/** Write a file, creating parent directories if needed */\nexport function writeFile(dir: string, filename: string, content: string): void {\n const filePath = resolve(dir, filename)\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content, 'utf-8')\n}\n\n/** Ensure a directory exists */\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n}\n\n/** Check if a path exists */\nexport function pathExists(path: string): boolean {\n return existsSync(path)\n}\n\n/** Copy a template directory recursively, rendering each .hbs file */\nasync function copyDirRecursive(srcDir: string, destDir: string, context: Record<string, unknown>): Promise<void> {\n const { readdirSync } = await import('node:fs')\n const { join } = await import('node:path')\n\n const entries = readdirSync(srcDir, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const isHbs = entry.name.endsWith('.hbs')\n const destName = isHbs ? entry.name.slice(0, -4) : entry.name\n const destPath = join(destDir, destName)\n\n if (entry.isDirectory()) {\n ensureDir(destPath)\n await copyDirRecursive(srcPath, destPath, context)\n } else if (isHbs) {\n const content = renderTemplate(srcPath, context)\n writeFile(destDir, destName, content)\n } else {\n const content = readFileSync(srcPath, 'utf-8')\n writeFile(destDir, destName, content)\n }\n }\n}\n\n/** Scaffold a project from the basic template */\nexport async function scaffoldProject(\n targetDir: string,\n context: Record<string, unknown>\n): Promise<void> {\n const templateDir = resolve(TEMPLATES_ROOT, 'basic')\n ensureDir(targetDir)\n await copyDirRecursive(templateDir, targetDir, context)\n}","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn'\n\n/** Detect the package manager to use */\nexport function detectPackageManager(targetDir?: string): PackageManager {\n // Check if a specific package manager is locked\n if (targetDir) {\n if (existsSync(resolve(targetDir, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(resolve(targetDir, 'yarn.lock'))) return 'yarn'\n if (existsSync(resolve(targetDir, 'package-lock.json'))) return 'npm'\n }\n\n // Check for global preference\n const userAgent = process.env.npm_config_user_agent || ''\n if (userAgent.startsWith('pnpm')) return 'pnpm'\n if (userAgent.startsWith('yarn')) return 'yarn'\n if (userAgent.startsWith('npm')) return 'npm'\n\n // Default to pnpm\n return 'pnpm'\n}\n\n/** Install dependencies in a directory */\nexport function installDependencies(targetDir: string, pm: PackageManager): void {\n const cmd = pm === 'yarn' ? 'yarn' : `${pm} install`\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}\n\n/** Add a package as a dependency */\nexport function addPackage(targetDir: string, pm: PackageManager, pkg: string, dev: boolean): void {\n const installFlag = dev ? '-D' : ''\n const cmd = pm === 'npm'\n ? `npm install ${installFlag} ${pkg}`\n : pm === 'yarn'\n ? `yarn add ${installFlag} ${pkg}`\n : `pnpm add ${installFlag} ${pkg}`\n\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}","import { createServer } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { DevOptions } from '../types.js'\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n logger.info('Starting dev server...')\n\n const server = await createServer({\n configFile: options.config,\n server: {\n port: options.port,\n open: options.open\n }\n })\n\n await server.listen()\n server.printUrls()\n logger.success('Dev server is running')\n}","import { build } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { BuildOptions } from '../types.js'\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n logger.info('Building for production...')\n\n await build({\n configFile: options.config,\n build: {\n outDir: options.outDir\n },\n mode: options.mode || 'production'\n })\n\n logger.success('Build complete')\n}","import { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { renderTemplate, writeFile, getTemplatesDir, ensureDir } from '../utils/file.js'\nimport type { GenerateOptions, ComponentTemplateContext, PageTemplateContext } from '../types.js'\n\nexport async function generateCommand(options: Partial<GenerateOptions>): Promise<void> {\n const type = options.type || (await p.select({\n message: 'What to generate?',\n options: [\n { value: 'component', label: 'Component' },\n { value: 'page', label: 'Page' }\n ]\n })) as 'component' | 'page'\n\n if (p.isCancel(type)) {\n p.cancel('Cancelled')\n return\n }\n\n const name = options.name || (await p.text({\n message: 'Name:',\n placeholder: type === 'component' ? 'Button' : 'AboutPage',\n validate: (v) => !v ? 'Name is required' : undefined\n })) as string\n\n if (p.isCancel(name)) {\n p.cancel('Cancelled')\n return\n }\n\n const templatesDir = getTemplatesDir()\n\n if (type === 'component') {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/components')\n ensureDir(targetDir)\n\n const context: ComponentTemplateContext = {\n name: toPascalCase(name),\n kebabName: toKebabCase(name)\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'component.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n } else {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/pages')\n ensureDir(targetDir)\n\n const context: PageTemplateContext = {\n name: toPascalCase(name),\n path: `/${toKebabCase(name)}`\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'page.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '')\n}","import * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { detectPackageManager, addPackage } from '../utils/pm.js'\nimport type { AddOptions } from '../types.js'\n\nexport async function addCommand(options: Partial<AddOptions>): Promise<void> {\n const pkg = options.package || (await p.text({\n message: 'Package to add:',\n placeholder: '@vobs/ui',\n validate: (v) => !v ? 'Package name is required' : undefined\n })) as string\n\n if (p.isCancel(pkg)) {\n p.cancel('Cancelled')\n return\n }\n\n const isDev = options.dev ?? (await p.confirm({\n message: 'Save as dev dependency?',\n initialValue: false\n })) as boolean\n\n if (p.isCancel(isDev)) {\n p.cancel('Cancelled')\n return\n }\n\n const pm = detectPackageManager(process.cwd())\n\n logger.step(`Installing ${pkg}...`)\n addPackage(process.cwd(), pm, pkg, isDev)\n\n logger.success(`Installed ${pkg}`)\n console.log(`\\n Import it in your code:\\n`)\n console.log(` import { ... } from '${pkg}'`)\n console.log()\n}","/**\n * VOBS CLI Banner — Mathematical Bold Sans-Serif\n * 𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬\n * Signals First · Zero Re-renders · Ultra Lightweight\n *\n * The banner is left-aligned with a fixed indent rather than horizontally\n * centered. Centering depends on the terminal column width and per-glyph\n * render width, neither of which is reliably knowable, so it drifts as the\n * window resizes. Fixed indent is stable across any terminal size.\n */\n\nconst BANNER_LINE1 = '𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬'\nconst BANNER_TAGLINE = 'Signals First · Zero Re-renders · Ultra Lightweight'\n\n/** Fixed left indent applied to every banner line (2 spaces). */\nconst INDENT = ' '\nconst DIM = '\\x1b[2m'\nconst RESET = '\\x1b[0m'\n\n/** Show full banner (used for logo command, --help) */\nexport function showLogo(): void {\n console.log()\n console.log()\n console.log(`${INDENT}${BANNER_LINE1}`)\n console.log()\n console.log(`${INDENT}${DIM}${BANNER_TAGLINE}${RESET}`)\n console.log()\n console.log()\n}\n\n/** Show single-line version banner (used for --version) */\nexport function showBanner(): void {\n console.log(`${INDENT}${BANNER_LINE1}`)\n}\n\n/** Show the dev server start banner */\nexport function showDevBanner(): void {\n console.log()\n console.log(`${INDENT}${BANNER_LINE1}`)\n console.log()\n}"],"mappings":"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","names":["import_node_path","import_node_child_process","pc","Handlebars","import_node_fs","import_node_path","import_vite","import_node_path","p","p"]}
package/dist/cli.js CHANGED
@@ -1,15 +1,16 @@
1
- import { cac } from 'cac';
2
- import { dirname, resolve } from 'path';
3
- import { execSync } from 'child_process';
4
- import * as p from '@clack/prompts';
5
- import pc from 'picocolors';
6
- import { readFileSync, mkdirSync, writeFileSync, existsSync } from 'fs';
7
- import { fileURLToPath } from 'url';
8
- import Handlebars from 'handlebars';
9
- import { createServer, build } from 'vite';
10
-
11
1
  var __defProp = Object.defineProperty;
12
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // packages/cli/src/cli.ts
5
+ import { cac } from "cac";
6
+
7
+ // packages/cli/src/commands/init.ts
8
+ import { resolve as resolve3 } from "path";
9
+ import { execSync as execSync2 } from "child_process";
10
+ import * as p from "@clack/prompts";
11
+
12
+ // packages/cli/src/utils/logger.ts
13
+ import pc from "picocolors";
13
14
  function timestamp() {
14
15
  return pc.dim(`[${(/* @__PURE__ */ new Date()).toLocaleTimeString()}]`);
15
16
  }
@@ -36,8 +37,14 @@ function step(msg) {
36
37
  }
37
38
  __name(step, "step");
38
39
  var logger = { info, success, warn, error, step };
39
- var __dirname$1 = dirname(fileURLToPath(import.meta.url));
40
- var TEMPLATES_ROOT = resolve(__dirname$1, "..", "templates");
40
+
41
+ // packages/cli/src/utils/file.ts
42
+ import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs";
43
+ import { resolve, dirname } from "path";
44
+ import { fileURLToPath } from "url";
45
+ import Handlebars from "handlebars";
46
+ var __dirname = dirname(fileURLToPath(import.meta.url));
47
+ var TEMPLATES_ROOT = resolve(__dirname, "..", "templates");
41
48
  function getTemplatesDir() {
42
49
  return TEMPLATES_ROOT;
43
50
  }
@@ -61,8 +68,8 @@ function ensureDir(dir) {
61
68
  }
62
69
  __name(ensureDir, "ensureDir");
63
70
  async function copyDirRecursive(srcDir, destDir, context) {
64
- const { readdirSync } = await import('fs');
65
- const { join } = await import('path');
71
+ const { readdirSync } = await import("fs");
72
+ const { join } = await import("path");
66
73
  const entries = readdirSync(srcDir, { withFileTypes: true });
67
74
  for (const entry of entries) {
68
75
  const srcPath = join(srcDir, entry.name);
@@ -88,11 +95,16 @@ async function scaffoldProject(targetDir, context) {
88
95
  await copyDirRecursive(templateDir, targetDir, context);
89
96
  }
90
97
  __name(scaffoldProject, "scaffoldProject");
98
+
99
+ // packages/cli/src/utils/pm.ts
100
+ import { existsSync as existsSync2 } from "fs";
101
+ import { resolve as resolve2 } from "path";
102
+ import { execSync } from "child_process";
91
103
  function detectPackageManager(targetDir) {
92
104
  if (targetDir) {
93
- if (existsSync(resolve(targetDir, "pnpm-lock.yaml"))) return "pnpm";
94
- if (existsSync(resolve(targetDir, "yarn.lock"))) return "yarn";
95
- if (existsSync(resolve(targetDir, "package-lock.json"))) return "npm";
105
+ if (existsSync2(resolve2(targetDir, "pnpm-lock.yaml"))) return "pnpm";
106
+ if (existsSync2(resolve2(targetDir, "yarn.lock"))) return "yarn";
107
+ if (existsSync2(resolve2(targetDir, "package-lock.json"))) return "npm";
96
108
  }
97
109
  const userAgent = process.env.npm_config_user_agent || "";
98
110
  if (userAgent.startsWith("pnpm")) return "pnpm";
@@ -124,7 +136,7 @@ async function initCommand(options) {
124
136
  p.cancel("Cancelled");
125
137
  return;
126
138
  }
127
- const targetDir = options.targetDir || resolve(process.cwd(), projectName);
139
+ const targetDir = options.targetDir || resolve3(process.cwd(), projectName);
128
140
  const packageManager = options.packageManager || await p.select({
129
141
  message: "Package manager:",
130
142
  options: [
@@ -167,7 +179,7 @@ async function initCommand(options) {
167
179
  if (initGit) {
168
180
  logger.step("Initializing git repository...");
169
181
  try {
170
- execSync("git init", { cwd: targetDir, stdio: "ignore" });
182
+ execSync2("git init", { cwd: targetDir, stdio: "ignore" });
171
183
  logger.success("Git repository initialized");
172
184
  } catch {
173
185
  logger.warn("Git not found, skipping git init");
@@ -179,6 +191,9 @@ async function initCommand(options) {
179
191
  `);
180
192
  }
181
193
  __name(initCommand, "initCommand");
194
+
195
+ // packages/cli/src/commands/dev.ts
196
+ import { createServer } from "vite";
182
197
  async function devCommand(options) {
183
198
  logger.info("Starting dev server...");
184
199
  const server = await createServer({
@@ -193,6 +208,9 @@ async function devCommand(options) {
193
208
  logger.success("Dev server is running");
194
209
  }
195
210
  __name(devCommand, "devCommand");
211
+
212
+ // packages/cli/src/commands/build.ts
213
+ import { build } from "vite";
196
214
  async function buildCommand(options) {
197
215
  logger.info("Building for production...");
198
216
  await build({
@@ -205,56 +223,60 @@ async function buildCommand(options) {
205
223
  logger.success("Build complete");
206
224
  }
207
225
  __name(buildCommand, "buildCommand");
226
+
227
+ // packages/cli/src/commands/generate.ts
228
+ import { resolve as resolve4 } from "path";
229
+ import * as p2 from "@clack/prompts";
208
230
  async function generateCommand(options) {
209
- const type = options.type || await p.select({
231
+ const type = options.type || await p2.select({
210
232
  message: "What to generate?",
211
233
  options: [
212
234
  { value: "component", label: "Component" },
213
235
  { value: "page", label: "Page" }
214
236
  ]
215
237
  });
216
- if (p.isCancel(type)) {
217
- p.cancel("Cancelled");
238
+ if (p2.isCancel(type)) {
239
+ p2.cancel("Cancelled");
218
240
  return;
219
241
  }
220
- const name = options.name || await p.text({
242
+ const name = options.name || await p2.text({
221
243
  message: "Name:",
222
244
  placeholder: type === "component" ? "Button" : "AboutPage",
223
245
  validate: /* @__PURE__ */ __name((v) => !v ? "Name is required" : void 0, "validate")
224
246
  });
225
- if (p.isCancel(name)) {
226
- p.cancel("Cancelled");
247
+ if (p2.isCancel(name)) {
248
+ p2.cancel("Cancelled");
227
249
  return;
228
250
  }
229
251
  const templatesDir = getTemplatesDir();
230
252
  if (type === "component") {
231
- const targetDir = options.targetDir || resolve(process.cwd(), "src/components");
253
+ const targetDir = options.targetDir || resolve4(process.cwd(), "src/components");
232
254
  ensureDir(targetDir);
233
255
  const context = {
234
256
  name: toPascalCase(name),
235
257
  kebabName: toKebabCase(name)
236
258
  };
237
259
  const content = renderTemplate(
238
- resolve(templatesDir, "component.hbs"),
260
+ resolve4(templatesDir, "component.hbs"),
239
261
  context
240
262
  );
241
263
  const filename = `${context.name}.tsx`;
242
264
  writeFile(targetDir, filename, content);
243
- logger.success(`Created ${type} at ${resolve(targetDir, filename)}`);
265
+ logger.success(`Created ${type} at ${resolve4(targetDir, filename)}`);
244
266
  } else {
245
- const targetDir = options.targetDir || resolve(process.cwd(), "src/pages");
267
+ const targetDir = options.targetDir || resolve4(process.cwd(), "src/pages");
246
268
  ensureDir(targetDir);
247
269
  const context = {
248
270
  name: toPascalCase(name),
249
271
  path: `/${toKebabCase(name)}`
250
272
  };
251
273
  const content = renderTemplate(
252
- resolve(templatesDir, "page.hbs"),
274
+ resolve4(templatesDir, "page.hbs"),
253
275
  context
254
276
  );
255
277
  const filename = `${context.name}.tsx`;
256
278
  writeFile(targetDir, filename, content);
257
- logger.success(`Created ${type} at ${resolve(targetDir, filename)}`);
279
+ logger.success(`Created ${type} at ${resolve4(targetDir, filename)}`);
258
280
  }
259
281
  }
260
282
  __name(generateCommand, "generateCommand");
@@ -266,22 +288,25 @@ function toKebabCase(str) {
266
288
  return str.replace(/([A-Z])/g, "-$1").toLowerCase().replace(/^-/, "").replace(/[^a-z0-9-]/g, "-").replace(/--+/g, "-").replace(/^-|-$/g, "");
267
289
  }
268
290
  __name(toKebabCase, "toKebabCase");
291
+
292
+ // packages/cli/src/commands/add.ts
293
+ import * as p3 from "@clack/prompts";
269
294
  async function addCommand(options) {
270
- const pkg = options.package || await p.text({
295
+ const pkg = options.package || await p3.text({
271
296
  message: "Package to add:",
272
297
  placeholder: "@vobs/ui",
273
298
  validate: /* @__PURE__ */ __name((v) => !v ? "Package name is required" : void 0, "validate")
274
299
  });
275
- if (p.isCancel(pkg)) {
276
- p.cancel("Cancelled");
300
+ if (p3.isCancel(pkg)) {
301
+ p3.cancel("Cancelled");
277
302
  return;
278
303
  }
279
- const isDev = options.dev ?? await p.confirm({
304
+ const isDev = options.dev ?? await p3.confirm({
280
305
  message: "Save as dev dependency?",
281
306
  initialValue: false
282
307
  });
283
- if (p.isCancel(isDev)) {
284
- p.cancel("Cancelled");
308
+ if (p3.isCancel(isDev)) {
309
+ p3.cancel("Cancelled");
285
310
  return;
286
311
  }
287
312
  const pm = detectPackageManager(process.cwd());
@@ -383,7 +408,7 @@ function createCLI() {
383
408
  return cli;
384
409
  }
385
410
  __name(createCLI, "createCLI");
386
-
387
- export { createCLI };
388
- //# sourceMappingURL=cli.js.map
411
+ export {
412
+ createCLI
413
+ };
389
414
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/logger.ts","../src/utils/file.ts","../src/utils/pm.ts","../src/commands/init.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/generate.ts","../src/commands/add.ts","../src/banner.ts","../src/cli.ts"],"names":["__dirname","existsSync","resolve","execSync","p2","p3"],"mappings":"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","file":"cli.js","sourcesContent":["import pc from 'picocolors'\n\nfunction timestamp(): string {\n return pc.dim(`[${new Date().toLocaleTimeString()}]`)\n}\n\nexport function info(msg: string): void {\n console.log(`${timestamp()} ${pc.cyan('ℹ')} ${msg}`)\n}\n\nexport function success(msg: string): void {\n console.log(`${timestamp()} ${pc.green('✔')} ${msg}`)\n}\n\nexport function warn(msg: string): void {\n console.log(`${timestamp()} ${pc.yellow('⚠')} ${msg}`)\n}\n\nexport function error(msg: string): void {\n console.error(`${timestamp()} ${pc.red('✖')} ${msg}`)\n}\n\nexport function step(msg: string): void {\n console.log(`\\n ${pc.bold(pc.cyan(msg))}`)\n}\n\nexport const logger = { info, success, warn, error, step }","import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport Handlebars from 'handlebars'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst TEMPLATES_ROOT = resolve(__dirname, '..', 'templates')\n\n/** Get the absolute path to the templates directory */\nexport function getTemplatesDir(): string {\n return TEMPLATES_ROOT\n}\n\n/** Read a template file and compile it with Handlebars */\nexport function renderTemplate(\n templatePath: string,\n context: Record<string, unknown>\n): string {\n const source = readFileSync(templatePath, 'utf-8')\n const template = Handlebars.compile(source)\n return template(context)\n}\n\n/** Write a file, creating parent directories if needed */\nexport function writeFile(dir: string, filename: string, content: string): void {\n const filePath = resolve(dir, filename)\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content, 'utf-8')\n}\n\n/** Ensure a directory exists */\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n}\n\n/** Check if a path exists */\nexport function pathExists(path: string): boolean {\n return existsSync(path)\n}\n\n/** Copy a template directory recursively, rendering each .hbs file */\nasync function copyDirRecursive(srcDir: string, destDir: string, context: Record<string, unknown>): Promise<void> {\n const { readdirSync } = await import('node:fs')\n const { join } = await import('node:path')\n\n const entries = readdirSync(srcDir, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const isHbs = entry.name.endsWith('.hbs')\n const destName = isHbs ? entry.name.slice(0, -4) : entry.name\n const destPath = join(destDir, destName)\n\n if (entry.isDirectory()) {\n ensureDir(destPath)\n await copyDirRecursive(srcPath, destPath, context)\n } else if (isHbs) {\n const content = renderTemplate(srcPath, context)\n writeFile(destDir, destName, content)\n } else {\n const content = readFileSync(srcPath, 'utf-8')\n writeFile(destDir, destName, content)\n }\n }\n}\n\n/** Scaffold a project from the basic template */\nexport async function scaffoldProject(\n targetDir: string,\n context: Record<string, unknown>\n): Promise<void> {\n const templateDir = resolve(TEMPLATES_ROOT, 'basic')\n ensureDir(targetDir)\n await copyDirRecursive(templateDir, targetDir, context)\n}","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn'\n\n/** Detect the package manager to use */\nexport function detectPackageManager(targetDir?: string): PackageManager {\n // Check if a specific package manager is locked\n if (targetDir) {\n if (existsSync(resolve(targetDir, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(resolve(targetDir, 'yarn.lock'))) return 'yarn'\n if (existsSync(resolve(targetDir, 'package-lock.json'))) return 'npm'\n }\n\n // Check for global preference\n const userAgent = process.env.npm_config_user_agent || ''\n if (userAgent.startsWith('pnpm')) return 'pnpm'\n if (userAgent.startsWith('yarn')) return 'yarn'\n if (userAgent.startsWith('npm')) return 'npm'\n\n // Default to pnpm\n return 'pnpm'\n}\n\n/** Install dependencies in a directory */\nexport function installDependencies(targetDir: string, pm: PackageManager): void {\n const cmd = pm === 'yarn' ? 'yarn' : `${pm} install`\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}\n\n/** Add a package as a dependency */\nexport function addPackage(targetDir: string, pm: PackageManager, pkg: string, dev: boolean): void {\n const installFlag = dev ? '-D' : ''\n const cmd = pm === 'npm'\n ? `npm install ${installFlag} ${pkg}`\n : pm === 'yarn'\n ? `yarn add ${installFlag} ${pkg}`\n : `pnpm add ${installFlag} ${pkg}`\n\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}","import { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { scaffoldProject } from '../utils/file.js'\nimport { installDependencies } from '../utils/pm.js'\nimport type { InitOptions } from '../types.js'\n\nexport async function initCommand(options: Partial<InitOptions>): Promise<void> {\n const projectName = options.name || (await p.text({\n message: 'Project name:',\n placeholder: 'my-vobs-app',\n validate: (v) => !v ? 'Project name is required' : undefined\n })) as string\n\n if (p.isCancel(projectName)) {\n p.cancel('Cancelled')\n return\n }\n\n const targetDir = options.targetDir || resolve(process.cwd(), projectName)\n\n const packageManager = options.packageManager || (await p.select({\n message: 'Package manager:',\n options: [\n { value: 'pnpm', label: 'pnpm' },\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' }\n ]\n })) as 'pnpm' | 'npm' | 'yarn'\n\n if (p.isCancel(packageManager)) {\n p.cancel('Cancelled')\n return\n }\n\n const useTypescript = options.typescript ?? (await p.confirm({\n message: 'Use TypeScript?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(useTypescript)) {\n p.cancel('Cancelled')\n return\n }\n\n const initGit = options.git ?? (await p.confirm({\n message: 'Initialize a git repository?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(initGit)) {\n p.cancel('Cancelled')\n return\n }\n\n logger.step(`Creating project ${projectName}...`)\n\n await scaffoldProject(targetDir, {\n name: projectName,\n packageName: projectName.toLowerCase().replace(/\\s+/g, '-'),\n typescript: useTypescript,\n vobsVersion: '1.0.0'\n })\n\n logger.success('Project scaffolded')\n\n logger.step('Installing dependencies...')\n installDependencies(targetDir, packageManager)\n logger.success('Dependencies installed')\n\n if (initGit) {\n logger.step('Initializing git repository...')\n try {\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n logger.success('Git repository initialized')\n } catch {\n logger.warn('Git not found, skipping git init')\n }\n }\n\n logger.step('Done!')\n console.log(`\\n ${packageManager === 'pnpm' ? 'pnpm' : packageManager === 'yarn' ? 'yarn' : 'npm run'} dev\\n`)\n}","import { createServer } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { DevOptions } from '../types.js'\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n logger.info('Starting dev server...')\n\n const server = await createServer({\n configFile: options.config,\n server: {\n port: options.port,\n open: options.open\n }\n })\n\n await server.listen()\n server.printUrls()\n logger.success('Dev server is running')\n}","import { build } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { BuildOptions } from '../types.js'\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n logger.info('Building for production...')\n\n await build({\n configFile: options.config,\n build: {\n outDir: options.outDir\n },\n mode: options.mode || 'production'\n })\n\n logger.success('Build complete')\n}","import { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { renderTemplate, writeFile, getTemplatesDir, ensureDir } from '../utils/file.js'\nimport type { GenerateOptions, ComponentTemplateContext, PageTemplateContext } from '../types.js'\n\nexport async function generateCommand(options: Partial<GenerateOptions>): Promise<void> {\n const type = options.type || (await p.select({\n message: 'What to generate?',\n options: [\n { value: 'component', label: 'Component' },\n { value: 'page', label: 'Page' }\n ]\n })) as 'component' | 'page'\n\n if (p.isCancel(type)) {\n p.cancel('Cancelled')\n return\n }\n\n const name = options.name || (await p.text({\n message: 'Name:',\n placeholder: type === 'component' ? 'Button' : 'AboutPage',\n validate: (v) => !v ? 'Name is required' : undefined\n })) as string\n\n if (p.isCancel(name)) {\n p.cancel('Cancelled')\n return\n }\n\n const templatesDir = getTemplatesDir()\n\n if (type === 'component') {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/components')\n ensureDir(targetDir)\n\n const context: ComponentTemplateContext = {\n name: toPascalCase(name),\n kebabName: toKebabCase(name)\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'component.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n } else {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/pages')\n ensureDir(targetDir)\n\n const context: PageTemplateContext = {\n name: toPascalCase(name),\n path: `/${toKebabCase(name)}`\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'page.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '')\n}","import * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { detectPackageManager, addPackage } from '../utils/pm.js'\nimport type { AddOptions } from '../types.js'\n\nexport async function addCommand(options: Partial<AddOptions>): Promise<void> {\n const pkg = options.package || (await p.text({\n message: 'Package to add:',\n placeholder: '@vobs/ui',\n validate: (v) => !v ? 'Package name is required' : undefined\n })) as string\n\n if (p.isCancel(pkg)) {\n p.cancel('Cancelled')\n return\n }\n\n const isDev = options.dev ?? (await p.confirm({\n message: 'Save as dev dependency?',\n initialValue: false\n })) as boolean\n\n if (p.isCancel(isDev)) {\n p.cancel('Cancelled')\n return\n }\n\n const pm = detectPackageManager(process.cwd())\n\n logger.step(`Installing ${pkg}...`)\n addPackage(process.cwd(), pm, pkg, isDev)\n\n logger.success(`Installed ${pkg}`)\n console.log(`\\n Import it in your code:\\n`)\n console.log(` import { ... } from '${pkg}'`)\n console.log()\n}","/**\n * VOBS CLI Banner — Mathematical Bold Sans-Serif\n * 𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬\n * Signals First · Zero Re-renders · Ultra Lightweight\n *\n * The banner is left-aligned with a fixed indent rather than horizontally\n * centered. Centering depends on the terminal column width and per-glyph\n * render width, neither of which is reliably knowable, so it drifts as the\n * window resizes. Fixed indent is stable across any terminal size.\n */\n\nconst BANNER_LINE1 = '𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬'\nconst BANNER_TAGLINE = 'Signals First · Zero Re-renders · Ultra Lightweight'\n\n/** Fixed left indent applied to every banner line (2 spaces). */\nconst INDENT = ' '\nconst DIM = '\\x1b[2m'\nconst RESET = '\\x1b[0m'\n\n/** Show full banner (used for logo command, --help) */\nexport function showLogo(): void {\n console.log()\n console.log()\n console.log(`${INDENT}${BANNER_LINE1}`)\n console.log()\n console.log(`${INDENT}${DIM}${BANNER_TAGLINE}${RESET}`)\n console.log()\n console.log()\n}\n\n/** Show single-line version banner (used for --version) */\nexport function showBanner(): void {\n console.log(`${INDENT}${BANNER_LINE1}`)\n}\n\n/** Show the dev server start banner */\nexport function showDevBanner(): void {\n console.log()\n console.log(`${INDENT}${BANNER_LINE1}`)\n console.log()\n}","import { cac } from 'cac'\nimport { initCommand } from './commands/init.js'\nimport { devCommand } from './commands/dev.js'\nimport { buildCommand } from './commands/build.js'\nimport { generateCommand } from './commands/generate.js'\nimport { addCommand } from './commands/add.js'\nimport { showBanner, showLogo, showDevBanner } from './banner.js'\n\nexport function createCLI(): ReturnType<typeof cac> {\n const cli = cac('vobs')\n\n cli\n .command('init [name]', 'Create a new vobs project')\n .option('--dir <dir>', 'Target directory')\n .option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')\n .option('--no-typescript', 'Do not use TypeScript')\n .option('--no-git', 'Do not initialize git')\n .action(async (name: string, options: Record<string, unknown>) => {\n await initCommand({\n name,\n targetDir: options.dir as string | undefined,\n packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,\n typescript: options.typescript !== false,\n git: options.git !== false\n })\n })\n\n cli\n .command('create [name]', 'Alias for init')\n .option('--dir <dir>', 'Target directory')\n .option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')\n .option('--no-typescript', 'Do not use TypeScript')\n .option('--no-git', 'Do not initialize git')\n .action(async (name: string, options: Record<string, unknown>) => {\n await initCommand({\n name,\n targetDir: options.dir as string | undefined,\n packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,\n typescript: options.typescript !== false,\n git: options.git !== false\n })\n })\n\n cli\n .command('dev', 'Start the dev server')\n .option('--config <path>', 'Vite config file')\n .option('--port <port>', 'Port to listen on')\n .option('--open', 'Open browser on start')\n .action(async (options: Record<string, unknown>) => {\n showDevBanner()\n await devCommand({\n config: options.config as string | undefined,\n port: options.port as number | undefined,\n open: options.open as boolean | undefined\n })\n })\n\n cli\n .command('build', 'Build for production')\n .option('--config <path>', 'Vite config file')\n .option('--outDir <dir>', 'Output directory')\n .option('--mode <mode>', 'Build mode')\n .action(async (options: Record<string, unknown>) => {\n await buildCommand({\n config: options.config as string | undefined,\n outDir: options.outDir as string | undefined,\n mode: options.mode as string | undefined\n })\n })\n\n cli\n .command('generate [name]', 'Generate code (component/page)')\n .alias('g')\n .option('--type <type>', 'Type: component or page')\n .option('--dir <dir>', 'Target directory')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generateCommand({\n name,\n type: (options.type as 'component' | 'page') || undefined,\n targetDir: options.dir as string | undefined\n })\n })\n\n cli\n .command('add [package]', 'Add a package')\n .option('-D, --dev', 'Save as dev dependency')\n .action(async (pkg: string, options: Record<string, unknown>) => {\n await addCommand({\n package: pkg,\n dev: options.dev as boolean | undefined\n })\n })\n\n cli\n .command('logo', 'Show the vobs CLI logo and version info')\n .action(() => {\n showLogo()\n })\n\n cli.on('--help', () => {\n showBanner()\n })\n\n cli.help()\n cli.version('1.0.0')\n\n return cli\n}"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/utils/logger.ts","../src/utils/file.ts","../src/utils/pm.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/generate.ts","../src/commands/add.ts","../src/banner.ts"],"sourcesContent":["import { cac } from 'cac'\nimport { initCommand } from './commands/init.js'\nimport { devCommand } from './commands/dev.js'\nimport { buildCommand } from './commands/build.js'\nimport { generateCommand } from './commands/generate.js'\nimport { addCommand } from './commands/add.js'\nimport { showBanner, showLogo, showDevBanner } from './banner.js'\n\nexport function createCLI(): ReturnType<typeof cac> {\n const cli = cac('vobs')\n\n cli\n .command('init [name]', 'Create a new vobs project')\n .option('--dir <dir>', 'Target directory')\n .option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')\n .option('--no-typescript', 'Do not use TypeScript')\n .option('--no-git', 'Do not initialize git')\n .action(async (name: string, options: Record<string, unknown>) => {\n await initCommand({\n name,\n targetDir: options.dir as string | undefined,\n packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,\n typescript: options.typescript !== false,\n git: options.git !== false\n })\n })\n\n cli\n .command('create [name]', 'Alias for init')\n .option('--dir <dir>', 'Target directory')\n .option('--pm <pm>', 'Package manager (pnpm/npm/yarn)')\n .option('--no-typescript', 'Do not use TypeScript')\n .option('--no-git', 'Do not initialize git')\n .action(async (name: string, options: Record<string, unknown>) => {\n await initCommand({\n name,\n targetDir: options.dir as string | undefined,\n packageManager: options.pm as 'pnpm' | 'npm' | 'yarn' | undefined,\n typescript: options.typescript !== false,\n git: options.git !== false\n })\n })\n\n cli\n .command('dev', 'Start the dev server')\n .option('--config <path>', 'Vite config file')\n .option('--port <port>', 'Port to listen on')\n .option('--open', 'Open browser on start')\n .action(async (options: Record<string, unknown>) => {\n showDevBanner()\n await devCommand({\n config: options.config as string | undefined,\n port: options.port as number | undefined,\n open: options.open as boolean | undefined\n })\n })\n\n cli\n .command('build', 'Build for production')\n .option('--config <path>', 'Vite config file')\n .option('--outDir <dir>', 'Output directory')\n .option('--mode <mode>', 'Build mode')\n .action(async (options: Record<string, unknown>) => {\n await buildCommand({\n config: options.config as string | undefined,\n outDir: options.outDir as string | undefined,\n mode: options.mode as string | undefined\n })\n })\n\n cli\n .command('generate [name]', 'Generate code (component/page)')\n .alias('g')\n .option('--type <type>', 'Type: component or page')\n .option('--dir <dir>', 'Target directory')\n .action(async (name: string, options: Record<string, unknown>) => {\n await generateCommand({\n name,\n type: (options.type as 'component' | 'page') || undefined,\n targetDir: options.dir as string | undefined\n })\n })\n\n cli\n .command('add [package]', 'Add a package')\n .option('-D, --dev', 'Save as dev dependency')\n .action(async (pkg: string, options: Record<string, unknown>) => {\n await addCommand({\n package: pkg,\n dev: options.dev as boolean | undefined\n })\n })\n\n cli\n .command('logo', 'Show the vobs CLI logo and version info')\n .action(() => {\n showLogo()\n })\n\n cli.on('--help', () => {\n showBanner()\n })\n\n cli.help()\n cli.version('1.0.0')\n\n return cli\n}","import { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { scaffoldProject } from '../utils/file.js'\nimport { installDependencies } from '../utils/pm.js'\nimport type { InitOptions } from '../types.js'\n\nexport async function initCommand(options: Partial<InitOptions>): Promise<void> {\n const projectName = options.name || (await p.text({\n message: 'Project name:',\n placeholder: 'my-vobs-app',\n validate: (v) => !v ? 'Project name is required' : undefined\n })) as string\n\n if (p.isCancel(projectName)) {\n p.cancel('Cancelled')\n return\n }\n\n const targetDir = options.targetDir || resolve(process.cwd(), projectName)\n\n const packageManager = options.packageManager || (await p.select({\n message: 'Package manager:',\n options: [\n { value: 'pnpm', label: 'pnpm' },\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' }\n ]\n })) as 'pnpm' | 'npm' | 'yarn'\n\n if (p.isCancel(packageManager)) {\n p.cancel('Cancelled')\n return\n }\n\n const useTypescript = options.typescript ?? (await p.confirm({\n message: 'Use TypeScript?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(useTypescript)) {\n p.cancel('Cancelled')\n return\n }\n\n const initGit = options.git ?? (await p.confirm({\n message: 'Initialize a git repository?',\n initialValue: true\n })) as boolean\n\n if (p.isCancel(initGit)) {\n p.cancel('Cancelled')\n return\n }\n\n logger.step(`Creating project ${projectName}...`)\n\n await scaffoldProject(targetDir, {\n name: projectName,\n packageName: projectName.toLowerCase().replace(/\\s+/g, '-'),\n typescript: useTypescript,\n vobsVersion: '1.0.0'\n })\n\n logger.success('Project scaffolded')\n\n logger.step('Installing dependencies...')\n installDependencies(targetDir, packageManager)\n logger.success('Dependencies installed')\n\n if (initGit) {\n logger.step('Initializing git repository...')\n try {\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n logger.success('Git repository initialized')\n } catch {\n logger.warn('Git not found, skipping git init')\n }\n }\n\n logger.step('Done!')\n console.log(`\\n ${packageManager === 'pnpm' ? 'pnpm' : packageManager === 'yarn' ? 'yarn' : 'npm run'} dev\\n`)\n}","import pc from 'picocolors'\n\nfunction timestamp(): string {\n return pc.dim(`[${new Date().toLocaleTimeString()}]`)\n}\n\nexport function info(msg: string): void {\n console.log(`${timestamp()} ${pc.cyan('ℹ')} ${msg}`)\n}\n\nexport function success(msg: string): void {\n console.log(`${timestamp()} ${pc.green('✔')} ${msg}`)\n}\n\nexport function warn(msg: string): void {\n console.log(`${timestamp()} ${pc.yellow('⚠')} ${msg}`)\n}\n\nexport function error(msg: string): void {\n console.error(`${timestamp()} ${pc.red('✖')} ${msg}`)\n}\n\nexport function step(msg: string): void {\n console.log(`\\n ${pc.bold(pc.cyan(msg))}`)\n}\n\nexport const logger = { info, success, warn, error, step }","import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport Handlebars from 'handlebars'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst TEMPLATES_ROOT = resolve(__dirname, '..', 'templates')\n\n/** Get the absolute path to the templates directory */\nexport function getTemplatesDir(): string {\n return TEMPLATES_ROOT\n}\n\n/** Read a template file and compile it with Handlebars */\nexport function renderTemplate(\n templatePath: string,\n context: Record<string, unknown>\n): string {\n const source = readFileSync(templatePath, 'utf-8')\n const template = Handlebars.compile(source)\n return template(context)\n}\n\n/** Write a file, creating parent directories if needed */\nexport function writeFile(dir: string, filename: string, content: string): void {\n const filePath = resolve(dir, filename)\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content, 'utf-8')\n}\n\n/** Ensure a directory exists */\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n}\n\n/** Check if a path exists */\nexport function pathExists(path: string): boolean {\n return existsSync(path)\n}\n\n/** Copy a template directory recursively, rendering each .hbs file */\nasync function copyDirRecursive(srcDir: string, destDir: string, context: Record<string, unknown>): Promise<void> {\n const { readdirSync } = await import('node:fs')\n const { join } = await import('node:path')\n\n const entries = readdirSync(srcDir, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const isHbs = entry.name.endsWith('.hbs')\n const destName = isHbs ? entry.name.slice(0, -4) : entry.name\n const destPath = join(destDir, destName)\n\n if (entry.isDirectory()) {\n ensureDir(destPath)\n await copyDirRecursive(srcPath, destPath, context)\n } else if (isHbs) {\n const content = renderTemplate(srcPath, context)\n writeFile(destDir, destName, content)\n } else {\n const content = readFileSync(srcPath, 'utf-8')\n writeFile(destDir, destName, content)\n }\n }\n}\n\n/** Scaffold a project from the basic template */\nexport async function scaffoldProject(\n targetDir: string,\n context: Record<string, unknown>\n): Promise<void> {\n const templateDir = resolve(TEMPLATES_ROOT, 'basic')\n ensureDir(targetDir)\n await copyDirRecursive(templateDir, targetDir, context)\n}","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { execSync } from 'node:child_process'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn'\n\n/** Detect the package manager to use */\nexport function detectPackageManager(targetDir?: string): PackageManager {\n // Check if a specific package manager is locked\n if (targetDir) {\n if (existsSync(resolve(targetDir, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(resolve(targetDir, 'yarn.lock'))) return 'yarn'\n if (existsSync(resolve(targetDir, 'package-lock.json'))) return 'npm'\n }\n\n // Check for global preference\n const userAgent = process.env.npm_config_user_agent || ''\n if (userAgent.startsWith('pnpm')) return 'pnpm'\n if (userAgent.startsWith('yarn')) return 'yarn'\n if (userAgent.startsWith('npm')) return 'npm'\n\n // Default to pnpm\n return 'pnpm'\n}\n\n/** Install dependencies in a directory */\nexport function installDependencies(targetDir: string, pm: PackageManager): void {\n const cmd = pm === 'yarn' ? 'yarn' : `${pm} install`\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}\n\n/** Add a package as a dependency */\nexport function addPackage(targetDir: string, pm: PackageManager, pkg: string, dev: boolean): void {\n const installFlag = dev ? '-D' : ''\n const cmd = pm === 'npm'\n ? `npm install ${installFlag} ${pkg}`\n : pm === 'yarn'\n ? `yarn add ${installFlag} ${pkg}`\n : `pnpm add ${installFlag} ${pkg}`\n\n execSync(cmd, { cwd: targetDir, stdio: 'inherit' })\n}","import { createServer } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { DevOptions } from '../types.js'\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n logger.info('Starting dev server...')\n\n const server = await createServer({\n configFile: options.config,\n server: {\n port: options.port,\n open: options.open\n }\n })\n\n await server.listen()\n server.printUrls()\n logger.success('Dev server is running')\n}","import { build } from 'vite'\nimport { logger } from '../utils/logger.js'\nimport type { BuildOptions } from '../types.js'\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n logger.info('Building for production...')\n\n await build({\n configFile: options.config,\n build: {\n outDir: options.outDir\n },\n mode: options.mode || 'production'\n })\n\n logger.success('Build complete')\n}","import { resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { renderTemplate, writeFile, getTemplatesDir, ensureDir } from '../utils/file.js'\nimport type { GenerateOptions, ComponentTemplateContext, PageTemplateContext } from '../types.js'\n\nexport async function generateCommand(options: Partial<GenerateOptions>): Promise<void> {\n const type = options.type || (await p.select({\n message: 'What to generate?',\n options: [\n { value: 'component', label: 'Component' },\n { value: 'page', label: 'Page' }\n ]\n })) as 'component' | 'page'\n\n if (p.isCancel(type)) {\n p.cancel('Cancelled')\n return\n }\n\n const name = options.name || (await p.text({\n message: 'Name:',\n placeholder: type === 'component' ? 'Button' : 'AboutPage',\n validate: (v) => !v ? 'Name is required' : undefined\n })) as string\n\n if (p.isCancel(name)) {\n p.cancel('Cancelled')\n return\n }\n\n const templatesDir = getTemplatesDir()\n\n if (type === 'component') {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/components')\n ensureDir(targetDir)\n\n const context: ComponentTemplateContext = {\n name: toPascalCase(name),\n kebabName: toKebabCase(name)\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'component.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n } else {\n const targetDir = options.targetDir || resolve(process.cwd(), 'src/pages')\n ensureDir(targetDir)\n\n const context: PageTemplateContext = {\n name: toPascalCase(name),\n path: `/${toKebabCase(name)}`\n }\n\n const content = renderTemplate(\n resolve(templatesDir, 'page.hbs'),\n context as unknown as Record<string, unknown>\n )\n\n const filename = `${context.name}.tsx`\n writeFile(targetDir, filename, content)\n logger.success(`Created ${type} at ${resolve(targetDir, filename)}`)\n }\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '')\n}","import * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { detectPackageManager, addPackage } from '../utils/pm.js'\nimport type { AddOptions } from '../types.js'\n\nexport async function addCommand(options: Partial<AddOptions>): Promise<void> {\n const pkg = options.package || (await p.text({\n message: 'Package to add:',\n placeholder: '@vobs/ui',\n validate: (v) => !v ? 'Package name is required' : undefined\n })) as string\n\n if (p.isCancel(pkg)) {\n p.cancel('Cancelled')\n return\n }\n\n const isDev = options.dev ?? (await p.confirm({\n message: 'Save as dev dependency?',\n initialValue: false\n })) as boolean\n\n if (p.isCancel(isDev)) {\n p.cancel('Cancelled')\n return\n }\n\n const pm = detectPackageManager(process.cwd())\n\n logger.step(`Installing ${pkg}...`)\n addPackage(process.cwd(), pm, pkg, isDev)\n\n logger.success(`Installed ${pkg}`)\n console.log(`\\n Import it in your code:\\n`)\n console.log(` import { ... } from '${pkg}'`)\n console.log()\n}","/**\n * VOBS CLI Banner — Mathematical Bold Sans-Serif\n * 𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬\n * Signals First · Zero Re-renders · Ultra Lightweight\n *\n * The banner is left-aligned with a fixed indent rather than horizontally\n * centered. Centering depends on the terminal column width and per-glyph\n * render width, neither of which is reliably knowable, so it drifts as the\n * window resizes. Fixed indent is stable across any terminal size.\n */\n\nconst BANNER_LINE1 = '𝗩𝗢𝗕𝗦 𝗖𝗟𝗜 𝘃𝟭.𝟬'\nconst BANNER_TAGLINE = 'Signals First · Zero Re-renders · Ultra Lightweight'\n\n/** Fixed left indent applied to every banner line (2 spaces). */\nconst INDENT = ' '\nconst DIM = '\\x1b[2m'\nconst RESET = '\\x1b[0m'\n\n/** Show full banner (used for logo command, --help) */\nexport function showLogo(): void {\n console.log()\n console.log()\n console.log(`${INDENT}${BANNER_LINE1}`)\n console.log()\n console.log(`${INDENT}${DIM}${BANNER_TAGLINE}${RESET}`)\n console.log()\n console.log()\n}\n\n/** Show single-line version banner (used for --version) */\nexport function showBanner(): void {\n console.log(`${INDENT}${BANNER_LINE1}`)\n}\n\n/** Show the dev server start banner */\nexport function showDevBanner(): void {\n console.log()\n console.log(`${INDENT}${BANNER_LINE1}`)\n console.log()\n}"],"mappings":"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","names":["resolve","execSync","existsSync","resolve","existsSync","resolve","resolve","execSync","resolve","p","resolve","p"]}