@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
JavaScript
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);
}
}