projen-pipelines 0.0.17 → 0.0.19

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/package.json CHANGED
@@ -48,17 +48,17 @@
48
48
  "jest": "^29.7.0",
49
49
  "jest-junit": "^15",
50
50
  "npm-check-updates": "^16",
51
- "projen": "^0.75.2",
51
+ "projen": "^0.76.1",
52
52
  "standard-version": "^9",
53
53
  "ts-jest": "^29.1.1",
54
54
  "ts-node": "^10.9.1",
55
55
  "typescript": "^5.2.2"
56
56
  },
57
57
  "peerDependencies": {
58
- "projen": "^0.75.2"
58
+ "projen": "^0.76.1"
59
59
  },
60
60
  "dependencies": {
61
- "projen": "^0.75.2",
61
+ "projen": "^0.76.1",
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.17",
70
+ "version": "0.0.19",
71
71
  "jest": {
72
72
  "testMatch": [
73
73
  "<rootDir>/src/**/__tests__/**/*.ts?(x)",
@@ -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
- }
@@ -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
@@ -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
- }
@@ -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=
package/lib/pipeline.js DELETED
@@ -1,277 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CDKPipeline = exports.DeploymentType = exports.PipelineEngine = void 0;
4
- const projen_1 = require("projen");
5
- const common_1 = require("projen/lib/common");
6
- const engine_1 = require("./engine");
7
- /**
8
- * The CI/CD tooling used to run your pipeline.
9
- * The component will render workflows for the given system
10
- */
11
- var PipelineEngine;
12
- (function (PipelineEngine) {
13
- /** Create GitHub actions */
14
- PipelineEngine[PipelineEngine["GITHUB"] = 0] = "GITHUB";
15
- /** Create a .gitlab-ci.yaml file */
16
- PipelineEngine[PipelineEngine["GITLAB"] = 1] = "GITLAB";
17
- // /** Create AWS CodeCatalyst workflows */
18
- // CODE_CATALYST,
19
- })(PipelineEngine || (exports.PipelineEngine = PipelineEngine = {}));
20
- /**
21
- * Describes the type of pipeline that will be created
22
- */
23
- var DeploymentType;
24
- (function (DeploymentType) {
25
- /** Deploy every commit as far as possible; hopefully into production */
26
- DeploymentType[DeploymentType["CONTINUOUS_DEPLOYMENT"] = 0] = "CONTINUOUS_DEPLOYMENT";
27
- /** Build every commit and prepare all assets for a later deployment */
28
- DeploymentType[DeploymentType["CONTINUOUS_DELIVERY"] = 1] = "CONTINUOUS_DELIVERY";
29
- })(DeploymentType || (exports.DeploymentType = DeploymentType = {}));
30
- /**
31
- * The CDKPipeline class extends the Component class and sets up the necessary configuration for deploying AWS CDK (Cloud Development Kit) applications across multiple stages.
32
- * It also manages tasks such as publishing CDK assets, bumping version based on git tags, and cleaning up conflicting tasks.
33
- */
34
- class CDKPipeline extends projen_1.Component {
35
- constructor(app, props) {
36
- var _a, _b, _c;
37
- super(app);
38
- this.app = app;
39
- this.props = props;
40
- // Add development dependencies
41
- this.app.addDevDeps('@types/standard-version', 'standard-version', 'cdk-assets');
42
- // this.app.addDeps(
43
- // );
44
- this.stackPrefix = (_a = props.stackPrefix) !== null && _a !== void 0 ? _a : app.name;
45
- // Create engine instance to use
46
- switch (props.engine) {
47
- case PipelineEngine.GITHUB:
48
- this.engine = new engine_1.GitHubEngine(app, props, this);
49
- break;
50
- default:
51
- throw new Error('Invalid engine');
52
- }
53
- // Removes the compiled cloud assembly before each synth
54
- (_b = this.project.tasks.tryFind('synth')) === null || _b === void 0 ? void 0 : _b.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
55
- (_c = this.project.tasks.tryFind('synth:silent')) === null || _c === void 0 ? void 0 : _c.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
56
- // Remove tasks that might conflict with the pipeline process
57
- this.project.removeTask('deploy');
58
- this.project.removeTask('diff');
59
- this.project.removeTask('destroy');
60
- this.project.removeTask('watch');
61
- this.createSynthStage();
62
- // Creates different deployment stages
63
- if (props.personalStage) {
64
- this.createPersonalStage();
65
- }
66
- if (props.featureStages) {
67
- this.createFeatureStage();
68
- }
69
- for (const stage of props.stages) {
70
- this.createPipelineStage(stage);
71
- }
72
- // Creates tasks to handle the release process
73
- this.createReleaseTasks();
74
- // Creates a specialized CDK App class
75
- this.createApplicationEntrypoint();
76
- }
77
- createSynthStage() {
78
- var _a, _b, _c, _d;
79
- this.engine.createSynth({
80
- commands: [
81
- ...((_a = this.props.preInstallCommands) !== null && _a !== void 0 ? _a : []),
82
- `npx projen ${this.app.package.installCiTask.name}`,
83
- ...((_b = this.props.preSynthCommands) !== null && _b !== void 0 ? _b : []),
84
- 'npx projen build',
85
- ...((_c = this.props.postSynthCommands) !== null && _c !== void 0 ? _c : []),
86
- ],
87
- });
88
- this.engine.createAssetUpload({
89
- commands: [
90
- ...((_d = this.props.preInstallCommands) !== null && _d !== void 0 ? _d : []),
91
- `npx projen ${this.app.package.installCiTask.name}`,
92
- 'npx projen publish:assets',
93
- ...(this.engine.needsVersionedArtifacts ? [
94
- 'npx projen bump',
95
- 'npx projen release:push-assembly',
96
- ] : []),
97
- ],
98
- });
99
- }
100
- /**
101
- * This method generates the entry point for the application, including interfaces and classes
102
- * necessary to set up the pipeline and define the AWS CDK stacks for different environments.
103
- */
104
- createApplicationEntrypoint() {
105
- let propsCode = '';
106
- let appCode = '';
107
- if (this.props.personalStage) {
108
- propsCode += ` /** This function will be used to generate a personal stack. */
109
- providePersonalStack: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
110
- `;
111
- appCode += ` // If the environment variable USER is set and a function is provided for creating a personal stack, it is called with necessary arguments.
112
- if (props.providePersonalStack && process.env.USER) {
113
- const stageName = 'personal-' + process.env.USER.toLowerCase().replace(/\\\//g, '-');
114
- props.providePersonalStack(this, '${this.stackPrefix}-personal', { env: ${JSON.stringify(this.props.personalStage.env)}, stackName: \`${this.stackPrefix}-\${stageName}\`, stageName });
115
- }
116
- `;
117
- }
118
- if (this.props.featureStages) {
119
- propsCode += ` /** This function will be used to generate a feature stack. */
120
- provideFeatureStack: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
121
- `;
122
- appCode += ` // If the environment variable BRANCH is set and a function is provided for creating a feature stack, it is called with necessary arguments.
123
- if (props.provideFeatureStack && process.env.BRANCH) {
124
- const stageName = 'feature-' + process.env.BRANCH.toLowerCase().replace(/\\\//g, '-');
125
- props.provideFeatureStack(this, '${this.stackPrefix}-feature', { env: ${JSON.stringify(this.props.featureStages.env)}, stackName: \`${this.stackPrefix}-\${stageName}\`, stageName });
126
- }
127
- `;
128
- }
129
- for (const stage of this.props.stages) {
130
- const nameUpperFirst = `${stage.name.charAt(0).toUpperCase()}${stage.name.substring(1)}`;
131
- propsCode += ` /** This function will be used to generate a ${stage.name} stack. */
132
- provide${nameUpperFirst}Stack: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
133
- `;
134
- appCode += ` // If a function is provided for creating a ${stage.name} stack, it is called with necessary arguments.
135
- if (props.provide${nameUpperFirst}Stack) {
136
- props.provide${nameUpperFirst}Stack(this, '${this.stackPrefix}-${stage.name}', { env: ${JSON.stringify(stage.env)}, stackName: '${this.stackPrefix}-${stage.name}', stageName: '${stage.name}' });
137
- }
138
- `;
139
- }
140
- const appFile = new projen_1.TextFile(this.project, `${this.app.srcdir}/app.ts`);
141
- appFile.addLine(`// ${common_1.PROJEN_MARKER}
142
- /* eslint-disable */
143
- import { App, AppProps, Stack, StackProps } from 'aws-cdk-lib';
144
-
145
- /**
146
- * PipelineAppProps is an extension of AppProps, which is part of the AWS CDK core.
147
- * It includes optional functions to provide AWS Stacks for different stages.
148
- *
149
- * Use these functions to instantiate your application stacks with the parameters for
150
- * each stage
151
- */
152
- export interface PipelineAppProps extends AppProps {
153
- ${propsCode}
154
- }
155
-
156
- /**
157
- * PipelineAppStackProps is an extension of StackProps, which is part of the AWS CDK core.
158
- * It includes an additional property to specify the stage name.
159
- */
160
- export interface PipelineAppStackProps extends StackProps {
161
- stageName: string;
162
- }
163
-
164
- /**
165
- * The PipelineApp class extends the App class from AWS CDK and overrides the constructor to support
166
- * different stages of the application (development, production, personal, feature) by invoking the provided
167
- * stack-providing functions from the props.
168
- */
169
- export class PipelineApp extends App {
170
- constructor(props: PipelineAppProps) {
171
- super(props);
172
-
173
- ${appCode}
174
-
175
- }
176
- }
177
- `);
178
- }
179
- /**
180
- * This method sets up tasks to publish CDK assets to all accounts and handle versioning, including bumping the version
181
- * based on the latest git tag and pushing the CDK assembly to the package repository.
182
- */
183
- createReleaseTasks() {
184
- // Task to publish the CDK assets to all accounts
185
- this.project.addTask('publish:assets', {
186
- steps: this.props.stages.map(stage => ({
187
- exec: `npx cdk-assets -p ${this.app.cdkConfig.cdkout}/${this.stackPrefix}-${stage.name}.assets.json publish`,
188
- })),
189
- });
190
- this.project.addTask('bump', {
191
- description: 'Bumps version based on latest git tag',
192
- steps: [
193
- {
194
- exec: 'pipelines-release bump',
195
- },
196
- {
197
- exec: 'git push --tags',
198
- },
199
- ],
200
- });
201
- this.project.addTask('release:push-assembly', {
202
- steps: [
203
- {
204
- exec: `pipelines-release create-manifest "${this.app.cdkConfig.cdkout}" "${this.props.pkgNamespace}"`,
205
- },
206
- {
207
- cwd: this.app.cdkConfig.cdkout,
208
- exec: 'npm version --no-git-tag-version from-git',
209
- },
210
- {
211
- cwd: this.app.cdkConfig.cdkout,
212
- exec: 'npm publish',
213
- },
214
- ],
215
- });
216
- }
217
- /**
218
- * This method sets up tasks for the personal deployment stage, including deployment, watching for changes,
219
- * comparing changes (diff), and destroying the stack when no longer needed.
220
- */
221
- createPersonalStage() {
222
- this.project.addTask('deploy:personal', {
223
- exec: `cdk deploy ${this.stackPrefix}-personal`,
224
- });
225
- this.project.addTask('watch:personal', {
226
- exec: `cdk deploy --watch --hotswap ${this.stackPrefix}-personal`,
227
- });
228
- this.project.addTask('diff:personal', {
229
- exec: `cdk diff ${this.stackPrefix}-personal`,
230
- });
231
- this.project.addTask('destroy:personal', {
232
- exec: `cdk destroy ${this.stackPrefix}-personal`,
233
- });
234
- }
235
- /**
236
- * This method sets up tasks for the feature deployment stage, including deployment, comparing changes (diff),
237
- * and destroying the stack when no longer needed.
238
- */
239
- createFeatureStage() {
240
- this.project.addTask('deploy:feature', {
241
- exec: `cdk --progress events --require-approval never deploy ${this.stackPrefix}-feature`,
242
- });
243
- this.project.addTask('diff:feature', {
244
- exec: `cdk diff ${this.stackPrefix}-feature`,
245
- });
246
- this.project.addTask('destroy:feature', {
247
- exec: `cdk destroy ${this.stackPrefix}-feature`,
248
- });
249
- }
250
- /**
251
- * This method sets up tasks for the general pipeline stages (dev, prod), including deployment and comparing changes (diff).
252
- * @param {DeployStageOptions} stage - The stage to create
253
- */
254
- createPipelineStage(stage) {
255
- var _a;
256
- this.project.addTask(`deploy:${stage.name}`, {
257
- exec: `cdk --app ${this.app.cdkConfig.cdkout} --progress events --require-approval never deploy ${this.stackPrefix}-${stage.name}`,
258
- });
259
- this.project.addTask(`diff:${stage.name}`, {
260
- exec: `cdk --app ${this.app.cdkConfig.cdkout} diff ${this.stackPrefix}-${stage.name}`,
261
- });
262
- this.engine.createDeployment({
263
- config: stage,
264
- installCommands: [
265
- ...((_a = this.props.preInstallCommands) !== null && _a !== void 0 ? _a : []),
266
- `npx projen ${this.app.package.installCiTask.name}`,
267
- ],
268
- deployCommands: [
269
- // TODO pre deploy steps
270
- `npx projen deploy:${stage.name}`,
271
- // TODO post deploy steps
272
- ],
273
- });
274
- }
275
- }
276
- exports.CDKPipeline = CDKPipeline;
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXFEO0FBQ3JELDhDQUFrRDtBQUNsRCxxQ0FBd0U7QUF1QnhFOzs7R0FHRztBQUNILElBQVksY0FPWDtBQVBELFdBQVksY0FBYztJQUN4Qiw0QkFBNEI7SUFDNUIsdURBQU0sQ0FBQTtJQUNOLG9DQUFvQztJQUNwQyx1REFBTSxDQUFBO0lBQ04sMkNBQTJDO0lBQzNDLGlCQUFpQjtBQUNuQixDQUFDLEVBUFcsY0FBYyw4QkFBZCxjQUFjLFFBT3pCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGNBS1g7QUFMRCxXQUFZLGNBQWM7SUFDeEIsd0VBQXdFO0lBQ3hFLHFGQUFxQixDQUFBO0lBQ3JCLHVFQUF1RTtJQUN2RSxpRkFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsY0FBYyw4QkFBZCxjQUFjLFFBS3pCO0FBa0VEOzs7R0FHRztBQUNILE1BQWEsV0FBWSxTQUFRLGtCQUFTO0lBS3hDLFlBQW9CLEdBQStCLEVBQVUsS0FBeUI7O1FBQ3BGLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURPLFFBQUcsR0FBSCxHQUFHLENBQTRCO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBb0I7UUFHcEYsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUNqQix5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLFlBQVksQ0FDYixDQUFDO1FBQ0Ysb0JBQW9CO1FBQ3BCLEtBQUs7UUFFTCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUEsS0FBSyxDQUFDLFdBQVcsbUNBQUksR0FBRyxDQUFDLElBQUksQ0FBQztRQUVqRCxnQ0FBZ0M7UUFDaEMsUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ3BCLEtBQUssY0FBYyxDQUFDLE1BQU07Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxxQkFBWSxD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QyxXQUFXLFVBQVU7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLG1CQUFtQixDQUFDLEtBQXNCOztRQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQyxJQUFJLEVBQUUsYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLHNEQUFzRCxJQUFJLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7U0FDbkksQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekMsSUFBSSxFQUFFLGFBQWEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxTQUFTLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtTQUN0RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQzNCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsZUFBZSxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxNQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLG1DQUFJLEVBQUUsQ0FBQztnQkFDeEMsY0FBYyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO2FBQ3BEO1lBQ0QsY0FBYyxFQUFFO2dCQUNkLHdCQUF3QjtnQkFDeEIscUJBQXFCLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pDLHlCQUF5QjthQUMxQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTNRRCxrQ0EyUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFRleHRGaWxlLCBhd3NjZGsgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgUFJPSkVOX01BUktFUiB9IGZyb20gJ3Byb2plbi9saWIvY29tbW9uJztcbmltcG9ydCB7IEJhc2VFbmdpbmUsIEdpdEh1YkVuZ2luZSwgR2l0aHViRW5naW5lQ29uZmlnIH0gZnJvbSAnLi9lbmdpbmUnO1xuXG4vKipcbiAqIFRoZSBFbnZpcm9ubWVudCBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gaG9sZCBBV1MgcmVsYXRlZCBpbmZvcm1hdGlvblxuICogZm9yIGEgc3BlY2lmaWMgZGVwbG95bWVudCBlbnZpcm9ubWVudCB3aXRoaW4geW91ciBpbmZyYXN0cnVjdHVyZS5cbiAqIEVhY2ggZW52aXJvbm1lbnQgcmVxdWlyZXMgYSBzcGVjaWZpYyBhY2NvdW50IGFuZCByZWdpb24gZm9yIGl0cyByZXNvdXJjZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnQge1xuICAvKipcbiAgICogVGhlIEFXUyBBY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW52aXJvbm1lbnQuIEl0J3MgaW1wb3J0YW50IGJlY2F1c2VcbiAgICogZGlmZmVyZW50IHNlcnZpY2VzIG9yIGZlYXR1cmVzIGNvdWxkIGhhdmUgZGlzdGluY3QgcGVybWlzc2lvbnMgYW5kIHNldHRpbmdzXG4gICAqIGluIGRpZmZlcmVudCBhY2NvdW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBSZWdpb24gZm9yIHRoZSBlbnZpcm9ubWVudC4gVGhpcyBkZXRlcm1pbmVzIHdoZXJlIHlvdXIgcmVzb3VyY2VzXG4gICAqIGFyZSBjcmVhdGVkIGFuZCB3aGVyZSB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgcnVuLiBJdCBjYW4gYWZmZWN0IGxhdGVuY3ksXG4gICAqIGF2YWlsYWJpbGl0eSwgYW5kIHByaWNpbmcuXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgQ0kvQ0QgdG9vbGluZyB1c2VkIHRvIHJ1biB5b3VyIHBpcGVsaW5lLlxuICogVGhlIGNvbXBvbmVudCB3aWxsIHJlbmRlciB3b3JrZmxvd3MgZm9yIHRoZSBnaXZlbiBzeXN0ZW1cbiAqL1xuZXhwb3J0IGVudW0gUGlwZWxpbmVFbmdpbmUge1xuICAvKiogQ3JlYXRlIEdpdEh1YiBhY3Rpb25zICovXG4gIEdJVEhVQixcbiAgLyoqIENyZWF0ZSBhIC5naXRsYWItY2kueWFtbCBmaWxlICovXG4gIEdJVExBQixcbiAgLy8gLyoqIENyZWF0ZSBBV1MgQ29kZUNhdGFseXN0IHdvcmtmbG93cyAqL1xuICAvLyBDT0RFX0NBVEFMWVNULFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgdHlwZSBvZiBwaXBlbGluZSB0aGF0IHdpbGwgYmUgY3JlYXRlZFxuICovXG5leHBvcnQgZW51bSBEZXBsb3ltZW50VHlwZSB7XG4gIC8qKiBEZXBsb3kgZXZlcnkgY29tbWl0IGFzIGZhciBhcyBwb3NzaWJsZTsgaG9wZWZ1bGx5IGludG8gcHJvZHVjdGlvbiAqL1xuICBDT05USU5VT1VTX0RFUExPWU1FTlQsXG4gIC8qKiBCdWlsZCBldmVyeSBjb21taXQgYW5kIHByZXBhcmUgYWxsIGFzc2V0cyBmb3IgYSBsYXRlciBkZXBsb3ltZW50ICovXG4gIENPTlRJTlVPVVNfREVMSVZFUlksXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95bWVudFN0YWdlIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBlbnY6IEVudmlyb25tZW50O1xuICByZWFkb25seSBtYW51YWxBcHByb3ZhbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lT3B0aW9ucyBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uXG4gKiBvcHRpb25zIGZvciBhIENESyAoQ2xvdWQgRGV2ZWxvcG1lbnQgS2l0KSBwaXBlbGluZS4gSXQgYWxsb3dzIHRoZSBkZWZpbml0aW9uXG4gKiBvZiBzZXR0aW5ncyBzdWNoIGFzIHRoZSBzdGFjayBwcmVmaXggYW5kIHBhY2thZ2UgbmFtZXNwYWNlIHRvIGJlIHVzZWQgaW4gdGhlXG4gKiBBV1Mgc3RhY2ssIGFsb25nIHdpdGggdGhlIGVudmlyb25tZW50cyBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ0RLUGlwZWxpbmVPcHRpb25zIHtcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRlZmluZSBhIHByZWZpeCBmb3IgdGhlIEFXUyBTdGFjayByZXNvdXJjZXMgY3JlYXRlZFxuICAgKiBkdXJpbmcgdGhlIHBpcGVsaW5lJ3Mgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9qZWN0IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIGRldGVybWluZXMgdGhlIE5QTSBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHBhY2thZ2luZyBDREsgY2xvdWRcbiAgICogYXNzZW1ibGllcy4gQSBuYW1lc3BhY2UgaGVscHMgZ3JvdXAgcmVsYXRlZCByZXNvdXJjZXMgdG9nZXRoZXIsIHByb3ZpZGluZ1xuICAgKiBiZXR0ZXIgb3JnYW5pemF0aW9uIGFuZCBlYXNlIG9mIG1hbmFnZW1lbnQuXG4gICAqL1xuICByZWFkb25seSBwa2dOYW1lc3BhY2U6IHN0cmluZztcblxuICByZWFkb25seSBzdGFnZXM6IERlcGxveW1lbnRTdGFnZVtdO1xuXG4gIHJlYWRvbmx5IHBlcnNvbmFsU3RhZ2U/OiB7XG4gICAgcmVhZG9ubHkgZW52OiBFbnZpcm9ubWVudDtcbiAgfTtcblxuICByZWFkb25seSBmZWF0dXJlU3RhZ2VzPzoge1xuICAgIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHBpcGVsaW5lIHRvIGNyZWF0ZS4gSWYgc2V0IHRvIENPTlRJTlVPVVNfREVQTE9ZTUVOVCxcbiAgICogZXZlcnkgY29tbWl0IGlzIGRlcGxveWVkIGFzIGZhciBhcyBwb3NzaWJsZSwgaG9wZWZ1bGx5IGludG8gcHJvZHVjdGlvbi4gSWYgc2V0IHRvXG4gICAqIENPTlRJTlVPVVNfREVMSVZFUlksIGV2ZXJ5IGNvbW1pdCBpcyBidWlsdCBhbmQgYWxsIGFzc2V0cyBhcmUgcHJlcGFyZWQgZm9yIGEgbGF0ZXIgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgQ09OVElOVU9VU19ERUxJVkVSWVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFR5cGU/OiBEZXBsb3ltZW50VHlwZTtcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBkZXRlcm1pbmVzIHRoZSBDSS9DRCB0b29saW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biB0aGUgcGlwZWxpbmUuIFRoZSBjb21wb25lbnRcbiAgICogd2lsbCByZW5kZXIgd29ya2Zsb3dzIGZvciB0aGUgZ2l2ZW4gc3lzdGVtLiBPcHRpb25zIGluY2x1ZGUgR2l0SHViIGFuZCBHaXRMYWIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJpZXMgdG8gZGVyaXZlIGl0IGZyb20gdGhlIHByb2plY3RzIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZ2luZT86IFBpcGVsaW5lRW5naW5lO1xuXG4gIHJlYWRvbmx5IGdpdGh1YkNvbmZpZz86IEdpdGh1YkVuZ2luZUNvbmZpZztcblxuICByZWFkb25seSBwcmVJbnN0YWxsQ29tbWFuZHM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlU3ludGhDb21tYW5kcz86IHN0cmluZ1tdO1xuICByZWFkb25seSBwb3N0U3ludGhDb21tYW5kcz86IHN0cmluZ1tdO1xuXG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lIGNsYXNzIGV4dGVuZHMgdGhlIENvbXBvbmVudCBjbGFzcyBhbmQgc2V0cyB1cCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gZm9yIGRlcGxveWluZyBBV1MgQ0RLIChDbG91ZCBEZXZlbG9wbWVudCBLaXQpIGFwcGxpY2F0aW9ucyBhY3Jvc3MgbXVsdGlwbGUgc3RhZ2VzLlxuICogSXQgYWxzbyBtYW5hZ2VzIHRhc2tzIHN1Y2ggYXMgcHVibGlzaGluZyBDREsgYXNzZXRzLCBidW1waW5nIHZlcnNpb24gYmFzZWQgb24gZ2l0IHRhZ3MsIGFuZCBjbGVhbmluZyB1cCBjb25mbGljdGluZyB0YXNrcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENES1BpcGVsaW5lIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgc3RhY2tQcmVmaXg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGVuZ2luZTogQmFzZUVuZ2luZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHAsIHByaXZhdGUgcHJvcHM6IENES1BpcGVsaW5lT3B0aW9ucykge1xuICAgIHN1cGVyKGFwcCk7XG5cbiAgICAvLyBBZGQgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jaWVzXG4gICAgdGhpcy5hcHAuYWRkRGV2RGVwcyhcbiAgICAgICdAdHlwZXMvc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnY2RrLWFzc2V0cycsXG4gICAgKTtcbiAgICAvLyB0aGlzLmFwcC5hZGREZXBzKFxuICAgIC8vICk7XG5cbiAgICB0aGlzLnN0YWNrUHJlZml4ID0gcHJvcHMuc3RhY2tQcmVmaXggPz8gYXBwLm5hbWU7XG5cbiAgICAvLyBDcmVhdGUgZW5naW5lIGluc3RhbmNlIHRvIHVzZVxuICAgIHN3aXRjaCAocHJvcHMuZW5naW5lKSB7XG4gICAgICBjYXNlIFBpcGVsaW5lRW5naW5lLkdJVEhVQjpcbiAgICAgICAgdGhpcy5lbmdpbmUgPSBuZXcgR2l0SHViRW5naW5lKGFwcCwgcHJvcHMsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmdpbmUnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmVzIHRoZSBjb21waWxlZCBjbG91ZCBhc3NlbWJseSBiZWZvcmUgZWFjaCBzeW50aFxuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKCdzeW50aCcpPy5wcmVwZW5kRXhlYyhgcm0gLXJmICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH1gKTtcbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZCgnc3ludGg6c2lsZW50Jyk/LnByZXBlbmRFeGVjKGBybSAtcmYgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fWApO1xuXG4gICAgLy8gUmVtb3ZlIHRhc2tzIHRoYXQgbWlnaHQgY29uZmxpY3Qgd2l0aCB0aGUgcGlwZWxpbmUgcHJvY2Vzc1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkZXBsb3knKTtcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnZGlmZicpO1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkZXN0cm95Jyk7XG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ3dhdGNoJyk7XG5cbiAgICB0aGlzLmNyZWF0ZVN5bnRoU3RhZ2UoKTtcblxuICAgIC8vIENyZWF0ZXMgZGlmZmVyZW50IGRlcGxveW1lbnQgc3RhZ2VzXG4gICAgaWYgKHByb3BzLnBlcnNvbmFsU3RhZ2UpIHtcbiAgICAgIHRoaXMuY3JlYXRlUGVyc29uYWxTdGFnZSgpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZmVhdHVyZVN0YWdlcykge1xuICAgICAgdGhpcy5jcmVhdGVGZWF0dXJlU3RhZ2UoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGFnZSBvZiBwcm9wcy5zdGFnZXMpIHtcbiAgICAgIHRoaXMuY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlcyB0YXNrcyB0byBoYW5kbGUgdGhlIHJlbGVhc2UgcHJvY2Vzc1xuICAgIHRoaXMuY3JlYXRlUmVsZWFzZVRhc2tzKCk7XG5cbiAgICAvLyBDcmVhdGVzIGEgc3BlY2lhbGl6ZWQgQ0RLIEFwcCBjbGFzc1xuICAgIHRoaXMuY3JlYXRlQXBwbGljYXRpb25FbnRyeXBvaW50KCk7XG5cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3ludGhTdGFnZSgpIHtcbiAgICB0aGlzLmVuZ2luZS5jcmVhdGVTeW50aCh7XG4gICAgICBjb21tYW5kczogW1xuICAgICAgICAuLi4odGhpcy5wcm9wcy5wcmVJbnN0YWxsQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICBgbnB4IHByb2plbiAke3RoaXMuYXBwLnBhY2thZ2UuaW5zdGFsbENpVGFzay5uYW1lfWAsXG4gICAgICAgIC4uLih0aGlzLnByb3BzLnByZVN5bnRoQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICAnbnB4IHByb2plbiBidWlsZCcsXG4gICAgICAgIC4uLih0aGlzLnByb3BzLnBvc3RTeW50aENvbW1hbmRzID8/IFtdKSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGhpcy5lbmdpbmUuY3JlYXRlQXNzZXRVcGxvYWQoe1xuICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgLi4uKHRoaXMucHJvcHMucHJlSW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICAgICAgYG5weCBwcm9qZW4gJHt0aGlzLmFwcC5wYWNrYWdlLmluc3RhbGxDaVRhc2submFtZX1gLFxuICAgICAgICAnbnB4IHByb2plbiBwdWJsaXNoOmFzc2V0cycsXG4gICAgICAgIC4uLih0aGlzLmVuZ2luZS5uZWVkc1ZlcnNpb25lZEFydGlmYWN0cyA/IFtcbiAgICAgICAgICAnbnB4IHByb2plbiBidW1wJyxcbiAgICAgICAgICAnbnB4IHByb2plbiByZWxlYXNlOnB1c2gtYXNzZW1ibHknLFxuICAgICAgICBdIDogW10pLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgYXBwbGljYXRpb24sIGluY2x1ZGluZyBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzXG4gICAqIG5lY2Vzc2FyeSB0byBzZXQgdXAgdGhlIHBpcGVsaW5lIGFuZCBkZWZpbmUgdGhlIEFXUyBDREsgc3RhY2tzIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBcHBsaWNhdGlvbkVudHJ5cG9pbnQoKSB7XG4gICAgbGV0IHByb3BzQ29kZSA9ICcnO1xuICAgIGxldCBhcHBDb2RlID0gJyc7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5wZXJzb25hbFN0YWdlKSB7XG4gICAgICBwcm9wc0NvZGUgKz0gYCAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgcGVyc29uYWwgc3RhY2suICovXG4gIHByb3ZpZGVQZXJzb25hbFN0YWNrOiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG5gO1xuICAgICAgYXBwQ29kZSArPSBgICAgIC8vIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBVU0VSIGlzIHNldCBhbmQgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgY3JlYXRpbmcgYSBwZXJzb25hbCBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZVBlcnNvbmFsU3RhY2sgJiYgcHJvY2Vzcy5lbnYuVVNFUikge1xuICAgICAgY29uc3Qgc3RhZ2VOYW1lID0gJ3BlcnNvbmFsLScgKyBwcm9jZXNzLmVudi5VU0VSLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxcXFxcLy9nLCAnLScpO1xuICAgICAgcHJvcHMucHJvdmlkZVBlcnNvbmFsU3RhY2sodGhpcywgJyR7dGhpcy5zdGFja1ByZWZpeH0tcGVyc29uYWwnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLnBlcnNvbmFsU3RhZ2UuZW52KX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbmA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMuZmVhdHVyZVN0YWdlcykge1xuICAgICAgcHJvcHNDb2RlICs9IGAgIC8qKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGZlYXR1cmUgc3RhY2suICovXG4gIHByb3ZpZGVGZWF0dXJlU3RhY2s6IChhcHA6IEFwcCwgc3RhY2tJZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVBcHBTdGFja1Byb3BzKSA9PiBTdGFjaztcbmA7XG4gICAgICBhcHBDb2RlICs9IGAgICAgLy8gSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEJSQU5DSCBpcyBzZXQgYW5kIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgZmVhdHVyZSBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZUZlYXR1cmVTdGFjayAmJiBwcm9jZXNzLmVudi5CUkFOQ0gpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdmZWF0dXJlLScgKyBwcm9jZXNzLmVudi5CUkFOQ0gudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlRmVhdHVyZVN0YWNrKHRoaXMsICcke3RoaXMuc3RhY2tQcmVmaXh9LWZlYXR1cmUnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmZlYXR1cmVTdGFnZXMuZW52KX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbmA7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdGFnZSBvZiB0aGlzLnByb3BzLnN0YWdlcykge1xuICAgICAgY29uc3QgbmFtZVVwcGVyRmlyc3QgPSBgJHtzdGFnZS5uYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7c3RhZ2UubmFtZS5zdWJzdHJpbmcoMSl9YDtcblxuICAgICAgcHJvcHNDb2RlICs9IGAgIC8qKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhICR7c3RhZ2UubmFtZX0gc3RhY2suICovXG4gIHByb3ZpZGUke25hbWVVcHBlckZpcnN0fVN0YWNrOiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG5gO1xuICAgICAgYXBwQ29kZSArPSBgICAgIC8vIElmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgJHtzdGFnZS5uYW1lfSBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZSR7bmFtZVVwcGVyRmlyc3R9U3RhY2spIHtcbiAgICAgIHByb3BzLnByb3ZpZGUke25hbWVVcHBlckZpcnN0fVN0YWNrKHRoaXMsICcke3RoaXMuc3RhY2tQcmVmaXh9LSR7c3RhZ2UubmFtZX0nLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeShzdGFnZS5lbnYpfSwgc3RhY2tOYW1lOiAnJHt0aGlzLnN0YWNrUHJlZml4fS0ke3N0YWdlLm5hbWV9Jywgc3RhZ2VOYW1lOiAnJHtzdGFnZS5uYW1lfScgfSk7XG4gICAgfVxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBGaWxlID0gbmV3IFRleHRGaWxlKHRoaXMucHJvamVjdCwgYCR7dGhpcy5hcHAuc3JjZGlyfS9hcHAudHNgKTtcbiAgICBhcHBGaWxlLmFkZExpbmUoYC8vICR7UFJPSkVOX01BUktFUn1cbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgeyBBcHAsIEFwcFByb3BzLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcblxuLyoqXG4gKiBQaXBlbGluZUFwcFByb3BzIGlzIGFuIGV4dGVuc2lvbiBvZiBBcHBQcm9wcywgd2hpY2ggaXMgcGFydCBvZiB0aGUgQVdTIENESyBjb3JlLlxuICogSXQgaW5jbHVkZXMgb3B0aW9uYWwgZnVuY3Rpb25zIHRvIHByb3ZpZGUgQVdTIFN0YWNrcyBmb3IgZGlmZmVyZW50IHN0YWdlcy5cbiAqXG4gKiBVc2UgdGhlc2UgZnVuY3Rpb25zIHRvIGluc3RhbnRpYXRlIHlvdXIgYXBwbGljYXRpb24gc3RhY2tzIHdpdGggdGhlIHBhcmFtZXRlcnMgZm9yXG4gKiBlYWNoIHN0YWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVBcHBQcm9wcyBleHRlbmRzIEFwcFByb3BzIHtcbiR7cHJvcHNDb2RlfVxufVxuXG4vKipcbiAqIFBpcGVsaW5lQXBwU3RhY2tQcm9wcyBpcyBhbiBleHRlbnNpb24gb2YgU3RhY2tQcm9wcywgd2hpY2ggaXMgcGFydCBvZiB0aGUgQVdTIENESyBjb3JlLlxuICogSXQgaW5jbHVkZXMgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBzdGFnZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQXBwU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgUGlwZWxpbmVBcHAgY2xhc3MgZXh0ZW5kcyB0aGUgQXBwIGNsYXNzIGZyb20gQVdTIENESyBhbmQgb3ZlcnJpZGVzIHRoZSBjb25zdHJ1Y3RvciB0byBzdXBwb3J0XG4gKiBkaWZmZXJlbnQgc3RhZ2VzIG9mIHRoZSBhcHBsaWNhdGlvbiAoZGV2ZWxvcG1lbnQsIHByb2R1Y3Rpb24sIHBlcnNvbmFsLCBmZWF0dXJlKSBieSBpbnZva2luZyB0aGUgcHJvdmlkZWRcbiAqIHN0YWNrLXByb3ZpZGluZyBmdW5jdGlvbnMgZnJvbSB0aGUgcHJvcHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZUFwcCBleHRlbmRzIEFwcCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBQaXBlbGluZUFwcFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4ke2FwcENvZGV9XG5cbiAgfVxufVxuYCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyB0byBwdWJsaXNoIENESyBhc3NldHMgdG8gYWxsIGFjY291bnRzIGFuZCBoYW5kbGUgdmVyc2lvbmluZywgaW5jbHVkaW5nIGJ1bXBpbmcgdGhlIHZlcnNpb25cbiAgICogYmFzZWQgb24gdGhlIGxhdGVzdCBnaXQgdGFnIGFuZCBwdXNoaW5nIHRoZSBDREsgYXNzZW1ibHkgdG8gdGhlIHBhY2thZ2UgcmVwb3NpdG9yeS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUmVsZWFzZVRhc2tzKCkge1xuICAgIC8vIFRhc2sgdG8gcHVibGlzaCB0aGUgQ0RLIGFzc2V0cyB0byBhbGwgYWNjb3VudHNcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygncHVibGlzaDphc3NldHMnLCB7XG4gICAgICBzdGVwczogdGhpcy5wcm9wcy5zdGFnZXMubWFwKHN0YWdlID0+ICh7XG4gICAgICAgIGV4ZWM6IGBucHggY2RrLWFzc2V0cyAtcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9LyR7dGhpcy5zdGFja1ByZWZpeH0tJHtzdGFnZS5uYW1lfS5hc3NldHMuanNvbiBwdWJsaXNoYCxcbiAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdidW1wJywge1xuICAgICAgZGVzY3JpcHRpb246ICdCdW1wcyB2ZXJzaW9uIGJhc2VkIG9uIGxhdGVzdCBnaXQgdGFnJyxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiAncGlwZWxpbmVzLXJlbGVhc2UgYnVtcCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiAnZ2l0IHB1c2ggLS10YWdzJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3JlbGVhc2U6cHVzaC1hc3NlbWJseScsIHtcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiBgcGlwZWxpbmVzLXJlbGVhc2UgY3JlYXRlLW1hbmlmZXN0IFwiJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fVwiICBcIiR7dGhpcy5wcm9wcy5wa2dOYW1lc3BhY2V9XCJgLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY3dkOiB0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0LFxuICAgICAgICAgIGV4ZWM6ICducG0gdmVyc2lvbiAtLW5vLWdpdC10YWctdmVyc2lvbiBmcm9tLWdpdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjd2Q6IHRoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXQsXG4gICAgICAgICAgZXhlYzogJ25wbSBwdWJsaXNoJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyBmb3IgdGhlIHBlcnNvbmFsIGRlcGxveW1lbnQgc3RhZ2UsIGluY2x1ZGluZyBkZXBsb3ltZW50LCB3YXRjaGluZyBmb3IgY2hhbmdlcyxcbiAgICogY29tcGFyaW5nIGNoYW5nZXMgKGRpZmYpLCBhbmQgZGVzdHJveWluZyB0aGUgc3RhY2sgd2hlbiBubyBsb25nZXIgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVQZXJzb25hbFN0YWdlKCkge1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXBsb3k6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlcGxveSAke3RoaXMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsYCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnd2F0Y2g6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlcGxveSAtLXdhdGNoIC0taG90c3dhcCAke3RoaXMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsYCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGlmZjpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGlmZiAke3RoaXMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsYCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGVzdHJveTpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVzdHJveSAke3RoaXMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRhc2tzIGZvciB0aGUgZmVhdHVyZSBkZXBsb3ltZW50IHN0YWdlLCBpbmNsdWRpbmcgZGVwbG95bWVudCwgY29tcGFyaW5nIGNoYW5nZXMgKGRpZmYpLFxuICAgKiBhbmQgZGVzdHJveWluZyB0aGUgc3RhY2sgd2hlbiBubyBsb25nZXIgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGZWF0dXJlU3RhZ2UoKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayAtLXByb2dyZXNzIGV2ZW50cyAtLXJlcXVpcmUtYXBwcm92YWwgbmV2ZXIgZGVwbG95ICR7dGhpcy5zdGFja1ByZWZpeH0tZmVhdHVyZWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RpZmY6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGlmZiAke3RoaXMuc3RhY2tQcmVmaXh9LWZlYXR1cmVgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OmZlYXR1cmUnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlc3Ryb3kgJHt0aGlzLnN0YWNrUHJlZml4fS1mZWF0dXJlYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRhc2tzIGZvciB0aGUgZ2VuZXJhbCBwaXBlbGluZSBzdGFnZXMgKGRldiwgcHJvZCksIGluY2x1ZGluZyBkZXBsb3ltZW50IGFuZCBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZikuXG4gICAqIEBwYXJhbSB7RGVwbG95U3RhZ2VPcHRpb25zfSBzdGFnZSAtIFRoZSBzdGFnZSB0byBjcmVhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZTogRGVwbG95bWVudFN0YWdlKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYGRlcGxveToke3N0YWdlLm5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnN0YWNrUHJlZml4fS0ke3N0YWdlLm5hbWV9YCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzayhgZGlmZjoke3N0YWdlLm5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IGRpZmYgJHt0aGlzLnN0YWNrUHJlZml4fS0ke3N0YWdlLm5hbWV9YCxcbiAgICB9KTtcblxuICAgIHRoaXMuZW5naW5lLmNyZWF0ZURlcGxveW1lbnQoe1xuICAgICAgY29uZmlnOiBzdGFnZSxcbiAgICAgIGluc3RhbGxDb21tYW5kczogW1xuICAgICAgICAuLi4odGhpcy5wcm9wcy5wcmVJbnN0YWxsQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICBgbnB4IHByb2plbiAke3RoaXMuYXBwLnBhY2thZ2UuaW5zdGFsbENpVGFzay5uYW1lfWAsXG4gICAgICBdLFxuICAgICAgZGVwbG95Q29tbWFuZHM6IFtcbiAgICAgICAgLy8gVE9ETyBwcmUgZGVwbG95IHN0ZXBzXG4gICAgICAgIGBucHggcHJvamVuIGRlcGxveToke3N0YWdlLm5hbWV9YCxcbiAgICAgICAgLy8gVE9ETyBwb3N0IGRlcGxveSBzdGVwc1xuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufSJdfQ==
File without changes