@rnm/tscx
Version:
A tsc wrapper with many convenient features.
135 lines • 18.2 kB
JavaScript
// this file should not have `async` and `await`
import childProcess from "node:child_process";
import path from "node:path";
import process from "node:process";
import { copyfiles, exec, remove, script, tsc } from "./cmd/index.js";
export class Compiler {
options;
id = "";
currentSubprocess;
tsconfig;
rootDir;
outDir;
constructor(options) {
this.options = options;
// setup tsconfig
this.tsconfig = this.getTsConfig();
this.rootDir = this.getRootDir();
this.outDir = this.getOutDir();
}
compile() {
const id = `${Date.now().toString()}_${Math.random().toString(36).slice(2)}`;
this.id = id;
if (!this.currentSubprocess) {
this.execTasks(id);
return;
}
if (typeof this.currentSubprocess.exitCode === "number") {
this.execTasks(id);
return;
}
if (!this.currentSubprocess.killed) {
this.currentSubprocess.kill();
}
this.currentSubprocess.removeAllListeners("close");
this.currentSubprocess.on("close", () => {
this.execTasks(id);
});
}
getTasks() {
const { project, remove: rm, copyfiles: cp, script: scr, exec: ex, ...others } = this.options;
return [
...(rm ? [() => remove(this.outDir)] : []),
() => tsc({ project, ...others }),
...(cp ? [() => copyfiles(this.rootDir, this.outDir)] : []),
...(scr ? [() => script(scr)] : []),
...(ex ? [() => exec(ex)] : []),
];
}
execTasks(id) {
if (this.id !== id) {
return;
}
const tasks = this.getTasks();
const execNextTask = (index = 0) => {
const currentTask = tasks[index];
if (!currentTask || this.id !== id) {
return;
}
this.currentSubprocess = currentTask();
this.currentSubprocess.on("close", (code, signal) => {
// manually exiting or unexpected exception will not execute next task
if (code || signal) {
return;
}
execNextTask(index + 1);
});
};
execNextTask();
}
refreshTsConfig() {
this.tsconfig = this.getTsConfig();
this.rootDir = this.getRootDir();
this.outDir = this.getOutDir();
}
getTsConfig() {
const tscPath = path.resolve(process.cwd(), "node_modules", "typescript", "bin", "tsc");
const cmd = `node ${tscPath} --showConfig --project ${this.options.project}`;
const config = JSON.parse(childProcess.execSync(cmd).toString("utf8"));
if (!config.compilerOptions ||
Object.keys(config.compilerOptions).length <= 0) {
throw new Error("Tsconfig.compilerOptions is empty!");
}
return config;
}
getInclude() {
return this.tsconfig.include;
}
getOutDir() {
const outDir = this.tsconfig.compilerOptions?.outDir;
if (!outDir) {
throw new Error('"outDir" is not found');
}
const absoluteOutDir = path.resolve(process.cwd(), outDir);
if (process.cwd().startsWith(absoluteOutDir)) {
throw new Error('"outDir" in tsconfig.json should not be current or parent directory');
}
return absoluteOutDir;
}
getRootDir() {
const rootDir = this.tsconfig.compilerOptions?.rootDir;
return rootDir
? path.resolve(process.cwd(), rootDir)
: path.resolve(process.cwd(), this.getRootDirByFiles(this.tsconfig.files ?? []));
}
/**
* Get the longest common dir. https://www.typescriptlang.org/tsconfig#rootDir
* @param files file paths like ['./src/index.ts', './index.ts']
* @returns absolute path
*/
getRootDirByFiles(files) {
if (files.length === 0) {
throw new Error("Cannot get the longest common dir when the arguments is empty");
}
const folder = files
.map((file) => file.split(path.sep).slice(0, -1))
.reduce((prev, item) => {
if (prev.length === 0) {
return item;
}
const result = [];
for (let i = 0; i < prev.length && i < item.length; i += 1) {
const sub = prev[i];
if (sub && sub === item[i]) {
result[i] = sub;
}
else {
break;
}
}
return result;
}, []);
return path.join(...folder);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29tcGlsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0RBQWdEO0FBQ2hELE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFbkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWlCdEUsTUFBTSxPQUFPLFFBQVE7SUFPVTtJQU5yQixFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ1IsaUJBQWlCLENBQTZCO0lBQzlDLFFBQVEsQ0FBVztJQUNuQixPQUFPLENBQVM7SUFDaEIsTUFBTSxDQUFTO0lBRXZCLFlBQTZCLE9BQXdCO1FBQXhCLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ25ELGlCQUFpQjtRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0UsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFYixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFF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QUNELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztZQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMzQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUNsQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRoaXMgZmlsZSBzaG91bGQgbm90IGhhdmUgYGFzeW5jYCBhbmQgYGF3YWl0YFxuaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5pbXBvcnQgdHlwZSB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgY29weWZpbGVzLCBleGVjLCByZW1vdmUsIHNjcmlwdCwgdHNjIH0gZnJvbSBcIi4vY21kL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZXJPcHRpb25zIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbj4ge1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIHJlbW92ZTogYm9vbGVhbjtcbiAgY29weWZpbGVzOiBib29sZWFuO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIGV4ZWM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHNDb25maWcge1xuICBjb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnM7XG4gIGluY2x1ZGU/OiBzdHJpbmdbXTtcbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xuICBmaWxlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcGlsZXIge1xuICBwcml2YXRlIGlkID0gXCJcIjtcbiAgcHJpdmF0ZSBjdXJyZW50U3VicHJvY2Vzcz86IGNoaWxkUHJvY2Vzcy5DaGlsZFByb2Nlc3M7XG4gIHByaXZhdGUgdHNjb25maWc6IFRzQ29uZmlnO1xuICBwcml2YXRlIHJvb3REaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBvdXREaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IENvbXBpbGVyT3B0aW9ucykge1xuICAgIC8vIHNldHVwIHRzY29uZmlnXG4gICAgdGhpcy50c2NvbmZpZyA9IHRoaXMuZ2V0VHNDb25maWcoKTtcbiAgICB0aGlzLnJvb3REaXIgPSB0aGlzLmdldFJvb3REaXIoKTtcbiAgICB0aGlzLm91dERpciA9IHRoaXMuZ2V0T3V0RGlyKCk7XG4gIH1cblxuICBjb21waWxlKCkge1xuICAgIGNvbnN0IGlkID0gYCR7RGF0ZS5ub3coKS50b1N0cmluZygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XG4gICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTdWJwcm9jZXNzKSB7XG4gICAgICB0aGlzLmV4ZWNUYXNrcyhpZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5jdXJyZW50U3VicHJvY2Vzcy5leGl0Q29kZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdGhpcy5leGVjVGFza3MoaWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY3VycmVudFN1YnByb2Nlc3Mua2lsbGVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdWJwcm9jZXNzLmtpbGwoKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50U3VicHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICB0aGlzLmN1cnJlbnRTdWJwcm9jZXNzLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5leGVjVGFza3MoaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYXNrcygpOiBBcnJheTwoKSA9PiBjaGlsZFByb2Nlc3MuQ2hpbGRQcm9jZXNzPiB7XG4gICAgY29uc3Qge1xuICAgICAgcHJvamVjdCxcbiAgICAgIHJlbW92ZTogcm0sXG4gICAgICBjb3B5ZmlsZXM6IGNwLFxuICAgICAgc2NyaXB0OiBzY3IsXG4gICAgICBleGVjOiBleCxcbiAgICAgIC4uLm90aGVyc1xuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihybSA/IFsoKSA9PiByZW1vdmUodGhpcy5vdXREaXIpXSA6IFtdKSxcbiAgICAgICgpID0+IHRzYyh7IHByb2plY3QsIC4uLm90aGVycyB9KSxcbiAgICAgIC4uLihjcCA/IFsoKSA9PiBjb3B5ZmlsZXModGhpcy5yb290RGlyLCB0aGlzLm91dERpcildIDogW10pLFxuICAgICAgLi4uKHNjciA/IFsoKSA9PiBzY3JpcHQoc2NyKV0gOiBbXSksXG4gICAgICAuLi4oZXggPyBbKCkgPT4gZXhlYyhleCldIDogW10pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGV4ZWNUYXNrcyhpZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaWQgIT09IGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFza3MgPSB0aGlzLmdldFRhc2tzKCk7XG4gICAgY29uc3QgZXhlY05leHRUYXNrID0gKGluZGV4ID0gMCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFRhc2sgPSB0YXNrc1tpbmRleF07XG4gICAgICBpZiAoIWN1cnJlbnRUYXNrIHx8IHRoaXMuaWQgIT09IGlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudFN1YnByb2Nlc3MgPSBjdXJyZW50VGFzaygpO1xuICAgICAgdGhpcy5jdXJyZW50U3VicHJvY2Vzcy5vbihcImNsb3NlXCIsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgLy8gbWFudWFsbHkgZXhpdGluZyBvciB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aWxsIG5vdCBleGVjdXRlIG5leHQgdGFza1xuICAgICAgICBpZiAoY29kZSB8fCBzaWduYWwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXhlY05leHRUYXNrKGluZGV4ICsgMSk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGV4ZWNOZXh0VGFzaygpO1xuICB9XG5cbiAgcmVmcmVzaFRzQ29uZmlnKCkge1xuICAgIHRoaXMudHNjb25maWcgPSB0aGlzLmdldFRzQ29uZmlnKCk7XG4gICAgdGhpcy5yb290RGlyID0gdGhpcy5nZXRSb290RGlyKCk7XG4gICAgdGhpcy5vdXREaXIgPSB0aGlzLmdldE91dERpcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUc0NvbmZpZygpOiBUc0NvbmZpZyB7XG4gICAgY29uc3QgdHNjUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgXCJ0eXBlc2NyaXB0XCIsXG4gICAgICBcImJpblwiLFxuICAgICAgXCJ0c2NcIixcbiAgICApO1xuICAgIGNvbnN0IGNtZCA9IGBub2RlICR7dHNjUGF0aH0gLS1zaG93Q29uZmlnIC0tcHJvamVjdCAke3RoaXMub3B0aW9ucy5wcm9qZWN0fWA7XG4gICAgY29uc3QgY29uZmlnOiBUc0NvbmZpZyA9IEpTT04ucGFyc2UoXG4gICAgICBjaGlsZFByb2Nlc3MuZXhlY1N5bmMoY21kKS50b1N0cmluZyhcInV0ZjhcIiksXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICAhY29uZmlnLmNvbXBpbGVyT3B0aW9ucyB8fFxuICAgICAgT2JqZWN0LmtleXMoY29uZmlnLmNvbXBpbGVyT3B0aW9ucykubGVuZ3RoIDw9IDBcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRzY29uZmlnLmNvbXBpbGVyT3B0aW9ucyBpcyBlbXB0eSFcIik7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBnZXRJbmNsdWRlKCkge1xuICAgIHJldHVybiB0aGlzLnRzY29uZmlnLmluY2x1ZGU7XG4gIH1cblxuICBnZXRPdXREaXIoKSB7XG4gICAgY29uc3Qgb3V0RGlyID0gdGhpcy50c2NvbmZpZy5jb21waWxlck9wdGlvbnM/Lm91dERpcjtcbiAgICBpZiAoIW91dERpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIm91dERpclwiIGlzIG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICBjb25zdCBhYnNvbHV0ZU91dERpciA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvdXREaXIpO1xuICAgIGlmIChwcm9jZXNzLmN3ZCgpLnN0YXJ0c1dpdGgoYWJzb2x1dGVPdXREaXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdcIm91dERpclwiIGluIHRzY29uZmlnLmpzb24gc2hvdWxkIG5vdCBiZSBjdXJyZW50IG9yIHBhcmVudCBkaXJlY3RvcnknLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFic29sdXRlT3V0RGlyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSb290RGlyKCkge1xuICAgIGNvbnN0IHJvb3REaXIgPSB0aGlzLnRzY29uZmlnLmNvbXBpbGVyT3B0aW9ucz8ucm9vdERpcjtcbiAgICByZXR1cm4gcm9vdERpclxuICAgICAgPyBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcm9vdERpcilcbiAgICAgIDogcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgdGhpcy5nZXRSb290RGlyQnlGaWxlcyh0aGlzLnRzY29uZmlnLmZpbGVzID8/IFtdKSxcbiAgICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgY29tbW9uIGRpci4gaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI3Jvb3REaXJcbiAgICogQHBhcmFtIGZpbGVzIGZpbGUgcGF0aHMgbGlrZSBbJy4vc3JjL2luZGV4LnRzJywgJy4vaW5kZXgudHMnXVxuICAgKiBAcmV0dXJucyBhYnNvbHV0ZSBwYXRoXG4gICAqL1xuICBwcml2YXRlIGdldFJvb3REaXJCeUZpbGVzKGZpbGVzOiBzdHJpbmdbXSkge1xuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgZ2V0IHRoZSBsb25nZXN0IGNvbW1vbiBkaXIgd2hlbiB0aGUgYXJndW1lbnRzIGlzIGVtcHR5XCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiBmaWxlLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMSkpXG4gICAgICAucmVkdWNlPHN0cmluZ1tdPigocHJldiwgaXRlbSkgPT4ge1xuICAgICAgICBpZiAocHJldi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5sZW5ndGggJiYgaSA8IGl0ZW0ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBzdWIgPSBwcmV2W2ldO1xuICAgICAgICAgIGlmIChzdWIgJiYgc3ViID09PSBpdGVtW2ldKSB7XG4gICAgICAgICAgICByZXN1bHRbaV0gPSBzdWI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIHBhdGguam9pbiguLi5mb2xkZXIpO1xuICB9XG59XG4iXX0=