diff --git a/src/interfaces.ts b/src/interfaces.ts index 817191f..46366e0 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -93,9 +93,9 @@ export interface InitAnswers { */ isInitSemanticRelease: boolean /** - * 是否初始化 jest + * 是否初始化测试 */ - isInitJest: boolean + isInitTest: string /** * 是否启用赞助 */ diff --git a/src/plopfile.ts b/src/plopfile.ts index bf03ba9..bab834b 100644 --- a/src/plopfile.ts +++ b/src/plopfile.ts @@ -66,7 +66,12 @@ module.exports = function (plop: NodePlopAPI) { }, default(answers: InitAnswers) { const templateMeta = getTemplateMeta(answers.template) - return ['nodejs'].includes(templateMeta?.runtime) ? 'cjs' : '' + if (!['nodejs'].includes(templateMeta?.runtime)) { + return '' + } + // 根据 nodejs 版本选择默认值,若大于 18,则默认 esm,否则默认 cjs + const nodeVersion = Number(process.version.split('.')[0].slice(1)) - 4 // 减 4 以兼容低版本 + return nodeVersion >= 18 ? 'esm' : 'cjs' }, when(answers: InitAnswers) { const templateMeta = getTemplateMeta(answers.template) @@ -213,11 +218,14 @@ module.exports = function (plop: NodePlopAPI) { }, }, { - type: 'confirm', - name: 'isInitJest', - message: '是否初始化 jest?', + type: 'list', + name: 'isInitTest', + message: '请选择测试框架', + choices() { + return ['vitest', 'jest', 'none'] + }, default(answers: InitAnswers) { - return answers.isPublishToNpm + return answers.isPublishToNpm ? 'vitest' : 'none' }, when(answers: InitAnswers) { return answers.isOpenSource diff --git a/src/utils.ts b/src/utils.ts index be58910..216e982 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -319,7 +319,7 @@ export async function initProject(answers: InitAnswers) { } async function init(projectPath: string, answers: InitAnswers) { - const { template, isOpenSource, isInitReadme, isInitContributing, isInitHusky, isInitSemanticRelease, isInitDocker, isInitJest } = answers + const { template, isOpenSource, isInitReadme, isInitContributing, isInitHusky, isInitSemanticRelease, isInitDocker, isInitTest } = answers try { const templateMeta = getTemplateMeta(template) await asyncExec('git --version', { @@ -370,8 +370,8 @@ async function init(projectPath: string, answers: InitAnswers) { await initStylelint(projectPath) - if (isInitJest) { - await initJest(projectPath) + if (isInitTest) { + await initTest(projectPath, answers) } await sortProjectJson(projectPath) @@ -1401,36 +1401,72 @@ async function initDocker(projectPath: string, answers: InitAnswers) { } } -async function initJest(projectPath: string) { - const loading = ora('正在初始化 Jest ……').start() +async function initTest(projectPath: string, answers: InitAnswers) { + const loading = ora('正在初始化测试 ……').start() try { - const files = ['jest.config.ts'] - await copyFilesFromTemplates(projectPath, files) + if (answers.isInitTest === 'vitest') { + const files = ['vitest.config.ts'] + await copyFilesFromTemplates(projectPath, files) - const pkg: IPackage = await getProjectJson(projectPath) + const pkg: IPackage = await getProjectJson(projectPath) + const devDependencies: Record = { + vitest: '^2.1.6', + } + // 检测是否存在 vite,若不存在,则添加 + if (!pkg?.dependencies?.vite && !pkg?.devDependencies?.vite) { + devDependencies.vite = '^6.0.1' + } - const devDependencies = { - '@types/jest': '^29.5.12', - jest: '^29.7.0', - 'ts-jest': '^29.1.2', - 'ts-node': '^10.9.2', + const newPkg = merge({}, pkg, { + scripts: { + test: 'vitest run', + 'test:coverage': 'vitest run --coverage', + ...pkg?.scripts, + }, + devDependencies: { + ...devDependencies, + ...pkg?.devDependencies, + }, + }) + await saveProjectJson(projectPath, newPkg) + loading.succeed('Vitest 初始化成功!') + return } - const newPkg = merge({}, pkg, { - scripts: { - test: 'jest --config jest.config.ts', - 'test:coverage': 'jest --config jest.config.ts --coverage', - ...pkg?.scripts, - }, - devDependencies: { - ...devDependencies, - ...pkg?.devDependencies, - }, - }) - newPkg.jest = undefined - await saveProjectJson(projectPath, newPkg) - loading.succeed('Jest 初始化成功!') + if (answers.isInitTest === 'jest') { + const files = ['jest.config.ts'] + await copyFilesFromTemplates(projectPath, files) + + const pkg: IPackage = await getProjectJson(projectPath) + + const devDependencies = { + '@types/jest': '^29.5.12', + jest: '^29.7.0', + 'ts-jest': '^29.1.2', + 'ts-node': '^10.9.2', + } + const newPkg = merge({}, pkg, { + scripts: { + test: 'jest --config jest.config.ts', + 'test:coverage': 'jest --config jest.config.ts --coverage', + ...pkg?.scripts, + }, + devDependencies: { + ...devDependencies, + ...pkg?.devDependencies, + }, + }) + newPkg.jest = undefined + await saveProjectJson(projectPath, newPkg) + loading.succeed('Jest 初始化成功!') + return + } + if (answers.isInitTest === 'none') { + loading.succeed('未选择测试框架,跳过测试初始化') + return + } + loading.succeed('未选择测试框架,跳过测试初始化') } catch (error) { - loading.fail('Jest 初始化失败!') + loading.fail('测试初始化失败!') } } diff --git a/templates/vitest.config.ts b/templates/vitest.config.ts new file mode 100644 index 0000000..a75c56d --- /dev/null +++ b/templates/vitest.config.ts @@ -0,0 +1,19 @@ +import path from 'path' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + }, + resolve: { + alias: { + '@': path.resolve(__dirname, 'src'), + }, + }, + root: path.resolve('./'), + coverage: { + clean: true, + reportsDirectory: path.resolve('./coverage'), + }, +})