UNPKG

@rnm/tscx

Version:

A tsc wrapper with many convenient features.

135 lines 18.2 kB
// 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29tcGlsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0RBQWdEO0FBQ2hELE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFbkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWlCdEUsTUFBTSxPQUFPLFFBQVE7SUFPVTtJQU5yQixFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ1IsaUJBQWlCLENBQTZCO0lBQzlDLFFBQVEsQ0FBVztJQUNuQixPQUFPLENBQVM7SUFDaEIsTUFBTSxDQUFTO0lBRXZCLFlBQTZCLE9BQXdCO1FBQXhCLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ25ELGlCQUFpQjtRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0UsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFYixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFFBQVE7UUFDZCxNQUFNLEVBQ0osT0FBTyxFQUNQLE1BQU0sRUFBRSxFQUFFLEVBQ1YsU0FBUyxFQUFFLEVBQUUsRUFDYixNQUFNLEVBQUUsR0FBRyxFQUNYLElBQUksRUFBRSxFQUFFLEVBQ1IsR0FBRyxNQUFNLEVBQ1YsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ2pCLE9BQU87WUFDTCxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRU8sU0FBUyxDQUFDLEVBQVU7UUFDMUIsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ25DLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNsRCxzRUFBc0U7Z0JBQ3RFLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNuQixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUNGLFlBQVksRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLFdBQVc7UUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDMUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUNiLGNBQWMsRUFDZCxZQUFZLEVBQ1osS0FBSyxFQUNMLEtBQUssQ0FDTixDQUFDO1FBQ0YsTUFBTSxHQUFHLEdBQUcsUUFBUSxPQUFPLDJCQUEyQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdFLE1BQU0sTUFBTSxHQUFhLElBQUksQ0FBQyxLQUFLLENBQ2pDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUM1QyxDQUFDO1FBQ0YsSUFDRSxDQUFDLE1BQU0sQ0FBQyxlQUFlO1lBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQy9DLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNELElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2IscUVBQXFFLENBQ3RFLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDO1FBQ3ZELE9BQU8sT0FBTztZQUNaLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLENBQUM7WUFDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ1YsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUNiLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FDbEQsQ0FBQztJQUNSLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssaUJBQWlCLENBQUMsS0FBZTtRQUN2QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYiwrREFBK0QsQ0FDaEUsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLO2FBQ2pCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hELE1BQU0sQ0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztZQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMzQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUNsQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRoaXMgZmlsZSBzaG91bGQgbm90IGhhdmUgYGFzeW5jYCBhbmQgYGF3YWl0YFxuaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5pbXBvcnQgdHlwZSB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgY29weWZpbGVzLCBleGVjLCByZW1vdmUsIHNjcmlwdCwgdHNjIH0gZnJvbSBcIi4vY21kL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZXJPcHRpb25zIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbj4ge1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIHJlbW92ZTogYm9vbGVhbjtcbiAgY29weWZpbGVzOiBib29sZWFuO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIGV4ZWM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHNDb25maWcge1xuICBjb21waWxlck9wdGlvbnM/OiB0cy5Db21waWxlck9wdGlvbnM7XG4gIGluY2x1ZGU/OiBzdHJpbmdbXTtcbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xuICBmaWxlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tcGlsZXIge1xuICBwcml2YXRlIGlkID0gXCJcIjtcbiAgcHJpdmF0ZSBjdXJyZW50U3VicHJvY2Vzcz86IGNoaWxkUHJvY2Vzcy5DaGlsZFByb2Nlc3M7XG4gIHByaXZhdGUgdHNjb25maWc6IFRzQ29uZmlnO1xuICBwcml2YXRlIHJvb3REaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBvdXREaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IENvbXBpbGVyT3B0aW9ucykge1xuICAgIC8vIHNldHVwIHRzY29uZmlnXG4gICAgdGhpcy50c2NvbmZpZyA9IHRoaXMuZ2V0VHNDb25maWcoKTtcbiAgICB0aGlzLnJvb3REaXIgPSB0aGlzLmdldFJvb3REaXIoKTtcbiAgICB0aGlzLm91dERpciA9IHRoaXMuZ2V0T3V0RGlyKCk7XG4gIH1cblxuICBjb21waWxlKCkge1xuICAgIGNvbnN0IGlkID0gYCR7RGF0ZS5ub3coKS50b1N0cmluZygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XG4gICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTdWJwcm9jZXNzKSB7XG4gICAgICB0aGlzLmV4ZWNUYXNrcyhpZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5jdXJyZW50U3VicHJvY2Vzcy5leGl0Q29kZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdGhpcy5leGVjVGFza3MoaWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY3VycmVudFN1YnByb2Nlc3Mua2lsbGVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdWJwcm9jZXNzLmtpbGwoKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50U3VicHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICB0aGlzLmN1cnJlbnRTdWJwcm9jZXNzLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5leGVjVGFza3MoaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYXNrcygpOiBBcnJheTwoKSA9PiBjaGlsZFByb2Nlc3MuQ2hpbGRQcm9jZXNzPiB7XG4gICAgY29uc3Qge1xuICAgICAgcHJvamVjdCxcbiAgICAgIHJlbW92ZTogcm0sXG4gICAgICBjb3B5ZmlsZXM6IGNwLFxuICAgICAgc2NyaXB0OiBzY3IsXG4gICAgICBleGVjOiBleCxcbiAgICAgIC4uLm90aGVyc1xuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihybSA/IFsoKSA9PiByZW1vdmUodGhpcy5vdXREaXIpXSA6IFtdKSxcbiAgICAgICgpID0+IHRzYyh7IHByb2plY3QsIC4uLm90aGVycyB9KSxcbiAgICAgIC4uLihjcCA/IFsoKSA9PiBjb3B5ZmlsZXModGhpcy5yb290RGlyLCB0aGlzLm91dERpcildIDogW10pLFxuICAgICAgLi4uKHNjciA/IFsoKSA9PiBzY3JpcHQoc2NyKV0gOiBbXSksXG4gICAgICAuLi4oZXggPyBbKCkgPT4gZXhlYyhleCldIDogW10pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGV4ZWNUYXNrcyhpZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaWQgIT09IGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFza3MgPSB0aGlzLmdldFRhc2tzKCk7XG4gICAgY29uc3QgZXhlY05leHRUYXNrID0gKGluZGV4ID0gMCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFRhc2sgPSB0YXNrc1tpbmRleF07XG4gICAgICBpZiAoIWN1cnJlbnRUYXNrIHx8IHRoaXMuaWQgIT09IGlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudFN1YnByb2Nlc3MgPSBjdXJyZW50VGFzaygpO1xuICAgICAgdGhpcy5jdXJyZW50U3VicHJvY2Vzcy5vbihcImNsb3NlXCIsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgLy8gbWFudWFsbHkgZXhpdGluZyBvciB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aWxsIG5vdCBleGVjdXRlIG5leHQgdGFza1xuICAgICAgICBpZiAoY29kZSB8fCBzaWduYWwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXhlY05leHRUYXNrKGluZGV4ICsgMSk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGV4ZWNOZXh0VGFzaygpO1xuICB9XG5cbiAgcmVmcmVzaFRzQ29uZmlnKCkge1xuICAgIHRoaXMudHNjb25maWcgPSB0aGlzLmdldFRzQ29uZmlnKCk7XG4gICAgdGhpcy5yb290RGlyID0gdGhpcy5nZXRSb290RGlyKCk7XG4gICAgdGhpcy5vdXREaXIgPSB0aGlzLmdldE91dERpcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUc0NvbmZpZygpOiBUc0NvbmZpZyB7XG4gICAgY29uc3QgdHNjUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgXCJ0eXBlc2NyaXB0XCIsXG4gICAgICBcImJpblwiLFxuICAgICAgXCJ0c2NcIixcbiAgICApO1xuICAgIGNvbnN0IGNtZCA9IGBub2RlICR7dHNjUGF0aH0gLS1zaG93Q29uZmlnIC0tcHJvamVjdCAke3RoaXMub3B0aW9ucy5wcm9qZWN0fWA7XG4gICAgY29uc3QgY29uZmlnOiBUc0NvbmZpZyA9IEpTT04ucGFyc2UoXG4gICAgICBjaGlsZFByb2Nlc3MuZXhlY1N5bmMoY21kKS50b1N0cmluZyhcInV0ZjhcIiksXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICAhY29uZmlnLmNvbXBpbGVyT3B0aW9ucyB8fFxuICAgICAgT2JqZWN0LmtleXMoY29uZmlnLmNvbXBpbGVyT3B0aW9ucykubGVuZ3RoIDw9IDBcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRzY29uZmlnLmNvbXBpbGVyT3B0aW9ucyBpcyBlbXB0eSFcIik7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBnZXRJbmNsdWRlKCkge1xuICAgIHJldHVybiB0aGlzLnRzY29uZmlnLmluY2x1ZGU7XG4gIH1cblxuICBnZXRPdXREaXIoKSB7XG4gICAgY29uc3Qgb3V0RGlyID0gdGhpcy50c2NvbmZpZy5jb21waWxlck9wdGlvbnM/Lm91dERpcjtcbiAgICBpZiAoIW91dERpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIm91dERpclwiIGlzIG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICBjb25zdCBhYnNvbHV0ZU91dERpciA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvdXREaXIpO1xuICAgIGlmIChwcm9jZXNzLmN3ZCgpLnN0YXJ0c1dpdGgoYWJzb2x1dGVPdXREaXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdcIm91dERpclwiIGluIHRzY29uZmlnLmpzb24gc2hvdWxkIG5vdCBiZSBjdXJyZW50IG9yIHBhcmVudCBkaXJlY3RvcnknLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFic29sdXRlT3V0RGlyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSb290RGlyKCkge1xuICAgIGNvbnN0IHJvb3REaXIgPSB0aGlzLnRzY29uZmlnLmNvbXBpbGVyT3B0aW9ucz8ucm9vdERpcjtcbiAgICByZXR1cm4gcm9vdERpclxuICAgICAgPyBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcm9vdERpcilcbiAgICAgIDogcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgdGhpcy5nZXRSb290RGlyQnlGaWxlcyh0aGlzLnRzY29uZmlnLmZpbGVzID8/IFtdKSxcbiAgICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgY29tbW9uIGRpci4gaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL3RzY29uZmlnI3Jvb3REaXJcbiAgICogQHBhcmFtIGZpbGVzIGZpbGUgcGF0aHMgbGlrZSBbJy4vc3JjL2luZGV4LnRzJywgJy4vaW5kZXgudHMnXVxuICAgKiBAcmV0dXJucyBhYnNvbHV0ZSBwYXRoXG4gICAqL1xuICBwcml2YXRlIGdldFJvb3REaXJCeUZpbGVzKGZpbGVzOiBzdHJpbmdbXSkge1xuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgZ2V0IHRoZSBsb25nZXN0IGNvbW1vbiBkaXIgd2hlbiB0aGUgYXJndW1lbnRzIGlzIGVtcHR5XCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiBmaWxlLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMSkpXG4gICAgICAucmVkdWNlPHN0cmluZ1tdPigocHJldiwgaXRlbSkgPT4ge1xuICAgICAgICBpZiAocHJldi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5sZW5ndGggJiYgaSA8IGl0ZW0ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBzdWIgPSBwcmV2W2ldO1xuICAgICAgICAgIGlmIChzdWIgJiYgc3ViID09PSBpdGVtW2ldKSB7XG4gICAgICAgICAgICByZXN1bHRbaV0gPSBzdWI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIHBhdGguam9pbiguLi5mb2xkZXIpO1xuICB9XG59XG4iXX0=