@riddance/env
Version:
113 lines • 18.8 kB
JavaScript
import { relative, sep } from 'node:path';
import ts from 'typescript';
import { reportDiagnostic } from '../../lib/compiler.js';
export function watch(reporter, path, filesChanged) {
let abortController = new AbortController();
const watchFile = ts.sys.watchFile?.bind(ts.sys);
if (!watchFile) {
throw new Error('watchFile missing from typescript sys');
}
const watchers = [
'package.json',
'package-lock.json',
'dictionary.txt',
'example/package.json',
'example/package-lock.json',
].map(file => watchFile(file, (name, kind, time) => {
reportWatchEvent(reporter, path, name, time, kind);
abortController.abort();
abortController = new AbortController();
filesChanged(true, [file], [], abortController.signal).catch((e) => {
if (e.code === 'ABORT_ERR') {
return;
}
console.error('Error handling file change:');
console.error(e);
});
}, 500));
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 nopWatcher = {
close: () => {
// Nothing to do
},
};
const ignoreFile = sep === '/'
? (file) => file.includes('/node_modules/') || file.endsWith('/package.json')
: (file) => file.includes('/node_modules/') ||
file.includes(`${sep}node_modules${sep}`) ||
file.endsWith('/package.json') ||
file.endsWith(`${sep}package.json`);
const wf = host.watchFile.bind(host);
host.watchFile = (file, callback, interval, options) => {
if (ignoreFile(file)) {
return nopWatcher;
}
return wf(file, (name, kind, time) => {
reportWatchEvent(reporter, path, name, 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 => {
reporter.status(`💾 ${new Date().toLocaleTimeString()} - ${relative(path, name)} in ${relative(path, directory)} changed`);
callback(name);
}, recursive, options);
};
host.afterProgramCreate = programBuilder => {
const program = programBuilder.getProgram();
const diagnostics = ts.getPreEmitDiagnostics(program);
diagnostics.forEach(reportDiagnostic(reporter));
const emitResult = program.emit();
emitResult.diagnostics.forEach(reportDiagnostic(reporter));
if (emitResult.diagnostics.length !== 0 || emitResult.emitSkipped) {
return;
}
const dir = process.cwd();
abortController.abort();
abortController = new AbortController();
filesChanged(diagnostics.length === 0, programBuilder.getSourceFiles().map(sf => relative(dir, sf.fileName)), emitResult.emittedFiles?.map(file => relative(dir, file)), abortController.signal).catch((e) => {
if (e.code === 'ABORT_ERR') {
return;
}
console.error('Error handling file changes:');
console.error(e);
});
};
const watcher = ts.createWatchProgram(host);
return {
close: () => {
watchers.forEach(w => {
w.close();
});
watcher.close();
abortController.abort();
},
};
}
function reportWatchEvent(reporter, path, file, time, kind) {
reporter.status(`💾 ${(time ?? new Date()).toLocaleTimeString()} - ${relative(path, file)} ${(() => {
switch (kind) {
case ts.FileWatcherEventKind.Created:
return 'created';
case ts.FileWatcherEventKind.Changed:
return 'saved';
case ts.FileWatcherEventKind.Deleted:
return 'deleted';
}
})()}`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN6QyxPQUFPLEVBQWlDLE1BQU0sWUFBWSxDQUFBO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBR3hELE1BQU0sVUFBVSxLQUFLLENBQ2pCLFFBQWtCLEVBQ2xCLElBQVksRUFDWixZQUtrQjtJQUVsQixJQUFJLGVBQWUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO0lBQzNDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFBO0lBQzVELENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRztRQUNiLGNBQWM7UUFDZCxtQkFBbUI7UUFDbkIsZ0JBQWdCO1FBQ2hCLHNCQUFzQjtRQUN0QiwyQkFBMkI7S0FDOUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDVCxTQUFTLENBQ0wsSUFBSSxFQUNKLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNqQixnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDbEQsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3ZCLGVBQWUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO1FBQ3ZDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUss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LEVBQ1osSUFBc0IsRUFDdEIsSUFBMEI7SUFFMUIsUUFBUSxDQUFDLE1BQU0sQ0FDWCxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDL0UsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDLG9CQUFvQixDQUFDLE9BQU87Z0JBQ2hDLE9BQU8sU0FBUyxDQUFBO1lBQ3BCLEtBQUssRUFBRSxDQUFDLG9CQUFvQixDQUFDLE9BQU87Z0JBQ2hDLE9BQU8sT0FBTyxDQUFBO1lBQ2xCLEtBQUssRUFBRSxDQUFDLG9CQUFvQixDQUFDLE9BQU87Z0JBQ2hDLE9BQU8sU0FBUyxDQUFBO1FBQ3hCLENBQUM7SUFDTCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ1QsQ0FBQTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWxhdGl2ZSwgc2VwIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHRzLCB7IHR5cGUgRmlsZVdhdGNoZXJFdmVudEtpbmQgfSBmcm9tICd0eXBlc2NyaXB0J1xuaW1wb3J0IHsgcmVwb3J0RGlhZ25vc3RpYyB9IGZyb20gJy4uLy4uL2xpYi9jb21waWxlci5qcydcbmltcG9ydCB0eXBlIHsgUmVwb3J0ZXIgfSBmcm9tICcuLi8uLi9saWIvcmVwb3J0ZXIuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaChcbiAgICByZXBvcnRlcjogUmVwb3J0ZXIsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGVzQ2hhbmdlZDogKFxuICAgICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXSxcbiAgICAgICAgb3V0cHV0RmlsZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbik6IHsgY2xvc2U6ICgpID0+IHZvaWQgfSB7XG4gICAgbGV0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IHdhdGNoRmlsZSA9IHRzLnN5cy53YXRjaEZpbGU/LmJpbmQodHMuc3lzKVxuICAgIGlmICghd2F0Y2hGaWxlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2F0Y2hGaWxlIG1pc3NpbmcgZnJvbSB0eXBlc2NyaXB0IHN5cycpXG4gICAgfVxuICAgIGNvbnN0IHdhdGNoZXJzID0gW1xuICAgICAgICAncGFja2FnZS5qc29uJyxcbiAgICAgICAgJ3BhY2thZ2UtbG9jay5qc29uJyxcbiAgICAgICAgJ2RpY3Rpb25hcnkudHh0JyxcbiAgICAgICAgJ2V4YW1wbGUvcGFja2FnZS5qc29uJyxcbiAgICAgICAgJ2V4YW1wbGUvcGFja2FnZS1sb2NrLmpzb24nLFxuICAgIF0ubWFwKGZpbGUgPT5cbiAgICAgICAgd2F0Y2hGaWxlKFxuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIChuYW1lLCBraW5kLCB0aW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVwb3J0V2F0Y2hFdmVudChyZXBvcnRlciwgcGF0aCwgbmFtZSwgdGltZSwga2luZClcbiAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgICAgICAgICAgIGZpbGVzQ2hhbmdlZCh0cnVlLCBbZmlsZV0sIFtdLCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsKS5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGUgYXMgeyBjb2RlOiB1bmtub3duIH0pLmNvZGUgPT09ICdBQk9SVF9FUlInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBoYW5kbGluZyBmaWxlIGNoYW5nZTonKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICA1MDAsXG4gICAgICAgICksXG4gICAgKVxuICAgIGNvbnN0IGhvc3QgPSB0cy5jcmVhdGVXYXRjaENvbXBpbGVySG9zdChcbiAgICAgICAgJ3RzY29uZmlnLmpzb24nLFxuICAgICAgICB7XG4gICAgICAgICAgICBsaXN0RW1pdHRlZEZpbGVzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB0cy5zeXMsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBkID0+IHtcbiAgICAgICAgICAgIHJlcG9ydGVyLnN0YXR1cyhcbiAgICAgICAgICAgICAgICB0eXBlb2YgZC5tZXNzYWdlVGV4dCA9PT0gJ3N0cmluZycgPyBkLm1lc3NhZ2VUZXh0IDogZC5tZXNzYWdlVGV4dC5tZXNzYWdlVGV4dCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgZXhjbHVkZURpcmVjdG9yaWVzOiBbJy5naXQnLCAnKiovdGVzdC9yZXN1bHRzJ10sXG4gICAgICAgICAgICBleGNsdWRlRmlsZXM6IFsnKi5qcycsICcqLmQudHMnLCAnLnRpbWVzdGFtcHMuanNvbiddLFxuICAgICAgICB9LFxuICAgIClcbiAgICBjb25zdCBub3BXYXRjaGVyID0ge1xuICAgICAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBkb1xuICAgICAgICB9LFxuICAgIH1cbiAgICBjb25zdCBpZ25vcmVGaWxlID1cbiAgICAgICAgc2VwID09PSAnLydcbiAgICAgICAgICAgID8gKGZpbGU6IHN0cmluZykgPT4gZmlsZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSB8fCBmaWxlLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJylcbiAgICAgICAgICAgIDogKGZpbGU6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgIGZpbGUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykgfHxcbiAgICAgICAgICAgICAgICAgIGZpbGUuaW5jbHVkZXMoYCR7c2VwfW5vZGVfbW9kdWxlcyR7c2VwfWApIHx8XG4gICAgICAgICAgICAgICAgICBmaWxlLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykgfHxcbiAgICAgICAgICAgICAgICAgIGZpbGUuZW5kc1dpdGgoYCR7c2VwfXBhY2thZ2UuanNvbmApXG4gICAgY29uc3Qgd2YgPSBob3N0LndhdGNoRmlsZS5iaW5kKGhvc3QpXG4gICAgaG9zdC53YXRjaEZpbGUgPSAoZmlsZSwgY2FsbGJhY2ssIGludGVydmFsLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVGaWxlKGZpbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9wV2F0Y2hlclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZihcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAobmFtZSwga2luZCwgdGltZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlcG9ydFdhdGNoRXZlbnQocmVwb3J0ZXIsIHBhdGgsIG5hbWUsIHRpbWUsIGtpbmQpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmFtZSwga2luZCwgdGltZSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIClcbiAgICB9XG4gICAgY29uc3QgaWdub3JlRGlyZWN0b3J5ID1cbiAgICAgICAgc2VwID09PSAnLydcbiAgICAgICAgICAgID8gKGZpbGU6IHN0cmluZykgPT4gZmlsZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcycpXG4gICAgICAgICAgICA6IChmaWxlOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICBmaWxlLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzJykgfHwgZmlsZS5pbmNsdWRlcyhgJHtzZXB9bm9kZV9tb2R1bGVzYClcbiAgICBjb25zdCB3ZCA9IGhvc3Qud2F0Y2hEaXJlY3RvcnkuYmluZChob3N0KVxuICAgIGhvc3Qud2F0Y2hEaXJlY3RvcnkgPSAoZGlyZWN0b3J5LCBjYWxsYmFjaywgcmVjdXJzaXZlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVEaXJlY3RvcnkoZGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vcFdhdGNoZXJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2QoXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgbmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgcmVwb3J0ZXIuc3RhdHVzKFxuICAgICAgICAgICAgICAgICAgICBg8J+SviAke25ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9IC0gJHtyZWxhdGl2ZShwYXRoLCBuYW1lKX0gaW4gJHtyZWxhdGl2ZShwYXRoLCBkaXJlY3RvcnkpfSBjaGFuZ2VkYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmFtZSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWN1cnNpdmUsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApXG4gICAgfVxuICAgIGhvc3QuYWZ0ZXJQcm9ncmFtQ3JlYXRlID0gcHJvZ3JhbUJ1aWxkZXIgPT4ge1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcHJvZ3JhbUJ1aWxkZXIuZ2V0UHJvZ3JhbSgpXG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gdHMuZ2V0UHJlRW1pdERpYWdub3N0aWNzKHByb2dyYW0pXG4gICAgICAgIGRpYWdub3N0aWNzLmZvckVhY2gocmVwb3J0RGlhZ25vc3RpYyhyZXBvcnRlcikpXG4gICAgICAgIGNvbnN0IGVtaXRSZXN1bHQgPSBwcm9ncmFtLmVtaXQoKVxuICAgICAgICBlbWl0UmVzdWx0LmRpYWdub3N0aWNzLmZvckVhY2gocmVwb3J0RGlhZ25vc3RpYyhyZXBvcnRlcikpXG4gICAgICAgIGlmIChlbWl0UmVzdWx0LmRpYWdub3N0aWNzLmxlbmd0aCAhPT0gMCB8fCBlbWl0UmVzdWx0LmVtaXRTa2lwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXIgPSBwcm9jZXNzLmN3ZCgpXG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpXG4gICAgICAgIGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgICBmaWxlc0NoYW5nZWQoXG4gICAgICAgICAgICBkaWFnbm9zdGljcy5sZW5ndGggPT09IDAsXG4gICAgICAgICAgICBwcm9ncmFtQnVpbGRlci5nZXRTb3VyY2VGaWxlcygpLm1hcChzZiA9PiByZWxhdGl2ZShkaXIsIHNmLmZpbGVOYW1lKSksXG4gICAgICAgICAgICBlbWl0UmVzdWx0LmVtaXR0ZWRGaWxlcz8ubWFwKGZpbGUgPT4gcmVsYXRpdmUoZGlyLCBmaWxlKSksXG4gICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICApLmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoKGUgYXMgeyBjb2RlOiB1bmtub3duIH0pLmNvZGUgPT09ICdBQk9SVF9FUlInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBoYW5kbGluZyBmaWxlIGNoYW5nZXM6JylcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgfSlcbiAgICB9XG4gICAgY29uc3Qgd2F0Y2hlciA9IHRzLmNyZWF0ZVdhdGNoUHJvZ3JhbShob3N0KVxuICAgIHJldHVybiB7XG4gICAgICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICB3YXRjaGVycy5mb3JFYWNoKHcgPT4ge1xuICAgICAgICAgICAgICAgIHcuY2xvc2UoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHdhdGNoZXIuY2xvc2UoKVxuICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KClcbiAgICAgICAgfSxcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlcG9ydFdhdGNoRXZlbnQoXG4gICAgcmVwb3J0ZXI6IFJlcG9ydGVyLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBmaWxlOiBzdHJpbmcsXG4gICAgdGltZTogRGF0ZSB8IHVuZGVmaW5lZCxcbiAgICBraW5kOiBGaWxlV2F0Y2hlckV2ZW50S2luZCxcbikge1xuICAgIHJlcG9ydGVyLnN0YXR1cyhcbiAgICAgICAgYPCfkr4gJHsodGltZSA/PyBuZXcgRGF0ZSgpKS50b0xvY2FsZVRpbWVTdHJpbmcoKX0gLSAke3JlbGF0aXZlKHBhdGgsIGZpbGUpfSAkeygoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIHRzLkZpbGVXYXRjaGVyRXZlbnRLaW5kLkNyZWF0ZWQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnY3JlYXRlZCdcbiAgICAgICAgICAgICAgICBjYXNlIHRzLkZpbGVXYXRjaGVyRXZlbnRLaW5kLkNoYW5nZWQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnc2F2ZWQnXG4gICAgICAgICAgICAgICAgY2FzZSB0cy5GaWxlV2F0Y2hlckV2ZW50S2luZC5EZWxldGVkOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RlbGV0ZWQnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCl9YCxcbiAgICApXG59XG4iXX0=