diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index b8aac380da7974..74e1e8c5227bd3 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -1135,6 +1135,11 @@ function defaultLoadImpl(filename, format) { case 'module-typescript': case 'commonjs-typescript': case 'typescript': { + const isPipePath = ['/dev/stdin', '/dev/fd/0'].includes(filename) || + (filename.startsWith('/proc/') && filename.includes('/fd/pipe:')); + if (isPipePath) { + return fs.readFileSync(0, 'utf8'); + } return fs.readFileSync(filename, 'utf8'); } case 'builtin': diff --git a/test/parallel/test-typescript-stdin-pipe.js b/test/parallel/test-typescript-stdin-pipe.js new file mode 100644 index 00000000000000..741fa8c7bbab42 --- /dev/null +++ b/test/parallel/test-typescript-stdin-pipe.js @@ -0,0 +1,21 @@ +'use strict'; +const common = require('../common'); + +if (common.isWindows || common.isAIX || common.isIBMi) + common.skip(`No /dev/stdin on ${process.platform}.`); + +const assert = require('assert'); +const { exec } = require('child_process'); + +const tsCode = ` +const message = "JavaScript from pipe"; +console.log(message); +`; + + +const [cmd, opts] = common.escapePOSIXShell`printf "${tsCode}" | ${process.execPath} /dev/stdin`; + +exec(cmd, opts, common.mustSucceed((stdout, stderr) => { + assert.strictEqual(stdout.trim(), 'JavaScript from pipe'); + assert.strictEqual(stderr, ''); +}));