UNPKG

ts-npm-init

Version:

创建TypeScript NPM库的现代化模板

140 lines (114 loc) 4.2 kB
#!/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); });