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",
|
"lint": "eslint --cache --ext .ts packages/*/{src,__tests__}/**.ts",
|
||||||
"format": "prettier --write --cache --parser typescript \"**/*.[tj]s?(x)\"",
|
"format": "prettier --write --cache --parser typescript \"**/*.[tj]s?(x)\"",
|
||||||
"format-check": "prettier --check --cache --parser typescript \"**/*.[tj]s?(x)\"",
|
"format-check": "prettier --check --cache --parser typescript \"**/*.[tj]s?(x)\"",
|
||||||
"test": "run-s \"test-unit {@}\" \"test-e2e {@}\"",
|
"test": "vitest",
|
||||||
"test-unit": "jest --filter ./scripts/filter-unit.mjs",
|
"test-unit": "vitest -c vitest.unit.config.ts",
|
||||||
"test-e2e": "node scripts/build.mjs vue -f global -d && jest --filter ./scripts/filter-e2e.js --runInBand",
|
"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": "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-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",
|
"release": "node scripts/release.mjs",
|
||||||
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
|
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
|
||||||
"dev-esm": "node scripts/dev.mjs -if esm-bundler-runtime",
|
"dev-esm": "node scripts/dev.mjs -if esm-bundler-runtime",
|
||||||
|
@ -62,9 +62,9 @@
|
||||||
"@rollup/plugin-replace": "^5.0.1",
|
"@rollup/plugin-replace": "^5.0.1",
|
||||||
"@rollup/plugin-terser": "^0.1.0",
|
"@rollup/plugin-terser": "^0.1.0",
|
||||||
"@types/hash-sum": "^1.0.0",
|
"@types/hash-sum": "^1.0.0",
|
||||||
"@types/jest": "^29.2.2",
|
|
||||||
"@types/node": "^16.4.7",
|
"@types/node": "^16.4.7",
|
||||||
"@typescript-eslint/parser": "^5.23.0",
|
"@typescript-eslint/parser": "^5.23.0",
|
||||||
|
"@vitest/coverage-istanbul": "^0.28.2",
|
||||||
"@vue/consolidate": "0.17.3",
|
"@vue/consolidate": "0.17.3",
|
||||||
"@vue/reactivity": "workspace:*",
|
"@vue/reactivity": "workspace:*",
|
||||||
"@vue/runtime-core": "workspace:*",
|
"@vue/runtime-core": "workspace:*",
|
||||||
|
@ -76,10 +76,8 @@
|
||||||
"enquirer": "^2.3.2",
|
"enquirer": "^2.3.2",
|
||||||
"esbuild": "^0.17.4",
|
"esbuild": "^0.17.4",
|
||||||
"eslint": "^7.7.0",
|
"eslint": "^7.7.0",
|
||||||
"eslint-plugin-jest": "26.1.5",
|
"eslint-plugin-jest": "^27.2.1",
|
||||||
"execa": "^4.0.2",
|
"execa": "^4.0.2",
|
||||||
"jest": "^29.3.1",
|
|
||||||
"jest-environment-jsdom": "^29.3.1",
|
|
||||||
"lint-staged": "^10.2.10",
|
"lint-staged": "^10.2.10",
|
||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.15",
|
||||||
"marked": "^4.0.10",
|
"marked": "^4.0.10",
|
||||||
|
@ -98,7 +96,6 @@
|
||||||
"simple-git-hooks": "^2.8.1",
|
"simple-git-hooks": "^2.8.1",
|
||||||
"terser": "^5.15.1",
|
"terser": "^5.15.1",
|
||||||
"todomvc-app-css": "^2.3.0",
|
"todomvc-app-css": "^2.3.0",
|
||||||
"ts-jest": "^29.0.3",
|
|
||||||
"tslib": "^2.4.0",
|
"tslib": "^2.4.0",
|
||||||
"typescript": "^4.8.0",
|
"typescript": "^4.8.0",
|
||||||
"vite": "^4.0.4",
|
"vite": "^4.0.4",
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { initCustomFormatter } from '@vue/runtime-dom'
|
||||||
|
|
||||||
export function initDev() {
|
export function initDev() {
|
||||||
if (__BROWSER__) {
|
if (__BROWSER__) {
|
||||||
|
/* istanbul ignore if */
|
||||||
if (!__ESM_BUNDLER__) {
|
if (!__ESM_BUNDLER__) {
|
||||||
console.info(
|
console.info(
|
||||||
`You are running a development build of Vue.\n` +
|
`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 path from 'node:path'
|
||||||
import { fileURLToPath } from 'node:url'
|
import { fileURLToPath } from 'node:url'
|
||||||
import { readdirSync } from 'node:fs'
|
import { readdirSync } from 'node:fs'
|
||||||
|
@ -45,6 +45,17 @@ export default defineConfig({
|
||||||
setupFiles: 'scripts/setupVitest.ts',
|
setupFiles: 'scripts/setupVitest.ts',
|
||||||
environmentMatchGlobs: [
|
environmentMatchGlobs: [
|
||||||
['packages/{vue,vue-compat,runtime-dom}/**', 'jsdom']
|
['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