@jjrawlins/cdk-diff-pr-github-action 0.0.1-beta → 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 (43) hide show
  1. package/.jsii +475 -33
  2. package/.mergify.yml +102 -0
  3. package/API.md +351 -11
  4. package/README.md +223 -39
  5. package/lib/CdkDiffIamTemplate.d.ts +3 -1
  6. package/lib/CdkDiffIamTemplate.js +10 -5
  7. package/lib/CdkDiffStackWorkflow.d.ts +2 -2
  8. package/lib/CdkDiffStackWorkflow.js +19 -20
  9. package/lib/CdkDriftDetectionWorkflow.d.ts +32 -0
  10. package/lib/CdkDriftDetectionWorkflow.js +281 -0
  11. package/lib/CdkDriftIamTemplate.d.ts +10 -0
  12. package/lib/CdkDriftIamTemplate.js +77 -0
  13. package/lib/bin/cdk-changeset-script.js +3 -3
  14. package/lib/bin/cdk-drift-detection-script.d.ts +15 -0
  15. package/lib/bin/cdk-drift-detection-script.js +196 -0
  16. package/lib/bin/detect-drift.js +162 -0
  17. package/lib/index.d.ts +2 -0
  18. package/lib/index.js +3 -1
  19. package/package.json +7 -2
  20. package/sonar-project.properties +17 -0
  21. package/.junie/guidelines.md +0 -62
  22. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.jsii +0 -3917
  23. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.junie/guidelines.md +0 -62
  24. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.tool-versions +0 -3
  25. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/API.md +0 -276
  26. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/LICENSE +0 -202
  27. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/README.md +0 -146
  28. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDiffIamTemplate.d.ts +0 -8
  29. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDiffIamTemplate.js +0 -96
  30. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDiffStackWorkflow.d.ts +0 -22
  31. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDiffStackWorkflow.js +0 -144
  32. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/bin/cdk-changeset-script.d.ts +0 -9
  33. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/bin/cdk-changeset-script.js +0 -256
  34. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/bin/describe-cfn-changeset.js +0 -204
  35. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/index.d.ts +0 -2
  36. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/index.js +0 -19
  37. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/package.json +0 -137
  38. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/yalc.lock +0 -10
  39. package/.yalc/@jjrawlins/cdk-diff-pr-github-action/yalc.sig +0 -1
  40. package/lib/bin/describe-cfn-changeset.d.ts +0 -1
  41. package/lib/bin/describe-cfn-changeset.js +0 -204
  42. package/yalc.lock +0 -10
  43. /package/{.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/bin/describe-cfn-changeset.d.ts → lib/bin/detect-drift.d.ts} +0 -0
