projen-pipelines 0.0.16 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{pipeline.d.ts → awscdk/base.d.ts} +10 -15
- package/lib/awscdk/base.js +284 -0
- package/lib/awscdk/github.d.ts +22 -0
- package/lib/awscdk/github.js +189 -0
- package/lib/{engine → awscdk}/index.js +1 -1
- package/lib/index.d.ts +1 -2
- package/lib/index.js +2 -3
- package/package.json +12 -12
- package/lib/engine/base.d.ts +0 -23
- package/lib/engine/base.js +0 -13
- package/lib/engine/github.d.ts +0 -20
- package/lib/engine/github.js +0 -180
- package/lib/pipeline.js +0 -277
- /package/lib/{engine → awscdk}/index.d.ts +0 -0
package/package.json
CHANGED
|
@@ -34,31 +34,31 @@
|
|
|
34
34
|
"organization": true
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@types/fs-extra": "^11.0.
|
|
38
|
-
"@types/jest": "^29.5.
|
|
37
|
+
"@types/fs-extra": "^11.0.3",
|
|
38
|
+
"@types/jest": "^29.5.6",
|
|
39
39
|
"@types/node": "^16",
|
|
40
|
-
"@types/standard-version": "^7.1.
|
|
41
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
42
|
-
"@typescript-eslint/parser": "^
|
|
40
|
+
"@types/standard-version": "^7.1.2",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^6",
|
|
42
|
+
"@typescript-eslint/parser": "^6",
|
|
43
43
|
"eslint": "^8",
|
|
44
44
|
"eslint-import-resolver-node": "^0.3.9",
|
|
45
|
-
"eslint-import-resolver-typescript": "^3.6.
|
|
45
|
+
"eslint-import-resolver-typescript": "^3.6.1",
|
|
46
46
|
"eslint-plugin-import": "^2.28.1",
|
|
47
47
|
"fs-extra": "^11.1.1",
|
|
48
|
-
"jest": "^29.
|
|
48
|
+
"jest": "^29.7.0",
|
|
49
49
|
"jest-junit": "^15",
|
|
50
50
|
"npm-check-updates": "^16",
|
|
51
|
-
"projen": "^0.
|
|
51
|
+
"projen": "^0.75.2",
|
|
52
52
|
"standard-version": "^9",
|
|
53
53
|
"ts-jest": "^29.1.1",
|
|
54
54
|
"ts-node": "^10.9.1",
|
|
55
|
-
"typescript": "^5.
|
|
55
|
+
"typescript": "^5.2.2"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
|
-
"projen": "^0.
|
|
58
|
+
"projen": "^0.75.2"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"projen": "^0.
|
|
61
|
+
"projen": "^0.75.2",
|
|
62
62
|
"standard-version": "^9.5.0"
|
|
63
63
|
},
|
|
64
64
|
"keywords": [
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
],
|
|
68
68
|
"main": "lib/index.js",
|
|
69
69
|
"license": "Apache-2.0",
|
|
70
|
-
"version": "0.0.
|
|
70
|
+
"version": "0.0.18",
|
|
71
71
|
"jest": {
|
|
72
72
|
"testMatch": [
|
|
73
73
|
"<rootDir>/src/**/__tests__/**/*.ts?(x)",
|
package/lib/engine/base.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { awscdk } from 'projen';
|
|
2
|
-
import { CDKPipeline, CDKPipelineOptions, DeploymentStage } from '../pipeline';
|
|
3
|
-
export interface SynthStageOptions {
|
|
4
|
-
readonly commands: string[];
|
|
5
|
-
}
|
|
6
|
-
export interface AssetUploadStageOptions {
|
|
7
|
-
readonly commands: string[];
|
|
8
|
-
}
|
|
9
|
-
export interface DeployStageOptions {
|
|
10
|
-
readonly config: DeploymentStage;
|
|
11
|
-
readonly installCommands: string[];
|
|
12
|
-
readonly deployCommands: string[];
|
|
13
|
-
}
|
|
14
|
-
export declare abstract class BaseEngine {
|
|
15
|
-
protected app: awscdk.AwsCdkTypeScriptApp;
|
|
16
|
-
protected props: CDKPipelineOptions;
|
|
17
|
-
protected pipeline: CDKPipeline;
|
|
18
|
-
abstract readonly needsVersionedArtifacts: boolean;
|
|
19
|
-
constructor(app: awscdk.AwsCdkTypeScriptApp, props: CDKPipelineOptions, pipeline: CDKPipeline);
|
|
20
|
-
abstract createSynth(options: SynthStageOptions): void;
|
|
21
|
-
abstract createAssetUpload(options: AssetUploadStageOptions): void;
|
|
22
|
-
abstract createDeployment(options: DeployStageOptions): void;
|
|
23
|
-
}
|
package/lib/engine/base.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BaseEngine = void 0;
|
|
4
|
-
class BaseEngine {
|
|
5
|
-
constructor(app, props, pipeline) {
|
|
6
|
-
this.app = app;
|
|
7
|
-
this.props = props;
|
|
8
|
-
this.pipeline = pipeline;
|
|
9
|
-
//
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
exports.BaseEngine = BaseEngine;
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmdpbmUvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpQkEsTUFBc0IsVUFBVTtJQUk5QixZQUFzQixHQUErQixFQUFZLEtBQXlCLEVBQVksUUFBcUI7UUFBckcsUUFBRyxHQUFILEdBQUcsQ0FBNEI7UUFBWSxVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQUFZLGFBQVEsR0FBUixRQUFRLENBQWE7UUFDekgsRUFBRTtJQUNKLENBQUM7Q0FNRjtBQVpELGdDQVlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXdzY2RrIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IENES1BpcGVsaW5lLCBDREtQaXBlbGluZU9wdGlvbnMsIERlcGxveW1lbnRTdGFnZSB9IGZyb20gJy4uL3BpcGVsaW5lJztcblxuZXhwb3J0IGludGVyZmFjZSBTeW50aFN0YWdlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNvbW1hbmRzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3NldFVwbG9hZFN0YWdlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNvbW1hbmRzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lTdGFnZU9wdGlvbnMge1xuICByZWFkb25seSBjb25maWc6IERlcGxveW1lbnRTdGFnZTtcbiAgcmVhZG9ubHkgaW5zdGFsbENvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZGVwbG95Q29tbWFuZHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUVuZ2luZSB7XG5cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IG5lZWRzVmVyc2lvbmVkQXJ0aWZhY3RzOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBhcHA6IGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwLCBwcm90ZWN0ZWQgcHJvcHM6IENES1BpcGVsaW5lT3B0aW9ucywgcHJvdGVjdGVkIHBpcGVsaW5lOiBDREtQaXBlbGluZSkge1xuICAgIC8vXG4gIH1cblxuICBhYnN0cmFjdCBjcmVhdGVTeW50aChvcHRpb25zOiBTeW50aFN0YWdlT3B0aW9ucyk6IHZvaWQ7XG4gIGFic3RyYWN0IGNyZWF0ZUFzc2V0VXBsb2FkKG9wdGlvbnM6IEFzc2V0VXBsb2FkU3RhZ2VPcHRpb25zKTogdm9pZDtcbiAgYWJzdHJhY3QgY3JlYXRlRGVwbG95bWVudChvcHRpb25zOiBEZXBsb3lTdGFnZU9wdGlvbnMpOiB2b2lkO1xuXG59Il19
|
package/lib/engine/github.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { awscdk } from 'projen';
|
|
2
|
-
import { AssetUploadStageOptions, BaseEngine, DeployStageOptions, SynthStageOptions } from './base';
|
|
3
|
-
import { CDKPipeline, CDKPipelineOptions } from '../pipeline';
|
|
4
|
-
export interface GithubEngineConfig {
|
|
5
|
-
readonly defaultAwsRoleArn?: string;
|
|
6
|
-
readonly awsRoleArnForSynth?: string;
|
|
7
|
-
readonly awsRoleArnForAssetPublishing?: string;
|
|
8
|
-
readonly awsRoleArnForDeployment?: {
|
|
9
|
-
[stage: string]: string;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
export declare class GitHubEngine extends BaseEngine {
|
|
13
|
-
readonly needsVersionedArtifacts: boolean;
|
|
14
|
-
private deploymentWorkflow;
|
|
15
|
-
private deploymentStages;
|
|
16
|
-
constructor(app: awscdk.AwsCdkTypeScriptApp, props: CDKPipelineOptions, pipeline: CDKPipeline);
|
|
17
|
-
createSynth(options: SynthStageOptions): void;
|
|
18
|
-
createAssetUpload(options: AssetUploadStageOptions): void;
|
|
19
|
-
createDeployment(options: DeployStageOptions): void;
|
|
20
|
-
}
|
package/lib/engine/github.js
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GitHubEngine = void 0;
|
|
4
|
-
const workflows_model_1 = require("projen/lib/github/workflows-model");
|
|
5
|
-
const base_1 = require("./base");
|
|
6
|
-
class GitHubEngine extends base_1.BaseEngine {
|
|
7
|
-
constructor(app, props, pipeline) {
|
|
8
|
-
super(app, props, pipeline);
|
|
9
|
-
this.deploymentStages = [];
|
|
10
|
-
this.deploymentWorkflow = this.app.github.addWorkflow('deploy');
|
|
11
|
-
this.deploymentWorkflow.on({
|
|
12
|
-
push: {
|
|
13
|
-
branches: ['main'], // TODO use defaultReleaseBranch
|
|
14
|
-
},
|
|
15
|
-
workflowDispatch: {},
|
|
16
|
-
});
|
|
17
|
-
this.needsVersionedArtifacts = this.props.stages.find(s => s.manualApproval === true) !== undefined;
|
|
18
|
-
}
|
|
19
|
-
createSynth(options) {
|
|
20
|
-
var _a;
|
|
21
|
-
const steps = [{
|
|
22
|
-
name: 'Checkout',
|
|
23
|
-
uses: 'actions/checkout@v3',
|
|
24
|
-
}];
|
|
25
|
-
if ((_a = this.props.githubConfig) === null || _a === void 0 ? void 0 : _a.awsRoleArnForSynth) {
|
|
26
|
-
steps.push({
|
|
27
|
-
name: 'AWS Credentials',
|
|
28
|
-
uses: 'aws-actions/configure-aws-credentials@master',
|
|
29
|
-
with: {
|
|
30
|
-
'role-to-assume': this.props.githubConfig.awsRoleArnForSynth,
|
|
31
|
-
'role-session-name': 'GitHubAction',
|
|
32
|
-
'aws-region': 'us-east-1',
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
steps.push(...options.commands.map(cmd => ({
|
|
37
|
-
run: cmd,
|
|
38
|
-
})));
|
|
39
|
-
steps.push({
|
|
40
|
-
uses: 'actions/upload-artifact@v3',
|
|
41
|
-
with: {
|
|
42
|
-
name: 'cloud-assembly',
|
|
43
|
-
path: `${this.app.cdkConfig.cdkout}/`,
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
this.deploymentWorkflow.addJob('synth', {
|
|
47
|
-
name: 'Synth CDK application',
|
|
48
|
-
runsOn: ['ubuntu-latest'],
|
|
49
|
-
env: {
|
|
50
|
-
CI: 'true',
|
|
51
|
-
},
|
|
52
|
-
permissions: { idToken: workflows_model_1.JobPermission.WRITE, contents: workflows_model_1.JobPermission.READ },
|
|
53
|
-
steps,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
createAssetUpload(options) {
|
|
57
|
-
var _a, _b, _c;
|
|
58
|
-
this.deploymentWorkflow.addJob('assetUpload', {
|
|
59
|
-
name: 'Publish assets to AWS',
|
|
60
|
-
needs: ['synth'],
|
|
61
|
-
runsOn: ['ubuntu-latest'],
|
|
62
|
-
env: {
|
|
63
|
-
CI: 'true',
|
|
64
|
-
},
|
|
65
|
-
permissions: { idToken: workflows_model_1.JobPermission.WRITE, contents: this.needsVersionedArtifacts ? workflows_model_1.JobPermission.WRITE : workflows_model_1.JobPermission.READ },
|
|
66
|
-
steps: [{
|
|
67
|
-
name: 'Checkout',
|
|
68
|
-
uses: 'actions/checkout@v3',
|
|
69
|
-
with: {
|
|
70
|
-
'fetch-depth': 0,
|
|
71
|
-
},
|
|
72
|
-
}, {
|
|
73
|
-
name: 'Setup GIT identity',
|
|
74
|
-
run: 'git config --global user.name "projen pipeline" && git config --global user.email "info@taimos.de"',
|
|
75
|
-
}, {
|
|
76
|
-
name: 'AWS Credentials',
|
|
77
|
-
uses: 'aws-actions/configure-aws-credentials@master',
|
|
78
|
-
with: {
|
|
79
|
-
'role-to-assume': (_b = (_a = this.props.githubConfig) === null || _a === void 0 ? void 0 : _a.awsRoleArnForAssetPublishing) !== null && _b !== void 0 ? _b : (_c = this.props.githubConfig) === null || _c === void 0 ? void 0 : _c.defaultAwsRoleArn,
|
|
80
|
-
'role-session-name': 'GitHubAction',
|
|
81
|
-
'aws-region': 'us-east-1',
|
|
82
|
-
},
|
|
83
|
-
}, {
|
|
84
|
-
uses: 'actions/download-artifact@v3',
|
|
85
|
-
with: {
|
|
86
|
-
name: 'cloud-assembly',
|
|
87
|
-
path: `${this.app.cdkConfig.cdkout}/`,
|
|
88
|
-
},
|
|
89
|
-
},
|
|
90
|
-
...options.commands.map(cmd => ({
|
|
91
|
-
run: cmd,
|
|
92
|
-
}))],
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
createDeployment(options) {
|
|
96
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
97
|
-
if (options.config.manualApproval === true) {
|
|
98
|
-
// Create new workflow for deployment
|
|
99
|
-
const stageWorkflow = this.app.github.addWorkflow(`release-${options.config.name}`);
|
|
100
|
-
stageWorkflow.on({
|
|
101
|
-
workflowDispatch: {
|
|
102
|
-
inputs: {
|
|
103
|
-
version: {
|
|
104
|
-
description: 'Package version',
|
|
105
|
-
required: true,
|
|
106
|
-
},
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
});
|
|
110
|
-
stageWorkflow.addJob('deploy', {
|
|
111
|
-
name: `Release stage ${options.config.name} to AWS`,
|
|
112
|
-
runsOn: ['ubuntu-latest'],
|
|
113
|
-
env: {
|
|
114
|
-
CI: 'true',
|
|
115
|
-
},
|
|
116
|
-
permissions: { idToken: workflows_model_1.JobPermission.WRITE, contents: workflows_model_1.JobPermission.READ },
|
|
117
|
-
steps: [{
|
|
118
|
-
name: 'Checkout',
|
|
119
|
-
uses: 'actions/checkout@v3',
|
|
120
|
-
}, {
|
|
121
|
-
name: 'AWS Credentials',
|
|
122
|
-
uses: 'aws-actions/configure-aws-credentials@master',
|
|
123
|
-
with: {
|
|
124
|
-
'role-to-assume': (_c = (_b = (_a = this.props.githubConfig) === null || _a === void 0 ? void 0 : _a.awsRoleArnForDeployment) === null || _b === void 0 ? void 0 : _b[options.config.name]) !== null && _c !== void 0 ? _c : (_d = this.props.githubConfig) === null || _d === void 0 ? void 0 : _d.defaultAwsRoleArn,
|
|
125
|
-
'role-session-name': 'GitHubAction',
|
|
126
|
-
'aws-region': options.config.env.region,
|
|
127
|
-
},
|
|
128
|
-
},
|
|
129
|
-
...options.installCommands.map(cmd => ({
|
|
130
|
-
run: cmd,
|
|
131
|
-
})),
|
|
132
|
-
{
|
|
133
|
-
run: `yarn add ${this.props.pkgNamespace}/${this.app.name}@\${{github.event.inputs.version}} && mv ./node_modules/${this.props.pkgNamespace}/${this.app.name} ${this.app.cdkConfig.cdkout}`,
|
|
134
|
-
},
|
|
135
|
-
...options.deployCommands.map(cmd => ({
|
|
136
|
-
run: cmd,
|
|
137
|
-
}))],
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
// Add deployment to CI/CD workflow
|
|
142
|
-
this.deploymentWorkflow.addJob(`deploy-${options.config.name}`, {
|
|
143
|
-
name: `Deploy stage ${options.config.name} to AWS`,
|
|
144
|
-
needs: this.deploymentStages.length > 0 ? ['assetUpload', `deploy-${this.deploymentStages.at(-1)}`] : ['assetUpload'],
|
|
145
|
-
runsOn: ['ubuntu-latest'],
|
|
146
|
-
env: {
|
|
147
|
-
CI: 'true',
|
|
148
|
-
},
|
|
149
|
-
permissions: { idToken: workflows_model_1.JobPermission.WRITE, contents: workflows_model_1.JobPermission.READ },
|
|
150
|
-
steps: [{
|
|
151
|
-
name: 'Checkout',
|
|
152
|
-
uses: 'actions/checkout@v3',
|
|
153
|
-
}, {
|
|
154
|
-
name: 'AWS Credentials',
|
|
155
|
-
uses: 'aws-actions/configure-aws-credentials@master',
|
|
156
|
-
with: {
|
|
157
|
-
'role-to-assume': (_g = (_f = (_e = this.props.githubConfig) === null || _e === void 0 ? void 0 : _e.awsRoleArnForDeployment) === null || _f === void 0 ? void 0 : _f[options.config.name]) !== null && _g !== void 0 ? _g : (_h = this.props.githubConfig) === null || _h === void 0 ? void 0 : _h.defaultAwsRoleArn,
|
|
158
|
-
'role-session-name': 'GitHubAction',
|
|
159
|
-
'aws-region': options.config.env.region,
|
|
160
|
-
},
|
|
161
|
-
}, {
|
|
162
|
-
uses: 'actions/download-artifact@v3',
|
|
163
|
-
with: {
|
|
164
|
-
name: 'cloud-assembly',
|
|
165
|
-
path: `${this.app.cdkConfig.cdkout}/`,
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
...options.installCommands.map(cmd => ({
|
|
169
|
-
run: cmd,
|
|
170
|
-
})),
|
|
171
|
-
...options.deployCommands.map(cmd => ({
|
|
172
|
-
run: cmd,
|
|
173
|
-
}))],
|
|
174
|
-
});
|
|
175
|
-
this.deploymentStages.push(options.config.name);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
exports.GitHubEngine = GitHubEngine;
|
|
180
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS9naXRodWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdUVBQTJFO0FBQzNFLGlDQUFvRztBQVVwRyxNQUFhLFlBQWEsU0FBUSxpQkFBVTtJQU8xQyxZQUFZLEdBQStCLEVBQUUsS0FBeUIsRUFBRSxRQUFxQjtRQUMzRixLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUh0QixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFLdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQ3pCLElBQUksRUFBRTtnQkFDSixRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQ0FBZ0M7YUFDckQ7WUFDRCxnQkFBZ0IsRUFBRSxFQUFFO1NBQ3JCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQztJQUN0RyxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQTBCOztRQUMzQyxNQUFNLEtBQUssR0FBYyxDQUFDO2dCQUN4QixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLHFCQUFxQjthQUM1QixDQUFDLENBQUM7UUFFSCxJQUFJLE1BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLDBDQUFFLGtCQUFrQixFQUFFO1lBQy9DLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsSUFBSSxFQUFFLDhDQUE4QztnQkFDcEQs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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF3c2NkayB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBHaXRodWJXb3JrZmxvdyB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViJztcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24sIEpvYlN0ZXAgfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWwnO1xuaW1wb3J0IHsgQXNzZXRVcGxvYWRTdGFnZU9wdGlvbnMsIEJhc2VFbmdpbmUsIERlcGxveVN0YWdlT3B0aW9ucywgU3ludGhTdGFnZU9wdGlvbnMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgQ0RLUGlwZWxpbmUsIENES1BpcGVsaW5lT3B0aW9ucyB9IGZyb20gJy4uL3BpcGVsaW5lJztcblxuZXhwb3J0IGludGVyZmFjZSBHaXRodWJFbmdpbmVDb25maWcge1xuICByZWFkb25seSBkZWZhdWx0QXdzUm9sZUFybj86IHN0cmluZztcbiAgcmVhZG9ubHkgYXdzUm9sZUFybkZvclN5bnRoPzogc3RyaW5nO1xuICByZWFkb25seSBhd3NSb2xlQXJuRm9yQXNzZXRQdWJsaXNoaW5nPzogc3RyaW5nO1xuICByZWFkb25seSBhd3NSb2xlQXJuRm9yRGVwbG95bWVudD86IHsgW3N0YWdlOiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEdpdEh1YkVuZ2luZSBleHRlbmRzIEJhc2VFbmdpbmUge1xuXG4gIHB1YmxpYyByZWFkb25seSBuZWVkc1ZlcnNpb25lZEFydGlmYWN0czogYm9vbGVhbjtcblxuICBwcml2YXRlIGRlcGxveW1lbnRXb3JrZmxvdzogR2l0aHViV29ya2Zsb3c7XG4gIHByaXZhdGUgZGVwbG95bWVudFN0YWdlczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihhcHA6IGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwLCBwcm9wczogQ0RLUGlwZWxpbmVPcHRpb25zLCBwaXBlbGluZTogQ0RLUGlwZWxpbmUpIHtcbiAgICBzdXBlcihhcHAsIHByb3BzLCBwaXBlbGluZSk7XG5cbiAgICB0aGlzLmRlcGxveW1lbnRXb3JrZmxvdyA9IHRoaXMuYXBwLmdpdGh1YiEuYWRkV29ya2Zsb3coJ2RlcGxveScpO1xuICAgIHRoaXMuZGVwbG95bWVudFdvcmtmbG93Lm9uKHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLCAvLyBUT0RPIHVzZSBkZWZhdWx0UmVsZWFzZUJyYW5jaFxuICAgICAgfSxcbiAgICAgIHdvcmtmbG93RGlzcGF0Y2g6IHt9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5uZWVkc1ZlcnNpb25lZEFydGlmYWN0cyA9IHRoaXMucHJvcHMuc3RhZ2VzLmZpbmQocyA9PiBzLm1hbnVhbEFwcHJvdmFsID09PSB0cnVlKSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN5bnRoKG9wdGlvbnM6IFN5bnRoU3RhZ2VPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3Qgc3RlcHM6IEpvYlN0ZXBbXSA9IFt7XG4gICAgICBuYW1lOiAnQ2hlY2tvdXQnLFxuICAgICAgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjMnLFxuICAgIH1dO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuZ2l0aHViQ29uZmlnPy5hd3NSb2xlQXJuRm9yU3ludGgpIHtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBuYW1lOiAnQVdTIENyZWRlbnRpYWxzJyxcbiAgICAgICAgdXNlczogJ2F3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAbWFzdGVyJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdyb2xlLXRvLWFzc3VtZSc6IHRoaXMucHJvcHMuZ2l0aHViQ29uZmlnLmF3c1JvbGVBcm5Gb3JTeW50aCxcbiAgICAgICAgICAncm9sZS1zZXNzaW9uLW5hbWUnOiAnR2l0SHViQWN0aW9uJyxcbiAgICAgICAgICAnYXdzLXJlZ2lvbic6ICd1cy1lYXN0LTEnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RlcHMucHVzaCguLi5vcHRpb25zLmNvbW1hbmRzLm1hcChjbWQgPT4gKHtcbiAgICAgIHJ1bjogY21kLFxuICAgIH0pKSk7XG5cbiAgICBzdGVwcy5wdXNoKHtcbiAgICAgIHVzZXM6ICdhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2MycsXG4gICAgICB3aXRoOiB7XG4gICAgICAgIG5hbWU6ICdjbG91ZC1hc3NlbWJseScsXG4gICAgICAgIHBhdGg6IGAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9L2AsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXBsb3ltZW50V29ya2Zsb3cuYWRkSm9iKCdzeW50aCcsIHtcbiAgICAgIG5hbWU6ICdTeW50aCBDREsgYXBwbGljYXRpb24nLFxuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIGVudjoge1xuICAgICAgICBDSTogJ3RydWUnLFxuICAgICAgfSxcbiAgICAgIHBlcm1pc3Npb25zOiB7IGlkVG9rZW46IEpvYlBlcm1pc3Npb24uV1JJVEUsIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQgfSxcbiAgICAgIHN0ZXBzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUFzc2V0VXBsb2FkKG9wdGlvbnM6IEFzc2V0VXBsb2FkU3RhZ2VPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5kZXBsb3ltZW50V29ya2Zsb3cuYWRkSm9iKCdhc3NldFVwbG9hZCcsIHtcbiAgICAgIG5hbWU6ICdQdWJsaXNoIGFzc2V0cyB0byBBV1MnLFxuICAgICAgbmVlZHM6IFsnc3ludGgnXSxcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBlbnY6IHtcbiAgICAgICAgQ0k6ICd0cnVlJyxcbiAgICAgIH0sXG4gICAgICBwZXJtaXNzaW9uczogeyBpZFRva2VuOiBKb2JQZXJtaXNzaW9uLldSSVRFLCBjb250ZW50czogdGhpcy5uZWVkc1ZlcnNpb25lZEFydGlmYWN0cyA/IEpvYlBlcm1pc3Npb24uV1JJVEUgOiBKb2JQZXJtaXNzaW9uLlJFQUQgfSxcbiAgICAgIHN0ZXBzOiBbe1xuICAgICAgICBuYW1lOiAnQ2hlY2tvdXQnLFxuICAgICAgICB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2MycsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnZmV0Y2gtZGVwdGgnOiAwLFxuICAgICAgICB9LFxuICAgICAgfSwge1xuICAgICAgICBuYW1lOiAnU2V0dXAgR0lUIGlkZW50aXR5JyxcbiAgICAgICAgcnVuOiAnZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgXCJwcm9qZW4gcGlwZWxpbmVcIiAmJiBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCJpbmZvQHRhaW1vcy5kZVwiJyxcbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ0FXUyBDcmVkZW50aWFscycsXG4gICAgICAgIHVzZXM6ICdhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQG1hc3RlcicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiB0aGlzLnByb3BzLmdpdGh1YkNvbmZpZz8uYXdzUm9sZUFybkZvckFzc2V0UHVibGlzaGluZyA/PyB0aGlzLnByb3BzLmdpdGh1YkNvbmZpZz8uZGVmYXVsdEF3c1JvbGVBcm4sXG4gICAgICAgICAgJ3JvbGUtc2Vzc2lvbi1uYW1lJzogJ0dpdEh1YkFjdGlvbicsXG4gICAgICAgICAgJ2F3cy1yZWdpb24nOiAndXMtZWFzdC0xJyxcbiAgICAgICAgfSxcbiAgICAgIH0sIHtcbiAgICAgICAgdXNlczogJ2FjdGlvbnMvZG93bmxvYWQtYXJ0aWZhY3RAdjMnLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgbmFtZTogJ2Nsb3VkLWFzc2VtYmx5JyxcbiAgICAgICAgICBwYXRoOiBgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fS9gLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMuY29tbWFuZHMubWFwKGNtZCA9PiAoe1xuICAgICAgICBydW46IGNtZCxcbiAgICAgIH0pKV0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRGVwbG95bWVudChvcHRpb25zOiBEZXBsb3lTdGFnZU9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAob3B0aW9ucy5jb25maWcubWFudWFsQXBwcm92YWwgPT09IHRydWUpIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgd29ya2Zsb3cgZm9yIGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHN0YWdlV29ya2Zsb3cgPSB0aGlzLmFwcC5naXRodWIhLmFkZFdvcmtmbG93KGByZWxlYXNlLSR7b3B0aW9ucy5jb25maWcubmFtZX1gKTtcbiAgICAgIHN0YWdlV29ya2Zsb3cub24oe1xuICAgICAgICB3b3JrZmxvd0Rpc3BhdGNoOiB7XG4gICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGFja2FnZSB2ZXJzaW9uJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHN0YWdlV29ya2Zsb3cuYWRkSm9iKCdkZXBsb3knLCB7XG4gICAgICAgIG5hbWU6IGBSZWxlYXNlIHN0YWdlICR7b3B0aW9ucy5jb25maWcubmFtZX0gdG8gQVdTYCxcbiAgICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgQ0k6ICd0cnVlJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHsgaWRUb2tlbjogSm9iUGVybWlzc2lvbi5XUklURSwgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCB9LFxuICAgICAgICBzdGVwczogW3tcbiAgICAgICAgICBuYW1lOiAnQ2hlY2tvdXQnLFxuICAgICAgICAgIHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHYzJyxcbiAgICAgICAgfSwge1xuICAgICAgICAgIG5hbWU6ICdBV1MgQ3JlZGVudGlhbHMnLFxuICAgICAgICAgIHVzZXM6ICdhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQG1hc3RlcicsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgJ3JvbGUtdG8tYXNzdW1lJzogdGhpcy5wcm9wcy5naXRodWJDb25maWc/LmF3c1JvbGVBcm5Gb3JEZXBsb3ltZW50Py5bb3B0aW9ucy5jb25maWcubmFtZV0gPz8gdGhpcy5wcm9wcy5naXRodWJDb25maWc/LmRlZmF1bHRBd3NSb2xlQXJuLFxuICAgICAgICAgICAgJ3JvbGUtc2Vzc2lvbi1uYW1lJzogJ0dpdEh1YkFjdGlvbicsXG4gICAgICAgICAgICAnYXdzLXJlZ2lvbic6IG9wdGlvbnMuY29uZmlnLmVudi5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4ub3B0aW9ucy5pbnN0YWxsQ29tbWFuZHMubWFwKGNtZCA9PiAoe1xuICAgICAgICAgIHJ1bjogY21kLFxuICAgICAgICB9KSksXG4gICAgICAgIHtcbiAgICAgICAgICBydW46IGB5YXJuIGFkZCAke3RoaXMucHJvcHMucGtnTmFtZXNwYWNlfS8ke3RoaXMuYXBwLm5hbWV9QFxcJHt7Z2l0aHViLmV2ZW50LmlucHV0cy52ZXJzaW9ufX0gJiYgbXYgLi9ub2RlX21vZHVsZXMvJHt0aGlzLnByb3BzLnBrZ05hbWVzcGFjZX0vJHt0aGlzLmFwcC5uYW1lfSAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9YCxcbiAgICAgICAgfSxcbiAgICAgICAgLi4ub3B0aW9ucy5kZXBsb3lDb21tYW5kcy5tYXAoY21kID0+ICh7XG4gICAgICAgICAgcnVuOiBjbWQsXG4gICAgICAgIH0pKV0sXG4gICAgICB9KTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgZGVwbG95bWVudCB0byBDSS9DRCB3b3JrZmxvd1xuICAgICAgdGhpcy5kZXBsb3ltZW50V29ya2Zsb3cuYWRkSm9iKGBkZXBsb3ktJHtvcHRpb25zLmNvbmZpZy5uYW1lfWAsIHtcbiAgICAgICAgbmFtZTogYERlcGxveSBzdGFnZSAke29wdGlvbnMuY29uZmlnLm5hbWV9IHRvIEFXU2AsXG4gICAgICAgIG5lZWRzOiB0aGlzLmRlcGxveW1lbnRTdGFnZXMubGVuZ3RoID4gMCA/IFsnYXNzZXRVcGxvYWQnLCBgZGVwbG95LSR7dGhpcy5kZXBsb3ltZW50U3RhZ2VzLmF0KC0xKSF9YF0gOiBbJ2Fzc2V0VXBsb2FkJ10sXG4gICAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIENJOiAndHJ1ZScsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcm1pc3Npb25zOiB7IGlkVG9rZW46IEpvYlBlcm1pc3Npb24uV1JJVEUsIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQgfSxcbiAgICAgICAgc3RlcHM6IFt7XG4gICAgICAgICAgbmFtZTogJ0NoZWNrb3V0JyxcbiAgICAgICAgICB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2MycsXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBuYW1lOiAnQVdTIENyZWRlbnRpYWxzJyxcbiAgICAgICAgICB1c2VzOiAnYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0BtYXN0ZXInLFxuICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICdyb2xlLXRvLWFzc3VtZSc6IHRoaXMucHJvcHMuZ2l0aHViQ29uZmlnPy5hd3NSb2xlQXJuRm9yRGVwbG95bWVudD8uW29wdGlvbnMuY29uZmlnLm5hbWVdID8/IHRoaXMucHJvcHMuZ2l0aHViQ29uZmlnPy5kZWZhdWx0QXdzUm9sZUFybixcbiAgICAgICAgICAgICdyb2xlLXNlc3Npb24tbmFtZSc6ICdHaXRIdWJBY3Rpb24nLFxuICAgICAgICAgICAgJ2F3cy1yZWdpb24nOiBvcHRpb25zLmNvbmZpZy5lbnYucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB1c2VzOiAnYWN0aW9ucy9kb3dubG9hZC1hcnRpZmFjdEB2MycsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgbmFtZTogJ2Nsb3VkLWFzc2VtYmx5JyxcbiAgICAgICAgICAgIHBhdGg6IGAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9L2AsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4ub3B0aW9ucy5pbnN0YWxsQ29tbWFuZHMubWFwKGNtZCA9PiAoe1xuICAgICAgICAgIHJ1bjogY21kLFxuICAgICAgICB9KSksXG4gICAgICAgIC4uLm9wdGlvbnMuZGVwbG95Q29tbWFuZHMubWFwKGNtZCA9PiAoe1xuICAgICAgICAgIHJ1bjogY21kLFxuICAgICAgICB9KSldLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRlcGxveW1lbnRTdGFnZXMucHVzaChvcHRpb25zLmNvbmZpZy5uYW1lKTtcbiAgICB9XG4gIH1cbn0iXX0=
|