UNPKG

projen

Version:

CDK for software projects

120 lines • 16.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.isObjectContainingFieldExactly = exports.Circleci = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const component_1 = require("../component"); const util_1 = require("../util"); const yaml_1 = require("../yaml"); /** * Circleci Class to manage `.circleci/config.yml`. * Check projen's docs for more information. * * @see https://circleci.com/docs/2.0/configuration-reference/ */ class Circleci extends component_1.Component { constructor(project, options = {}) { super(project); /** * reduce objects with `identifier` field for WorkflowJobs. * A workflow job can contain `orbParameter` which are passed to orbs. * This map is directly added as `Record<string,any>` to job. * So we gonna add those after the default field of WorkflowJob. * @see https://circleci.com/developer/orbs/orb/circleci/node#usage-install_nodejs * @param jobs */ this.renderJobs = (jobs = []) => { let result = []; for (const job of jobs ?? []) { const { identifier, orbParameters, ...reduced } = job; if ((0, exports.isObjectContainingFieldExactly)(job, "identifier")) { result = [...result, identifier]; } else { result = [ ...result, { [identifier]: { ...reduced, ...orbParameters } }, ]; } } return result; }; /** * Snake case for listed keys. There are too many exceptions needed to do it recursive without a whitelist. * This list needs to be updated once we add field with snake case like `aws_auth`. * @param input */ this.snakeCase = (input) => { const snakeCaseKeyWords = [ "awsAuth", "workingDirectory", "resourceClass", "dockerLayerCaching", "noOutputTimeout", "circleciIpRanges", ]; return (0, util_1.snakeCaseKeys)(input, true, snakeCaseKeyWords); }; this.options = options; this.orbs = options.orbs ?? {}; this.workflows = options.workflows ?? []; this.jobs = options.jobs ?? []; this.file = new yaml_1.YamlFile(project, ".circleci/config.yml", { obj: () => this.renderCircleCi(), }); } /** * function to prepare the rendering of the yaml file. * Objects with dynamic keys like workflows and jobs required the field `identifier` to be set. * Those object will be reduced by `identifier` field before rendering * @private */ renderCircleCi() { // render dynamic keys for workflow const workflowRecords = {}; for (const workflow of this.workflows) { const { identifier, ...reduced } = workflow; reduced.jobs = this.renderJobs(workflow.jobs); workflowRecords[identifier] = this.snakeCase(reduced); } // render dynamic keys for jobs const jobRecords = {}; for (const job of this.jobs) { const { identifier, ...reduced } = job; jobRecords[identifier] = this.snakeCase(reduced); } return { version: this.options.version || 2.1, setup: this.options.setup, orbs: this.orbs, jobs: Object.keys(jobRecords).length > 0 ? jobRecords : undefined, workflows: workflowRecords, }; } /** * add new workflow to existing pipeline * @param workflow */ addWorkflow(workflow) { this.workflows = [...this.workflows, workflow]; } /** * Add a Circleci Orb to pipeline. Will throw error if the orb already exists * @param name * @param orb */ addOrb(name, orb) { if (this.orbs[name] !== undefined) { throw new Error(`Circleci Config already contains an orb named ${name}.`); } this.orbs[name] = orb; } } exports.Circleci = Circleci; _a = JSII_RTTI_SYMBOL_1; Circleci[_a] = { fqn: "projen.circleci.Circleci", version: "0.95.2" }; const isObjectContainingFieldExactly = (obj, field) => { return Object.keys(obj).length == 1 && Object.keys(obj).includes(field); }; exports.isObjectContainingFieldExactly = isObjectContainingFieldExactly; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lyY2xlY2kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2lyY2xlY2kvY2lyY2xlY2kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSw0Q0FBeUM7QUFFekMsa0NBQXdDO0FBQ3hDLGtDQUFtQztBQWdFbkM7Ozs7O0dBS0c7QUFDSCxNQUFhLFFBQVMsU0FBUSxxQkFBUztJQTBCckMsWUFBWSxPQUFnQixFQUFFLFVBQXlCLEVBQUU7UUFDdkQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBaURqQjs7Ozs7OztXQU9HO1FBQ0ssZUFBVSxHQUFHLENBQUMsT0FBc0IsRUFBRSxFQUFPLEVBQUU7WUFDckQsSUFBSSxNQUFNLEdBQVEsRUFBRSxDQUFDO1lBQ3JCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM3QixNQUFNLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLEdBQUcsQ0FBQztnQkFDdEQsSUFBSSxJQUFBLHNDQUE4QixFQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUN0RCxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sR0FBRzt3QkFDUCxHQUFHLE1BQU07d0JBQ1QsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxhQUFhLEVBQUUsRUFBRTtxQkFDbkQsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQWNGOzs7O1dBSUc7UUFDSyxjQUFTLEdBQUcsQ0FBQyxLQUFVLEVBQU8sRUFBRTtZQUN0QyxNQUFNLGlCQUFpQixHQUFHO2dCQUN4QixTQUFTO2dCQUNULGtCQUFrQjtnQkFDbEIsZUFBZTtnQkFDZixvQkFB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Q0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRSxDQUFDLENBQUM7QUFMVyxRQUFBLDhCQUE4QixrQ0FLekMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXb3JrZmxvd0pvYiwgV29ya2Zsb3csIEpvYiB9IGZyb20gXCIuL21vZGVsXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcbmltcG9ydCB7IHNuYWtlQ2FzZUtleXMgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgWWFtbEZpbGUgfSBmcm9tIFwiLi4veWFtbFwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNsYXNzIHtAbGluayBDaXJjbGVjaX1cbiAqXG4gKiBAc2VlIGh0dHBzOi8vY2lyY2xlY2kuY29tL2RvY3MvMi4wL2NvbmZpZ3VyYXRpb24tcmVmZXJlbmNlL1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENpcmNsZUNpUHJvcHMge1xuICAvKipcbiAgICogQ29udGFpbnMgYSBtYXAgb2YgQ2lyY2xDaSBPcmJzXG4gICAqIGBgYGpzb25cbiAgICogb3Jiczoge1xuICAgKiAgbm9kZTogXCJjaXJjbGVjaS9ub2RlQDUuMC4xXCJcbiAgICogIHNsYWNrOiBcImNpcmNsZWNpL3NsYWNrQDQuOC4zXCJcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IG9yYnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogcGlwZWxpbmUgdmVyc2lvblxuICAgKlxuICAgKiBAZGVmYXVsdCAyLjFcbiAgICogQHNlZSBodHRwczovL2NpcmNsZWNpLmNvbS9kb2NzLzIuMC9jb25maWd1cmF0aW9uLXJlZmVyZW5jZS8jdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIExpc3Qgb2YgV29ya2Zsb3dzIG9mIHBpcGVsaW5lLCBlLmcuXG4gICAqIGBgYGpzb25cbiAgICogd29ya2Zsb3dzOiB7XG4gICAqICAge1xuICAgKiAgICAgaWRlbnRpZmllcjogXCJidWlsZFwiLFxuICAgKiAgICAgICBqb2JzOiBbe1xuICAgKiAgICAgICAgICBpZGVudGlmaWVyOiBcIm5vZGUvaW5zdGFsbFwiLFxuICAgKiAgICAgICAgICBjb250ZXh0OiBbXCJucG1cIl0sXG4gICAqICAgICAgIH1dXG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vY2lyY2xlY2kuY29tL2RvY3MvMi4wL2NvbmZpZ3VyYXRpb24tcmVmZXJlbmNlLyN3b3JrZmxvd3NcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93cz86IFdvcmtmbG93W107XG4gIC8qKlxuICAgKiBMaXN0IG9mIEpvYnMgdG8gY3JlYXRlIHVuaXF1ZSBzdGVwcyBwZXIgcGlwZWxpbmUsIGUuZy5cbiAgICogYGBganNvblxuICAgKiBqb2JzOiBbe1xuICAgKiAgaWRlbnRpZmllcjogXCJjb21waWxlXCIsXG4gICAqICBkb2NrZXI6IHsgaW1hZ2U6IFwiZ29sYW5nOmFscGluZVwiIH1cbiAgICogIHN0ZXBzOiBbXCJjaGVja291dFwiLCBydW46IHtjb21tYW5kOiBcImdvIGJ1aWxkIC5cIn1dXG4gICAqIH1dXG4gICAqIGBgYFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vY2lyY2xlY2kuY29tL2RvY3MvMi4wL2NvbmZpZ3VyYXRpb24tcmVmZXJlbmNlLyNqb2JzXG4gICAqL1xuICByZWFkb25seSBqb2JzPzogSm9iW107XG4gIC8qKlxuICAgKiBUaGUgc2V0dXAgZmllbGQgZW5hYmxlcyB5b3UgdG8gY29uZGl0aW9uYWxseSB0cmlnZ2VyIGNvbmZpZ3VyYXRpb25zIGZyb20gb3V0c2lkZVxuICAgKiB0aGUgcHJpbWFyeSAuY2lyY2xlY2kgcGFyZW50IGRpcmVjdG9yeSwgdXBkYXRlIHBpcGVsaW5lIHBhcmFtZXRlcnMsIG9yIGdlbmVyYXRlIGN1c3RvbWl6ZWQgY29uZmlndXJhdGlvbnMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9jaXJjbGVjaS5jb20vZG9jcy8yLjAvY29uZmlndXJhdGlvbi1yZWZlcmVuY2UvI3NldHVwXG4gICAqL1xuICByZWFkb25seSBzZXR1cD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2lyY2xlY2kgQ2xhc3MgdG8gbWFuYWdlIGAuY2lyY2xlY2kvY29uZmlnLnltbGAuXG4gKiBDaGVjayBwcm9qZW4ncyBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9jaXJjbGVjaS5jb20vZG9jcy8yLjAvY29uZmlndXJhdGlvbi1yZWZlcmVuY2UvXG4gKi9cbmV4cG9ydCBjbGFzcyBDaXJjbGVjaSBleHRlbmRzIENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUaGUgeWFtbCBmaWxlIGZvciB0aGUgQ2lyY2xlY2kgcGlwZWxpbmVcbiAgICogKi9cbiAgcHVibGljIHJlYWRvbmx5IGZpbGU6IFlhbWxGaWxlO1xuICAvKipcbiAgICogaW50ZXJuYWwgY29weSBvZiBvcHRpb25zIHRvIHNoYXJlIG9wdGlvbnMgYmV0d2VlbiBmdW5jdGlvbnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgb3B0aW9uczogQ2lyY2xlQ2lQcm9wcztcbiAgLyoqXG4gICAqIGludGVybmFsIG1hcCBvZiBvcmJzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG9yYnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBpbnRlcm5hbCBsaXN0IG9mIHdvcmtmbG93c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB3b3JrZmxvd3M6IFdvcmtmbG93W107XG4gIC8qKlxuICAgKiBpbnRlcm5hbCBsaXN0IG9mIGpvYnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgam9iczogSm9iW107XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogQ2lyY2xlQ2lQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLm9yYnMgPSBvcHRpb25zLm9yYnMgPz8ge307XG4gICAgdGhpcy53b3JrZmxvd3MgPSBvcHRpb25zLndvcmtmbG93cyA/PyBbXTtcbiAgICB0aGlzLmpvYnMgPSBvcHRpb25zLmpvYnMgPz8gW107XG4gICAgdGhpcy5maWxlID0gbmV3IFlhbWxGaWxlKHByb2plY3QsIFwiLmNpcmNsZWNpL2NvbmZpZy55bWxcIiwge1xuICAgICAgb2JqOiAoKSA9PiB0aGlzLnJlbmRlckNpcmNsZUNpKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgcmVuZGVyaW5nIG9mIHRoZSB5YW1sIGZpbGUuXG4gICAqIE9iamVjdHMgd2l0aCBkeW5hbWljIGtleXMgbGlrZSB3b3JrZmxvd3MgYW5kIGpvYnMgcmVxdWlyZWQgdGhlIGZpZWxkIGBpZGVudGlmaWVyYCB0byBiZSBzZXQuXG4gICAqIFRob3NlIG9iamVjdCB3aWxsIGJlIHJlZHVjZWQgYnkgYGlkZW50aWZpZXJgIGZpZWxkIGJlZm9yZSByZW5kZXJpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ2lyY2xlQ2koKSB7XG4gICAgLy8gcmVuZGVyIGR5bmFtaWMga2V5cyBmb3Igd29ya2Zsb3dcbiAgICBjb25zdCB3b3JrZmxvd1JlY29yZHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHdvcmtmbG93IG9mIHRoaXMud29ya2Zsb3dzKSB7XG4gICAgICBjb25zdCB7IGlkZW50aWZpZXIsIC4uLnJlZHVjZWQgfSA9IHdvcmtmbG93O1xuICAgICAgcmVkdWNlZC5qb2JzID0gdGhpcy5yZW5kZXJKb2JzKHdvcmtmbG93LmpvYnMpO1xuICAgICAgd29ya2Zsb3dSZWNvcmRzW2lkZW50aWZpZXJdID0gdGhpcy5zbmFrZUNhc2UocmVkdWNlZCk7XG4gICAgfVxuXG4gICAgLy8gcmVuZGVyIGR5bmFtaWMga2V5cyBmb3Igam9ic1xuICAgIGNvbnN0IGpvYlJlY29yZHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGpvYiBvZiB0aGlzLmpvYnMpIHtcbiAgICAgIGNvbnN0IHsgaWRlbnRpZmllciwgLi4ucmVkdWNlZCB9ID0gam9iO1xuICAgICAgam9iUmVjb3Jkc1tpZGVudGlmaWVyXSA9IHRoaXMuc25ha2VDYXNlKHJlZHVjZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLm9wdGlvbnMudmVyc2lvbiB8fCAyLjEsXG4gICAgICBzZXR1cDogdGhpcy5vcHRpb25zLnNldHVwLFxuICAgICAgb3JiczogdGhpcy5vcmJzLFxuICAgICAgam9iczogT2JqZWN0LmtleXMoam9iUmVjb3JkcykubGVuZ3RoID4gMCA/IGpvYlJlY29yZHMgOiB1bmRlZmluZWQsXG4gICAgICB3b3JrZmxvd3M6IHdvcmtmbG93UmVjb3JkcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBuZXcgd29ya2Zsb3cgdG8gZXhpc3RpbmcgcGlwZWxpbmVcbiAgICogQHBhcmFtIHdvcmtmbG93XG4gICAqL1xuICBwdWJsaWMgYWRkV29ya2Zsb3cod29ya2Zsb3c6IFdvcmtmbG93KSB7XG4gICAgdGhpcy53b3JrZmxvd3MgPSBbLi4udGhpcy53b3JrZmxvd3MsIHdvcmtmbG93XTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWR1Y2Ugb2JqZWN0cyB3aXRoIGBpZGVudGlmaWVyYCBmaWVsZCBmb3IgV29ya2Zsb3dKb2JzLlxuICAgKiBBIHdvcmtmbG93IGpvYiBjYW4gY29udGFpbiBgb3JiUGFyYW1ldGVyYCB3aGljaCBhcmUgcGFzc2VkIHRvIG9yYnMuXG4gICAqIFRoaXMgbWFwIGlzIGRpcmVjdGx5IGFkZGVkIGFzIGBSZWNvcmQ8c3RyaW5nLGFueT5gIHRvIGpvYi5cbiAgICogU28gd2UgZ29ubmEgYWRkIHRob3NlIGFmdGVyIHRoZSBkZWZhdWx0IGZpZWxkIG9mIFdvcmtmbG93Sm9iLlxuICAgKiBAc2VlIGh0dHBzOi8vY2lyY2xlY2kuY29tL2RldmVsb3Blci9vcmJzL29yYi9jaXJjbGVjaS9ub2RlI3VzYWdlLWluc3RhbGxfbm9kZWpzXG4gICAqIEBwYXJhbSBqb2JzXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckpvYnMgPSAoam9iczogV29ya2Zsb3dKb2JbXSA9IFtdKTogYW55ID0+IHtcbiAgICBsZXQgcmVzdWx0OiBhbnkgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzID8/IFtdKSB7XG4gICAgICBjb25zdCB7IGlkZW50aWZpZXIsIG9yYlBhcmFtZXRlcnMsIC4uLnJlZHVjZWQgfSA9IGpvYjtcbiAgICAgIGlmIChpc09iamVjdENvbnRhaW5pbmdGaWVsZEV4YWN0bHkoam9iLCBcImlkZW50aWZpZXJcIikpIHtcbiAgICAgICAgcmVzdWx0ID0gWy4uLnJlc3VsdCwgaWRlbnRpZmllcl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHsgW2lkZW50aWZpZXJdOiB7IC4uLnJlZHVjZWQsIC4uLm9yYlBhcmFtZXRlcnMgfSB9LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBDaXJjbGVjaSBPcmIgdG8gcGlwZWxpbmUuIFdpbGwgdGhyb3cgZXJyb3IgaWYgdGhlIG9yYiBhbHJlYWR5IGV4aXN0c1xuICAgKiBAcGFyYW0gbmFtZVxuICAgKiBAcGFyYW0gb3JiXG4gICAqL1xuICBwdWJsaWMgYWRkT3JiKG5hbWU6IHN0cmluZywgb3JiOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5vcmJzW25hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2lyY2xlY2kgQ29uZmlnIGFscmVhZHkgY29udGFpbnMgYW4gb3JiIG5hbWVkICR7bmFtZX0uYCk7XG4gICAgfVxuICAgIHRoaXMub3Jic1tuYW1lXSA9IG9yYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTbmFrZSBjYXNlIGZvciBsaXN0ZWQga2V5cy4gVGhlcmUgYXJlIHRvbyBtYW55IGV4Y2VwdGlvbnMgbmVlZGVkIHRvIGRvIGl0IHJlY3Vyc2l2ZSB3aXRob3V0IGEgd2hpdGVsaXN0LlxuICAgKiBUaGlzIGxpc3QgbmVlZHMgdG8gYmUgdXBkYXRlZCBvbmNlIHdlIGFkZCBmaWVsZCB3aXRoIHNuYWtlIGNhc2UgbGlrZSBgYXdzX2F1dGhgLlxuICAgKiBAcGFyYW0gaW5wdXRcbiAgICovXG4gIHByaXZhdGUgc25ha2VDYXNlID0gKGlucHV0OiBhbnkpOiBhbnkgPT4ge1xuICAgIGNvbnN0IHNuYWtlQ2FzZUtleVdvcmRzID0gW1xuICAgICAgXCJhd3NBdXRoXCIsXG4gICAgICBcIndvcmtpbmdEaXJlY3RvcnlcIixcbiAgICAgIFwicmVzb3VyY2VDbGFzc1wiLFxuICAgICAgXCJkb2NrZXJMYXllckNhY2hpbmdcIixcbiAgICAgIFwibm9PdXRwdXRUaW1lb3V0XCIsXG4gICAgICBcImNpcmNsZWNpSXBSYW5nZXNcIixcbiAgICBdO1xuICAgIHJldHVybiBzbmFrZUNhc2VLZXlzKGlucHV0LCB0cnVlLCBzbmFrZUNhc2VLZXlXb3Jkcyk7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdENvbnRhaW5pbmdGaWVsZEV4YWN0bHkgPSAoXG4gIG9iajogYW55LFxuICBmaWVsZDogc3RyaW5nXG4pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09IDEgJiYgT2JqZWN0LmtleXMob2JqKS5pbmNsdWRlcyhmaWVsZCk7XG59O1xuIl19