Skip to content

Commit

Permalink
fix(cli): keep testMatch if old jest config contains it (#2618)
Browse files Browse the repository at this point in the history
Closes #2616
  • Loading branch information
ahnpnl authored May 26, 2021
1 parent 0ea025e commit c568f49
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 33 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ module.exports = {
```
* Remove possibilities to import `mocked`, `createJestPreset`, `pathsToModuleNameMapper` from package entry. One should change to
```
import { mocked, createJestPreset, pathsToModuleNameMapper` } from 'ts-jest/utils'
import { mocked, createJestPreset, pathsToModuleNameMapper } from 'ts-jest/utils'
```
* **config:** One currently uses `tsConfig` should change to `tsconfig` in your `jest.config.js` or `package.json`.

Expand Down
67 changes: 67 additions & 0 deletions src/cli/__snapshots__/cli.spec.ts.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`config migrate should migrate preset if valid preset value is used 1`] = `
"
No migration needed for given Jest configuration
"
`;

exports[`config migrate should migrate preset if valid preset value is used 2`] = `
"\\"jest\\": {
\\"preset\\": \\"ts-jest\\"
}
"
`;

exports[`config migrate should migrate preset if valid preset value is used 3`] = `
"
No migration needed for given Jest configuration
"
`;

exports[`config migrate should reset testMatch if testRegex is used 1`] = `
"\\"jest\\": {
\\"testRegex\\": \\"foo-pattern\\",
\\"preset\\": \\"ts-jest\\"
}
"
`;

exports[`config migrate should reset testMatch if testRegex is used 2`] = `
"\\"jest\\": {
\\"testRegex\\": [
\\"foo-pattern\\"
],
\\"preset\\": \\"ts-jest\\"
}
"
`;

exports[`config migrate should reset testMatch if testRegex is used 3`] = `
"\\"jest\\": {
\\"testRegex\\": [],
\\"testMatch\\": [
\\"**/__tests__/**/*.(spec|test).[tj]s?(x)\\"
],
\\"preset\\": \\"ts-jest\\"
}
"
`;

exports[`config migrate should reset testMatch if testRegex is used 4`] = `
"\\"jest\\": {
\\"testMatch\\": [
\\"**/__tests__/**/*.(spec|test).[tj]s?(x)\\"
],
\\"preset\\": \\"ts-jest\\"
}
"
`;

exports[`config migrate should reset testMatch if testRegex is used 5`] = `
"\\"jest\\": {
\\"testRegex\\": \\"foo-pattern\\",
\\"preset\\": \\"ts-jest\\"
}
"
`;
78 changes: 60 additions & 18 deletions src/cli/cli.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -413,27 +413,69 @@ Migrated Jest configuration:
`)
})

it('should reset testMatch if testRegex is used', async () => {
test.each([
{
jest: {
preset: 'ts-jest',
},
},
{
jest: {
preset: 'ts-jest/foo',
},
},
{
jest: {
preset: 'foo-preset',
},
},
])('should migrate preset if valid preset value is used', async (jestCfg) => {
expect.assertions(1)
fs.existsSync.mockImplementation(() => true)
jest.mock(
pkgPaths.next,
() => ({
jest: {
testRegex: 'foo-pattern',
},
}),
{ virtual: true },
)
jest.mock(pkgPaths.next, () => jestCfg, { virtual: true })

const res = await runCli(...noOption, pkgPaths.current)
expect(res.stdout).toMatchInlineSnapshot(`
"\\"jest\\": {
\\"testRegex\\": \\"foo-pattern\\",
\\"preset\\": \\"ts-jest\\",
\\"testMatch\\": null
}
"
`)

expect(res.stdout ? res.stdout : res.stderr).toMatchSnapshot()
})

test.each([
{
jest: {
testRegex: 'foo-pattern',
testMatch: ['**/__tests__/**/*.(spec|test).[tj]s?(x)'],
},
},
{
jest: {
testRegex: ['foo-pattern'],
testMatch: ['**/__tests__/**/*.(spec|test).[tj]s?(x)'],
},
},
{
jest: {
testRegex: [],
testMatch: ['**/__tests__/**/*.(spec|test).[tj]s?(x)'],
},
},
{
jest: {
testMatch: ['**/__tests__/**/*.(spec|test).[tj]s?(x)'],
},
},
{
jest: {
testRegex: 'foo-pattern',
},
},
])('should reset testMatch if testRegex is used', async (jestCfg) => {
expect.assertions(1)
fs.existsSync.mockImplementation(() => true)
jest.mock(pkgPaths.next, () => jestCfg, { virtual: true })

const res = await runCli(...noOption, pkgPaths.current)

expect(res.stdout).toMatchSnapshot()
})

it('should detect best preset', async () => {
Expand Down
27 changes: 13 additions & 14 deletions src/cli/config/migrate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,41 +71,40 @@ export const run: CliCommand = async (args: Arguments /* , logger: Logger*/) =>
}
}
// ensure we are using a preset
presetName = presetName || JestPresetNames.default
presetName = presetName ?? JestPresetNames.default
preset = allPresets[presetName]
footNotes.push(
`Detected preset '${preset.label}' as the best matching preset for your configuration.
Visit https://kulshekhar.github.io/ts-jest/user/config/#jest-preset for more information about presets.
`,
)
} else if (migratedConfig.preset && migratedConfig.preset.startsWith('ts-jest')) {
} else if (migratedConfig.preset?.startsWith('ts-jest')) {
if (args.jestPreset === false) {
delete migratedConfig.preset
} else {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
preset = (allPresets as any)[migratedConfig.preset] || defaults
preset = (allPresets as any)[migratedConfig.preset] ?? defaults
}
}

// enforce the correct name
if (preset) migratedConfig.preset = preset.name

// check the extensions
if (migratedConfig.moduleFileExtensions && migratedConfig.moduleFileExtensions.length && preset) {
const presetValue = dedupSort(preset.value.moduleFileExtensions || []).join('::')
if (migratedConfig.moduleFileExtensions?.length && preset) {
const presetValue = dedupSort(preset.value.moduleFileExtensions ?? []).join('::')
const migratedValue = dedupSort(migratedConfig.moduleFileExtensions).join('::')
if (presetValue === migratedValue) {
delete migratedConfig.moduleFileExtensions
}
}
// there is a testRegex, remove our testMatch
if (migratedConfig.testRegex && preset) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
migratedConfig.testMatch = null as any
if ((typeof migratedConfig.testRegex === 'string' || migratedConfig.testRegex?.length) && preset) {
delete migratedConfig.testMatch
}
// check the testMatch
else if (migratedConfig.testMatch && migratedConfig.testMatch.length && preset) {
const presetValue = dedupSort(preset.value.testMatch || []).join('::')
else if (migratedConfig.testMatch?.length && preset) {
const presetValue = dedupSort(preset.value.testMatch ?? []).join('::')
const migratedValue = dedupSort(migratedConfig.testMatch).join('::')
if (presetValue === migratedValue) {
delete migratedConfig.testMatch
Expand Down Expand Up @@ -190,20 +189,20 @@ function cleanupConfig(config: Config.InitialOptions): void {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
delete (config as any).globals['ts-jest']
}
if (Object.keys(config.globals).length === 0) {
if (!Object.keys(config.globals).length) {
delete config.globals
}
}
if (config.transform && Object.keys(config.transform).length === 0) {
if (config.transform && !Object.keys(config.transform).length) {
delete config.transform
}
if (config.moduleFileExtensions) {
config.moduleFileExtensions = dedupSort(config.moduleFileExtensions)
if (config.moduleFileExtensions.length === 0) delete config.moduleFileExtensions
if (!config.moduleFileExtensions.length) delete config.moduleFileExtensions
}
if (config.testMatch) {
config.testMatch = dedupSort(config.testMatch)
if (config.testMatch.length === 0) delete config.testMatch
if (!config.testMatch.length) delete config.testMatch
}
if (config.preset === JestPresetNames.default) config.preset = defaults.name
}
Expand Down

0 comments on commit c568f49

Please sign in to comment.