@vobs/cli 1.7.4 → 1.7.7
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/cli.cjs +551 -5
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +551 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/dsh.cjs +677 -0
- package/dist/commands/dsh.cjs.map +1 -0
- package/dist/commands/dsh.d.cts +43 -0
- package/dist/commands/dsh.d.ts +43 -0
- package/dist/commands/dsh.js +638 -0
- package/dist/commands/dsh.js.map +1 -0
- package/dist/commands/generate.cjs.map +1 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/index.cjs +543 -5
- package/dist/commands/index.cjs.map +1 -1
- package/dist/commands/index.d.cts +2 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +540 -5
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.cjs +5 -2
- package/dist/commands/init.cjs.map +1 -1
- package/dist/commands/init.js +5 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/index.cjs +553 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +551 -5
- package/dist/index.js.map +1 -1
- package/dist/repl.cjs +5 -2
- package/dist/repl.cjs.map +1 -1
- package/dist/repl.js +5 -2
- package/dist/repl.js.map +1 -1
- package/dist/start.cjs +553 -7
- package/dist/start.cjs.map +1 -1
- package/dist/start.js +551 -5
- package/dist/start.js.map +1 -1
- package/dist/templates/dsh-plugin/README.md.hbs +54 -0
- package/dist/templates/dsh-plugin/cordis.patch.yml.hbs +7 -0
- package/dist/templates/dsh-plugin/package.json.hbs +40 -0
- package/dist/templates/dsh-plugin/src/client/index.tsx.hbs +24 -0
- package/dist/templates/dsh-plugin/src/client/panel.tsx.hbs +45 -0
- package/dist/templates/dsh-plugin/src/client/styles.ts.hbs +65 -0
- package/dist/templates/dsh-plugin/src/host/index.ts.hbs +20 -0
- package/dist/templates/dsh-plugin/tsconfig.json.hbs +19 -0
- package/dist/templates/dsh-plugin/vite.config.ts.hbs +13 -0
- package/dist/utils/file.cjs +5 -2
- package/dist/utils/file.cjs.map +1 -1
- package/dist/utils/file.d.cts +2 -2
- package/dist/utils/file.d.ts +2 -2
- package/dist/utils/file.js +5 -2
- package/dist/utils/file.js.map +1 -1
- package/package.json +1 -1
- package/src/cli.ts +28 -0
- package/src/commands/dsh.test.ts +279 -0
- package/src/commands/dsh.ts +673 -0
- package/src/commands/index.ts +2 -1
- package/src/templates/dsh-plugin/README.md.hbs +54 -0
- package/src/templates/dsh-plugin/cordis.patch.yml.hbs +7 -0
- package/src/templates/dsh-plugin/package.json.hbs +40 -0
- package/src/templates/dsh-plugin/src/client/index.tsx.hbs +24 -0
- package/src/templates/dsh-plugin/src/client/panel.tsx.hbs +45 -0
- package/src/templates/dsh-plugin/src/client/styles.ts.hbs +65 -0
- package/src/templates/dsh-plugin/src/host/index.ts.hbs +20 -0
- package/src/templates/dsh-plugin/tsconfig.json.hbs +19 -0
- package/src/templates/dsh-plugin/vite.config.ts.hbs +13 -0
- package/src/utils/file.ts +7 -3
package/dist/start.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/start.ts","../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","../src/repl.ts"],"sourcesContent":["import { createCLI } from './cli.js'\nimport { showBanner } from './banner.js'\nimport { startRepl } from './repl.js'\n\n/** Entry point: decides between interactive REPL and single-shot commands */\nexport async function start(args: string[]): Promise<void> {\n // No args (or explicit `cli`) → launch the interactive REPL\n if (args.length === 0 || args[0] === 'cli') {\n await startRepl()\n return\n }\n\n if (args.includes('--version') || args.includes('-V')) {\n showBanner()\n return\n }\n\n // Let cac read the full process.argv so single-shot commands dispatch correctly\n createCLI().parse()\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}","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}","import { createInterface } from 'node:readline/promises'\nimport { stdin, stdout } from 'node:process'\nimport pc from 'picocolors'\nimport { showLogo, showBanner } from './banner.js'\nimport { initCommand } from './commands/init.js'\nimport { generateCommand } from './commands/generate.js'\nimport { addCommand } from './commands/add.js'\n\n/**\n * Interactive REPL shell. Runs `vobs` with no arguments and stays in CLI\n * mode accepting repeated commands until the user types `exit` / `quit`\n * or presses Ctrl+C / Ctrl+D.\n */\nexport async function startRepl(): Promise<void> {\n showLogo()\n\n const rl = createInterface({\n input: stdin,\n output: stdout,\n prompt: ` ${pc.magenta('❯')} `,\n terminal: true\n })\n\n rl.prompt()\n\n for await (const rawLine of rl) {\n const line = rawLine.trim()\n\n if (!line) {\n rl.prompt()\n continue\n }\n\n // Split into args, honoring simple double quotes\n const args = splitArgs(line)\n\n try {\n await dispatch(args)\n } catch (err) {\n console.error(` ${pc.red('✖')} ${err instanceof Error ? err.message : String(err)}`)\n }\n\n rl.prompt()\n }\n}\n\ntype Command = (args: string[]) => Promise<void>\n\n/** Internal command table for the REPL */\nconst TABLE: Record<string, { cmd: Command; help: string }> = {\n help: {\n cmd: async () => {\n console.log(` ${pc.bold('Available commands:')}`)\n console.log(` ${pc.dim('exit|quit')} Leave the interactive CLI`)\n console.log(` ${pc.dim('clear')} Clear the screen`)\n console.log(` ${pc.dim('logo')} Re-print the banner`)\n console.log(` ${pc.dim('version')} Show version`)\n console.log(` ${pc.dim('init <name>')} Create a new vobs project`)\n console.log(` ${pc.dim('generate <name>')} Generate a component/page`)\n console.log(` ${pc.dim('add <package>')} Add a package`)\n console.log(` ${pc.dim('dev|build')} Use \\`vobs dev\\` / \\`vobs build\\` in a terminal`)\n },\n help: ''\n },\n logo: { cmd: async () => showLogo(), help: '' },\n version: { cmd: async () => showBanner(), help: '' },\n clear: {\n cmd: async () => {\n process.stdout.write('\\x1Bc')\n },\n help: ''\n },\n exit: { cmd: async () => process.exit(0), help: '' },\n quit: { cmd: async () => process.exit(0), help: '' },\n init: {\n cmd: async (args) => {\n await initCommand({\n name: args[0],\n targetDir: undefined,\n packageManager: undefined,\n typescript: true,\n git: true\n })\n },\n help: ''\n },\n generate: {\n cmd: async (args) => {\n await generateCommand({\n name: args[0],\n type: undefined,\n targetDir: undefined\n })\n },\n help: ''\n },\n g: {\n cmd: async (args) => {\n await generateCommand({\n name: args[0],\n type: undefined,\n targetDir: undefined\n })\n },\n help: ''\n },\n add: {\n cmd: async (args) => {\n await addCommand({ package: args[0], dev: args.includes('-D') || args.includes('--dev') })\n },\n help: ''\n }\n}\n\n/** Dispatch a parsed command line to the internal table */\nasync function dispatch(args: string[]): Promise<void> {\n const name = args[0]\n const rest = args.slice(1)\n\n if (!name) return\n\n const entry = TABLE[name]\n if (entry) {\n await entry.cmd(rest)\n return\n }\n\n console.log(` ${pc.yellow('⚠')} Unknown command: ${pc.bold(String(name))}. Type ${pc.cyan('help')} to see options.`)\n}\n\n/** Minimal tokenizer supporting double-quoted arguments */\nfunction splitArgs(line: string): string[] {\n const out: string[] = []\n const re = /[^\\s\"']+|\"([^\"]*)\"|'([^']*)'/g\n let m: RegExpExecArray | null\n while ((m = re.exec(line)) !== null) {\n out.push(m[1] ?? m[2] ?? m[0])\n }\n return out\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","import_picocolors","pc"]}
|
|
1
|
+
{"version":3,"sources":["../src/start.ts","../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/commands/dsh.ts","../src/banner.ts","../src/repl.ts"],"sourcesContent":["import { createCLI } from './cli.js'\nimport { showBanner } from './banner.js'\nimport { startRepl } from './repl.js'\n\n/** Entry point: decides between interactive REPL and single-shot commands */\nexport async function start(args: string[]): Promise<void> {\n // No args (or explicit `cli`) → launch the interactive REPL\n if (args.length === 0 || args[0] === 'cli') {\n await startRepl()\n return\n }\n\n if (args.includes('--version') || args.includes('-V')) {\n showBanner()\n return\n }\n\n // Let cac read the full process.argv so single-shot commands dispatch correctly\n createCLI().parse()\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 { dshCommand } from './commands/dsh.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('dsh <action> [target]', 'DSH 插件工具链(init / dev / build / check / install)')\n .option('--dir <dir>', 'init:目标目录')\n .option('--pm <pm>', 'init:包管理器(pnpm/npm)')\n .option('--port <port>', 'dev:预览端口', { default: 5199 })\n .option('--profile <name>', 'install:DSH profile 名', { default: 'desktop' })\n .option('--spec <spec>', 'install:完整安装 spec')\n .option('--repo <owner/name>', 'install:GitHub owner/name')\n .option('--tag <ref>', 'install:Git tag / 分支 / commit')\n .option('--subpath <path>', 'install:仓库内子目录')\n .option('--from <path>', 'install:从本地目录安装')\n .option('--dry', 'install:只打印命令,不执行')\n .action(async (action: string, target: string | undefined, options: Record<string, unknown>) => {\n await dshCommand(action, target, {\n dir: options.dir as string | undefined,\n pm: options.pm as 'pnpm' | 'npm' | undefined,\n profile: options.profile as string | undefined,\n spec: options.spec as string | undefined,\n repo: options.repo as string | undefined,\n tag: options.tag as string | undefined,\n subpath: options.subpath as string | undefined,\n from: options.from as string | undefined,\n dry: options.dry === true,\n port: options.port === undefined ? undefined : Number(options.port)\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 a named template under `src/templates`. */\nexport async function scaffoldProject(\n targetDir: string,\n context: Record<string, unknown>,\n template = 'basic'\n): Promise<void> {\n const templateDir = resolve(TEMPLATES_ROOT, template)\n if (!existsSync(templateDir)) {\n throw new Error(`模板不存在: ${template}(可用模板见 ${TEMPLATES_ROOT})`)\n }\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}","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { execSync, spawnSync } from 'node:child_process'\nimport { createServer, type ServerResponse } from 'node:http'\nimport { createRequire } from 'node:module'\nimport { isAbsolute, basename, dirname, join, relative, resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { logger } from '../utils/logger.js'\nimport { ensureDir, scaffoldProject } from '../utils/file.js'\nimport { installDependencies, type PackageManager } from '../utils/pm.js'\n\nexport interface DshOptions {\n dir?: string\n pm?: PackageManager\n profile?: string\n spec?: string\n repo?: string\n tag?: string\n subpath?: string\n from?: string\n dry?: boolean\n port?: number\n}\n\n/** 平台内置模块:这些 `require` 出现在产物里是正常的。 */\nconst PLATFORM_MODULES = ['react', 'react-dom']\n\nconst vobsVersion = (): string => {\n try {\n const manifest = JSON.parse(\n readFileSync(new URL('../../package.json', import.meta.url), 'utf8')\n ) as { version?: string }\n return manifest.version ?? '1.7.5'\n } catch {\n return '1.7.5'\n }\n}\n\n/** 去掉 scope,得到 cordis 行 id 与目录名都可用的标识。 */\nfunction toRowId(packageName: string): string {\n return packageName.replace(/^@[^/]+\\//u, '')\n}\n\n/* ------------------------------------------------------------------ init */\n\nasync function dshInitCommand(target: string | undefined, options: DshOptions): Promise<void> {\n const name = target ?? ((await p.text({\n message: '插件包名(npm 包名,小写):',\n placeholder: 'dsh-plugin-my-panel',\n validate: value => (/^[a-z0-9][a-z0-9._~-]*$/u.test(value) ? undefined : '必须是合法的 npm 包名')\n })) as string)\n\n if (p.isCancel(name)) {\n p.cancel('已取消')\n return\n }\n\n const packageManager =\n options.pm ??\n ((await p.select({\n message: '包管理器:',\n options: [\n { value: 'pnpm', label: 'pnpm' },\n { value: 'npm', label: 'npm' }\n ]\n })) as PackageManager)\n\n if (p.isCancel(packageManager)) {\n p.cancel('已取消')\n return\n }\n\n const targetDir = options.dir !== undefined ? resolve(options.dir) : resolve(process.cwd(), name)\n const rowId = toRowId(name)\n const displayName = rowId\n .replace(/^dsh-plugin-/u, '')\n .split('-')\n .map(part => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ')\n\n logger.step(`创建 DSH 插件项目 ${name} …`)\n await scaffoldProject(\n targetDir,\n { packageName: name, rowId, displayName, vobsVersion: vobsVersion() },\n 'dsh-plugin'\n )\n\n // 单独写 .gitignore:模板里的点文件在打包时容易丢,而且这里的规则有一条很关键 ——\n // lib/ 是产物,**必须提交**(DSH 安装时不构建)。\n ensureDir(targetDir)\n writeFileSync(\n resolve(targetDir, '.gitignore'),\n ['node_modules/', '*.log', '*.tsbuildinfo', '', '# lib/ 是构建产物,必须提交:DSH 安装时不会构建你的包。', ''].join('\\n'),\n 'utf8'\n )\n logger.success('项目已生成')\n\n logger.step('安装依赖 …')\n try {\n installDependencies(targetDir, packageManager)\n logger.success('依赖已安装')\n } catch {\n logger.warn(`依赖安装失败,请手动执行 ${packageManager} install`)\n }\n\n logger.step('下一步')\n console.log(`\n cd ${name}\n ${packageManager} run dev # 本地预览,不用装进 DSH\n ${packageManager} run build # 产出 lib/{index,client}.js\n\n # 提交产物并打 tag 之后,在 DSH 插件页填:\n github:<owner>/<repo>#v0.1.0&path:/<本包在仓库中的路径>\n`)\n}\n\n/* ----------------------------------------------------------------- build */\n\n/**\n * 构建 DSH 插件产物。\n *\n * 一个可安装的插件包有**两半**:Host 侧(cordis 插件,ESM)与 Client 侧\n * (浏览器 bundle)。项目的 vite.config 只负责 Client(`dshBundle()` 会把产物\n * 落到 package.json 声明的位置),Host 这一半由本命令补上 ——\n * 否则 `exports[\".\"]` 指向的文件根本不存在,装进 DSH 必然失败。\n */\nasync function dshBuildCommand(): Promise<void> {\n const projectDir = process.cwd()\n const configFile = resolve(projectDir, 'vite.config.ts')\n if (!existsSync(configFile)) {\n logger.error('当前目录没有 vite.config.ts,请在插件项目根目录运行。')\n process.exitCode = 1\n return\n }\n\n const manifest = readManifest(projectDir)\n if (manifest === undefined) {\n logger.error('读不到 package.json。')\n process.exitCode = 1\n return\n }\n\n const hostEntry = resolveExport(manifest, '.')\n if (hostEntry === undefined) {\n logger.error('package.json 的 exports 里没有 \".\",DSH 加载不到 Host 侧插件。')\n process.exitCode = 1\n return\n }\n\n const { build } = await import('vite')\n\n logger.info('构建客户端产物 …')\n await build({ configFile, mode: 'production' })\n\n logger.info('构建 Host 产物 …')\n const hostTarget = resolve(projectDir, hostEntry.replace(/^\\.\\//u, ''))\n const hostEntrySource = resolve(projectDir, 'src', 'host', 'index.ts')\n if (!existsSync(hostEntrySource)) {\n logger.warn(`没有找到 ${hostEntrySource},跳过 Host 构建。`)\n return\n }\n await build({\n configFile: false,\n root: projectDir,\n logLevel: 'warn',\n build: {\n outDir: relative(projectDir, dirname(hostTarget)) || '.',\n emptyOutDir: false,\n target: 'es2022',\n minify: false,\n sourcemap: false,\n lib: {\n entry: hostEntrySource,\n formats: ['es'],\n fileName: () => basename(hostTarget)\n }\n }\n })\n\n logger.success('构建完成 → 客户端与 Host 产物都已就位')\n}\n\n/* ------------------------------------------------------------------ dev */\n\n/** 从 exports 字段里取出一个子路径,兼容字符串与一层条件对象两种写法。 */\nexport function resolveExport(manifest: Record<string, unknown>, key: string): string | undefined {\n const exportsField = (manifest.exports ?? {}) as Record<string, unknown>\n const entry = exportsField[key]\n if (typeof entry === 'string') return entry\n if (typeof entry === 'object' && entry !== null) {\n const record = entry as Record<string, unknown>\n for (const condition of ['default', 'import', 'require']) {\n const value = record[condition]\n if (typeof value === 'string') return value\n }\n }\n return undefined\n}\n\n/** 生成预览页。纯函数,便于单测。 */\nexport function buildPreviewHtml(options: { packageName: string; title?: string }): string {\n // 包名会被嵌进 <script> 里:JSON 序列化不会转义 `/`,所以必须自己把 `<` 干掉,\n // 否则一个含 </script> 的包名就能突破标签。\n const name = JSON.stringify(options.packageName).replace(/</gu, '\\\\u003c')\n const title = (options.title ?? options.packageName).replace(/[<>&]/gu, '')\n return `<!doctype html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>vobs preview · ${title}</title>\n</head>\n<body>\n<div id=\"root\"></div>\n\n<!-- 1. 先装垫片:必须在插件 bundle 之前,捕获它的 factory 注册 -->\n<script>\n window.__VOBS_DSH_PREVIEW__ = { factories: new Map() };\n window.__ModuleLoader__ = {\n load: function (entry) { window.__VOBS_DSH_PREVIEW__.factories.set(entry.id, entry.factory); }\n };\n</script>\n\n<!-- 2. 插件产物:它只注册 factory,不产生副作用 -->\n<script src=\"/client.js\"></script>\n\n<!-- 3. 启动预览外壳 -->\n<script type=\"module\">\n import { startPreview } from '/preview.js';\n window.__VOBS_PREVIEW__ = startPreview({\n container: document.getElementById('root'),\n packageName: ${name}\n });\n</script>\n\n<!-- 4. 重建后自动刷新;?static=1 关掉长连接,便于无头截图与 CI 断言 -->\n<script>\n if (!location.search.includes('static')) {\n new EventSource('/events').addEventListener('reload', function () { location.reload(); });\n }\n</script>\n</body>\n</html>\n`\n}\n\n/**\n * vite 的构建监听器。只声明本命令用到的两个成员 ——\n * `vite` 没有把 rollup 的 `RollupWatcher` 再导出,为一个 dev 命令引入 rollup 类型不划算。\n */\ninterface BuildWatcher {\n on(event: 'event', handler: (event: { code?: string; error?: { message?: string } }) => void): void\n close(): Promise<void>\n}\n\nasync function dshDevCommand(options: DshOptions): Promise<void> {\n const projectDir = process.cwd()\n const manifest = readManifest(projectDir)\n if (manifest === undefined) {\n logger.error('当前目录没有可读的 package.json。')\n process.exitCode = 1\n return\n }\n if (readManifest(projectDir)?.dsh === undefined) {\n logger.error('这不是一个 DSH 插件项目(package.json 里没有 dsh 字段)。')\n process.exitCode = 1\n return\n }\n\n const packageName = typeof manifest.name === 'string' ? manifest.name : 'dsh-plugin'\n const clientEntry = resolveExport(manifest, './client')\n if (clientEntry === undefined) {\n logger.error('package.json 的 exports 里没有 \"./client\",页面拿不到客户端 bundle。')\n process.exitCode = 1\n return\n }\n const clientFile = resolve(projectDir, clientEntry.replace(/^\\.\\//u, ''))\n\n // 预览运行时从**项目自己**的 node_modules 解析:项目才是声明 @vobs/dsh 的那一方。\n let previewFile: string | undefined\n try {\n const projectRequire = createRequire(join(projectDir, 'package.json'))\n let packageRoot: string | undefined\n try {\n // 首选:包导出了 ./package.json(@vobs/dsh 有)。\n packageRoot = dirname(projectRequire.resolve('@vobs/dsh/package.json'))\n } catch {\n // 回退:解析主入口(dist/index.js 或 dist/index.cjs),再回到包根。\n packageRoot = dirname(dirname(projectRequire.resolve('@vobs/dsh')))\n }\n const candidate = join(packageRoot, 'dist', 'preview.js')\n previewFile = existsSync(candidate) ? candidate : undefined\n } catch {\n previewFile = undefined\n }\n if (previewFile === undefined) {\n logger.error('项目里找不到 @vobs/dsh 的预览运行时。先安装依赖:pnpm add -D @vobs/dsh')\n process.exitCode = 1\n return\n }\n\n const port = options.port ?? 5199\n const clients = new Set<ServerResponse>()\n const broadcast = (event: string): void => {\n for (const client of clients) client.write(`event: ${event}\\ndata: 1\\n\\n`)\n }\n\n /* 先构建一次,再进监听模式 */\n logger.info('构建产物 …')\n const { build } = await import('vite')\n const configFile = resolve(projectDir, 'vite.config.ts')\n let buildError: string | undefined\n\n try {\n const watcher = (await build({\n configFile,\n mode: 'development',\n logLevel: 'warn',\n build: { watch: {} }\n })) as unknown as BuildWatcher\n\n watcher.on('event', event => {\n if (event.code === 'END') {\n buildError = undefined\n logger.success('重新构建完成')\n broadcast('reload')\n } else if (event.code === 'ERROR') {\n buildError = event.error?.message ?? '构建失败'\n logger.error(buildError)\n }\n })\n process.on('SIGINT', () => {\n void watcher.close().then(() => process.exit(0))\n })\n } catch (error) {\n logger.error(`构建失败:${error instanceof Error ? error.message : String(error)}`)\n process.exitCode = 1\n return\n }\n\n const server = createServer((request, response) => {\n const url = (request.url ?? '/').split('?')[0]\n\n if (url === '/events') {\n response.writeHead(200, {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-store',\n connection: 'keep-alive'\n })\n response.write(': connected\\n\\n')\n clients.add(response)\n request.on('close', () => clients.delete(response))\n return\n }\n\n const send = (body: string | Buffer, type: string): void => {\n response.writeHead(200, { 'content-type': type, 'cache-control': 'no-store' })\n response.end(body)\n }\n\n if (url === '/') {\n send(buildPreviewHtml({ packageName }), 'text/html; charset=utf-8')\n return\n }\n if (url === '/preview.js') {\n void readFile(previewFile as string).then(body => send(body, 'text/javascript; charset=utf-8'))\n return\n }\n if (url === '/client.js') {\n if (!existsSync(clientFile)) {\n response.writeHead(503, { 'content-type': 'text/plain; charset=utf-8' })\n response.end(`还没有产物:${clientEntry}\\n${buildError ?? ''}`)\n return\n }\n void readFile(clientFile).then(body => send(body, 'text/javascript; charset=utf-8'))\n return\n }\n\n response.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' })\n response.end('not found')\n })\n\n await new Promise<void>(resolveListen => {\n server.listen(port, '127.0.0.1', resolveListen)\n })\n\n logger.success(`预览已就绪:http://127.0.0.1:${port}/`)\n console.log('\\n 改代码会自动重建并刷新页面;Ctrl+C 退出。\\n')\n}\n\n/* ----------------------------------------------------------------- check */\n\ninterface CheckResult {\n errors: string[]\n warnings: string[]\n passed: string[]\n}\n\n/** 读取并解析 package.json。 */\nfunction readManifest(dir: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(readFileSync(resolve(dir, 'package.json'), 'utf8')) as Record<string, unknown>\n } catch {\n return undefined\n }\n}\n\n/**\n * 装前一致性校验:把「装进 DSH 之后才发现坏」的问题提前到本地。\n *\n * 检查项全部来自 DSH 的客户端插件契约与 pnpm 的 Git 子目录安装约束。\n */\nexport function collectIssues(dir: string): CheckResult {\n const result: CheckResult = { errors: [], warnings: [], passed: [] }\n const manifest = readManifest(dir)\n\n if (manifest === undefined) {\n result.errors.push('读不到 package.json(JSON 语法错误或文件缺失)')\n return result\n }\n\n const name = typeof manifest.name === 'string' ? manifest.name : ''\n if (name === '') result.errors.push('package.json 缺少 name')\n else result.passed.push(`包名 ${name}`)\n\n const dsh = (manifest.dsh ?? {}) as Record<string, unknown>\n const bundle = (dsh.bundle ?? {}) as Record<string, unknown>\n const client = (dsh.client ?? {}) as Record<string, unknown>\n\n if (typeof bundle.patch !== 'string') {\n result.errors.push('缺少 dsh.bundle.patch —— DSH 不会把这个包当作组合包(bundle)')\n } else {\n const patchPath = resolve(dir, bundle.patch.replace(/^\\.\\//u, ''))\n if (!existsSync(patchPath)) {\n result.errors.push(`dsh.bundle.patch 指向的 ${bundle.patch} 不存在`)\n } else {\n const text = readFileSync(patchPath, 'utf8')\n if (!text.includes('insert:')) result.errors.push('cordis.patch.yml 里没有 insert: 段落,插件行不会进组合树')\n else if (name !== '' && !text.includes(name)) {\n result.warnings.push(`cordis.patch.yml 里没有出现包名 ${name},确认 insert 的 name 写对了`)\n } else result.passed.push('cordis.patch.yml 会插入本包的行')\n }\n }\n\n if (client.platform !== 'web') {\n result.errors.push(\"dsh.client.platform 必须是 'web' —— 否则 DSH 不会给页面提供客户端 bundle\")\n } else result.passed.push('dsh.client.platform = web')\n\n const exportsField = (manifest.exports ?? {}) as Record<string, string>\n const hostEntry = exportsField['.']\n const clientEntry = exportsField['./client']\n if (typeof hostEntry !== 'string') result.errors.push('exports[\".\"] 未声明 —— DSH 加载不到 Host 侧插件')\n else if (!existsSync(resolve(dir, hostEntry.replace(/^\\.\\//u, '')))) {\n result.errors.push(`exports[\".\"] 指向的 ${hostEntry} 不存在,先构建`)\n } else result.passed.push('Host 入口存在')\n\n if (typeof clientEntry !== 'string') result.errors.push('exports[\"./client\"] 未声明 —— 页面拿不到客户端 bundle')\n\n const scripts = (manifest.scripts ?? {}) as Record<string, string>\n if (scripts.prepare !== undefined || scripts.postinstall !== undefined) {\n result.errors.push('声明了 prepare / postinstall —— DSH 安装时不构建,产物必须预先提交')\n } else result.passed.push('没有安装期生命周期钩子')\n\n const dependencyText = JSON.stringify({\n dependencies: manifest.dependencies,\n peerDependencies: manifest.peerDependencies,\n devDependencies: manifest.devDependencies\n })\n if (dependencyText.includes('workspace:')) {\n result.errors.push('依赖里出现了 workspace: 协议 —— GitHub 子目录直装时解析不了')\n } else result.passed.push('没有 workspace: 协议依赖')\n\n if (typeof clientEntry === 'string') {\n const clientPath = resolve(dir, clientEntry.replace(/^\\.\\//u, ''))\n if (!existsSync(clientPath)) {\n result.errors.push(`客户端产物 ${clientEntry} 不存在,先运行构建`)\n } else {\n const code = readFileSync(clientPath, 'utf8')\n const loads = (code.match(/__ModuleLoader__\\.load\\(/gu) ?? []).length\n if (loads !== 1) result.errors.push(`客户端产物里 __ModuleLoader__.load 出现 ${loads} 次,应为 1 次(先构建)`)\n else result.passed.push('产物形态是 DSH 客户端模块协议')\n\n if (code.includes('import(')) result.errors.push('客户端产物里有动态 import(),DSH 只支持自包含 chunk')\n\n const requires = [...code.matchAll(/require\\((['\"])([^'\"]+)\\1\\)/gu)].map(match => match[2] ?? '')\n const foreign = requires.filter(id => !PLATFORM_MODULES.includes(id) && !id.startsWith('@deepseek-ai/'))\n if (foreign.length > 0) {\n result.errors.push(`产物 require 了非平台模块:${[...new Set(foreign)].join(', ')} —— 依赖没有被打进产物`)\n } else if (requires.length > 0) {\n result.passed.push(`产物只 require 平台模块(${[...new Set(requires)].join(', ')})`)\n }\n\n if (name !== '' && !code.includes(`\"${name}\"`) && !code.includes(`'${name}'`)) {\n result.warnings.push(`产物里的模块 id 与包名 ${name} 不一致,检查 dshBundle({ id })`)\n }\n }\n }\n\n return result\n}\n\nfunction dshCheckCommand(): void {\n const dir = process.cwd()\n const result = collectIssues(dir)\n\n logger.step('DSH 插件装前校验')\n for (const item of result.passed) console.log(` ✔ ${item}`)\n for (const item of result.warnings) console.log(` ⚠ ${item}`)\n for (const item of result.errors) console.log(` ✖ ${item}`)\n\n if (result.errors.length > 0) {\n logger.error(`${result.errors.length} 项不通过,装进 DSH 后不会正常工作。`)\n process.exitCode = 1\n return\n }\n logger.success(`全部通过(${result.passed.length} 项${result.warnings.length > 0 ? `,${result.warnings.length} 条警告` : ''})`)\n}\n\n/* --------------------------------------------------------------- install */\n\n/** 读取 pnpm 版本;拿不到就返回 undefined。 */\nfunction readPnpmVersion(): string | undefined {\n try {\n return execSync('pnpm --version', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim()\n } catch {\n return undefined\n }\n}\n\nconst majorOf = (version: string | undefined): number => {\n const major = Number.parseInt((version ?? '').split('.')[0] ?? '', 10)\n return Number.isFinite(major) ? major : 0\n}\n\n/** 组装安装 spec。 */\nexport function buildInstallSpec(options: DshOptions): { spec?: string; error?: string } {\n if (options.spec !== undefined) return { spec: options.spec }\n\n if (options.from !== undefined) {\n const target = resolve(options.from)\n if (!existsSync(target)) return { error: `--from 指向的路径不存在:${target}` }\n return { spec: target }\n }\n\n if (options.repo !== undefined) {\n const ref = options.tag !== undefined && options.tag !== '' ? `#${options.tag}` : ''\n const sub = options.subpath !== undefined && options.subpath !== '' ? `${ref === '' ? '#' : '&'}path:${options.subpath}` : ''\n return { spec: `github:${options.repo}${ref}${sub}` }\n }\n\n return { error: '需要 --spec、--from 或 --repo 之一来指定安装来源。' }\n}\n\n/**\n * 在 Windows 上调用 dsh 的引号策略。\n *\n * `.cmd` 无法被 CreateProcess 直接执行(EINVAL),必须走 shell;而 shell 会把\n * 裸传参数原样拼接,`github:owner/repo#tag&path:/sub` 里的 `&` 就变成命令分隔符 ——\n * 实测会**静默地把 spec 截断成 `#tag`**,然后装上 monorepo 根而不是目标子包。\n * 所以含特殊字符的参数必须自己加引号。\n */\nconst CMD_NEEDS_QUOTE = /[\\s&|<>^()\"']/u\n\nfunction quoteForCmd(part: string): string {\n return CMD_NEEDS_QUOTE.test(part) ? `\"${part.replace(/\"/gu, '\"\"')}\"` : part\n}\n\n/** 组装一条给 shell 执行的命令行(仅供 Windows 使用)。 */\nexport function buildShellCommand(exe: string, args: readonly string[]): string {\n return [exe, ...args].map(quoteForCmd).join(' ')\n}\n\nfunction spawnDsh(args: string[], dry: boolean): number {\n if (dry) {\n console.log(`\\n ${buildShellCommand('dsh', args)}\\n`)\n return 0\n }\n\n if (process.platform === 'win32') {\n const result = spawnSync(buildShellCommand('dsh', args), { stdio: 'inherit', shell: true })\n return result.status ?? 1\n }\n\n const result = spawnSync('dsh', args, { stdio: 'inherit' })\n return result.status ?? 1\n}\n\nfunction dshInstallCommand(options: DshOptions): void {\n const profile = options.profile ?? 'desktop'\n const { spec, error } = buildInstallSpec(options)\n\n if (spec === undefined) {\n logger.error(error ?? '未知错误')\n process.exitCode = 1\n return\n }\n\n const usesSubpath = spec.includes('path:')\n const pnpmVersion = readPnpmVersion()\n\n if (usesSubpath && pnpmVersion !== undefined && majorOf(pnpmVersion) < 11) {\n logger.warn(\n `检测到 pnpm ${pnpmVersion}:11 以下不支持 git 子目录语法(#…&path:),` +\n '会静默装成仓库根而不是你想要的子包。DSH 内置的 pnpm 11 不受影响 —— 建议改用 DSH 插件页安装。'\n )\n }\n\n if (usesSubpath && process.platform === 'win32') {\n logger.info('Windows:会通过 cmd /d /s /c 执行,避免 & 被当成命令分隔符。')\n }\n\n logger.step(`安装到 profile「${profile}」`)\n console.log(` spec: ${spec}`)\n\n if (!isAbsolute(spec) && !spec.startsWith('github:') && !spec.startsWith('git+') && !spec.startsWith('http')) {\n logger.warn('这个 spec 既不是绝对路径也不是 git/URL,确认没有写错。')\n }\n\n const status = spawnDsh(['plugin', '--profile', profile, 'add', spec], options.dry === true)\n if (options.dry === true) {\n logger.info('dry run:以上命令没有执行。')\n return\n }\n if (status !== 0) {\n logger.error(`安装失败(退出码 ${status})。诊断日志在 ~/.dsh/profiles/${profile}/.plugin-manager/logs/`)\n process.exitCode = status\n return\n }\n logger.success('安装完成 —— 完全退出 DSH 再打开即可生效')\n}\n\n/* ------------------------------------------------------------- dispatcher */\n\nconst ACTIONS: Record<string, string> = {\n init: '创建一个 DSH 插件项目',\n dev: '本地预览(浏览器里看面板,不用装进 DSH)',\n build: '构建 lib/{index,client}.js',\n check: '装前一致性校验',\n install: '把插件装进 DSH profile'\n}\n\n/** `vobs dsh <action> [target]` 的分发入口。 */\nexport async function dshCommand(\n action: string | undefined,\n target: string | undefined,\n options: DshOptions\n): Promise<void> {\n switch (action) {\n case 'init':\n case 'create':\n await dshInitCommand(target, options)\n return\n case 'dev':\n await dshDevCommand(options)\n return\n case 'build':\n await dshBuildCommand()\n return\n case 'check':\n dshCheckCommand()\n return\n case 'install':\n dshInstallCommand(options)\n return\n default:\n logger.error(`未知子命令: ${action ?? '(空)'}`)\n console.log('\\n 可用子命令:')\n for (const [name, description] of Object.entries(ACTIONS)) {\n console.log(` vobs dsh ${name.padEnd(8)} ${description}`)\n }\n process.exitCode = 1\n }\n}\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 { createInterface } from 'node:readline/promises'\nimport { stdin, stdout } from 'node:process'\nimport pc from 'picocolors'\nimport { showLogo, showBanner } from './banner.js'\nimport { initCommand } from './commands/init.js'\nimport { generateCommand } from './commands/generate.js'\nimport { addCommand } from './commands/add.js'\n\n/**\n * Interactive REPL shell. Runs `vobs` with no arguments and stays in CLI\n * mode accepting repeated commands until the user types `exit` / `quit`\n * or presses Ctrl+C / Ctrl+D.\n */\nexport async function startRepl(): Promise<void> {\n showLogo()\n\n const rl = createInterface({\n input: stdin,\n output: stdout,\n prompt: ` ${pc.magenta('❯')} `,\n terminal: true\n })\n\n rl.prompt()\n\n for await (const rawLine of rl) {\n const line = rawLine.trim()\n\n if (!line) {\n rl.prompt()\n continue\n }\n\n // Split into args, honoring simple double quotes\n const args = splitArgs(line)\n\n try {\n await dispatch(args)\n } catch (err) {\n console.error(` ${pc.red('✖')} ${err instanceof Error ? err.message : String(err)}`)\n }\n\n rl.prompt()\n }\n}\n\ntype Command = (args: string[]) => Promise<void>\n\n/** Internal command table for the REPL */\nconst TABLE: Record<string, { cmd: Command; help: string }> = {\n help: {\n cmd: async () => {\n console.log(` ${pc.bold('Available commands:')}`)\n console.log(` ${pc.dim('exit|quit')} Leave the interactive CLI`)\n console.log(` ${pc.dim('clear')} Clear the screen`)\n console.log(` ${pc.dim('logo')} Re-print the banner`)\n console.log(` ${pc.dim('version')} Show version`)\n console.log(` ${pc.dim('init <name>')} Create a new vobs project`)\n console.log(` ${pc.dim('generate <name>')} Generate a component/page`)\n console.log(` ${pc.dim('add <package>')} Add a package`)\n console.log(` ${pc.dim('dev|build')} Use \\`vobs dev\\` / \\`vobs build\\` in a terminal`)\n },\n help: ''\n },\n logo: { cmd: async () => showLogo(), help: '' },\n version: { cmd: async () => showBanner(), help: '' },\n clear: {\n cmd: async () => {\n process.stdout.write('\\x1Bc')\n },\n help: ''\n },\n exit: { cmd: async () => process.exit(0), help: '' },\n quit: { cmd: async () => process.exit(0), help: '' },\n init: {\n cmd: async (args) => {\n await initCommand({\n name: args[0],\n targetDir: undefined,\n packageManager: undefined,\n typescript: true,\n git: true\n })\n },\n help: ''\n },\n generate: {\n cmd: async (args) => {\n await generateCommand({\n name: args[0],\n type: undefined,\n targetDir: undefined\n })\n },\n help: ''\n },\n g: {\n cmd: async (args) => {\n await generateCommand({\n name: args[0],\n type: undefined,\n targetDir: undefined\n })\n },\n help: ''\n },\n add: {\n cmd: async (args) => {\n await addCommand({ package: args[0], dev: args.includes('-D') || args.includes('--dev') })\n },\n help: ''\n }\n}\n\n/** Dispatch a parsed command line to the internal table */\nasync function dispatch(args: string[]): Promise<void> {\n const name = args[0]\n const rest = args.slice(1)\n\n if (!name) return\n\n const entry = TABLE[name]\n if (entry) {\n await entry.cmd(rest)\n return\n }\n\n console.log(` ${pc.yellow('⚠')} Unknown command: ${pc.bold(String(name))}. Type ${pc.cyan('help')} to see options.`)\n}\n\n/** Minimal tokenizer supporting double-quoted arguments */\nfunction splitArgs(line: string): string[] {\n const out: string[] = []\n const re = /[^\\s\"']+|\"([^\"]*)\"|'([^']*)'/g\n let m: RegExpExecArray | null\n while ((m = re.exec(line)) !== null) {\n out.push(m[1] ?? m[2] ?? m[0])\n }\n return out\n}"],"mappings":"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","names":["import_node_path","import_node_child_process","pc","Handlebars","join","import_node_fs","import_node_path","import_vite","import_node_path","p","p","import_node_fs","import_node_child_process","import_node_path","p","build","error","text","result","import_promises","import_picocolors","pc"]}
|