@codedrifters/configulator 0.0.21 → 0.0.22
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/aws/aws-deployment-config.d.ts +40 -108
- package/lib/aws/aws-deployment-config.js +64 -103
- package/lib/aws/aws-deployment-target.d.ts +160 -0
- package/lib/aws/aws-deployment-target.js +158 -0
- package/lib/turbo/turbo-repo.d.ts +5 -1
- package/lib/turbo/turbo-repo.js +8 -8
- package/lib/versions.d.ts +7 -3
- package/lib/versions.js +8 -4
- package/lib/workflows/aws-deploy-workflow.d.ts +54 -0
- package/lib/workflows/aws-deploy-workflow.js +218 -0
- package/lib/workflows/index.d.ts +1 -2
- package/lib/workflows/index.js +2 -3
- package/package.json +1 -1
- package/lib/workflows/build-workflow.d.ts +0 -13
- package/lib/workflows/build-workflow.js +0 -64
- package/lib/workflows/deploy-workflow.d.ts +0 -17
- package/lib/workflows/deploy-workflow.js +0 -113
- package/lib/workflows/steps/deploy.d.ts +0 -4
- package/lib/workflows/steps/deploy.js +0 -62
|
@@ -1,141 +1,73 @@
|
|
|
1
|
-
import { Component
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { Component } from "projen";
|
|
2
|
+
import { AwsCdkTypeScriptApp } from "projen/lib/awscdk";
|
|
3
|
+
import { AwsDeploymentTarget } from "./aws-deployment-target";
|
|
4
4
|
/*******************************************************************************
|
|
5
5
|
*
|
|
6
|
+
* AWS Deployment Configuration
|
|
7
|
+
*
|
|
8
|
+
* This component allows configuration of multiple AWS deployment
|
|
9
|
+
* targets, each with its own account, region, and deployment type
|
|
10
|
+
* (dev, stage, prod). It supports both local and CI deployments,
|
|
11
|
+
* with customizable settings for each target.
|
|
6
12
|
*
|
|
7
13
|
******************************************************************************/
|
|
8
|
-
export interface AwsDeploymentConfigOptions {
|
|
9
|
-
}
|
|
10
|
-
export declare const AWS_DEPLOY_TYPE: {
|
|
11
|
-
/**
|
|
12
|
-
* Development environment, typically used for testing and development.
|
|
13
|
-
*/
|
|
14
|
-
readonly DEV: "dev";
|
|
15
|
-
/**
|
|
16
|
-
* Staging environment, used for pre-production testing.
|
|
17
|
-
*/
|
|
18
|
-
readonly STAGE: "stage";
|
|
19
|
-
/**
|
|
20
|
-
* Production environment, used for live deployments.
|
|
21
|
-
*/
|
|
22
|
-
readonly PROD: "prod";
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* Above const as a type.
|
|
26
|
-
*/
|
|
27
|
-
export type AwsDeploymentType = (typeof AWS_DEPLOY_TYPE)[keyof typeof AWS_DEPLOY_TYPE];
|
|
28
|
-
/**
|
|
29
|
-
* Represents the configuration for local deployment in AWS.
|
|
30
|
-
*/
|
|
31
|
-
export interface AwsLocalDeploymentConfig {
|
|
32
|
-
/**
|
|
33
|
-
* The AWS profile (in ~/.aws/config) to use for local deployment.
|
|
34
|
-
*
|
|
35
|
-
* @default generated dynamically based role name, account and region
|
|
36
|
-
*/
|
|
37
|
-
profile?: string;
|
|
38
|
-
/**
|
|
39
|
-
* Named Role used to conduct local deployments.
|
|
40
|
-
*
|
|
41
|
-
* @default "administratoraccess"
|
|
42
|
-
*/
|
|
43
|
-
roleName?: string;
|
|
44
|
-
}
|
|
45
|
-
export interface CiDeploymentConfig {
|
|
46
|
-
/**
|
|
47
|
-
* The OIDC IAM Role to assume for CI deployments.
|
|
48
|
-
*/
|
|
49
|
-
roleArn: string;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Represents a deployment target in AWS, including account and region, and
|
|
53
|
-
* branches allowed to deploy to this target.
|
|
54
|
-
*/
|
|
55
|
-
export interface AwsDeploymentTarget {
|
|
56
|
-
/**
|
|
57
|
-
* The account name for the deployment target.
|
|
58
|
-
*/
|
|
59
|
-
account: string;
|
|
60
|
-
/**
|
|
61
|
-
* The AWS region for the deployment target.
|
|
62
|
-
*/
|
|
63
|
-
region: string;
|
|
64
|
-
/**'
|
|
65
|
-
* AWS deployment type, such as dev, stage, or prod.
|
|
66
|
-
*/
|
|
67
|
-
awsDeploymentType: AwsDeploymentType;
|
|
68
|
-
/**
|
|
69
|
-
* The AWS profile to use for this deployment target.
|
|
70
|
-
*/
|
|
71
|
-
branches: Array<GitBranch>;
|
|
72
|
-
/**
|
|
73
|
-
* Can this deployment target be used for local development?
|
|
74
|
-
*/
|
|
75
|
-
localDeployment: boolean;
|
|
76
|
-
/**
|
|
77
|
-
* Configuration when deploying to this target locally.
|
|
78
|
-
*/
|
|
79
|
-
localDeploymentConfig?: AwsLocalDeploymentConfig;
|
|
80
|
-
/**
|
|
81
|
-
* Can this deployment target be used in CI deployments?
|
|
82
|
-
*/
|
|
83
|
-
ciDeployment: boolean;
|
|
84
|
-
ciDeploymentConfig?: CiDeploymentConfig;
|
|
85
|
-
}
|
|
86
14
|
export declare class AwsDeploymentConfig extends Component {
|
|
87
|
-
static of(project:
|
|
15
|
+
static of(project: AwsCdkTypeScriptApp): AwsDeploymentConfig | undefined;
|
|
88
16
|
/**
|
|
89
17
|
* Environment variables to be injected into all tasks.
|
|
90
18
|
*/
|
|
91
|
-
|
|
19
|
+
readonly env: Record<string, string>;
|
|
92
20
|
/**
|
|
93
21
|
* The relative path to the project directory from the root of the project.
|
|
94
22
|
*/
|
|
95
|
-
|
|
23
|
+
readonly projectPath: string;
|
|
96
24
|
/**
|
|
97
25
|
* The relative path to the root of the project from the output directory.
|
|
98
26
|
*/
|
|
99
|
-
|
|
27
|
+
readonly rootPath: string;
|
|
100
28
|
/**
|
|
101
29
|
* The output directory for the CDK synthesis.
|
|
102
30
|
*/
|
|
103
|
-
|
|
31
|
+
readonly cdkOut: string;
|
|
104
32
|
/**
|
|
105
33
|
* Array of targets for deployment.
|
|
106
34
|
*/
|
|
107
|
-
readonly
|
|
108
|
-
constructor(project:
|
|
109
|
-
/**
|
|
110
|
-
* Adds a deployment target to the configuration.
|
|
111
|
-
*
|
|
112
|
-
* @param target The deployment target to add.
|
|
113
|
-
*/
|
|
114
|
-
addDeploymentTarget(target: AwsDeploymentTarget): void;
|
|
35
|
+
readonly awsDeploymentTargets: Array<AwsDeploymentTarget>;
|
|
36
|
+
constructor(project: AwsCdkTypeScriptApp);
|
|
115
37
|
/*****************************************************************************
|
|
116
38
|
*
|
|
117
|
-
*
|
|
39
|
+
* Target filter helpers
|
|
118
40
|
*
|
|
119
|
-
*
|
|
120
|
-
* - Change the output location for easier workflows.
|
|
41
|
+
* Return various targets for deployment scripts to use.
|
|
121
42
|
*
|
|
122
43
|
****************************************************************************/
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
44
|
+
/**
|
|
45
|
+
* @returns All production deployment targets.
|
|
46
|
+
*/
|
|
47
|
+
get prodTargets(): Array<AwsDeploymentTarget>;
|
|
48
|
+
get prodTargetsForCI(): Array<AwsDeploymentTarget>;
|
|
49
|
+
get prodTargetsForLocal(): Array<AwsDeploymentTarget>;
|
|
50
|
+
/**
|
|
127
51
|
*
|
|
128
|
-
*
|
|
52
|
+
* @returns All stage deployment targets.
|
|
53
|
+
*/
|
|
54
|
+
get stageTargets(): Array<AwsDeploymentTarget>;
|
|
55
|
+
get stageTargetsForCI(): Array<AwsDeploymentTarget>;
|
|
56
|
+
get stageTargetsForLocal(): Array<AwsDeploymentTarget>;
|
|
57
|
+
/**
|
|
129
58
|
*
|
|
130
|
-
|
|
131
|
-
|
|
59
|
+
* @returns All dev deployment targets.
|
|
60
|
+
*/
|
|
61
|
+
get devTargets(): Array<AwsDeploymentTarget>;
|
|
62
|
+
get devTargetsForCI(): Array<AwsDeploymentTarget>;
|
|
63
|
+
get devTargetsForLocal(): Array<AwsDeploymentTarget>;
|
|
132
64
|
/*****************************************************************************
|
|
133
65
|
*
|
|
134
|
-
*
|
|
66
|
+
* Synth Tasks
|
|
135
67
|
*
|
|
136
|
-
* - Configure
|
|
137
|
-
* -
|
|
68
|
+
* - Configure synth task to use the branch name
|
|
69
|
+
* - Change the output location for easier workflows.
|
|
138
70
|
*
|
|
139
71
|
****************************************************************************/
|
|
140
|
-
private
|
|
72
|
+
private configureSynthTask;
|
|
141
73
|
}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AwsDeploymentConfig =
|
|
3
|
+
exports.AwsDeploymentConfig = void 0;
|
|
4
4
|
const node_path_1 = require("node:path");
|
|
5
5
|
const projen_1 = require("projen");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
6
|
+
const aws_deployment_target_1 = require("./aws-deployment-target");
|
|
7
|
+
/*******************************************************************************
|
|
8
|
+
*
|
|
9
|
+
* AWS Deployment Configuration
|
|
10
|
+
*
|
|
11
|
+
* This component allows configuration of multiple AWS deployment
|
|
12
|
+
* targets, each with its own account, region, and deployment type
|
|
13
|
+
* (dev, stage, prod). It supports both local and CI deployments,
|
|
14
|
+
* with customizable settings for each target.
|
|
15
|
+
*
|
|
16
|
+
******************************************************************************/
|
|
17
|
+
/*
|
|
18
|
+
export interface AwsDeploymentConfigOptions {}
|
|
19
|
+
*/
|
|
20
20
|
class AwsDeploymentConfig extends projen_1.Component {
|
|
21
21
|
static of(project) {
|
|
22
22
|
const isDefined = (c) => c instanceof AwsDeploymentConfig;
|
|
23
|
-
return project.components.
|
|
23
|
+
return project.components.find(isDefined);
|
|
24
24
|
}
|
|
25
25
|
constructor(project) {
|
|
26
26
|
super(project);
|
|
27
27
|
/**
|
|
28
28
|
* Array of targets for deployment.
|
|
29
29
|
*/
|
|
30
|
-
this.
|
|
30
|
+
this.awsDeploymentTargets = [];
|
|
31
31
|
/*****************************************************************************
|
|
32
32
|
*
|
|
33
33
|
* Synth Tasks
|
|
@@ -46,45 +46,6 @@ class AwsDeploymentConfig extends projen_1.Component {
|
|
|
46
46
|
.tryFind("synth:silent")
|
|
47
47
|
?.exec(`cdk synth -q --output ${this.cdkOut}`, { env: this.env });
|
|
48
48
|
};
|
|
49
|
-
/*****************************************************************************
|
|
50
|
-
*
|
|
51
|
-
* Deploy Tasks
|
|
52
|
-
*
|
|
53
|
-
* - If local deploy, add a deploy task.
|
|
54
|
-
*
|
|
55
|
-
****************************************************************************/
|
|
56
|
-
this.configureDeployTask = (target) => {
|
|
57
|
-
if (target.localDeployment) {
|
|
58
|
-
const taskName = ["deploy", target.account, target.region].join(":");
|
|
59
|
-
const deployTask = this.project.tasks.addTask(taskName, {
|
|
60
|
-
env: this.env,
|
|
61
|
-
});
|
|
62
|
-
deployTask.exec(`cdk deploy --lookups=false --require-approval=never --profile=${target.localDeploymentConfig?.profile} --app=${this.cdkOut} "*-${target.account}-${target.region}"`);
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
/*****************************************************************************
|
|
66
|
-
*
|
|
67
|
-
* Watch tasks
|
|
68
|
-
*
|
|
69
|
-
* - Configure watch task to use the branch name
|
|
70
|
-
* - configure watch task to use the correct synth output location.
|
|
71
|
-
*
|
|
72
|
-
****************************************************************************/
|
|
73
|
-
this.configureWatchTask = (target) => {
|
|
74
|
-
if (target.localDeployment) {
|
|
75
|
-
const taskName = ["watch", target.account, target.region].join(":");
|
|
76
|
-
const watchTask = this.project.tasks.addTask(taskName, { env: this.env });
|
|
77
|
-
// update the synth first
|
|
78
|
-
const synthSilent = this.project.tasks.tryFind("synth:silent");
|
|
79
|
-
if (synthSilent) {
|
|
80
|
-
watchTask.spawn(synthSilent);
|
|
81
|
-
}
|
|
82
|
-
// do a normal deploy
|
|
83
|
-
watchTask.exec(`cdk deploy --lookups=false --require-approval=never --profile=${target.localDeploymentConfig?.profile} --app=${this.cdkOut} "*-${target.account}-${target.region}"`);
|
|
84
|
-
// watch for changes and log output
|
|
85
|
-
watchTask.exec(`cdk watch --lookups=false --require-approval=never --hotswap --profile=${target.localDeploymentConfig?.profile} "*-${target.account}-${target.region}"`);
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
49
|
/**
|
|
89
50
|
* Common variables used across tasks.
|
|
90
51
|
*/
|
|
@@ -110,56 +71,56 @@ class AwsDeploymentConfig extends projen_1.Component {
|
|
|
110
71
|
*/
|
|
111
72
|
this.configureSynthTask();
|
|
112
73
|
}
|
|
74
|
+
/*****************************************************************************
|
|
75
|
+
*
|
|
76
|
+
* Target filter helpers
|
|
77
|
+
*
|
|
78
|
+
* Return various targets for deployment scripts to use.
|
|
79
|
+
*
|
|
80
|
+
****************************************************************************/
|
|
81
|
+
/**
|
|
82
|
+
* @returns All production deployment targets.
|
|
83
|
+
*/
|
|
84
|
+
get prodTargets() {
|
|
85
|
+
return this.awsDeploymentTargets.filter((target) => target.awsDeploymentType === aws_deployment_target_1.AWS_DEPLOY_TYPE.PROD);
|
|
86
|
+
}
|
|
87
|
+
get prodTargetsForCI() {
|
|
88
|
+
return this.awsDeploymentTargets.filter((target) => target.awsDeploymentType === aws_deployment_target_1.AWS_DEPLOY_TYPE.PROD &&
|
|
89
|
+
target.ciDeployment);
|
|
90
|
+
}
|
|
91
|
+
get prodTargetsForLocal() {
|
|
92
|
+
return this.awsDeploymentTargets.filter((target) => target.awsDeploymentType === aws_deployment_target_1.AWS_DEPLOY_TYPE.PROD &&
|
|
93
|
+
target.localDeployment);
|
|
94
|
+
}
|
|
113
95
|
/**
|
|
114
|
-
* Adds a deployment target to the configuration.
|
|
115
96
|
*
|
|
116
|
-
* @
|
|
97
|
+
* @returns All stage deployment targets.
|
|
117
98
|
*/
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Some defaults for CI deployments.
|
|
146
|
-
*/
|
|
147
|
-
if (target.ciDeployment) {
|
|
148
|
-
const roleArn = target.ciDeploymentConfig?.roleArn ||
|
|
149
|
-
`arn:aws:iam::${target.account}:role/GitHub${this.project.name.replace("-", "")}`;
|
|
150
|
-
target = {
|
|
151
|
-
...target,
|
|
152
|
-
ciDeploymentConfig: {
|
|
153
|
-
roleArn,
|
|
154
|
-
},
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
this.deploymentTargets.push(target);
|
|
158
|
-
// Deploy tasks are configured per target.
|
|
159
|
-
this.configureDeployTask(target);
|
|
160
|
-
// Watch tasks are configured per target.
|
|
161
|
-
this.configureWatchTask(target);
|
|
99
|
+
get stageTargets() {
|
|
100
|
+
return this.awsDeploymentTargets.filter((target) => target.awsDeploymentType === aws_deployment_target_1.AWS_DEPLOY_TYPE.STAGE);
|
|
101
|
+
}
|
|
102
|
+
get stageTargetsForCI() {
|
|
103
|
+
return this.awsDeploymentTargets.filter((target) => target.awsDeploymentType === aws_deployment_target_1.AWS_DEPLOY_TYPE.STAGE &&
|
|
104
|
+
target.ciDeployment);
|
|
105
|
+
}
|
|
106
|
+
get stageTargetsForLocal() {
|
|
107
|
+
return this.awsDeploymentTargets.filter((target) => target.awsDeploymentType === aws_deployment_target_1.AWS_DEPLOY_TYPE.STAGE &&
|
|
108
|
+
target.localDeployment);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
*
|
|
112
|
+
* @returns All dev deployment targets.
|
|
113
|
+
*/
|
|
114
|
+
get devTargets() {
|
|
115
|
+
return this.awsDeploymentTargets.filter((target) => target.awsDeploymentType === aws_deployment_target_1.AWS_DEPLOY_TYPE.DEV);
|
|
116
|
+
}
|
|
117
|
+
get devTargetsForCI() {
|
|
118
|
+
return this.awsDeploymentTargets.filter((target) => target.awsDeploymentType === aws_deployment_target_1.AWS_DEPLOY_TYPE.DEV && target.ciDeployment);
|
|
119
|
+
}
|
|
120
|
+
get devTargetsForLocal() {
|
|
121
|
+
return this.awsDeploymentTargets.filter((target) => target.awsDeploymentType === aws_deployment_target_1.AWS_DEPLOY_TYPE.DEV &&
|
|
122
|
+
target.localDeployment);
|
|
162
123
|
}
|
|
163
124
|
}
|
|
164
125
|
exports.AwsDeploymentConfig = AwsDeploymentConfig;
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWRlcGxveW1lbnQtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hd3MtZGVwbG95bWVudC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQTJDO0FBQzNDLG1DQUE0QztBQWUvQixRQUFBLGVBQWUsR0FBRztJQUM3Qjs7T0FFRztJQUNILEdBQUcsRUFBRSxLQUFLO0lBRVY7O09BRUc7SUFDSCxLQUFLLEVBQUUsT0FBTztJQUVkOztPQUVHO0lBQ0gsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFDO0FBaUZYLE1BQWEsbUJBQW9CLFNBQVEsa0JBQVM7SUFDekMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFnQjtRQUMvQixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQVksRUFBNEIsRUFBRSxDQUMzRCxDQUFDLFlBQVksbUJBQW1CLENBQUM7UUFDbkMsT0FBTyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBMkJELFlBQVksT0FBNkI7UUFDdkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBTmpCOztXQUVHO1FBQ2Esc0JBQWlCLEdBQStCLEVBQUUsQ0FBQztRQWdHbkU7Ozs7Ozs7c0ZBTzhFO1FBRXRFLHVCQUFrQixHQUFHLEdBQVMsRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2lCQUNmLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ2pCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFakUsSUFBSSxD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TyxHQUNYLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxPQUFPO2dCQUNsQyxnQkFBZ0IsTUFBTSxDQUFDLE9BQU8sZUFBZSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFcEYsTUFBTSxHQUFHO2dCQUNQLEdBQUcsTUFBTTtnQkFDVCxrQkFBa0IsRUFBRTtvQkFDbEIsT0FBTztpQkFDUjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQywwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpDLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQTBFRjtBQXRNRCxrREFzTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luLCByZWxhdGl2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IENvbXBvbmVudCwgUHJvamVjdCB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IFR5cGVTY3JpcHRBcHBQcm9qZWN0IH0gZnJvbSBcInByb2plbi9saWIvdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgR2l0QnJhbmNoIH0gZnJvbSBcIi4uL2dpdC9naXQtdHlwZXNcIjtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXG4gKlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IGludGVyZmFjZSBBd3NEZXBsb3ltZW50Q29uZmlnT3B0aW9ucyB7XG4gIC8qKlxuICAgKlxuICAgKi9cbn1cblxuZXhwb3J0IGNvbnN0IEFXU19ERVBMT1lfVFlQRSA9IHtcbiAgLyoqXG4gICAqIERldmVsb3BtZW50IGVudmlyb25tZW50LCB0eXBpY2FsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGV2ZWxvcG1lbnQuXG4gICAqL1xuICBERVY6IFwiZGV2XCIsXG5cbiAgLyoqXG4gICAqIFN0YWdpbmcgZW52aXJvbm1lbnQsIHVzZWQgZm9yIHByZS1wcm9kdWN0aW9uIHRlc3RpbmcuXG4gICAqL1xuICBTVEFHRTogXCJzdGFnZVwiLFxuXG4gIC8qKlxuICAgKiBQcm9kdWN0aW9uIGVudmlyb25tZW50LCB1c2VkIGZvciBsaXZlIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgUFJPRDogXCJwcm9kXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEFib3ZlIGNvbnN0IGFzIGEgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXdzRGVwbG95bWVudFR5cGUgPVxuICAodHlwZW9mIEFXU19ERVBMT1lfVFlQRSlba2V5b2YgdHlwZW9mIEFXU19ERVBMT1lfVFlQRV07XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29uZmlndXJhdGlvbiBmb3IgbG9jYWwgZGVwbG95bWVudCBpbiBBV1MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzTG9jYWxEZXBsb3ltZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgcHJvZmlsZSAoaW4gfi8uYXdzL2NvbmZpZykgdG8gdXNlIGZvciBsb2NhbCBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgYmFzZWQgcm9sZSBuYW1lLCBhY2NvdW50IGFuZCByZWdpb25cbiAgICovXG4gIHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVkIFJvbGUgdXNlZCB0byBjb25kdWN0IGxvY2FsIGRlcGxveW1lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImFkbWluaXN0cmF0b3JhY2Nlc3NcIlxuICAgKi9cbiAgcm9sZU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2lEZXBsb3ltZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBPSURDIElBTSBSb2xlIHRvIGFzc3VtZSBmb3IgQ0kgZGVwbG95bWVudHMuXG4gICAqL1xuICByb2xlQXJuOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGRlcGxveW1lbnQgdGFyZ2V0IGluIEFXUywgaW5jbHVkaW5nIGFjY291bnQgYW5kIHJlZ2lvbiwgYW5kXG4gKiBicmFuY2hlcyBhbGxvd2VkIHRvIGRlcGxveSB0byB0aGlzIHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBd3NEZXBsb3ltZW50VGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSBhY2NvdW50IG5hbWUgZm9yIHRoZSBkZXBsb3ltZW50IHRhcmdldC5cbiAgICovXG4gIGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyByZWdpb24gZm9yIHRoZSBkZXBsb3ltZW50IHRhcmdldC5cbiAgICovXG4gIHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKidcbiAgICogQVdTIGRlcGxveW1lbnQgdHlwZSwgc3VjaCBhcyBkZXYsIHN0YWdlLCBvciBwcm9kLlxuICAgKi9cbiAgYXdzRGVwbG95bWVudFR5cGU6IEF3c0RlcGxveW1lbnRUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIHByb2ZpbGUgdG8gdXNlIGZvciB0aGlzIGRlcGxveW1lbnQgdGFyZ2V0LlxuICAgKi9cbiAgYnJhbmNoZXM6IEFycmF5PEdpdEJyYW5jaD47XG5cbiAgLyoqXG4gICAqIENhbiB0aGlzIGRlcGxveW1lbnQgdGFyZ2V0IGJlIHVzZWQgZm9yIGxvY2FsIGRldmVsb3BtZW50P1xuICAgKi9cbiAgbG9jYWxEZXBsb3ltZW50OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIHdoZW4gZGVwbG95aW5nIHRvIHRoaXMgdGFyZ2V0IGxvY2FsbHkuXG4gICAqL1xuICBsb2NhbERlcGxveW1lbnRDb25maWc/OiBBd3NMb2NhbERlcGxveW1lbnRDb25maWc7XG5cbiAgLyoqXG4gICAqIENhbiB0aGlzIGRlcGxveW1lbnQgdGFyZ2V0IGJlIHVzZWQgaW4gQ0kgZGVwbG95bWVudHM/XG4gICAqL1xuICBjaURlcGxveW1lbnQ6IGJvb2xlYW47XG5cbiAgLypcbiAgICogQ29uZmlndXJhdGlvbiB3aGVuIGRlcGxveWluZyB0byB0aGlzIHRhcmdldCBpbiBDSS5cblxuICAgKi9cbiAgY2lEZXBsb3ltZW50Q29uZmlnPzogQ2lEZXBsb3ltZW50Q29uZmlnO1xufVxuXG5leHBvcnQgY2xhc3MgQXdzRGVwbG95bWVudENvbmZpZyBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IEFycmF5PEF3c0RlcGxveW1lbnRDb25maWc+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc0RlZmluZWQgPSAoYzogQ29tcG9uZW50KTogYyBpcyBBd3NEZXBsb3ltZW50Q29uZmlnID0+XG4gICAgICBjIGluc3RhbmNlb2YgQXdzRGVwbG95bWVudENvbmZpZztcbiAgICByZXR1cm4gcHJvamVjdC5jb21wb25lbnRzLmZpbHRlcihpc0RlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmplY3RlZCBpbnRvIGFsbCB0YXNrcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZnJvbSB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZnJvbSB0aGUgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBDREsgc3ludGhlc2lzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjZGtPdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXJyYXkgb2YgdGFyZ2V0cyBmb3IgZGVwbG95bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXBsb3ltZW50VGFyZ2V0czogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBUeXBlU2NyaXB0QXBwUHJvamVjdCkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgLyoqXG4gICAgICogQ29tbW9uIHZhcmlhYmxlcyB1c2VkIGFjcm9zcyB0YXNrcy5cbiAgICAgKi9cbiAgICB0aGlzLmVudiA9IHsgR0lUX0JSQU5DSDogXCIkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpXCIgfTtcbiAgICB0aGlzLnByb2plY3RQYXRoID0gcmVsYXRpdmUocHJvamVjdC5yb290Lm91dGRpciwgcHJvamVjdC5vdXRkaXIpO1xuICAgIHRoaXMucm9vdFBhdGggPSByZWxhdGl2ZShwcm9qZWN0Lm91dGRpciwgcHJvamVjdC5yb290Lm91dGRpcik7XG4gICAgdGhpcy5jZGtPdXQgPSBqb2luKHRoaXMucm9vdFBhdGgsIFwiZGlzdFwiLCB0aGlzLnByb2plY3RQYXRoLCBcImNkay5vdXRcIik7XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBzb21lIHRhc2tzIHdlIHdpbGwgcmVidWlsZCBiZWxvdy5cbiAgICAgKi9cbiAgICBbXCJkZXBsb3lcIiwgXCJ3YXRjaFwiXS5mb3JFYWNoKCh0YXNrTmFtZSkgPT4ge1xuICAgICAgY29uc3QgdGFzayA9IHByb2plY3QudGFza3MudHJ5RmluZCh0YXNrTmFtZSk7XG4gICAgICBpZiAodGFzaykge1xuICAgICAgICB0YXNrLnJlc2V0KCk7XG4gICAgICAgIHRhc2suc2F5KFxuICAgICAgICAgIFwiR2VuZXJpYyB0YXNrIGlzIGRpc2FibGVkLiBQbGVhc2UgdXNlIHRoZSBzcGVjaWZpYyB0YXNrIGZvciB5b3VyIGRlcGxveW1lbnQgdGFyZ2V0LlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkZWZpbmUgU3ludGggaGVyZVxuICAgICAqXG4gICAgICogRGVwbG95IGFuZCB3YXRjaCBnZXQgcmVjb25maWd1cmVkIHBlciBkZXBsb3ltZW50IHRhcmdldC5cbiAgICAgKiBAc2VlIGFkZERlcGxveW1lbnRUYXJnZXQoKVxuICAgICAqL1xuICAgIHRoaXMuY29uZmlndXJlU3ludGhUYXNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRlcGxveW1lbnQgdGFyZ2V0IHRvIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBkZXBsb3ltZW50IHRhcmdldCB0byBhZGQuXG4gICAqL1xuICBwdWJsaWMgYWRkRGVwbG95bWVudFRhcmdldCh0YXJnZXQ6IEF3c0RlcGxveW1lbnRUYXJnZXQpOiB2b2lkIHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBDb25maWd1cmUgdGhlIGRlcGxveSB0YXJnZXQuXG4gICAgICpcbiAgICAgKiAtIEZvciBsb2NhbCBkZXBsb3ltZW50cywgZGlzY292ZXIgb3IgYnVpbGQgcHJvZmlsZSBuYW1lLlxuICAgICAqIC0gRm9yIENJIGRlcGxveW1lbnRzLCBkaXNjb3ZlciBvciBidWlsZCByb2xlIEFSTi5cbiAgICAgKiAtIEFkZCB0aGUgdGFyZ2V0IHRvIHRoZSBkZXBsb3ltZW50IHRhcmdldHMgYXJyYXkuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICAvKipcbiAgICAgKiBTb21lIGRlZmF1bHRzIGZvciBsb2NhbCBkZXBsb3ltZW50cy5cbiAgICAgKi9cbiAgICBpZiAodGFyZ2V0LmxvY2FsRGVwbG95bWVudCkge1xuICAgICAgY29uc3Qgcm9sZU5hbWUgPVxuICAgICAgICB0YXJnZXQubG9jYWxEZXBsb3ltZW50Q29uZmlnPy5yb2xlTmFtZT8udG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICBcImFkbWluaXN0cmF0b3JhY2Nlc3NcIjtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPVxuICAgICAgICB0YXJnZXQubG9jYWxEZXBsb3ltZW50Q29uZmlnPy5wcm9maWxlIHx8XG4gICAgICAgIGAke3JvbGVOYW1lfS0ke3RhcmdldC5hY2NvdW50fS0ke3RhcmdldC5yZWdpb259YDtcblxuICAgICAgdGFyZ2V0ID0ge1xuICAgICAgICAuLi50YXJnZXQsXG4gICAgICAgIGxvY2FsRGVwbG95bWVudENvbmZpZzoge1xuICAgICAgICAgIHByb2ZpbGUsXG4gICAgICAgICAgcm9sZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvbWUgZGVmYXVsdHMgZm9yIENJIGRlcGxveW1lbnRzLlxuICAgICAqL1xuICAgIGlmICh0YXJnZXQuY2lEZXBsb3ltZW50KSB7XG4gICAgICBjb25zdCByb2xlQXJuID1cbiAgICAgICAgdGFyZ2V0LmNpRGVwbG95bWVudENvbmZpZz8ucm9sZUFybiB8fFxuICAgICAgICBgYXJuOmF3czppYW06OiR7dGFyZ2V0LmFjY291bnR9OnJvbGUvR2l0SHViJHt0aGlzLnByb2plY3QubmFtZS5yZXBsYWNlKFwiLVwiLCBcIlwiKX1gO1xuXG4gICAgICB0YXJnZXQgPSB7XG4gICAgICAgIC4uLnRhcmdldCxcbiAgICAgICAgY2lEZXBsb3ltZW50Q29uZmlnOiB7XG4gICAgICAgICAgcm9sZUFybixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5kZXBsb3ltZW50VGFyZ2V0cy5wdXNoKHRhcmdldCk7XG5cbiAgICAvLyBEZXBsb3kgdGFza3MgYXJlIGNvbmZpZ3VyZWQgcGVyIHRhcmdldC5cbiAgICB0aGlzLmNvbmZpZ3VyZURlcGxveVRhc2sodGFyZ2V0KTtcblxuICAgIC8vIFdhdGNoIHRhc2tzIGFyZSBjb25maWd1cmVkIHBlciB0YXJnZXQuXG4gICAgdGhpcy5jb25maWd1cmVXYXRjaFRhc2sodGFyZ2V0KTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKlxuICAgKiBTeW50aCBUYXNrc1xuICAgKlxuICAgKiAtIENvbmZpZ3VyZSBzeW50aCB0YXNrIHRvIHVzZSB0aGUgYnJhbmNoIG5hbWVcbiAgICogLSBDaGFuZ2UgdGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgZWFzaWVyIHdvcmtmbG93cy5cbiAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSBjb25maWd1cmVTeW50aFRhc2sgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5wcm9qZWN0LnRhc2tzLnRyeUZpbmQoXCJzeW50aFwiKT8ucmVzZXQoYHJtIC1yZiAke3RoaXMuY2RrT3V0fWApO1xuICAgIHRoaXMucHJvamVjdC50YXNrc1xuICAgICAgLnRyeUZpbmQoXCJzeW50aFwiKVxuICAgICAgPy5leGVjKGBjZGsgc3ludGggLS1vdXRwdXQgJHt0aGlzLmNka091dH1gLCB7IGVudjogdGhpcy5lbnYgfSk7XG5cbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZChcInN5bnRoOnNpbGVudFwiKT8ucmVzZXQoYHJtIC1yZiAke3RoaXMuY2RrT3V0fWApO1xuICAgIHRoaXMucHJvamVjdC50YXNrc1xuICAgICAgLnRyeUZpbmQoXCJzeW50aDpzaWxlbnRcIilcbiAgICAgID8uZXhlYyhgY2RrIHN5bnRoIC1xIC0tb3V0cHV0ICR7dGhpcy5jZGtPdXR9YCwgeyBlbnY6IHRoaXMuZW52IH0pO1xuICB9O1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKlxuICAgKiBEZXBsb3kgVGFza3NcbiAgICpcbiAgICogLSBJZiBsb2NhbCBkZXBsb3ksIGFkZCBhIGRlcGxveSB0YXNrLlxuICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNvbmZpZ3VyZURlcGxveVRhc2sgPSAodGFyZ2V0OiBBd3NEZXBsb3ltZW50VGFyZ2V0KTogdm9pZCA9PiB7XG4gICAgaWYgKHRhcmdldC5sb2NhbERlcGxveW1lbnQpIHtcbiAgICAgIGNvbnN0IHRhc2tOYW1lID0gW1wiZGVwbG95XCIsIHRhcmdldC5hY2NvdW50LCB0YXJnZXQucmVnaW9uXS5qb2luKFwiOlwiKTtcbiAgICAgIGNvbnN0IGRlcGxveVRhc2sgPSB0aGlzLnByb2plY3QudGFza3MuYWRkVGFzayh0YXNrTmFtZSwge1xuICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgfSk7XG4gICAgICBkZXBsb3lUYXNrLmV4ZWMoXG4gICAgICAgIGBjZGsgZGVwbG95IC0tbG9va3Vwcz1mYWxzZSAtLXJlcXVpcmUtYXBwcm92YWw9bmV2ZXIgLS1wcm9maWxlPSR7dGFyZ2V0LmxvY2FsRGVwbG95bWVudENvbmZpZz8ucHJvZmlsZX0gLS1hcHA9JHt0aGlzLmNka091dH0gXCIqLSR7dGFyZ2V0LmFjY291bnR9LSR7dGFyZ2V0LnJlZ2lvbn1cImAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICpcbiAgICogV2F0Y2ggdGFza3NcbiAgICpcbiAgICogLSBDb25maWd1cmUgd2F0Y2ggdGFzayB0byB1c2UgdGhlIGJyYW5jaCBuYW1lXG4gICAqIC0gY29uZmlndXJlIHdhdGNoIHRhc2sgdG8gdXNlIHRoZSBjb3JyZWN0IHN5bnRoIG91dHB1dCBsb2NhdGlvbi5cbiAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSBjb25maWd1cmVXYXRjaFRhc2sgPSAodGFyZ2V0OiBBd3NEZXBsb3ltZW50VGFyZ2V0KTogdm9pZCA9PiB7XG4gICAgaWYgKHRhcmdldC5sb2NhbERlcGxveW1lbnQpIHtcbiAgICAgIGNvbnN0IHRhc2tOYW1lID0gW1wid2F0Y2hcIiwgdGFyZ2V0LmFjY291bnQsIHRhcmdldC5yZWdpb25dLmpvaW4oXCI6XCIpO1xuICAgICAgY29uc3Qgd2F0Y2hUYXNrID0gdGhpcy5wcm9qZWN0LnRhc2tzLmFkZFRhc2sodGFza05hbWUsIHsgZW52OiB0aGlzLmVudiB9KTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBzeW50aCBmaXJzdFxuICAgICAgY29uc3Qgc3ludGhTaWxlbnQgPSB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZChcInN5bnRoOnNpbGVudFwiKTtcbiAgICAgIGlmIChzeW50aFNpbGVudCkge1xuICAgICAgICB3YXRjaFRhc2suc3Bhd24oc3ludGhTaWxlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBkbyBhIG5vcm1hbCBkZXBsb3lcbiAgICAgIHdhdGNoVGFzay5leGVjKFxuICAgICAgICBgY2RrIGRlcGxveSAtLWxvb2t1cHM9ZmFsc2UgLS1yZXF1aXJlLWFwcHJvdmFsPW5ldmVyIC0tcHJvZmlsZT0ke3RhcmdldC5sb2NhbERlcGxveW1lbnRDb25maWc/LnByb2ZpbGV9IC0tYXBwPSR7dGhpcy5jZGtPdXR9IFwiKi0ke3RhcmdldC5hY2NvdW50fS0ke3RhcmdldC5yZWdpb259XCJgLFxuICAgICAgKTtcblxuICAgICAgLy8gd2F0Y2ggZm9yIGNoYW5nZXMgYW5kIGxvZyBvdXRwdXRcbiAgICAgIHdhdGNoVGFzay5leGVjKFxuICAgICAgICBgY2RrIHdhdGNoIC0tbG9va3Vwcz1mYWxzZSAtLXJlcXVpcmUtYXBwcm92YWw9bmV2ZXIgLS1ob3Rzd2FwIC0tcHJvZmlsZT0ke3RhcmdldC5sb2NhbERlcGxveW1lbnRDb25maWc/LnByb2ZpbGV9IFwiKi0ke3RhcmdldC5hY2NvdW50fS0ke3RhcmdldC5yZWdpb259XCJgLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG4iXX0=
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWRlcGxveW1lbnQtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hd3MtZGVwbG95bWVudC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQTJDO0FBQzNDLG1DQUFtQztBQUVuQyxtRUFBK0U7QUFFL0U7Ozs7Ozs7OztnRkFTZ0Y7QUFFaEY7O0VBRUU7QUFFRixNQUFhLG1CQUFvQixTQUFRLGtCQUFTO0lBQ3pDLE1BQU0sQ0FBQyxFQUFFLENBQ2QsT0FBNEI7UUFFNUIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFZLEVBQTRCLEVBQUUsQ0FDM0QsQ0FBQyxZQUFZLG1CQUFtQixDQUFDO1FBQ25DLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQTJCRCxZQUFZLE9BQTRCO1FBQ3RDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQU5qQjs7V0FFRztRQUNhLHlCQUFvQixHQUErQixFQUFFLENBQUM7UUFpSHRFOzs7Ozs7O3NGQU84RTtRQUV0RSx1QkFBa0IsR0FBRyxHQUFTLEVBQUU7WUFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSztpQkFDZixPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNqQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRWpFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsTUFBTSxF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QU0sQ0FBQyxpQkFBaUIsS0FBSyx1Q0FBZSxDQUFDLEtBQUs7WUFDbEQsTUFBTSxDQUFDLGVBQWUsQ0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUNyQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLGlCQUFpQixLQUFLLHVDQUFlLENBQUMsR0FBRyxDQUM3RCxDQUFDO0lBQ0osQ0FBQztJQUNELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQ3JDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDVCxNQUFNLENBQUMsaUJBQWlCLEtBQUssdUNBQWUsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksQ0FDMUUsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQ3JDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDVCxNQUFNLENBQUMsaUJBQWlCLEtBQUssdUNBQWUsQ0FBQyxHQUFHO1lBQ2hELE1BQU0sQ0FBQyxlQUFlLENBQ3pCLENBQUM7SUFDSixDQUFDO0NBc0JGO0FBcktELGtEQXFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4sIHJlbGF0aXZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gXCJwcm9qZW4vbGliL2F3c2Nka1wiO1xuaW1wb3J0IHsgQVdTX0RFUExPWV9UWVBFLCBBd3NEZXBsb3ltZW50VGFyZ2V0IH0gZnJvbSBcIi4vYXdzLWRlcGxveW1lbnQtdGFyZ2V0XCI7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKlxuICogQVdTIERlcGxveW1lbnQgQ29uZmlndXJhdGlvblxuICpcbiAqIFRoaXMgY29tcG9uZW50IGFsbG93cyBjb25maWd1cmF0aW9uIG9mIG11bHRpcGxlIEFXUyBkZXBsb3ltZW50XG4gKiB0YXJnZXRzLCBlYWNoIHdpdGggaXRzIG93biBhY2NvdW50LCByZWdpb24sIGFuZCBkZXBsb3ltZW50IHR5cGVcbiAqIChkZXYsIHN0YWdlLCBwcm9kKS4gSXQgc3VwcG9ydHMgYm90aCBsb2NhbCBhbmQgQ0kgZGVwbG95bWVudHMsXG4gKiB3aXRoIGN1c3RvbWl6YWJsZSBzZXR0aW5ncyBmb3IgZWFjaCB0YXJnZXQuXG4gKlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLypcbmV4cG9ydCBpbnRlcmZhY2UgQXdzRGVwbG95bWVudENvbmZpZ09wdGlvbnMge31cbiovXG5cbmV4cG9ydCBjbGFzcyBBd3NEZXBsb3ltZW50Q29uZmlnIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHVibGljIHN0YXRpYyBvZihcbiAgICBwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwLFxuICApOiBBd3NEZXBsb3ltZW50Q29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc0RlZmluZWQgPSAoYzogQ29tcG9uZW50KTogYyBpcyBBd3NEZXBsb3ltZW50Q29uZmlnID0+XG4gICAgICBjIGluc3RhbmNlb2YgQXdzRGVwbG95bWVudENvbmZpZztcbiAgICByZXR1cm4gcHJvamVjdC5jb21wb25lbnRzLmZpbmQoaXNEZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5qZWN0ZWQgaW50byBhbGwgdGFza3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZnJvbSB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9qZWN0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmcm9tIHRoZSBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvb3RQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgQ0RLIHN5bnRoZXNpcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGtPdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXJyYXkgb2YgdGFyZ2V0cyBmb3IgZGVwbG95bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhd3NEZXBsb3ltZW50VGFyZ2V0czogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBBd3NDZGtUeXBlU2NyaXB0QXBwKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21tb24gdmFyaWFibGVzIHVzZWQgYWNyb3NzIHRhc2tzLlxuICAgICAqL1xuICAgIHRoaXMuZW52ID0geyBHSVRfQlJBTkNIOiBcIiQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudClcIiB9O1xuICAgIHRoaXMucHJvamVjdFBhdGggPSByZWxhdGl2ZShwcm9qZWN0LnJvb3Qub3V0ZGlyLCBwcm9qZWN0Lm91dGRpcik7XG4gICAgdGhpcy5yb290UGF0aCA9IHJlbGF0aXZlKHByb2plY3Qub3V0ZGlyLCBwcm9qZWN0LnJvb3Qub3V0ZGlyKTtcbiAgICB0aGlzLmNka091dCA9IGpvaW4odGhpcy5yb290UGF0aCwgXCJkaXN0XCIsIHRoaXMucHJvamVjdFBhdGgsIFwiY2RrLm91dFwiKTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHNvbWUgdGFza3Mgd2Ugd2lsbCByZWJ1aWxkIGJlbG93LlxuICAgICAqL1xuICAgIFtcImRlcGxveVwiLCBcIndhdGNoXCJdLmZvckVhY2goKHRhc2tOYW1lKSA9PiB7XG4gICAgICBjb25zdCB0YXNrID0gcHJvamVjdC50YXNrcy50cnlGaW5kKHRhc2tOYW1lKTtcbiAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgIHRhc2sucmVzZXQoKTtcbiAgICAgICAgdGFzay5zYXkoXG4gICAgICAgICAgXCJHZW5lcmljIHRhc2sgaXMgZGlzYWJsZWQuIFBsZWFzZSB1c2UgdGhlIHNwZWNpZmljIHRhc2sgZm9yIHlvdXIgZGVwbG95bWVudCB0YXJnZXQuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZWRlZmluZSBTeW50aCBoZXJlXG4gICAgICpcbiAgICAgKiBEZXBsb3kgYW5kIHdhdGNoIGdldCByZWNvbmZpZ3VyZWQgcGVyIGRlcGxveW1lbnQgdGFyZ2V0LlxuICAgICAqIEBzZWUgYWRkRGVwbG95bWVudFRhcmdldCgpXG4gICAgICovXG4gICAgdGhpcy5jb25maWd1cmVTeW50aFRhc2soKTtcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKlxuICAgKiBUYXJnZXQgZmlsdGVyIGhlbHBlcnNcbiAgICpcbiAgICogUmV0dXJuIHZhcmlvdXMgdGFyZ2V0cyBmb3IgZGVwbG95bWVudCBzY3JpcHRzIHRvIHVzZS5cbiAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEFsbCBwcm9kdWN0aW9uIGRlcGxveW1lbnQgdGFyZ2V0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvZFRhcmdldHMoKTogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4ge1xuICAgIHJldHVybiB0aGlzLmF3c0RlcGxveW1lbnRUYXJnZXRzLmZpbHRlcihcbiAgICAgICh0YXJnZXQpID0+IHRhcmdldC5hd3NEZXBsb3ltZW50VHlwZSA9PT0gQVdTX0RFUExPWV9UWVBFLlBST0QsXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHByb2RUYXJnZXRzRm9yQ0koKTogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4ge1xuICAgIHJldHVybiB0aGlzLmF3c0RlcGxveW1lbnRUYXJnZXRzLmZpbHRlcihcbiAgICAgICh0YXJnZXQpID0+XG4gICAgICAgIHRhcmdldC5hd3NEZXBsb3ltZW50VHlwZSA9PT0gQVdTX0RFUExPWV9UWVBFLlBST0QgJiZcbiAgICAgICAgdGFyZ2V0LmNpRGVwbG95bWVudCxcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgcHJvZFRhcmdldHNGb3JMb2NhbCgpOiBBcnJheTxBd3NEZXBsb3ltZW50VGFyZ2V0PiB7XG4gICAgcmV0dXJuIHRoaXMuYXdzRGVwbG95bWVudFRhcmdldHMuZmlsdGVyKFxuICAgICAgKHRhcmdldCkgPT5cbiAgICAgICAgdGFyZ2V0LmF3c0RlcGxveW1lbnRUeXBlID09PSBBV1NfREVQTE9ZX1RZUEUuUFJPRCAmJlxuICAgICAgICB0YXJnZXQubG9jYWxEZXBsb3ltZW50LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMgQWxsIHN0YWdlIGRlcGxveW1lbnQgdGFyZ2V0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhZ2VUYXJnZXRzKCk6IEFycmF5PEF3c0RlcGxveW1lbnRUYXJnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5hd3NEZXBsb3ltZW50VGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0KSA9PiB0YXJnZXQuYXdzRGVwbG95bWVudFR5cGUgPT09IEFXU19ERVBMT1lfVFlQRS5TVEFHRSxcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgc3RhZ2VUYXJnZXRzRm9yQ0koKTogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4ge1xuICAgIHJldHVybiB0aGlzLmF3c0RlcGxveW1lbnRUYXJnZXRzLmZpbHRlcihcbiAgICAgICh0YXJnZXQpID0+XG4gICAgICAgIHRhcmdldC5hd3NEZXBsb3ltZW50VHlwZSA9PT0gQVdTX0RFUExPWV9UWVBFLlNUQUdFICYmXG4gICAgICAgIHRhcmdldC5jaURlcGxveW1lbnQsXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHN0YWdlVGFyZ2V0c0ZvckxvY2FsKCk6IEFycmF5PEF3c0RlcGxveW1lbnRUYXJnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5hd3NEZXBsb3ltZW50VGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0KSA9PlxuICAgICAgICB0YXJnZXQuYXdzRGVwbG95bWVudFR5cGUgPT09IEFXU19ERVBMT1lfVFlQRS5TVEFHRSAmJlxuICAgICAgICB0YXJnZXQubG9jYWxEZXBsb3ltZW50LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMgQWxsIGRldiBkZXBsb3ltZW50IHRhcmdldHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRldlRhcmdldHMoKTogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD4ge1xuICAgIHJldHVybiB0aGlzLmF3c0RlcGxveW1lbnRUYXJnZXRzLmZpbHRlcihcbiAgICAgICh0YXJnZXQpID0+IHRhcmdldC5hd3NEZXBsb3ltZW50VHlwZSA9PT0gQVdTX0RFUExPWV9UWVBFLkRFVixcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgZGV2VGFyZ2V0c0ZvckNJKCk6IEFycmF5PEF3c0RlcGxveW1lbnRUYXJnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5hd3NEZXBsb3ltZW50VGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0KSA9PlxuICAgICAgICB0YXJnZXQuYXdzRGVwbG95bWVudFR5cGUgPT09IEFXU19ERVBMT1lfVFlQRS5ERVYgJiYgdGFyZ2V0LmNpRGVwbG95bWVudCxcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgZGV2VGFyZ2V0c0ZvckxvY2FsKCk6IEFycmF5PEF3c0RlcGxveW1lbnRUYXJnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5hd3NEZXBsb3ltZW50VGFyZ2V0cy5maWx0ZXIoXG4gICAgICAodGFyZ2V0KSA9PlxuICAgICAgICB0YXJnZXQuYXdzRGVwbG95bWVudFR5cGUgPT09IEFXU19ERVBMT1lfVFlQRS5ERVYgJiZcbiAgICAgICAgdGFyZ2V0LmxvY2FsRGVwbG95bWVudCxcbiAgICApO1xuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqXG4gICAqIFN5bnRoIFRhc2tzXG4gICAqXG4gICAqIC0gQ29uZmlndXJlIHN5bnRoIHRhc2sgdG8gdXNlIHRoZSBicmFuY2ggbmFtZVxuICAgKiAtIENoYW5nZSB0aGUgb3V0cHV0IGxvY2F0aW9uIGZvciBlYXNpZXIgd29ya2Zsb3dzLlxuICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNvbmZpZ3VyZVN5bnRoVGFzayA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZChcInN5bnRoXCIpPy5yZXNldChgcm0gLXJmICR7dGhpcy5jZGtPdXR9YCk7XG4gICAgdGhpcy5wcm9qZWN0LnRhc2tzXG4gICAgICAudHJ5RmluZChcInN5bnRoXCIpXG4gICAgICA/LmV4ZWMoYGNkayBzeW50aCAtLW91dHB1dCAke3RoaXMuY2RrT3V0fWAsIHsgZW52OiB0aGlzLmVudiB9KTtcblxuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKFwic3ludGg6c2lsZW50XCIpPy5yZXNldChgcm0gLXJmICR7dGhpcy5jZGtPdXR9YCk7XG4gICAgdGhpcy5wcm9qZWN0LnRhc2tzXG4gICAgICAudHJ5RmluZChcInN5bnRoOnNpbGVudFwiKVxuICAgICAgPy5leGVjKGBjZGsgc3ludGggLXEgLS1vdXRwdXQgJHt0aGlzLmNka091dH1gLCB7IGVudjogdGhpcy5lbnYgfSk7XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { Component } from "projen";
|
|
2
|
+
import { AwsCdkTypeScriptApp } from "projen/lib/awscdk";
|
|
3
|
+
import { AwsDeploymentConfig } from "./aws-deployment-config";
|
|
4
|
+
import { GitBranch } from "../git";
|
|
5
|
+
/*******************************************************************************
|
|
6
|
+
*
|
|
7
|
+
* AWS Deployment Configuration
|
|
8
|
+
*
|
|
9
|
+
* A single deployment target that CDK applications can be deployed into.
|
|
10
|
+
*
|
|
11
|
+
******************************************************************************/
|
|
12
|
+
export declare const AWS_DEPLOY_TYPE: {
|
|
13
|
+
/**
|
|
14
|
+
* Development environment, typically used for testing and development.
|
|
15
|
+
*/
|
|
16
|
+
readonly DEV: "dev";
|
|
17
|
+
/**
|
|
18
|
+
* Staging environment, used for pre-production testing.
|
|
19
|
+
*/
|
|
20
|
+
readonly STAGE: "stage";
|
|
21
|
+
/**
|
|
22
|
+
* Production environment, used for live deployments.
|
|
23
|
+
*/
|
|
24
|
+
readonly PROD: "prod";
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Above const as a type.
|
|
28
|
+
*/
|
|
29
|
+
export type AwsDeploymentType = (typeof AWS_DEPLOY_TYPE)[keyof typeof AWS_DEPLOY_TYPE];
|
|
30
|
+
/**
|
|
31
|
+
* Represents the configuration for local deployment in AWS.
|
|
32
|
+
*/
|
|
33
|
+
export interface AwsLocalDeploymentConfig {
|
|
34
|
+
/**
|
|
35
|
+
* The AWS profile (in ~/.aws/config) to use for local deployment.
|
|
36
|
+
*
|
|
37
|
+
* @default generated dynamically based role name, account and region
|
|
38
|
+
*/
|
|
39
|
+
readonly profile?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Named Role used to conduct local deployments.
|
|
42
|
+
*
|
|
43
|
+
* @default "administratoraccess"
|
|
44
|
+
*/
|
|
45
|
+
readonly roleName?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface CiDeploymentConfig {
|
|
48
|
+
/**
|
|
49
|
+
* The OIDC IAM Role to assume for CI deployments.
|
|
50
|
+
*/
|
|
51
|
+
readonly roleArn: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Represents a deployment target in AWS, including account and region, and
|
|
55
|
+
* branches allowed to deploy to this target.
|
|
56
|
+
*/
|
|
57
|
+
export interface AwsDeploymentTargetOptions {
|
|
58
|
+
/**
|
|
59
|
+
* The account name for the deployment target.
|
|
60
|
+
*/
|
|
61
|
+
readonly account: string;
|
|
62
|
+
/**
|
|
63
|
+
* The AWS region for the deployment target.
|
|
64
|
+
*/
|
|
65
|
+
readonly region: string;
|
|
66
|
+
/**
|
|
67
|
+
* AWS deployment type, such as dev, stage, or prod.
|
|
68
|
+
*
|
|
69
|
+
* @default 'dev'
|
|
70
|
+
*/
|
|
71
|
+
readonly awsDeploymentType?: AwsDeploymentType;
|
|
72
|
+
/**
|
|
73
|
+
* The AWS profile to use for this deployment target.
|
|
74
|
+
*
|
|
75
|
+
* @default ['main'] when prod release type, ['feature/*'] when dev type
|
|
76
|
+
*/
|
|
77
|
+
readonly branches?: Array<GitBranch>;
|
|
78
|
+
/**
|
|
79
|
+
* Can this deployment target be used for local development?
|
|
80
|
+
*
|
|
81
|
+
* @default true for dev environments, false for prod environments
|
|
82
|
+
*/
|
|
83
|
+
readonly localDeployment?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Configuration when deploying to this target locally.
|
|
86
|
+
*/
|
|
87
|
+
readonly localDeploymentConfig?: AwsLocalDeploymentConfig;
|
|
88
|
+
/**
|
|
89
|
+
* Can this deployment target be used in CI deployments?
|
|
90
|
+
*
|
|
91
|
+
* @default false
|
|
92
|
+
*/
|
|
93
|
+
readonly ciDeployment?: boolean;
|
|
94
|
+
readonly ciDeploymentConfig?: CiDeploymentConfig;
|
|
95
|
+
}
|
|
96
|
+
export declare class AwsDeploymentTarget extends Component {
|
|
97
|
+
/**
|
|
98
|
+
* Static method to discovert targets in a project.
|
|
99
|
+
*/
|
|
100
|
+
static of(project: AwsCdkTypeScriptApp): Array<AwsDeploymentTarget> | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* The account name for the deployment target.
|
|
103
|
+
*/
|
|
104
|
+
account: string;
|
|
105
|
+
/**
|
|
106
|
+
* The AWS region for the deployment target.
|
|
107
|
+
*/
|
|
108
|
+
region: string;
|
|
109
|
+
/**'
|
|
110
|
+
* AWS deployment type, such as dev, stage, or prod.
|
|
111
|
+
*
|
|
112
|
+
* @default 'dev'
|
|
113
|
+
*/
|
|
114
|
+
awsDeploymentType?: AwsDeploymentType;
|
|
115
|
+
/**
|
|
116
|
+
* The AWS profile to use for this deployment target.
|
|
117
|
+
*
|
|
118
|
+
* @default ['main'] when prod release type, ['feature/*'] when dev type
|
|
119
|
+
*/
|
|
120
|
+
branches: Array<GitBranch>;
|
|
121
|
+
/**
|
|
122
|
+
* Can this deployment target be used for local development?
|
|
123
|
+
*
|
|
124
|
+
* @default true for dev environments, false for prod environments
|
|
125
|
+
*/
|
|
126
|
+
localDeployment?: boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Configuration when deploying to this target locally.
|
|
129
|
+
*/
|
|
130
|
+
localDeploymentConfig?: AwsLocalDeploymentConfig;
|
|
131
|
+
/**
|
|
132
|
+
* Can this deployment target be used in CI deployments?
|
|
133
|
+
*
|
|
134
|
+
* @default false
|
|
135
|
+
*/
|
|
136
|
+
ciDeployment?: boolean;
|
|
137
|
+
ciDeploymentConfig?: Required<CiDeploymentConfig>;
|
|
138
|
+
/**
|
|
139
|
+
* Configuration for the CDK output directory for this deployment target.
|
|
140
|
+
*/
|
|
141
|
+
awsDeploymentConfig: AwsDeploymentConfig;
|
|
142
|
+
constructor(project: AwsCdkTypeScriptApp, options: AwsDeploymentTargetOptions);
|
|
143
|
+
/*****************************************************************************
|
|
144
|
+
*
|
|
145
|
+
* Deploy Tasks
|
|
146
|
+
*
|
|
147
|
+
* - If local deploy, add a deploy task.
|
|
148
|
+
*
|
|
149
|
+
****************************************************************************/
|
|
150
|
+
private configureDeployTask;
|
|
151
|
+
/*****************************************************************************
|
|
152
|
+
*
|
|
153
|
+
* Watch tasks
|
|
154
|
+
*
|
|
155
|
+
* - Configure watch task to use the branch name
|
|
156
|
+
* - configure watch task to use the correct synth output location.
|
|
157
|
+
*
|
|
158
|
+
****************************************************************************/
|
|
159
|
+
private configureWatchTask;
|
|
160
|
+
}
|