Skip to content

refactor: move jest configs into presets #4597

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 0 additions & 19 deletions packages/@vue/cli-plugin-unit-jest/__tests__/jestGenerator.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,29 +23,10 @@ test('base', async () => {
expect(pkg.scripts['test:unit']).toBe('vue-cli-service test:unit')
expect(pkg.devDependencies).toHaveProperty('@vue/test-utils')

// should inject babel-jest
expect(pkg.devDependencies).toHaveProperty('babel-jest')
expect(pkg.devDependencies).toHaveProperty('@babel/core')
// eslint
expect(files['tests/unit/.eslintrc.js']).toMatch('jest: true')

const spec = files['tests/unit/example.spec.js']
expect(spec).toMatch(`expect(wrapper.text()).toMatch(msg)`)
})

test('without babel/eslint', async () => {
const { pkg, files } = await generateWithPlugin([
{
id: 'unit-jest',
apply: require('../generator'),
options: {}
}
])

expect(pkg.devDependencies).not.toHaveProperty('babel-jest')
expect(files['tests/unit/.eslintrc.js']).toBeUndefined()
})

test('with TS', async () => {
const { files } = await generateWithPlugin([
{
Expand Down
10 changes: 10 additions & 0 deletions packages/@vue/cli-plugin-unit-jest/__tests__/jestPlugin.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,13 @@ test('should work with tsx', async () => {

await run(`vue-cli-service test:unit`)
})

test('should correctly configured eslint', async () => {
const project = await create('unit-jest-eslint', {
plugins: {
'@vue/cli-plugin-eslint': {},
'@vue/cli-plugin-unit-jest': {}
}
})
await project.run(`vue-cli-service lint`)
})
113 changes: 17 additions & 96 deletions packages/@vue/cli-plugin-unit-jest/generator/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,78 +11,21 @@ module.exports = (api, _, __, invoking) => {
'@vue/test-utils': '1.0.0-beta.29'
},
jest: {
moduleFileExtensions: [
'js',
'jsx',
'json',
// tell Jest to handle *.vue files
'vue'
],
transform: {
// process *.vue files with vue-jest
'^.+\\.vue$': 'vue-jest',
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
'jest-transform-stub'
},
'transformIgnorePatterns': ['/node_modules/'],
// support the same @ -> src alias mapping in source code
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1'
},
// serializer for snapshots
snapshotSerializers: ['jest-serializer-vue'],
testMatch: [
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
],
// https://github.com/facebook/jest/issues/6766
testURL: 'http://localhost/',
watchPlugins: [
'jest-watch-typeahead/filename',
'jest-watch-typeahead/testname'
]
preset: api.hasPlugin('babel')
? '@vue/cli-plugin-unit-jest/preset'
: '@vue/cli-plugin-unit-jest/preset/no-babel'
}
})

if (!api.hasPlugin('typescript')) {
api.extendPackage({
jest: {
transform: {
'^.+\\.jsx?$': 'babel-jest'
}
}
})
if (api.hasPlugin('babel')) {
api.extendPackage({
devDependencies: {
'babel-jest': '^24.8.0',
'@babel/core': '^7.4.5'
}
})
} else {
// ts-jest still does not support babel.config.js
// https://github.com/kulshekhar/ts-jest/issues/933
api.render(files => {
files['.babelrc'] = JSON.stringify(
{
plugins: ['@babel/plugin-transform-modules-commonjs']
},
null,
2
)
})
}
} else {
applyTS(api, invoking)
}

if (api.hasPlugin('eslint')) {
applyESLint(api)

api.extendPackage({
eslintConfig: {
overrides: [
{
files: ['**/__tests__/*.{j,t}s?(x)'],
files: [
'**/__tests__/*.{j,t}s?(x)',
'**/tests/unit/**/*.spec.{j,t}s?(x)'
],
env: {
jest: true
}
Expand All @@ -91,40 +34,26 @@ module.exports = (api, _, __, invoking) => {
}
})
}

if (api.hasPlugin('typescript')) {
applyTS(api, invoking)
}
}

const applyTS = (module.exports.applyTS = (api, invoking) => {
api.extendPackage({
jest: {
moduleFileExtensions: ['ts', 'tsx'],
transform: {
'^.+\\.tsx?$': 'ts-jest'
}
preset: api.hasPlugin('babel')
? '@vue/cli-plugin-unit-jest/preset/typescript-and-babel'
: '@vue/cli-plugin-unit-jest/preset/typescript'
},
devDependencies: {
'@types/jest': '^24.0.11',
'ts-jest': '^24.0.2'
'@types/jest': '^24.0.11'
}
})
if (api.hasPlugin('babel')) {
api.extendPackage({
jest: {
globals: {
'ts-jest': {
// we need babel to transpile JSX
babelConfig: true
}
}
},
devDependencies: {
// this is for now necessary to force ts-jest and vue-jest to use babel 7
'@babel/core': '^7.4.5',
'babel-core': '7.0.0-bridge.0'
}
})
}
// inject jest type to tsconfig.json

if (invoking) {
// inject jest type to tsconfig.json
api.render(files => {
const tsconfig = files['tsconfig.json']
if (tsconfig) {
Expand All @@ -140,11 +69,3 @@ const applyTS = (module.exports.applyTS = (api, invoking) => {
})
}
})

const applyESLint = (module.exports.applyESLint = api => {
api.render(files => {
files['tests/unit/.eslintrc.js'] = api.genJSConfig({
env: { jest: true }
})
})
})
17 changes: 10 additions & 7 deletions packages/@vue/cli-plugin-unit-jest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,23 @@
"access": "public"
},
"dependencies": {
"@babel/core": "^7.4.5",
"@babel/core": "^7.0.0",
"@babel/plugin-transform-modules-commonjs": "^7.4.4",
"@types/jest": "^24.0.18",
"@vue/cli-shared-utils": "^4.0.0-rc.3",
"babel-core": "7.0.0-bridge.0",
"babel-jest": "^24.8.0",
"babel-core": "^7.0.0-bridge.0",
"babel-jest": "^24.9.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
"deepmerge": "^4.0.0",
"jest": "^24.8.0",
"jest-serializer-vue": "^2.0.2",
"jest-transform-stub": "^2.0.0",
"jest-watch-typeahead": "^0.3.1",
"vue-jest": "^3.0.4"
"jest-watch-typeahead": "^0.4.0",
"ts-jest": "^24.1.0",
"vue-jest": "^3.0.5"
},
"devDependencies": {
"@vue/test-utils": "1.0.0-beta.29",
"ts-jest": "^24.0.2"
"@vue/test-utils": "1.0.0-beta.29"
},
"peerDependencies": {
"@vue/cli-service": "^3.0.0 || ^4.0.0-0"
Expand Down
35 changes: 35 additions & 0 deletions packages/@vue/cli-plugin-unit-jest/preset/jest-preset.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module.exports = {
moduleFileExtensions: [
'js',
'jsx',
'json',
// tell Jest to handle *.vue files
'vue'
],
transform: {
// process *.vue files with vue-jest
'^.+\\.vue$': require.resolve('vue-jest'),
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
require.resolve('jest-transform-stub'),
'^.+\\.jsx?$': require.resolve('babel-jest')
},
transformIgnorePatterns: ['/node_modules/'],
// support the same @ -> src alias mapping in source code
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1'
},
// serializer for snapshots
snapshotSerializers: [
'jest-serializer-vue'
],
testMatch: [
'**/tests/unit/**/*.spec.[jt]s?(x)',
'**/__tests__/*.[jt]s?(x)'
],
// https://github.com/facebook/jest/issues/6766
testURL: 'http://localhost/',
watchPlugins: [
require.resolve('jest-watch-typeahead/filename'),
require.resolve('jest-watch-typeahead/testname')
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const babelJest = require('babel-jest')

module.exports = babelJest.createTransformer({
plugins: ['@babel/plugin-transform-modules-commonjs'],
babelrc: false,
configFile: false
})
21 changes: 21 additions & 0 deletions packages/@vue/cli-plugin-unit-jest/preset/no-babel/jest-preset.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const deepmerge = require('deepmerge')
const defaultPreset = require('../jest-preset')

// If no default babel preset exists,
// we need to use a customized babel transformer to deal with es modules

module.exports = deepmerge(
defaultPreset,
{
transform: {
'^.+\\.jsx?$': require.resolve('./esmoduleTransformer')
},
globals: {
'vue-jest': {
babelConfig: {
plugins: [require('babel-plugin-transform-es2015-modules-commonjs')]
}
}
}
}
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const deepmerge = require('deepmerge')
const defaultTsPreset = require('../typescript/jest-preset')

module.exports = deepmerge(
defaultTsPreset,
{
globals: {
'ts-jest': {
babelConfig: true
}
}
}
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const deepmerge = require('deepmerge')
const defaultPreset = require('../jest-preset')

module.exports = deepmerge(
defaultPreset,
{
moduleFileExtensions: ['ts', 'tsx'],
transform: {
'^.+\\.tsx?$': require.resolve('ts-jest')
}
}
)