From e29ae0470fcf02751c2e1913f66ae1451518fe4f Mon Sep 17 00:00:00 2001 From: Concision <24931310+concision@users.noreply.github.com> Date: Wed, 12 Aug 2020 10:37:32 -0700 Subject: [PATCH] Added a transpile-only ESM loader (#1101) (#1102) * Added a transpile-only ESM loader (#1101) * feat: Added transpile-only ESM loader to package.json exports and resolve tests * feat: Added success/failure tests for transpile-only ESM loader * fix: Fix transpile-only ESM loader tests Fixed ESM tests being executed under node 13.0.0 Fixed error message matching criteria * fix: Fix erroneous quotations in transpile-only ESM loader tests * feat: Removed imports on tests for esm-transpile-only tests * feat: Renamed and restructured esm-transpile-only tests --- esm/transpile-only.mjs | 7 +++++++ package.json | 5 ++++- src/index.spec.ts | 25 +++++++++++++++++++++++++ tests/esm-transpile-only/index.ts | 5 +++++ tests/esm-transpile-only/package.json | 3 +++ tests/esm-transpile-only/tsconfig.json | 7 +++++++ 6 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 esm/transpile-only.mjs create mode 100644 tests/esm-transpile-only/index.ts create mode 100644 tests/esm-transpile-only/package.json create mode 100644 tests/esm-transpile-only/tsconfig.json diff --git a/esm/transpile-only.mjs b/esm/transpile-only.mjs new file mode 100644 index 000000000..4823d5217 --- /dev/null +++ b/esm/transpile-only.mjs @@ -0,0 +1,7 @@ +import {fileURLToPath} from 'url' +import {createRequire} from 'module' +const require = createRequire(fileURLToPath(import.meta.url)) + +/** @type {import('../dist/esm')} */ +const esm = require('../dist/esm') +export const {resolve, getFormat, transformSource} = esm.registerAndCreateEsmHooks({transpileOnly: true}) diff --git a/package.json b/package.json index e458b78e8..95174ba56 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,9 @@ "./register/transpile-only": "./register/transpile-only.js", "./register/type-check": "./register/type-check.js", "./esm": "./esm.mjs", - "./esm.mjs": "./esm.mjs" + "./esm.mjs": "./esm.mjs", + "./esm/transpile-only": "./esm/transpile-only.mjs", + "./esm/transpile-only.mjs": "./esm/transpile-only.mjs" }, "types": "dist/index.d.ts", "bin": { @@ -31,6 +33,7 @@ "dist/", "dist-raw/", "register/", + "esm/", "esm.mjs", "LICENSE", "tsconfig.schema.json", diff --git a/src/index.spec.ts b/src/index.spec.ts index d9085e4cf..c3def2b5e 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -72,6 +72,8 @@ describe('ts-node', function () { // `node --loader ts-node/esm` testsDirRequire.resolve('ts-node/esm') testsDirRequire.resolve('ts-node/esm.mjs') + testsDirRequire.resolve('ts-node/esm/transpile-only') + testsDirRequire.resolve('ts-node/esm/transpile-only.mjs') }) describe('cli', function () { @@ -821,6 +823,29 @@ describe('ts-node', function () { return done() }) }) + + it('should support transpile only mode via dedicated loader entrypoint', (done) => { + exec(`${cmd}/transpile-only index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { + expect(err).to.equal(null) + expect(stdout).to.equal('') + + return done() + }) + }) + it('should throw type errors without transpile-only enabled', (done) => { + exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { + if (err === null) { + return done('Command was expected to fail, but it succeeded.') + } + + expect(err.message).to.contain('Unable to compile TypeScript') + expect(err.message).to.match(new RegExp('TS2345: Argument of type \'(?:number|1101)\' is not assignable to parameter of type \'string\'\\.')) + expect(err.message).to.match(new RegExp('TS2322: Type \'(?:"hello world"|string)\' is not assignable to type \'number\'\\.')) + expect(stdout).to.equal('') + + return done() + }) + }) } it('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', function (done) { diff --git a/tests/esm-transpile-only/index.ts b/tests/esm-transpile-only/index.ts new file mode 100644 index 000000000..e99da7cfd --- /dev/null +++ b/tests/esm-transpile-only/index.ts @@ -0,0 +1,5 @@ +if (typeof module !== 'undefined') throw new Error('module should not exist in ESM') + +// intentional type errors to check transpile-only ESM loader skips type checking +parseInt(1101, 2) +const x: number = 'hello world' diff --git a/tests/esm-transpile-only/package.json b/tests/esm-transpile-only/package.json new file mode 100644 index 000000000..3dbc1ca59 --- /dev/null +++ b/tests/esm-transpile-only/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/tests/esm-transpile-only/tsconfig.json b/tests/esm-transpile-only/tsconfig.json new file mode 100644 index 000000000..03e0c3c5d --- /dev/null +++ b/tests/esm-transpile-only/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "module": "ESNext", + "allowJs": true, + "jsx": "react" + } +}