@riddance/env
Version:
Too much code slows you down, creates risks, increases maintainability burdens, confuses AI. So let's commit less of it.
188 lines • 29.1 kB
JavaScript
// eslint-disable-next-line no-restricted-imports
import fs from 'node:fs';
import { join, relative, sep } from 'node:path';
import ts from 'typescript';
import { reportDiagnostic } from '../../lib/compiler.js';
import { isFileNotFound } from '../../lib/fs.js';
export function watch(reporter, path, isOutput, filesChanged) {
let abortController = new AbortController();
const watchFile = ts.sys.watchFile?.bind(ts.sys);
if (!watchFile) {
throw new Error('watchFile missing from typescript sys');
}
const nopWatcher = {
close: () => {
// Nothing to do
},
};
let latestOutputs = [];
const watchers = [
...[
'package.json',
'package-lock.json',
'dictionary.txt',
'test/env.txt',
'example/package.json',
'example/package-lock.json',
'example/test/env.txt',
].map(file => watchFile(file, (name, kind, time) => {
reportWatchEvent(reporter, relative(path, name), time, kind);
abortController.abort();
abortController = new AbortController();
filesChanged(true, false, [file], latestOutputs, abortController.signal).catch((e) => {
if (e.code === 'ABORT_ERR') {
return;
}
console.error('Error handling file change:');
console.error(e);
});
}, 500)),
...['test/data', 'example/test/data'].map(p => {
try {
return fs.watch(p, { recursive: true }, (kind, name) => {
if (!name) {
console.error('Null file changed.');
return;
}
if (name.endsWith('.js') ||
name.endsWith('.d.ts') ||
name.endsWith('/package-lock.json') ||
name.includes('/node_modules/')) {
return;
}
const file = join(p, name);
reportWatchEvent(reporter, file, new Date(), kind);
abortController.abort();
abortController = new AbortController();
filesChanged(true, false, [file], latestOutputs, abortController.signal).catch((e) => {
if (e.code === 'ABORT_ERR') {
return;
}
console.error('Error handling file change:');
console.error(e);
});
});
}
catch (e) {
if (isFileNotFound(e)) {
return nopWatcher;
}
throw e;
}
}),
];
const host = ts.createWatchCompilerHost('tsconfig.json', {
listEmittedFiles: true,
}, ts.sys, undefined, undefined, d => {
reporter.status(typeof d.messageText === 'string' ? d.messageText : d.messageText.messageText);
}, {
excludeDirectories: ['.git', '**/test/results'],
excludeFiles: ['*.js', '*.d.ts', '.timestamps.json'],
});
const ignoreFile = sep === '/'
? (file) => file.includes('/node_modules/') ||
file.endsWith('/package.json') ||
file.endsWith('test/env.txt')
: (file) => file.includes('/node_modules/') ||
file.includes(`${sep}node_modules${sep}`) ||
file.endsWith('/package.json') ||
file.endsWith(`${sep}package.json`) ||
file.endsWith('test/env.txt') ||
file.endsWith(`test${sep}env.txt`);
const wf = host.watchFile.bind(host);
host.watchFile = (file, callback, interval, options) => {
if (ignoreFile(file)) {
return nopWatcher;
}
return wf(file, (name, kind, time) => {
const rel = relative(path, name);
if (isOutput(rel)) {
return;
}
reportWatchEvent(reporter, rel, time, kind);
callback(name, kind, time);
}, interval, options);
};
const ignoreDirectory = sep === '/'
? (file) => file.includes('/node_modules')
: (file) => file.includes('/node_modules') || file.includes(`${sep}node_modules`);
const wd = host.watchDirectory.bind(host);
host.watchDirectory = (directory, callback, recursive, options) => {
if (ignoreDirectory(directory)) {
return nopWatcher;
}
return wd(path, name => {
const rel = relative(path, name);
if (isOutput(rel)) {
return;
}
reporter.status(`💾 ${new Date().toLocaleTimeString()} - ${rel} in ${relative(path, directory)} changed`);
callback(name);
}, recursive, options);
};
const dir = process.cwd();
host.afterProgramCreate = programBuilder => {
const program = programBuilder.getProgram();
const diagnostics = ts.getPreEmitDiagnostics(program);
if (diagnostics.length === 1 && diagnostics[0]?.code === 18_003) {
reporter.status('Add .ts files to get started 🚀');
return;
}
diagnostics.forEach(reportDiagnostic(reporter));
const emitResult = program.emit();
emitResult.diagnostics.forEach(reportDiagnostic(reporter));
if (emitResult.diagnostics.length !== 0 || emitResult.emitSkipped) {
return;
}
abortController.abort();
abortController = new AbortController();
const outputs = emitResult.emittedFiles?.map(file => relative(dir, file));
if (outputs) {
latestOutputs = outputs;
}
else {
console.log('no outputs');
}
filesChanged(diagnostics.length === 0, diagnostics.length !== 0 && diagnostics.every(d => d.code === 6053), programBuilder.getSourceFiles().map(sf => relative(dir, sf.fileName)), outputs, abortController.signal).catch((e) => {
if (e.code === 'ABORT_ERR') {
return;
}
console.error('Error handling file changes:');
console.error(e);
});
};
const watcher = ts.createWatchProgram(host);
const emitResult = watcher.getProgram().emit();
const outputs = emitResult.emittedFiles?.map(file => relative(dir, file));
if (outputs) {
latestOutputs = outputs;
}
else {
console.log('no outputs');
}
return {
close: () => {
watchers.forEach(w => {
w.close();
});
watcher.close();
abortController.abort();
},
};
}
function reportWatchEvent(reporter, file, time, kind) {
reporter.status(`💾 ${(time ?? new Date()).toLocaleTimeString()} - ${file} ${(() => {
switch (kind) {
case ts.FileWatcherEventKind.Created:
return 'created';
case 'change':
case ts.FileWatcherEventKind.Changed:
return 'saved';
case ts.FileWatcherEventKind.Deleted:
return 'deleted';
case 'rename':
return 'renamed';
}
})()}`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpREFBaUQ7QUFDakQsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMvQyxPQUFPLEVBQWlDLE1BQU0sWUFBWSxDQUFBO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUdoRCxNQUFNLFVBQVUsS0FBSyxDQUNqQixRQUFrQixFQUNsQixJQUFZLEVBQ1osUUFBbUMsRUFDbkMsWUFNa0I7SUFFbEIsSUFBSSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQTtJQUMzQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUc7UUFDZixLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQ1IsZ0JBQWdCO1FBQ3BCLENBQUM7S0FDSixDQUFBO0lBQ0QsSUFBSSxhQUFhLEdBQWEsRUFBRSxDQUFBO0lBQ2hDLE1BQU0sUUFBUSxHQUE0QjtRQUN0QyxHQUFHO1lBQ0MsY0FBYztZQUNkLG1CQUFtQjtZQUNuQixnQkFBZ0I7WUFDaEIsY0FBYztZQUNkLHNCQUFzQjtZQUN0QiwyQkFBMkI7WUFDM0Isc0JBQXNCO1NBQ3pCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ1QsU0FBUyxDQUNMLElBQUksRUFDSixDQUFDLElBQUksRUFB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QixDQUFDLE9BQU87Z0JBQ2hDLE9BQU8sU0FBUyxDQUFBO1lBQ3BCLEtBQUssUUFBUTtnQkFDVCxPQUFPLFNBQVMsQ0FBQTtRQUN4QixDQUFDO0lBQ0wsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNULENBQUE7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBqb2luLCByZWxhdGl2ZSwgc2VwIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHRzLCB7IHR5cGUgRmlsZVdhdGNoZXJFdmVudEtpbmQgfSBmcm9tICd0eXBlc2NyaXB0J1xuaW1wb3J0IHsgcmVwb3J0RGlhZ25vc3RpYyB9IGZyb20gJy4uLy4uL2xpYi9jb21waWxlci5qcydcbmltcG9ydCB7IGlzRmlsZU5vdEZvdW5kIH0gZnJvbSAnLi4vLi4vbGliL2ZzLmpzJ1xuaW1wb3J0IHR5cGUgeyBSZXBvcnRlciB9IGZyb20gJy4uLy4uL2xpYi9yZXBvcnRlci5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoKFxuICAgIHJlcG9ydGVyOiBSZXBvcnRlcixcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgaXNPdXRwdXQ6IChmaWxlOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4gICAgZmlsZXNDaGFuZ2VkOiAoXG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgIGludGVybmFsRXJyb3I6IGJvb2xlYW4sXG4gICAgICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdLFxuICAgICAgICBvdXRwdXRGaWxlczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogeyBjbG9zZTogKCkgPT4gdm9pZCB9IHtcbiAgICBsZXQgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3Qgd2F0Y2hGaWxlID0gdHMuc3lzLndhdGNoRmlsZT8uYmluZCh0cy5zeXMpXG4gICAgaWYgKCF3YXRjaEZpbGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YXRjaEZpbGUgbWlzc2luZyBmcm9tIHR5cGVzY3JpcHQgc3lzJylcbiAgICB9XG4gICAgY29uc3Qgbm9wV2F0Y2hlciA9IHtcbiAgICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG9cbiAgICAgICAgfSxcbiAgICB9XG4gICAgbGV0IGxhdGVzdE91dHB1dHM6IHN0cmluZ1tdID0gW11cbiAgICBjb25zdCB3YXRjaGVyczogeyBjbG9zZTogKCkgPT4gdm9pZCB9W10gPSBbXG4gICAgICAgIC4uLltcbiAgICAgICAgICAgICdwYWNrYWdlLmpzb24nLFxuICAgICAgICAgICAgJ3BhY2thZ2UtbG9jay5qc29uJyxcbiAgICAgICAgICAgICdkaWN0aW9uYXJ5LnR4dCcsXG4gICAgICAgICAgICAndGVzdC9lbnYudHh0JyxcbiAgICAgICAgICAgICdleGFtcGxlL3BhY2thZ2UuanNvbicsXG4gICAgICAgICAgICAnZXhhbXBsZS9wYWNrYWdlLWxvY2suanNvbicsXG4gICAgICAgICAgICAnZXhhbXBsZS90ZXN0L2Vudi50eHQnLFxuICAgICAgICBdLm1hcChmaWxlID0+XG4gICAgICAgICAgICB3YXRjaEZpbGUoXG4gICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAobmFtZSwga2luZCwgdGltZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRXYXRjaEV2ZW50KHJlcG9ydGVyLCByZWxhdGl2ZShwYXRoLCBuYW1lKSwgdGltZSwga2luZClcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KClcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzQ2hhbmdlZCh0cnVlLCBmYWxzZSwgW2ZpbGVdLCBsYXRlc3RPdXRwdXRzLCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsKS5jYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlIGFzIHsgY29kZTogdW5rbm93biB9KS5jb2RlID09PSAnQUJPUlRfRVJSJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaGFuZGxpbmcgZmlsZSBjaGFuZ2U6JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICA1MDAsXG4gICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgICAuLi5bJ3Rlc3QvZGF0YScsICdleGFtcGxlL3Rlc3QvZGF0YSddLm1hcChwID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZzLndhdGNoKHAsIHsgcmVjdXJzaXZlOiB0cnVlIH0sIChraW5kLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTnVsbCBmaWxlIGNoYW5nZWQuJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuZW5kc1dpdGgoJy5qcycpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmVuZHNXaXRoKCcuZC50cycpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmVuZHNXaXRoKCcvcGFja2FnZS1sb2NrLmpzb24nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBqb2luKHAsIG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFdhdGNoRXZlbnQocmVwb3J0ZXIsIGZpbGUsIG5ldyBEYXRlKCksIGtpbmQpXG4gICAgICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpXG4gICAgICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgICAgICAgICAgICAgICBmaWxlc0NoYW5nZWQodHJ1ZSwgZmFsc2UsIFtmaWxlXSwgbGF0ZXN0T3V0cHV0cywgYWJvcnRDb250cm9sbGVyLnNpZ25hbCkuY2F0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZSBhcyB7IGNvZGU6IHVua25vd24gfSkuY29kZSA9PT0gJ0FCT1JUX0VSUicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGhhbmRsaW5nIGZpbGUgY2hhbmdlOicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmlsZU5vdEZvdW5kKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub3BXYXRjaGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgXVxuXG4gICAgY29uc3QgaG9zdCA9IHRzLmNyZWF0ZVdhdGNoQ29tcGlsZXJIb3N0KFxuICAgICAgICAndHNjb25maWcuanNvbicsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxpc3RFbWl0dGVkRmlsZXM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHRzLnN5cyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGQgPT4ge1xuICAgICAgICAgICAgcmVwb3J0ZXIuc3RhdHVzKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBkLm1lc3NhZ2VUZXh0ID09PSAnc3RyaW5nJyA/IGQubWVzc2FnZVRleHQgOiBkLm1lc3NhZ2VUZXh0Lm1lc3NhZ2VUZXh0LFxuICAgICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBleGNsdWRlRGlyZWN0b3JpZXM6IFsnLmdpdCcsICcqKi90ZXN0L3Jlc3VsdHMnXSxcbiAgICAgICAgICAgIGV4Y2x1ZGVGaWxlczogWycqLmpzJywgJyouZC50cycsICcudGltZXN0YW1wcy5qc29uJ10sXG4gICAgICAgIH0sXG4gICAgKVxuICAgIGNvbnN0IGlnbm9yZUZpbGUgPVxuICAgICAgICBzZXAgPT09ICcvJ1xuICAgICAgICAgICAgPyAoZmlsZTogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgZmlsZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSB8fFxuICAgICAgICAgICAgICAgICAgZmlsZS5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpIHx8XG4gICAgICAgICAgICAgICAgICBmaWxlLmVuZHNXaXRoKCd0ZXN0L2Vudi50eHQnKVxuICAgICAgICAgICAgOiAoZmlsZTogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgZmlsZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSB8fFxuICAgICAgICAgICAgICAgICAgZmlsZS5pbmNsdWRlcyhgJHtzZXB9bm9kZV9tb2R1bGVzJHtzZXB9YCkgfHxcbiAgICAgICAgICAgICAgICAgIGZpbGUuZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICAgICAgICAgICAgZmlsZS5lbmRzV2l0aChgJHtzZXB9cGFja2FnZS5qc29uYCkgfHxcbiAgICAgICAgICAgICAgICAgIGZpbGUuZW5kc1dpdGgoJ3Rlc3QvZW52LnR4dCcpIHx8XG4gICAgICAgICAgICAgICAgICBmaWxlLmVuZHNXaXRoKGB0ZXN0JHtzZXB9ZW52LnR4dGApXG4gICAgY29uc3Qgd2YgPSBob3N0LndhdGNoRmlsZS5iaW5kKGhvc3QpXG4gICAgaG9zdC53YXRjaEZpbGUgPSAoZmlsZSwgY2FsbGJhY2ssIGludGVydmFsLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVGaWxlKGZpbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9wV2F0Y2hlclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZihcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAobmFtZSwga2luZCwgdGltZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbCA9IHJlbGF0aXZlKHBhdGgsIG5hbWUpXG4gICAgICAgICAgICAgICAgaWYgKGlzT3V0cHV0KHJlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcG9ydFdhdGNoRXZlbnQocmVwb3J0ZXIsIHJlbCwgdGltZSwga2luZClcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhuYW1lLCBraW5kLCB0aW1lKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGludGVydmFsLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKVxuICAgIH1cbiAgICBjb25zdCBpZ25vcmVEaXJlY3RvcnkgPVxuICAgICAgICBzZXAgPT09ICcvJ1xuICAgICAgICAgICAgPyAoZmlsZTogc3RyaW5nKSA9PiBmaWxlLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzJylcbiAgICAgICAgICAgIDogKGZpbGU6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgIGZpbGUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMnKSB8fCBmaWxlLmluY2x1ZGVzKGAke3NlcH1ub2RlX21vZHVsZXNgKVxuICAgIGNvbnN0IHdkID0gaG9zdC53YXRjaERpcmVjdG9yeS5iaW5kKGhvc3QpXG4gICAgaG9zdC53YXRjaERpcmVjdG9yeSA9IChkaXJlY3RvcnksIGNhbGxiYWNrLCByZWN1cnNpdmUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGlnbm9yZURpcmVjdG9yeShkaXJlY3RvcnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9wV2F0Y2hlclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZChcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBuYW1lID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWwgPSByZWxhdGl2ZShwYXRoLCBuYW1lKVxuICAgICAgICAgICAgICAgIGlmIChpc091dHB1dChyZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXBvcnRlci5zdGF0dXMoXG4gICAgICAgICAgICAgICAgICAgIGDwn5K+ICR7bmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKX0gLSAke3JlbH0gaW4gJHtyZWxhdGl2ZShwYXRoLCBkaXJlY3RvcnkpfSBjaGFuZ2VkYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmFtZSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWN1cnNpdmUsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApXG4gICAgfVxuICAgIGNvbnN0IGRpciA9IHByb2Nlc3MuY3dkKClcbiAgICBob3N0LmFmdGVyUHJvZ3JhbUNyZWF0ZSA9IHByb2dyYW1CdWlsZGVyID0+IHtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHByb2dyYW1CdWlsZGVyLmdldFByb2dyYW0oKVxuICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IHRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKVxuICAgICAgICBpZiAoZGlhZ25vc3RpY3MubGVuZ3RoID09PSAxICYmIGRpYWdub3N0aWNzWzBdPy5jb2RlID09PSAxOF8wMDMpIHtcbiAgICAgICAgICAgIHJlcG9ydGVyLnN0YXR1cygnQWRkIC50cyBmaWxlcyB0byBnZXQgc3RhcnRlZCDwn5qAJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGRpYWdub3N0aWNzLmZvckVhY2gocmVwb3J0RGlhZ25vc3RpYyhyZXBvcnRlcikpXG4gICAgICAgIGNvbnN0IGVtaXRSZXN1bHQgPSBwcm9ncmFtLmVtaXQoKVxuICAgICAgICBlbWl0UmVzdWx0LmRpYWdub3N0aWNzLmZvckVhY2gocmVwb3J0RGlhZ25vc3RpYyhyZXBvcnRlcikpXG4gICAgICAgIGlmIChlbWl0UmVzdWx0LmRpYWdub3N0aWNzLmxlbmd0aCAhPT0gMCB8fCBlbWl0UmVzdWx0LmVtaXRTa2lwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgICBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGVtaXRSZXN1bHQuZW1pdHRlZEZpbGVzPy5tYXAoZmlsZSA9PiByZWxhdGl2ZShkaXIsIGZpbGUpKVxuICAgICAgICBpZiAob3V0cHV0cykge1xuICAgICAgICAgICAgbGF0ZXN0T3V0cHV0cyA9IG91dHB1dHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdubyBvdXRwdXRzJylcbiAgICAgICAgfVxuICAgICAgICBmaWxlc0NoYW5nZWQoXG4gICAgICAgICAgICBkaWFnbm9zdGljcy5sZW5ndGggPT09IDAsXG4gICAgICAgICAgICBkaWFnbm9zdGljcy5sZW5ndGggIT09IDAgJiYgZGlhZ25vc3RpY3MuZXZlcnkoZCA9PiBkLmNvZGUgPT09IDYwNTMpLFxuICAgICAgICAgICAgcHJvZ3JhbUJ1aWxkZXIuZ2V0U291cmNlRmlsZXMoKS5tYXAoc2YgPT4gcmVsYXRpdmUoZGlyLCBzZi5maWxlTmFtZSkpLFxuICAgICAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICkuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGlmICgoZSBhcyB7IGNvZGU6IHVua25vd24gfSkuY29kZSA9PT0gJ0FCT1JUX0VSUicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGhhbmRsaW5nIGZpbGUgY2hhbmdlczonKVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBjb25zdCB3YXRjaGVyID0gdHMuY3JlYXRlV2F0Y2hQcm9ncmFtKGhvc3QpXG4gICAgY29uc3QgZW1pdFJlc3VsdCA9IHdhdGNoZXIuZ2V0UHJvZ3JhbSgpLmVtaXQoKVxuICAgIGNvbnN0IG91dHB1dHMgPSBlbWl0UmVzdWx0LmVtaXR0ZWRGaWxlcz8ubWFwKGZpbGUgPT4gcmVsYXRpdmUoZGlyLCBmaWxlKSlcbiAgICBpZiAob3V0cHV0cykge1xuICAgICAgICBsYXRlc3RPdXRwdXRzID0gb3V0cHV0c1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdubyBvdXRwdXRzJylcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHdhdGNoZXJzLmZvckVhY2godyA9PiB7XG4gICAgICAgICAgICAgICAgdy5jbG9zZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgd2F0Y2hlci5jbG9zZSgpXG4gICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgICB9LFxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVwb3J0V2F0Y2hFdmVudChcbiAgICByZXBvcnRlcjogUmVwb3J0ZXIsXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIHRpbWU6IERhdGUgfCB1bmRlZmluZWQsXG4gICAga2luZDogRmlsZVdhdGNoZXJFdmVudEtpbmQgfCBmcy5XYXRjaEV2ZW50VHlwZSxcbikge1xuICAgIHJlcG9ydGVyLnN0YXR1cyhcbiAgICAgICAgYPCfkr4gJHsodGltZSA/PyBuZXcgRGF0ZSgpKS50b0xvY2FsZVRpbWVTdHJpbmcoKX0gLSAke2ZpbGV9ICR7KCgpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgdHMuRmlsZVdhdGNoZXJFdmVudEtpbmQuQ3JlYXRlZDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdjcmVhdGVkJ1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoYW5nZSc6XG4gICAgICAgICAgICAgICAgY2FzZSB0cy5GaWxlV2F0Y2hlckV2ZW50S2luZC5DaGFuZ2VkOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3NhdmVkJ1xuICAgICAgICAgICAgICAgIGNhc2UgdHMuRmlsZVdhdGNoZXJFdmVudEtpbmQuRGVsZXRlZDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkZWxldGVkJ1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JlbmFtZSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAncmVuYW1lZCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKX1gLFxuICAgIClcbn1cbiJdfQ==