UNPKG

deployable-awscdk-app-ts

Version:
201 lines • 29.4 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.DeployableAwsCdkTypeScriptApp = exports.utils = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const projen_1 = require("projen"); const workflows_model_1 = require("projen/lib/github/workflows-model"); const javascript_1 = require("projen/lib/javascript"); const steps = require("./steps"); const utils_1 = require("./utils"); __exportStar(require("./types"), exports); exports.utils = require("./utils"); class DeployableAwsCdkTypeScriptApp extends projen_1.awscdk.AwsCdkTypeScriptApp { constructor(options) { const deployable = options.release ?? true; super({ ...options, release: deployable, }); this.deployable = deployable; this.generateNvmrc = options.generateNvmrc ?? true; this.checkActiveDeployment = options.checkActiveDeployment ?? false; this.workflowNodeVersion = options.workflowNodeVersion; this.deployOptions = options.deployOptions ?? { environments: [] }; this.codeArtifactOptions = options.codeArtifactOptions; this.addDevDeps('deployable-awscdk-app-ts'); if (!deployable) this.logger.warn('The project is explicitly set to not release, make sure this is desired setting'); if (this.generateNvmrc && !this.workflowNodeVersion) this.workflowNodeVersion = '14.18.1'; if (this.deployOptions.npmConfigEnvironment && this.majorNodeVersion >= 18) throw new Error(`npmConfigEnvironment is not supported for node versions above version 18. Current version is ${this.nodeVersion}`); const deployArgument = this.deployOptions.stackPattern ? ` ${this.deployOptions.stackPattern}` : ''; const deployCommand = `cdk deploy${deployArgument} ${this.getMethodArgument()} --require-approval never`; const requiredEnv = this.deployOptions.npmConfigEnvironment ? [`npm_config_${this.deployOptions.npmConfigEnvironment}`] : undefined; this.deployWorkflowTask = this.addTask('deploy:workflow', { requiredEnv, exec: deployCommand, }); this.addTask('deploy:hotswap', { requiredEnv, exec: `${deployCommand} --hotswap`, }); } /** * return the major node version set for the project * @default 16 */ get majorNodeVersion() { return (0, utils_1.getMajorNodeVersion)(this.nodeVersion); } getMethodArgument() { return `--method ${this.deployOptions.method ?? 'change-set'}`; } synth() { if (this.deployable) this.addDeployJobs(); if (this.generateNvmrc) new projen_1.TextFile(this, '.nvmrc', { lines: [this.workflowNodeVersion ?? ''], }); super.synth(); } /** * Add new environments to the application * @param items list of environment options */ addEnvironments(...items) { this.deployOptions.environments.push(...items); } updateEnvironments(newEnvironments) { this.deployOptions = { ...this.deployOptions, environments: newEnvironments, }; } /** * Updates the postDeployWorkflowScript for environments * @param script the script to be added, for example "post:deploy" * @param environmentNameFilter the name of environments to add the scripts to, if not provided or empty will update all */ updatePostDeployWorkflowScriptToEnvironments(script, environmentNameFilter) { const newEnvironments = this.deployOptions.environments.map(environment => { if (environmentNameFilter && environmentNameFilter.length > 0 && !environmentNameFilter.includes(environment.name)) return environment; return { ...environment, postDeployWorkflowScript: script, }; }); this.updateEnvironments(newEnvironments); } /** * Updates the preDeployWorkflowScript for environments * @param script the script to be added, for example "pre:deploy" * @param environmentNameFilter the name of environments to add the scripts to, if not provided or empty will update all */ updatePreDeployWorkflowScriptToEnvironments(script, environmentNameFilter) { const newEnvironments = this.deployOptions.environments.map(environment => { if (environmentNameFilter && environmentNameFilter.length > 0 && !environmentNameFilter.includes(environment.name)) return environment; return { ...environment, preDeployWorkflowScript: script, }; }); this.updateEnvironments(newEnvironments); } addDeployJobs() { if (this.deployOptions.environments.length === 0) this.logger.warn('The project does not have any environment set, make sure this is desired setting'); const include = this.deployOptions.environments.map(environmentOptions => { const { awsCredentials } = environmentOptions; const assumeRole = awsCredentials.roleToAssume ? 'true' : 'false'; const assumeRoleSettings = awsCredentials.roleToAssume ? { roleToAssume: awsCredentials.roleToAssume, assumeRoleDurationSeconds: awsCredentials.assumeRoleDurationSeconds || 900, } : undefined; const accessKeyIdSecretName = awsCredentials.accessKeyIdSecretName ?? 'AWS_ACCESS_KEY_ID'; const secretAccessKeySecretName = awsCredentials.secretAccessKeySecretName ?? 'AWS_SECRET_ACCESS_KEY'; const hasPostDeployTask = environmentOptions.postDeployWorkflowScript ? 'true' : 'false'; const hasPreDeployTask = environmentOptions.preDeployWorkflowScript ? 'true' : 'false'; return { environment: environmentOptions.name, accessKeyIdSecretName, secretAccessKeySecretName, region: awsCredentials.region, assumeRole, hasPostDeployTask, postDeploymentScript: environmentOptions.postDeployWorkflowScript || '', hasPreDeployTask, preDeploymentScript: environmentOptions.preDeployWorkflowScript || '', ...assumeRoleSettings, }; }); const deployJobEnv = this.deployOptions.environmentVariableName ? { [this.deployOptions.environmentVariableName]: '${{ matrix.environment }}', } : undefined; const jobDefinition = { runsOn: ['ubuntu-latest'], concurrency: { 'group': '${{ matrix.environment }}-deploy', 'cancel-in-progress': false, }, needs: [ 'release_github', ], permissions: { contents: workflows_model_1.JobPermission.READ, deployments: workflows_model_1.JobPermission.READ, idToken: this.codeArtifactOptions?.authProvider === javascript_1.CodeArtifactAuthProvider.GITHUB_OIDC ? workflows_model_1.JobPermission.WRITE : undefined, }, strategy: { maxParallel: 1, matrix: { domain: { environment: include.map(e => e.environment), }, include, }, }, environment: { name: '${{ matrix.environment }}', }, env: deployJobEnv, steps: [], }; jobDefinition.steps.push(steps.checkoutStep()); const { taskToRunPreInstall } = this.deployOptions; if (taskToRunPreInstall) jobDefinition.steps.push(steps.preInstallDependenciesStep(taskToRunPreInstall, this.checkActiveDeployment)); jobDefinition.steps.push(...this.package.project.renderWorkflowSetup()); if (this.checkActiveDeployment) jobDefinition.steps.push(steps.checkActiveDeploymentStep()); jobDefinition.steps.push(...steps.setAwsCredentialsSteps(this.checkActiveDeployment, this.codeArtifactOptions?.authProvider)); if (this.deployOptions.npmConfigEnvironment) jobDefinition.steps.push(steps.setNpmConfig(this.deployOptions.npmConfigEnvironment, '${{ matrix.environment }}', this.checkActiveDeployment)); jobDefinition.steps.push(steps.preDeploymentStep(this.checkActiveDeployment, this.package.packageManager)); jobDefinition.steps.push(steps.deploymentStep(this.checkActiveDeployment, this.package.packageManager)); jobDefinition.steps.push(steps.postDeploymentStep(this.checkActiveDeployment, this.package.packageManager)); this.release?.addJobs({ deploy: jobDefinition }); } } exports.DeployableAwsCdkTypeScriptApp = DeployableAwsCdkTypeScriptApp; _a = JSII_RTTI_SYMBOL_1; DeployableAwsCdkTypeScriptApp[_a] = { fqn: "deployable-awscdk-app-ts.DeployableAwsCdkTypeScriptApp", version: "0.1.580" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUE2QztBQUM3Qyx1RUFBb0U7QUFDcEUsc0RBQWdHO0FBQ2hHLGlDQUFnQztBQUVoQyxtQ0FBMkM7QUFFM0MsMENBQXVCO0FBQ3ZCLG1DQUFnQztBQUVoQyxNQUFhLDZCQUE4QixTQUFRLGVBQU0sQ0FBQyxtQkFBbUI7SUFjM0UsWUFBWSxPQUE2QztRQUN2RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQTtRQUMxQyxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFDVixPQUFPLEVBQUUsVUFBVTtTQUNwQixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFBO1FBQ2xELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLElBQUksS0FBSyxDQUFBO1FBQ25FLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUE7UUFDdEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLEVBQUMsWUFBWSxFQUFFLEVBQUUsRUFBQyxDQUFBO1FBQ2hFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUE7UUFDdEQsSUFBSSxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1FBRTNDLElBQUksQ0FBQyxVQUFVO1lBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUZBQWlGLENBQUMsQ0FBQTtRQUVyRyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CO1lBQ2pELElBQUksQ0FBQyxtQkFB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LElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CO1lBQ3pDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSwyQkFBMkIsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFBO1FBRWhKLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFBO1FBQzFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQTtRQUN2RyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQTtRQUUzRyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUMsQ0FBQyxDQUFBO0lBRWhELENBQUM7O0FBeE5ILHNFQXlOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXdzY2RrLCBUYXNrLCBUZXh0RmlsZX0gZnJvbSAncHJvamVuJ1xuaW1wb3J0IHtKb2IsIEpvYlBlcm1pc3Npb259IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViL3dvcmtmbG93cy1tb2RlbCdcbmltcG9ydCB7Q29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLCBDb2RlQXJ0aWZhY3RPcHRpb25zLCBOb2RlUHJvamVjdH0gZnJvbSAncHJvamVuL2xpYi9qYXZhc2NyaXB0J1xuaW1wb3J0ICogYXMgc3RlcHMgZnJvbSAnLi9zdGVwcydcbmltcG9ydCB7RGVwbG95YWJsZUF3c0Nka1R5cGVTY3JpcHRBcHBPcHRpb25zLCBEZXBsb3lPcHRpb25zLCBFbnZpcm9ubWVudE9wdGlvbnN9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQge2dldE1ham9yTm9kZVZlcnNpb259IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnXG5leHBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgY2xhc3MgRGVwbG95YWJsZUF3c0Nka1R5cGVTY3JpcHRBcHAgZXh0ZW5kcyBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcCB7XG5cbiAgLyoqXG4gICAqIFRhc2sgdG8gZGVwbG95IHlvdXIgYXBwLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlcGxveVdvcmtmbG93VGFzazogVGFza1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95YWJsZTogYm9vbGVhblxuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRlTnZtcmM6IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGVja0FjdGl2ZURlcGxveW1lbnQ6IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWFkb25seSB3b3JrZmxvd05vZGVWZXJzaW9uPzogc3RyaW5nXG4gIHByb3RlY3RlZCBkZXBsb3lPcHRpb25zOiBEZXBsb3lPcHRpb25zXG4gIHByaXZhdGUgcmVhZG9ubHkgY29kZUFydGlmYWN0T3B0aW9ucz86IENvZGVBcnRpZmFjdE9wdGlvbnNcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEZXBsb3lhYmxlQXdzQ2RrVHlwZVNjcmlwdEFwcE9wdGlvbnMpIHtcbiAgICBjb25zdCBkZXBsb3lhYmxlID0gb3B0aW9ucy5yZWxlYXNlID8/IHRydWVcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcmVsZWFzZTogZGVwbG95YWJsZSxcbiAgICB9KVxuICAgIHRoaXMuZGVwbG95YWJsZSA9IGRlcGxveWFibGVcbiAgICB0aGlzLmdlbmVyYXRlTnZtcmMgPSBvcHRpb25zLmdlbmVyYXRlTnZtcmMgPz8gdHJ1ZVxuICAgIHRoaXMuY2hlY2tBY3RpdmVEZXBsb3ltZW50ID0gb3B0aW9ucy5jaGVja0FjdGl2ZURlcGxveW1lbnQgPz8gZmFsc2VcbiAgICB0aGlzLndvcmtmbG93Tm9kZVZlcnNpb24gPSBvcHRpb25zLndvcmtmbG93Tm9kZVZlcnNpb25cbiAgICB0aGlzLmRlcGxveU9wdGlvbnMgPSBvcHRpb25zLmRlcGxveU9wdGlvbnMgPz8ge2Vudmlyb25tZW50czogW119XG4gICAgdGhpcy5jb2RlQXJ0aWZhY3RPcHRpb25zID0gb3B0aW9ucy5jb2RlQXJ0aWZhY3RPcHRpb25zXG4gICAgdGhpcy5hZGREZXZEZXBzKCdkZXBsb3lhYmxlLWF3c2Nkay1hcHAtdHMnKVxuXG4gICAgaWYgKCFkZXBsb3lhYmxlKVxuICAgICAgdGhpcy5sb2dnZXIud2FybignVGhlIHByb2plY3QgaXMgZXhwbGljaXRseSBzZXQgdG8gbm90IHJlbGVhc2UsIG1ha2Ugc3VyZSB0aGlzIGlzIGRlc2lyZWQgc2V0dGluZycpXG5cbiAgICBpZiAodGhpcy5nZW5lcmF0ZU52bXJjICYmICF0aGlzLndvcmtmbG93Tm9kZVZlcnNpb24pXG4gICAgICB0aGlzLndvcmtmbG93Tm9kZVZlcnNpb24gPSAnMTQuMTguMSdcblxuICAgIGlmICh0aGlzLmRlcGxveU9wdGlvbnMubnBtQ29uZmlnRW52aXJvbm1lbnQgJiYgdGhpcy5tYWpvck5vZGVWZXJzaW9uID49IDE4KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBucG1Db25maWdFbnZpcm9ubWVudCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub2RlIHZlcnNpb25zIGFib3ZlIHZlcnNpb24gMTguIEN1cnJlbnQgdmVyc2lvbiBpcyAke3RoaXMubm9kZVZlcnNpb259YClcblxuICAgIGNvbnN0IGRlcGxveUFyZ3VtZW50ID0gdGhpcy5kZXBsb3lPcHRpb25zLnN0YWNrUGF0dGVybiA/IGAgJHt0aGlzLmRlcGxveU9wdGlvbnMuc3RhY2tQYXR0ZXJufWA6ICcnXG4gICAgY29uc3QgZGVwbG95Q29tbWFuZCA9IGBjZGsgZGVwbG95JHtkZXBsb3lBcmd1bWVudH0gJHt0aGlzLmdldE1ldGhvZEFyZ3VtZW50KCl9IC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlcmBcbiAgICBjb25zdCByZXF1aXJlZEVudiA9IHRoaXMuZGVwbG95T3B0aW9ucy5ucG1Db25maWdFbnZpcm9ubWVudCA/IFtgbnBtX2NvbmZpZ18ke3RoaXMuZGVwbG95T3B0aW9ucy5ucG1Db25maWdFbnZpcm9ubWVudH1gXSA6IHVuZGVmaW5lZFxuICAgIHRoaXMuZGVwbG95V29ya2Zsb3dUYXNrID0gdGhpcy5hZGRUYXNrKCdkZXBsb3k6d29ya2Zsb3cnLCB7XG4gICAgICByZXF1aXJlZEVudixcbiAgICAgIGV4ZWM6IGRlcGxveUNvbW1hbmQsXG4gICAgfSlcbiAgICB0aGlzLmFkZFRhc2soJ2RlcGxveTpob3Rzd2FwJywge1xuICAgICAgcmVxdWlyZWRFbnYsXG4gICAgICBleGVjOiBgJHtkZXBsb3lDb21tYW5kfSAtLWhvdHN3YXBgLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIHRoZSBtYWpvciBub2RlIHZlcnNpb24gc2V0IGZvciB0aGUgcHJvamVjdFxuICAgKiBAZGVmYXVsdCAxNlxuICAgKi9cbiAgZ2V0IG1ham9yTm9kZVZlcnNpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0TWFqb3JOb2RlVmVyc2lvbih0aGlzLm5vZGVWZXJzaW9uKVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZXRob2RBcmd1bWVudCgpIHtcbiAgICByZXR1cm4gYC0tbWV0aG9kICR7dGhpcy5kZXBsb3lPcHRpb25zLm1ldGhvZCA/PyAnY2hhbmdlLXNldCd9YFxuICB9XG5cbiAgc3ludGgoKSB7XG4gICAgaWYgKHRoaXMuZGVwbG95YWJsZSlcbiAgICAgIHRoaXMuYWRkRGVwbG95Sm9icygpXG5cbiAgICBpZiAodGhpcy5nZW5lcmF0ZU52bXJjKVxuICAgICAgbmV3IFRleHRGaWxlKHRoaXMsICcubnZtcmMnLCB7XG4gICAgICAgIGxpbmVzOiBbdGhpcy53b3JrZmxvd05vZGVWZXJzaW9uID8/ICcnXSxcbiAgICAgIH0pXG5cbiAgICBzdXBlci5zeW50aCgpXG4gIH1cblxuICAvKipcbiAgICogQWRkIG5ldyBlbnZpcm9ubWVudHMgdG8gdGhlIGFwcGxpY2F0aW9uXG4gICAqIEBwYXJhbSBpdGVtcyBsaXN0IG9mIGVudmlyb25tZW50IG9wdGlvbnNcbiAgICovXG4gIGFkZEVudmlyb25tZW50cyguLi5pdGVtczogRW52aXJvbm1lbnRPcHRpb25zW10pIHtcbiAgICB0aGlzLmRlcGxveU9wdGlvbnMuZW52aXJvbm1lbnRzLnB1c2goLi4uaXRlbXMpXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVudmlyb25tZW50cyhuZXdFbnZpcm9ubWVudHM6IEVudmlyb25tZW50T3B0aW9uc1tdKSB7XG4gICAgdGhpcy5kZXBsb3lPcHRpb25zID0ge1xuICAgICAgLi4udGhpcy5kZXBsb3lPcHRpb25zLFxuICAgICAgZW52aXJvbm1lbnRzOiBuZXdFbnZpcm9ubWVudHMsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHBvc3REZXBsb3lXb3JrZmxvd1NjcmlwdCBmb3IgZW52aXJvbm1lbnRzXG4gICAqIEBwYXJhbSBzY3JpcHQgdGhlIHNjcmlwdCB0byBiZSBhZGRlZCwgZm9yIGV4YW1wbGUgXCJwb3N0OmRlcGxveVwiXG4gICAqIEBwYXJhbSBlbnZpcm9ubWVudE5hbWVGaWx0ZXIgdGhlIG5hbWUgb2YgZW52aXJvbm1lbnRzIHRvIGFkZCB0aGUgc2NyaXB0cyB0bywgaWYgbm90IHByb3ZpZGVkIG9yIGVtcHR5IHdpbGwgdXBkYXRlIGFsbFxuICAgKi9cbiAgdXBkYXRlUG9zdERlcGxveVdvcmtmbG93U2NyaXB0VG9FbnZpcm9ubWVudHMoc2NyaXB0OiBzdHJpbmcsIGVudmlyb25tZW50TmFtZUZpbHRlcj86IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgbmV3RW52aXJvbm1lbnRzID0gdGhpcy5kZXBsb3lPcHRpb25zLmVudmlyb25tZW50cy5tYXAoZW52aXJvbm1lbnQgPT4ge1xuICAgICAgaWYgKGVudmlyb25tZW50TmFtZUZpbHRlciAmJiBlbnZpcm9ubWVudE5hbWVGaWx0ZXIubGVuZ3RoID4gMCAmJiAhZW52aXJvbm1lbnROYW1lRmlsdGVyLmluY2x1ZGVzKGVudmlyb25tZW50Lm5hbWUpKVxuICAgICAgICByZXR1cm4gZW52aXJvbm1lbnRcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZW52aXJvbm1lbnQsXG4gICAgICAgIHBvc3REZXBsb3lXb3JrZmxvd1NjcmlwdDogc2NyaXB0LFxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy51cGRhdGVFbnZpcm9ubWVudHMobmV3RW52aXJvbm1lbnRzKVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHByZURlcGxveVdvcmtmbG93U2NyaXB0IGZvciBlbnZpcm9ubWVudHNcbiAgICogQHBhcmFtIHNjcmlwdCB0aGUgc2NyaXB0IHRvIGJlIGFkZGVkLCBmb3IgZXhhbXBsZSBcInByZTpkZXBsb3lcIlxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnROYW1lRmlsdGVyIHRoZSBuYW1lIG9mIGVudmlyb25tZW50cyB0byBhZGQgdGhlIHNjcmlwdHMgdG8sIGlmIG5vdCBwcm92aWRlZCBvciBlbXB0eSB3aWxsIHVwZGF0ZSBhbGxcbiAgICovXG4gIHVwZGF0ZVByZURlcGxveVdvcmtmbG93U2NyaXB0VG9FbnZpcm9ubWVudHMoc2NyaXB0OiBzdHJpbmcsIGVudmlyb25tZW50TmFtZUZpbHRlcj86IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgbmV3RW52aXJvbm1lbnRzID0gdGhpcy5kZXBsb3lPcHRpb25zLmVudmlyb25tZW50cy5tYXAoZW52aXJvbm1lbnQgPT4ge1xuICAgICAgaWYgKGVudmlyb25tZW50TmFtZUZpbHRlciAmJiBlbnZpcm9ubWVudE5hbWVGaWx0ZXIubGVuZ3RoID4gMCAmJiAhZW52aXJvbm1lbnROYW1lRmlsdGVyLmluY2x1ZGVzKGVudmlyb25tZW50Lm5hbWUpKVxuICAgICAgICByZXR1cm4gZW52aXJvbm1lbnRcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZW52aXJvbm1lbnQsXG4gICAgICAgIHByZURlcGxveVdvcmtmbG93U2NyaXB0OiBzY3JpcHQsXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLnVwZGF0ZUVudmlyb25tZW50cyhuZXdFbnZpcm9ubWVudHMpXG4gIH1cblxuICBwcml2YXRlIGFkZERlcGxveUpvYnMoKSB7XG5cbiAgICBpZiAodGhpcy5kZXBsb3lPcHRpb25zLmVudmlyb25tZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdUaGUgcHJvamVjdCBkb2VzIG5vdCBoYXZlIGFueSBlbnZpcm9ubWVudCBzZXQsIG1ha2Ugc3VyZSB0aGlzIGlzIGRlc2lyZWQgc2V0dGluZycpXG5cbiAgICBjb25zdCBpbmNsdWRlID0gdGhpcy5kZXBsb3lPcHRpb25zLmVudmlyb25tZW50cy5tYXAoZW52aXJvbm1lbnRPcHRpb25zID0+IHtcbiAgICAgIGNvbnN0IHthd3NDcmVkZW50aWFsc30gPSBlbnZpcm9ubWVudE9wdGlvbnNcblxuICAgICAgY29uc3QgYXNzdW1lUm9sZSA9IGF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSA/ICd0cnVlJyA6ICdmYWxzZSdcblxuICAgICAgY29uc3QgYXNzdW1lUm9sZVNldHRpbmdzID0gYXdzQ3JlZGVudGlhbHMucm9sZVRvQXNzdW1lID8ge1xuICAgICAgICByb2xlVG9Bc3N1bWU6IGF3c0NyZWRlbnRpYWxzLnJvbGVUb0Fzc3VtZSxcbiAgICAgICAgYXNzdW1lUm9sZUR1cmF0aW9uU2Vjb25kczogYXdzQ3JlZGVudGlhbHMuYXNzdW1lUm9sZUR1cmF0aW9uU2Vjb25kcyB8fCA5MDAsXG4gICAgICB9OiB1bmRlZmluZWRcblxuICAgICAgY29uc3QgYWNjZXNzS2V5SWRTZWNyZXROYW1lID0gYXdzQ3JlZGVudGlhbHMuYWNjZXNzS2V5SWRTZWNyZXROYW1lID8/ICdBV1NfQUNDRVNTX0tFWV9JRCdcbiAgICAgIGNvbnN0IHNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWUgPSBhd3NDcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lID8/ICdBV1NfU0VDUkVUX0FDQ0VTU19LRVknXG5cbiAgICAgIGNvbnN0IGhhc1Bvc3REZXBsb3lUYXNrID0gZW52aXJvbm1lbnRPcHRpb25zLnBvc3REZXBsb3lXb3JrZmxvd1NjcmlwdCA/ICd0cnVlJyA6ICdmYWxzZSdcbiAgICAgIGNvbnN0IGhhc1ByZURlcGxveVRhc2sgPSBlbnZpcm9ubWVudE9wdGlvbnMucHJlRGVwbG95V29ya2Zsb3dTY3JpcHQgPyAndHJ1ZScgOiAnZmFsc2UnXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudE9wdGlvbnMubmFtZSxcbiAgICAgICAgYWNjZXNzS2V5SWRTZWNyZXROYW1lLFxuICAgICAgICBzZWNyZXRBY2Nlc3NLZXlTZWNyZXROYW1lLFxuICAgICAgICByZWdpb246IGF3c0NyZWRlbnRpYWxzLnJlZ2lvbixcbiAgICAgICAgYXNzdW1lUm9sZSxcbiAgICAgICAgaGFzUG9zdERlcGxveVRhc2ssXG4gICAgICAgIHBvc3REZXBsb3ltZW50U2NyaXB0OiBlbnZpcm9ubWVudE9wdGlvbnMucG9zdERlcGxveVdvcmtmbG93U2NyaXB0IHx8ICcnLFxuICAgICAgICBoYXNQcmVEZXBsb3lUYXNrLFxuICAgICAgICBwcmVEZXBsb3ltZW50U2NyaXB0OiBlbnZpcm9ubWVudE9wdGlvbnMucHJlRGVwbG95V29ya2Zsb3dTY3JpcHQgfHwgJycsXG4gICAgICAgIC4uLmFzc3VtZVJvbGVTZXR0aW5ncyxcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgZGVwbG95Sm9iRW52ID0gdGhpcy5kZXBsb3lPcHRpb25zLmVudmlyb25tZW50VmFyaWFibGVOYW1lID8ge1xuICAgICAgW3RoaXMuZGVwbG95T3B0aW9ucy5lbnZpcm9ubWVudFZhcmlhYmxlTmFtZV06ICcke3sgbWF0cml4LmVudmlyb25tZW50IH19JyxcbiAgICB9IDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBqb2JEZWZpbml0aW9uOiBKb2IgPSB7XG4gICAgICBydW5zT246IFsndWJ1bnR1LWxhdGVzdCddLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgJ2dyb3VwJzogJyR7eyBtYXRyaXguZW52aXJvbm1lbnQgfX0tZGVwbG95JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIG5lZWRzOiBbXG4gICAgICAgICdyZWxlYXNlX2dpdGh1YicsXG4gICAgICBdLFxuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgZGVwbG95bWVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgaWRUb2tlbjogdGhpcy5jb2RlQXJ0aWZhY3RPcHRpb25zPy5hdXRoUHJvdmlkZXIgPT09IENvZGVBcnRpZmFjdEF1dGhQcm92aWRlci5HSVRIVUJfT0lEQyA/IEpvYlBlcm1pc3Npb24uV1JJVEUgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgc3RyYXRlZ3k6IHtcbiAgICAgICAgbWF4UGFyYWxsZWw6IDEsXG4gICAgICAgIG1hdHJpeDoge1xuICAgICAgICAgIGRvbWFpbjoge1xuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IGluY2x1ZGUubWFwKGUgPT4gZS5lbnZpcm9ubWVudCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmNsdWRlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIG5hbWU6ICcke3sgbWF0cml4LmVudmlyb25tZW50IH19JyxcbiAgICAgIH0sXG4gICAgICBlbnY6IGRlcGxveUpvYkVudixcbiAgICAgIHN0ZXBzOiBbXSxcbiAgICB9XG5cbiAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2goc3RlcHMuY2hlY2tvdXRTdGVwKCkpXG5cbiAgICBjb25zdCB7dGFza1RvUnVuUHJlSW5zdGFsbH0gPSB0aGlzLmRlcGxveU9wdGlvbnNcbiAgICBpZiAodGFza1RvUnVuUHJlSW5zdGFsbClcbiAgICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaChzdGVwcy5wcmVJbnN0YWxsRGVwZW5kZW5jaWVzU3RlcCh0YXNrVG9SdW5QcmVJbnN0YWxsLCB0aGlzLmNoZWNrQWN0aXZlRGVwbG95bWVudCkpXG5cbiAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2goLi4uKHRoaXMucGFja2FnZS5wcm9qZWN0IGFzIE5vZGVQcm9qZWN0KS5yZW5kZXJXb3JrZmxvd1NldHVwKCkpXG5cbiAgICBpZiAodGhpcy5jaGVja0FjdGl2ZURlcGxveW1lbnQpXG4gICAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2goc3RlcHMuY2hlY2tBY3RpdmVEZXBsb3ltZW50U3RlcCgpKVxuXG4gICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKC4uLnN0ZXBzLnNldEF3c0NyZWRlbnRpYWxzU3RlcHModGhpcy5jaGVja0FjdGl2ZURlcGxveW1lbnQsIHRoaXMuY29kZUFydGlmYWN0T3B0aW9ucz8uYXV0aFByb3ZpZGVyKSlcblxuICAgIGlmICh0aGlzLmRlcGxveU9wdGlvbnMubnBtQ29uZmlnRW52aXJvbm1lbnQpXG4gICAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2goc3RlcHMuc2V0TnBtQ29uZmlnKHRoaXMuZGVwbG95T3B0aW9ucy5ucG1Db25maWdFbnZpcm9ubWVudCwgJyR7eyBtYXRyaXguZW52aXJvbm1lbnQgfX0nLCB0aGlzLmNoZWNrQWN0aXZlRGVwbG95bWVudCkpXG5cbiAgICBqb2JEZWZpbml0aW9uLnN0ZXBzLnB1c2goc3RlcHMucHJlRGVwbG95bWVudFN0ZXAodGhpcy5jaGVja0FjdGl2ZURlcGxveW1lbnQsIHRoaXMucGFja2FnZS5wYWNrYWdlTWFuYWdlcikpXG4gICAgam9iRGVmaW5pdGlvbi5zdGVwcy5wdXNoKHN0ZXBzLmRlcGxveW1lbnRTdGVwKHRoaXMuY2hlY2tBY3RpdmVEZXBsb3ltZW50LCB0aGlzLnBhY2thZ2UucGFja2FnZU1hbmFnZXIpKVxuICAgIGpvYkRlZmluaXRpb24uc3RlcHMucHVzaChzdGVwcy5wb3N0RGVwbG95bWVudFN0ZXAodGhpcy5jaGVja0FjdGl2ZURlcGxveW1lbnQsIHRoaXMucGFja2FnZS5wYWNrYWdlTWFuYWdlcikpXG5cbiAgICB0aGlzLnJlbGVhc2U/LmFkZEpvYnMoe2RlcGxveTogam9iRGVmaW5pdGlvbn0pXG5cbiAgfVxufSJdfQ==