diff --git a/src/repl.ts b/src/repl.ts index b55693fed..496a00385 100644 --- a/src/repl.ts +++ b/src/repl.ts @@ -1,7 +1,8 @@ import type * as _diff from 'diff'; import { homedir } from 'os'; import { join } from 'path'; -import { Recoverable, ReplOptions, REPLServer, start as nodeReplStart } from 'repl'; +import type * as _nodeRepl from 'repl'; +import type { REPLServer, ReplOptions } from 'repl'; import { Context, createContext, Script } from 'vm'; import { Service, CreateOptions, TSError, env } from './index'; import { readFileSync, statSync } from 'fs'; @@ -28,6 +29,26 @@ function getDiffLines() { return diff.diffLines; } +// Lazy-loaded to prevent repl's require('domain') from causing problems +// https://github.com/TypeStrong/ts-node/issues/2024 +// https://github.com/nodejs/node/issues/48131 +let nodeRepl: { + Recoverable: typeof _nodeRepl.Recoverable; + REPLServer: typeof _nodeRepl.REPLServer; + start: typeof _nodeRepl.start; +}; +function getNodeRepl() { + if (nodeRepl === undefined) { + const { Recoverable, REPLServer, start } = require('repl') as { + Recoverable: typeof _nodeRepl.Recoverable; + REPLServer: typeof _nodeRepl.REPLServer; + start: typeof _nodeRepl.start; + }; + nodeRepl = { Recoverable, REPLServer, start }; + } + return nodeRepl; +} + /** @internal */ export const EVAL_FILENAME = `[eval].ts`; /** @internal */ @@ -271,6 +292,7 @@ export function createRepl(options: CreateReplOptions = {}) { const canLogTopLevelAwaitHint = service!.options.experimentalReplAwait !== false && !service!.shouldReplAwait; if (error instanceof TSError) { // Support recoverable compilations using >= node 6. + const { Recoverable } = getNodeRepl(); if (Recoverable && isRecoverable(error)) { callback(new Recoverable(error)); return; @@ -335,7 +357,7 @@ export function createRepl(options: CreateReplOptions = {}) { // the REPL starts for a snappier user experience on startup. service?.compile('', state.path); - const repl = nodeReplStart({ + const repl = getNodeRepl().start({ prompt: '> ', input: replService.stdin, output: replService.stdout,