Skip to content

Commit 7232b39

Browse files
authored
fix(js): set compilerOptions correctly when loading .ts that targets ESM (#27862)
When we load `.ts` files and the closest `package.json` specifies `"type": "module"`, then the file may error upon loading. This happens because we're not setting `compilerOptions` correctly when registering `ts-node/esm`-- in fact there is no way to pass options through this hook. This PR sets defaults on `TS_NODE_COMPILER_OPTIONS` such that the `module` and `moduleResolution` are correct values for ESM. It also works for CJS since both `module` and `moduleResolution` check the closest `package.json` to determine the format. ## Current Behavior <!-- This is the behavior we have today --> ## Expected Behavior <!-- This is the behavior we should expect with the changes in this PR --> ## Related Issue(s) <!-- Please link the issue being fixed so it gets closed when this is merged. --> Fixes #23228
1 parent 1924bc3 commit 7232b39

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

packages/nx/src/plugins/js/utils/register.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ export function registerTsProject(
9191
// Based on limited testing, it doesn't seem to matter if we register it multiple times, but just in
9292
// case let's keep a flag to prevent it.
9393
if (!isTsEsmLoaderRegistered) {
94+
// We need a way to ensure that `.ts` files are treated as ESM not CJS.
95+
// Since there is no way to pass compilerOptions like we do with the programmatic API, we should default
96+
// the environment variable that ts-node checks.
97+
process.env.TS_NODE_COMPILER_OPTIONS ??= JSON.stringify({
98+
moduleResolution: 'nodenext',
99+
module: 'nodenext',
100+
});
94101
const module = require('node:module');
95102
if (module.register && packageIsInstalled('ts-node/esm')) {
96103
const url = require('node:url');

0 commit comments

Comments
 (0)