ts-patch
Version:
Patch typescript to support custom transformers in tsconfig.json
72 lines • 3.76 kB
JavaScript
;
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