@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.
Files changed (38) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +761 -1
  3. package/lib/aws/aws-deployment-config.d.ts +45 -108
  4. package/lib/aws/aws-deployment-config.js +69 -100
  5. package/lib/aws/aws-deployment-target.d.ts +210 -0
  6. package/lib/aws/aws-deployment-target.js +202 -0
  7. package/lib/aws/index.d.ts +1 -1
  8. package/lib/aws/index.js +2 -2
  9. package/lib/index.d.ts +9 -0
  10. package/lib/index.js +26 -0
  11. package/lib/jsii/index.d.ts +1 -0
  12. package/lib/jsii/index.js +18 -0
  13. package/lib/jsii/jsii-faker.d.ts +47 -0
  14. package/lib/jsii/jsii-faker.js +103 -0
  15. package/lib/pnpm/pnpm-workspace.d.ts +240 -1
  16. package/lib/pnpm/pnpm-workspace.js +155 -15
  17. package/lib/projects/index.d.ts +2 -0
  18. package/lib/projects/index.js +19 -0
  19. package/lib/projects/monorepo-project.d.ts +50 -0
  20. package/lib/projects/monorepo-project.js +203 -0
  21. package/lib/projects/typescript-project.d.ts +4 -0
  22. package/lib/projects/typescript-project.js +150 -0
  23. package/lib/turbo/turbo-repo.d.ts +116 -9
  24. package/lib/turbo/turbo-repo.js +107 -20
  25. package/lib/versions.d.ts +19 -7
  26. package/lib/versions.js +20 -8
  27. package/lib/vscode/vscode.js +2 -1
  28. package/lib/workflows/aws-deploy-workflow.d.ts +84 -0
  29. package/lib/workflows/aws-deploy-workflow.js +312 -0
  30. package/lib/workflows/index.d.ts +1 -2
  31. package/lib/workflows/index.js +2 -3
  32. package/package.json +21 -20
  33. package/lib/workflows/build-workflow.d.ts +0 -13
  34. package/lib/workflows/build-workflow.js +0 -64
  35. package/lib/workflows/deploy-workflow.d.ts +0 -17
  36. package/lib/workflows/deploy-workflow.js +0 -113
  37. package/lib/workflows/steps/deploy.d.ts +0 -4
  38. 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==
@@ -1,2 +1 @@
1
- export * from "./build-workflow";
2
- export * from "./deploy-workflow";
1
+ export * from "./aws-deploy-workflow";
@@ -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("./build-workflow"), exports);
18
- __exportStar(require("./deploy-workflow"), exports);
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/configulator"
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.15.3",
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": "^10.0.0",
20
+ "constructs": "10.4.4",
19
21
  "eslint": "^9",
20
- "eslint-config-prettier": "^10.1.2",
21
- "eslint-import-resolver-typescript": "^4.3.4",
22
- "eslint-plugin-import": "^2.31.0",
23
- "eslint-plugin-prettier": "^5.2.6",
24
- "jest": "^30.0.4",
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.5.3",
27
- "projen": "^0.91.28",
28
- "ts-jest": "^29.4.0",
29
- "ts-node": "^10.9.2",
30
- "typescript": "^5.8.3"
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.112.0",
34
- "constructs": "^10.0.5",
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.0",
43
+ "version": "0.0.1",
41
44
  "types": "lib/index.d.ts",
42
- "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\".",
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
- }