turbo-gulp
Version:
Gulp tasks to boost high-quality projects.
211 lines (209 loc) • 33.1 kB
JavaScript
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = require("fs");
const minimatch_1 = require("minimatch");
const path_1 = require("path");
const stream_1 = require("stream");
const typescript = __importStar(require("typescript"));
const vinyl_1 = __importDefault(require("vinyl"));
const tsc_1 = require("../options/tsc");
const typescript_1 = require("../options/typescript");
const project_1 = require("../project");
const build_typescript_1 = require("../target-tasks/build-typescript");
const tsconfig_json_1 = require("../target-tasks/tsconfig-json");
const clean_1 = require("../task-generators/clean");
const copy = __importStar(require("../task-generators/copy"));
const matcher = __importStar(require("../utils/matcher"));
/**
* Generate a copy task (and the corresponding watch task) for the copy operations described by `copyOptions`
*
* @param gulp Gulp instance to use for utility methods.
* @param srcDir Base directory for source resolution.
* @param targetDir Base directory for target (build) resolution.
* @param copyOptions Simple copy operations to apply for this copy task.
* @return A tuple with the task function and corresponding watch task function.
*/
function getCopy(gulp, srcDir, targetDir, copyOptions) {
const tasks = [];
const watchTasks = [];
for (const options of copyOptions) {
const from = options.src === undefined ? srcDir : path_1.posix.join(srcDir, options.src);
const files = options.files === undefined ? ["**/*"] : options.files;
const to = options.dest === undefined ? targetDir : path_1.posix.join(targetDir, options.dest);
const completeOptions = { from, files, to };
tasks.push(copy.generateTask(gulp, completeOptions));
watchTasks.push(() => copy.watch(gulp, completeOptions));
}
const task = gulp.parallel(tasks);
const watch = gulp.parallel(watchTasks);
return [task, watch];
}
exports.getCopy = getCopy;
/**
* Resolve absolute paths and dependencies for the provided target.
*
* @param target Non-resolved target.
* @return Resolved target.
*/
function resolveTargetBase(target) {
const project = project_1.resolveProject(target.project);
const srcDir = typeof target.srcDir === "string" ?
path_1.posix.join(project.absRoot, target.srcDir) :
project.srcDir;
const buildDir = typeof target.buildDir === "string" ?
path_1.posix.join(project.absRoot, target.buildDir) :
path_1.posix.join(project.absBuildDir, target.name);
const scripts = [];
if (target.scripts === undefined) {
scripts.push(path_1.posix.join(srcDir, "**", "*.ts"));
}
else {
for (const script of target.scripts) {
scripts.push(matcher.asString(matcher.join(srcDir, new minimatch_1.Minimatch(script))));
}
}
const defaultCustomTypingsDir = path_1.posix.join(srcDir, "custom-typings");
const customTypingsDir = target.customTypingsDir !== undefined ?
(target.customTypingsDir !== null ? path_1.posix.join(project.absRoot, target.customTypingsDir) : null) :
(fs_1.existsSync(defaultCustomTypingsDir) ? defaultCustomTypingsDir : null);
const tscOptions = tsc_1.mergeTscOptionsJson(tsc_1.DEV_TSC_OPTIONS, target.tscOptions);
const outModules = target.outModules !== undefined ? target.outModules : typescript_1.OutModules.Js;
const tsconfigJson = target.tsconfigJson !== undefined ?
(target.tsconfigJson !== null ? path_1.posix.join(project.absRoot, target.tsconfigJson) : null) :
path_1.posix.join(srcDir, "tsconfig.json");
const dependencies = { typescript };
if (target.dependencies !== undefined) {
Object.assign(dependencies, target.dependencies);
}
return {
project,
name: target.name,
srcDir,
buildDir,
scripts,
customTypingsDir,
tscOptions,
outModules,
tsconfigJson,
dependencies,
copy: target.copy,
clean: target.clean,
};
}
exports.resolveTargetBase = resolveTargetBase;
/**
* Adds a display name to the supplied task function and returns the task function.
*
* @param name The display name to set.
* @param task The task function to name.
* @return The input task, with its `displayName` property set to `name`.
*/
function nameTask(name, task) {
task.displayName = name;
return task;
}
exports.nameTask = nameTask;
/**
* Name a task function and register it to the provided gulp instance.
*/
function addTask(gulp, displayName, task) {
gulp.task(nameTask(displayName, task));
return task;
}
exports.addTask = addTask;
/**
* Creates a Vinyl stream source from a Buffer.
*/
function gulpBufferSrc(filename, data) {
const src = new stream_1.Readable({ objectMode: true });
src._read = function () {
this.push(new vinyl_1.default({
path: filename,
contents: data,
}));
this.push(null);
};
return src;
}
exports.gulpBufferSrc = gulpBufferSrc;
/**
* Generates gulp tasks available for every target (base tasks).
*
* @param gulp Gulp instance used to generate tasks manipulating files.
* @param targetOptions Target configuration.
*/
function generateBaseTasks(gulp, targetOptions) {
const target = resolveTargetBase(targetOptions);
const result = {};
// Typescript options
const tsOptions = {
tscOptions: target.tscOptions,
tsconfigJson: target.tsconfigJson,
customTypingsDir: target.customTypingsDir,
packageJson: target.project.absPackageJson,
buildDir: target.buildDir,
srcDir: target.srcDir,
scripts: target.scripts,
outModules: target.outModules,
};
const watchTasks = [];
// build:scripts
result.buildScripts = nameTask(`${target.name}:build:scripts`, build_typescript_1.getBuildTypescriptTask(gulp, tsOptions));
watchTasks.push(nameTask(`${target.name}:watch:scripts`, build_typescript_1.getBuildTypescriptWatchTask(gulp, tsOptions)));
// build:copy
if (target.copy !== undefined) {
const [copyTask, copyWatchTask] = getCopy(gulp, target.srcDir, target.buildDir, target.copy);
result.buildCopy = nameTask(`${target.name}:build:copy`, copyTask);
watchTasks.push(nameTask(`${target.name}:watch:copy`, copyWatchTask));
}
// build
const buildTasks = [result.buildScripts];
if (result.buildCopy !== undefined) {
buildTasks.push(result.buildCopy);
}
result.build = nameTask(`${target.name}:build`, gulp.parallel(buildTasks));
result.watch = nameTask(`${target.name}:watch`, gulp.series(result.build, gulp.parallel(watchTasks)));
// clean
if (target.clean !== undefined) {
const cleanOptions = {
base: target.project.absRoot,
dirs: target.clean.dirs,
files: target.clean.files,
};
result.clean = nameTask(`${target.name}:clean`, clean_1.generateTask(gulp, cleanOptions));
}
// tsconfig.json
if (target.tsconfigJson !== null) {
result.tsconfigJson = nameTask(`${target.name}:tsconfig.json`, tsconfig_json_1.getTsconfigJsonTask(tsOptions));
}
return result;
}
exports.generateBaseTasks = generateBaseTasks;
/**
* Generates and registers gulp tasks available for every target (base tasks).
*
* @param gulp Gulp instance where the tasks will be registered.
* @param targetOptions Target configuration.
*/
function registerBaseTasks(gulp, targetOptions) {
const tasks = generateBaseTasks(gulp, targetOptions);
for (const key in tasks) {
const task = tasks[key];
if (task !== undefined) {
gulp.task(task);
}
}
return tasks;
}
exports.registerBaseTasks = registerBaseTasks;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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LE9BQU8sQ0FBQyxPQUFPO1lBQzVCLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDdkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSztTQUMxQixDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUUsb0JBQWlCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7S0FDeEY7SUFFRCxnQkFBZ0I7SUFDaEIsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRTtRQUNoQyxNQUFNLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLGdCQUFnQixFQUFFLG1DQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7S0FDaEc7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBM0RELDhDQTJEQztBQUVEOzs7OztHQUtHO0FBQ0gsMkJBQWtDLElBQVUsRUFBRSxhQUF5QjtJQUNyRSxNQUFNLEtBQUssR0FBYyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDaEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEdBQW9DLEtBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBVEQsOENBU0MiLCJmaWxlIjoidGFyZ2V0cy9fYmFzZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIEZTV2F0Y2hlciB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgR3VscCwgVGFza0Z1bmN0aW9uIH0gZnJvbSBcImd1bHBcIjtcbmltcG9ydCB7IE1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCB7IHBvc2l4IGFzIHBvc2l4UGF0aCB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBSZWFkYWJsZSBhcyBSZWFkYWJsZVN0cmVhbSB9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCAqIGFzIHR5cGVzY3JpcHQgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCBWaW55bCBmcm9tIFwidmlueWxcIjtcbmltcG9ydCB7IENsZWFuT3B0aW9ucyB9IGZyb20gXCIuLi9vcHRpb25zL2NsZWFuXCI7XG5pbXBvcnQgeyBDb3B5T3B0aW9ucyB9IGZyb20gXCIuLi9vcHRpb25zL2NvcHlcIjtcbmltcG9ydCB7IENvbXBpbGVyT3B0aW9uc0pzb24sIERFVl9UU0NfT1BUSU9OUywgbWVyZ2VUc2NPcHRpb25zSnNvbiB9IGZyb20gXCIuLi9vcHRpb25zL3RzY1wiO1xuaW1wb3J0IHsgT3V0TW9kdWxlcyB9IGZyb20gXCIuLi9vcHRpb25zL3R5cGVzY3JpcHRcIjtcbmltcG9ydCB7IFByb2plY3QsIFJlc29sdmVkUHJvamVjdCwgcmVzb2x2ZVByb2plY3QgfSBmcm9tIFwiLi4vcHJvamVjdFwiO1xuaW1wb3J0IHsgVHlwZXNjcmlwdENvbmZpZyB9IGZyb20gXCIuLi90YXJnZXQtdGFza3MvX3R5cGVzY3JpcHRcIjtcbmltcG9ydCB7IGdldEJ1aWxkVHlwZXNjcmlwdFRhc2ssIGdldEJ1aWxkVHlwZXNjcmlwdFdhdGNoVGFzayB9IGZyb20gXCIuLi90YXJnZXQtdGFza3MvYnVpbGQtdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdKc29uVGFzayB9IGZyb20gXCIuLi90YXJnZXQtdGFza3MvdHNjb25maWctanNvblwiO1xuaW1wb3J0IHsgQ2xlYW5PcHRpb25zIGFzIF9DbGVhbk9wdGlvbnMsIGdlbmVyYXRlVGFzayBhcyBnZW5lcmF0ZUNsZWFuVGFzayB9IGZyb20gXCIuLi90YXNrLWdlbmVyYXRvcnMvY2xlYW5cIjtcbmltcG9ydCAqIGFzIGNvcHkgZnJvbSBcIi4uL3Rhc2stZ2VuZXJhdG9ycy9jb3B5XCI7XG5pbXBvcnQgeyBBYnNQb3NpeFBhdGgsIFJlbFBvc2l4UGF0aCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0ICogYXMgbWF0Y2hlciBmcm9tIFwiLi4vdXRpbHMvbWF0Y2hlclwiO1xuXG5leHBvcnQgdHlwZSBXYXRjaFRhc2tGdW5jdGlvbiA9IChUYXNrRnVuY3Rpb24gJiAoKCkgPT4gRlNXYXRjaGVyKSk7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBjb3B5IHRhc2sgKGFuZCB0aGUgY29ycmVzcG9uZGluZyB3YXRjaCB0YXNrKSBmb3IgdGhlIGNvcHkgb3BlcmF0aW9ucyBkZXNjcmliZWQgYnkgYGNvcHlPcHRpb25zYFxuICpcbiAqIEBwYXJhbSBndWxwIEd1bHAgaW5zdGFuY2UgdG8gdXNlIGZvciB1dGlsaXR5IG1ldGhvZHMuXG4gKiBAcGFyYW0gc3JjRGlyIEJhc2UgZGlyZWN0b3J5IGZvciBzb3VyY2UgcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB0YXJnZXREaXIgQmFzZSBkaXJlY3RvcnkgZm9yIHRhcmdldCAoYnVpbGQpIHJlc29sdXRpb24uXG4gKiBAcGFyYW0gY29weU9wdGlvbnMgU2ltcGxlIGNvcHkgb3BlcmF0aW9ucyB0byBhcHBseSBmb3IgdGhpcyBjb3B5IHRhc2suXG4gKiBAcmV0dXJuIEEgdHVwbGUgd2l0aCB0aGUgdGFzayBmdW5jdGlvbiBhbmQgY29ycmVzcG9uZGluZyB3YXRjaCB0YXNrIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29weShcbiAgZ3VscDogR3VscCxcbiAgc3JjRGlyOiBzdHJpbmcsXG4gIHRhcmdldERpcjogc3RyaW5nLFxuICBjb3B5T3B0aW9uczogSXRlcmFibGU8Q29weU9wdGlvbnM+LFxuKTogW1Rhc2tGdW5jdGlvbiwgVGFza0Z1bmN0aW9uXSB7XG4gIGNvbnN0IHRhc2tzOiBUYXNrRnVuY3Rpb25bXSA9IFtdO1xuICBjb25zdCB3YXRjaFRhc2tzOiBXYXRjaFRhc2tGdW5jdGlvbltdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9ucyBvZiBjb3B5T3B0aW9ucykge1xuICAgIGNvbnN0IGZyb206IHN0cmluZyA9IG9wdGlvbnMuc3JjID09PSB1bmRlZmluZWQgPyBzcmNEaXIgOiBwb3NpeFBhdGguam9pbihzcmNEaXIsIG9wdGlvbnMuc3JjKTtcbiAgICBjb25zdCBmaWxlczogc3RyaW5nW10gPSBvcHRpb25zLmZpbGVzID09PSB1bmRlZmluZWQgPyBbXCIqKi8qXCJdIDogb3B0aW9ucy5maWxlcztcbiAgICBjb25zdCB0bzogc3RyaW5nID0gb3B0aW9ucy5kZXN0ID09PSB1bmRlZmluZWQgPyB0YXJnZXREaXIgOiBwb3NpeFBhdGguam9pbih0YXJnZXREaXIsIG9wdGlvbnMuZGVzdCk7XG5cbiAgICBjb25zdCBjb21wbGV0ZU9wdGlvbnM6IGNvcHkuT3B0aW9ucyA9IHtmcm9tLCBmaWxlcywgdG99O1xuICAgIHRhc2tzLnB1c2goY29weS5nZW5lcmF0ZVRhc2soZ3VscCwgY29tcGxldGVPcHRpb25zKSk7XG4gICAgd2F0Y2hUYXNrcy5wdXNoKCgpID0+IGNvcHkud2F0Y2goZ3VscCwgY29tcGxldGVPcHRpb25zKSk7XG4gIH1cblxuICBjb25zdCB0YXNrOiBUYXNrRnVuY3Rpb24gPSBndWxwLnBhcmFsbGVsKHRhc2tzKTtcbiAgY29uc3Qgd2F0Y2g6IFRhc2tGdW5jdGlvbiA9IGd1bHAucGFyYWxsZWwod2F0Y2hUYXNrcyk7XG4gIHJldHVybiBbdGFzaywgd2F0Y2hdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldEJhc2Uge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0YXJnZXQuXG4gICAqIEFsbCB0aGUgdGFza3MgcmVsYXRlZCB0byB0aGlzIHRhcmdldCB3aWxsIGJlIHByZWZpeGVkIGJ5IHRoaXMgbmFtZS5cbiAgICogSXQgd2lsbCBhbHNvIGJlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHNvbWUgcGF0aHMsIHNvIGl0IG11c3QgYXZvaWQgYW55IHNwZWNpYWwgY2hhcmFjdGVycy5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUmVsYXRpdmUgcGF0aCB0byB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBzb3VyY2VzLCByZWxhdGl2ZSB0byBgcHJvamVjdC5yb290RGlyYC5cbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHByb2plY3Quc3JjRGlyYC5cbiAgICovXG4gIHNyY0Rpcj86IFJlbFBvc2l4UGF0aDtcblxuICAvKipcbiAgICogUmVsYXRpdmUgcGF0aCB0byB0aGUgYnVpbGQgZGlyZWN0b3J5IGZvciB0aGlzIHRhcmdldCwgcmVsYXRpdmUgdG8gYHByb2plY3Qucm9vdERpcmAuXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBqb2luKHByb2plY3QuYnVpbGREaXIsIHRhcmdldC5uYW1lKWAuXG4gICAqL1xuICBidWlsZERpcj86IFJlbFBvc2l4UGF0aDtcblxuICAvKipcbiAgICogR2xvYiBwYXR0ZXJucyBmb3IgdGhlIFR5cGVzY3JpcHQgc291cmNlcywgcmVsYXRpdmUgdG8gYHRhcmdldC5zcmNEaXJgLlxuICAgKlxuICAgKiBJdCB1c2VzIHRoZSBgbWluaW1hdGNoYCBwYXR0ZXJucy4gR2xvYiBzdGFycyAod2lsZCBzdGFycywgYCoqYCkgdXNlIGB0YXJnZXQuc3JjRGlyYCBhcyB0aGVpciBiYXNlIGRpcmVjdG9yeS5cbiAgICpcbiAgICogRGVmYXVsdDogYFtqb2luKHRhcmdldC5zcmNEaXIsIFwiKipcIiwgXCIqLnRzXCIpXWBcbiAgICovXG4gIHNjcmlwdHM/OiBJdGVyYWJsZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgY29udGFpbmluZyBjdXN0b20gdHlwaW5ncywgcmVsYXRpdmUgdG8gYHByb2plY3Qucm9vdERpcmAuXG4gICAqIEN1c3RvbSB0eXBpbmdzIGFyZSB0eXBpbmdzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgb24gYEB0eXBlc2AuXG4gICAqIGBudWxsYCBtZWFucyB0aGF0IHlvdSBkb24ndCB1c2UgY3VzdG9tIHR5cGluZ3MuXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgYGpvaW4odGFyZ2V0LnNyY0RpciwgXCJjdXN0b20tdHlwaW5nc1wiKWAgaWYgaXQgZXhpc3RzIChzeW5jIHRlc3QpLCBlbHNlIGBudWxsYC5cbiAgICovXG4gIGN1c3RvbVR5cGluZ3NEaXI/OiBSZWxQb3NpeFBhdGggfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgZm9yIHRoZSBvcHRpb25zIG9mIHRoZSBUeXBlc2NyaXB0IGNvbXBpbGVyLlxuICAgKi9cbiAgdHNjT3B0aW9ucz86IENvbXBpbGVyT3B0aW9uc0pzb247XG5cbiAgLyoqXG4gICAqIE91dHB1dCBtb2R1bGVzLlxuICAgKlxuICAgKiAtIGBKc2A6IFVzZSB0aGUgY29tcGlsZXIgb3B0aW9ucyB0byBlbWl0IGAqLmpzYCBmaWxlcy5cbiAgICogLSBgTWpzYDogRW5mb3JjZSBgZXMyMDE1YCBtb2R1bGVzIGFuZCBlbWl0IGAqLm1qc2AgZmlsZXMuXG4gICAqIC0gYEJvdGhgOiBFbWl0IGJvdGggYCouanNgIGZpbGVzIHVzaW5nIHRoZSBjb21waWxlciBvcHRpb25zIGFuZCBgKi5tanNgIHVzaW5nIGBlczIwMTVgLlxuICAgKlxuICAgKiBEZWZhdWx0OiBgSnNgXG4gICAqL1xuICBvdXRNb2R1bGVzPzogT3V0TW9kdWxlcztcblxuICAvKipcbiAgICogUGF0aCB0byB0aGUgYHRzY29uZmlnLmpzb25gIGZpbGUgZm9yIHRoaXMgdGFyZ2V0LCByZWxhdGl2ZSB0byBgcHJvamVjdC5yb290RGlyYC5cbiAgICogVXNlIGBudWxsYCB0byBub3QgZ2VuZXJhdGUgYSBgdHNjb25maWcuanNvbmAgdGFzay5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGpvaW4odGFyZ2V0LnNyY0RpciwgXCJ0c2NvbmZpZy5qc29uXCIpYC5cbiAgICovXG4gIHRzY29uZmlnSnNvbj86IFJlbFBvc2l4UGF0aCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgZGVwZW5kZW5jaWVzIG9yIHByb3ZpZGUgb3B0aW9uYWwgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgZGVwZW5kZW5jaWVzPzogQmFzZURlcGVuZGVuY2llcztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGNvcHkgb3BlcmF0aW9ucyB0byBwZXJmb3JtIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAgICpcbiAgICogRGVmYXVsdDogYFtdYFxuICAgKi9cbiAgY29weT86IENvcHlPcHRpb25zW107XG5cbiAgLyoqXG4gICAqIE1pbmltYXRjaCBwYXR0ZXJucyB0byBjbGVhbiB0aGUgZmlsZXMgY3JlYXRlIGR1cmluZyB0aGUgYGJ1aWxkYCBhbmQgYGRpc3RgIHRhc2tzLCByZWxhdGl2ZSB0byBgcHJvamVjdC5yb290YC5cbiAgICpcbiAgICogRGVmYXVsdDpcbiAgICoge1xuICAgKiAgIGRpcnM6IFtcbiAgICogICAgIHBhdGguam9pbihwcm9qZWN0LmJ1aWxkRGlyLCB0YXJnZXQudGFyZ2V0RGlyKSxcbiAgICogICAgIHBhdGguam9pbihwcm9qZWN0LmRpc3REaXIsIHRhcmdldC50YXJnZXREaXIpXG4gICAqICAgXVxuICAgKiB9XG4gICAqL1xuICBjbGVhbj86IENsZWFuT3B0aW9ucztcbn1cblxuLyoqXG4gKiBMaWJyYXJ5IHdpdGggZnVsbHkgcmVzb2x2ZWQgcGF0aHMgYW5kIGRlcGVuZGVuY2llcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFRhcmdldEJhc2UgZXh0ZW5kcyBUYXJnZXRCYXNlIHtcbiAgcmVhZG9ubHkgcHJvamVjdDogUmVzb2x2ZWRQcm9qZWN0O1xuXG4gIHJlYWRvbmx5IHNyY0RpcjogQWJzUG9zaXhQYXRoO1xuXG4gIHJlYWRvbmx5IGJ1aWxkRGlyOiBBYnNQb3NpeFBhdGg7XG5cbiAgcmVhZG9ubHkgc2NyaXB0czogSXRlcmFibGU8c3RyaW5nPjtcblxuICByZWFkb25seSBjdXN0b21UeXBpbmdzRGlyOiBBYnNQb3NpeFBhdGggfCBudWxsO1xuXG4gIHJlYWRvbmx5IHRzY09wdGlvbnM6IENvbXBpbGVyT3B0aW9uc0pzb247XG5cbiAgcmVhZG9ubHkgb3V0TW9kdWxlczogT3V0TW9kdWxlcztcblxuICByZWFkb25seSB0c2NvbmZpZ0pzb246IEFic1Bvc2l4UGF0aCB8IG51bGw7XG5cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBSZXNvbHZlZEJhc2VEZXBlbmRlbmNpZXM7XG5cbiAgcmVhZG9ubHkgY29weT86IENvcHlPcHRpb25zW107XG5cbiAgcmVhZG9ubHkgY2xlYW4/OiBDbGVhbk9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZURlcGVuZGVuY2llcyB7XG4gIHJlYWRvbmx5IHR5cGVzY3JpcHQ/OiB0eXBlb2YgdHlwZXNjcmlwdDtcbn1cblxuLyoqXG4gKiBGdWxseSByZXNvbHZlZCBkZXBlbmRlbmNpZXMsIGVpdGhlciB1c2luZyBkZWZhdWx0cyBvciB0aGUgbGlicmFyeSBwcm92aWRlZCBieSB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEJhc2VEZXBlbmRlbmNpZXMgZXh0ZW5kcyBCYXNlRGVwZW5kZW5jaWVzIHtcbiAgcmVhZG9ubHkgdHlwZXNjcmlwdDogdHlwZW9mIHR5cGVzY3JpcHQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhYnNvbHV0ZSBwYXRocyBhbmQgZGVwZW5kZW5jaWVzIGZvciB0aGUgcHJvdmlkZWQgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgTm9uLXJlc29sdmVkIHRhcmdldC5cbiAqIEByZXR1cm4gUmVzb2x2ZWQgdGFyZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldEJhc2UodGFyZ2V0OiBUYXJnZXRCYXNlKTogUmVzb2x2ZWRUYXJnZXRCYXNlIHtcbiAgY29uc3QgcHJvamVjdDogUmVzb2x2ZWRQcm9qZWN0ID0gcmVzb2x2ZVByb2plY3QodGFyZ2V0LnByb2plY3QpO1xuXG4gIGNvbnN0IHNyY0RpcjogQWJzUG9zaXhQYXRoID0gdHlwZW9mIHRhcmdldC5zcmNEaXIgPT09IFwic3RyaW5nXCIgP1xuICAgIHBvc2l4UGF0aC5qb2luKHByb2plY3QuYWJzUm9vdCwgdGFyZ2V0LnNyY0RpcikgOlxuICAgIHByb2plY3Quc3JjRGlyO1xuXG4gIGNvbnN0IGJ1aWxkRGlyOiBBYnNQb3NpeFBhdGggPSB0eXBlb2YgdGFyZ2V0LmJ1aWxkRGlyID09PSBcInN0cmluZ1wiID9cbiAgICBwb3NpeFBhdGguam9pbihwcm9qZWN0LmFic1Jvb3QsIHRhcmdldC5idWlsZERpcikgOlxuICAgIHBvc2l4UGF0aC5qb2luKHByb2plY3QuYWJzQnVpbGREaXIsIHRhcmdldC5uYW1lKTtcblxuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAodGFyZ2V0LnNjcmlwdHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHNjcmlwdHMucHVzaChwb3NpeFBhdGguam9pbihzcmNEaXIsIFwiKipcIiwgXCIqLnRzXCIpKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiB0YXJnZXQuc2NyaXB0cykge1xuICAgICAgc2NyaXB0cy5wdXNoKG1hdGNoZXIuYXNTdHJpbmcobWF0Y2hlci5qb2luKHNyY0RpciwgbmV3IE1pbmltYXRjaChzY3JpcHQpKSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRlZmF1bHRDdXN0b21UeXBpbmdzRGlyOiBBYnNQb3NpeFBhdGggPSBwb3NpeFBhdGguam9pbihzcmNEaXIsIFwiY3VzdG9tLXR5cGluZ3NcIik7XG5cbiAgY29uc3QgY3VzdG9tVHlwaW5nc0RpcjogQWJzUG9zaXhQYXRoIHwgbnVsbCA9IHRhcmdldC5jdXN0b21UeXBpbmdzRGlyICE9PSB1bmRlZmluZWQgP1xuICAgICh0YXJnZXQuY3VzdG9tVHlwaW5nc0RpciAhPT0gbnVsbCA/IHBvc2l4UGF0aC5qb2luKHByb2plY3QuYWJzUm9vdCwgdGFyZ2V0LmN1c3RvbVR5cGluZ3NEaXIpIDogbnVsbCkgOlxuICAgIChleGlzdHNTeW5jKGRlZmF1bHRDdXN0b21UeXBpbmdzRGlyKSA/IGRlZmF1bHRDdXN0b21UeXBpbmdzRGlyIDogbnVsbCk7XG5cbiAgY29uc3QgdHNjT3B0aW9uczogQ29tcGlsZXJPcHRpb25zSnNvbiA9IG1lcmdlVHNjT3B0aW9uc0pzb24oREVWX1RTQ19PUFRJT05TLCB0YXJnZXQudHNjT3B0aW9ucyk7XG5cbiAgY29uc3Qgb3V0TW9kdWxlczogT3V0TW9kdWxlcyA9IHRhcmdldC5vdXRNb2R1bGVzICE9PSB1bmRlZmluZWQgPyB0YXJnZXQub3V0TW9kdWxlcyA6IE91dE1vZHVsZXMuSnM7XG5cbiAgY29uc3QgdHNjb25maWdKc29uOiBBYnNQb3NpeFBhdGggfCBudWxsID0gdGFyZ2V0LnRzY29uZmlnSnNvbiAhPT0gdW5kZWZpbmVkID9cbiAgICAodGFyZ2V0LnRzY29uZmlnSnNvbiAhPT0gbnVsbCA/IHBvc2l4UGF0aC5qb2luKHByb2plY3QuYWJzUm9vdCwgdGFyZ2V0LnRzY29uZmlnSnNvbikgOiBudWxsKSA6XG4gICAgcG9zaXhQYXRoLmpvaW4oc3JjRGlyLCBcInRzY29uZmlnLmpzb25cIik7XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBSZXNvbHZlZEJhc2VEZXBlbmRlbmNpZXMgPSB7dHlwZXNjcmlwdH07XG4gIGlmICh0YXJnZXQuZGVwZW5kZW5jaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBPYmplY3QuYXNzaWduKGRlcGVuZGVuY2llcywgdGFyZ2V0LmRlcGVuZGVuY2llcyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHByb2plY3QsXG4gICAgbmFtZTogdGFyZ2V0Lm5hbWUsXG4gICAgc3JjRGlyLFxuICAgIGJ1aWxkRGlyLFxuICAgIHNjcmlwdHMsXG4gICAgY3VzdG9tVHlwaW5nc0RpcixcbiAgICB0c2NPcHRpb25zLFxuICAgIG91dE1vZHVsZXMsXG4gICAgdHNjb25maWdKc29uLFxuICAgIGRlcGVuZGVuY2llcyxcbiAgICBjb3B5OiB0YXJnZXQuY29weSxcbiAgICBjbGVhbjogdGFyZ2V0LmNsZWFuLFxuICB9O1xufVxuXG4vKipcbiAqIEFkZHMgYSBkaXNwbGF5IG5hbWUgdG8gdGhlIHN1cHBsaWVkIHRhc2sgZnVuY3Rpb24gYW5kIHJldHVybnMgdGhlIHRhc2sgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIGRpc3BsYXkgbmFtZSB0byBzZXQuXG4gKiBAcGFyYW0gdGFzayBUaGUgdGFzayBmdW5jdGlvbiB0byBuYW1lLlxuICogQHJldHVybiBUaGUgaW5wdXQgdGFzaywgd2l0aCBpdHMgYGRpc3BsYXlOYW1lYCBwcm9wZXJ0eSBzZXQgdG8gYG5hbWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZVRhc2s8VCBleHRlbmRzIFRhc2tGdW5jdGlvbj4obmFtZTogc3RyaW5nLCB0YXNrOiBUKTogVCAmIHtkaXNwbGF5TmFtZTogc3RyaW5nfSB7XG4gIHRhc2suZGlzcGxheU5hbWUgPSBuYW1lO1xuICByZXR1cm4gPFQgJiB7ZGlzcGxheU5hbWU6IHN0cmluZ30+IHRhc2s7XG59XG5cbi8qKlxuICogTmFtZSBhIHRhc2sgZnVuY3Rpb24gYW5kIHJlZ2lzdGVyIGl0IHRvIHRoZSBwcm92aWRlZCBndWxwIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFzayhndWxwOiBHdWxwLCBkaXNwbGF5TmFtZTogc3RyaW5nLCB0YXNrOiBUYXNrRnVuY3Rpb24pOiBUYXNrRnVuY3Rpb24ge1xuICBndWxwLnRhc2sobmFtZVRhc2soZGlzcGxheU5hbWUsIHRhc2spKTtcbiAgcmV0dXJuIHRhc2s7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFZpbnlsIHN0cmVhbSBzb3VyY2UgZnJvbSBhIEJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGd1bHBCdWZmZXJTcmMoZmlsZW5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyKTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtIHtcbiAgY29uc3Qgc3JjOiBSZWFkYWJsZVN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7b2JqZWN0TW9kZTogdHJ1ZX0pO1xuICBzcmMuX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5wdXNoKG5ldyBWaW55bCh7XG4gICAgICBwYXRoOiBmaWxlbmFtZSxcbiAgICAgIGNvbnRlbnRzOiBkYXRhLFxuICAgIH0pKTtcbiAgICB0aGlzLnB1c2gobnVsbCk7XG4gIH07XG4gIHJldHVybiBzcmM7XG59XG5cbi8qKlxuICogQmFzZSB0YXNrcyBhdmFpbGFibGUgZm9yIGV2ZXJ5IHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlVGFza3Mge1xuICBidWlsZFNjcmlwdHM6IFRhc2tGdW5jdGlvbjtcbiAgYnVpbGRDb3B5PzogVGFza0Z1bmN0aW9uO1xuICBidWlsZDogVGFza0Z1bmN0aW9uO1xuICB3YXRjaD86IFRhc2tGdW5jdGlvbjtcbiAgY2xlYW4/OiBUYXNrRnVuY3Rpb247XG4gIHRzY29uZmlnSnNvbj86IFRhc2tGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgZ3VscCB0YXNrcyBhdmFpbGFibGUgZm9yIGV2ZXJ5IHRhcmdldCAoYmFzZSB0YXNrcykuXG4gKlxuICogQHBhcmFtIGd1bHAgR3VscCBpbnN0YW5jZSB1c2VkIHRvIGdlbmVyYXRlIHRhc2tzIG1hbmlwdWxhdGluZyBmaWxlcy5cbiAqIEBwYXJhbSB0YXJnZXRPcHRpb25zIFRhcmdldCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVCYXNlVGFza3MoZ3VscDogR3VscCwgdGFyZ2V0T3B0aW9uczogVGFyZ2V0QmFzZSk6IEJhc2VUYXNrcyB7XG4gIGNvbnN0IHRhcmdldDogUmVzb2x2ZWRUYXJnZXRCYXNlID0gcmVzb2x2ZVRhcmdldEJhc2UodGFyZ2V0T3B0aW9ucyk7XG5cbiAgY29uc3QgcmVzdWx0OiBCYXNlVGFza3MgPSA8YW55PiB7fTtcblxuICAvLyBUeXBlc2NyaXB0IG9wdGlvbnNcbiAgY29uc3QgdHNPcHRpb25zOiBUeXBlc2NyaXB0Q29uZmlnID0ge1xuICAgIHRzY09wdGlvbnM6IHRhcmdldC50c2NPcHRpb25zLFxuICAgIHRzY29uZmlnSnNvbjogdGFyZ2V0LnRzY29uZmlnSnNvbixcbiAgICBjdXN0b21UeXBpbmdzRGlyOiB0YXJnZXQuY3VzdG9tVHlwaW5nc0RpcixcbiAgICBwYWNrYWdlSnNvbjogdGFyZ2V0LnByb2plY3QuYWJzUGFja2FnZUpzb24sXG4gICAgYnVpbGREaXI6IHRhcmdldC5idWlsZERpcixcbiAgICBzcmNEaXI6IHRhcmdldC5zcmNEaXIsXG4gICAgc2NyaXB0czogdGFyZ2V0LnNjcmlwdHMsXG4gICAgb3V0TW9kdWxlczogdGFyZ2V0Lm91dE1vZHVsZXMsXG4gIH07XG5cbiAgY29uc3Qgd2F0Y2hUYXNrczogVGFza0Z1bmN0aW9uW10gPSBbXTtcblxuICAvLyBidWlsZDpzY3JpcHRzXG4gIHJlc3VsdC5idWlsZFNjcmlwdHMgPSBuYW1lVGFzayhgJHt0YXJnZXQubmFtZX06YnVpbGQ6c2NyaXB0c2AsIGdldEJ1aWxkVHlwZXNjcmlwdFRhc2soZ3VscCwgdHNPcHRpb25zKSk7XG4gIHdhdGNoVGFza3MucHVzaChuYW1lVGFzayhgJHt0YXJnZXQubmFtZX06d2F0Y2g6c2NyaXB0c2AsIGdldEJ1aWxkVHlwZXNjcmlwdFdhdGNoVGFzayhndWxwLCB0c09wdGlvbnMpKSk7XG5cbiAgLy8gYnVpbGQ6Y29weVxuICBpZiAodGFyZ2V0LmNvcHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IFtjb3B5VGFzaywgY29weVdhdGNoVGFza106IFtUYXNrRnVuY3Rpb24sIFRhc2tGdW5jdGlvbl0gPSBnZXRDb3B5KFxuICAgICAgZ3VscCxcbiAgICAgIHRhcmdldC5zcmNEaXIsXG4gICAgICB0YXJnZXQuYnVpbGREaXIsXG4gICAgICB0YXJnZXQuY29weSxcbiAgICApO1xuICAgIHJlc3VsdC5idWlsZENvcHkgPSBuYW1lVGFzayhgJHt0YXJnZXQubmFtZX06YnVpbGQ6Y29weWAsIGNvcHlUYXNrKTtcbiAgICB3YXRjaFRhc2tzLnB1c2gobmFtZVRhc2soYCR7dGFyZ2V0Lm5hbWV9OndhdGNoOmNvcHlgLCBjb3B5V2F0Y2hUYXNrKSk7XG4gIH1cblxuICAvLyBidWlsZFxuICBjb25zdCBidWlsZFRhc2tzOiBUYXNrRnVuY3Rpb25bXSA9IFtyZXN1bHQuYnVpbGRTY3JpcHRzXTtcbiAgaWYgKHJlc3VsdC5idWlsZENvcHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGJ1aWxkVGFza3MucHVzaChyZXN1bHQuYnVpbGRDb3B5KTtcbiAgfVxuICByZXN1bHQuYnVpbGQgPSBuYW1lVGFzayhgJHt0YXJnZXQubmFtZX06YnVpbGRgLCBndWxwLnBhcmFsbGVsKGJ1aWxkVGFza3MpKTtcbiAgcmVzdWx0LndhdGNoID0gbmFtZVRhc2soYCR7dGFyZ2V0Lm5hbWV9OndhdGNoYCwgZ3VscC5zZXJpZXMocmVzdWx0LmJ1aWxkLCBndWxwLnBhcmFsbGVsKHdhdGNoVGFza3MpKSk7XG5cbiAgLy8gY2xlYW5cbiAgaWYgKHRhcmdldC5jbGVhbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xlYW5PcHRpb25zOiBfQ2xlYW5PcHRpb25zID0ge1xuICAgICAgYmFzZTogdGFyZ2V0LnByb2plY3QuYWJzUm9vdCxcbiAgICAgIGRpcnM6IHRhcmdldC5jbGVhbi5kaXJzLFxuICAgICAgZmlsZXM6IHRhcmdldC5jbGVhbi5maWxlcyxcbiAgICB9O1xuICAgIHJlc3VsdC5jbGVhbiA9IG5hbWVUYXNrKGAke3RhcmdldC5uYW1lfTpjbGVhbmAsIGdlbmVyYXRlQ2xlYW5UYXNrKGd1bHAsIGNsZWFuT3B0aW9ucykpO1xuICB9XG5cbiAgLy8gdHNjb25maWcuanNvblxuICBpZiAodGFyZ2V0LnRzY29uZmlnSnNvbiAhPT0gbnVsbCkge1xuICAgIHJlc3VsdC50c2NvbmZpZ0pzb24gPSBuYW1lVGFzayhgJHt0YXJnZXQubmFtZX06dHNjb25maWcuanNvbmAsIGdldFRzY29uZmlnSnNvblRhc2sodHNPcHRpb25zKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbmQgcmVnaXN0ZXJzIGd1bHAgdGFza3MgYXZhaWxhYmxlIGZvciBldmVyeSB0YXJnZXQgKGJhc2UgdGFza3MpLlxuICpcbiAqIEBwYXJhbSBndWxwIEd1bHAgaW5zdGFuY2Ugd2hlcmUgdGhlIHRhc2tzIHdpbGwgYmUgcmVnaXN0ZXJlZC5cbiAqIEBwYXJhbSB0YXJnZXRPcHRpb25zIFRhcmdldCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCYXNlVGFza3MoZ3VscDogR3VscCwgdGFyZ2V0T3B0aW9uczogVGFyZ2V0QmFzZSk6IEJhc2VUYXNrcyB7XG4gIGNvbnN0IHRhc2tzOiBCYXNlVGFza3MgPSBnZW5lcmF0ZUJhc2VUYXNrcyhndWxwLCB0YXJnZXRPcHRpb25zKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdGFza3MpIHtcbiAgICBjb25zdCB0YXNrOiBUYXNrRnVuY3Rpb24gfCB1bmRlZmluZWQgPSAoPGFueT4gdGFza3MpW2tleV07XG4gICAgaWYgKHRhc2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZ3VscC50YXNrKHRhc2spO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG4iXSwic291cmNlUm9vdCI6Ii4uIn0=