@riddance/env
Version:
Too much code slows you down, creates risks, increases maintainability burdens, confuses AI. So let's commit less of it.
76 lines • 12.6 kB
JavaScript
import { readFile, writeFile } from 'node:fs/promises';
import { relative, resolve } from 'node:path';
import { isDeepStrictEqual } from 'node:util';
import ts from 'typescript';
import { isFileNotFound } from './fs.js';
export async function writeTSConfig(path, packageDependencies) {
const { dependencies, devDependencies } = await packageDependencies;
const types = [
...new Set([
'node',
'mocha',
...[...Object.keys(dependencies), ...Object.keys(devDependencies)]
.filter(d => d.startsWith('@types/'))
.map(d => d.slice('@types/'.length)),
]),
];
await patchTypes(resolve(path, 'tsconfig.json'), types);
await patchTypes(resolve(path, 'example', 'tsconfig.json'), types);
}
export function compile(reporter, path) {
const configFile = ts.readConfigFile(resolve(path, 'tsconfig.json'), p => ts.sys.readFile(p));
if (configFile.error) {
reportDiagnostic(reporter)(configFile.error);
return { sourceFiles: [] };
}
const tsconfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, './');
if (tsconfig.errors.length !== 0) {
tsconfig.errors.forEach(reportDiagnostic(reporter));
return { sourceFiles: [] };
}
const program = ts.createProgram(tsconfig.fileNames, {
...tsconfig.options,
listEmittedFiles: true,
outDir: path,
rootDir: path,
typeRoots: [resolve(path, 'node_modules/@types')],
});
const sourceFiles = program.getSourceFiles().map(sf => relative(path, sf.fileName));
const diagnostics = ts.getPreEmitDiagnostics(program);
diagnostics.forEach(reportDiagnostic(reporter));
const emitResult = program.emit();
emitResult.diagnostics.forEach(reportDiagnostic(reporter));
if (diagnostics.length !== 0 || emitResult.diagnostics.length !== 0 || emitResult.emitSkipped) {
return { sourceFiles };
}
return {
sourceFiles,
outputFiles: emitResult.emittedFiles?.map(f => relative(path, f)),
};
}
export function reportDiagnostic(reporter) {
return (diagnostic) => {
const { line, character } = diagnostic.start === undefined
? { line: undefined, character: undefined }
: (diagnostic.file?.getLineAndCharacterOfPosition(diagnostic.start) ?? {});
reporter.error(ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'), diagnostic.file?.fileName, line ? line + 1 : undefined, character ? character + 1 : undefined);
};
}
async function patchTypes(tsconfigPath, types) {
try {
const tsconfig = JSON.parse(await readFile(tsconfigPath, 'utf-8'));
if (isDeepStrictEqual(tsconfig.compilerOptions?.types, types)) {
return;
}
const compilerOptions = (tsconfig.compilerOptions ??= {});
compilerOptions.types = types;
await writeFile(tsconfigPath, JSON.stringify(tsconfig, undefined, ' '), 'utf-8');
}
catch (e) {
if (isFileNotFound(e)) {
return;
}
throw e;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDM0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUd4QyxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDL0IsSUFBWSxFQUNaLG1CQUdFO0lBRUYsTUFBTSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsR0FBRyxNQUFNLG1CQUFtQixDQUFBO0lBQ25FLE1BQU0sS0FBSyxHQUFHO1FBQ1YsR0FBRyxJQUFJLEdBQUcsQ0FBQztZQUNQLE1BQU07WUFDTixPQUFPO1lBQ1AsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7aUJBQzdELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ3BDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNDLENBQUM7S0FDTCxDQUFBO0lBQ0QsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN2RCxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxRQUFrQixFQUFFLElBQVk7SUFDcEQsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM3RixJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQTtJQUM5QixDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUMvRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQTtJQUM5QixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2pELEdBQUcsUUFBUSxDQUFDLE9BQU87UUFDbkIsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixNQUFNLEVBQUUsSUFBSTtRQUNaLE9BQU8sRUFBRSxJQUFJO1FBQ2IsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQ3BELENBQUMsQ0FBQTtJQUNGLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBRW5GLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNyRCxXQUFXLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDL0MsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ2pDLFVBQVUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDMUQsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVGLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBQ0QsT0FBTztRQUNILFdBQVc7UUFDWCxXQUFXLEVBQUUsVUFBVSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3BFLENBQUE7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWtCO0lBQy9DLE9BQU8sQ0FBQyxVQUF5QixFQUFFLEVBQUU7UUFDakMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FDckIsVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQzFCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtZQUMzQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUNsRixRQUFRLENBQUMsS0FBSyxDQUNWLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUM3RCxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFDekIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQzNCLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUN4QyxDQUFBO0lBQ0wsQ0FBQyxDQUFBO0FBQ0wsQ0FBQztBQUNELEtBQUssVUFBVSxVQUFVLENBQUMsWUFBb0IsRUFBRSxLQUFlO0lBQzNELElBQUksQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUVoRSxDQUFBO1FBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU07UUFDVixDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ3pELGVBQWUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQzdCLE1BQU0sU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDckYsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDVCxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE9BQU07UUFDVixDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUE7SUFDWCxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBpc0RlZXBTdHJpY3RFcXVhbCB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0J1xuaW1wb3J0IHsgaXNGaWxlTm90Rm91bmQgfSBmcm9tICcuL2ZzLmpzJ1xuaW1wb3J0IHsgUmVwb3J0ZXIgfSBmcm9tICcuL3JlcG9ydGVyLmpzJ1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVUU0NvbmZpZyhcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgcGFja2FnZURlcGVuZGVuY2llczogUHJvbWlzZTx7XG4gICAgICAgIGRlcGVuZGVuY2llczogeyBbZGVwZW5kZW5jeTogc3RyaW5nXTogdW5rbm93biB9XG4gICAgICAgIGRldkRlcGVuZGVuY2llczogeyBbZGVwZW5kZW5jeTogc3RyaW5nXTogdW5rbm93biB9XG4gICAgfT4sXG4pIHtcbiAgICBjb25zdCB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzIH0gPSBhd2FpdCBwYWNrYWdlRGVwZW5kZW5jaWVzXG4gICAgY29uc3QgdHlwZXMgPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoW1xuICAgICAgICAgICAgJ25vZGUnLFxuICAgICAgICAgICAgJ21vY2hhJyxcbiAgICAgICAgICAgIC4uLlsuLi5PYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhkZXZEZXBlbmRlbmNpZXMpXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkLnN0YXJ0c1dpdGgoJ0B0eXBlcy8nKSlcbiAgICAgICAgICAgICAgICAubWFwKGQgPT4gZC5zbGljZSgnQHR5cGVzLycubGVuZ3RoKSksXG4gICAgICAgIF0pLFxuICAgIF1cbiAgICBhd2FpdCBwYXRjaFR5cGVzKHJlc29sdmUocGF0aCwgJ3RzY29uZmlnLmpzb24nKSwgdHlwZXMpXG4gICAgYXdhaXQgcGF0Y2hUeXBlcyhyZXNvbHZlKHBhdGgsICdleGFtcGxlJywgJ3RzY29uZmlnLmpzb24nKSwgdHlwZXMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlKHJlcG9ydGVyOiBSZXBvcnRlciwgcGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IHRzLnJlYWRDb25maWdGaWxlKHJlc29sdmUocGF0aCwgJ3RzY29uZmlnLmpzb24nKSwgcCA9PiB0cy5zeXMucmVhZEZpbGUocCkpXG4gICAgaWYgKGNvbmZpZ0ZpbGUuZXJyb3IpIHtcbiAgICAgICAgcmVwb3J0RGlhZ25vc3RpYyhyZXBvcnRlcikoY29uZmlnRmlsZS5lcnJvcilcbiAgICAgICAgcmV0dXJuIHsgc291cmNlRmlsZXM6IFtdIH1cbiAgICB9XG5cbiAgICBjb25zdCB0c2NvbmZpZyA9IHRzLnBhcnNlSnNvbkNvbmZpZ0ZpbGVDb250ZW50KGNvbmZpZ0ZpbGUuY29uZmlnLCB0cy5zeXMsICcuLycpXG4gICAgaWYgKHRzY29uZmlnLmVycm9ycy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdHNjb25maWcuZXJyb3JzLmZvckVhY2gocmVwb3J0RGlhZ25vc3RpYyhyZXBvcnRlcikpXG4gICAgICAgIHJldHVybiB7IHNvdXJjZUZpbGVzOiBbXSB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0odHNjb25maWcuZmlsZU5hbWVzLCB7XG4gICAgICAgIC4uLnRzY29uZmlnLm9wdGlvbnMsXG4gICAgICAgIGxpc3RFbWl0dGVkRmlsZXM6IHRydWUsXG4gICAgICAgIG91dERpcjogcGF0aCxcbiAgICAgICAgcm9vdERpcjogcGF0aCxcbiAgICAgICAgdHlwZVJvb3RzOiBbcmVzb2x2ZShwYXRoLCAnbm9kZV9tb2R1bGVzL0B0eXBlcycpXSxcbiAgICB9KVxuICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpLm1hcChzZiA9PiByZWxhdGl2ZShwYXRoLCBzZi5maWxlTmFtZSkpXG5cbiAgICBjb25zdCBkaWFnbm9zdGljcyA9IHRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKVxuICAgIGRpYWdub3N0aWNzLmZvckVhY2gocmVwb3J0RGlhZ25vc3RpYyhyZXBvcnRlcikpXG4gICAgY29uc3QgZW1pdFJlc3VsdCA9IHByb2dyYW0uZW1pdCgpXG4gICAgZW1pdFJlc3VsdC5kaWFnbm9zdGljcy5mb3JFYWNoKHJlcG9ydERpYWdub3N0aWMocmVwb3J0ZXIpKVxuICAgIGlmIChkaWFnbm9zdGljcy5sZW5ndGggIT09IDAgfHwgZW1pdFJlc3VsdC5kaWFnbm9zdGljcy5sZW5ndGggIT09IDAgfHwgZW1pdFJlc3VsdC5lbWl0U2tpcHBlZCkge1xuICAgICAgICByZXR1cm4geyBzb3VyY2VGaWxlcyB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZUZpbGVzLFxuICAgICAgICBvdXRwdXRGaWxlczogZW1pdFJlc3VsdC5lbWl0dGVkRmlsZXM/Lm1hcChmID0+IHJlbGF0aXZlKHBhdGgsIGYpKSxcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnREaWFnbm9zdGljKHJlcG9ydGVyOiBSZXBvcnRlcikge1xuICAgIHJldHVybiAoZGlhZ25vc3RpYzogdHMuRGlhZ25vc3RpYykgPT4ge1xuICAgICAgICBjb25zdCB7IGxpbmUsIGNoYXJhY3RlciB9ID1cbiAgICAgICAgICAgIGRpYWdub3N0aWMuc3RhcnQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8geyBsaW5lOiB1bmRlZmluZWQsIGNoYXJhY3RlcjogdW5kZWZpbmVkIH1cbiAgICAgICAgICAgICAgICA6IChkaWFnbm9zdGljLmZpbGU/LmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKGRpYWdub3N0aWMuc3RhcnQpID8/IHt9KVxuICAgICAgICByZXBvcnRlci5lcnJvcihcbiAgICAgICAgICAgIHRzLmZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJ1xcbicpLFxuICAgICAgICAgICAgZGlhZ25vc3RpYy5maWxlPy5maWxlTmFtZSxcbiAgICAgICAgICAgIGxpbmUgPyBsaW5lICsgMSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNoYXJhY3RlciA/IGNoYXJhY3RlciArIDEgOiB1bmRlZmluZWQsXG4gICAgICAgIClcbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBwYXRjaFR5cGVzKHRzY29uZmlnUGF0aDogc3RyaW5nLCB0eXBlczogc3RyaW5nW10pIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB0c2NvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUodHNjb25maWdQYXRoLCAndXRmLTgnKSkgYXMge1xuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zPzogeyB0eXBlcz86IHN0cmluZ1tdIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEZWVwU3RyaWN0RXF1YWwodHNjb25maWcuY29tcGlsZXJPcHRpb25zPy50eXBlcywgdHlwZXMpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21waWxlck9wdGlvbnMgPSAodHNjb25maWcuY29tcGlsZXJPcHRpb25zID8/PSB7fSlcbiAgICAgICAgY29tcGlsZXJPcHRpb25zLnR5cGVzID0gdHlwZXNcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRzY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkodHNjb25maWcsIHVuZGVmaW5lZCwgJyAgJyksICd1dGYtOCcpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNGaWxlTm90Rm91bmQoZSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRocm93IGVcbiAgICB9XG59XG4iXX0=