Skip to content

Commit 1a3058f

Browse files
authoredFeb 9, 2021
feat(presets): add typing for presets entry point (#2337)
1 parent f8f5dda commit 1a3058f

File tree

7 files changed

+52
-18
lines changed

7 files changed

+52
-18
lines changed
 

‎.eslintignore

+1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ e2e/__workdir_synlink__/
55
e2e/__external-repos__/
66
coverage/
77
website/src/**/*.js
8+
presets/index.d.ts
89
*.config.js
910
.eslintrc.js

‎e2e/__tests__/module-kinds/helpers.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @ts-expect-error testing purpose
21
import tsJestPresets from '../../../presets'
32
import { PackageSets } from '../../__helpers__/templates'
43
import { configureTestCase } from '../../__helpers__/test-case'
@@ -33,7 +32,7 @@ const runTestForOptions = (options: TestOptions, preset: AllPresetType = AllPres
3332
let tsJestPresetToUse
3433
switch (preset) {
3534
case AllPreset.DEFAULT_ESM:
36-
tsJestPresetToUse = tsJestPresets.defaultEsm
35+
tsJestPresetToUse = tsJestPresets.defaultsESM
3736
break
3837
case AllPreset.JS_WITH_TS_ESM:
3938
tsJestPresetToUse = tsJestPresets.jsWithTsESM
@@ -42,7 +41,7 @@ const runTestForOptions = (options: TestOptions, preset: AllPresetType = AllPres
4241
tsJestPresetToUse = tsJestPresets.jsWithBabelESM
4342
break
4443
default:
45-
tsJestPresetToUse = tsJestPresets.default
44+
tsJestPresetToUse = tsJestPresets.defaults
4645
}
4746
const testCase = configureTestCase('module-kinds',
4847
{

‎presets/index.d.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { TsJestPresets } from '../dist/types'
2+
3+
declare const _default: {
4+
defaults: TsJestPresets;
5+
defaultsESM: TsJestPresets;
6+
jsWithTs: TsJestPresets;
7+
jsWithTsESM: TsJestPresets;
8+
jsWithBabel: TsJestPresets;
9+
jsWithBabelESM: TsJestPresets;
10+
};
11+
export = _default;

‎src/cli/helpers/presets.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { TsJestPresets } from '../../presets/create-jest-preset'
1+
import type { TsJestPresets } from '../../types'
22

33
/** @internal */
44
export const enum JestPresetNames {

‎src/presets/create-jest-preset.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
import type { Config } from '@jest/types'
22

3+
import type { TsJestPresets } from '../types'
34
import { rootLogger } from '../utils/logger'
45

56
const logger = rootLogger.child({ namespace: 'jest-preset' })
67

7-
export type TsJestPresets = Pick<
8-
Config.InitialOptions,
9-
'extensionsToTreatAsEsm' | 'moduleFileExtensions' | 'transform' | 'testMatch'
10-
>
11-
128
export function createJestPreset(allowJs = false, extraOptions: Config.InitialOptions = {}): TsJestPresets {
139
logger.debug({ allowJs }, 'creating jest presets', allowJs ? 'handling' : 'not handling', 'JavaScript files')
1410

‎src/types.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ export type BabelJestTransformer = {
3434
*/
3535
export type BabelConfig = _babel.TransformOptions
3636

37+
export type TsJestPresets = Pick<
38+
Config.InitialOptions,
39+
'extensionsToTreatAsEsm' | 'moduleFileExtensions' | 'transform' | 'testMatch'
40+
>
41+
3742
export interface AstTransformer<T = Record<string, unknown>> {
3843
path: string
3944
options?: T
@@ -211,9 +216,7 @@ export interface TsCompilerInstance extends CompilerInstance {
211216
configSet: ConfigSet
212217
program: _ts.Program | undefined
213218
}
214-
/**
215-
* @internal
216-
*/
219+
217220
export interface AstTransformerDesc<T = Record<string, unknown>> {
218221
name: string
219222
version: number

‎website/docs/getting-started/presets.md

+30-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ title: Presets
1818

1919
### Basic usage
2020

21-
In most cases, simply setting the `preset` key to the desired preset name in your Jest config should be enough to start using TypeScript with Jest (assuming you added `ts-jest` to your `devDependencies` of course):
21+
In most cases, simply setting the `preset` key to the desired preset name in your Jest config should be enough to start
22+
using TypeScript with Jest (assuming you added `ts-jest` to your `devDependencies` of course):
2223

2324
```js
2425
// jest.config.js
@@ -53,11 +54,11 @@ In this case you'll need to use the JavaScript version of Jest config (comment/u
5354
```js
5455
// jest.config.js
5556
const { defaults: tsjPreset } = require('ts-jest/presets')
56-
// const { defaultsESM: tsjPreset } = require('ts-jest/presets');
57-
// const { jsWithTs: tsjPreset } = require('ts-jest/presets');
58-
// const { jsWithTsESM: tsjPreset } = require('ts-jest/presets');
59-
// const { jsWithBabel: tsjPreset } = require('ts-jest/presets');
60-
// const { jsWithBabelESM: tsjPreset } = require('ts-jest/presets');
57+
// const { defaultsESM: tsjPreset } = require('ts-jest/presets')
58+
// const { jsWithTs: tsjPreset } = require('ts-jest/presets')
59+
// const { jsWithTsESM: tsjPreset } = require('ts-jest/presets')
60+
// const { jsWithBabel: tsjPreset } = require('ts-jest/presets')
61+
// const { jsWithBabelESM: tsjPreset } = require('ts-jest/presets')
6162

6263
module.exports = {
6364
// [...]
@@ -67,3 +68,26 @@ module.exports = {
6768
},
6869
}
6970
```
71+
72+
Or through TypeScript (if `ts-node` is installed):
73+
74+
```ts
75+
// jest.config.ts
76+
import type { InitialOptionsTsJest } from 'ts-jest/dist/types'
77+
import { defaults as tsjPreset } from 'ts-jest/preset'
78+
// import { defaultsESM as tsjPreset } from 'ts-jest/preset'
79+
// import { jsWithTs as tsjPreset } from 'ts-jest/preset'
80+
// import { jsWithTsESM as tsjPreset } from 'ts-jest/preset'
81+
// import { jsWithBabel as tsjPreset } from 'ts-jest/preset'
82+
// import { jsWithBabelESM as tsjPreset } from 'ts-jest/preset'
83+
84+
const config: InitialOptionsTsJest = {
85+
// [...]
86+
transform: {
87+
...tsjPreset.transform,
88+
// [...]
89+
},
90+
}
91+
92+
export default config
93+
```

0 commit comments

Comments
 (0)
Please sign in to comment.