From c1024ec7f4af917ce69ce90442d3db29ca5804b5 Mon Sep 17 00:00:00 2001 From: Gen Hames Date: Wed, 1 Jul 2020 13:19:25 -0700 Subject: [PATCH] Add test for TS imports that use JS extensions (#480) --- packages/node-resolve/package.json | 1 + packages/node-resolve/src/index.js | 4 ++-- .../extensions/import-ts-with-js-extension.ts | 4 ++++ .../test/fixtures/extensions/main.ts | 11 +++++++++++ packages/node-resolve/test/test.js | 19 +++++++++++++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 packages/node-resolve/test/fixtures/extensions/import-ts-with-js-extension.ts create mode 100644 packages/node-resolve/test/fixtures/extensions/main.ts diff --git a/packages/node-resolve/package.json b/packages/node-resolve/package.json index 1c0e9c2e0..b2492c960 100755 --- a/packages/node-resolve/package.json +++ b/packages/node-resolve/package.json @@ -58,6 +58,7 @@ }, "devDependencies": { "@babel/core": "^7.9.0", + "@babel/plugin-transform-typescript": "^7.10.4", "@babel/preset-env": "^7.9.0", "@rollup/plugin-babel": "^5.0.4", "@rollup/plugin-commonjs": "^13.0.0", diff --git a/packages/node-resolve/src/index.js b/packages/node-resolve/src/index.js index 29a7cd07c..5465b38bc 100644 --- a/packages/node-resolve/src/index.js +++ b/packages/node-resolve/src/index.js @@ -190,12 +190,12 @@ export function nodeResolve(opts = {}) { // the built-in's name. importSpecifierList.push(`${importee}/`); } - + // TypeScript files may import '.js' to refer to either '.ts' or '.tsx' if (importer && importee.endsWith('.js')) { for (const ext of ['.ts', '.tsx']) { if (importer.endsWith(ext) && extensions.includes(ext)) { - importSpecifierList.push(importee.replace(/.js$/, ext)) + importSpecifierList.push(importee.replace(/.js$/, ext)); } } } diff --git a/packages/node-resolve/test/fixtures/extensions/import-ts-with-js-extension.ts b/packages/node-resolve/test/fixtures/extensions/import-ts-with-js-extension.ts new file mode 100644 index 000000000..95c52eab8 --- /dev/null +++ b/packages/node-resolve/test/fixtures/extensions/import-ts-with-js-extension.ts @@ -0,0 +1,4 @@ +import { main } from './main.js'; +// This resolves as main.ts and _not_ main.js, despite the extension +const mainResult = main(); +export default mainResult; diff --git a/packages/node-resolve/test/fixtures/extensions/main.ts b/packages/node-resolve/test/fixtures/extensions/main.ts new file mode 100644 index 000000000..60668791d --- /dev/null +++ b/packages/node-resolve/test/fixtures/extensions/main.ts @@ -0,0 +1,11 @@ +// To make this very clearly TypeScript and not just JS with a TS extension +type TestType = string | string[]; +interface Main { + (): string; + propertyCall(input?: TestType): TestType; +} + +const main: Main = () => 'It works!'; +main.propertyCall = () => ''; + +export { main }; diff --git a/packages/node-resolve/test/test.js b/packages/node-resolve/test/test.js index 574f69f2a..35da582ea 100755 --- a/packages/node-resolve/test/test.js +++ b/packages/node-resolve/test/test.js @@ -105,6 +105,25 @@ test('supports non-standard extensions', async (t) => { await testBundle(t, bundle); }); +test('supports JS extensions in TS when referring to TS imports', async (t) => { + const bundle = await rollup({ + input: 'extensions/import-ts-with-js-extension.ts', + onwarn: () => t.fail('No warnings were expected'), + plugins: [ + nodeResolve({ + extensions: ['.js', '.ts'] + }), + babel({ + babelHelpers: 'bundled', + plugins: ['@babel/plugin-transform-typescript'], + extensions: ['.js', '.ts'] + }) + ] + }); + const { module } = await testBundle(t, bundle); + t.is(module.exports, 'It works!'); +}); + test('ignores IDs with null character', async (t) => { const result = await nodeResolve().resolveId('\0someid', 'test.js'); t.is(result, null);