@@ -1,137 +0,0 @@
1
- {
2
- "name": "@jjrawlins/cdk-diff-pr-github-action",
3
- "description": "A GitHub Action that creates a CDK diff for a pull request.",
4
- "repository": {
5
- "type": "git",
6
- "url": "https://jjrawlins@github.com/JaysonRawlins/cdk-diff-pr-github-action.git"
7
- },
8
- "scripts": {
9
- "build": "npx projen build",
10
- "bump": "npx projen bump",
11
- "clobber": "npx projen clobber",
12
- "compat": "npx projen compat",
13
- "compile": "npx projen compile",
14
- "default": "npx projen default",
15
- "docgen": "npx projen docgen",
16
- "eject": "npx projen eject",
17
- "eslint": "npx projen eslint",
18
- "package": "npx projen package",
19
- "package-all": "npx projen package-all",
20
- "package:js": "npx projen package:js",
21
- "post-compile": "npx projen post-compile",
22
- "pre-compile": "npx projen pre-compile",
23
- "release": "npx projen release",
24
- "test": "npx projen test",
25
- "test:watch": "npx projen test:watch",
26
- "unbump": "npx projen unbump",
27
- "watch": "npx projen watch",
28
- "projen": "npx projen"
29
- },
30
- "author": {
31
- "name": "Jayson Rawlins",
32
- "email": "JaysonJ.Rawlins@gmail.com",
33
- "organization": false
34
- },
35
- "peerDependencies": {
36
- "aws-cdk-lib": "^2.85.0",
37
- "constructs": ">=10.0.5 <11.0.0"
38
- },
39
- "dependencies": {
40
- "@aws-sdk/client-cloudformation": "^3.922.0",
41
- "@jjrawlins/cdk-diff-pr-github-action": "file:.yalc/@jjrawlins/cdk-diff-pr-github-action",
42
- "@types/crypto-js": "^4.2.2",
43
- "@types/js-yaml": "^4.0.9",
44
- "crypto-js": "^4.2.0",
45
- "js-yaml": "^4.1.0",
46
- "lodash": "^4.17.21",
47
- "lodash.merge": "^4.6.2",
48
- "projen": "^0.95.6"
49
- },
50
- "bundledDependencies": [
51
- "@aws-sdk/client-cloudformation",
52
- "@types/crypto-js",
53
- "@types/js-yaml",
54
- "crypto-js",
55
- "js-yaml",
56
- "lodash",
57
- "lodash.merge"
58
- ],
59
- "resolutions": {
60
- "form-data": "^4.0.4",
61
- "@eslint/plugin-kit": "^0.3.4",
62
- "aws-cdk-lib": ">=2.85.0 <3.0.0",
63
- "constructs": "10.0.5",
64
- "projen": ">=0.95.6 <1.0.0"
65
- },
66
- "keywords": [
67
- "action",
68
- "aws",
69
- "cdk",
70
- "diff",
71
- "github",
72
- "pull request"
73
- ],
74
- "engines": {
75
- "node": ">= 20.9.0"
76
- },
77
- "main": "lib/index.js",
78
- "license": "Apache-2.0",
79
- "version": "0.0.0",
80
- "jest": {
81
- "coverageProvider": "v8",
82
- "testMatch": [
83
- "<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
84
- "<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
85
- "<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
86
- "<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
87
- ],
88
- "clearMocks": true,
89
- "collectCoverage": true,
90
- "coverageReporters": [
91
- "json",
92
- "lcov",
93
- "clover",
94
- "cobertura",
95
- "text"
96
- ],
97
- "coverageDirectory": "coverage",
98
- "coveragePathIgnorePatterns": [
99
- "/node_modules/"
100
- ],
101
- "testPathIgnorePatterns": [
102
- "/node_modules/"
103
- ],
104
- "watchPathIgnorePatterns": [
105
- "/node_modules/"
106
- ],
107
- "reporters": [
108
- "default",
109
- [
110
- "jest-junit",
111
- {
112
- "outputDirectory": "test-reports"
113
- }
114
- ]
115
- ],
116
- "transform": {
117
- "^.+\\.[t]sx?$": [
118
- "ts-jest",
119
- {
120
- "tsconfig": "tsconfig.dev.json"
121
- }
122
- ]
123
- }
124
- },
125
- "types": "lib/index.d.ts",
126
- "stability": "stable",
127
- "jsii": {
128
- "outdir": "dist",
129
- "targets": {},
130
- "tsc": {
131
- "outDir": "lib",
132
- "rootDir": "src"
133
- }
134
- },
135
- "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\".",
136
- "yalcSig": "621e5901e87edfeab75d768d39765577"
137
- }
@@ -1,10 +0,0 @@
1
- {
2
- "version": "v1",
3
- "packages": {
4
- "@jjrawlins/cdk-diff-pr-github-action": {
5
- "version": "0.0.0",
6
- "signature": "73bf81d52dd2d7fb8898cbec9c25113f",
7
- "file": true
8
- }
9
- }
10
- }
@@ -1 +0,0 @@
1
- 621e5901e87edfeab75d768d39765577
@@ -1 +0,0 @@
1
- export {};
@@ -1,204 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const promises_1 = require("fs/promises");
4
- const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
5
- // type Change = NonNullable<Awaited<ReturnType<CloudFormationClient['send']>> extends any ? any : never>;
6
- /**
7
- * Small sleep helper.
8
- */
9
- const sleep = (ms) => new Promise((res) => setTimeout(res, ms));
10
- /**
11
- * Build the HTML color chip for an action.
12
- * Modify=blue, Add=green, Remove=red (match pretty_format.py).
13
- */
14
- function actionChip(action) {
15
- // Use emoji instead of external images for reliability
16
- const emojiMap = {
17
- Modify: '🔵',
18
- Add: '🟢',
19
- Remove: '🔴',
20
- };
21
- const mark = action ? (emojiMap[action] ?? '⚪') : '⚪';
22
- return `${mark} ${action ?? '-'}`;
23
- }
24
- /**
25
- * Extract changed property names only where Target.Attribute == 'Properties'
26
- * joined by <br>, prefixed with "- ".
27
- */
28
- function changedPropertiesHTML(change) {
29
- const details = change?.ResourceChange?.Details ?? [];
30
- const props = [];
31
- for (const d of details) {
32
- if (d?.Target?.Attribute !== 'Properties')
33
- continue;
34
- const name = d?.Target?.Name ?? '-';
35
- props.push(`- ${name}`);
36
- }
37
- return props.join('<br>');
38
- }
39
- /**
40
- * Determine if a change should be ignored based on logical IDs and/or resource types.
41
- * - IGNORE_LOGICAL_IDS: comma-separated list of logical IDs to ignore (default includes 'CDKMetadata')
42
- * - IGNORE_RESOURCE_TYPES: comma-separated list of resource types to ignore (e.g., 'AWS::CDK::Metadata')
43
- */
44
- function shouldIgnoreChange(change, ignoreIds, ignoreTypes) {
45
- const rc = change?.ResourceChange ?? {};
46
- const logicalId = rc?.LogicalResourceId;
47
- const resourceType = rc?.ResourceType;
48
- if (logicalId && ignoreIds.has(logicalId))
49
- return true;
50
- return !!(resourceType && ignoreTypes.has(resourceType));
51
- }
52
- /**
53
- * Generate the HTML body similar to pretty_format.py
54
- */
55
- function buildHtml(stackName, changes) {
56
- let body = `<h1>Change set</h1><h2>Stack Name: ${stackName}</h2><br>`;
57
- if ((changes?.length ?? 0) > 0) {
58
- body += '<table><tr><th>Action&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th><th>ID</th><th>Type</th><th>Replacement</th><th>Changed Properties</th></tr>';
59
- for (const c of changes) {
60
- const rc = c?.ResourceChange ?? {};
61
- const action = actionChip(rc?.Action);
62
- const logicalId = rc?.LogicalResourceId ?? '-';
63
- const type = rc?.ResourceType ?? '-';
64
- const replacement = rc?.Replacement ?? '-';
65
- const details = changedPropertiesHTML(c);
66
- body += '<tr>';
67
- body += `<td>${action}</td>`;
68
- body += `<td>${logicalId}</td>`;
69
- body += `<td>${type}</td>`;
70
- body += `<td>${replacement}</td>`;
71
- body += `<td>${details}</td>`;
72
- body += '</tr>';
73
- }
74
- body += '</table>';
75
- }
76
- else {
77
- body += 'no change.';
78
- }
79
- return body;
80
- }
81
- /**
82
- * Poll DescribeChangeSet until a terminal status, then paginate to retrieve all Changes.
83
- */
84
- async function getTerminalChangeSet(client, stackName, changeSetName, maxAttempts = 60, delayMs = 3000) {
85
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
86
- const resp = await client.send(new client_cloudformation_1.DescribeChangeSetCommand({
87
- StackName: stackName,
88
- ChangeSetName: changeSetName,
89
- }));
90
- const status = resp.Status;
91
- const statusReason = resp.StatusReason;
92
- if (status === 'CREATE_COMPLETE' || status === 'FAILED') {
93
- // Gather all pages
94
- const changes = [];
95
- if (resp.Changes)
96
- changes.push(...resp.Changes);
97
- let next = resp.NextToken;
98
- while (next) {
99
- const page = await client.send(new client_cloudformation_1.DescribeChangeSetCommand({
100
- StackName: stackName,
101
- ChangeSetName: changeSetName,
102
- NextToken: next,
103
- }));
104
- if (page.Changes)
105
- changes.push(...page.Changes);
106
- next = page.NextToken;
107
- }
108
- return { status, statusReason, changes };
109
- }
110
- // Not terminal yet; wait and retry
111
- await sleep(delayMs);
112
- }
113
- throw new Error('Timed out waiting for change set to reach a terminal status.');
114
- }
115
- async function postGithubComment(url, token, body) {
116
- const res = await fetch(url, {
117
- method: 'POST',
118
- headers: {
119
- 'Authorization': `token ${token}`,
120
- 'Content-Type': 'application/json',
121
- 'Accept': 'application/vnd.github+json',
122
- },
123
- body: JSON.stringify({ body }),
124
- });
125
- if (!res.ok) {
126
- const text = await res.text().catch(() => '');
127
- throw new Error(`Failed to post GitHub comment: ${res.status} ${res.statusText} ${text}`);
128
- }
129
- }
130
- async function appendStepSummary(summaryPath, content) {
131
- await (0, promises_1.appendFile)(summaryPath, `${content}\n`, { encoding: 'utf8' });
132
- }
133
- async function main() {
134
- const { STACK_NAME, CHANGE_SET_NAME, AWS_REGION, GITHUB_TOKEN, GITHUB_COMMENT_URL, GITHUB_STEP_SUMMARY, IGNORE_LOGICAL_IDS, IGNORE_RESOURCE_TYPES, } = process.env;
135
- if (!STACK_NAME) {
136
- throw new Error('STACK_NAME is required');
137
- }
138
- const region = AWS_REGION || process.env.AWS_DEFAULT_REGION;
139
- if (!region) {
140
- throw new Error('AWS_REGION is required');
141
- }
142
- const changeSetName = CHANGE_SET_NAME || STACK_NAME;
143
- const client = new client_cloudformation_1.CloudFormationClient({ region });
144
- let status;
145
- let statusReason;
146
- let changes = [];
147
- try {
148
- const result = await getTerminalChangeSet(client, STACK_NAME, changeSetName);
149
- status = result.status;
150
- statusReason = result.statusReason;
151
- changes = result.changes ?? [];
152
- }
153
- catch (err) {
154
- // If DescribeChangeSet fails entirely, surface the error
155
- console.error('Error describing change set:', err?.message || err);
156
- process.exitCode = 1;
157
- return;
158
- }
159
- // Apply ignores from env vars (IDs and types). Default ignore IDs include 'CDKMetadata'.
160
- const ignoreIdSet = new Set((IGNORE_LOGICAL_IDS ?? 'CDKMetadata')
161
- .split(',')
162
- .map(s => s.trim())
163
- .filter(Boolean));
164
- const ignoreTypeSet = new Set((IGNORE_RESOURCE_TYPES ?? '')
165
- .split(',')
166
- .map(s => s.trim())
167
- .filter(Boolean));
168
- const filteredChanges = changes.filter(c => !shouldIgnoreChange(c, ignoreIdSet, ignoreTypeSet));
169
- // Build HTML exactly like pretty_format.py logic (table when there are changes; "no change." otherwise).
170
- const html = buildHtml(STACK_NAME, filteredChanges);
171
- // Print to stdout
172
- // This allows capturing output or redirecting to a file if needed.
173
- console.log(html);
174
- // Optionally append to GitHub Step Summary
175
- if (GITHUB_STEP_SUMMARY) {
176
- try {
177
- await appendStepSummary(GITHUB_STEP_SUMMARY, html);
178
- console.error(`Appended HTML to GITHUB_STEP_SUMMARY: ${GITHUB_STEP_SUMMARY}`);
179
- }
180
- catch (e) {
181
- console.error('Failed to append to GITHUB_STEP_SUMMARY:', e?.message || e);
182
- }
183
- }
184
- // Optionally post a PR comment
185
- if (GITHUB_TOKEN && GITHUB_COMMENT_URL) {
186
- try {
187
- await postGithubComment(GITHUB_COMMENT_URL, GITHUB_TOKEN, html);
188
- console.error('Posted HTML as a GitHub PR comment.');
189
- }
190
- catch (e) {
191
- console.error('Failed to post GitHub PR comment:', e?.message || e);
192
- // Do not fail the whole script just for comment posting
193
- }
194
- }
195
- // Note: When status is FAILED due to "didn’t contain changes", the HTML naturally says "no change."
196
- if (status === 'FAILED' && statusReason) {
197
- console.error(`Change set status: FAILED. Reason: ${statusReason}`);
198
- }
199
- }
200
- main().catch((err) => {
201
- console.error(err);
202
- process.exitCode = 1;
203
- });
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtY2ZuLWNoYW5nZXNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vZGVzY3JpYmUtY2ZuLWNoYW5nZXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBDQUF5QztBQUN6QywwRUFBZ0c7QUFFaEcsMEdBQTBHO0FBRTFHOztHQUVHO0FBQ0gsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFeEU7OztHQUdHO0FBQ0gsU0FBUyxVQUFVLENBQUMsTUFBZTtJQUNqQyx1REFBdUQ7SUFDdkQsTUFBTSxRQUFRLEdBQTJCO1FBQ3ZDLE1BQU0sRUFBRSxJQUFJO1FBQ1osR0FBRyxFQUFFLElBQUk7UUFDVCxNQUFNLEVBQUUsSUFBSTtLQUNiLENBQUM7SUFDRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEQsT0FBTyxHQUFHLElBQUksSUFBSSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMscUJBQXFCLENBQUMsTUFBVztJQUN4QyxNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDdEQsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsS0FBSyxZQUFZO1lBQUUsU0FBUztRQUNwRCxNQUFNLElBQUksR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElB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O1FBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtJQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uQ2xpZW50LCBEZXNjcmliZUNoYW5nZVNldENvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuXG4vLyB0eXBlIENoYW5nZSA9IE5vbk51bGxhYmxlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxDbG91ZEZvcm1hdGlvbkNsaWVudFsnc2VuZCddPj4gZXh0ZW5kcyBhbnkgPyBhbnkgOiBuZXZlcj47XG5cbi8qKlxuICogU21hbGwgc2xlZXAgaGVscGVyLlxuICovXG5jb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocmVzKSA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcblxuLyoqXG4gKiBCdWlsZCB0aGUgSFRNTCBjb2xvciBjaGlwIGZvciBhbiBhY3Rpb24uXG4gKiBNb2RpZnk9Ymx1ZSwgQWRkPWdyZWVuLCBSZW1vdmU9cmVkIChtYXRjaCBwcmV0dHlfZm9ybWF0LnB5KS5cbiAqL1xuZnVuY3Rpb24gYWN0aW9uQ2hpcChhY3Rpb24/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBVc2UgZW1vamkgaW5zdGVhZCBvZiBleHRlcm5hbCBpbWFnZXMgZm9yIHJlbGlhYmlsaXR5XG4gIGNvbnN0IGVtb2ppTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIE1vZGlmeTogJ/CflLUnLFxuICAgIEFkZDogJ/Cfn6InLFxuICAgIFJlbW92ZTogJ/CflLQnLFxuICB9O1xuICBjb25zdCBtYXJrID0gYWN0aW9uID8gKGVtb2ppTWFwW2FjdGlvbl0gPz8gJ+KaqicpIDogJ+Kaqic7XG4gIHJldHVybiBgJHttYXJrfSAke2FjdGlvbiA/PyAnLSd9YDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGNoYW5nZWQgcHJvcGVydHkgbmFtZXMgb25seSB3aGVyZSBUYXJnZXQuQXR0cmlidXRlID09ICdQcm9wZXJ0aWVzJ1xuICogam9pbmVkIGJ5IDxicj4sIHByZWZpeGVkIHdpdGggXCItIFwiLlxuICovXG5mdW5jdGlvbiBjaGFuZ2VkUHJvcGVydGllc0hUTUwoY2hhbmdlOiBhbnkpOiBzdHJpbmcge1xuICBjb25zdCBkZXRhaWxzID0gY2hhbmdlPy5SZXNvdXJjZUNoYW5nZT8uRGV0YWlscyA/PyBbXTtcbiAgY29uc3QgcHJvcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZCBvZiBkZXRhaWxzKSB7XG4gICAgaWYgKGQ/LlRhcmdldD8uQXR0cmlidXRlICE9PSAnUHJvcGVydGllcycpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5hbWUgPSBkPy5UYXJnZXQ/Lk5hbWUgPz8gJy0nO1xuICAgIHByb3BzLnB1c2goYC0gJHtuYW1lfWApO1xuICB9XG4gIHJldHVybiBwcm9wcy5qb2luKCc8YnI+Jyk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgY2hhbmdlIHNob3VsZCBiZSBpZ25vcmVkIGJhc2VkIG9uIGxvZ2ljYWwgSURzIGFuZC9vciByZXNvdXJjZSB0eXBlcy5cbiAqIC0gSUdOT1JFX0xPR0lDQUxfSURTOiBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2dpY2FsIElEcyB0byBpZ25vcmUgKGRlZmF1bHQgaW5jbHVkZXMgJ0NES01ldGFkYXRhJylcbiAqIC0gSUdOT1JFX1JFU09VUkNFX1RZUEVTOiBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXNvdXJjZSB0eXBlcyB0byBpZ25vcmUgKGUuZy4sICdBV1M6OkNESzo6TWV0YWRhdGEnKVxuICovXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVDaGFuZ2UoY2hhbmdlOiBhbnksIGlnbm9yZUlkczogU2V0PHN0cmluZz4sIGlnbm9yZVR5cGVzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBjb25zdCByYyA9IGNoYW5nZT8uUmVzb3VyY2VDaGFuZ2UgPz8ge307XG4gIGNvbnN0IGxvZ2ljYWxJZCA9IHJjPy5Mb2dpY2FsUmVzb3VyY2VJZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc291cmNlVHlwZSA9IHJjPy5SZXNvdXJjZVR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAobG9naWNhbElkICYmIGlnbm9yZUlkcy5oYXMobG9naWNhbElkKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhIShyZXNvdXJjZVR5cGUgJiYgaWdub3JlVHlwZXMuaGFzKHJlc291cmNlVHlwZSkpO1xuXG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIEhUTUwgYm9keSBzaW1pbGFyIHRvIHByZXR0eV9mb3JtYXQucHlcbiAqL1xuZnVuY3Rpb24gYnVpbGRIdG1sKHN0YWNrTmFtZTogc3RyaW5nLCBjaGFuZ2VzOiBhbnlbXSk6IHN0cmluZyB7XG4gIGxldCBib2R5ID0gYDxoMT5DaGFuZ2Ugc2V0PC9oMT48aDI+U3RhY2sgTmFtZTogJHtzdGFja05hbWV9PC9oMj48YnI+YDtcbiAgaWYgKChjaGFuZ2VzPy5sZW5ndGggPz8gMCkgPiAwKSB7XG4gICAgYm9keSArPSAnPHRhYmxlPjx0cj48dGg+QWN0aW9uJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90aD48dGg+SUQ8L3RoPjx0aD5UeXBlPC90aD48dGg+UmVwbGFjZW1lbnQ8L3RoPjx0aD5DaGFuZ2VkIFByb3BlcnRpZXM8L3RoPjwvdHI+JztcbiAgICBmb3IgKGNvbnN0IGMgb2YgY2hhbmdlcykge1xuICAgICAgY29uc3QgcmMgPSBjPy5SZXNvdXJjZUNoYW5nZSA/PyB7fTtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbkNoaXAocmM/LkFjdGlvbik7XG4gICAgICBjb25zdCBsb2dpY2FsSWQgPSByYz8uTG9naWNhbFJlc291cmNlSWQgPz8gJy0nO1xuICAgICAgY29uc3QgdHlwZSA9IHJjPy5SZXNvdXJjZVR5cGUgPz8gJy0nO1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSByYz8uUmVwbGFjZW1lbnQgPz8gJy0nO1xuICAgICAgY29uc3QgZGV0YWlscyA9IGNoYW5nZWRQcm9wZXJ0aWVzSFRNTChjKTtcblxuICAgICAgYm9keSArPSAnPHRyPic7XG4gICAgICBib2R5ICs9IGA8dGQ+JHthY3Rpb259PC90ZD5gO1xuICAgICAgYm9keSArPSBgPHRkPiR7bG9naWNhbElkfTwvdGQ+YDtcbiAgICAgIGJvZHkgKz0gYDx0ZD4ke3R5cGV9PC90ZD5gO1xuICAgICAgYm9keSArPSBgPHRkPiR7cmVwbGFjZW1lbnR9PC90ZD5gO1xuICAgICAgYm9keSArPSBgPHRkPiR7ZGV0YWlsc308L3RkPmA7XG4gICAgICBib2R5ICs9ICc8L3RyPic7XG4gICAgfVxuICAgIGJvZHkgKz0gJzwvdGFibGU+JztcbiAgfSBlbHNlIHtcbiAgICBib2R5ICs9ICdubyBjaGFuZ2UuJztcbiAgfVxuICByZXR1cm4gYm9keTtcbn1cblxuLyoqXG4gKiBQb2xsIERlc2NyaWJlQ2hhbmdlU2V0IHVudGlsIGEgdGVybWluYWwgc3RhdHVzLCB0aGVuIHBhZ2luYXRlIHRvIHJldHJpZXZlIGFsbCBDaGFuZ2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRUZXJtaW5hbENoYW5nZVNldChcbiAgY2xpZW50OiBDbG91ZEZvcm1hdGlvbkNsaWVudCxcbiAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gIGNoYW5nZVNldE5hbWU6IHN0cmluZyxcbiAgbWF4QXR0ZW1wdHMgPSA2MCxcbiAgZGVsYXlNcyA9IDMwMDAsXG4pOiBQcm9taXNlPHsgc3RhdHVzPzogc3RyaW5nOyBzdGF0dXNSZWFzb24/OiBzdHJpbmc7IGNoYW5nZXM6IGFueVtdIH0+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgRGVzY3JpYmVDaGFuZ2VTZXRDb21tYW5kKHtcbiAgICAgIFN0YWNrTmFtZTogc3RhY2tOYW1lLFxuICAgICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSByZXNwLlN0YXR1cztcbiAgICBjb25zdCBzdGF0dXNSZWFzb24gPSByZXNwLlN0YXR1c1JlYXNvbjtcblxuICAgIGlmIChzdGF0dXMgPT09ICdDUkVBVEVfQ09NUExFVEUnIHx8IHN0YXR1cyA9PT0gJ0ZBSUxFRCcpIHtcbiAgICAgIC8vIEdhdGhlciBhbGwgcGFnZXNcbiAgICAgIGNvbnN0IGNoYW5nZXM6IGFueVtdID0gW107XG4gICAgICBpZiAocmVzcC5DaGFuZ2VzKSBjaGFuZ2VzLnB1c2goLi4ucmVzcC5DaGFuZ2VzKTtcbiAgICAgIGxldCBuZXh0ID0gcmVzcC5OZXh0VG9rZW47XG4gICAgICB3aGlsZSAobmV4dCkge1xuICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZCh7XG4gICAgICAgICAgU3RhY2tOYW1lOiBzdGFja05hbWUsXG4gICAgICAgICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSxcbiAgICAgICAgICBOZXh0VG9rZW46IG5leHQsXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKHBhZ2UuQ2hhbmdlcykgY2hhbmdlcy5wdXNoKC4uLnBhZ2UuQ2hhbmdlcyk7XG4gICAgICAgIG5leHQgPSBwYWdlLk5leHRUb2tlbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHN0YXR1cywgc3RhdHVzUmVhc29uLCBjaGFuZ2VzIH07XG4gICAgfVxuXG4gICAgLy8gTm90IHRlcm1pbmFsIHlldDsgd2FpdCBhbmQgcmV0cnlcbiAgICBhd2FpdCBzbGVlcChkZWxheU1zKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignVGltZWQgb3V0IHdhaXRpbmcgZm9yIGNoYW5nZSBzZXQgdG8gcmVhY2ggYSB0ZXJtaW5hbCBzdGF0dXMuJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvc3RHaXRodWJDb21tZW50KHVybDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0F1dGhvcml6YXRpb24nOiBgdG9rZW4gJHt0b2tlbn1gLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJyxcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYm9keSB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKS5jYXRjaCgoKSA9PiAnJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcG9zdCBHaXRIdWIgY29tbWVudDogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fSAke3RleHR9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwZW5kU3RlcFN1bW1hcnkoc3VtbWFyeVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGVuZEZpbGUoc3VtbWFyeVBhdGgsIGAke2NvbnRlbnR9XFxuYCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBjb25zdCB7XG4gICAgU1RBQ0tfTkFNRSxcbiAgICBDSEFOR0VfU0VUX05BTUUsXG4gICAgQVdTX1JFR0lPTixcbiAgICBHSVRIVUJfVE9LRU4sXG4gICAgR0lUSFVCX0NPTU1FTlRfVVJMLFxuICAgIEdJVEhVQl9TVEVQX1NVTU1BUlksXG4gICAgSUdOT1JFX0xPR0lDQUxfSURTLFxuICAgIElHTk9SRV9SRVNPVVJDRV9UWVBFUyxcbiAgfSA9IHByb2Nlc3MuZW52O1xuXG4gIGlmICghU1RBQ0tfTkFNRSkge1xuICAgIHRocm93IG5ldyBFcnJvcignU1RBQ0tfTkFNRSBpcyByZXF1aXJlZCcpO1xuICB9XG4gIGNvbnN0IHJlZ2lvbiA9IEFXU19SRUdJT04gfHwgcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OO1xuICBpZiAoIXJlZ2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignQVdTX1JFR0lPTiBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgY29uc3QgY2hhbmdlU2V0TmFtZSA9IENIQU5HRV9TRVRfTkFNRSB8fCBTVEFDS19OQU1FO1xuXG4gIGNvbnN0IGNsaWVudCA9IG5ldyBDbG91ZEZvcm1hdGlvbkNsaWVudCh7IHJlZ2lvbiB9KTtcblxuICBsZXQgc3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzdGF0dXNSZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGNoYW5nZXM6IGFueVtdID0gW107XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRUZXJtaW5hbENoYW5nZVNldChjbGllbnQsIFNUQUNLX05BTUUsIGNoYW5nZVNldE5hbWUpO1xuICAgIHN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7XG4gICAgc3RhdHVzUmVhc29uID0gcmVzdWx0LnN0YXR1c1JlYXNvbjtcbiAgICBjaGFuZ2VzID0gcmVzdWx0LmNoYW5nZXMgPz8gW107XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgLy8gSWYgRGVzY3JpYmVDaGFuZ2VTZXQgZmFpbHMgZW50aXJlbHksIHN1cmZhY2UgdGhlIGVycm9yXG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVzY3JpYmluZyBjaGFuZ2Ugc2V0OicsIGVycj8ubWVzc2FnZSB8fCBlcnIpO1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFwcGx5IGlnbm9yZXMgZnJvbSBlbnYgdmFycyAoSURzIGFuZCB0eXBlcykuIERlZmF1bHQgaWdub3JlIElEcyBpbmNsdWRlICdDREtNZXRhZGF0YScuXG4gIGNvbnN0IGlnbm9yZUlkU2V0ID0gbmV3IFNldChcbiAgICAoSUdOT1JFX0xPR0lDQUxfSURTID8/ICdDREtNZXRhZGF0YScpXG4gICAgICAuc3BsaXQoJywnKVxuICAgICAgLm1hcChzID0+IHMudHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSxcbiAgKTtcbiAgY29uc3QgaWdub3JlVHlwZVNldCA9IG5ldyBTZXQoXG4gICAgKElHTk9SRV9SRVNPVVJDRV9UWVBFUyA/PyAnJylcbiAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAubWFwKHMgPT4gcy50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICApO1xuICBjb25zdCBmaWx0ZXJlZENoYW5nZXMgPSBjaGFuZ2VzLmZpbHRlcihjID0+ICFzaG91bGRJZ25vcmVDaGFuZ2UoYywgaWdub3JlSWRTZXQsIGlnbm9yZVR5cGVTZXQpKTtcblxuICAvLyBCdWlsZCBIVE1MIGV4YWN0bHkgbGlrZSBwcmV0dHlfZm9ybWF0LnB5IGxvZ2ljICh0YWJsZSB3aGVuIHRoZXJlIGFyZSBjaGFuZ2VzOyBcIm5vIGNoYW5nZS5cIiBvdGhlcndpc2UpLlxuICBjb25zdCBodG1sID0gYnVpbGRIdG1sKFNUQUNLX05BTUUsIGZpbHRlcmVkQ2hhbmdlcyk7XG5cbiAgLy8gUHJpbnQgdG8gc3Rkb3V0XG4gIC8vIFRoaXMgYWxsb3dzIGNhcHR1cmluZyBvdXRwdXQgb3IgcmVkaXJlY3RpbmcgdG8gYSBmaWxlIGlmIG5lZWRlZC5cbiAgY29uc29sZS5sb2coaHRtbCk7XG5cbiAgLy8gT3B0aW9uYWxseSBhcHBlbmQgdG8gR2l0SHViIFN0ZXAgU3VtbWFyeVxuICBpZiAoR0lUSFVCX1NURVBfU1VNTUFSWSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcHBlbmRTdGVwU3VtbWFyeShHSVRIVUJfU1RFUF9TVU1NQVJZLCBodG1sKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFwcGVuZGVkIEhUTUwgdG8gR0lUSFVCX1NURVBfU1VNTUFSWTogJHtHSVRIVUJfU1RFUF9TVU1NQVJZfWApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGFwcGVuZCB0byBHSVRIVUJfU1RFUF9TVU1NQVJZOicsIGU/Lm1lc3NhZ2UgfHwgZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWxseSBwb3N0IGEgUFIgY29tbWVudFxuICBpZiAoR0lUSFVCX1RPS0VOICYmIEdJVEhVQl9DT01NRU5UX1VSTCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwb3N0R2l0aHViQ29tbWVudChHSVRIVUJfQ09NTUVOVF9VUkwsIEdJVEhVQl9UT0tFTiwgaHRtbCk7XG4gICAgICBjb25zb2xlLmVycm9yKCdQb3N0ZWQgSFRNTCBhcyBhIEdpdEh1YiBQUiBjb21tZW50LicpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHBvc3QgR2l0SHViIFBSIGNvbW1lbnQ6JywgZT8ubWVzc2FnZSB8fCBlKTtcbiAgICAgIC8vIERvIG5vdCBmYWlsIHRoZSB3aG9sZSBzY3JpcHQganVzdCBmb3IgY29tbWVudCBwb3N0aW5nXG4gICAgfVxuICB9XG5cbiAgLy8gTm90ZTogV2hlbiBzdGF0dXMgaXMgRkFJTEVEIGR1ZSB0byBcImRpZG7igJl0IGNvbnRhaW4gY2hhbmdlc1wiLCB0aGUgSFRNTCBuYXR1cmFsbHkgc2F5cyBcIm5vIGNoYW5nZS5cIlxuICBpZiAoc3RhdHVzID09PSAnRkFJTEVEJyAmJiBzdGF0dXNSZWFzb24pIHtcbiAgICBjb25zb2xlLmVycm9yKGBDaGFuZ2Ugc2V0IHN0YXR1czogRkFJTEVELiBSZWFzb246ICR7c3RhdHVzUmVhc29ufWApO1xuICB9XG59XG5cbm1haW4oKS5jYXRjaCgoZXJyKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG59KTtcbiJdfQ==
package/yalc.lock DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "version": "v1",
3
- "packages": {
4
- "@jjrawlins/cdk-diff-pr-github-action": {
5
- "version": "0.0.0",
6
- "signature": "621e5901e87edfeab75d768d39765577",
7
- "file": true
8
- }
9
- }
10
- }