projen
Version:
CDK for software projects
132 lines • 19.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PullRequestLint = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const _1 = require(".");
const actions_const_1 = require("./actions.const");
const workflows_model_1 = require("./workflows-model");
const component_1 = require("../component");
/**
* 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 {
github;
options;
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestLint", version: "0.103.12" };
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,
...github.runsOnConfig(options),
permissions: {
pullRequests: workflows_model_1.JobPermission.WRITE,
},
steps: [
{
id: "validate-pr-title",
uses: actions_const_1.GitHubActions.AMANNN_ACTION_SEMANTIC_PULL_REQUEST,
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 scriptBody = [
'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}`);",
"}",
].join("\n");
const helpMessage = "Contributor statement missing from PR description. Please include the following text in the PR description";
const contributorStatement = {
name: "Require Contributor Statement",
...github.runsOnConfig(options),
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_const_1.GitHubActions.ACTIONS_GITHUB_SCRIPT,
with: {
script: scriptBody,
},
},
],
};
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;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC1yZXF1ZXN0LWxpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2l0aHViL3B1bGwtcmVxdWVzdC1saW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSx3QkFBd0M7QUFDeEMsbURBQWdEO0FBRWhELHVEQUFrRDtBQUNsRCw0Q0FBeUM7QUFpRnpDOzs7R0FHRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxxQkFBUztJQUV6QjtJQUNBOztJQUZuQixZQUNtQixNQUFjLEVBQ2QsVUFBa0MsRUFBRTtRQUVyRCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSEwsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFlBQU8sR0FBUCxPQUFPLENBQTZCO1FBSXJELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUM7UUFDekQsTUFBTSx5QkFBeUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFeEUsbUVBQW1FO1FBQ25FLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDdEQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDekQsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNWLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLLEVBQUU7b0JBQ0wsU0FBUztvQkFDVCxRQUFRO29CQUNSLGFBQWE7b0JBQ2IsVUFBVTtvQkFDVixrQkFBa0I7b0JBQ2xCLFFBQVE7aUJBQ1Q7YUFDRjtZQUNELGtFQUFrRTtZQUNsRSx3REFBd0Q7WUFDeEQsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDLENBQUM7UUFFSCxrRkFBa0Y7UUFDbEYseUZBQXlGO1FBQ3pGLE1BQU0sT0FBTyxHQUNYLHFGQUFxRixDQUFDO1FBRXhGLElBQUksa0JBQWtCLEVB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QUssRUFBRTtvQkFDTDt3QkFDRSxJQUFJLEVBQUUsNkJBQWEsQ0FBQyxxQkFBcUI7d0JBQ3pDLElBQUksRUFBRTs0QkFDSixNQUFNLEVBQUUsVUFBVTt5QkFDbkI7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVNLGFBQWE7UUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDdEMsK0VBQStFO1lBQy9FLE1BQU0sVUFBVSxHQUNkLHNCQUFtQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDdkMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLFVBQVUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3ZELFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7O0FBdElILDBDQXVJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgR2l0SHViIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IFB1bGxSZXF1ZXN0VGVtcGxhdGUgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgR2l0SHViQWN0aW9ucyB9IGZyb20gXCIuL2FjdGlvbnMuY29uc3RcIjtcbmltcG9ydCB0eXBlIHsgSm9iIH0gZnJvbSBcIi4vd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyBKb2JQZXJtaXNzaW9uIH0gZnJvbSBcIi4vd29ya2Zsb3dzLW1vZGVsXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IFJ1bnNPbk9wdGlvbnMgfSBmcm9tIFwiLi4vcnVubmVyLW9wdGlvbnNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBQdWxsUmVxdWVzdExpbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxsUmVxdWVzdExpbnRPcHRpb25zIGV4dGVuZHMgUnVuc09uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHB1bGwgcmVxdWVzdCB0aXRsZXMgZm9sbG93IENvbnZlbnRpb25hbCBDb21taXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuY29udmVudGlvbmFsY29tbWl0cy5vcmcvXG4gICAqL1xuICByZWFkb25seSBzZW1hbnRpY1RpdGxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgdmFsaWRhdGluZyB0aGUgY29udmVudGlvbmFsIGNvbW1pdCB0aXRsZSBsaW50ZXIuXG4gICAqIEBkZWZhdWx0IC0gdGl0bGUgbXVzdCBzdGFydCB3aXRoIFwiZmVhdFwiLCBcImZpeFwiLCBvciBcImNob3JlXCJcbiAgICovXG4gIHJlYWRvbmx5IHNlbWFudGljVGl0bGVPcHRpb25zPzogU2VtYW50aWNUaXRsZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFJlcXVpcmUgYSBjb250cmlidXRvciBzdGF0ZW1lbnQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIFBSIGRlc2NyaXB0aW9uLlxuICAgKiBGb3IgZXhhbXBsZSBjb25maXJtaW5nIHRoYXQgdGhlIGNvbnRyaWJ1dGlvbiBoYXMgYmVlbiBtYWRlIGJ5IHRoZSBjb250cmlidXRvciBhbmQgY29tcGxpZXMgd2l0aCB0aGUgcHJvamVjdCdzIGxpY2Vuc2UuXG4gICAqXG4gICAqIEFwcGVuZHMgdGhlIHN0YXRlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBQdWxsIFJlcXVlc3QgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29udHJpYnV0b3Igc3RhdGVtZW50IGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvclN0YXRlbWVudD86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgcmVxdWlyaW5nIGEgY29udHJpYnV0b3Igc3RhdGVtZW50IG9uIFB1bGwgUmVxdWVzdHNcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBjb250cmlidXRvclN0YXRlbWVudE9wdGlvbnM/OiBDb250cmlidXRvclN0YXRlbWVudE9wdGlvbnM7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbGludGluZyB0aGF0IFBSIHRpdGxlcyBmb2xsb3cgQ29udmVudGlvbmFsIENvbW1pdHMuXG4gKiBAc2VlIGh0dHBzOi8vd3d3LmNvbnZlbnRpb25hbGNvbW1pdHMub3JnL1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljVGl0bGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBhIGxpc3Qgb2YgY29tbWl0IHR5cGVzIHRoYXQgYXJlIGFsbG93ZWQuXG4gICAqIEBkZWZhdWx0IFtcImZlYXRcIiwgXCJmaXhcIiwgXCJjaG9yZVwiXVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoYXQgYSBzY29wZSBtdXN0IGFsd2F5cyBiZSBwcm92aWRlZC5cbiAgICogZS5nLiBmZWF0KHVpKSwgZml4KGNvcmUpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlU2NvcGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgd2hpY2ggc2NvcGVzIGFyZSBhbGxvd2VkIChuZXdsaW5lLWRlbGltaXRlZCkuXG4gICAqIFRoZXNlIGFyZSByZWdleCBwYXR0ZXJucyBhdXRvLXdyYXBwZWQgaW4gYF4gJGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWxsIHNjb3BlcyBhbGxvd2VkXG4gICAqL1xuICByZWFkb25seSBzY29wZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciByZXF1aXJpbmcgYSBjb250cmlidXRvciBzdGF0ZW1lbnQgb24gUHVsbCBSZXF1ZXN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyaWJ1dG9yU3RhdGVtZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQdWxsIHJlcXVlc3RzIGZyb20gdGhlc2UgR2l0SHViIHVzZXJzIGFyZSBleGVtcHRlZCBmcm9tIGEgY29udHJpYnV0b3Igc3RhdGVtZW50LlxuICAgKiBAZGVmYXVsdCAtIG5vIHVzZXJzIGFyZSBleGVtcHRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhlbXB0VXNlcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFB1bGwgcmVxdWVzdHMgd2l0aCBvbmUgb2YgdGhlc2UgbGFiZWxzIGFyZSBleGVtcHRlZCBmcm9tIGEgY29udHJpYnV0b3Igc3RhdGVtZW50LlxuICAgKiBAZGVmYXVsdCAtIG5vIGxhYmVscyBhcmUgZXhjbHVkZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4ZW1wdExhYmVscz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZSB2YWxpZGF0aW9ucyB0byBydW4gb24gR2l0SHViIHB1bGwgcmVxdWVzdHMuXG4gKiBPbmx5IGdlbmVyYXRlcyBhIGZpbGUgaWYgYXQgbGVhc3Qgb25lIGxpbnRlciBpcyBjb25maWd1cmVkLlxuICovXG5leHBvcnQgY2xhc3MgUHVsbFJlcXVlc3RMaW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnaXRodWI6IEdpdEh1YixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFB1bGxSZXF1ZXN0TGludE9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoZ2l0aHViLnByb2plY3QpO1xuXG4gICAgY29uc3QgY2hlY2tTZW1hbnRpY1RpdGxlID0gb3B0aW9ucy5zZW1hbnRpY1RpdGxlID8/IHRydWU7XG4gICAgY29uc3QgY2hlY2tDb250cmlidXRvclN0YXRlbWVudCA9IEJvb2xlYW4ob3B0aW9ucy5jb250cmlidXRvclN0YXRlbWVudCk7XG5cbiAgICAvLyBzaG91bGQgb25seSBjcmVhdGUgYSB3b3JrZmxvdyBpZiBvbmUgb3IgbW9yZSBsaW50ZXJzIGFyZSBlbmFibGVkXG4gICAgaWYgKCFjaGVja1NlbWFudGljVGl0bGUgJiYgIWNoZWNrQ29udHJpYnV0b3JTdGF0ZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvdyA9IGdpdGh1Yi5hZGRXb3JrZmxvdyhcInB1bGwtcmVxdWVzdC1saW50XCIpO1xuICAgIHdvcmtmbG93Lm9uKHtcbiAgICAgIHB1bGxSZXF1ZXN0VGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbXG4gICAgICAgICAgXCJsYWJlbGVkXCIsXG4gICAgICAgICAgXCJvcGVuZWRcIixcbiAgICAgICAgICBcInN5bmNocm9uaXplXCIsXG4gICAgICAgICAgXCJyZW9wZW5lZFwiLFxuICAgICAgICAgIFwicmVhZHlfZm9yX3Jldmlld1wiLFxuICAgICAgICAgIFwiZWRpdGVkXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgLy8gcnVuIG9uIG1lcmdlIGdyb3VwLCBidXQgdXNlIGEgY29uZGl0aW9uIGxhdGVyIHRvIGFsd2F5cyBzdWNjZWVkXG4gICAgICAvLyBuZWVkZWQgc28gdGhlIHdvcmtmbG93IGNhbiBiZSBhIHJlcXVpcmVkIHN0YXR1cyBjaGVja1xuICAgICAgbWVyZ2VHcm91cDoge30sXG4gICAgfSk7XG5cbiAgICAvLyBBbGwgY2hlY2tzIGFyZSBydW4gYWdhaW5zdCB0aGUgUFIgYW5kIGNhbiBvbmx5IGJlIGV2YWx1YXRlZCB3aXRoaW4gYSBQUiBjb250ZXh0XG4gICAgLy8gTmVlZGVkIHNvIGpvYnMgY2FuIGJlIHNldCBhcyByZXF1aXJlZCBhbmQgd2lsbCBydW4gc3VjY2Vzc2Z1bGx5IG9uIG1lcmdlIGdyb3VwIGNoZWNrcy5cbiAgICBjb25zdCBwckNoZWNrID1cbiAgICAgIFwiKGdpdGh1Yi5ldmVudF9uYW1lID09ICdwdWxsX3JlcXVlc3QnIHx8IGdpdGh1Yi5ldmVudF9uYW1lID09ICdwdWxsX3JlcXVlc3RfdGFyZ2V0JylcIjtcblxuICAgIGlmIChjaGVja1NlbWFudGljVGl0bGUpIHtcbiAgICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zLnNlbWFudGljVGl0bGVPcHRpb25zID8/IHt9O1xuICAgICAgY29uc3QgdHlwZXMgPSBvcHRzLnR5cGVzID8/IFtcImZlYXRcIiwgXCJmaXhcIiwgXCJjaG9yZVwiXTtcblxuICAgICAgY29uc3QgdmFsaWRhdGVKb2I6IEpvYiA9IHtcbiAgICAgICAgbmFtZTogXCJWYWxpZGF0ZSBQUiB0aXRsZVwiLFxuICAgICAgICBpZjogcHJDaGVjayxcbiAgICAgICAgLi4uZ2l0aHViLnJ1bnNPbkNvbmZpZyhvcHRpb25zKSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICBwdWxsUmVxdWVzdHM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFwidmFsaWRhdGUtcHItdGl0bGVcIixcbiAgICAgICAgICAgIHVzZXM6IEdpdEh1YkFjdGlvbnMuQU1BTk5OX0FDVElPTl9TRU1BTlRJQ19QVUxMX1JFUVVFU1QsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgR0lUSFVCX1RPS0VOOiBcIiR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgdHlwZXM6IHR5cGVzLmpvaW4oXCJcXG5cIiksXG4gICAgICAgICAgICAgIC4uLihvcHRzLnNjb3BlcyA/IHsgc2NvcGVzOiBvcHRzLnNjb3Blcy5qb2luKFwiXFxuXCIpIH0gOiB7fSksXG4gICAgICAgICAgICAgIHJlcXVpcmVTY29wZTogb3B0cy5yZXF1aXJlU2NvcGUgPz8gZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICB3b3JrZmxvdy5hZGRKb2JzKHsgdmFsaWRhdGU6IHZhbGlkYXRlSm9iIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNvbnRyaWJ1dG9yU3RhdGVtZW50KSB7XG4gICAgICBjb25zdCBvcHRzID0gb3B0aW9ucy5jb250cmlidXRvclN0YXRlbWVudE9wdGlvbnMgPz8ge307XG4gICAgICBjb25zdCB1c2VycyA9IG9wdHMuZXhlbXB0VXNlcnMgPz8gW107XG4gICAgICBjb25zdCBsYWJlbHMgPSBvcHRzLmV4ZW1wdExhYmVscyA/PyBbXTtcblxuICAgICAgY29uc3QgY29uZGl0aW9ucyA9IFtwckNoZWNrXTtcblxuICAgICAgY29uc3QgZXhjbHVzaW9uczogc3RyaW5nW10gPSBbXG4gICAgICAgIC4uLmxhYmVscy5tYXAoXG4gICAgICAgICAgKGwpID0+IGBjb250YWlucyhnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmxhYmVscy4qLm5hbWUsICcke2x9JylgLFxuICAgICAgICApLFxuICAgICAgICAuLi51c2Vycy5tYXAoKHUpID0+IGBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LnVzZXIubG9naW4gPT0gJyR7dX0nYCksXG4gICAgICBdO1xuXG4gICAgICBpZiAoZXhjbHVzaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKGAhKCR7ZXhjbHVzaW9ucy5qb2luKFwiIHx8IFwiKX0pYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcmlwdEJvZHkgPSBbXG4gICAgICAgICdjb25zdCBhY3R1YWwgPSBwcm9jZXNzLmVudi5QUl9CT0RZLnJlcGxhY2UoL1xcXFxyP1xcXFxuL2csIFwiXFxcXG5cIik7JyxcbiAgICAgICAgJ2NvbnN0IGV4cGVjdGVkID0gcHJvY2Vzcy5lbnYuRVhQRUNURUQucmVwbGFjZSgvXFxcXHI/XFxcXG4vZywgXCJcXFxcblwiKTsnLFxuICAgICAgICBcImlmICghYWN0dWFsLmluY2x1ZGVzKGV4cGVjdGVkKSkge1wiLFxuICAgICAgICAnICAgIGNvbnNvbGUubG9nKFwiJWpcIiwgYWN0dWFsKTsnLFxuICAgICAgICAnICAgIGNvbnNvbGUubG9nKFwiJWpcIiwgZXhwZWN0ZWQpOycsXG4gICAgICAgIFwiICAgIGNvcmUuc2V0RmFpbGVkKGAke3Byb2Nlc3MuZW52LkhFTFB9OiAke2V4cGVjdGVkfWApO1wiLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcblxuICAgICAgY29uc3QgaGVscE1lc3NhZ2UgPVxuICAgICAgICBcIkNvbnRyaWJ1dG9yIHN0YXRlbWVudCBtaXNzaW5nIGZyb20gUFIgZGVzY3JpcHRpb24uIFBsZWFzZSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgdGV4dCBpbiB0aGUgUFIgZGVzY3JpcHRpb25cIjtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9yU3RhdGVtZW50OiBKb2IgPSB7XG4gICAgICAgIG5hbWU6IFwiUmVxdWlyZSBDb250cmlidXRvciBTdGF0ZW1lbnRcIixcbiAgICAgICAgLi4uZ2l0aHViLnJ1bnNPbkNvbmZpZyhvcHRpb25zKSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICBwdWxsUmVxdWVzdHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgfSxcbiAgICAgICAgaWY6IGNvbmRpdGlvbnMuam9pbihcIiAmJiBcIiksXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIFBSX0JPRFk6IFwiJHt7IGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QuYm9keSB9fVwiLFxuICAgICAgICAgIEVYUEVDVEVEOiBvcHRpb25zLmNvbnRyaWJ1dG9yU3RhdGVtZW50LFxuICAgICAgICAgIEhFTFA6IGhlbHBNZXNzYWdlLFxuICAgICAgICB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXM6IEdpdEh1YkFjdGlvbnMuQUNUSU9OU19HSVRIVUJfU0NSSVBULFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBzY3JpcHQ6IHNjcmlwdEJvZHksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICB3b3JrZmxvdy5hZGRKb2JzKHsgY29udHJpYnV0b3JTdGF0ZW1lbnQgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByZVN5bnRoZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb250cmlidXRvclN0YXRlbWVudCkge1xuICAgICAgLy8gQXBwZW5kIHRvIFBSIHRlbXBsYXRlIGluIHByZVN5bnRoZXNpemUgc28gaXQncyBhbHdheXMgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZVxuICAgICAgY29uc3QgcHJUZW1wbGF0ZSA9XG4gICAgICAgIFB1bGxSZXF1ZXN0VGVtcGxhdGUub2YodGhpcy5wcm9qZWN0KSA/P1xuICAgICAgICB0aGlzLmdpdGh1Yi5hZGRQdWxsUmVxdWVzdFRlbXBsYXRlKCk7XG4gICAgICBwclRlbXBsYXRlPy5hZGRMaW5lKFwiXCIpO1xuICAgICAgcHJUZW1wbGF0ZT8uYWRkTGluZShcIi0tLVwiKTtcbiAgICAgIHByVGVtcGxhdGU/LmFkZExpbmUodGhpcy5vcHRpb25zLmNvbnRyaWJ1dG9yU3RhdGVtZW50KTtcbiAgICAgIHByVGVtcGxhdGU/LmFkZExpbmUoXCJcIik7XG4gICAgfVxuICB9XG59XG4iXX0=