workflow: complete migration from jest to vitest
This commit is contained in:
parent
158db33611
commit
28b95daa70
|
@ -1,67 +0,0 @@
|
|||
module.exports = {
|
||||
testEnvironment: 'jsdom',
|
||||
preset: 'ts-jest',
|
||||
setupFilesAfterEnv: ['./scripts/setupJestEnv.ts'],
|
||||
transform: {
|
||||
'^.+\\.tsx?$': [
|
||||
'ts-jest',
|
||||
{
|
||||
tsconfig: {
|
||||
target: 'esnext',
|
||||
sourceMap: true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
globals: {
|
||||
__DEV__: true,
|
||||
__TEST__: true,
|
||||
__VERSION__: require('./package.json').version,
|
||||
__BROWSER__: false,
|
||||
__GLOBAL__: false,
|
||||
__ESM_BUNDLER__: true,
|
||||
__ESM_BROWSER__: false,
|
||||
__NODE_JS__: true,
|
||||
__SSR__: true,
|
||||
__FEATURE_OPTIONS_API__: true,
|
||||
__FEATURE_SUSPENSE__: true,
|
||||
__FEATURE_PROD_DEVTOOLS__: false,
|
||||
__COMPAT__: true
|
||||
},
|
||||
coverageDirectory: 'coverage',
|
||||
coverageReporters: ['html', 'lcov', 'text'],
|
||||
collectCoverageFrom: [
|
||||
'packages/*/src/**/*.ts',
|
||||
'!packages/runtime-test/src/utils/**',
|
||||
'!packages/template-explorer/**',
|
||||
'!packages/sfc-playground/**',
|
||||
'!packages/size-check/**',
|
||||
'!packages/runtime-core/src/profiling.ts',
|
||||
'!packages/runtime-core/src/customFormatter.ts',
|
||||
// DOM transitions are tested via e2e so no coverage is collected
|
||||
'!packages/runtime-dom/src/components/Transition*',
|
||||
// only called in browsers
|
||||
'!packages/vue/src/devCheck.ts',
|
||||
// only used as a build entry
|
||||
'!packages/vue/src/runtime.ts',
|
||||
// mostly just entries
|
||||
'!packages/vue-compat/**'
|
||||
],
|
||||
watchPathIgnorePatterns: ['/node_modules/', '/dist/', '/.git/'],
|
||||
moduleFileExtensions: ['ts', 'tsx', 'js', 'json'],
|
||||
moduleNameMapper: {
|
||||
'@vue/consolidate': '@vue/consolidate',
|
||||
'@vue/compat': '<rootDir>/packages/vue-compat/src',
|
||||
'^@vue/(.*?)$': '<rootDir>/packages/$1/src',
|
||||
'vue/compiler-sfc': '<rootDir>/packages/compiler-sfc/src',
|
||||
'vue/server-renderer': '<rootDir>/packages/server-renderer/src',
|
||||
vue: '<rootDir>/packages/vue/src'
|
||||
},
|
||||
rootDir: __dirname,
|
||||
testMatch: ['<rootDir>/packages/**/__tests__/**/*spec.[jt]s?(x)'],
|
||||
testPathIgnorePatterns: process.env.SKIP_E2E
|
||||
? // ignore example tests on netlify builds since they don't contribute
|
||||
// to coverage and can cause netlify builds to fail
|
||||
['/node_modules/', '/examples/__tests__']
|
||||
: ['/node_modules/']
|
||||
}
|
15
package.json
15
package.json
|
@ -11,12 +11,12 @@
|
|||
"lint": "eslint --cache --ext .ts packages/*/{src,__tests__}/**.ts",
|
||||
"format": "prettier --write --cache --parser typescript \"**/*.[tj]s?(x)\"",
|
||||
"format-check": "prettier --check --cache --parser typescript \"**/*.[tj]s?(x)\"",
|
||||
"test": "run-s \"test-unit {@}\" \"test-e2e {@}\"",
|
||||
"test-unit": "jest --filter ./scripts/filter-unit.mjs",
|
||||
"test-e2e": "node scripts/build.mjs vue -f global -d && jest --filter ./scripts/filter-e2e.js --runInBand",
|
||||
"test": "vitest",
|
||||
"test-unit": "vitest -c vitest.unit.config.ts",
|
||||
"test-e2e": "node scripts/build.mjs vue -f global -d && vitest -c vitest.e2e.config.ts",
|
||||
"test-dts": "node scripts/build.mjs shared reactivity runtime-core runtime-dom -dt -f esm-bundler && npm run test-dts-only",
|
||||
"test-dts-only": "tsc -p ./test-dts/tsconfig.json && tsc -p ./test-dts/tsconfig.build.mjson",
|
||||
"test-coverage": "node scripts/build.mjs vue -f global -d && jest --runInBand --coverage --bail",
|
||||
"test-coverage": "vitest -c vitest.unit.config.ts --coverage",
|
||||
"release": "node scripts/release.mjs",
|
||||
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
|
||||
"dev-esm": "node scripts/dev.mjs -if esm-bundler-runtime",
|
||||
|
@ -62,9 +62,9 @@
|
|||
"@rollup/plugin-replace": "^5.0.1",
|
||||
"@rollup/plugin-terser": "^0.1.0",
|
||||
"@types/hash-sum": "^1.0.0",
|
||||
"@types/jest": "^29.2.2",
|
||||
"@types/node": "^16.4.7",
|
||||
"@typescript-eslint/parser": "^5.23.0",
|
||||
"@vitest/coverage-istanbul": "^0.28.2",
|
||||
"@vue/consolidate": "0.17.3",
|
||||
"@vue/reactivity": "workspace:*",
|
||||
"@vue/runtime-core": "workspace:*",
|
||||
|
@ -76,10 +76,8 @@
|
|||
"enquirer": "^2.3.2",
|
||||
"esbuild": "^0.17.4",
|
||||
"eslint": "^7.7.0",
|
||||
"eslint-plugin-jest": "26.1.5",
|
||||
"eslint-plugin-jest": "^27.2.1",
|
||||
"execa": "^4.0.2",
|
||||
"jest": "^29.3.1",
|
||||
"jest-environment-jsdom": "^29.3.1",
|
||||
"lint-staged": "^10.2.10",
|
||||
"lodash": "^4.17.15",
|
||||
"marked": "^4.0.10",
|
||||
|
@ -98,7 +96,6 @@
|
|||
"simple-git-hooks": "^2.8.1",
|
||||
"terser": "^5.15.1",
|
||||
"todomvc-app-css": "^2.3.0",
|
||||
"ts-jest": "^29.0.3",
|
||||
"tslib": "^2.4.0",
|
||||
"typescript": "^4.8.0",
|
||||
"vite": "^4.0.4",
|
||||
|
|
|
@ -2,6 +2,7 @@ import { initCustomFormatter } from '@vue/runtime-dom'
|
|||
|
||||
export function initDev() {
|
||||
if (__BROWSER__) {
|
||||
/* istanbul ignore if */
|
||||
if (!__ESM_BUNDLER__) {
|
||||
console.info(
|
||||
`You are running a development build of Vue.\n` +
|
||||
|
|
1827
pnpm-lock.yaml
1827
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
@ -1,18 +0,0 @@
|
|||
// jest only supports cjs filter files
|
||||
const path = require('path')
|
||||
|
||||
const e2eTests = [
|
||||
'vue/__tests__/Transition',
|
||||
'vue/__tests__/TransitionGroup',
|
||||
'vue/examples/'
|
||||
]
|
||||
|
||||
module.exports = list => {
|
||||
return {
|
||||
filtered: list
|
||||
.filter(t => e2eTests.some(tt => t.includes(path.normalize(tt))))
|
||||
.map(test => ({ test }))
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.e2eTests = e2eTests
|
|
@ -1,10 +0,0 @@
|
|||
// jest only supports cjs filter files
|
||||
const { e2eTests } = require('./filter-e2e')
|
||||
|
||||
module.exports = list => {
|
||||
return {
|
||||
filtered: list
|
||||
.filter(t => !e2eTests.some(tt => t.includes(tt)))
|
||||
.map(test => ({ test }))
|
||||
}
|
||||
}
|
|
@ -1,92 +0,0 @@
|
|||
expect.extend({
|
||||
toHaveBeenWarned(received: string) {
|
||||
asserted.add(received)
|
||||
const passed = warn.mock.calls.some(args => args[0].includes(received))
|
||||
if (passed) {
|
||||
return {
|
||||
pass: true,
|
||||
message: () => `expected "${received}" not to have been warned.`
|
||||
}
|
||||
} else {
|
||||
const msgs = warn.mock.calls.map(args => args[0]).join('\n - ')
|
||||
return {
|
||||
pass: false,
|
||||
message: () =>
|
||||
`expected "${received}" to have been warned` +
|
||||
(msgs.length
|
||||
? `.\n\nActual messages:\n\n - ${msgs}`
|
||||
: ` but no warning was recorded.`)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
toHaveBeenWarnedLast(received: string) {
|
||||
asserted.add(received)
|
||||
const passed =
|
||||
warn.mock.calls[warn.mock.calls.length - 1][0].includes(received)
|
||||
if (passed) {
|
||||
return {
|
||||
pass: true,
|
||||
message: () => `expected "${received}" not to have been warned last.`
|
||||
}
|
||||
} else {
|
||||
const msgs = warn.mock.calls.map(args => args[0]).join('\n - ')
|
||||
return {
|
||||
pass: false,
|
||||
message: () =>
|
||||
`expected "${received}" to have been warned last.\n\nActual messages:\n\n - ${msgs}`
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
toHaveBeenWarnedTimes(received: string, n: number) {
|
||||
asserted.add(received)
|
||||
let found = 0
|
||||
warn.mock.calls.forEach(args => {
|
||||
if (args[0].includes(received)) {
|
||||
found++
|
||||
}
|
||||
})
|
||||
|
||||
if (found === n) {
|
||||
return {
|
||||
pass: true,
|
||||
message: () => `expected "${received}" to have been warned ${n} times.`
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
pass: false,
|
||||
message: () =>
|
||||
`expected "${received}" to have been warned ${n} times but got ${found}.`
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
let warn: jest.SpyInstance
|
||||
const asserted: Set<string> = new Set()
|
||||
|
||||
beforeEach(() => {
|
||||
asserted.clear()
|
||||
warn = jest.spyOn(console, 'warn')
|
||||
warn.mockImplementation(() => {})
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
const assertedArray = Array.from(asserted)
|
||||
const nonAssertedWarnings = warn.mock.calls
|
||||
.map(args => args[0])
|
||||
.filter(received => {
|
||||
return !assertedArray.some(assertedMsg => {
|
||||
return received.includes(assertedMsg)
|
||||
})
|
||||
})
|
||||
warn.mockRestore()
|
||||
if (nonAssertedWarnings.length) {
|
||||
throw new Error(
|
||||
`test case threw unexpected warnings:\n - ${nonAssertedWarnings.join(
|
||||
'\n - '
|
||||
)}`
|
||||
)
|
||||
}
|
||||
})
|
|
@ -1,4 +1,4 @@
|
|||
import { defineConfig } from 'vitest/config'
|
||||
import { configDefaults, defineConfig, UserConfig } from 'vitest/config'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { readdirSync } from 'node:fs'
|
||||
|
@ -45,6 +45,17 @@ export default defineConfig({
|
|||
setupFiles: 'scripts/setupVitest.ts',
|
||||
environmentMatchGlobs: [
|
||||
['packages/{vue,vue-compat,runtime-dom}/**', 'jsdom']
|
||||
]
|
||||
],
|
||||
coverage: {
|
||||
provider: 'istanbul',
|
||||
reporter: ['text', 'html'],
|
||||
exclude: [
|
||||
...configDefaults.coverage.exclude!,
|
||||
// DOM transitions are tested via e2e so no coverage is collected
|
||||
'packages/runtime-dom/src/components/Transition*',
|
||||
// mostly entries
|
||||
'packages/vue-compat/**'
|
||||
]
|
||||
}
|
||||
}
|
||||
})
|
||||
}) as UserConfig
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
import { UserConfig, configDefaults } from 'vitest/config'
|
||||
import config from './vitest.config'
|
||||
|
||||
export default {
|
||||
...config,
|
||||
test: {
|
||||
...config.test,
|
||||
include: ['packages/vue/__tests__/e2e/*.spec.ts']
|
||||
}
|
||||
} as UserConfig
|
|
@ -0,0 +1,10 @@
|
|||
import { UserConfig, configDefaults } from 'vitest/config'
|
||||
import config from './vitest.config'
|
||||
|
||||
export default {
|
||||
...config,
|
||||
test: {
|
||||
...config.test,
|
||||
exclude: [...configDefaults.exclude, '**/e2e/**']
|
||||
}
|
||||
} as UserConfig
|
Loading…
Reference in New Issue