turbo-gulp
Version:
Gulp tasks to boost high-quality projects.
117 lines (115 loc) • 14.1 kB
JavaScript
/**
* This module defines the _mocha_ target type used to build and run Mocha tests.
*
* In the following list of tasks, `{target}` represents the name of the target as defined by the `name` property
* of the target options.
* The _lib_ target provides the following tasks:
*
* ## {target}
*
* Build and run the tests, use the console reporter.
*
* ## {target}:build
*
* Performs a full test build of the library and test files.
*
* ## {target}:run
*
* Only run the tests (does not build the tests).
*
* ## {target}:coverage
*
* Run tests with coverage (does not build the tests).
*
* ## {target}:typedoc:deploy
*
* Deploy the _Typedoc_ documentation using _git_. This can be used to easily deploy the documentation to the
* `gh-pages` branch.
*
* ## {target}:clean
*
* Remove the build and directory corresponding to this target.
*
* ## {target}:tsconfig.json
*
* Emit a `tsconfig.json` file corresponding to the configuration for this target. This allows to compile it using
* the command line `tsc` program. This is also useful for IDE to auto-detect the configuration of the project.
*
* @module targets/mocha
*/
import { posix as posixPath } from "path";
import { OutModules } from "../";
import * as mocha from "../task-generators/mocha";
import * as nyc from "../task-generators/nyc";
import { nameTask, registerBaseTasks, resolveTargetBase } from "./_base";
/**
* Resolve absolute paths and dependencies for the provided target.
*
* @param target Non-resolved target.
* @return Resolved target.
*/
function resolveMochaTarget(target) {
return resolveTargetBase(target);
}
/**
* Generates gulp tasks for the provided Mocha target.
*
* @param gulp Gulp instance used to generate tasks manipulating files.
* @param targetOptions Target configuration.
*/
export function generateMochaTasks(gulp, targetOptions) {
const target = resolveMochaTarget(targetOptions);
const result = registerBaseTasks(gulp, targetOptions);
const testOptions = {
rootDir: target.project.absRoot,
testDir: target.buildDir,
};
const runTasks = [];
if (target.outModules === OutModules.Js || target.outModules === OutModules.Both) {
const runCjs = nameTask(`${target.name}:run:cjs`, mocha.generateTask(gulp, testOptions));
result.runCjs = runCjs;
runTasks.push(runCjs);
}
if (target.outModules === OutModules.Mjs || target.outModules === OutModules.Both) {
const runEsm = nameTask(`${target.name}:run:esm`, mocha.generateTask(gulp, Object.assign({}, testOptions, { mjs: true })));
result.runEsm = runEsm;
runTasks.push(runEsm);
}
// run
result.run = nameTask(`${target.name}:run`, gulp.series(runTasks));
const coverageOptions = {
test: Object.assign({}, testOptions, { mjs: target.outModules !== OutModules.Js }),
rootDir: target.project.absRoot,
reportDir: posixPath.join(target.project.absRoot, "coverage"),
tempDir: posixPath.join(target.project.absRoot, ".nyc_output"),
reporters: ["text", "lcovonly", "html"],
};
// coverage
result.coverage = nameTask(`${target.name}:coverage`, nyc.generateTask(gulp, coverageOptions));
// start
const startTasks = [];
if (result.clean !== undefined) {
startTasks.push(result.clean);
}
startTasks.push(result.build);
startTasks.push(result.coverage);
result.start = nameTask(target.name, gulp.series(startTasks));
return result;
}
/**
* Generates and registers gulp tasks for the provided Mocha target.
*
* @param gulp Gulp instance where the tasks will be registered.
* @param targetOptions Target configuration.
*/
export function registerMochaTasks(gulp, targetOptions) {
const tasks = generateMochaTasks(gulp, targetOptions);
for (const key in tasks) {
const task = tasks[key];
if (task !== undefined) {
gulp.task(task);
}
}
return tasks;
}
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9zcmMvdGFyZ2V0cy9tb2NoYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUFLSCxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sMEJBQTBCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQWEsUUFBUSxFQUFFLGlCQUFpQixFQUFzQixpQkFBaUIsRUFBYyxNQUFNLFNBQVMsQ0FBQztBQWNwSDs7Ozs7R0FLRztBQUNILDRCQUE0QixNQUFtQjtJQUM3QyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFVRDs7Ozs7R0FLRztBQUNILE1BQU0sNkJBQTZCLElBQVUsRUFBRSxhQUEwQjtJQUN2RSxNQUFNLE1BQU0sR0FBd0Isa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQTRCLGlCQUFpQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUUvRSxNQUFNLFdBQVcsR0FBdUI7UUFDdEMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTztRQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVE7S0FDekIsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFtQixFQUFFLENBQUM7SUFDcEMsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsSUFBSSxFQUFFO1FBQ2hGLE1BQU0sTUFBTSxHQUFpQixRQUFRLENBQ25DLEdBQUcsTUFBTSxDQUFDLElBQUksVUFBVSxFQUN4QixLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FDdEMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDdkI7SUFDRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxJQUFJLEVBQUU7UUFDakYsTUFBTSxNQUFNLEdBQWlCLFFBQVEsQ0FDbkMsR0FBRyxNQUFNLENBQUMsSUFBSSxVQUFVLEVBQ3hCLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxvQkFBTSxXQUFXLElBQUUsR0FBRyxFQUFFLElBQUksSUFBRSxDQUN0RCxDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDdkIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUN2QjtJQUVELE1BQU07SUFDTixNQUFNLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFbkUsTUFBTSxlQUFlLEdBQW1CO1FBQ3RDLElBQUksb0JBQU0sV0FBVyxJQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxFQUFFLEdBQUM7UUFDaEUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTztRQUMvQixTQUFTLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7UUFDN0QsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzlELFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDO0tBQ3hDLENBQUM7SUFFRixXQUFXO0lBQ1gsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxXQUFXLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUUvRixRQUFRO0lBQ1IsTUFBTSxVQUFVLEdBQW1CLEVBQUUsQ0FBQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQzlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQy9CO0lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFOUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSw2QkFBNkIsSUFBVSxFQUFFLGFBQTBCO0lBQ3ZFLE1BQU0sS0FBSyxHQUFlLGtCQUFrQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNsRSxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRTtRQUN2QixNQUFNLElBQUksR0FBb0MsS0FBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pCO0tBQ0Y7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJmaWxlIjoidGFyZ2V0cy9tb2NoYS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgX21vY2hhXyB0YXJnZXQgdHlwZSB1c2VkIHRvIGJ1aWxkIGFuZCBydW4gTW9jaGEgdGVzdHMuXG4gKlxuICogSW4gdGhlIGZvbGxvd2luZyBsaXN0IG9mIHRhc2tzLCBge3RhcmdldH1gIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBhcyBkZWZpbmVkIGJ5IHRoZSBgbmFtZWAgcHJvcGVydHlcbiAqIG9mIHRoZSB0YXJnZXQgb3B0aW9ucy5cbiAqIFRoZSBfbGliXyB0YXJnZXQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB0YXNrczpcbiAqXG4gKiAjIyB7dGFyZ2V0fVxuICpcbiAqIEJ1aWxkIGFuZCBydW4gdGhlIHRlc3RzLCB1c2UgdGhlIGNvbnNvbGUgcmVwb3J0ZXIuXG4gKlxuICogIyMge3RhcmdldH06YnVpbGRcbiAqXG4gKiBQZXJmb3JtcyBhIGZ1bGwgdGVzdCBidWlsZCBvZiB0aGUgbGlicmFyeSBhbmQgdGVzdCBmaWxlcy5cbiAqXG4gKiAjIyB7dGFyZ2V0fTpydW5cbiAqXG4gKiBPbmx5IHJ1biB0aGUgdGVzdHMgKGRvZXMgbm90IGJ1aWxkIHRoZSB0ZXN0cykuXG4gKlxuICogIyMge3RhcmdldH06Y292ZXJhZ2VcbiAqXG4gKiBSdW4gdGVzdHMgd2l0aCBjb3ZlcmFnZSAoZG9lcyBub3QgYnVpbGQgdGhlIHRlc3RzKS5cbiAqXG4gKiAjIyB7dGFyZ2V0fTp0eXBlZG9jOmRlcGxveVxuICpcbiAqIERlcGxveSB0aGUgX1R5cGVkb2NfIGRvY3VtZW50YXRpb24gdXNpbmcgX2dpdF8uIFRoaXMgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRlcGxveSB0aGUgZG9jdW1lbnRhdGlvbiB0byB0aGVcbiAqIGBnaC1wYWdlc2AgYnJhbmNoLlxuICpcbiAqICMjIHt0YXJnZXR9OmNsZWFuXG4gKlxuICogUmVtb3ZlIHRoZSBidWlsZCBhbmQgZGlyZWN0b3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0YXJnZXQuXG4gKlxuICogIyMge3RhcmdldH06dHNjb25maWcuanNvblxuICpcbiAqIEVtaXQgYSBgdHNjb25maWcuanNvbmAgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRhcmdldC4gVGhpcyBhbGxvd3MgdG8gY29tcGlsZSBpdCB1c2luZ1xuICogdGhlIGNvbW1hbmQgbGluZSBgdHNjYCBwcm9ncmFtLiBUaGlzIGlzIGFsc28gdXNlZnVsIGZvciBJREUgdG8gYXV0by1kZXRlY3QgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHByb2plY3QuXG4gKlxuICogQG1vZHVsZSB0YXJnZXRzL21vY2hhXG4gKi9cblxuLyoqIChQbGFjZWhvbGRlciBjb21tZW50LCBzZWUgY2hyaXN0b3BoZXJ0aGllbGVuL3R5cGVkb2MtcGx1Z2luLWV4dGVybmFsLW1vZHVsZS1uYW1lIzYpICovXG5cbmltcG9ydCB7IEd1bHAsIFRhc2tGdW5jdGlvbiB9IGZyb20gXCJndWxwXCI7XG5pbXBvcnQgeyBwb3NpeCBhcyBwb3NpeFBhdGggfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgT3V0TW9kdWxlcyB9IGZyb20gXCIuLi9cIjtcbmltcG9ydCAqIGFzIG1vY2hhIGZyb20gXCIuLi90YXNrLWdlbmVyYXRvcnMvbW9jaGFcIjtcbmltcG9ydCAqIGFzIG55YyBmcm9tIFwiLi4vdGFzay1nZW5lcmF0b3JzL255Y1wiO1xuaW1wb3J0IHsgQmFzZVRhc2tzLCBuYW1lVGFzaywgcmVnaXN0ZXJCYXNlVGFza3MsIFJlc29sdmVkVGFyZ2V0QmFzZSwgcmVzb2x2ZVRhcmdldEJhc2UsIFRhcmdldEJhc2UgfSBmcm9tIFwiLi9fYmFzZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0ZXN0IGJ1aWxkIHVzaW5nIE1vY2hhLCBpdCBydW5zIHdpdGggTm9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2NoYVRhcmdldCBleHRlbmRzIFRhcmdldEJhc2Uge1xufVxuXG4vKipcbiAqIE1vY2hhIHRhcmdldCB3aXRoIGZ1bGx5IHJlc29sdmVkIHBhdGhzIGFuZCBkZXBlbmRlbmNpZXMuXG4gKi9cbmludGVyZmFjZSBSZXNvbHZlZE1vY2hhVGFyZ2V0IGV4dGVuZHMgUmVzb2x2ZWRUYXJnZXRCYXNlIHtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFic29sdXRlIHBhdGhzIGFuZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwcm92aWRlZCB0YXJnZXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBOb24tcmVzb2x2ZWQgdGFyZ2V0LlxuICogQHJldHVybiBSZXNvbHZlZCB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2NoYVRhcmdldCh0YXJnZXQ6IE1vY2hhVGFyZ2V0KTogUmVzb2x2ZWRNb2NoYVRhcmdldCB7XG4gIHJldHVybiByZXNvbHZlVGFyZ2V0QmFzZSh0YXJnZXQpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vY2hhVGFza3MgZXh0ZW5kcyBCYXNlVGFza3Mge1xuICBzdGFydDogVGFza0Z1bmN0aW9uO1xuICBydW46IFRhc2tGdW5jdGlvbjtcbiAgcnVuQ2pzPzogVGFza0Z1bmN0aW9uO1xuICBydW5Fc20/OiBUYXNrRnVuY3Rpb247XG4gIGNvdmVyYWdlOiBUYXNrRnVuY3Rpb247XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGd1bHAgdGFza3MgZm9yIHRoZSBwcm92aWRlZCBNb2NoYSB0YXJnZXQuXG4gKlxuICogQHBhcmFtIGd1bHAgR3VscCBpbnN0YW5jZSB1c2VkIHRvIGdlbmVyYXRlIHRhc2tzIG1hbmlwdWxhdGluZyBmaWxlcy5cbiAqIEBwYXJhbSB0YXJnZXRPcHRpb25zIFRhcmdldCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2NoYVRhc2tzKGd1bHA6IEd1bHAsIHRhcmdldE9wdGlvbnM6IE1vY2hhVGFyZ2V0KTogTW9jaGFUYXNrcyB7XG4gIGNvbnN0IHRhcmdldDogUmVzb2x2ZWRNb2NoYVRhcmdldCA9IHJlc29sdmVNb2NoYVRhcmdldCh0YXJnZXRPcHRpb25zKTtcbiAgY29uc3QgcmVzdWx0OiBNb2NoYVRhc2tzID0gPE1vY2hhVGFza3M+IHJlZ2lzdGVyQmFzZVRhc2tzKGd1bHAsIHRhcmdldE9wdGlvbnMpO1xuXG4gIGNvbnN0IHRlc3RPcHRpb25zOiBtb2NoYS5Nb2NoYU9wdGlvbnMgPSB7XG4gICAgcm9vdERpcjogdGFyZ2V0LnByb2plY3QuYWJzUm9vdCxcbiAgICB0ZXN0RGlyOiB0YXJnZXQuYnVpbGREaXIsXG4gIH07XG5cbiAgY29uc3QgcnVuVGFza3M6IFRhc2tGdW5jdGlvbltdID0gW107XG4gIGlmICh0YXJnZXQub3V0TW9kdWxlcyA9PT0gT3V0TW9kdWxlcy5KcyB8fCB0YXJnZXQub3V0TW9kdWxlcyA9PT0gT3V0TW9kdWxlcy5Cb3RoKSB7XG4gICAgY29uc3QgcnVuQ2pzOiBUYXNrRnVuY3Rpb24gPSBuYW1lVGFzayhcbiAgICAgIGAke3RhcmdldC5uYW1lfTpydW46Y2pzYCxcbiAgICAgIG1vY2hhLmdlbmVyYXRlVGFzayhndWxwLCB0ZXN0T3B0aW9ucyksXG4gICAgKTtcbiAgICByZXN1bHQucnVuQ2pzID0gcnVuQ2pzO1xuICAgIHJ1blRhc2tzLnB1c2gocnVuQ2pzKTtcbiAgfVxuICBpZiAodGFyZ2V0Lm91dE1vZHVsZXMgPT09IE91dE1vZHVsZXMuTWpzIHx8IHRhcmdldC5vdXRNb2R1bGVzID09PSBPdXRNb2R1bGVzLkJvdGgpIHtcbiAgICBjb25zdCBydW5Fc206IFRhc2tGdW5jdGlvbiA9IG5hbWVUYXNrKFxuICAgICAgYCR7dGFyZ2V0Lm5hbWV9OnJ1bjplc21gLFxuICAgICAgbW9jaGEuZ2VuZXJhdGVUYXNrKGd1bHAsIHsuLi50ZXN0T3B0aW9ucywgbWpzOiB0cnVlfSksXG4gICAgKTtcbiAgICByZXN1bHQucnVuRXNtID0gcnVuRXNtO1xuICAgIHJ1blRhc2tzLnB1c2gocnVuRXNtKTtcbiAgfVxuXG4gIC8vIHJ1blxuICByZXN1bHQucnVuID0gbmFtZVRhc2soYCR7dGFyZ2V0Lm5hbWV9OnJ1bmAsIGd1bHAuc2VyaWVzKHJ1blRhc2tzKSk7XG5cbiAgY29uc3QgY292ZXJhZ2VPcHRpb25zOiBueWMuTnljT3B0aW9ucyA9IHtcbiAgICB0ZXN0OiB7Li4udGVzdE9wdGlvbnMsIG1qczogdGFyZ2V0Lm91dE1vZHVsZXMgIT09IE91dE1vZHVsZXMuSnN9LFxuICAgIHJvb3REaXI6IHRhcmdldC5wcm9qZWN0LmFic1Jvb3QsXG4gICAgcmVwb3J0RGlyOiBwb3NpeFBhdGguam9pbih0YXJnZXQucHJvamVjdC5hYnNSb290LCBcImNvdmVyYWdlXCIpLFxuICAgIHRlbXBEaXI6IHBvc2l4UGF0aC5qb2luKHRhcmdldC5wcm9qZWN0LmFic1Jvb3QsIFwiLm55Y19vdXRwdXRcIiksXG4gICAgcmVwb3J0ZXJzOiBbXCJ0ZXh0XCIsIFwibGNvdm9ubHlcIiwgXCJodG1sXCJdLFxuICB9O1xuXG4gIC8vIGNvdmVyYWdlXG4gIHJlc3VsdC5jb3ZlcmFnZSA9IG5hbWVUYXNrKGAke3RhcmdldC5uYW1lfTpjb3ZlcmFnZWAsIG55Yy5nZW5lcmF0ZVRhc2soZ3VscCwgY292ZXJhZ2VPcHRpb25zKSk7XG5cbiAgLy8gc3RhcnRcbiAgY29uc3Qgc3RhcnRUYXNrczogVGFza0Z1bmN0aW9uW10gPSBbXTtcbiAgaWYgKHJlc3VsdC5jbGVhbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnRUYXNrcy5wdXNoKHJlc3VsdC5jbGVhbik7XG4gIH1cbiAgc3RhcnRUYXNrcy5wdXNoKHJlc3VsdC5idWlsZCk7XG4gIHN0YXJ0VGFza3MucHVzaChyZXN1bHQuY292ZXJhZ2UpO1xuICByZXN1bHQuc3RhcnQgPSBuYW1lVGFzayh0YXJnZXQubmFtZSwgZ3VscC5zZXJpZXMoc3RhcnRUYXNrcykpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuZCByZWdpc3RlcnMgZ3VscCB0YXNrcyBmb3IgdGhlIHByb3ZpZGVkIE1vY2hhIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gZ3VscCBHdWxwIGluc3RhbmNlIHdoZXJlIHRoZSB0YXNrcyB3aWxsIGJlIHJlZ2lzdGVyZWQuXG4gKiBAcGFyYW0gdGFyZ2V0T3B0aW9ucyBUYXJnZXQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9jaGFUYXNrcyhndWxwOiBHdWxwLCB0YXJnZXRPcHRpb25zOiBNb2NoYVRhcmdldCk6IE1vY2hhVGFza3Mge1xuICBjb25zdCB0YXNrczogTW9jaGFUYXNrcyA9IGdlbmVyYXRlTW9jaGFUYXNrcyhndWxwLCB0YXJnZXRPcHRpb25zKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdGFza3MpIHtcbiAgICBjb25zdCB0YXNrOiBUYXNrRnVuY3Rpb24gfCB1bmRlZmluZWQgPSAoPGFueT4gdGFza3MpW2tleV07XG4gICAgaWYgKHRhc2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZ3VscC50YXNrKHRhc2spO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG4iXSwic291cmNlUm9vdCI6Ii4uIn0=