ts-babel
Version:
Transform TypeScript compiler result using Babel to granular target control
84 lines • 3.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
require("v8-compile-cache");
const ts = require("typescript");
const babel = require("@babel/core");
const fs_extra_p_1 = require("fs-extra-p");
const bluebird_lst_1 = require("bluebird-lst");
const util_1 = require("./util");
util_1.transpile(async (basePath, config, tsConfig) => {
const compilerOptions = config.options;
if (tsConfig.declaration !== false) {
compilerOptions.declaration = true;
}
compilerOptions.noEmitOnError = true;
const program = ts.createProgram(config.fileNames, compilerOptions, ts.createCompilerHost(compilerOptions));
util_1.checkErrors(ts.getPreEmitDiagnostics(program));
const compilerOutDir = compilerOptions.outDir;
if (compilerOutDir == null) {
throw new Error("outDir is not specified in the compilerOptions");
}
await fs_extra_p_1.ensureDir(compilerOutDir);
const fileToSourceMap = {};
const promises = [];
const emittedFiles = new Set();
const emitResult = program.emit(undefined, (fileName, data) => {
emittedFiles.add(fileName);
if (fileName.endsWith(".js")) {
const sourceMapFileName = `${fileName}.map`;
processCompiled(data, fileToSourceMap[sourceMapFileName], fileName, sourceMapFileName, promises);
}
else if (fileName.endsWith(".js.map")) {
fileToSourceMap[fileName] = data;
}
else {
promises.push(fs_extra_p_1.outputFile(fileName, data));
}
});
util_1.checkErrors(emitResult.diagnostics);
if (emitResult.emitSkipped) {
throw new Error("Emit skipped");
}
await bluebird_lst_1.default.all(promises);
await removeOld(compilerOutDir, emittedFiles);
})
.catch(error => {
console.error(error.stack || error.message || error);
process.exit(-1);
});
async function removeOld(outDir, emittedFiles) {
await bluebird_lst_1.default.map(await fs_extra_p_1.readdir(outDir), file => {
// ts uses / regardless of OS
const fullPath = `${outDir}/${file}`;
if (!file.includes(".")) {
return removeOld(fullPath, emittedFiles);
}
if ((file.endsWith(".js") || file.endsWith(".js.map") || file.endsWith(".d.ts")) && !emittedFiles.has(fullPath)) {
return fs_extra_p_1.unlink(fullPath);
}
return null;
});
}
function processCompiled(code, sourceMap, jsFileName, sourceMapFileName, promises) {
const result = babel.transform(code, {
inputSourceMap: sourceMap == null ? null : JSON.parse(sourceMap),
sourceMaps: true,
filename: jsFileName,
});
const match = code.match(regex);
const sourceMapUrl = match[1] || match[2];
promises.push(fs_extra_p_1.outputFile(jsFileName, result.code.replace(regex, "") + "\n//# sourceMappingURL=" + sourceMapUrl), fs_extra_p_1.outputJson(sourceMapFileName, result.map));
}
const innerRegex = /[#@] sourceMappingURL=([^\s'"]*)/;
const regex = RegExp("(?:" +
"/\\*" +
"(?:\\s*\r?\n(?://)?)?" +
"(?:" + innerRegex.source + ")" +
"\\s*" +
"\\*/" +
"|" +
"//(?:" + innerRegex.source + ")" +
")" +
"\\s*");
//# sourceMappingURL=builder.js.map