From d58b94be05d7778aa7bf0887e2c7d7e57b3b1a2a Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Mon, 4 May 2020 00:23:45 -0400 Subject: [PATCH 1/9] Re-add "exports" declaration to package.json in backwards-compatible way --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index 4c4eb65f0..3f433a639 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,10 @@ "version": "8.10.1", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", + "exports": { + "./": "./", + "./esm": "./esm.mjs" + }, "types": "dist/index.d.ts", "bin": { "ts-node": "dist/bin.js", From ceb240f4daca0eb4dd2840cb2ad2a6d5bfb4f815 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 May 2020 07:39:26 -0400 Subject: [PATCH 2/9] add package.json "exports" tests --- src/index.spec.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/index.spec.ts b/src/index.spec.ts index d77970385..cbc1db660 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -35,6 +35,25 @@ describe('ts-node', function () { it('should export the correct version', function () { expect(VERSION).to.equal(require('../package.json').version) }) + it('should export all CJS entrypoints', function () { + // Ensure our package.json "exports" declaration doesn't prevent `require()`ing all our entrypoints + // https://github.com/TypeStrong/ts-node/pull/1026 + require('ts-node') + require('ts-node/package') + require('ts-node/dist/index') + require('ts-node/dist/bin') + require('ts-node/dist/bin-transpile') + require('ts-node/dist/bin-script') + require('ts-node/dist/bin-script-deprecated') + require('ts-node/dist/esm') + require('ts-node/register') + require('ts-node/register/index') + require('ts-node/register/files') + require('ts-node/register/transpile-only') + require('ts-node/register/type-check') + require('ts-node/tsconfig.schema.json') + require('ts-node/tsconfig.schemastore-schema.json') + }) describe('cli', function () { this.slow(1000) From 56b84572adb304d779a937df214f72c5bc8fcb82 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 May 2020 07:46:01 -0400 Subject: [PATCH 3/9] more --- package.json | 1 + src/index.spec.ts | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 583787e36..3cca02848 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "exports": { + ".": "./dist/index.js", "./": "./", "./esm": "./esm.mjs" }, diff --git a/src/index.spec.ts b/src/index.spec.ts index cbc1db660..0001b47c7 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -4,7 +4,6 @@ import { join } from 'path' import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') -import { register, create, VERSION } from './index' import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf' @@ -18,6 +17,9 @@ const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script') const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ +// Set after ts-node is installed locally +let { register, create, VERSION }: typeof import('./index') = null as any + // Pack and install ts-node locally, necessary to test package "exports" before(async function () { this.timeout(30000) @@ -25,6 +27,7 @@ before(async function () { await execP(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') existsSync(packageLockPath) && unlinkSync(packageLockPath) + ;({register, create, VERSION} = require('ts-node')) }) describe('ts-node', function () { From 3225918c59da3ce023a5b98b3f2c478620907e6a Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 May 2020 09:14:06 -0400 Subject: [PATCH 4/9] fix --- src/index.spec.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 0001b47c7..a4222064f 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -4,6 +4,7 @@ import { join } from 'path' import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') +import * as tsNodeTypes from './index' import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf' @@ -18,7 +19,7 @@ const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script') const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ // Set after ts-node is installed locally -let { register, create, VERSION }: typeof import('./index') = null as any +let { register, create, VERSION }: typeof tsNodeTypes = {} as any // Pack and install ts-node locally, necessary to test package "exports" before(async function () { @@ -27,7 +28,7 @@ before(async function () { await execP(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') existsSync(packageLockPath) && unlinkSync(packageLockPath) - ;({register, create, VERSION} = require('ts-node')) + ;({ register, create, VERSION } = require(join(TEST_DIR, 'node_modules/ts-node'))) }) describe('ts-node', function () { @@ -545,11 +546,14 @@ describe('ts-node', function () { }) describe('register', function () { - const registered = register({ - project: PROJECT, - compilerOptions: { - jsx: 'preserve' - } + let registered: tsNodeTypes.Register + before(() => { + registered = register({ + project: PROJECT, + compilerOptions: { + jsx: 'preserve' + } + }) }) const moduleTestPath = require.resolve('../tests/module') From 8057fb8ca0ecf4bb29305872e09b77d87c1e8fe5 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 May 2020 09:27:48 -0400 Subject: [PATCH 5/9] fix --- src/index.spec.ts | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index a4222064f..886afe0e5 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -8,6 +8,7 @@ import * as tsNodeTypes from './index' import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf' +import { createRequire, createRequireFromPath } from 'module' const execP = promisify(exec) @@ -18,6 +19,9 @@ const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script') const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ +// `createRequire` does not exist on older node versions +const testsDirRequire = (createRequire || createRequireFromPath)(join(TEST_DIR, 'index.js')) // tslint:disable-line + // Set after ts-node is installed locally let { register, create, VERSION }: typeof tsNodeTypes = {} as any @@ -28,7 +32,7 @@ before(async function () { await execP(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') existsSync(packageLockPath) && unlinkSync(packageLockPath) - ;({ register, create, VERSION } = require(join(TEST_DIR, 'node_modules/ts-node'))) + ;({ register, create, VERSION } = testsDirRequire('ts-node')) }) describe('ts-node', function () { @@ -40,23 +44,23 @@ describe('ts-node', function () { expect(VERSION).to.equal(require('../package.json').version) }) it('should export all CJS entrypoints', function () { - // Ensure our package.json "exports" declaration doesn't prevent `require()`ing all our entrypoints + // Ensure our package.json "exports" declaration allows `require()`ing all our entrypoints // https://github.com/TypeStrong/ts-node/pull/1026 - require('ts-node') - require('ts-node/package') - require('ts-node/dist/index') - require('ts-node/dist/bin') - require('ts-node/dist/bin-transpile') - require('ts-node/dist/bin-script') - require('ts-node/dist/bin-script-deprecated') - require('ts-node/dist/esm') - require('ts-node/register') - require('ts-node/register/index') - require('ts-node/register/files') - require('ts-node/register/transpile-only') - require('ts-node/register/type-check') - require('ts-node/tsconfig.schema.json') - require('ts-node/tsconfig.schemastore-schema.json') + testsDirRequire.resolve('ts-node') + testsDirRequire.resolve('ts-node/package') + testsDirRequire.resolve('ts-node/dist/index') + testsDirRequire.resolve('ts-node/dist/bin') + testsDirRequire.resolve('ts-node/dist/bin-transpile') + testsDirRequire.resolve('ts-node/dist/bin-script') + testsDirRequire.resolve('ts-node/dist/bin-script-deprecated') + testsDirRequire.resolve('ts-node/dist/esm') + testsDirRequire.resolve('ts-node/register') + testsDirRequire.resolve('ts-node/register/index') + testsDirRequire.resolve('ts-node/register/files') + testsDirRequire.resolve('ts-node/register/transpile-only') + testsDirRequire.resolve('ts-node/register/type-check') + testsDirRequire.resolve('ts-node/tsconfig.schema.json') + testsDirRequire.resolve('ts-node/tsconfig.schemastore-schema.json') }) describe('cli', function () { From daf12da05310f16904a0b6bde586b7abcfd7874a Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 17 May 2020 09:45:37 -0400 Subject: [PATCH 6/9] fix --- src/index.spec.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 886afe0e5..17f5615c5 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -9,6 +9,7 @@ import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf' import { createRequire, createRequireFromPath } from 'module' +import Module = require('module') const execP = promisify(exec) @@ -667,10 +668,11 @@ describe('ts-node', function () { }) describe('JSX preserve', () => { - let old = require.extensions['.tsx'] // tslint:disable-line + let old: (m: Module, filename: string) => any let compiled: string before(function () { + old = require.extensions['.tsx']! // tslint:disable-line require.extensions['.tsx'] = (m: any, fileName) => { // tslint:disable-line const _compile = m._compile @@ -679,7 +681,7 @@ describe('ts-node', function () { return _compile.call(this, code, fileName) } - return old!(m, fileName) + return old(m, fileName) } }) From c0fc95d6f91af8c664589dd27f0b8460f257264b Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 19 May 2020 20:33:34 -0400 Subject: [PATCH 7/9] tweak test to check esm loader entrypoint --- src/index.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 17f5615c5..0423654e9 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -54,7 +54,6 @@ describe('ts-node', function () { testsDirRequire.resolve('ts-node/dist/bin-transpile') testsDirRequire.resolve('ts-node/dist/bin-script') testsDirRequire.resolve('ts-node/dist/bin-script-deprecated') - testsDirRequire.resolve('ts-node/dist/esm') testsDirRequire.resolve('ts-node/register') testsDirRequire.resolve('ts-node/register/index') testsDirRequire.resolve('ts-node/register/files') @@ -62,6 +61,7 @@ describe('ts-node', function () { testsDirRequire.resolve('ts-node/register/type-check') testsDirRequire.resolve('ts-node/tsconfig.schema.json') testsDirRequire.resolve('ts-node/tsconfig.schemastore-schema.json') + testsDirRequire.resolve('ts-node/esm') }) describe('cli', function () { From 3877ebc65f6f1a2e2ba8895df080f8fac2fc8973 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 19 May 2020 22:22:35 -0400 Subject: [PATCH 8/9] narrow list of exported files --- package.json | 16 ++++++++++++++-- src/index.spec.ts | 19 ++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 6deede2d0..e458b78e8 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,20 @@ "main": "dist/index.js", "exports": { ".": "./dist/index.js", - "./": "./", - "./esm": "./esm.mjs" + "./package": "./package.json", + "./package.json": "./package.json", + "./dist/bin": "./dist/bin.js", + "./dist/bin.js": "./dist/bin.js", + "./dist/bin-transpile": "./dist/bin-transpile.js", + "./dist/bin-transpile.js": "./dist/bin-transpile.js", + "./dist/bin-script": "./dist/bin-script.js", + "./dist/bin-script.js": "./dist/bin-script.js", + "./register": "./register/index.js", + "./register/files": "./register/files.js", + "./register/transpile-only": "./register/transpile-only.js", + "./register/type-check": "./register/type-check.js", + "./esm": "./esm.mjs", + "./esm.mjs": "./esm.mjs" }, "types": "dist/index.d.ts", "bin": { diff --git a/src/index.spec.ts b/src/index.spec.ts index af549e312..32bd9802c 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -47,21 +47,30 @@ describe('ts-node', function () { it('should export all CJS entrypoints', function () { // Ensure our package.json "exports" declaration allows `require()`ing all our entrypoints // https://github.com/TypeStrong/ts-node/pull/1026 + testsDirRequire.resolve('ts-node') + + // only reliably way to ask node for the root path of a dependency is Path.resolve(require.resolve('ts-node/package'), '..') testsDirRequire.resolve('ts-node/package') - testsDirRequire.resolve('ts-node/dist/index') + testsDirRequire.resolve('ts-node/package.json') + + // All bin entrypoints for people who need to augment our CLI: `node -r otherstuff ./node_modules/ts-node/dist/bin` testsDirRequire.resolve('ts-node/dist/bin') + testsDirRequire.resolve('ts-node/dist/bin.js') testsDirRequire.resolve('ts-node/dist/bin-transpile') + testsDirRequire.resolve('ts-node/dist/bin-transpile.js') testsDirRequire.resolve('ts-node/dist/bin-script') - testsDirRequire.resolve('ts-node/dist/bin-script-deprecated') + testsDirRequire.resolve('ts-node/dist/bin-script.js') + + // Must be `require()`able obviously testsDirRequire.resolve('ts-node/register') - testsDirRequire.resolve('ts-node/register/index') testsDirRequire.resolve('ts-node/register/files') testsDirRequire.resolve('ts-node/register/transpile-only') testsDirRequire.resolve('ts-node/register/type-check') - testsDirRequire.resolve('ts-node/tsconfig.schema.json') - testsDirRequire.resolve('ts-node/tsconfig.schemastore-schema.json') + + // `node --loader ts-node/esm` testsDirRequire.resolve('ts-node/esm') + testsDirRequire.resolve('ts-node/esm.mjs') }) describe('cli', function () { From f88fa6fcb2d396b16a0f5d8ebfe0793dd9fa8ca3 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Fri, 22 May 2020 17:18:46 -0400 Subject: [PATCH 9/9] Update index.spec.ts --- src/index.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.spec.ts b/src/index.spec.ts index 32bd9802c..1ed62bd7d 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -4,7 +4,7 @@ import { join } from 'path' import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') -import * as tsNodeTypes from './index' +import type * as tsNodeTypes from './index' import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf'