UNPKG

@analogjs/vitest-angular

Version:

Vitest Builder for Angular

165 lines 21.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ResultKind = void 0; exports.getExtraArgs = getExtraArgs; const architect_1 = require("@angular-devkit/architect"); const path = require("path"); const angular_memory_plugin_1 = require("./plugins/angular-memory-plugin"); const esbuild_downlevel_plugin_1 = require("./plugins/esbuild-downlevel-plugin"); const devkit_1 = require("./devkit"); var ResultKind; (function (ResultKind) { ResultKind[ResultKind["Failure"] = 0] = "Failure"; ResultKind[ResultKind["Full"] = 1] = "Full"; ResultKind[ResultKind["Incremental"] = 2] = "Incremental"; ResultKind[ResultKind["ComponentUpdate"] = 3] = "ComponentUpdate"; })(ResultKind || (exports.ResultKind = ResultKind = {})); process.env['VITE_CJS_IGNORE_WARNING'] = 'true'; async function* vitestApplicationBuilder(options, context) { process.env['TEST'] = 'true'; process.env['VITEST'] = 'true'; const { buildApplicationInternal, angularVersion } = await (0, devkit_1.getBuildApplicationFunction)(); const { startVitest } = await Function('return import("vitest/node")')(); const projectConfig = await context.getProjectMetadata(context.target); const extraArgs = await getExtraArgs(options); const workspaceRoot = context.workspaceRoot; const projectRoot = projectConfig['root']; const setupFile = path.relative(projectRoot, options.setupFile); const config = { root: `${projectRoot || '.'}`, watch: options.watch === true, config: options.configFile, setupFiles: [setupFile], globals: true, pool: 'vmThreads', reporters: ['default'], environment: 'jsdom', exclude: options?.exclude || [], ...extraArgs, }; const includes = findIncludes({ workspaceRoot, projectRoot, include: options.include, exclude: options.exclude || [], }); const testFiles = [ path.relative(workspaceRoot, options.setupFile), ...includes.map((inc) => path.relative(workspaceRoot, inc)), ]; const entryPoints = generateEntryPoints({ projectRoot: projectRoot, testFiles, context, angularVersion, }); const outputFiles = new Map(); const viteConfig = { plugins: [ (await (0, angular_memory_plugin_1.createAngularMemoryPlugin)({ angularVersion, workspaceRoot, outputFiles, })), await (0, esbuild_downlevel_plugin_1.esbuildDownlevelPlugin)(), ], }; let server; for await (const buildOutput of buildApplicationInternal({ aot: false, index: false, progress: false, prerender: false, optimization: false, outputPath: `.angular/.vitest/${projectConfig['name']}`, outExtension: 'mjs', outputHashing: 2, // None tsConfig: path.relative(workspaceRoot, options.tsConfig), watch: options.watch === true, entryPoints, allowedCommonJsDependencies: ['@analogjs/vitest-angular/setup-zone'], sourceMap: { scripts: true, styles: false, vendor: false, }, }, context)) { if (buildOutput.kind === ResultKind.Failure) { return { success: false }; } else if (buildOutput.kind === ResultKind.Incremental || buildOutput.kind === ResultKind.Full) { if (buildOutput.kind === ResultKind.Full) { outputFiles.clear(); Object.keys(buildOutput.files).forEach((key) => { outputFiles.set(key, buildOutput.files[key]); }); } else { Object.keys(buildOutput.files).forEach((key) => { outputFiles.set(key, buildOutput.files[key]); }); } } if (options.watch) { if (!server) { server = await startVitest('test', [], config, viteConfig); } else { await server.start([]); } yield { success: true }; } else { server = await startVitest('test', [], config, viteConfig); const success = server?.state.getCountOfFailedTests() === 0; yield { success }; } } yield { success: true }; } async function getExtraArgs(options) { // support passing extra args to Vitest CLI const schema = await Promise.resolve().then(() => require('./schema.json')); const extraArgs = {}; for (const key of Object.keys(options)) { if (!schema.properties[key]) { extraArgs[key] = options[key]; } } return extraArgs; } function findIncludes(options) { const fg = require('fast-glob'); const { normalizePath } = require('vite'); const projectRoot = normalizePath(path.resolve(options.workspaceRoot, options.projectRoot)); const globs = [...options.include.map((glob) => `${projectRoot}/${glob}`)]; return fg.sync(globs, { dot: true, ignore: options.exclude, }); } function generateEntryPoints({ projectRoot, testFiles, context, angularVersion, }) { if (angularVersion < 19) { return testFiles; } const seen = new Set(); return new Map(Array.from(testFiles, (testFile) => { const relativePath = path .relative(testFile.startsWith(projectRoot) ? projectRoot : context.workspaceRoot, testFile) .replace(/^[./]+/, '_') .replace(/\//g, '-'); let uniqueName = `spec-${path.basename(relativePath, path.extname(relativePath))}`; let suffix = 2; while (seen.has(uniqueName)) { uniqueName = `${relativePath}-${suffix}`; ++suffix; } seen.add(uniqueName); return [uniqueName, testFile]; })); } exports.default = (0, architect_1.createBuilder)(vitestApplicationBuilder); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy92aXRlc3QtYW5ndWxhci9zcmMvbGliL2J1aWxkZXJzL2J1aWxkL3ZpdGVzdC5pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlKQSxvQ0FhQztBQTlKRCx5REFBMEQ7QUFDMUQsNkJBQTZCO0FBTTdCLDJFQUE0RTtBQUM1RSxpRkFBNEU7QUFDNUUscUNBQXVEO0FBRXZELElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQixpREFBTyxDQUFBO0lBQ1AsMkNBQUksQ0FBQTtJQUNKLHlEQUFXLENBQUE7SUFDWCxpRUFBZSxDQUFBO0FBQ2pCLENBQUMsRUFMVyxVQUFVLDBCQUFWLFVBQVUsUUFLckI7QUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEdBQUcsTUFBTSxDQUFDO0FBRWhELEtBQUssU0FBUyxDQUFDLENBQUMsd0JBQXdCLENBQ3RDLE9BQXFCLEVBQ3JCLE9BQVk7SUFFWixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUUvQixNQUFNLEVBQUUsd0JBQXdCLEVBQUUsY0FBYyxFQUFFLEdBQ2hELE1BQU0sSUFBQSxvQ0FBMkIsR0FBRSxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFPLFFBQVEsQ0FDckMsOEJBQThCLENBQy9CLEVBQTRDLENBQUM7SUFFOUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sU0FBUyxHQUFHLE1BQU0sWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENB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RCxrQkFBZSxJQUFBLHlCQUFhLEVBQUMsd0JBQXdCLENBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvYXJjaGl0ZWN0JztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IFZpdGVzdCB9IGZyb20gJ3ZpdGVzdC9ub2RlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luLCBVc2VyQ29uZmlnIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgdHlwZSB7IFVzZXJDb25maWcgYXMgVml0ZXN0Q29uZmlnIH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBWaXRlc3RTY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBjcmVhdGVBbmd1bGFyTWVtb3J5UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW5zL2FuZ3VsYXItbWVtb3J5LXBsdWdpbic7XG5pbXBvcnQgeyBlc2J1aWxkRG93bmxldmVsUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW5zL2VzYnVpbGQtZG93bmxldmVsLXBsdWdpbic7XG5pbXBvcnQgeyBnZXRCdWlsZEFwcGxpY2F0aW9uRnVuY3Rpb24gfSBmcm9tICcuL2RldmtpdCc7XG5cbmV4cG9ydCBlbnVtIFJlc3VsdEtpbmQge1xuICBGYWlsdXJlLFxuICBGdWxsLFxuICBJbmNyZW1lbnRhbCxcbiAgQ29tcG9uZW50VXBkYXRlLFxufVxuXG5wcm9jZXNzLmVudlsnVklURV9DSlNfSUdOT1JFX1dBUk5JTkcnXSA9ICd0cnVlJztcblxuYXN5bmMgZnVuY3Rpb24qIHZpdGVzdEFwcGxpY2F0aW9uQnVpbGRlcihcbiAgb3B0aW9uczogVml0ZXN0U2NoZW1hLFxuICBjb250ZXh0OiBhbnksXG4pOiBBc3luY0l0ZXJhYmxlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gIHByb2Nlc3MuZW52WydURVNUJ10gPSAndHJ1ZSc7XG4gIHByb2Nlc3MuZW52WydWSVRFU1QnXSA9ICd0cnVlJztcblxuICBjb25zdCB7IGJ1aWxkQXBwbGljYXRpb25JbnRlcm5hbCwgYW5ndWxhclZlcnNpb24gfSA9XG4gICAgYXdhaXQgZ2V0QnVpbGRBcHBsaWNhdGlvbkZ1bmN0aW9uKCk7XG4gIGNvbnN0IHsgc3RhcnRWaXRlc3QgfSA9IGF3YWl0IChGdW5jdGlvbihcbiAgICAncmV0dXJuIGltcG9ydChcInZpdGVzdC9ub2RlXCIpJyxcbiAgKSgpIGFzIFByb21pc2U8dHlwZW9mIGltcG9ydCgndml0ZXN0L25vZGUnKT4pO1xuXG4gIGNvbnN0IHByb2plY3RDb25maWcgPSBhd2FpdCBjb250ZXh0LmdldFByb2plY3RNZXRhZGF0YShjb250ZXh0LnRhcmdldCk7XG4gIGNvbnN0IGV4dHJhQXJncyA9IGF3YWl0IGdldEV4dHJhQXJncyhvcHRpb25zKTtcbiAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGNvbnRleHQud29ya3NwYWNlUm9vdDtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9qZWN0Q29uZmlnWydyb290J107XG4gIGNvbnN0IHNldHVwRmlsZSA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIG9wdGlvbnMuc2V0dXBGaWxlKTtcblxuICBjb25zdCBjb25maWc6IFZpdGVzdENvbmZpZyA9IHtcbiAgICByb290OiBgJHtwcm9qZWN0Um9vdCB8fCAnLid9YCxcbiAgICB3YXRjaDogb3B0aW9ucy53YXRjaCA9PT0gdHJ1ZSxcbiAgICBjb25maWc6IG9wdGlvbnMuY29uZmlnRmlsZSxcbiAgICBzZXR1cEZpbGVzOiBbc2V0dXBGaWxlXSxcbiAgICBnbG9iYWxzOiB0cnVlLFxuICAgIHBvb2w6ICd2bVRocmVhZHMnLFxuICAgIHJlcG9ydGVyczogWydkZWZhdWx0J10sXG4gICAgZW52aXJvbm1lbnQ6ICdqc2RvbScsXG4gICAgZXhjbHVkZTogb3B0aW9ucz8uZXhjbHVkZSB8fCBbXSxcbiAgICAuLi5leHRyYUFyZ3MsXG4gIH07XG5cbiAgY29uc3QgaW5jbHVkZXM6IHN0cmluZ1tdID0gZmluZEluY2x1ZGVzKHtcbiAgICB3b3Jrc3BhY2VSb290LFxuICAgIHByb2plY3RSb290LFxuICAgIGluY2x1ZGU6IG9wdGlvbnMuaW5jbHVkZSxcbiAgICBleGNsdWRlOiBvcHRpb25zLmV4Y2x1ZGUgfHwgW10sXG4gIH0pO1xuXG4gIGNvbnN0IHRlc3RGaWxlcyA9IFtcbiAgICBwYXRoLnJlbGF0aXZlKHdvcmtzcGFjZVJvb3QsIG9wdGlvbnMuc2V0dXBGaWxlKSxcbiAgICAuLi5pbmNsdWRlcy5tYXAoKGluYykgPT4gcGF0aC5yZWxhdGl2ZSh3b3Jrc3BhY2VSb290LCBpbmMpKSxcbiAgXTtcblxuICBjb25zdCBlbnRyeVBvaW50cyA9IGdlbmVyYXRlRW50cnlQb2ludHMoe1xuICAgIHByb2plY3RSb290OiBwcm9qZWN0Um9vdCxcbiAgICB0ZXN0RmlsZXMsXG4gICAgY29udGV4dCxcbiAgICBhbmd1bGFyVmVyc2lvbixcbiAgfSk7XG5cbiAgY29uc3Qgb3V0cHV0RmlsZXMgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3Qgdml0ZUNvbmZpZzogVXNlckNvbmZpZyA9IHtcbiAgICBwbHVnaW5zOiBbXG4gICAgICAoYXdhaXQgY3JlYXRlQW5ndWxhck1lbW9yeVBsdWdpbih7XG4gICAgICAgIGFuZ3VsYXJWZXJzaW9uLFxuICAgICAgICB3b3Jrc3BhY2VSb290LFxuICAgICAgICBvdXRwdXRGaWxlcyxcbiAgICAgIH0pKSBhcyBQbHVnaW4sXG4gICAgICBhd2FpdCBlc2J1aWxkRG93bmxldmVsUGx1Z2luKCksXG4gICAgXSxcbiAgfTtcblxuICBsZXQgc2VydmVyOiBWaXRlc3QgfCB1bmRlZmluZWQ7XG4gIGZvciBhd2FpdCAoY29uc3QgYnVpbGRPdXRwdXQgb2YgYnVpbGRBcHBsaWNhdGlvbkludGVybmFsKFxuICAgIHtcbiAgICAgIGFvdDogZmFsc2UsXG4gICAgICBpbmRleDogZmFsc2UsXG4gICAgICBwcm9ncmVzczogZmFsc2UsXG4gICAgICBwcmVyZW5kZXI6IGZhbHNlLFxuICAgICAgb3B0aW1pemF0aW9uOiBmYWxzZSxcbiAgICAgIG91dHB1dFBhdGg6IGAuYW5ndWxhci8udml0ZXN0LyR7cHJvamVjdENvbmZpZ1snbmFtZSddfWAsXG4gICAgICBvdXRFeHRlbnNpb246ICdtanMnLFxuICAgICAgb3V0cHV0SGFzaGluZzogMiwgLy8gTm9uZVxuICAgICAgdHNDb25maWc6IHBhdGgucmVsYXRpdmUod29ya3NwYWNlUm9vdCwgb3B0aW9ucy50c0NvbmZpZyksXG4gICAgICB3YXRjaDogb3B0aW9ucy53YXRjaCA9PT0gdHJ1ZSxcbiAgICAgIGVudHJ5UG9pbnRzLFxuICAgICAgYWxsb3dlZENvbW1vbkpzRGVwZW5kZW5jaWVzOiBbJ0BhbmFsb2dqcy92aXRlc3QtYW5ndWxhci9zZXR1cC16b25lJ10sXG4gICAgICBzb3VyY2VNYXA6IHtcbiAgICAgICAgc2NyaXB0czogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiBmYWxzZSxcbiAgICAgICAgdmVuZG9yOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb250ZXh0LFxuICApKSB7XG4gICAgaWYgKGJ1aWxkT3V0cHV0LmtpbmQgPT09IFJlc3VsdEtpbmQuRmFpbHVyZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5JbmNyZW1lbnRhbCB8fFxuICAgICAgYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5GdWxsXG4gICAgKSB7XG4gICAgICBpZiAoYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5GdWxsKSB7XG4gICAgICAgIG91dHB1dEZpbGVzLmNsZWFyKCk7XG4gICAgICAgIE9iamVjdC5rZXlzKGJ1aWxkT3V0cHV0LmZpbGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBvdXRwdXRGaWxlcy5zZXQoa2V5LCBidWlsZE91dHB1dC5maWxlc1trZXldKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhidWlsZE91dHB1dC5maWxlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgb3V0cHV0RmlsZXMuc2V0KGtleSwgYnVpbGRPdXRwdXQuZmlsZXNba2V5XSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLndhdGNoKSB7XG4gICAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICBzZXJ2ZXIgPSBhd2FpdCBzdGFydFZpdGVzdCgndGVzdCcsIFtdLCBjb25maWcsIHZpdGVDb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgc2VydmVyLnN0YXJ0KFtdKTtcbiAgICAgIH1cblxuICAgICAgeWllbGQgeyBzdWNjZXNzOiB0cnVlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcnZlciA9IGF3YWl0IHN0YXJ0Vml0ZXN0KCd0ZXN0JywgW10sIGNvbmZpZywgdml0ZUNvbmZpZyk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXJ2ZXI/LnN0YXRlLmdldENvdW50T2ZGYWlsZWRUZXN0cygpID09PSAwO1xuXG4gICAgICB5aWVsZCB7IHN1Y2Nlc3MgfTtcbiAgICB9XG4gIH1cblxuICB5aWVsZCB7IHN1Y2Nlc3M6IHRydWUgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhQXJncyhcbiAgb3B0aW9uczogVml0ZXN0U2NoZW1hLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIC8vIHN1cHBvcnQgcGFzc2luZyBleHRyYSBhcmdzIHRvIFZpdGVzdCBDTElcbiAgY29uc3Qgc2NoZW1hID0gYXdhaXQgaW1wb3J0KCcuL3NjaGVtYS5qc29uJyk7XG4gIGNvbnN0IGV4dHJhQXJnczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvcHRpb25zKSkge1xuICAgIGlmICghKHNjaGVtYSBhcyBhbnkpLnByb3BlcnRpZXNba2V5XSkge1xuICAgICAgZXh0cmFBcmdzW2tleV0gPSAob3B0aW9ucyBhcyBhbnkpW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4dHJhQXJncztcbn1cblxuZnVuY3Rpb24gZmluZEluY2x1ZGVzKG9wdGlvbnM6IHtcbiAgd29ya3NwYWNlUm9vdDogc3RyaW5nO1xuICBwcm9qZWN0Um9vdDogc3RyaW5nO1xuICBpbmNsdWRlOiBzdHJpbmdbXTtcbiAgZXhjbHVkZTogc3RyaW5nW107XG59KSB7XG4gIGNvbnN0IGZnID0gcmVxdWlyZSgnZmFzdC1nbG9iJyk7XG4gIGNvbnN0IHsgbm9ybWFsaXplUGF0aCB9ID0gcmVxdWlyZSgndml0ZScpO1xuXG4gIGNvbnN0IHByb2plY3RSb290ID0gbm9ybWFsaXplUGF0aChcbiAgICBwYXRoLnJlc29sdmUob3B0aW9ucy53b3Jrc3BhY2VSb290LCBvcHRpb25zLnByb2plY3RSb290KSxcbiAgKTtcbiAgY29uc3QgZ2xvYnMgPSBbLi4ub3B0aW9ucy5pbmNsdWRlLm1hcCgoZ2xvYikgPT4gYCR7cHJvamVjdFJvb3R9LyR7Z2xvYn1gKV07XG5cbiAgcmV0dXJuIGZnLnN5bmMoZ2xvYnMsIHtcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBvcHRpb25zLmV4Y2x1ZGUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVudHJ5UG9pbnRzKHtcbiAgcHJvamVjdFJvb3QsXG4gIHRlc3RGaWxlcyxcbiAgY29udGV4dCxcbiAgYW5ndWxhclZlcnNpb24sXG59OiB7XG4gIHByb2plY3RSb290OiBzdHJpbmc7XG4gIHRlc3RGaWxlczogc3RyaW5nW107XG4gIGNvbnRleHQ6IGFueTtcbiAgYW5ndWxhclZlcnNpb246IG51bWJlcjtcbn0pIHtcbiAgaWYgKGFuZ3VsYXJWZXJzaW9uIDwgMTkpIHtcbiAgICByZXR1cm4gdGVzdEZpbGVzO1xuICB9XG5cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcblxuICByZXR1cm4gbmV3IE1hcChcbiAgICBBcnJheS5mcm9tKHRlc3RGaWxlcywgKHRlc3RGaWxlKSA9PiB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoXG4gICAgICAgIC5yZWxhdGl2ZShcbiAgICAgICAgICB0ZXN0RmlsZS5zdGFydHNXaXRoKHByb2plY3RSb290KVxuICAgICAgICAgICAgPyBwcm9qZWN0Um9vdFxuICAgICAgICAgICAgOiBjb250ZXh0LndvcmtzcGFjZVJvb3QsXG4gICAgICAgICAgdGVzdEZpbGUsXG4gICAgICAgIClcbiAgICAgICAgLnJlcGxhY2UoL15bLi9dKy8sICdfJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnLScpO1xuXG4gICAgICBsZXQgdW5pcXVlTmFtZSA9IGBzcGVjLSR7cGF0aC5iYXNlbmFtZShcbiAgICAgICAgcmVsYXRpdmVQYXRoLFxuICAgICAgICBwYXRoLmV4dG5hbWUocmVsYXRpdmVQYXRoKSxcbiAgICAgICl9YDtcbiAgICAgIGxldCBzdWZmaXggPSAyO1xuICAgICAgd2hpbGUgKHNlZW4uaGFzKHVuaXF1ZU5hbWUpKSB7XG4gICAgICAgIHVuaXF1ZU5hbWUgPSBgJHtyZWxhdGl2ZVBhdGh9LSR7c3VmZml4fWA7XG4gICAgICAgICsrc3VmZml4O1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQodW5pcXVlTmFtZSk7XG5cbiAgICAgIHJldHVybiBbdW5pcXVlTmFtZSwgdGVzdEZpbGVdO1xuICAgIH0pLFxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVCdWlsZGVyKHZpdGVzdEFwcGxpY2F0aW9uQnVpbGRlcikgYXMgdW5rbm93bjtcbiJdfQ==