@rnm/tscx
Version:
A tsc wrapper with many convenient features.
80 lines • 9.95 kB
JavaScript
// this file should not have `async` and `await`
import path from "node:path";
import process from "node:process";
import chokidar, {} from "chokidar";
import { Compiler } from "./compiler.js";
export class Action {
options;
lastUpdateTsconfigTime = Date.now();
compiler;
watcher;
constructor(options) {
this.options = options;
const { watch, ...compilerOptions } = options;
this.compiler = new Compiler(compilerOptions);
}
watch(paths) {
this.watcher = chokidar
.watch(paths, {
ignored: [
"**/node_modules/**",
"**/.git/**",
this.compiler.getOutDir(),
],
ignoreInitial: true,
})
.on("add", (filepath) => this.cb(filepath))
.on("unlink", (filepath) => this.cb(filepath))
.on("change", (filepath) => this.cb(filepath))
.on("ready", () => this.cb());
}
setupWatcher() {
const include = this.compiler.getInclude() ?? [];
const watchFiles = include.length <= 0
? [process.cwd()]
: include
.map((i) => path.resolve(process.cwd(), i))
.concat(path.resolve(process.cwd(), this.options.project));
if (this.watcher) {
// If this method throw an error (I mean the promise rejected), the process will exit with non-zero code.
// See https://github.com/zanminkian/zanminkian.github.io/issues/54
this.watcher.close().then(() => this.watch(watchFiles), (e) => {
throw new Error("Close watcher fail!", { cause: e });
});
}
else {
this.watch(watchFiles);
}
}
cb(filepath) {
console.log("File changes detected", filepath);
// user edit non-tsconfig files
if (!filepath ||
path.resolve(process.cwd(), filepath) !==
path.resolve(process.cwd(), this.options.project)) {
return this.compiler.compile();
}
// user edit tsconfig file
const now = Date.now();
if (now - this.lastUpdateTsconfigTime < 1000) {
return;
}
try {
this.compiler.refreshTsConfig();
}
catch (e) {
console.warn("Refresh ts config fail. You can ignore this small warning.", e);
return;
}
this.setupWatcher();
this.lastUpdateTsconfigTime = now;
}
start() {
if (!this.options.watch) {
this.compiler.compile();
return;
}
this.setupWatcher();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnREFBZ0Q7QUFDaEQsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLFFBQVEsRUFBRSxFQUFrQixNQUFNLFVBQVUsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUF3QixNQUFNLGVBQWUsQ0FBQztBQU0vRCxNQUFNLE9BQU8sTUFBTTtJQUtZO0lBSnJCLHNCQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUUzQixRQUFRLENBQUM7SUFDbEIsT0FBTyxDQUFhO0lBQzVCLFlBQTZCLE9BQW9CO1FBQXBCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDL0MsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxLQUFLLENBQUMsS0FBZTtRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVE7YUFDcEIsS0FBSyxDQUFDLEtBQUssRUFBRTtZQUNaLE9BQU8sRUFBRTtnQkFDUCxvQkFBb0I7Z0JBQ3BCLFlBQVk7Z0JBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7YUFDMUI7WUFDRCxhQUFhLEVBQUUsSUFBSTtTQUNwQixDQUFDO2FBQ0QsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMxQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzdDLEVBQUUs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cyBmaWxlIHNob3VsZCBub3QgaGF2ZSBgYXN5bmNgIGFuZCBgYXdhaXRgXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5pbXBvcnQgY2hva2lkYXIsIHsgdHlwZSBGU1dhdGNoZXIgfSBmcm9tIFwiY2hva2lkYXJcIjtcbmltcG9ydCB7IENvbXBpbGVyLCB0eXBlIENvbXBpbGVyT3B0aW9ucyB9IGZyb20gXCIuL2NvbXBpbGVyLnRzXCI7XG5cbmludGVyZmFjZSBUc2N4T3B0aW9ucyBleHRlbmRzIENvbXBpbGVyT3B0aW9ucyB7XG4gIHdhdGNoOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uIHtcbiAgcHJpdmF0ZSBsYXN0VXBkYXRlVHNjb25maWdUaW1lID0gRGF0ZS5ub3coKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBpbGVyO1xuICBwcml2YXRlIHdhdGNoZXI/OiBGU1dhdGNoZXI7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogVHNjeE9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHdhdGNoLCAuLi5jb21waWxlck9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gICAgdGhpcy5jb21waWxlciA9IG5ldyBDb21waWxlcihjb21waWxlck9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaChwYXRoczogc3RyaW5nW10pIHtcbiAgICB0aGlzLndhdGNoZXIgPSBjaG9raWRhclxuICAgICAgLndhdGNoKHBhdGhzLCB7XG4gICAgICAgIGlnbm9yZWQ6IFtcbiAgICAgICAgICBcIioqL25vZGVfbW9kdWxlcy8qKlwiLFxuICAgICAgICAgIFwiKiovLmdpdC8qKlwiLFxuICAgICAgICAgIHRoaXMuY29tcGlsZXIuZ2V0T3V0RGlyKCksXG4gICAgICAgIF0sXG4gICAgICAgIGlnbm9yZUluaXRpYWw6IHRydWUsXG4gICAgICB9KVxuICAgICAgLm9uKFwiYWRkXCIsIChmaWxlcGF0aCkgPT4gdGhpcy5jYihmaWxlcGF0aCkpXG4gICAgICAub24oXCJ1bmxpbmtcIiwgKGZpbGVwYXRoKSA9PiB0aGlzLmNiKGZpbGVwYXRoKSlcbiAgICAgIC5vbihcImNoYW5nZVwiLCAoZmlsZXBhdGgpID0+IHRoaXMuY2IoZmlsZXBhdGgpKVxuICAgICAgLm9uKFwicmVhZHlcIiwgKCkgPT4gdGhpcy5jYigpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBXYXRjaGVyKCkge1xuICAgIGNvbnN0IGluY2x1ZGUgPSB0aGlzLmNvbXBpbGVyLmdldEluY2x1ZGUoKSA/PyBbXTtcbiAgICBjb25zdCB3YXRjaEZpbGVzID1cbiAgICAgIGluY2x1ZGUubGVuZ3RoIDw9IDBcbiAgICAgICAgPyBbcHJvY2Vzcy5jd2QoKV1cbiAgICAgICAgOiBpbmNsdWRlXG4gICAgICAgICAgICAubWFwKChpKSA9PiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgaSkpXG4gICAgICAgICAgICAuY29uY2F0KHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCB0aGlzLm9wdGlvbnMucHJvamVjdCkpO1xuXG4gICAgaWYgKHRoaXMud2F0Y2hlcikge1xuICAgICAgLy8gSWYgdGhpcyBtZXRob2QgdGhyb3cgYW4gZXJyb3IgKEkgbWVhbiB0aGUgcHJvbWlzZSByZWplY3RlZCksIHRoZSBwcm9jZXNzIHdpbGwgZXhpdCB3aXRoIG5vbi16ZXJvIGNvZGUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3phbm1pbmtpYW4vemFubWlua2lhbi5naXRodWIuaW8vaXNzdWVzLzU0XG4gICAgICB0aGlzLndhdGNoZXIuY2xvc2UoKS50aGVuKFxuICAgICAgICAoKSA9PiB0aGlzLndhdGNoKHdhdGNoRmlsZXMpLFxuICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsb3NlIHdhdGNoZXIgZmFpbCFcIiwgeyBjYXVzZTogZSB9KTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud2F0Y2god2F0Y2hGaWxlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYihmaWxlcGF0aD86IHN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKFwiRmlsZSBjaGFuZ2VzIGRldGVjdGVkXCIsIGZpbGVwYXRoKTtcbiAgICAvLyB1c2VyIGVkaXQgbm9uLXRzY29uZmlnIGZpbGVzXG4gICAgaWYgKFxuICAgICAgIWZpbGVwYXRoIHx8XG4gICAgICBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZmlsZXBhdGgpICE9PVxuICAgICAgICBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5vcHRpb25zLnByb2plY3QpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21waWxlci5jb21waWxlKCk7XG4gICAgfVxuXG4gICAgLy8gdXNlciBlZGl0IHRzY29uZmlnIGZpbGVcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmIChub3cgLSB0aGlzLmxhc3RVcGRhdGVUc2NvbmZpZ1RpbWUgPCAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbXBpbGVyLnJlZnJlc2hUc0NvbmZpZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJSZWZyZXNoIHRzIGNvbmZpZyBmYWlsLiBZb3UgY2FuIGlnbm9yZSB0aGlzIHNtYWxsIHdhcm5pbmcuXCIsXG4gICAgICAgIGUsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldHVwV2F0Y2hlcigpO1xuICAgIHRoaXMubGFzdFVwZGF0ZVRzY29uZmlnVGltZSA9IG5vdztcbiAgfVxuXG4gIHN0YXJ0KCkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLndhdGNoKSB7XG4gICAgICB0aGlzLmNvbXBpbGVyLmNvbXBpbGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldHVwV2F0Y2hlcigpO1xuICB9XG59XG4iXX0=