Skip to content

Commit 3bffa47

Browse files
authored
Jest.mergePreset: Fix compatibility with NodeNext (#1481)
* Fix `isolatedModules` tsconfig override * Try something * Add a changeset * Placate snapshot * pkg: Exclude `jest/*.test.ts` files
1 parent 15842f1 commit 3bffa47

File tree

4 files changed

+54
-6
lines changed

4 files changed

+54
-6
lines changed

.changeset/hip-ears-punch.md

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
'skuba': patch
3+
---
4+
5+
Jest.mergePreset: Fudge `Node16` and `NodeNext` module resolutions
6+
7+
This works around a `ts-jest` issue where test cases fail to run if your `moduleResolution` is set to a modern mode:
8+
9+
```json
10+
{
11+
"compilerOptions": {
12+
"moduleResolution": "Node16 | NodeNext"
13+
}
14+
}
15+
```
16+
17+
```console
18+
error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
19+
error TS5110: Option 'module' must be set to 'NodeNext' when option 'moduleResolution' is set to 'NodeNext'.
20+
```

.changeset/slow-moons-matter.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'skuba': patch
3+
---
4+
5+
pkg: Exclude `jest/*.test.ts` files

jest/transform.js

+28-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const { defaults } = require('ts-jest/presets');
2+
const { ModuleResolutionKind } = require('typescript');
23

34
const { tryParseTsConfig } = require('./tsConfig');
45

@@ -14,6 +15,29 @@ const TS_JEST_PATH = require.resolve(TS_JEST_NAME);
1415

1516
const maybeTsConfig = tryParseTsConfig();
1617

18+
const isolatedModules = maybeTsConfig?.options.isolatedModules ?? true;
19+
20+
const BROKEN_MODULE_RESOLUTIONS = new Set([
21+
ModuleResolutionKind.Node16,
22+
ModuleResolutionKind.NodeNext,
23+
]);
24+
25+
/**
26+
* Passing through `Node16` or `NodeNext` seems to break `ts-jest`.
27+
*
28+
* ```
29+
* error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
30+
* error TS5110: Option 'module' must be set to 'NodeNext' when option 'moduleResolution' is set to 'NodeNext'.
31+
* ```
32+
*
33+
* https://github.com/kulshekhar/ts-jest/issues/4198
34+
*/
35+
const tsconfig = BROKEN_MODULE_RESOLUTIONS.has(
36+
maybeTsConfig?.options.moduleResolution,
37+
)
38+
? { tsconfig: { moduleResolution: 'Node' } }
39+
: undefined;
40+
1741
// Rewrite `ts-jest` transformations using our resolved `TS_JEST_PATH`.
1842
module.exports.transform = Object.fromEntries(
1943
Object.entries(defaults.transform).map(([key, value]) => {
@@ -24,7 +48,8 @@ module.exports.transform = Object.fromEntries(
2448
? [
2549
TS_JEST_PATH,
2650
{
27-
isolatedModules: maybeTsConfig?.options.isolatedModules ?? true,
51+
...tsconfig,
52+
isolatedModules,
2853
},
2954
]
3055
: value,
@@ -38,10 +63,8 @@ module.exports.transform = Object.fromEntries(
3863
TS_JEST_PATH,
3964
{
4065
...value[1],
41-
isolatedModules:
42-
value[1]?.isolatedModules ??
43-
maybeTsConfig?.isolatedModules ??
44-
true,
66+
...tsconfig,
67+
isolatedModules,
4568
},
4669
]
4770
: value,

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
},
2121
"files": [
2222
"config/**/*",
23-
"jest/**/*",
23+
"jest/**/*.js",
2424
"lib*/**/*.d.ts",
2525
"lib*/**/*.js",
2626
"lib*/**/*.js.map",

0 commit comments

Comments
 (0)