projen
Version:
CDK for software projects
148 lines • 23 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PullRequestLint = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const _1 = require(".");
const workflows_model_1 = require("./workflows-model");
const component_1 = require("../component");
const runner_options_1 = require("../runner-options");
/**
* Configure validations to run on GitHub pull requests.
* Only generates a file if at least one linter is configured.
*/
class PullRequestLint extends component_1.Component {
constructor(github, options = {}) {
super(github.project);
this.github = github;
this.options = options;
const checkSemanticTitle = options.semanticTitle ?? true;
const checkContributorStatement = Boolean(options.contributorStatement);
// should only create a workflow if one or more linters are enabled
if (!checkSemanticTitle && !checkContributorStatement) {
return;
}
const workflow = github.addWorkflow("pull-request-lint");
workflow.on({
pullRequestTarget: {
types: [
"labeled",
"opened",
"synchronize",
"reopened",
"ready_for_review",
"edited",
],
},
// run on merge group, but use a condition later to always succeed
// needed so the workflow can be a required status check
mergeGroup: {},
});
// All checks are run against the PR and can only be evaluated within a PR context
// Needed so jobs can be set as required and will run successfully on merge group checks.
const prCheck = "(github.event_name == 'pull_request' || github.event_name == 'pull_request_target')";
if (checkSemanticTitle) {
const opts = options.semanticTitleOptions ?? {};
const types = opts.types ?? ["feat", "fix", "chore"];
const validateJob = {
name: "Validate PR title",
if: prCheck,
...(0, runner_options_1.filteredRunsOnOptions)(options.runsOn, options.runsOnGroup),
permissions: {
pullRequests: workflows_model_1.JobPermission.WRITE,
},
steps: [
{
uses: "amannn/action-semantic-pull-request@v6",
env: {
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}",
},
with: {
types: types.join("\n"),
...(opts.scopes ? { scopes: opts.scopes.join("\n") } : {}),
requireScope: opts.requireScope ?? false,
},
},
],
};
workflow.addJobs({ validate: validateJob });
}
if (options.contributorStatement) {
const opts = options.contributorStatementOptions ?? {};
const users = opts.exemptUsers ?? [];
const labels = opts.exemptLabels ?? [];
const conditions = [prCheck];
const exclusions = [
...labels.map((l) => `contains(github.event.pull_request.labels.*.name, '${l}')`),
...users.map((u) => `github.event.pull_request.user.login == '${u}'`),
];
if (exclusions.length) {
conditions.push(`!(${exclusions.join(" || ")})`);
}
const script = (core) => {
const actual = process.env.PR_BODY.replace(/\r?\n/g, "\n");
const expected = process.env.EXPECTED.replace(/\r?\n/g, "\n");
if (!actual.includes(expected)) {
console.log("%j", actual);
console.log("%j", expected);
core.setFailed(`${process.env.HELP}: ${expected}`);
}
};
const helpMessage = "Contributor statement missing from PR description. Please include the following text in the PR description";
const contributorStatement = {
name: "Require Contributor Statement",
runsOn: options.runsOn ?? ["ubuntu-latest"],
permissions: {
pullRequests: workflows_model_1.JobPermission.READ,
},
if: conditions.join(" && "),
env: {
PR_BODY: "${{ github.event.pull_request.body }}",
EXPECTED: options.contributorStatement,
HELP: helpMessage,
},
steps: [
{
uses: "actions/github-script@v8",
with: {
script: fnBody(script),
},
},
],
};
workflow.addJobs({ contributorStatement });
}
}
preSynthesize() {
if (this.options.contributorStatement) {
// Append to PR template in preSynthesize so it's always at the end of the file
const prTemplate = _1.PullRequestTemplate.of(this.project) ??
this.github.addPullRequestTemplate();
prTemplate?.addLine("");
prTemplate?.addLine("---");
prTemplate?.addLine(this.options.contributorStatement);
prTemplate?.addLine("");
}
}
}
exports.PullRequestLint = PullRequestLint;
_a = JSII_RTTI_SYMBOL_1;
PullRequestLint[_a] = { fqn: "projen.github.PullRequestLint", version: "0.99.16" };
/**
* Helper to generate a JS script as string from a function object
* @returns A prettified string of the function's body
*/
function fnBody(fn) {
const def = fn.toString().replace(/\r?\n/g, "\n");
const body = def
.substring(def.indexOf("{") + 1, def.lastIndexOf("}"))
.split("\n");
const minIndentation = Math.min(...body
.filter((l) => l.trim()) // ignore empty lines
.map((l) => l.search(/\S|$/)));
return body
.map((l) => l.replace(" ".repeat(minIndentation), ""))
.join("\n")
.trim();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC1yZXF1ZXN0LWxpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2l0aHViL3B1bGwtcmVxdWVzdC1saW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0JBQWdEO0FBQ2hELHVEQUF1RDtBQUN2RCw0Q0FBeUM7QUFDekMsc0RBQThFO0FBK0Y5RTs7O0dBR0c7QUFDSCxNQUFhLGVBQWdCLFNBQVEscUJBQVM7SUFDNUMsWUFDbUIsTUFBYyxFQUNkLFVBQWtDLEVBQUU7UUFFckQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUhMLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUE2QjtRQUlyRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDO1FBQ3pELE1BQU0seUJBQXlCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXhFLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3RELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDVixpQkFBaUIsRUFBRTtnQkFDakIsS0FBSyxFQUFFO29CQUNMLFNBQVM7b0JBQ1QsUUFBUTtvQkFDUixhQUFhO29CQUNiLFVBQVU7b0JBQ1Ysa0JBQWtCO29CQUNsQixRQUFRO2lCQUNUO2FBQ0Y7WUFDRCxrRUFBa0U7WUFDbEUsd0RBQXdEO1lBQ3hELFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsa0ZBQWtGO1FBQ2xGLHlGQUF5RjtRQUN6RixNQUFNLE9BQU8sR0FDWCxxRkFBcUYsQ0FBQztRQUV4RixJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFD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OztBQXJJSCwwQ0FzSUM7OztBQUVEOzs7R0FHRztBQUNILFNBQVMsTUFBTSxDQUFDLEVBQTJCO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xELE1BQU0sSUFBSSxHQUFHLEdBQUc7U0FDYixTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNyRCxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUM3QixHQUFHLElBQUk7U0FDSixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtTQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDaEMsQ0FBQztJQUVGLE9BQU8sSUFBSTtTQUNSLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3JELElBQUksQ0FBQyxJQUFJLENBQUM7U0FDVixJQUFJLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHaXRIdWIsIFB1bGxSZXF1ZXN0VGVtcGxhdGUgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgSm9iLCBKb2JQZXJtaXNzaW9uIH0gZnJvbSBcIi4vd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgeyBHcm91cFJ1bm5lck9wdGlvbnMsIGZpbHRlcmVkUnVuc09uT3B0aW9ucyB9IGZyb20gXCIuLi9ydW5uZXItb3B0aW9uc1wiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIFB1bGxSZXF1ZXN0TGludFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1bGxSZXF1ZXN0TGludE9wdGlvbnMge1xuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBwdWxsIHJlcXVlc3QgdGl0bGVzIGZvbGxvdyBDb252ZW50aW9uYWwgQ29tbWl0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LmNvbnZlbnRpb25hbGNvbW1pdHMub3JnL1xuICAgKi9cbiAgcmVhZG9ubHkgc2VtYW50aWNUaXRsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIHZhbGlkYXRpbmcgdGhlIGNvbnZlbnRpb25hbCBjb21taXQgdGl0bGUgbGludGVyLlxuICAgKiBAZGVmYXVsdCAtIHRpdGxlIG11c3Qgc3RhcnQgd2l0aCBcImZlYXRcIiwgXCJmaXhcIiwgb3IgXCJjaG9yZVwiXG4gICAqL1xuICByZWFkb25seSBzZW1hbnRpY1RpdGxlT3B0aW9ucz86IFNlbWFudGljVGl0bGVPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBHaXRodWIgUnVubmVyIHNlbGVjdGlvbiBsYWJlbHNcbiAgICogQGRlZmF1bHQgW1widWJ1bnR1LWxhdGVzdFwiXVxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIHRhcmdldCBSdW5uZXIgYnkgbGFiZWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBib3RoIGBydW5zT25gIGFuZCBgcnVuc09uR3JvdXBgIGFyZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnNPbj86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBHaXRodWIgUnVubmVyIEdyb3VwIHNlbGVjdGlvbiBvcHRpb25zXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgdGFyZ2V0IFJ1bm5lciBHcm91cCBieSBuYW1lIGFuZC9vciBsYWJlbHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIGJvdGggYHJ1bnNPbmAgYW5kIGBydW5zT25Hcm91cGAgYXJlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcnVuc09uR3JvdXA/OiBHcm91cFJ1bm5lck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFJlcXVpcmUgYSBjb250cmlidXRvciBzdGF0ZW1lbnQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIFBSIGRlc2NyaXB0aW9uLlxuICAgKiBGb3IgZXhhbXBsZSBjb25maXJtaW5nIHRoYXQgdGhlIGNvbnRyaWJ1dGlvbiBoYXMgYmVlbiBtYWRlIGJ5IHRoZSBjb250cmlidXRvciBhbmQgY29tcGxpZXMgd2l0aCB0aGUgcHJvamVjdCdzIGxpY2Vuc2UuXG4gICAqXG4gICAqIEFwcGVuZHMgdGhlIHN0YXRlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBQdWxsIFJlcXVlc3QgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29udHJpYnV0b3Igc3RhdGVtZW50IGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvclN0YXRlbWVudD86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgcmVxdWlyaW5nIGEgY29udHJpYnV0b3Igc3RhdGVtZW50IG9uIFB1bGwgUmVxdWVzdHNcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvclN0YXRlbWVudE9wdGlvbnM/OiBDb250cmlidXRvclN0YXRlbWVudE9wdGlvbnM7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbGludGluZyB0aGF0IFBSIHRpdGxlcyBmb2xsb3cgQ29udmVudGlvbmFsIENvbW1pdHMuXG4gKiBAc2VlIGh0dHBzOi8vd3d3LmNvbnZlbnRpb25hbGNvbW1pdHMub3JnL1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljVGl0bGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBhIGxpc3Qgb2YgY29tbWl0IHR5cGVzIHRoYXQgYXJlIGFsbG93ZWQuXG4gICAqIEBkZWZhdWx0IFtcImZlYXRcIiwgXCJmaXhcIiwgXCJjaG9yZVwiXVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoYXQgYSBzY29wZSBtdXN0IGFsd2F5cyBiZSBwcm92aWRlZC5cbiAgICogZS5nLiBmZWF0KHVpKSwgZml4KGNvcmUpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlU2NvcGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgd2hpY2ggc2NvcGVzIGFyZSBhbGxvd2VkIChuZXdsaW5lLWRlbGltaXRlZCkuXG4gICAqIFRoZXNlIGFyZSByZWdleCBwYXR0ZXJucyBhdXRvLXdyYXBwZWQgaW4gYF4gJGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWxsIHNjb3BlcyBhbGxvd2VkXG4gICAqL1xuICByZWFkb25seSBzY29wZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciByZXF1aXJpbmcgYSBjb250cmlidXRvciBzdGF0ZW1lbnQgb24gUHVsbCBSZXF1ZXN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyaWJ1dG9yU3RhdGVtZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQdWxsIHJlcXVlc3RzIGZyb20gdGhlc2UgR2l0SHViIHVzZXJzIGFyZSBleGVtcHRlZCBmcm9tIGEgY29udHJpYnV0b3Igc3RhdGVtZW50LlxuICAgKiBAZGVmYXVsdCAtIG5vIHVzZXJzIGFyZSBleGVtcHRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhlbXB0VXNlcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFB1bGwgcmVxdWVzdHMgd2l0aCBvbmUgb2YgdGhlc2UgbGFiZWxzIGFyZSBleGVtcHRlZCBmcm9tIGEgY29udHJpYnV0b3Igc3RhdGVtZW50LlxuICAgKiBAZGVmYXVsdCAtIG5vIGxhYmVscyBhcmUgZXhjbHVkZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4ZW1wdExhYmVscz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZSB2YWxpZGF0aW9ucyB0byBydW4gb24gR2l0SHViIHB1bGwgcmVxdWVzdHMuXG4gKiBPbmx5IGdlbmVyYXRlcyBhIGZpbGUgaWYgYXQgbGVhc3Qgb25lIGxpbnRlciBpcyBjb25maWd1cmVkLlxuICovXG5leHBvcnQgY2xhc3MgUHVsbFJlcXVlc3RMaW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnaXRodWI6IEdpdEh1YixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFB1bGxSZXF1ZXN0TGludE9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoZ2l0aHViLnByb2plY3QpO1xuXG4gICAgY29uc3QgY2hlY2tTZW1hbnRpY1RpdGxlID0gb3B0aW9ucy5zZW1hbnRpY1RpdGxlID8/IHRydWU7XG4gICAgY29uc3QgY2hlY2tDb250cmlidXRvclN0YXRlbWVudCA9IEJvb2xlYW4ob3B0aW9ucy5jb250cmlidXRvclN0YXRlbWVudCk7XG5cbiAgICAvLyBzaG91bGQgb25seSBjcmVhdGUgYSB3b3JrZmxvdyBpZiBvbmUgb3IgbW9yZSBsaW50ZXJzIGFyZSBlbmFibGVkXG4gICAgaWYgKCFjaGVja1NlbWFudGljVGl0bGUgJiYgIWNoZWNrQ29udHJpYnV0b3JTdGF0ZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvdyA9IGdpdGh1Yi5hZGRXb3JrZmxvdyhcInB1bGwtcmVxdWVzdC1saW50XCIpO1xuICAgIHdvcmtmbG93Lm9uKHtcbiAgICAgIHB1bGxSZXF1ZXN0VGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbXG4gICAgICAgICAgXCJsYWJlbGVkXCIsXG4gICAgICAgICAgXCJvcGVuZWRcIixcbiAgICAgICAgICBcInN5bmNocm9uaXplXCIsXG4gICAgICAgICAgXCJyZW9wZW5lZFwiLFxuICAgICAgICAgIFwicmVhZHlfZm9yX3Jldmlld1wiLFxuICAgICAgICAgIFwiZWRpdGVkXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgLy8gcnVuIG9uIG1lcmdlIGdyb3VwLCBidXQgdXNlIGEgY29uZGl0aW9uIGxhdGVyIHRvIGFsd2F5cyBzdWNjZWVkXG4gICAgICAvLyBuZWVkZWQgc28gdGhlIHdvcmtmbG93IGNhbiBiZSBhIHJlcXVpcmVkIHN0YXR1cyBjaGVja1xuICAgICAgbWVyZ2VHcm91cDoge30sXG4gICAgfSk7XG5cbiAgICAvLyBBbGwgY2hlY2tzIGFyZSBydW4gYWdhaW5zdCB0aGUgUFIgYW5kIGNhbiBvbmx5IGJlIGV2YWx1YXRlZCB3aXRoaW4gYSBQUiBjb250ZXh0XG4gICAgLy8gTmVlZGVkIHNvIGpvYnMgY2FuIGJlIHNldCBhcyByZXF1aXJlZCBhbmQgd2lsbCBydW4gc3VjY2Vzc2Z1bGx5IG9uIG1lcmdlIGdyb3VwIGNoZWNrcy5cbiAgICBjb25zdCBwckNoZWNrID1cbiAgICAgIFwiKGdpdGh1Yi5ldmVudF9uYW1lID09ICdwdWxsX3JlcXVlc3QnIHx8IGdpdGh1Yi5ldmVudF9uYW1lID09ICdwdWxsX3JlcXVlc3RfdGFyZ2V0JylcIjtcblxuICAgIGlmIChjaGVja1NlbWFudGljVGl0bGUpIHtcbiAgICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zLnNlbWFudGljVGl0bGVPcHRpb25zID8/IHt9O1xuICAgICAgY29uc3QgdHlwZXMgPSBvcHRzLnR5cGVzID8/IFtcImZlYXRcIiwgXCJmaXhcIiwgXCJjaG9yZVwiXTtcblxuICAgICAgY29uc3QgdmFsaWRhdGVKb2I6IEpvYiA9IHtcbiAgICAgICAgbmFtZTogXCJWYWxpZGF0ZSBQUiB0aXRsZVwiLFxuICAgICAgICBpZjogcHJDaGVjayxcbiAgICAgICAgLi4uZmlsdGVyZWRSdW5zT25PcHRpb25zKG9wdGlvbnMucnVuc09uLCBvcHRpb25zLnJ1bnNPbkdyb3VwKSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICBwdWxsUmVxdWVzdHM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlczogXCJhbWFubm4vYWN0aW9uLXNlbWFudGljLXB1bGwtcmVxdWVzdEB2NlwiLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogXCIke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX1cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHR5cGVzOiB0eXBlcy5qb2luKFwiXFxuXCIpLFxuICAgICAgICAgICAgICAuLi4ob3B0cy5zY29wZXMgPyB7IHNjb3Blczogb3B0cy5zY29wZXMuam9pbihcIlxcblwiKSB9IDoge30pLFxuICAgICAgICAgICAgICByZXF1aXJlU2NvcGU6IG9wdHMucmVxdWlyZVNjb3BlID8/IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgd29ya2Zsb3cuYWRkSm9icyh7IHZhbGlkYXRlOiB2YWxpZGF0ZUpvYiB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5jb250cmlidXRvclN0YXRlbWVudCkge1xuICAgICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMuY29udHJpYnV0b3JTdGF0ZW1lbnRPcHRpb25zID8/IHt9O1xuICAgICAgY29uc3QgdXNlcnMgPSBvcHRzLmV4ZW1wdFVzZXJzID8/IFtdO1xuICAgICAgY29uc3QgbGFiZWxzID0gb3B0cy5leGVtcHRMYWJlbHMgPz8gW107XG5cbiAgICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBbcHJDaGVja107XG5cbiAgICAgIGNvbnN0IGV4Y2x1c2lvbnM6IHN0cmluZ1tdID0gW1xuICAgICAgICAuLi5sYWJlbHMubWFwKFxuICAgICAgICAgIChsKSA9PiBgY29udGFpbnMoZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5sYWJlbHMuKi5uYW1lLCAnJHtsfScpYCxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udXNlcnMubWFwKCh1KSA9PiBgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC51c2VyLmxvZ2luID09ICcke3V9J2ApLFxuICAgICAgXTtcblxuICAgICAgaWYgKGV4Y2x1c2lvbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChgISgke2V4Y2x1c2lvbnMuam9pbihcIiB8fCBcIil9KWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzY3JpcHQgPSAoY29yZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IHByb2Nlc3MuZW52LlBSX0JPRFkhLnJlcGxhY2UoL1xccj9cXG4vZywgXCJcXG5cIik7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gcHJvY2Vzcy5lbnYuRVhQRUNURUQhLnJlcGxhY2UoL1xccj9cXG4vZywgXCJcXG5cIik7XG4gICAgICAgIGlmICghYWN0dWFsLmluY2x1ZGVzKGV4cGVjdGVkKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiJWpcIiwgYWN0dWFsKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIiVqXCIsIGV4cGVjdGVkKTtcbiAgICAgICAgICBjb3JlLnNldEZhaWxlZChgJHtwcm9jZXNzLmVudi5IRUxQfTogJHtleHBlY3RlZH1gKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgaGVscE1lc3NhZ2UgPVxuICAgICAgICBcIkNvbnRyaWJ1dG9yIHN0YXRlbWVudCBtaXNzaW5nIGZyb20gUFIgZGVzY3JpcHRpb24uIFBsZWFzZSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgdGV4dCBpbiB0aGUgUFIgZGVzY3JpcHRpb25cIjtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9yU3RhdGVtZW50OiBKb2IgPSB7XG4gICAgICAgIG5hbWU6IFwiUmVxdWlyZSBDb250cmlidXRvciBTdGF0ZW1lbnRcIixcbiAgICAgICAgcnVuc09uOiBvcHRpb25zLnJ1bnNPbiA/PyBbXCJ1YnVudHUtbGF0ZXN0XCJdLFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgIHB1bGxSZXF1ZXN0czogSm9iUGVybWlzc2lvbi5SRUFELFxuICAgICAgICB9LFxuICAgICAgICBpZjogY29uZGl0aW9ucy5qb2luKFwiICYmIFwiKSxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgUFJfQk9EWTogXCIke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5ib2R5IH19XCIsXG4gICAgICAgICAgRVhQRUNURUQ6IG9wdGlvbnMuY29udHJpYnV0b3JTdGF0ZW1lbnQsXG4gICAgICAgICAgSEVMUDogaGVscE1lc3NhZ2UsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlczogXCJhY3Rpb25zL2dpdGh1Yi1zY3JpcHRAdjhcIixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgc2NyaXB0OiBmbkJvZHkoc2NyaXB0KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG5cbiAgICAgIHdvcmtmbG93LmFkZEpvYnMoeyBjb250cmlidXRvclN0YXRlbWVudCB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJlU3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRyaWJ1dG9yU3RhdGVtZW50KSB7XG4gICAgICAvLyBBcHBlbmQgdG8gUFIgdGVtcGxhdGUgaW4gcHJlU3ludGhlc2l6ZSBzbyBpdCdzIGFsd2F5cyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlXG4gICAgICBjb25zdCBwclRlbXBsYXRlID1cbiAgICAgICAgUHVsbFJlcXVlc3RUZW1wbGF0ZS5vZih0aGlzLnByb2plY3QpID8/XG4gICAgICAgIHRoaXMuZ2l0aHViLmFkZFB1bGxSZXF1ZXN0VGVtcGxhdGUoKTtcbiAgICAgIHByVGVtcGxhdGU/LmFkZExpbmUoXCJcIik7XG4gICAgICBwclRlbXBsYXRlPy5hZGRMaW5lKFwiLS0tXCIpO1xuICAgICAgcHJUZW1wbGF0ZT8uYWRkTGluZSh0aGlzLm9wdGlvbnMuY29udHJpYnV0b3JTdGF0ZW1lbnQpO1xuICAgICAgcHJUZW1wbGF0ZT8uYWRkTGluZShcIlwiKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2VuZXJhdGUgYSBKUyBzY3JpcHQgYXMgc3RyaW5nIGZyb20gYSBmdW5jdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgcHJldHRpZmllZCBzdHJpbmcgb2YgdGhlIGZ1bmN0aW9uJ3MgYm9keVxuICovXG5mdW5jdGlvbiBmbkJvZHkoZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB7XG4gIGNvbnN0IGRlZiA9IGZuLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlxcblwiKTtcbiAgY29uc3QgYm9keSA9IGRlZlxuICAgIC5zdWJzdHJpbmcoZGVmLmluZGV4T2YoXCJ7XCIpICsgMSwgZGVmLmxhc3RJbmRleE9mKFwifVwiKSlcbiAgICAuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IG1pbkluZGVudGF0aW9uID0gTWF0aC5taW4oXG4gICAgLi4uYm9keVxuICAgICAgLmZpbHRlcigobCkgPT4gbC50cmltKCkpIC8vIGlnbm9yZSBlbXB0eSBsaW5lc1xuICAgICAgLm1hcCgobCkgPT4gbC5zZWFyY2goL1xcU3wkLykpLFxuICApO1xuXG4gIHJldHVybiBib2R5XG4gICAgLm1hcCgobCkgPT4gbC5yZXBsYWNlKFwiIFwiLnJlcGVhdChtaW5JbmRlbnRhdGlvbiksIFwiXCIpKVxuICAgIC5qb2luKFwiXFxuXCIpXG4gICAgLnRyaW0oKTtcbn1cbiJdfQ==