UNPKG

@tylertech/forge-build-tools

Version:
151 lines 19.5 kB
import ts from 'typescript'; import { isGlob, log, logError, logInfo, logWarn } from '../utils/index.js'; import { readJsonFile, globFilesAsync } from '../fs/index.js'; /** * Compiles a list of TypeScript file paths to JavaScript and emits their * @param files The list of source filenames to compile. * @param options The TypeScript compiler options. */ export async function compileTypeScript(files, options) { if (typeof files === 'string') { files = isGlob(files) ? await globFilesAsync(files, {}) : [files]; } if (typeof options === 'string') { const tsconfig = await readJsonFile(options); if (tsconfig && tsconfig.compilerOptions) { options = tsconfig.compilerOptions; } else { throw new Error('Invalid configuration file specified: ' + options); } } options = normalizeCompilerOptions(options); // The TypeScript compiler API requires lib entries to be specified as the whole // filename (i.e. lib.es2015.d.ts), which differs from the regular tsconfig lib entries. This allows // lib entries to specified the same way (i.e. es2015 => lib.es2015.d.ts) if (options.lib) { options.lib = options.lib.map(lib => `lib.${lib}.d.ts`); } const program = ts.createProgram(files, options); const emitResult = program.emit(); const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics); allDiagnostics.forEach(diagnostic => { if (diagnostic.file) { const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'); getDiagnosticLogger(diagnostic.category)(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`); } else { log(`${ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')}`); } }); if (options.noEmitOnError && allDiagnostics.some(d => d.category === ts.DiagnosticCategory.Error)) { logError('TypeScript compilation failed.'); process.exit(1); } } function getDiagnosticLogger(diagnostic) { switch (diagnostic) { case ts.DiagnosticCategory.Error: return logError; case ts.DiagnosticCategory.Message: return log; case ts.DiagnosticCategory.Suggestion: return logInfo; case ts.DiagnosticCategory.Warning: return logWarn; } } /** * Converts TypeScript compiler options to their node API-compatible values. * @param options */ export function normalizeCompilerOptions(options) { if (options.moduleResolution && typeof options.moduleResolution === 'string') { switch (options.moduleResolution.toLowerCase().trim()) { case 'classic': options.moduleResolution = ts.ModuleResolutionKind.Classic; break; case 'node': options.moduleResolution = ts.ModuleResolutionKind.NodeJs; break; default: delete options.moduleResolution; } } if (options.module && typeof options.module === 'string') { switch (options.module.toLowerCase().trim()) { case 'amd': options.module = ts.ModuleKind.AMD; break; case 'commonjs': options.module = ts.ModuleKind.CommonJS; break; case 'es2015': options.module = ts.ModuleKind.ES2015; break; case 'es2020': options.module = ts.ModuleKind.ES2020; break; case 'es2022': options.module = ts.ModuleKind.ES2022; break; case 'esnext': options.module = ts.ModuleKind.ESNext; break; case 'system': options.module = ts.ModuleKind.System; break; case 'umd': options.module = ts.ModuleKind.UMD; break; case 'none': options.module = ts.ModuleKind.None; break; default: delete options.module; } } if (options.target && typeof options.target === 'string') { switch (options.target.toUpperCase().trim()) { case 'ES3': options.target = ts.ScriptTarget.ES3; break; case 'ES5': options.target = ts.ScriptTarget.ES5; break; case 'ES6': case 'ES2015': options.target = ts.ScriptTarget.ES2015; break; case 'ES2016': options.target = ts.ScriptTarget.ES2016; break; case 'ES2017': options.target = ts.ScriptTarget.ES2017; break; case 'ES2018': options.target = ts.ScriptTarget.ES2018; break; case 'ES2019': options.target = ts.ScriptTarget.ES2019; break; case 'ES2020': options.target = ts.ScriptTarget.ES2020; break; case 'ES2021': options.target = ts.ScriptTarget.ES2021; break; case 'ES2022': options.target = ts.ScriptTarget.ES2022; break; case 'ESNEXT': options.target = ts.ScriptTarget.ESNext; break; default: delete options.target; } } return options; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlc2NyaXB0L3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUUsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5RDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxLQUF3QixFQUFFLE9BQTRDO0lBQzVHLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLE9BQU8sQ0FBUSxDQUFDO1FBQ3BELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QyxPQUFPLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEdBQUcsd0JBQXdCLENBQUMsT0FBNkIsQ0FBQyxDQUFDO0lBRWxFLGdGQUFnRjtJQUNoRixvR0FBb0c7SUFDcEcseUVBQXlFO0lBQ3pFLElBQUksT0FBTyxDQUFD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Z0JBQ1gsT0FBTyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLE9BQU8sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7Z0JBQ3hDLE1BQU07WUFDUjtnQkFDRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBpc0dsb2IsIGxvZywgbG9nRXJyb3IsIGxvZ0luZm8sIGxvZ1dhcm4gfSBmcm9tICcuLi91dGlscy9pbmRleC5qcyc7XG5pbXBvcnQgeyByZWFkSnNvbkZpbGUsIGdsb2JGaWxlc0FzeW5jIH0gZnJvbSAnLi4vZnMvaW5kZXguanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zIGV4dGVuZHMgdHMuQ29tcGlsZXJPcHRpb25zIHt9XG5cbi8qKlxuICogQ29tcGlsZXMgYSBsaXN0IG9mIFR5cGVTY3JpcHQgZmlsZSBwYXRocyB0byBKYXZhU2NyaXB0IGFuZCBlbWl0cyB0aGVpclxuICogQHBhcmFtIGZpbGVzIFRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMgdG8gY29tcGlsZS5cbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21waWxlVHlwZVNjcmlwdChmaWxlczogc3RyaW5nW10gfCBzdHJpbmcsIG9wdGlvbnM6IElUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICh0eXBlb2YgZmlsZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgZmlsZXMgPSBpc0dsb2IoZmlsZXMpID8gYXdhaXQgZ2xvYkZpbGVzQXN5bmMoZmlsZXMsIHt9KSBhcyBzdHJpbmdbXSA6IFtmaWxlc107XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgdHNjb25maWcgPSBhd2FpdCByZWFkSnNvbkZpbGUob3B0aW9ucykgYXMgYW55O1xuICAgIGlmICh0c2NvbmZpZyAmJiB0c2NvbmZpZy5jb21waWxlck9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB0c2NvbmZpZy5jb21waWxlck9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25maWd1cmF0aW9uIGZpbGUgc3BlY2lmaWVkOiAnICsgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9ucyA9IG5vcm1hbGl6ZUNvbXBpbGVyT3B0aW9ucyhvcHRpb25zIGFzIHRzLkNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgLy8gVGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgQVBJIHJlcXVpcmVzIGxpYiBlbnRyaWVzIHRvIGJlIHNwZWNpZmllZCBhcyB0aGUgd2hvbGVcbiAgLy8gZmlsZW5hbWUgKGkuZS4gbGliLmVzMjAxNS5kLnRzKSwgd2hpY2ggZGlmZmVycyBmcm9tIHRoZSByZWd1bGFyIHRzY29uZmlnIGxpYiBlbnRyaWVzLiBUaGlzIGFsbG93c1xuICAvLyBsaWIgZW50cmllcyB0byBzcGVjaWZpZWQgdGhlIHNhbWUgd2F5IChpLmUuIGVzMjAxNSA9PiBsaWIuZXMyMDE1LmQudHMpXG4gIGlmIChvcHRpb25zLmxpYikge1xuICAgIG9wdGlvbnMubGliID0gb3B0aW9ucy5saWIubWFwKGxpYiA9PiBgbGliLiR7bGlifS5kLnRzYCk7XG4gIH1cbiAgXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKGZpbGVzLCBvcHRpb25zKTtcbiAgY29uc3QgZW1pdFJlc3VsdCA9IHByb2dyYW0uZW1pdCgpO1xuICBjb25zdCBhbGxEaWFnbm9zdGljcyA9IHRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKS5jb25jYXQoZW1pdFJlc3VsdC5kaWFnbm9zdGljcyk7XG5cbiAgYWxsRGlhZ25vc3RpY3MuZm9yRWFjaChkaWFnbm9zdGljID0+IHtcbiAgICBpZiAoZGlhZ25vc3RpYy5maWxlKSB7XG4gICAgICBjb25zdCB7IGxpbmUsIGNoYXJhY3RlciB9ID0gZGlhZ25vc3RpYy5maWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKGRpYWdub3N0aWMuc3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0cy5mbGF0dGVuRGlhZ25vc3RpY01lc3NhZ2VUZXh0KGRpYWdub3N0aWMubWVzc2FnZVRleHQsICdcXG4nKTtcbiAgICAgIGdldERpYWdub3N0aWNMb2dnZXIoZGlhZ25vc3RpYy5jYXRlZ29yeSkoYCR7ZGlhZ25vc3RpYy5maWxlLmZpbGVOYW1lfSAoJHtsaW5lICsgMX0sJHtjaGFyYWN0ZXIgKyAxfSk6ICR7bWVzc2FnZX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGAke3RzLmZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJ1xcbicpfWApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKG9wdGlvbnMubm9FbWl0T25FcnJvciAmJiBhbGxEaWFnbm9zdGljcy5zb21lKGQgPT4gZC5jYXRlZ29yeSA9PT0gdHMuRGlhZ25vc3RpY0NhdGVnb3J5LkVycm9yKSkge1xuICAgIGxvZ0Vycm9yKCdUeXBlU2NyaXB0IGNvbXBpbGF0aW9uIGZhaWxlZC4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGlhZ25vc3RpY0xvZ2dlcihkaWFnbm9zdGljOiB0cy5EaWFnbm9zdGljQ2F0ZWdvcnkpOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQge1xuICBzd2l0Y2ggKGRpYWdub3N0aWMpIHtcbiAgICBjYXNlIHRzLkRpYWdub3N0aWNDYXRlZ29yeS5FcnJvcjpcbiAgICAgIHJldHVybiBsb2dFcnJvcjtcbiAgICBjYXNlIHRzLkRpYWdub3N0aWNDYXRlZ29yeS5NZXNzYWdlOlxuICAgICAgcmV0dXJuIGxvZztcbiAgICBjYXNlIHRzLkRpYWdub3N0aWNDYXRlZ29yeS5TdWdnZXN0aW9uOlxuICAgICAgcmV0dXJuIGxvZ0luZm87XG4gICAgY2FzZSB0cy5EaWFnbm9zdGljQ2F0ZWdvcnkuV2FybmluZzpcbiAgICAgIHJldHVybiBsb2dXYXJuO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zIHRvIHRoZWlyIG5vZGUgQVBJLWNvbXBhdGlibGUgdmFsdWVzLlxuICogQHBhcmFtIG9wdGlvbnMgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb21waWxlck9wdGlvbnMob3B0aW9uczogdHMuQ29tcGlsZXJPcHRpb25zKTogdHMuQ29tcGlsZXJPcHRpb25zIHtcbiAgaWYgKG9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiAmJiB0eXBlb2Ygb3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnc3RyaW5nJykge1xuICAgIHN3aXRjaCAoKG9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICBjYXNlICdjbGFzc2ljJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gdHMuTW9kdWxlUmVzb2x1dGlvbktpbmQuQ2xhc3NpYztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gdHMuTW9kdWxlUmVzb2x1dGlvbktpbmQuTm9kZUpzO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMubW9kdWxlICYmIHR5cGVvZiBvcHRpb25zLm1vZHVsZSA9PT0gJ3N0cmluZycpIHtcbiAgICBzd2l0Y2ggKChvcHRpb25zLm1vZHVsZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICBjYXNlICdhbWQnOlxuICAgICAgICBvcHRpb25zLm1vZHVsZSA9IHRzLk1vZHVsZUtpbmQuQU1EO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbW1vbmpzJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGUgPSB0cy5Nb2R1bGVLaW5kLkNvbW1vbkpTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VzMjAxNSc6XG4gICAgICAgIG9wdGlvbnMubW9kdWxlID0gdHMuTW9kdWxlS2luZC5FUzIwMTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXMyMDIwJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGUgPSB0cy5Nb2R1bGVLaW5kLkVTMjAyMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlczIwMjInOlxuICAgICAgICBvcHRpb25zLm1vZHVsZSA9IHRzLk1vZHVsZUtpbmQuRVMyMDIyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VzbmV4dCc6XG4gICAgICAgIG9wdGlvbnMubW9kdWxlID0gdHMuTW9kdWxlS2luZC5FU05leHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3lzdGVtJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGUgPSB0cy5Nb2R1bGVLaW5kLlN5c3RlbTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1bWQnOlxuICAgICAgICBvcHRpb25zLm1vZHVsZSA9IHRzLk1vZHVsZUtpbmQuVU1EO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICBvcHRpb25zLm1vZHVsZSA9IHRzLk1vZHVsZUtpbmQuTm9uZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkZWxldGUgb3B0aW9ucy5tb2R1bGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGFyZ2V0ICYmIHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICBzd2l0Y2ggKChvcHRpb25zLnRhcmdldCBhcyBzdHJpbmcpLnRvVXBwZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICBjYXNlICdFUzMnOlxuICAgICAgICBvcHRpb25zLnRhcmdldCA9IHRzLlNjcmlwdFRhcmdldC5FUzM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRVM1JzpcbiAgICAgICAgb3B0aW9ucy50YXJnZXQgPSB0cy5TY3JpcHRUYXJnZXQuRVM1O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VTNic6XG4gICAgICBjYXNlICdFUzIwMTUnOlxuICAgICAgICBvcHRpb25zLnRhcmdldCA9IHRzLlNjcmlwdFRhcmdldC5FUzIwMTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRVMyMDE2JzpcbiAgICAgICAgb3B0aW9ucy50YXJnZXQgPSB0cy5TY3JpcHRUYXJnZXQuRVMyMDE2O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VTMjAxNyc6XG4gICAgICAgIG9wdGlvbnMudGFyZ2V0ID0gdHMuU2NyaXB0VGFyZ2V0LkVTMjAxNztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFUzIwMTgnOlxuICAgICAgICBvcHRpb25zLnRhcmdldCA9IHRzLlNjcmlwdFRhcmdldC5FUzIwMTg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRVMyMDE5JzpcbiAgICAgICAgb3B0aW9ucy50YXJnZXQgPSB0cy5TY3JpcHRUYXJnZXQuRVMyMDE5O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VTMjAyMCc6XG4gICAgICAgIG9wdGlvbnMudGFyZ2V0ID0gdHMuU2NyaXB0VGFyZ2V0LkVTMjAyMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFUzIwMjEnOlxuICAgICAgICBvcHRpb25zLnRhcmdldCA9IHRzLlNjcmlwdFRhcmdldC5FUzIwMjE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRVMyMDIyJzpcbiAgICAgICAgb3B0aW9ucy50YXJnZXQgPSB0cy5TY3JpcHRUYXJnZXQuRVMyMDIyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VTTkVYVCc6XG4gICAgICAgIG9wdGlvbnMudGFyZ2V0ID0gdHMuU2NyaXB0VGFyZ2V0LkVTTmV4dDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkZWxldGUgb3B0aW9ucy50YXJnZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG4iXX0=