ts-npm-init
Version:
创建TypeScript NPM库的现代化模板
140 lines (114 loc) • 4.2 kB
JavaScript
#!/usr/bin/env node
const path = require('path');
const fs = require('fs-extra');
const chalk = require('chalk');
const inquirer = require('inquirer');
const { program } = require('commander');
const ora = require('ora');
const packageJson = require('../package.json');
// 版本和描述
program
.version(packageJson.version)
.description('创建TypeScript NPM库的现代化模板')
.argument('[project-directory]', '项目目录名称')
.parse(process.argv);
const projectDirectory = program.args[0];
// 如果没有提供项目目录,则提示用户
async function run() {
let targetDir = projectDirectory;
if (!targetDir) {
const { dirName } = await inquirer.prompt([
{
type: 'input',
name: 'dirName',
message: '请输入项目目录名称:',
default: 'my-ts-lib'
}
]);
targetDir = dirName;
}
const destPath = path.resolve(process.cwd(), targetDir);
// 检查目录是否已存在
if (fs.existsSync(destPath)) {
const { overwrite } = await inquirer.prompt([
{
type: 'confirm',
name: 'overwrite',
message: `目录 ${targetDir} 已存在。是否覆盖?`,
default: false
}
]);
if (!overwrite) {
console.log(chalk.red('操作已取消'));
return;
}
await fs.remove(destPath);
}
// 收集用户输入的包信息
const { packageName, packageDescription, authorName } = await inquirer.prompt([
{
type: 'input',
name: 'packageName',
message: '包名称:',
default: path.basename(targetDir)
},
{
type: 'input',
name: 'packageDescription',
message: '包描述:',
default: 'A TypeScript NPM library'
},
{
type: 'input',
name: 'authorName',
message: '作者名称:',
default: 'Your Name'
}
]);
// 复制模板
const spinner = ora('创建项目...').start();
try {
// 模板源目录
const templateDir = path.resolve(__dirname, '../templates');
// 确保目标目录存在
await fs.ensureDir(destPath);
// 复制模板文件到目标目录
await fs.copy(templateDir, destPath);
// 将gitignore重命名为.gitignore
const gitignorePath = path.join(destPath, 'gitignore');
const dotGitignorePath = path.join(destPath, '.gitignore');
if (fs.existsSync(gitignorePath)) {
await fs.rename(gitignorePath, dotGitignorePath);
}
// 修改package.json
const packageJsonPath = path.join(destPath, 'package.json');
const packageJsonContent = await fs.readJson(packageJsonPath);
// 更新包信息
packageJsonContent.name = packageName;
packageJsonContent.description = packageDescription;
packageJsonContent.author = authorName;
// 更新仓库URL
packageJsonContent.repository.url = `https://github.com/${authorName.toLowerCase().replace(/\s+/g, '')}/${packageName}`;
await fs.writeJson(packageJsonPath, packageJsonContent, { spaces: 2 });
// 修改README.md
const readmePath = path.join(destPath, 'README.md');
let readmeContent = await fs.readFile(readmePath, 'utf8');
// 替换标题和描述
readmeContent = readmeContent.replace(/# NPM依赖开发模板/, `# ${packageName}`);
readmeContent = readmeContent.replace(/一个用于开发NPM包\/库的TypeScript模板项目/, packageDescription);
await fs.writeFile(readmePath, readmeContent, 'utf8');
spinner.succeed('项目创建成功!');
console.log('\n操作完成!运行以下命令开始使用:\n');
console.log(chalk.cyan(` cd ${targetDir}`));
console.log(chalk.cyan(' npm install'));
console.log(chalk.cyan(' npm run dev'));
console.log('\n了解更多信息,请查看 README.md 文件。');
} catch (error) {
spinner.fail('创建失败');
console.error(chalk.red('发生错误:'), error);
}
}
run().catch((error) => {
console.error(chalk.red('发生错误:'), error);
process.exit(1);
});