@rnm/tscx
Version:
A tsc wrapper with many convenient options.
121 lines • 16.1 kB
JavaScript
import os from "node:os";
import chokidar from "chokidar";
import { TaskQueue } from "./task-queue.js";
import { getInclude, getOutDir, getRootDir, getTsConfig, getTsConfigPath, } from "./tsconfig-utils.js";
// Note: In this class, `watch` and `compile` shouldn't be called more than once.
export class Main {
watcher = undefined;
currentQueue = undefined;
tscOptions;
remove;
copyfiles;
exec;
tsconfigPath;
rootDir;
outDir;
include;
constructor(options, tscOptions) {
const { remove, copyfiles, exec, project } = options; // strip options which are not passed to tsc
this.tscOptions = tscOptions;
if (remove)
this.remove = remove;
if (copyfiles)
this.copyfiles = copyfiles;
if (exec)
this.exec = exec;
this.tsconfigPath = getTsConfigPath(project);
const tsconfig = getTsConfig(this.tsconfigPath);
this.rootDir = getRootDir(tsconfig);
this.outDir = getOutDir(tsconfig);
this.include = getInclude(tsconfig);
if ((tscOptions.includes("--noEmit") || tsconfig.compilerOptions?.noEmit) &&
this.copyfiles) {
throw new Error('"--copyfiles" option is not supported when "--noEmit" is set');
}
}
watch() {
if (!this.outDir) {
throw new Error("`outDir` in tsconfig is required for watch mode");
}
// TODO: Rethinking the watch files. Each of them below is reasonable. Scope: `process.cwd()` >= `rootDir` >= `include`.
// 1. Watch the `include`.
// 2. Watch the `process.cwd()`.
// 3. Watch the `rootDir`. Definitely, `rootDir` is not a good idea as it may change to another directory when ts file is added or deleted.
this.watcher = chokidar
.watch(this.include, {
ignored: [
"**/node_modules/**",
"**/.git/**",
this.outDir,
this.tsconfigPath,
],
ignoreInitial: true,
})
.on("ready", () => this.restartQueue())
.on("add", () => this.restartQueue())
.on("unlink", () => this.restartQueue())
.on("change", () => this.restartQueue());
}
restartQueue() {
if (!this.currentQueue?.isRunning()) {
this.currentQueue = this.newQueue().start();
}
else {
this.currentQueue.on("close", () => {
this.currentQueue = this.newQueue().start();
});
this.currentQueue.stop();
}
}
async compile() {
return await new Promise((resolve) => {
this.currentQueue = this.newQueue()
.on("close", (code, signal) => {
resolve(code ?? (signal ? 128 + os.constants.signals[signal] : 0));
})
.start();
});
}
async stop() {
// After the watcher is closed, restartQueue will never be called.
await this.watcher?.close();
return await new Promise((resolve) => {
if (!this.currentQueue?.isRunning()) {
resolve(0);
}
else {
this.currentQueue
.on("close", (code, signal) => {
resolve(code ?? (signal ? 128 + os.constants.signals[signal] : 0));
})
.stop();
}
});
}
newQueue() {
let removeConfig = undefined;
let copyfilesConfig = undefined;
if (this.remove) {
if (!this.outDir) {
throw new Error("`outDir` is required in tsconfig to remove compilation output");
}
removeConfig = { filepath: this.outDir };
}
if (this.copyfiles) {
if (!this.outDir) {
throw new Error("`outDir` is required in tsconfig to copy non-js files to compilation output`");
}
copyfilesConfig = {
rootDir: this.rootDir,
outDir: this.outDir,
};
}
return new TaskQueue({
tscConfig: this.tscOptions,
...(removeConfig ? { removeConfig } : {}),
...(copyfilesConfig ? { copyfilesConfig } : {}),
...(this.exec ? { execConfig: { filepath: this.exec } } : {}),
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFFLFNBQVMsRUFBeUIsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGVBQWUsR0FDaEIsTUFBTSxxQkFBcUIsQ0FBQztBQVM3QixpRkFBaUY7QUFDakYsTUFBTSxPQUFPLElBQUk7SUFDUCxPQUFPLEdBQW1DLFNBQVMsQ0FBQztJQUNwRCxZQUFZLEdBQTBCLFNBQVMsQ0FBQztJQUV2QyxVQUFVLENBQVc7SUFDckIsTUFBTSxDQUFXO0lBQ2pCLFNBQVMsQ0FBVztJQUNwQixJQUFJLENBQVU7SUFFZCxZQUFZLENBQVM7SUFDckIsT0FBTyxDQUFTO0lBQ2hCLE1BQU0sQ0FBcUI7SUFDM0IsT0FBTyxDQUFXO0lBRW5DLFlBQVksT0FBb0IsRUFBRSxVQUFvQjtRQUNwRCxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsNENBQTRDO1FBQ2xHLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLElBQUksU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzFDLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRTNCLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxD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TTthQUNwQixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxTQUFTLENBQUM7WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDOUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgY2hva2lkYXIgZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgeyBUYXNrUXVldWUsIHR5cGUgVGFza1F1ZXVlT3B0aW9ucyB9IGZyb20gXCIuL3Rhc2stcXVldWUudHNcIjtcbmltcG9ydCB7XG4gIGdldEluY2x1ZGUsXG4gIGdldE91dERpcixcbiAgZ2V0Um9vdERpcixcbiAgZ2V0VHNDb25maWcsXG4gIGdldFRzQ29uZmlnUGF0aCxcbn0gZnJvbSBcIi4vdHNjb25maWctdXRpbHMudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNYWluT3B0aW9ucyB7XG4gIHByb2plY3Q/OiBzdHJpbmc7XG4gIHJlbW92ZT86IGJvb2xlYW47XG4gIGNvcHlmaWxlcz86IGJvb2xlYW47XG4gIGV4ZWM/OiBzdHJpbmc7XG59XG5cbi8vIE5vdGU6IEluIHRoaXMgY2xhc3MsIGB3YXRjaGAgYW5kIGBjb21waWxlYCBzaG91bGRuJ3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLlxuZXhwb3J0IGNsYXNzIE1haW4ge1xuICBwcml2YXRlIHdhdGNoZXI6IGNob2tpZGFyLkZTV2F0Y2hlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjdXJyZW50UXVldWU6IFRhc2tRdWV1ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRzY09wdGlvbnM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29weWZpbGVzPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdHNjb25maWdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdERpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG91dERpcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGluY2x1ZGU6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1haW5PcHRpb25zLCB0c2NPcHRpb25zOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHsgcmVtb3ZlLCBjb3B5ZmlsZXMsIGV4ZWMsIHByb2plY3QgfSA9IG9wdGlvbnM7IC8vIHN0cmlwIG9wdGlvbnMgd2hpY2ggYXJlIG5vdCBwYXNzZWQgdG8gdHNjXG4gICAgdGhpcy50c2NPcHRpb25zID0gdHNjT3B0aW9ucztcbiAgICBpZiAocmVtb3ZlKSB0aGlzLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBpZiAoY29weWZpbGVzKSB0aGlzLmNvcHlmaWxlcyA9IGNvcHlmaWxlcztcbiAgICBpZiAoZXhlYykgdGhpcy5leGVjID0gZXhlYztcblxuICAgIHRoaXMudHNjb25maWdQYXRoID0gZ2V0VHNDb25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHRzY29uZmlnID0gZ2V0VHNDb25maWcodGhpcy50c2NvbmZpZ1BhdGgpO1xuICAgIHRoaXMucm9vdERpciA9IGdldFJvb3REaXIodHNjb25maWcpO1xuICAgIHRoaXMub3V0RGlyID0gZ2V0T3V0RGlyKHRzY29uZmlnKTtcbiAgICB0aGlzLmluY2x1ZGUgPSBnZXRJbmNsdWRlKHRzY29uZmlnKTtcblxuICAgIGlmIChcbiAgICAgICh0c2NPcHRpb25zLmluY2x1ZGVzKFwiLS1ub0VtaXRcIikgfHwgdHNjb25maWcuY29tcGlsZXJPcHRpb25zPy5ub0VtaXQpICYmXG4gICAgICB0aGlzLmNvcHlmaWxlc1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnXCItLWNvcHlmaWxlc1wiIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gXCItLW5vRW1pdFwiIGlzIHNldCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhdGNoKCkge1xuICAgIGlmICghdGhpcy5vdXREaXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImBvdXREaXJgIGluIHRzY29uZmlnIGlzIHJlcXVpcmVkIGZvciB3YXRjaCBtb2RlXCIpO1xuICAgIH1cbiAgICAvLyBUT0RPOiBSZXRoaW5raW5nIHRoZSB3YXRjaCBmaWxlcy4gRWFjaCBvZiB0aGVtIGJlbG93IGlzIHJlYXNvbmFibGUuIFNjb3BlOiBgcHJvY2Vzcy5jd2QoKWAgPj0gYHJvb3REaXJgID49IGBpbmNsdWRlYC5cbiAgICAvLyAxLiBXYXRjaCB0aGUgYGluY2x1ZGVgLlxuICAgIC8vIDIuIFdhdGNoIHRoZSBgcHJvY2Vzcy5jd2QoKWAuXG4gICAgLy8gMy4gV2F0Y2ggdGhlIGByb290RGlyYC4gRGVmaW5pdGVseSwgYHJvb3REaXJgIGlzIG5vdCBhIGdvb2QgaWRlYSBhcyBpdCBtYXkgY2hhbmdlIHRvIGFub3RoZXIgZGlyZWN0b3J5IHdoZW4gdHMgZmlsZSBpcyBhZGRlZCBvciBkZWxldGVkLlxuICAgIHRoaXMud2F0Y2hlciA9IGNob2tpZGFyXG4gICAgICAud2F0Y2godGhpcy5pbmNsdWRlLCB7XG4gICAgICAgIGlnbm9yZWQ6IFtcbiAgICAgICAgICBcIioqL25vZGVfbW9kdWxlcy8qKlwiLFxuICAgICAgICAgIFwiKiovLmdpdC8qKlwiLFxuICAgICAgICAgIHRoaXMub3V0RGlyLFxuICAgICAgICAgIHRoaXMudHNjb25maWdQYXRoLFxuICAgICAgICBdLFxuICAgICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5vbihcInJlYWR5XCIsICgpID0+IHRoaXMucmVzdGFydFF1ZXVlKCkpXG4gICAgICAub24oXCJhZGRcIiwgKCkgPT4gdGhpcy5yZXN0YXJ0UXVldWUoKSlcbiAgICAgIC5vbihcInVubGlua1wiLCAoKSA9PiB0aGlzLnJlc3RhcnRRdWV1ZSgpKVxuICAgICAgLm9uKFwiY2hhbmdlXCIsICgpID0+IHRoaXMucmVzdGFydFF1ZXVlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0YXJ0UXVldWUoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRRdWV1ZT8uaXNSdW5uaW5nKCkpIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXVlID0gdGhpcy5uZXdRdWV1ZSgpLnN0YXJ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXVlLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWV1ZSA9IHRoaXMubmV3UXVldWUoKS5zdGFydCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmN1cnJlbnRRdWV1ZS5zdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY29tcGlsZSgpIHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50UXVldWUgPSB0aGlzLm5ld1F1ZXVlKClcbiAgICAgICAgLm9uKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoY29kZSA/PyAoc2lnbmFsID8gMTI4ICsgb3MuY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXSA6IDApKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXJ0KCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdG9wKCkge1xuICAgIC8vIEFmdGVyIHRoZSB3YXRjaGVyIGlzIGNsb3NlZCwgcmVzdGFydFF1ZXVlIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgIGF3YWl0IHRoaXMud2F0Y2hlcj8uY2xvc2UoKTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRRdWV1ZT8uaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgcmVzb2x2ZSgwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFF1ZXVlXG4gICAgICAgICAgLm9uKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShjb2RlID8/IChzaWduYWwgPyAxMjggKyBvcy5jb25zdGFudHMuc2lnbmFsc1tzaWduYWxdIDogMCkpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbmV3UXVldWUoKSB7XG4gICAgbGV0IHJlbW92ZUNvbmZpZzogVGFza1F1ZXVlT3B0aW9uc1tcInJlbW92ZUNvbmZpZ1wiXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgY29weWZpbGVzQ29uZmlnOiBUYXNrUXVldWVPcHRpb25zW1wiY29weWZpbGVzQ29uZmlnXCJdIHwgdW5kZWZpbmVkID1cbiAgICAgIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5yZW1vdmUpIHtcbiAgICAgIGlmICghdGhpcy5vdXREaXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiYG91dERpcmAgaXMgcmVxdWlyZWQgaW4gdHNjb25maWcgdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIG91dHB1dFwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmVtb3ZlQ29uZmlnID0geyBmaWxlcGF0aDogdGhpcy5vdXREaXIgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29weWZpbGVzKSB7XG4gICAgICBpZiAoIXRoaXMub3V0RGlyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcImBvdXREaXJgIGlzIHJlcXVpcmVkIGluIHRzY29uZmlnIHRvIGNvcHkgbm9uLWpzIGZpbGVzIHRvIGNvbXBpbGF0aW9uIG91dHB1dGBcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvcHlmaWxlc0NvbmZpZyA9IHtcbiAgICAgICAgcm9vdERpcjogdGhpcy5yb290RGlyLFxuICAgICAgICBvdXREaXI6IHRoaXMub3V0RGlyLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUYXNrUXVldWUoe1xuICAgICAgdHNjQ29uZmlnOiB0aGlzLnRzY09wdGlvbnMsXG4gICAgICAuLi4ocmVtb3ZlQ29uZmlnID8geyByZW1vdmVDb25maWcgfSA6IHt9KSxcbiAgICAgIC4uLihjb3B5ZmlsZXNDb25maWcgPyB7IGNvcHlmaWxlc0NvbmZpZyB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuZXhlYyA/IHsgZXhlY0NvbmZpZzogeyBmaWxlcGF0aDogdGhpcy5leGVjIH0gfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxufVxuIl19