Skip to content

Commit cf9a814

Browse files
module: fix extensionless typescript in cjs loader
PR-URL: nodejs#54062 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent c40c41c commit cf9a814

File tree

3 files changed

+32
-12
lines changed

3 files changed

+32
-12
lines changed

lib/internal/modules/cjs/loader.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -653,9 +653,13 @@ function getDefaultExtensions() {
653653
let extensions = ObjectKeys(Module._extensions);
654654
const tsEnabled = getOptionValue('--experimental-strip-types');
655655
if (tsEnabled) {
656+
// remove .ts and .cts from the default extensions
657+
// to avoid extensionless require of .ts and .cts files.
658+
// it behaves similarly to how .mjs is handled when --experimental-require-module
659+
// is enabled.
656660
extensions = ArrayPrototypeFilter(extensions, (ext) =>
657-
ext !== '.ts' || Module._extensions['.ts'] !== loadTS ||
658-
ext !== '.cts' || Module._extensions['.ts'] !== loadCTS,
661+
(ext !== '.ts' || Module._extensions['.ts'] !== loadTS) &&
662+
(ext !== '.cts' || Module._extensions['.cts'] !== loadCTS),
659663
);
660664
}
661665

test/es-module/test-typescript-commonjs.mjs

+21-10
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ test('require a .ts file with explicit extension succeeds', async () => {
1818
strictEqual(result.code, 0);
1919
});
2020

21-
// TODO(marco-ippolito) This test should fail because extensionless require
22-
// but it's behaving like a .js file
2321
test('eval require a .ts file with implicit extension fails', async () => {
2422
const result = await spawnPromisified(process.execPath, [
2523
'--experimental-strip-types',
@@ -30,23 +28,36 @@ test('eval require a .ts file with implicit extension fails', async () => {
3028
cwd: fixtures.path('typescript/ts'),
3129
});
3230

33-
strictEqual(result.stderr, '');
34-
match(result.stdout, /Hello, TypeScript!/);
35-
strictEqual(result.code, 0);
31+
strictEqual(result.stdout, '');
32+
match(result.stderr, /Error: Cannot find module/);
33+
strictEqual(result.code, 1);
34+
});
35+
36+
test('eval require a .cts file with implicit extension fails', async () => {
37+
const result = await spawnPromisified(process.execPath, [
38+
'--experimental-strip-types',
39+
'--eval',
40+
'require("./test-cts-typescript")',
41+
'--no-warnings',
42+
], {
43+
cwd: fixtures.path('typescript/ts'),
44+
});
45+
46+
strictEqual(result.stdout, '');
47+
match(result.stderr, /Error: Cannot find module/);
48+
strictEqual(result.code, 1);
3649
});
3750

38-
// TODO(marco-ippolito) This test should fail because extensionless require
39-
// but it's behaving like a .js file
4051
test('require a .ts file with implicit extension fails', async () => {
4152
const result = await spawnPromisified(process.execPath, [
4253
'--experimental-strip-types',
4354
'--no-warnings',
4455
fixtures.path('typescript/cts/test-extensionless-require.ts'),
4556
]);
4657

47-
strictEqual(result.stderr, '');
48-
match(result.stdout, /Hello, TypeScript!/);
49-
strictEqual(result.code, 0);
58+
strictEqual(result.stdout, '');
59+
match(result.stderr, /Error: Cannot find module/);
60+
strictEqual(result.code, 1);
5061
});
5162

5263
test('expect failure of an .mts file with CommonJS syntax', async () => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const str: string = "Hello, TypeScript!";
2+
interface Foo {
3+
bar: string;
4+
}
5+
console.log(str);

0 commit comments

Comments
 (0)