UNPKG

@yanhe-su/cli

Version:

CLI tool for DAO Style projects - providing project scaffolding, template generation and dependency management

95 lines (94 loc) 3.64 kB
import { fileURLToPath } from 'node:url'; import * as path from 'path'; import chalk from 'chalk'; import * as fs from 'fs-extra'; import inquirer from 'inquirer'; import ora from 'ora'; import { baseTemplate } from '../templates/base'; import { ciTemplate } from '../templates/ci'; import { lintTemplate } from '../templates/lint'; import { mergeTemplates } from '../utils/merge'; import { getMultiplePackageVersions } from '../utils/npm'; import { renderDirectory, createTemplateData } from '../utils/template'; // interface CreateOptions { // template: string; // } // 获取当前文件的目录路径 const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); export async function create(name) { const spinner = ora('Creating project...'); try { // 获取依赖的最新版本 spinner.text = 'Fetching latest versions...'; // Ask user which DAO Style packages to include const { packages } = await inquirer.prompt([ { type: 'checkbox', name: 'packages', message: 'Select DAO Style packages to include:', choices: [ { name: '@dao-style/core', checked: true }, { name: '@dao-style/extend', checked: true }, { name: '@dao-style/biz', checked: false }, ], }, ]); // Ask for port number const { port } = await inquirer.prompt([ { type: 'input', name: 'port', message: 'Enter the port number for the dev server (default: 8160):', default: '8160', validate: (input) => { const port = parseInt(input); if (Number.isNaN(port) || port < 8000 || port > 9000) { return 'Please enter a valid port number between 8000 and 9000'; } return true; }, }, ]); spinner.start(); // Get latest versions for selected packages const versions = await getMultiplePackageVersions(packages); // 在当前目录下创建项目 const projectPath = path.resolve(process.cwd(), name); if (await fs.pathExists(projectPath)) { spinner.fail(chalk.red(`Directory ${name} already exists`)); process.exit(1); } spinner.succeed(); // 准备模板数据 const templateData = { name, dependencies: packages.reduce((acc, pkg) => { acc[pkg] = `^${versions[pkg].latest}`; return acc; }, {}), port, }; // 验证和转换模板数据 const templates = [baseTemplate, lintTemplate, ciTemplate]; // 使用 mergeTemplates 合并模板 const transformedData = await mergeTemplates(templates, templateData, { validate: true, }); // 渲染模板 for (const template of templates) { await renderDirectory(template.path, projectPath, createTemplateData(transformedData)); } // 创建成功 spinner.succeed(chalk.green(`Successfully created project ${name}`)); console.log('\nNext steps:'); console.log(chalk.cyan(` cd ${name}`)); console.log(chalk.cyan(' pnpm install')); console.log(chalk.cyan(' pnpm dev')); } catch (error) { spinner.fail(chalk.red('Failed to create project')); console.error(error); process.exit(1); } }