@codedrifters/configulator 0.0.0 → 0.0.1
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/LICENSE +1 -1
- package/README.md +761 -1
- package/lib/aws/aws-deployment-config.d.ts +45 -108
- package/lib/aws/aws-deployment-config.js +69 -100
- package/lib/aws/aws-deployment-target.d.ts +210 -0
- package/lib/aws/aws-deployment-target.js +202 -0
- package/lib/aws/index.d.ts +1 -1
- package/lib/aws/index.js +2 -2
- package/lib/index.d.ts +9 -0
- package/lib/index.js +26 -0
- package/lib/jsii/index.d.ts +1 -0
- package/lib/jsii/index.js +18 -0
- package/lib/jsii/jsii-faker.d.ts +47 -0
- package/lib/jsii/jsii-faker.js +103 -0
- package/lib/pnpm/pnpm-workspace.d.ts +240 -1
- package/lib/pnpm/pnpm-workspace.js +155 -15
- package/lib/projects/index.d.ts +2 -0
- package/lib/projects/index.js +19 -0
- package/lib/projects/monorepo-project.d.ts +50 -0
- package/lib/projects/monorepo-project.js +203 -0
- package/lib/projects/typescript-project.d.ts +4 -0
- package/lib/projects/typescript-project.js +150 -0
- package/lib/turbo/turbo-repo.d.ts +116 -9
- package/lib/turbo/turbo-repo.js +107 -20
- package/lib/versions.d.ts +19 -7
- package/lib/versions.js +20 -8
- package/lib/vscode/vscode.js +2 -1
- package/lib/workflows/aws-deploy-workflow.d.ts +84 -0
- package/lib/workflows/aws-deploy-workflow.js +312 -0
- package/lib/workflows/index.d.ts +1 -2
- package/lib/workflows/index.js +2 -3
- package/package.json +21 -20
- 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
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AwsDeployWorkflow = exports.PROD_DEPLOY_NAME = void 0;
|
|
4
|
+
const projen_1 = require("projen");
|
|
5
|
+
const build_1 = require("projen/lib/build");
|
|
6
|
+
const github_1 = require("projen/lib/github");
|
|
7
|
+
const workflows_model_1 = require("projen/lib/github/workflows-model");
|
|
8
|
+
const aws_1 = require("../aws");
|
|
9
|
+
const aws_deployment_target_1 = require("../aws/aws-deployment-target");
|
|
10
|
+
const projects_1 = require("../projects");
|
|
11
|
+
const turbo_1 = require("../turbo");
|
|
12
|
+
const versions_1 = require("../versions");
|
|
13
|
+
exports.PROD_DEPLOY_NAME = "prod-deploy";
|
|
14
|
+
class AwsDeployWorkflow extends projen_1.Component {
|
|
15
|
+
static of(project, buildWorkflow) {
|
|
16
|
+
const isDefined = (c) => c instanceof AwsDeployWorkflow && c.buildWorkflow === buildWorkflow;
|
|
17
|
+
return project.components.find(isDefined);
|
|
18
|
+
}
|
|
19
|
+
constructor(project, options = {}) {
|
|
20
|
+
super(project);
|
|
21
|
+
this.project = project;
|
|
22
|
+
/**
|
|
23
|
+
* AWS environment type, such as primary or secondary.
|
|
24
|
+
*
|
|
25
|
+
* @default 'primary' (this is the only type supported currently)
|
|
26
|
+
*/
|
|
27
|
+
this.awsEnvironmentType = aws_deployment_target_1.AWS_ENVIRONMENT_TYPE.PRIMARY;
|
|
28
|
+
this.setupNode = () => {
|
|
29
|
+
return [
|
|
30
|
+
{
|
|
31
|
+
name: "Setup Node",
|
|
32
|
+
uses: "actions/setup-node@v4",
|
|
33
|
+
with: {
|
|
34
|
+
["node-version"]: versions_1.VERSION.NODE_WORKFLOWS,
|
|
35
|
+
},
|
|
36
|
+
// occasionally this step fails due to internal issues at github
|
|
37
|
+
timeoutMinutes: 1,
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
};
|
|
41
|
+
this.setupPnpm = () => {
|
|
42
|
+
return [
|
|
43
|
+
{
|
|
44
|
+
name: "Setup PNPM",
|
|
45
|
+
uses: "pnpm/action-setup@v3",
|
|
46
|
+
with: {
|
|
47
|
+
version: versions_1.VERSION.PNPM_VERSION,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Builds a GitHub Actions condition string that checks if the current branch
|
|
54
|
+
* matches any of the provided branch patterns.
|
|
55
|
+
*
|
|
56
|
+
* Handles both exact matches (e.g., "main") and glob patterns (e.g., "feature/*").
|
|
57
|
+
* Also allows workflow_dispatch (manual runs) to proceed.
|
|
58
|
+
*
|
|
59
|
+
* @param branches Array of GitBranch objects with branch patterns
|
|
60
|
+
* @returns Condition string or empty string if no branches provided
|
|
61
|
+
*/
|
|
62
|
+
this.buildBranchFilterCondition = (branches) => {
|
|
63
|
+
if (!branches || branches.length === 0) {
|
|
64
|
+
return "";
|
|
65
|
+
}
|
|
66
|
+
const conditions = [];
|
|
67
|
+
// Always allow workflow_dispatch (manual workflow runs)
|
|
68
|
+
conditions.push("github.event_name == 'workflow_dispatch'");
|
|
69
|
+
for (const branch of branches) {
|
|
70
|
+
const branchPattern = branch.branch;
|
|
71
|
+
// Handle glob patterns (e.g., "feature/*")
|
|
72
|
+
if (branchPattern.includes("*")) {
|
|
73
|
+
// Replace * with proper startsWith check
|
|
74
|
+
const prefix = branchPattern.replace(/\*.*$/, "");
|
|
75
|
+
conditions.push(`startsWith(github.ref, 'refs/heads/${prefix}')`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Exact match
|
|
79
|
+
conditions.push(`github.ref == 'refs/heads/${branchPattern}'`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Combine all conditions with OR
|
|
83
|
+
return conditions.join(" || ");
|
|
84
|
+
};
|
|
85
|
+
this.deploySteps = (target) => {
|
|
86
|
+
const { awsStageType, awsEnvironmentType, account, region, ciDeploymentConfig, awsDeploymentConfig, } = target;
|
|
87
|
+
const { roleArn, stackPattern } = ciDeploymentConfig ?? {};
|
|
88
|
+
const { rootCdkOut } = awsDeploymentConfig;
|
|
89
|
+
return [
|
|
90
|
+
...this.setupPnpm(),
|
|
91
|
+
...this.setupNode(),
|
|
92
|
+
/**
|
|
93
|
+
* Install CDK
|
|
94
|
+
*/
|
|
95
|
+
{
|
|
96
|
+
name: "Install CDK",
|
|
97
|
+
run: "pnpm add aws-cdk",
|
|
98
|
+
},
|
|
99
|
+
/**
|
|
100
|
+
* Configure AWS creds.
|
|
101
|
+
*/
|
|
102
|
+
{
|
|
103
|
+
name: `AWS Creds ${awsStageType}/${awsEnvironmentType}/${account}/${region}`,
|
|
104
|
+
uses: "aws-actions/configure-aws-credentials@v4",
|
|
105
|
+
with: {
|
|
106
|
+
"role-to-assume": roleArn,
|
|
107
|
+
"aws-region": region,
|
|
108
|
+
"role-duration-seconds": 900, // 15 minutes
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
/**
|
|
112
|
+
* Run CDK Deploy
|
|
113
|
+
*/
|
|
114
|
+
{
|
|
115
|
+
name: `Deploy ${awsStageType}/${awsEnvironmentType}/${account}/${region}`,
|
|
116
|
+
run: `pnpm dlx aws-cdk deploy --no-rollback --require-approval=never --app=${rootCdkOut} "${stackPattern}"`,
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
};
|
|
120
|
+
/***************************************************************************
|
|
121
|
+
*
|
|
122
|
+
* Root project check
|
|
123
|
+
*
|
|
124
|
+
* Detect the root project and ensure it's of type MonorepoProject.
|
|
125
|
+
*
|
|
126
|
+
**************************************************************************/
|
|
127
|
+
if (!(project.root instanceof projects_1.MonorepoProject)) {
|
|
128
|
+
throw new Error("AwsDeployWorkflow requires the root project to be a MonorepoProject");
|
|
129
|
+
}
|
|
130
|
+
this.rootProject = project.root;
|
|
131
|
+
/***************************************************************************
|
|
132
|
+
*
|
|
133
|
+
* GitHub Check
|
|
134
|
+
*
|
|
135
|
+
* Make sure github config is active in the project. This is to ensure all
|
|
136
|
+
* workflows will be output properly during synth.
|
|
137
|
+
*
|
|
138
|
+
**************************************************************************/
|
|
139
|
+
const github = github_1.GitHub.of(this.rootProject);
|
|
140
|
+
if (!github) {
|
|
141
|
+
throw new Error("AwsDeployWorkflow requires a GitHub component in the root project");
|
|
142
|
+
}
|
|
143
|
+
/***************************************************************************
|
|
144
|
+
*
|
|
145
|
+
* TurboRepo Check
|
|
146
|
+
*
|
|
147
|
+
* If turbo is enabled, we may need the options later in this file.
|
|
148
|
+
*
|
|
149
|
+
**************************************************************************/
|
|
150
|
+
const turbo = turbo_1.TurboRepo.of(this.rootProject);
|
|
151
|
+
const buildWorkflowOptions = turbo?.remoteCacheOptions
|
|
152
|
+
? turbo_1.TurboRepo.buildWorkflowOptions(turbo.remoteCacheOptions)
|
|
153
|
+
: {};
|
|
154
|
+
/***************************************************************************
|
|
155
|
+
*
|
|
156
|
+
* Workflow Deploy Type
|
|
157
|
+
*
|
|
158
|
+
* What type of environments are we deploying into? We'll default to dev to
|
|
159
|
+
* be safe.
|
|
160
|
+
*
|
|
161
|
+
**************************************************************************/
|
|
162
|
+
this.awsStageType = options.awsStageType ?? aws_deployment_target_1.AWS_STAGE_TYPE.DEV;
|
|
163
|
+
/***************************************************************************
|
|
164
|
+
*
|
|
165
|
+
* Workflow Deploy Targets
|
|
166
|
+
*
|
|
167
|
+
* Use provided targets or discover them based on the deploy type. Only
|
|
168
|
+
* include targets that are marked for CI/CD.
|
|
169
|
+
*
|
|
170
|
+
**************************************************************************/
|
|
171
|
+
this.awsDeploymentTargets =
|
|
172
|
+
options.awsDeploymentTargets ??
|
|
173
|
+
aws_1.AwsDeploymentConfig.of(project)?.awsDeploymentTargets.filter((target) => target.awsStageType === this.awsStageType && target.ciDeployment) ??
|
|
174
|
+
[];
|
|
175
|
+
this.deployAfterTargets = options.deployAfterTargets ?? [];
|
|
176
|
+
/***************************************************************************
|
|
177
|
+
*
|
|
178
|
+
* Build Workflow Options
|
|
179
|
+
*
|
|
180
|
+
* Can't use the options if an existing workflow was passed in.
|
|
181
|
+
*
|
|
182
|
+
**************************************************************************/
|
|
183
|
+
if (options.buildWorkflow && options.buildWorkflowOptions) {
|
|
184
|
+
throw new Error("Cannot provide both buildWorkflow and buildWorkflowOptions");
|
|
185
|
+
}
|
|
186
|
+
this.externalWorkflow = !!options.buildWorkflow;
|
|
187
|
+
/***************************************************************************
|
|
188
|
+
*
|
|
189
|
+
* Build Workflow
|
|
190
|
+
*
|
|
191
|
+
* Create a workflow either based on input or from scratch.
|
|
192
|
+
*
|
|
193
|
+
**************************************************************************/
|
|
194
|
+
this.buildWorkflow =
|
|
195
|
+
options.buildWorkflow ??
|
|
196
|
+
new build_1.BuildWorkflow(this.rootProject, {
|
|
197
|
+
/**
|
|
198
|
+
* Name based on project and environment.
|
|
199
|
+
*/
|
|
200
|
+
name: options.buildWorkflowOptions?.name ??
|
|
201
|
+
[
|
|
202
|
+
"deploy",
|
|
203
|
+
project.name,
|
|
204
|
+
this.awsStageType,
|
|
205
|
+
this.awsEnvironmentType,
|
|
206
|
+
].join("-"),
|
|
207
|
+
/**
|
|
208
|
+
* Use the root projects build task.
|
|
209
|
+
*/
|
|
210
|
+
buildTask: this.rootProject.buildTask,
|
|
211
|
+
/**
|
|
212
|
+
* Use push triggers based n the branch config for each environment.
|
|
213
|
+
*/
|
|
214
|
+
workflowTriggers: {
|
|
215
|
+
push: {
|
|
216
|
+
branches: [
|
|
217
|
+
...this.awsDeploymentTargets.flatMap((t) => t.branches.map((b) => b.branch)),
|
|
218
|
+
],
|
|
219
|
+
},
|
|
220
|
+
workflowDispatch: {},
|
|
221
|
+
...options.buildWorkflowOptions?.workflowTriggers,
|
|
222
|
+
},
|
|
223
|
+
/**
|
|
224
|
+
* Never allow mutations for deploys. This should have been handled
|
|
225
|
+
* during build.
|
|
226
|
+
*/
|
|
227
|
+
mutableBuild: false,
|
|
228
|
+
/**
|
|
229
|
+
* Do this pre-merge of permissions and build steps
|
|
230
|
+
*/
|
|
231
|
+
...options.buildWorkflowOptions,
|
|
232
|
+
/**
|
|
233
|
+
* Some additional permissions may be required when turbo's involved.
|
|
234
|
+
*/
|
|
235
|
+
permissions: {
|
|
236
|
+
...options.buildWorkflowOptions?.permissions,
|
|
237
|
+
...buildWorkflowOptions?.permissions,
|
|
238
|
+
},
|
|
239
|
+
/**
|
|
240
|
+
* Assemble all pre-build steps
|
|
241
|
+
*/
|
|
242
|
+
preBuildSteps: [
|
|
243
|
+
...this.setupPnpm(),
|
|
244
|
+
...this.setupNode(),
|
|
245
|
+
{
|
|
246
|
+
name: "Install dependencies",
|
|
247
|
+
run: "pnpm i --no-frozen-lockfile",
|
|
248
|
+
},
|
|
249
|
+
...(options.buildWorkflowOptions?.preBuildSteps ?? []),
|
|
250
|
+
...(buildWorkflowOptions?.preBuildSteps ?? []),
|
|
251
|
+
],
|
|
252
|
+
});
|
|
253
|
+
/***************************************************************************
|
|
254
|
+
*
|
|
255
|
+
* Add Deployments to workflow
|
|
256
|
+
*
|
|
257
|
+
**************************************************************************/
|
|
258
|
+
const buildJobName = (target) => {
|
|
259
|
+
return [
|
|
260
|
+
target.awsStageType,
|
|
261
|
+
target.awsEnvironmentType,
|
|
262
|
+
"deploy",
|
|
263
|
+
target.project.name,
|
|
264
|
+
target.account,
|
|
265
|
+
target.region,
|
|
266
|
+
].join("-");
|
|
267
|
+
};
|
|
268
|
+
this.awsDeploymentTargets.forEach((target) => {
|
|
269
|
+
const deployJobName = buildJobName(target);
|
|
270
|
+
// Build the branch filter condition
|
|
271
|
+
const branchFilterCondition = this.buildBranchFilterCondition(target.branches);
|
|
272
|
+
// Combine with the existing build mutation check
|
|
273
|
+
const jobCondition = branchFilterCondition
|
|
274
|
+
? [
|
|
275
|
+
"${{ !needs.build.outputs.self_mutation_happened }}",
|
|
276
|
+
`(${branchFilterCondition})`,
|
|
277
|
+
].join(" && ")
|
|
278
|
+
: "${{ !needs.build.outputs.self_mutation_happened }}";
|
|
279
|
+
this.buildWorkflow.addPostBuildJob(deployJobName, {
|
|
280
|
+
name: `Deploy ${this.project.name} ${target.awsStageType}/${target.awsEnvironmentType}/${target.account}/${target.region}`,
|
|
281
|
+
needs: [
|
|
282
|
+
"build",
|
|
283
|
+
...this.deployAfterTargets.map((p) => {
|
|
284
|
+
return buildJobName(p);
|
|
285
|
+
}),
|
|
286
|
+
],
|
|
287
|
+
runsOn: ["ubuntu-latest"],
|
|
288
|
+
permissions: {
|
|
289
|
+
contents: workflows_model_1.JobPermission.READ,
|
|
290
|
+
idToken: workflows_model_1.JobPermission.WRITE,
|
|
291
|
+
},
|
|
292
|
+
concurrency: deployJobName,
|
|
293
|
+
if: jobCondition,
|
|
294
|
+
steps: [...this.deploySteps(target)],
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
preSynthesize() {
|
|
299
|
+
/**
|
|
300
|
+
* Ensure turbo is active when needed.
|
|
301
|
+
*/
|
|
302
|
+
if (!this.externalWorkflow && turbo_1.TurboRepo.of(this.rootProject)) {
|
|
303
|
+
this.buildWorkflow.addPostBuildSteps({
|
|
304
|
+
name: "Build Sub Projects",
|
|
305
|
+
run: `npx projen ${turbo_1.ROOT_CI_TASK_NAME}`,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
super.preSynthesize();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
exports.AwsDeployWorkflow = AwsDeployWorkflow;
|
|
312
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWRlcGxveS13b3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvd3MvYXdzLWRlcGxveS13b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFFbkMsNENBQXVFO0FBQ3ZFLDhDQUEyQztBQUMzQyx1RUFBMkU7QUFFM0UsZ0NBQTZDO0FBQzdDLHdFQU1zQztBQUV0QywwQ0FBOEM7QUFDOUMsb0NBQXdEO0FBQ3hELDBDQUFzQztBQUV6QixRQUFBLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQWtDOUMsTUFBYSxpQkFBa0IsU0FBUSxrQkFBUztJQUN2QyxNQUFNLENBQUMsRUFBRSxDQUNkLE9BQTRCLEVBQzVCLGFBQTRCO1FBRTVCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBWSxFQUEwQixFQUFFLENBQ3pELENBQUMsWUFBWSxpQkFBaUIsSUFBSSxDQUFDLENBQUMsYUFBYSxLQUFLLGFBQWEsQ0FBQztRQUN0RSxPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUF1Q0QsWUFDUyxPQUE0QixFQUNuQyxVQUFpQyxFQUFFO1FBRW5DLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUhSLFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBNUJyQzs7OztXQUlHO1FBQ0ksdUJBQWtCLEdBQXVCLDRDQUFvQixDQUFDLE9BQU8sQ0FBQztRQTJQdEUsY0FBUyxHQUFHLEdBQW1CLEVBQUU7WUFDdEMsT0FBTztnQkFDTDtvQkFDRSxJQUFJLEVBQUUsWUFBWTtvQkFDbEIsSUFBSSxFQUFFLHVCQUF1QjtvQkFDN0IsSUFBSSxFQUFFO3dCQUNKLENBQUMsY0FBYyxDQUFDLEVBQUUsa0JBQU8sQ0FBQyxjQUFjO3FCQUN6QztvQkFDRCxnRUFBZ0U7b0JBQ2hFLGNBQWMsRUFBRSxDQUFDO2lCQUNsQjthQUNGLENBQUM7UUFDSixDQUFDLENB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IjtcbmltcG9ydCB7IEF3c0Nka1R5cGVTY3JpcHRBcHAgfSBmcm9tIFwicHJvamVuL2xpYi9hd3NjZGtcIjtcbmltcG9ydCB7IEJ1aWxkV29ya2Zsb3csIEJ1aWxkV29ya2Zsb3dPcHRpb25zIH0gZnJvbSBcInByb2plbi9saWIvYnVpbGRcIjtcbmltcG9ydCB7IEdpdEh1YiB9IGZyb20gXCJwcm9qZW4vbGliL2dpdGh1YlwiO1xuaW1wb3J0IHsgSm9iUGVybWlzc2lvbiwgSm9iU3RlcCB9IGZyb20gXCJwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWxcIjtcbmltcG9ydCB7IFZhbHVlT2YgfSBmcm9tIFwidHlwZS1mZXN0XCI7XG5pbXBvcnQgeyBBd3NEZXBsb3ltZW50Q29uZmlnIH0gZnJvbSBcIi4uL2F3c1wiO1xuaW1wb3J0IHtcbiAgQVdTX0VOVklST05NRU5UX1RZUEUsXG4gIEFXU19TVEFHRV9UWVBFLFxuICBBd3NEZXBsb3ltZW50VGFyZ2V0LFxuICBBd3NFbnZpcm9ubWVudFR5cGUsXG4gIEF3c1N0YWdlVHlwZSxcbn0gZnJvbSBcIi4uL2F3cy9hd3MtZGVwbG95bWVudC10YXJnZXRcIjtcbmltcG9ydCB7IEdpdEJyYW5jaCB9IGZyb20gXCIuLi9naXRcIjtcbmltcG9ydCB7IE1vbm9yZXBvUHJvamVjdCB9IGZyb20gXCIuLi9wcm9qZWN0c1wiO1xuaW1wb3J0IHsgUk9PVF9DSV9UQVNLX05BTUUsIFR1cmJvUmVwbyB9IGZyb20gXCIuLi90dXJib1wiO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gXCIuLi92ZXJzaW9uc1wiO1xuXG5leHBvcnQgY29uc3QgUFJPRF9ERVBMT1lfTkFNRSA9IFwicHJvZC1kZXBsb3lcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lXb3JrZmxvd09wdGlvbnMge1xuICAvKipcbiAgICogV2hhdCB0eXBlIG9mIGRlcGxveSBpcyB0aGlzIHdvcmtmbG93IGZvcj9cbiAgICpcbiAgICogQGRlZmF1bHQgQVdTX1NUQUdFX1RZUEUuREVWXG4gICAqL1xuICByZWFkb25seSBhd3NTdGFnZVR5cGU/OiBWYWx1ZU9mPHR5cGVvZiBBV1NfU1RBR0VfVFlQRT47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgZmVlZCBhIGxpc3Qgb2YgdGFyZ2V0cyB0byBkZXBsb3kgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IGRpc2NvdmVycyBhbGwgdGFyZ2V0cyB1c2luZyBzdGFnZVR5cGVcbiAgICovXG4gIHJlYWRvbmx5IGF3c0RlcGxveW1lbnRUYXJnZXRzPzogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD47XG5cbiAgLyoqXG4gICAqIEV4aXN0aW5nIHdvcmtmbG93LCB1c2VmdWwgaWYgd2UncmUgdGFja2luZyBkZXBsb3ltZW50cyBvbnRvIGFuIGV4aXN0aW5nXG4gICAqIGJ1aWxkIHdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSBidWlsZFdvcmtmbG93PzogQnVpbGRXb3JrZmxvdztcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgdGhlIGJ1aWxkIHdvcmtmbG93LCBpZiBubyBidWlsZCB3b3JrZmxvdyBpcyBwcm92aWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkV29ya2Zsb3dPcHRpb25zPzogUGFydGlhbDxCdWlsZFdvcmtmbG93T3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIFByb2plY3RzIHRoYXQgc2hvdWxkIGNvbXBsZXRlIGRlcGxveW1lbnQgYmVmb3JlIHRoaXMgb25lIHN0YXJ0cy5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveUFmdGVyVGFyZ2V0cz86IEFycmF5PEF3c0RlcGxveW1lbnRUYXJnZXQ+O1xufVxuXG5leHBvcnQgY2xhc3MgQXdzRGVwbG95V29ya2Zsb3cgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwdWJsaWMgc3RhdGljIG9mKFxuICAgIHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHAsXG4gICAgYnVpbGRXb3JrZmxvdzogQnVpbGRXb3JrZmxvdyxcbiAgKTogQXdzRGVwbG95V29ya2Zsb3cgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzRGVmaW5lZCA9IChjOiBDb21wb25lbnQpOiBjIGlzIEF3c0RlcGxveVdvcmtmbG93ID0+XG4gICAgICBjIGluc3RhbmNlb2YgQXdzRGVwbG95V29ya2Zsb3cgJiYgYy5idWlsZFdvcmtmbG93ID09PSBidWlsZFdvcmtmbG93O1xuICAgIHJldHVybiBwcm9qZWN0LmNvbXBvbmVudHMuZmluZChpc0RlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByb290IHByb2plY3QgZm9yIHRoaXMgZGVwbG95IHdvcmtmbG93LiBNdXN0IGJlIGEgbW9ub3JlcG8gcHJvamVjdC5cbiAgICovXG4gIHByaXZhdGUgcm9vdFByb2plY3Q6IE1vbm9yZXBvUHJvamVjdDtcblxuICAvKipcbiAgICogV2hhdCB0eXBlIG9mIGRlcGxveSBpcyB0aGlzIHdvcmtmbG93IGZvcj9cbiAgICovXG4gIHB1YmxpYyBhd3NTdGFnZVR5cGU6IEF3c1N0YWdlVHlwZTtcblxuICAvKipcbiAgICogQVdTIGVudmlyb25tZW50IHR5cGUsIHN1Y2ggYXMgcHJpbWFyeSBvciBzZWNvbmRhcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwcmltYXJ5JyAodGhpcyBpcyB0aGUgb25seSB0eXBlIHN1cHBvcnRlZCBjdXJyZW50bHkpXG4gICAqL1xuICBwdWJsaWMgYXdzRW52aXJvbm1lbnRUeXBlOiBBd3NFbnZpcm9ubWVudFR5cGUgPSBBV1NfRU5WSVJPTk1FTlRfVFlQRS5QUklNQVJZO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiB0YXJnZXRzIHRvIGRlcGxveSB0by5cbiAgICovXG4gIHJlYWRvbmx5IGF3c0RlcGxveW1lbnRUYXJnZXRzOiBBcnJheTxBd3NEZXBsb3ltZW50VGFyZ2V0PjtcblxuICAvKipcbiAgICogSG9sZCB0aGUgZGVwbG95IHdvcmtmbG93IHNvIHdlIGNhbiBhZGQgdG8gaXQgaW4gcHJlU3ludGhcbiAgICovXG4gIHB1YmxpYyBidWlsZFdvcmtmbG93OiBCdWlsZFdvcmtmbG93O1xuXG4gIC8qKlxuICAgKiBXYXMgdGhpcyB3b3JrZmxvdyBjcmVhdGVkIGV4dGVybmFsbHk/XG4gICAqL1xuICBwdWJsaWMgZXh0ZXJuYWxXb3JrZmxvdzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUHJvamVjdHMgdGhhdCBzaG91bGQgY29tcGxldGUgZGVwbG95bWVudCBiZWZvcmUgdGhpcyBvbmUgc3RhcnRzLlxuICAgKi9cbiAgcHVibGljIGRlcGxveUFmdGVyVGFyZ2V0czogQXJyYXk8QXdzRGVwbG95bWVudFRhcmdldD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHByb2plY3Q6IEF3c0Nka1R5cGVTY3JpcHRBcHAsXG4gICAgb3B0aW9uczogRGVwbG95V29ya2Zsb3dPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAqXG4gICAgICogUm9vdCBwcm9qZWN0IGNoZWNrXG4gICAgICpcbiAgICAgKiBEZXRlY3QgdGhlIHJvb3QgcHJvamVjdCBhbmQgZW5zdXJlIGl0J3Mgb2YgdHlwZSBNb25vcmVwb1Byb2plY3QuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBpZiAoIShwcm9qZWN0LnJvb3QgaW5zdGFuY2VvZiBNb25vcmVwb1Byb2plY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQXdzRGVwbG95V29ya2Zsb3cgcmVxdWlyZXMgdGhlIHJvb3QgcHJvamVjdCB0byBiZSBhIE1vbm9yZXBvUHJvamVjdFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3RQcm9qZWN0ID0gcHJvamVjdC5yb290O1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAqXG4gICAgICogR2l0SHViIENoZWNrXG4gICAgICpcbiAgICAgKiBNYWtlIHN1cmUgZ2l0aHViIGNvbmZpZyBpcyBhY3RpdmUgaW4gdGhlIHByb2plY3QuIFRoaXMgaXMgdG8gZW5zdXJlIGFsbFxuICAgICAqIHdvcmtmbG93cyB3aWxsIGJlIG91dHB1dCBwcm9wZXJseSBkdXJpbmcgc3ludGguXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCBnaXRodWIgPSBHaXRIdWIub2YodGhpcy5yb290UHJvamVjdCk7XG5cbiAgICBpZiAoIWdpdGh1Yikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkF3c0RlcGxveVdvcmtmbG93IHJlcXVpcmVzIGEgR2l0SHViIGNvbXBvbmVudCBpbiB0aGUgcm9vdCBwcm9qZWN0XCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIFR1cmJvUmVwbyBDaGVja1xuICAgICAqXG4gICAgICogSWYgdHVyYm8gaXMgZW5hYmxlZCwgd2UgbWF5IG5lZWQgdGhlIG9wdGlvbnMgbGF0ZXIgaW4gdGhpcyBmaWxlLlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgY29uc3QgdHVyYm8gPSBUdXJib1JlcG8ub2YodGhpcy5yb290UHJvamVjdCk7XG4gICAgY29uc3QgYnVpbGRXb3JrZmxvd09wdGlvbnM6IFBhcnRpYWw8QnVpbGRXb3JrZmxvd09wdGlvbnM+ID1cbiAgICAgIHR1cmJvPy5yZW1vdGVDYWNoZU9wdGlvbnNcbiAgICAgICAgPyBUdXJib1JlcG8uYnVpbGRXb3JrZmxvd09wdGlvbnModHVyYm8ucmVtb3RlQ2FjaGVPcHRpb25zKVxuICAgICAgICA6IHt9O1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAqXG4gICAgICogV29ya2Zsb3cgRGVwbG95IFR5cGVcbiAgICAgKlxuICAgICAqIFdoYXQgdHlwZSBvZiBlbnZpcm9ubWVudHMgYXJlIHdlIGRlcGxveWluZyBpbnRvPyBXZSdsbCBkZWZhdWx0IHRvIGRldiB0b1xuICAgICAqIGJlIHNhZmUuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICB0aGlzLmF3c1N0YWdlVHlwZSA9IG9wdGlvbnMuYXdzU3RhZ2VUeXBlID8/IEFXU19TVEFHRV9UWVBFLkRFVjtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIFdvcmtmbG93IERlcGxveSBUYXJnZXRzXG4gICAgICpcbiAgICAgKiBVc2UgcHJvdmlkZWQgdGFyZ2V0cyBvciBkaXNjb3ZlciB0aGVtIGJhc2VkIG9uIHRoZSBkZXBsb3kgdHlwZS4gT25seVxuICAgICAqIGluY2x1ZGUgdGFyZ2V0cyB0aGF0IGFyZSBtYXJrZWQgZm9yIENJL0NELlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgdGhpcy5hd3NEZXBsb3ltZW50VGFyZ2V0cyA9XG4gICAgICBvcHRpb25zLmF3c0RlcGxveW1lbnRUYXJnZXRzID8/XG4gICAgICBBd3NEZXBsb3ltZW50Q29uZmlnLm9mKHByb2plY3QpPy5hd3NEZXBsb3ltZW50VGFyZ2V0cy5maWx0ZXIoXG4gICAgICAgICh0YXJnZXQpID0+XG4gICAgICAgICAgdGFyZ2V0LmF3c1N0YWdlVHlwZSA9PT0gdGhpcy5hd3NTdGFnZVR5cGUgJiYgdGFyZ2V0LmNpRGVwbG95bWVudCxcbiAgICAgICkgPz9cbiAgICAgIFtdO1xuXG4gICAgdGhpcy5kZXBsb3lBZnRlclRhcmdldHMgPSBvcHRpb25zLmRlcGxveUFmdGVyVGFyZ2V0cyA/PyBbXTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIEJ1aWxkIFdvcmtmbG93IE9wdGlvbnNcbiAgICAgKlxuICAgICAqIENhbid0IHVzZSB0aGUgb3B0aW9ucyBpZiBhbiBleGlzdGluZyB3b3JrZmxvdyB3YXMgcGFzc2VkIGluLlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgaWYgKG9wdGlvbnMuYnVpbGRXb3JrZmxvdyAmJiBvcHRpb25zLmJ1aWxkV29ya2Zsb3dPcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IHByb3ZpZGUgYm90aCBidWlsZFdvcmtmbG93IGFuZCBidWlsZFdvcmtmbG93T3B0aW9uc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4dGVybmFsV29ya2Zsb3cgPSAhIW9wdGlvbnMuYnVpbGRXb3JrZmxvdztcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIEJ1aWxkIFdvcmtmbG93XG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSB3b3JrZmxvdyBlaXRoZXIgYmFzZWQgb24gaW5wdXQgb3IgZnJvbSBzY3JhdGNoLlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgdGhpcy5idWlsZFdvcmtmbG93ID1cbiAgICAgIG9wdGlvbnMuYnVpbGRXb3JrZmxvdyA/P1xuICAgICAgbmV3IEJ1aWxkV29ya2Zsb3codGhpcy5yb290UHJvamVjdCwge1xuICAgICAgICAvKipcbiAgICAgICAgICogTmFtZSBiYXNlZCBvbiBwcm9qZWN0IGFuZCBlbnZpcm9ubWVudC5cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6XG4gICAgICAgICAgb3B0aW9ucy5idWlsZFdvcmtmbG93T3B0aW9ucz8ubmFtZSA/P1xuICAgICAgICAgIFtcbiAgICAgICAgICAgIFwiZGVwbG95XCIsXG4gICAgICAgICAgICBwcm9qZWN0Lm5hbWUsXG4gICAgICAgICAgICB0aGlzLmF3c1N0YWdlVHlwZSxcbiAgICAgICAgICAgIHRoaXMuYXdzRW52aXJvbm1lbnRUeXBlLFxuICAgICAgICAgIF0uam9pbihcIi1cIiksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgcm9vdCBwcm9qZWN0cyBidWlsZCB0YXNrLlxuICAgICAgICAgKi9cbiAgICAgICAgYnVpbGRUYXNrOiB0aGlzLnJvb3RQcm9qZWN0LmJ1aWxkVGFzayxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHB1c2ggdHJpZ2dlcnMgYmFzZWQgbiB0aGUgYnJhbmNoIGNvbmZpZyBmb3IgZWFjaCBlbnZpcm9ubWVudC5cbiAgICAgICAgICovXG4gICAgICAgIHdvcmtmbG93VHJpZ2dlcnM6IHtcbiAgICAgICAgICBwdXNoOiB7XG4gICAgICAgICAgICBicmFuY2hlczogW1xuICAgICAgICAgICAgICAuLi50aGlzLmF3c0RlcGxveW1lbnRUYXJnZXRzLmZsYXRNYXAoKHQpID0+XG4gICAgICAgICAgICAgICAgdC5icmFuY2hlcy5tYXAoKGIpID0+IGIuYnJhbmNoKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3b3JrZmxvd0Rpc3BhdGNoOiB7fSxcbiAgICAgICAgICAuLi5vcHRpb25zLmJ1aWxkV29ya2Zsb3dPcHRpb25zPy53b3JrZmxvd1RyaWdnZXJzLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOZXZlciBhbGxvdyBtdXRhdGlvbnMgZm9yIGRlcGxveXMuIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkXG4gICAgICAgICAqIGR1cmluZyBidWlsZC5cbiAgICAgICAgICovXG4gICAgICAgIG11dGFibGVCdWlsZDogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERvIHRoaXMgcHJlLW1lcmdlIG9mIHBlcm1pc3Npb25zIGFuZCBidWlsZCBzdGVwc1xuICAgICAgICAgKi9cbiAgICAgICAgLi4ub3B0aW9ucy5idWlsZFdvcmtmbG93T3B0aW9ucyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU29tZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSByZXF1aXJlZCB3aGVuIHR1cmJvJ3MgaW52b2x2ZWQuXG4gICAgICAgICAqL1xuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgIC4uLm9wdGlvbnMuYnVpbGRXb3JrZmxvd09wdGlvbnM/LnBlcm1pc3Npb25zLFxuICAgICAgICAgIC4uLmJ1aWxkV29ya2Zsb3dPcHRpb25zPy5wZXJtaXNzaW9ucyxcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQXNzZW1ibGUgYWxsIHByZS1idWlsZCBzdGVwc1xuICAgICAgICAgKi9cbiAgICAgICAgcHJlQnVpbGRTdGVwczogW1xuICAgICAgICAgIC4uLnRoaXMuc2V0dXBQbnBtKCksXG4gICAgICAgICAgLi4udGhpcy5zZXR1cE5vZGUoKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIkluc3RhbGwgZGVwZW5kZW5jaWVzXCIsXG4gICAgICAgICAgICBydW46IFwicG5wbSBpIC0tbm8tZnJvemVuLWxvY2tmaWxlXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5idWlsZFdvcmtmbG93T3B0aW9ucz8ucHJlQnVpbGRTdGVwcyA/PyBbXSksXG4gICAgICAgICAgLi4uKGJ1aWxkV29ya2Zsb3dPcHRpb25zPy5wcmVCdWlsZFN0ZXBzID8/IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAqXG4gICAgICogQWRkIERlcGxveW1lbnRzIHRvIHdvcmtmbG93XG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCBidWlsZEpvYk5hbWUgPSAodGFyZ2V0OiBBd3NEZXBsb3ltZW50VGFyZ2V0KSA9PiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0YXJnZXQuYXdzU3RhZ2VUeXBlLFxuICAgICAgICB0YXJnZXQuYXdzRW52aXJvbm1lbnRUeXBlLFxuICAgICAgICBcImRlcGxveVwiLFxuICAgICAgICB0YXJnZXQucHJvamVjdC5uYW1lLFxuICAgICAgICB0YXJnZXQuYWNjb3VudCxcbiAgICAgICAgdGFyZ2V0LnJlZ2lvbixcbiAgICAgIF0uam9pbihcIi1cIik7XG4gICAgfTtcblxuICAgIHRoaXMuYXdzRGVwbG95bWVudFRhcmdldHMuZm9yRWFjaCgodGFyZ2V0KSA9PiB7XG4gICAgICBjb25zdCBkZXBsb3lKb2JOYW1lID0gYnVpbGRKb2JOYW1lKHRhcmdldCk7XG5cbiAgICAgIC8vIEJ1aWxkIHRoZSBicmFuY2ggZmlsdGVyIGNvbmRpdGlvblxuICAgICAgY29uc3QgYnJhbmNoRmlsdGVyQ29uZGl0aW9uID0gdGhpcy5idWlsZEJyYW5jaEZpbHRlckNvbmRpdGlvbihcbiAgICAgICAgdGFyZ2V0LmJyYW5jaGVzLFxuICAgICAgKTtcblxuICAgICAgLy8gQ29tYmluZSB3aXRoIHRoZSBleGlzdGluZyBidWlsZCBtdXRhdGlvbiBjaGVja1xuICAgICAgY29uc3Qgam9iQ29uZGl0aW9uID0gYnJhbmNoRmlsdGVyQ29uZGl0aW9uXG4gICAgICAgID8gW1xuICAgICAgICAgICAgXCIke3sgIW5lZWRzLmJ1aWxkLm91dHB1dHMuc2VsZl9tdXRhdGlvbl9oYXBwZW5lZCB9fVwiLFxuICAgICAgICAgICAgYCgke2JyYW5jaEZpbHRlckNvbmRpdGlvbn0pYCxcbiAgICAgICAgICBdLmpvaW4oXCIgJiYgXCIpXG4gICAgICAgIDogXCIke3sgIW5lZWRzLmJ1aWxkLm91dHB1dHMuc2VsZl9tdXRhdGlvbl9oYXBwZW5lZCB9fVwiO1xuXG4gICAgICB0aGlzLmJ1aWxkV29ya2Zsb3cuYWRkUG9zdEJ1aWxkSm9iKGRlcGxveUpvYk5hbWUsIHtcbiAgICAgICAgbmFtZTogYERlcGxveSAke3RoaXMucHJvamVjdC5uYW1lfSAke3RhcmdldC5hd3NTdGFnZVR5cGV9LyR7dGFyZ2V0LmF3c0Vudmlyb25tZW50VHlwZX0vJHt0YXJnZXQuYWNjb3VudH0vJHt0YXJnZXQucmVnaW9ufWAsXG4gICAgICAgIG5lZWRzOiBbXG4gICAgICAgICAgXCJidWlsZFwiLFxuICAgICAgICAgIC4uLnRoaXMuZGVwbG95QWZ0ZXJUYXJnZXRzLm1hcCgocCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkSm9iTmFtZShwKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgcnVuc09uOiBbXCJ1YnVudHUtbGF0ZXN0XCJdLFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgICAgaWRUb2tlbjogSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgICAgfSxcbiAgICAgICAgY29uY3VycmVuY3k6IGRlcGxveUpvYk5hbWUsXG4gICAgICAgIGlmOiBqb2JDb25kaXRpb24sXG4gICAgICAgIHN0ZXBzOiBbLi4udGhpcy5kZXBsb3lTdGVwcyh0YXJnZXQpXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldHVwTm9kZSA9ICgpOiBBcnJheTxKb2JTdGVwPiA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJTZXR1cCBOb2RlXCIsXG4gICAgICAgIHVzZXM6IFwiYWN0aW9ucy9zZXR1cC1ub2RlQHY0XCIsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBbXCJub2RlLXZlcnNpb25cIl06IFZFUlNJT04uTk9ERV9XT1JLRkxPV1MsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIG9jY2FzaW9uYWxseSB0aGlzIHN0ZXAgZmFpbHMgZHVlIHRvIGludGVybmFsIGlzc3VlcyBhdCBnaXRodWJcbiAgICAgICAgdGltZW91dE1pbnV0ZXM6IDEsXG4gICAgICB9LFxuICAgIF07XG4gIH07XG5cbiAgcHVibGljIHNldHVwUG5wbSA9ICgpOiBBcnJheTxKb2JTdGVwPiA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJTZXR1cCBQTlBNXCIsXG4gICAgICAgIHVzZXM6IFwicG5wbS9hY3Rpb24tc2V0dXBAdjNcIixcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIHZlcnNpb246IFZFUlNJT04uUE5QTV9WRVJTSU9OLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBHaXRIdWIgQWN0aW9ucyBjb25kaXRpb24gc3RyaW5nIHRoYXQgY2hlY2tzIGlmIHRoZSBjdXJyZW50IGJyYW5jaFxuICAgKiBtYXRjaGVzIGFueSBvZiB0aGUgcHJvdmlkZWQgYnJhbmNoIHBhdHRlcm5zLlxuICAgKlxuICAgKiBIYW5kbGVzIGJvdGggZXhhY3QgbWF0Y2hlcyAoZS5nLiwgXCJtYWluXCIpIGFuZCBnbG9iIHBhdHRlcm5zIChlLmcuLCBcImZlYXR1cmUvKlwiKS5cbiAgICogQWxzbyBhbGxvd3Mgd29ya2Zsb3dfZGlzcGF0Y2ggKG1hbnVhbCBydW5zKSB0byBwcm9jZWVkLlxuICAgKlxuICAgKiBAcGFyYW0gYnJhbmNoZXMgQXJyYXkgb2YgR2l0QnJhbmNoIG9iamVjdHMgd2l0aCBicmFuY2ggcGF0dGVybnNcbiAgICogQHJldHVybnMgQ29uZGl0aW9uIHN0cmluZyBvciBlbXB0eSBzdHJpbmcgaWYgbm8gYnJhbmNoZXMgcHJvdmlkZWRcbiAgICovXG4gIHByaXZhdGUgYnVpbGRCcmFuY2hGaWx0ZXJDb25kaXRpb24gPSAoYnJhbmNoZXM6IEFycmF5PEdpdEJyYW5jaD4pOiBzdHJpbmcgPT4ge1xuICAgIGlmICghYnJhbmNoZXMgfHwgYnJhbmNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25kaXRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICAvLyBBbHdheXMgYWxsb3cgd29ya2Zsb3dfZGlzcGF0Y2ggKG1hbnVhbCB3b3JrZmxvdyBydW5zKVxuICAgIGNvbmRpdGlvbnMucHVzaChcImdpdGh1Yi5ldmVudF9uYW1lID09ICd3b3JrZmxvd19kaXNwYXRjaCdcIik7XG5cbiAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBicmFuY2hlcykge1xuICAgICAgY29uc3QgYnJhbmNoUGF0dGVybiA9IGJyYW5jaC5icmFuY2g7XG5cbiAgICAgIC8vIEhhbmRsZSBnbG9iIHBhdHRlcm5zIChlLmcuLCBcImZlYXR1cmUvKlwiKVxuICAgICAgaWYgKGJyYW5jaFBhdHRlcm4uaW5jbHVkZXMoXCIqXCIpKSB7XG4gICAgICAgIC8vIFJlcGxhY2UgKiB3aXRoIHByb3BlciBzdGFydHNXaXRoIGNoZWNrXG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGJyYW5jaFBhdHRlcm4ucmVwbGFjZSgvXFwqLiokLywgXCJcIik7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChgc3RhcnRzV2l0aChnaXRodWIucmVmLCAncmVmcy9oZWFkcy8ke3ByZWZpeH0nKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRXhhY3QgbWF0Y2hcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKGBnaXRodWIucmVmID09ICdyZWZzL2hlYWRzLyR7YnJhbmNoUGF0dGVybn0nYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tYmluZSBhbGwgY29uZGl0aW9ucyB3aXRoIE9SXG4gICAgcmV0dXJuIGNvbmRpdGlvbnMuam9pbihcIiB8fCBcIik7XG4gIH07XG5cbiAgcHJpdmF0ZSBkZXBsb3lTdGVwcyA9ICh0YXJnZXQ6IEF3c0RlcGxveW1lbnRUYXJnZXQpOiBBcnJheTxKb2JTdGVwPiA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgYXdzU3RhZ2VUeXBlLFxuICAgICAgYXdzRW52aXJvbm1lbnRUeXBlLFxuICAgICAgYWNjb3VudCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGNpRGVwbG95bWVudENvbmZpZyxcbiAgICAgIGF3c0RlcGxveW1lbnRDb25maWcsXG4gICAgfSA9IHRhcmdldDtcbiAgICBjb25zdCB7IHJvbGVBcm4sIHN0YWNrUGF0dGVybiB9ID0gY2lEZXBsb3ltZW50Q29uZmlnID8/IHt9O1xuICAgIGNvbnN0IHsgcm9vdENka091dCB9ID0gYXdzRGVwbG95bWVudENvbmZpZztcblxuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLnNldHVwUG5wbSgpLFxuICAgICAgLi4udGhpcy5zZXR1cE5vZGUoKSxcblxuICAgICAgLyoqXG4gICAgICAgKiBJbnN0YWxsIENES1xuICAgICAgICovXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiSW5zdGFsbCBDREtcIixcbiAgICAgICAgcnVuOiBcInBucG0gYWRkIGF3cy1jZGtcIixcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ29uZmlndXJlIEFXUyBjcmVkcy5cbiAgICAgICAqL1xuICAgICAge1xuICAgICAgICBuYW1lOiBgQVdTIENyZWRzICR7YXdzU3RhZ2VUeXBlfS8ke2F3c0Vudmlyb25tZW50VHlwZX0vJHthY2NvdW50fS8ke3JlZ2lvbn1gLFxuICAgICAgICB1c2VzOiBcImF3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAdjRcIixcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIFwicm9sZS10by1hc3N1bWVcIjogcm9sZUFybixcbiAgICAgICAgICBcImF3cy1yZWdpb25cIjogcmVnaW9uLFxuICAgICAgICAgIFwicm9sZS1kdXJhdGlvbi1zZWNvbmRzXCI6IDkwMCwgLy8gMTUgbWludXRlc1xuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSdW4gQ0RLIERlcGxveVxuICAgICAgICovXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBEZXBsb3kgJHthd3NTdGFnZVR5cGV9LyR7YXdzRW52aXJvbm1lbnRUeXBlfS8ke2FjY291bnR9LyR7cmVnaW9ufWAsXG4gICAgICAgIHJ1bjogYHBucG0gZGx4IGF3cy1jZGsgZGVwbG95IC0tbm8tcm9sbGJhY2sgLS1yZXF1aXJlLWFwcHJvdmFsPW5ldmVyIC0tYXBwPSR7cm9vdENka091dH0gXCIke3N0YWNrUGF0dGVybn1cImAsXG4gICAgICB9LFxuICAgIF07XG4gIH07XG5cbiAgcHJlU3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBFbnN1cmUgdHVyYm8gaXMgYWN0aXZlIHdoZW4gbmVlZGVkLlxuICAgICAqL1xuICAgIGlmICghdGhpcy5leHRlcm5hbFdvcmtmbG93ICYmIFR1cmJvUmVwby5vZih0aGlzLnJvb3RQcm9qZWN0KSkge1xuICAgICAgdGhpcy5idWlsZFdvcmtmbG93LmFkZFBvc3RCdWlsZFN0ZXBzKHtcbiAgICAgICAgbmFtZTogXCJCdWlsZCBTdWIgUHJvamVjdHNcIixcbiAgICAgICAgcnVuOiBgbnB4IHByb2plbiAke1JPT1RfQ0lfVEFTS19OQU1FfWAsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzdXBlci5wcmVTeW50aGVzaXplKCk7XG4gIH1cbn1cbiJdfQ==
|
package/lib/workflows/index.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./deploy-workflow";
|
|
1
|
+
export * from "./aws-deploy-workflow";
|
package/lib/workflows/index.js
CHANGED
|
@@ -14,6 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
18
|
-
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFBaUM7QUFDakMsb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYnVpbGQtd29ya2Zsb3dcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlcGxveS13b3JrZmxvd1wiO1xuIl19
|
|
17
|
+
__exportStar(require("./aws-deploy-workflow"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3REFBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9hd3MtZGVwbG95LXdvcmtmbG93XCI7XG4iXX0=
|
package/package.json
CHANGED
|
@@ -3,50 +3,51 @@
|
|
|
3
3
|
"description": "Projen configs frequently used in CodeDrifter projects.",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
|
-
"url": "https://github.com/codedrifters/
|
|
6
|
+
"url": "https://github.com/codedrifters/packages"
|
|
7
7
|
},
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "CodeDrifters",
|
|
10
10
|
"organization": true
|
|
11
11
|
},
|
|
12
12
|
"devDependencies": {
|
|
13
|
+
"@swc/core": "^1.15.4",
|
|
14
|
+
"@swc/jest": "^0.2.39",
|
|
13
15
|
"@types/jest": "^30.0.0",
|
|
14
|
-
"@types/node": "^22.
|
|
16
|
+
"@types/node": "^22.19.3",
|
|
15
17
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
16
18
|
"@typescript-eslint/parser": "^8",
|
|
17
19
|
"commit-and-tag-version": "^12",
|
|
18
|
-
"constructs": "
|
|
20
|
+
"constructs": "10.4.4",
|
|
19
21
|
"eslint": "^9",
|
|
20
|
-
"eslint-config-prettier": "^10.1.
|
|
21
|
-
"eslint-import-resolver-typescript": "^4.
|
|
22
|
-
"eslint-plugin-import": "^2.
|
|
23
|
-
"eslint-plugin-prettier": "^5.
|
|
24
|
-
"jest": "^30.0
|
|
22
|
+
"eslint-config-prettier": "^10.1.8",
|
|
23
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
24
|
+
"eslint-plugin-import": "^2.32.0",
|
|
25
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
26
|
+
"jest": "^30.2.0",
|
|
25
27
|
"jest-junit": "^16",
|
|
26
|
-
"prettier": "^3.
|
|
27
|
-
"projen": "
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
"prettier": "^3.7.4",
|
|
29
|
+
"projen": "0.98.33",
|
|
30
|
+
"typescript": "^5.9.3"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"constructs": "10.4.4",
|
|
34
|
+
"projen": "0.98.33"
|
|
31
35
|
},
|
|
32
36
|
"dependencies": {
|
|
33
|
-
"@jsii/spec": "^1.
|
|
34
|
-
"
|
|
35
|
-
"projen": "^0.91.28",
|
|
37
|
+
"@jsii/spec": "^1.121.0",
|
|
38
|
+
"ts-deepmerge": "^7",
|
|
36
39
|
"type-fest": "^4"
|
|
37
40
|
},
|
|
38
41
|
"main": "lib/index.js",
|
|
39
42
|
"license": "MIT",
|
|
40
|
-
"version": "0.0.
|
|
43
|
+
"version": "0.0.1",
|
|
41
44
|
"types": "lib/index.d.ts",
|
|
42
|
-
"//": "~~ Generated by projen. To modify, edit .projenrc.
|
|
45
|
+
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".",
|
|
43
46
|
"scripts": {
|
|
44
47
|
"build": "npx projen build",
|
|
45
48
|
"bump": "npx projen bump",
|
|
46
|
-
"clobber": "npx projen clobber",
|
|
47
49
|
"compile": "npx projen compile",
|
|
48
50
|
"default": "npx projen default",
|
|
49
|
-
"eject": "npx projen eject",
|
|
50
51
|
"eslint": "npx projen eslint",
|
|
51
52
|
"package": "npx projen package",
|
|
52
53
|
"post-compile": "npx projen post-compile",
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Component } from "projen";
|
|
2
|
-
import { TypeScriptAppProject } from "projen/lib/typescript";
|
|
3
|
-
export declare const PREVIEW_DEPLOY_NAME = "preview-deploy";
|
|
4
|
-
export declare class BuildWorkflow extends Component {
|
|
5
|
-
project: TypeScriptAppProject;
|
|
6
|
-
constructor(project: TypeScriptAppProject);
|
|
7
|
-
/**
|
|
8
|
-
* This runs after all the projects are setup but before any files are
|
|
9
|
-
* synthesized. This allows us to update the build yaml with complete
|
|
10
|
-
* information.
|
|
11
|
-
*/
|
|
12
|
-
preSynthesize(): void;
|
|
13
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BuildWorkflow = exports.PREVIEW_DEPLOY_NAME = void 0;
|
|
4
|
-
const projen_1 = require("projen");
|
|
5
|
-
const awscdk_1 = require("projen/lib/awscdk");
|
|
6
|
-
const workflows_model_1 = require("projen/lib/github/workflows-model");
|
|
7
|
-
const deploy_1 = require("./steps/deploy");
|
|
8
|
-
const aws_deployment_config_1 = require("../aws/aws-deployment-config");
|
|
9
|
-
exports.PREVIEW_DEPLOY_NAME = "preview-deploy";
|
|
10
|
-
class BuildWorkflow extends projen_1.Component {
|
|
11
|
-
constructor(project) {
|
|
12
|
-
super(project);
|
|
13
|
-
this.project = project;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* This runs after all the projects are setup but before any files are
|
|
17
|
-
* synthesized. This allows us to update the build yaml with complete
|
|
18
|
-
* information.
|
|
19
|
-
*/
|
|
20
|
-
preSynthesize() {
|
|
21
|
-
super.preSynthesize();
|
|
22
|
-
/**
|
|
23
|
-
* Deploy PR preview to dev environment(s)
|
|
24
|
-
*/
|
|
25
|
-
this.project.subprojects
|
|
26
|
-
// only AwsCdkTypeScriptApp projects
|
|
27
|
-
.filter((subproject) => subproject instanceof awscdk_1.AwsCdkTypeScriptApp)
|
|
28
|
-
.forEach((subproject) => {
|
|
29
|
-
/**
|
|
30
|
-
* an array of all deployment configs.
|
|
31
|
-
*/
|
|
32
|
-
const deployConfigs = aws_deployment_config_1.AwsDeploymentConfig.of(subproject);
|
|
33
|
-
/**
|
|
34
|
-
* Any configs? let's see if any have CI support for PR deploys!
|
|
35
|
-
*/
|
|
36
|
-
if (deployConfigs) {
|
|
37
|
-
deployConfigs.forEach((config) => {
|
|
38
|
-
config.deploymentTargets
|
|
39
|
-
// only development targets for CI
|
|
40
|
-
.filter((dt) => dt.ciDeployment &&
|
|
41
|
-
dt.awsDeploymentType === aws_deployment_config_1.AWS_DEPLOY_TYPE.DEV)
|
|
42
|
-
.forEach((dt) => {
|
|
43
|
-
/**
|
|
44
|
-
* Nice long annoying but unique name.
|
|
45
|
-
*/
|
|
46
|
-
const deployJobName = `${exports.PREVIEW_DEPLOY_NAME}-${this.project.name}-${dt.account}-${dt.region}`;
|
|
47
|
-
this.project.buildWorkflow?.addPostBuildJob(deployJobName, {
|
|
48
|
-
name: `Deploy PR Preview to ${dt.account}/${dt.region}`,
|
|
49
|
-
runsOn: ["ubuntu-latest"],
|
|
50
|
-
permissions: {
|
|
51
|
-
contents: workflows_model_1.JobPermission.READ,
|
|
52
|
-
idToken: workflows_model_1.JobPermission.WRITE,
|
|
53
|
-
},
|
|
54
|
-
concurrency: deployJobName,
|
|
55
|
-
steps: [...(0, deploy_1.deploySteps)(subproject, dt)],
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
exports.BuildWorkflow = BuildWorkflow;
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtd29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3dzL2J1aWxkLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFtQztBQUNuQyw4Q0FBd0Q7QUFDeEQsdUVBQWtFO0FBRWxFLDJDQUE2QztBQUM3Qyx3RUFHc0M7QUFFekIsUUFBQSxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUVwRCxNQUFhLGFBQWMsU0FBUSxrQkFBUztJQUMxQyxZQUFtQixPQUE2QjtRQUM5QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFERSxZQUFPLEdBQVAsT0FBTyxDQUFzQjtJQUVoRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWE7UUFDWCxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFdEI7O1dBRUc7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDdEIsb0NBQW9DO2FBQ25DLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxZQUFZLDRCQUFtQixDQUFDO2FBQ2pFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3RCOztlQUVHO1lBQ0gsTUFBTSxhQUFhLEdBQUcsMkNBQW1CLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXpEOztlQUVHO1lBQ0gsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUMvQixNQUFNLENBQUMsaUJBQWlCO3dCQUN0QixrQ0FBa0M7eUJBQ2pDLE1BQU0sQ0FDTCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ0wsRUFBRSxDQUFDLFlBQVk7d0JBQ2YsRUFBRSxDQUFDLGlCQUFpQixLQUFLLHVDQUFlLENBQUMsR0FBRyxDQUMvQzt5QkFDQSxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTt3QkFDZDs7MkJBRUc7d0JBQ0gsTUFBTSxhQUFhLEdBQUcsR0FBRywyQkFBbUIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFFL0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLGFBQWEsRUFBRTs0QkFDekQsSUFBSSxFQUFFLHdCQUF3QixFQUFFLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUU7NEJBQ3ZELE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQzs0QkFDekIsV0FBVyxFQUFFO2dDQUNYLFFBQVEsRUFBRSwrQkFBYSxDQUFDLElBQUk7Z0NBQzVCLE9BQU8sRUFBRSwrQkFBYSxDQUFDLEtBQUs7NkJBQzdCOzRCQUNELFdBQVcsRUFBRSxhQUFhOzRCQUMxQixLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUEsb0JBQVcsRUFBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7eUJBQ3hDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDRjtBQTFERCxzQ0EwREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBBd3NDZGtUeXBlU2NyaXB0QXBwIH0gZnJvbSBcInByb2plbi9saWIvYXdzY2RrXCI7XG5pbXBvcnQgeyBKb2JQZXJtaXNzaW9uIH0gZnJvbSBcInByb2plbi9saWIvZ2l0aHViL3dvcmtmbG93cy1tb2RlbFwiO1xuaW1wb3J0IHsgVHlwZVNjcmlwdEFwcFByb2plY3QgfSBmcm9tIFwicHJvamVuL2xpYi90eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBkZXBsb3lTdGVwcyB9IGZyb20gXCIuL3N0ZXBzL2RlcGxveVwiO1xuaW1wb3J0IHtcbiAgQVdTX0RFUExPWV9UWVBFLFxuICBBd3NEZXBsb3ltZW50Q29uZmlnLFxufSBmcm9tIFwiLi4vYXdzL2F3cy1kZXBsb3ltZW50LWNvbmZpZ1wiO1xuXG5leHBvcnQgY29uc3QgUFJFVklFV19ERVBMT1lfTkFNRSA9IFwicHJldmlldy1kZXBsb3lcIjtcblxuZXhwb3J0IGNsYXNzIEJ1aWxkV29ya2Zsb3cgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvamVjdDogVHlwZVNjcmlwdEFwcFByb2plY3QpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHJ1bnMgYWZ0ZXIgYWxsIHRoZSBwcm9qZWN0cyBhcmUgc2V0dXAgYnV0IGJlZm9yZSBhbnkgZmlsZXMgYXJlXG4gICAqIHN5bnRoZXNpemVkLiBUaGlzIGFsbG93cyB1cyB0byB1cGRhdGUgdGhlIGJ1aWxkIHlhbWwgd2l0aCBjb21wbGV0ZVxuICAgKiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHByZVN5bnRoZXNpemUoKTogdm9pZCB7XG4gICAgc3VwZXIucHJlU3ludGhlc2l6ZSgpO1xuXG4gICAgLyoqXG4gICAgICogRGVwbG95IFBSIHByZXZpZXcgdG8gZGV2IGVudmlyb25tZW50KHMpXG4gICAgICovXG4gICAgdGhpcy5wcm9qZWN0LnN1YnByb2plY3RzXG4gICAgICAvLyBvbmx5IEF3c0Nka1R5cGVTY3JpcHRBcHAgcHJvamVjdHNcbiAgICAgIC5maWx0ZXIoKHN1YnByb2plY3QpID0+IHN1YnByb2plY3QgaW5zdGFuY2VvZiBBd3NDZGtUeXBlU2NyaXB0QXBwKVxuICAgICAgLmZvckVhY2goKHN1YnByb2plY3QpID0+IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFuIGFycmF5IG9mIGFsbCBkZXBsb3ltZW50IGNvbmZpZ3MuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBkZXBsb3lDb25maWdzID0gQXdzRGVwbG95bWVudENvbmZpZy5vZihzdWJwcm9qZWN0KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW55IGNvbmZpZ3M/IGxldCdzIHNlZSBpZiBhbnkgaGF2ZSBDSSBzdXBwb3J0IGZvciBQUiBkZXBsb3lzIVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGRlcGxveUNvbmZpZ3MpIHtcbiAgICAgICAgICBkZXBsb3lDb25maWdzLmZvckVhY2goKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgY29uZmlnLmRlcGxveW1lbnRUYXJnZXRzXG4gICAgICAgICAgICAgIC8vIG9ubHkgZGV2ZWxvcG1lbnQgdGFyZ2V0cyBmb3IgQ0lcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZHQpID0+XG4gICAgICAgICAgICAgICAgICBkdC5jaURlcGxveW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgIGR0LmF3c0RlcGxveW1lbnRUeXBlID09PSBBV1NfREVQTE9ZX1RZUEUuREVWLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5mb3JFYWNoKChkdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIE5pY2UgbG9uZyBhbm5veWluZyBidXQgdW5pcXVlIG5hbWUuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwbG95Sm9iTmFtZSA9IGAke1BSRVZJRVdfREVQTE9ZX05BTUV9LSR7dGhpcy5wcm9qZWN0Lm5hbWV9LSR7ZHQuYWNjb3VudH0tJHtkdC5yZWdpb259YDtcblxuICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdC5idWlsZFdvcmtmbG93Py5hZGRQb3N0QnVpbGRKb2IoZGVwbG95Sm9iTmFtZSwge1xuICAgICAgICAgICAgICAgICAgbmFtZTogYERlcGxveSBQUiBQcmV2aWV3IHRvICR7ZHQuYWNjb3VudH0vJHtkdC5yZWdpb259YCxcbiAgICAgICAgICAgICAgICAgIHJ1bnNPbjogW1widWJ1bnR1LWxhdGVzdFwiXSxcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgICAgICAgICAgICAgIGlkVG9rZW46IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IGRlcGxveUpvYk5hbWUsXG4gICAgICAgICAgICAgICAgICBzdGVwczogWy4uLmRlcGxveVN0ZXBzKHN1YnByb2plY3QsIGR0KV0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Component } from "projen";
|
|
2
|
-
import { TypeScriptAppProject } from "projen/lib/typescript";
|
|
3
|
-
export declare const PROD_DEPLOY_NAME = "prod-deploy";
|
|
4
|
-
export declare class DeployWorkflow extends Component {
|
|
5
|
-
project: TypeScriptAppProject;
|
|
6
|
-
/**
|
|
7
|
-
* Hold the deploy workflow so we can add to it in preSynth
|
|
8
|
-
*/
|
|
9
|
-
private workflow;
|
|
10
|
-
constructor(project: TypeScriptAppProject);
|
|
11
|
-
/**
|
|
12
|
-
* This runs after all the projects are setup but before any files are
|
|
13
|
-
* synthesized. This allows us to update the build yaml with complete
|
|
14
|
-
* information.
|
|
15
|
-
*/
|
|
16
|
-
preSynthesize(): void;
|
|
17
|
-
}
|