Skip to content

Commit

Permalink
feat 更新测试框架选择;新增根据 nodejs 版本选择默认模块系统
Browse files Browse the repository at this point in the history
- 根据 nodejs 版本选择默认值,若大于 18,则默认 esm,否则默认 cjs
- 根据选择的测试框架初始化相应的配置和依赖
- 添加 Vitest 配置文件模板
  • Loading branch information
CaoMeiYouRen committed Nov 29, 2024
1 parent 031a5c8 commit d689483
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 35 deletions.
4 changes: 2 additions & 2 deletions src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,9 @@ export interface InitAnswers {
*/
isInitSemanticRelease: boolean
/**
* 是否初始化 jest
* 是否初始化测试
*/
isInitJest: boolean
isInitTest: string
/**
* 是否启用赞助
*/
Expand Down
18 changes: 13 additions & 5 deletions src/plopfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
92 changes: 64 additions & 28 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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<string, string> = {
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('测试初始化失败!')
}
}

Expand Down
19 changes: 19 additions & 0 deletions templates/vitest.config.ts
Original file line number Diff line number Diff line change
@@ -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'),
},
})

0 comments on commit d689483

Please sign in to comment.