UNPKG

ts-patch

Version:

Patch typescript to support custom transformers in tsconfig.json

72 lines 3.76 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.runLiveShim = runLiveShim; const module_1 = __importDefault(require("module")); const path_1 = __importDefault(require("path")); const vm_1 = require("vm"); const get_live_module_1 = require("./get-live-module"); const ts_module_1 = require("./ts-module"); /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ function runLiveShim(moduleName, parentModule) { const libraryName = String(moduleName).replace(/\.js$/, ''); const tsPackage = (0, get_live_module_1.getLiveTypeScriptPackage)(); const tsModule = (0, ts_module_1.getTsModule)(tsPackage, moduleName); switch (moduleName) { case 'tsserver.js': case 'tsserverlibrary.js': return evaluateModule(tsModule.getUnpatchedModuleFile().content, parentModule, tsModule.moduleContentFilePath, createPatchedRequire(tsPackage.libDir, libraryName, tsModule.moduleContentFilePath)); case 'tsc.js': case 'typescript.js': { const { js } = (0, get_live_module_1.getLiveModule)(moduleName, { libraryName }); return evaluateModule(js, parentModule, tsModule.moduleContentFilePath, createPatchedRequire(tsPackage.libDir, libraryName, tsModule.moduleContentFilePath)); } default: throw new Error(`Unknown live TypeScript module: ${moduleName}`); } } function createPatchedRequire(libDir, libraryName, fromFile) { const nativeRequire = module_1.default.createRequire(fromFile); const patchedRequire = ((request) => { const resolved = nativeRequire.resolve(request); if (isTsLibFile(resolved, libDir, 'typescript.js')) { return requirePatchedModule('typescript.js', libraryName, resolved); } if (isTsLibFile(resolved, libDir, '_tsc.js')) { return requirePatchedModule('tsc.js', libraryName, resolved); } return nativeRequire(request); }); patchedRequire.resolve = nativeRequire.resolve; patchedRequire.cache = nativeRequire.cache; patchedRequire.extensions = nativeRequire.extensions; patchedRequire.main = nativeRequire.main; return patchedRequire; } function requirePatchedModule(moduleName, libraryName, resolvedPath) { const syntheticModule = new module_1.default(resolvedPath, module); syntheticModule.filename = resolvedPath; syntheticModule.paths = module_1.default._nodeModulePaths(path_1.default.dirname(resolvedPath)); const localRequire = createPatchedRequire(path_1.default.dirname(resolvedPath), libraryName, resolvedPath); syntheticModule.require = localRequire; const { js } = (0, get_live_module_1.getLiveModule)(moduleName, { libraryName }); evaluateModule(js, syntheticModule, resolvedPath, localRequire); return syntheticModule.exports; } function isTsLibFile(resolvedPath, libDir, fileName) { return path_1.default.resolve(resolvedPath) === path_1.default.resolve(libDir, fileName); } function evaluateModule(code, targetModule, filePath, localRequire) { const script = (0, vm_1.runInThisContext)(` (function (exports, require, module, __filename, __dirname) { ${code} }); `, { filename: filePath }); return script.call(targetModule.exports, targetModule.exports, localRequire, targetModule, filePath, path_1.default.dirname(filePath)); } // endregion //# sourceMappingURL=run-live-shim.js.map