From 768c4011342b228d4f7b98cda6dde7f07efd3cb2 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Sun, 12 Apr 2020 18:21:05 -0400 Subject: [PATCH] Fix #1004 --- src/bin.ts | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/bin.ts b/src/bin.ts index c303129a3..a01594532 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -7,7 +7,7 @@ import Module = require('module') import arg = require('arg') import { diffLines } from 'diff' import { Script } from 'vm' -import { readFileSync, statSync } from 'fs' +import { readFileSync, statSync, realpathSync } from 'fs' import { homedir } from 'os' import { VERSION, TSError, parse, Register, register } from './index' @@ -154,6 +154,7 @@ export function main (argv: string[]) { } const cwd = dir || process.cwd() + /** Unresolved. May point to a symlink, not realpath. May be missing file extension */ const scriptPath = args._.length ? resolve(cwd, args._[0]) : undefined const state = new EvalState(scriptPath || join(cwd, EVAL_FILENAME)) @@ -251,7 +252,21 @@ function getCwd (dir?: string, scriptMode?: boolean, scriptPath?: string) { throw new TypeError('Script mode cannot be combined with `--dir`') } - return dirname(scriptPath) + // Use node's own resolution behavior to ensure we follow symlinks + // This may affect which tsconfig we discover + // This happens before we are registered, so tell node's resolver to consider .ts and tsx files + // TODO in extremely rare cases, if a foo.js and foo.ts both exist, we may follow the wrong one, + // because we are not obeying `--prefer-ts-exts` + const hadTsExt = hasOwnProperty(require.extensions, '.ts') // tslint:disable-line + const hadTsxExt = hasOwnProperty(require.extensions, '.tsx') // tslint:disable-line + try { + if(!hadTsExt) require.extensions['.ts'] = function() {} // tslint:disable-line + if(!hadTsxExt) require.extensions['.tsx'] = function() {} // tslint:disable-line + return dirname(require.resolve(scriptPath)) + } finally { + if(!hadTsExt) delete require.extensions['.ts'] // tslint:disable-line + if(!hadTsxExt) delete require.extensions['.tsx'] // tslint:disable-line + } } return dir @@ -481,6 +496,11 @@ function isRecoverable (error: TSError) { return error.diagnosticCodes.every(code => RECOVERY_CODES.has(code)) } +/** Safe `hasOwnProperty` */ +function hasOwnProperty (object: any, property: string): boolean { + return Object.prototype.hasOwnProperty.call(object, property) +} + if (require.main === module) { main(process.argv.slice(2)) }