fix(testing): enforce commonjs module for ts-jest (#30681)

## Current Behavior

The `@nx/jest` graph plugin and the `@nx/jest:jest` executor correctly
force the `moduleResolution: node10` to be used by `ts-node` (used by
`ts-jest`), but don't force using `module: commonjs`, which can result
in issues due to incompatible `module`/`moduleResolution` pair.

## Expected Behavior

The `@nx/jest` graph plugin and the `@nx/jest:jest` executor should
force the `moduleResolution: node10` and `module: commonjs` compiler
options to be used by `ts-node`.

## Related Issue(s)

Fixes #
This commit is contained in:
Leosvel Pérez Espinosa 2025-04-11 16:47:34 +02:00 committed by GitHub
parent baf663729c
commit 259561ff9a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 28 additions and 19 deletions

View File

@ -67,11 +67,15 @@ describe('JS - TS solution setup', () => {
); );
// add deps, each parent lib imports all child libs // add deps, each parent lib imports all child libs
const addImports = (parentLib: string) => { const addImports = (parentLib: string, includeRollupChildLib = false) => {
updateFile( updateFile(
`packages/${parentLib}/src/index.ts`, `packages/${parentLib}/src/index.ts`,
(content) => `export * from '@proj/${esbuildChildLib}'; (content) => `export * from '@proj/${esbuildChildLib}';${
export * from '@proj/${rollupChildLib}'; includeRollupChildLib
? `
export * from '@proj/${rollupChildLib}';`
: ''
}
export * from '@proj/${swcChildLib}'; export * from '@proj/${swcChildLib}';
export * from '@proj/${tscChildLib}'; export * from '@proj/${tscChildLib}';
export * from '@proj/${viteChildLib}'; export * from '@proj/${viteChildLib}';
@ -80,7 +84,7 @@ ${content}`
}; };
addImports(esbuildParentLib); addImports(esbuildParentLib);
addImports(rollupParentLib); addImports(rollupParentLib, true);
addImports(swcParentLib); addImports(swcParentLib);
addImports(tscParentLib); addImports(tscParentLib);
addImports(viteParentLib); addImports(viteParentLib);
@ -88,11 +92,13 @@ ${content}`
const pm = getSelectedPackageManager(); const pm = getSelectedPackageManager();
if (pm === 'pnpm') { if (pm === 'pnpm') {
// for pnpm we need to add the local packages as dependencies to each consumer package.json // for pnpm we need to add the local packages as dependencies to each consumer package.json
const addDeps = (parentLib: string) => { const addDeps = (parentLib: string, includeRollupChildLib = false) => {
updateJson(`packages/${parentLib}/package.json`, (json) => { updateJson(`packages/${parentLib}/package.json`, (json) => {
json.dependencies ??= {}; json.dependencies ??= {};
json.dependencies[`@proj/${esbuildChildLib}`] = 'workspace:*'; json.dependencies[`@proj/${esbuildChildLib}`] = 'workspace:*';
json.dependencies[`@proj/${rollupChildLib}`] = 'workspace:*'; if (includeRollupChildLib) {
json.dependencies[`@proj/${rollupChildLib}`] = 'workspace:*';
}
json.dependencies[`@proj/${swcChildLib}`] = 'workspace:*'; json.dependencies[`@proj/${swcChildLib}`] = 'workspace:*';
json.dependencies[`@proj/${tscChildLib}`] = 'workspace:*'; json.dependencies[`@proj/${tscChildLib}`] = 'workspace:*';
json.dependencies[`@proj/${viteChildLib}`] = 'workspace:*'; json.dependencies[`@proj/${viteChildLib}`] = 'workspace:*';
@ -101,7 +107,7 @@ ${content}`
}; };
addDeps(esbuildParentLib); addDeps(esbuildParentLib);
addDeps(rollupParentLib); addDeps(rollupParentLib, true);
addDeps(swcParentLib); addDeps(swcParentLib);
addDeps(tscParentLib); addDeps(tscParentLib);
addDeps(viteParentLib); addDeps(viteParentLib);

View File

@ -61,6 +61,7 @@ describe('Node Esbuild Applications', () => {
updateJson('tsconfig.base.json', (json) => { updateJson('tsconfig.base.json', (json) => {
json.compilerOptions.moduleResolution = 'node'; json.compilerOptions.moduleResolution = 'node';
json.compilerOptions.module = 'esnext'; json.compilerOptions.module = 'esnext';
delete json.compilerOptions.customConditions;
return json; return json;
}); });

View File

@ -245,7 +245,7 @@
"nxCloudId": "62d013ea0852fe0a2df74438", "nxCloudId": "62d013ea0852fe0a2df74438",
"nxCloudUrl": "https://staging.nx.app", "nxCloudUrl": "https://staging.nx.app",
"parallel": 1, "parallel": 1,
"bust": 5, "bust": 6,
"defaultBase": "master", "defaultBase": "master",
"conformance": { "conformance": {
"rules": [ "rules": [

View File

@ -27,6 +27,7 @@ export async function jestExecutor(
process.env['TS_NODE_COMPILER_OPTIONS'] = JSON.stringify({ process.env['TS_NODE_COMPILER_OPTIONS'] = JSON.stringify({
...(existingValue ? JSON.parse(existingValue) : {}), ...(existingValue ? JSON.parse(existingValue) : {}),
moduleResolution: 'Node10', moduleResolution: 'Node10',
module: 'commonjs',
customConditions: null, customConditions: null,
}); });

View File

@ -98,7 +98,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -179,7 +179,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -249,7 +249,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -318,7 +318,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -398,7 +398,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -482,7 +482,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -552,7 +552,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -632,7 +632,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -702,7 +702,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -782,7 +782,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [
@ -852,7 +852,7 @@ describe.each([true, false])('@nx/jest/plugin', (disableJestRuntime) => {
"options": { "options": {
"cwd": "proj", "cwd": "proj",
"env": { "env": {
"TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","customConditions":null}", "TS_NODE_COMPILER_OPTIONS": "{"moduleResolution":"node10","module":"commonjs","customConditions":null}",
}, },
}, },
"outputs": [ "outputs": [

View File

@ -259,6 +259,7 @@ async function buildJestTargets(
? JSON.parse(existingTsNodeCompilerOptions) ? JSON.parse(existingTsNodeCompilerOptions)
: {}), : {}),
moduleResolution: 'node10', moduleResolution: 'node10',
module: 'commonjs',
customConditions: null, customConditions: null,
}); });
const target: TargetConfiguration = (targets[options.targetName] = { const target: TargetConfiguration = (targets[options.targetName] = {