UNPKG

ts-babel

Version:

Transform TypeScript compiler result using Babel to granular target control

84 lines 3.27 kB
#! /usr/bin/env node "use strict"; 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