@aws-cdk-testing/cli-integ 0.0.0

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 (257) hide show
  1. package/.eslintrc.js +9 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +16 -0
  4. package/README.md +205 -0
  5. package/bin/apply-patches +22 -0
  6. package/bin/download-and-run-old-tests +52 -0
  7. package/bin/query-github +2 -0
  8. package/bin/query-github.d.ts +1 -0
  9. package/bin/query-github.js +54 -0
  10. package/bin/query-github.ts +56 -0
  11. package/bin/run-suite +2 -0
  12. package/bin/run-suite.d.ts +1 -0
  13. package/bin/run-suite.js +131 -0
  14. package/bin/run-suite.ts +140 -0
  15. package/bin/stage-distribution +2 -0
  16. package/bin/stage-distribution.d.ts +1 -0
  17. package/bin/stage-distribution.js +217 -0
  18. package/bin/stage-distribution.ts +267 -0
  19. package/bin/test-root +2 -0
  20. package/bin/test-root.d.ts +1 -0
  21. package/bin/test-root.js +6 -0
  22. package/bin/test-root.ts +3 -0
  23. package/entrypoints/test-cli-regression-against-current-code.sh +11 -0
  24. package/entrypoints/test-cli-regression-against-latest-release.sh +11 -0
  25. package/entrypoints/test-cli-regression.bash +83 -0
  26. package/entrypoints/test.sh +12 -0
  27. package/lib/aws.d.ts +51 -0
  28. package/lib/aws.js +206 -0
  29. package/lib/aws.ts +263 -0
  30. package/lib/corking.d.ts +12 -0
  31. package/lib/corking.js +35 -0
  32. package/lib/corking.ts +33 -0
  33. package/lib/eventually.d.ts +20 -0
  34. package/lib/eventually.js +34 -0
  35. package/lib/eventually.ts +42 -0
  36. package/lib/files.d.ts +15 -0
  37. package/lib/files.js +80 -0
  38. package/lib/files.ts +80 -0
  39. package/lib/github.d.ts +4 -0
  40. package/lib/github.js +43 -0
  41. package/lib/github.ts +43 -0
  42. package/lib/index.d.ts +13 -0
  43. package/lib/index.js +30 -0
  44. package/lib/index.ts +13 -0
  45. package/lib/integ-test.d.ts +10 -0
  46. package/lib/integ-test.js +70 -0
  47. package/lib/integ-test.ts +81 -0
  48. package/lib/lists.d.ts +1 -0
  49. package/lib/lists.js +11 -0
  50. package/lib/lists.ts +9 -0
  51. package/lib/memoize.d.ts +6 -0
  52. package/lib/memoize.js +18 -0
  53. package/lib/memoize.ts +14 -0
  54. package/lib/npm.d.ts +8 -0
  55. package/lib/npm.js +38 -0
  56. package/lib/npm.ts +41 -0
  57. package/lib/package-sources/release-source.d.ts +23 -0
  58. package/lib/package-sources/release-source.js +71 -0
  59. package/lib/package-sources/release-source.ts +81 -0
  60. package/lib/package-sources/repo-source.d.ts +30 -0
  61. package/lib/package-sources/repo-source.js +97 -0
  62. package/lib/package-sources/repo-source.ts +111 -0
  63. package/lib/package-sources/repo-tools/npm +2 -0
  64. package/lib/package-sources/repo-tools/npm.d.ts +1 -0
  65. package/lib/package-sources/repo-tools/npm.js +43 -0
  66. package/lib/package-sources/repo-tools/npm.ts +48 -0
  67. package/lib/package-sources/source.d.ts +28 -0
  68. package/lib/package-sources/source.js +3 -0
  69. package/lib/package-sources/source.ts +35 -0
  70. package/lib/package-sources/subprocess.d.ts +3 -0
  71. package/lib/package-sources/subprocess.js +17 -0
  72. package/lib/package-sources/subprocess.ts +15 -0
  73. package/lib/resource-pool.d.ts +50 -0
  74. package/lib/resource-pool.js +117 -0
  75. package/lib/resource-pool.ts +140 -0
  76. package/lib/resources.d.ts +1 -0
  77. package/lib/resources.js +6 -0
  78. package/lib/resources.ts +4 -0
  79. package/lib/shell.d.ts +56 -0
  80. package/lib/shell.js +123 -0
  81. package/lib/shell.ts +168 -0
  82. package/lib/staging/codeartifact.d.ts +44 -0
  83. package/lib/staging/codeartifact.js +281 -0
  84. package/lib/staging/codeartifact.ts +387 -0
  85. package/lib/staging/maven.d.ts +5 -0
  86. package/lib/staging/maven.js +91 -0
  87. package/lib/staging/maven.ts +95 -0
  88. package/lib/staging/npm.d.ts +4 -0
  89. package/lib/staging/npm.js +55 -0
  90. package/lib/staging/npm.ts +62 -0
  91. package/lib/staging/nuget.d.ts +4 -0
  92. package/lib/staging/nuget.js +69 -0
  93. package/lib/staging/nuget.ts +75 -0
  94. package/lib/staging/parallel-shell.d.ts +5 -0
  95. package/lib/staging/parallel-shell.js +45 -0
  96. package/lib/staging/parallel-shell.ts +51 -0
  97. package/lib/staging/pypi.d.ts +4 -0
  98. package/lib/staging/pypi.js +48 -0
  99. package/lib/staging/pypi.ts +50 -0
  100. package/lib/staging/usage-dir.d.ts +31 -0
  101. package/lib/staging/usage-dir.js +87 -0
  102. package/lib/staging/usage-dir.ts +99 -0
  103. package/lib/with-aws.d.ts +14 -0
  104. package/lib/with-aws.js +60 -0
  105. package/lib/with-aws.ts +67 -0
  106. package/lib/with-cdk-app.d.ts +210 -0
  107. package/lib/with-cdk-app.js +539 -0
  108. package/lib/with-cdk-app.ts +742 -0
  109. package/lib/with-cli-lib.d.ts +17 -0
  110. package/lib/with-cli-lib.js +123 -0
  111. package/lib/with-cli-lib.ts +134 -0
  112. package/lib/with-packages.d.ts +5 -0
  113. package/lib/with-packages.js +13 -0
  114. package/lib/with-packages.ts +15 -0
  115. package/lib/with-sam.d.ts +33 -0
  116. package/lib/with-sam.js +258 -0
  117. package/lib/with-sam.ts +288 -0
  118. package/lib/with-temporary-directory.d.ts +5 -0
  119. package/lib/with-temporary-directory.js +31 -0
  120. package/lib/with-temporary-directory.ts +35 -0
  121. package/lib/with-timeout.d.ts +19 -0
  122. package/lib/with-timeout.js +34 -0
  123. package/lib/with-timeout.ts +33 -0
  124. package/lib/xpmutex.d.ts +43 -0
  125. package/lib/xpmutex.js +207 -0
  126. package/lib/xpmutex.ts +218 -0
  127. package/package.json +111 -0
  128. package/resources/bootstrap-templates/session-tags.all-roles-deny-all.yaml +703 -0
  129. package/resources/bootstrap-templates/session-tags.deploy-role-deny-sqs.yaml +700 -0
  130. package/resources/cdk-apps/app/app.js +926 -0
  131. package/resources/cdk-apps/app/appsync.hotswap.graphql +3 -0
  132. package/resources/cdk-apps/app/cdk.json +7 -0
  133. package/resources/cdk-apps/app/docker/Dockerfile +2 -0
  134. package/resources/cdk-apps/app/docker/Dockerfile.Custom +2 -0
  135. package/resources/cdk-apps/app/lambda/index.js +4 -0
  136. package/resources/cdk-apps/app/lambda/response.json +3 -0
  137. package/resources/cdk-apps/app/nested-stack.js +65 -0
  138. package/resources/cdk-apps/cfn-include-app/cdk.json +4 -0
  139. package/resources/cdk-apps/cfn-include-app/cfn-include-app.js +21 -0
  140. package/resources/cdk-apps/cfn-include-app/example-template.json +13 -0
  141. package/resources/cdk-apps/rollback-test-app/app.js +110 -0
  142. package/resources/cdk-apps/rollback-test-app/cdk.json +7 -0
  143. package/resources/cdk-apps/sam_cdk_integ_app/bin/test-app.js +11 -0
  144. package/resources/cdk-apps/sam_cdk_integ_app/cdk.json +6 -0
  145. package/resources/cdk-apps/sam_cdk_integ_app/lib/nested-stack.js +19 -0
  146. package/resources/cdk-apps/sam_cdk_integ_app/lib/test-stack.js +134 -0
  147. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/.no-packagejson-validator +0 -0
  148. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/Dockerfile +9 -0
  149. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/app.js +22 -0
  150. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/package.json +18 -0
  151. package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.mod +5 -0
  152. package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.sum +17 -0
  153. package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/main.go +17 -0
  154. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/.no-packagejson-validator +0 -0
  155. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/app.ts +16 -0
  156. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package-lock.json +12 -0
  157. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package.json +5 -0
  158. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/app.py +15 -0
  159. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/requirements.txt +1 -0
  160. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/layer_version_dependency.py +5 -0
  161. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/requirements.txt +1 -0
  162. package/resources/cdk-apps/sam_cdk_integ_app/src/rest-api-definition.yaml +12 -0
  163. package/resources/cdk-apps/simple-app/app.js +26 -0
  164. package/resources/cdk-apps/simple-app/cdk.json +7 -0
  165. package/resources/cli-regression-patches/v1.119.0/NOTES.md +5 -0
  166. package/resources/cli-regression-patches/v1.119.0/cli.integtest.js +659 -0
  167. package/resources/cli-regression-patches/v1.130.0/NOTES.md +12 -0
  168. package/resources/cli-regression-patches/v1.130.0/app/app.js +378 -0
  169. package/resources/cli-regression-patches/v1.130.0/bootstrapping.integtest.js +220 -0
  170. package/resources/cli-regression-patches/v1.44.0/NOTES.md +18 -0
  171. package/resources/cli-regression-patches/v1.44.0/bootstrapping.integtest.js +126 -0
  172. package/resources/cli-regression-patches/v1.44.0/test.sh +26 -0
  173. package/resources/cli-regression-patches/v1.61.1/NOTES.md +2 -0
  174. package/resources/cli-regression-patches/v1.61.1/skip-tests.txt +16 -0
  175. package/resources/cli-regression-patches/v1.62.0/NOTES.md +2 -0
  176. package/resources/cli-regression-patches/v1.62.0/aws-helpers.js +245 -0
  177. package/resources/cli-regression-patches/v1.63.0/NOTES.md +1 -0
  178. package/resources/cli-regression-patches/v1.63.0/skip-tests.txt +7 -0
  179. package/resources/cli-regression-patches/v1.64.0/NOTES.md +3 -0
  180. package/resources/cli-regression-patches/v1.64.0/cdk-helpers.js +325 -0
  181. package/resources/cli-regression-patches/v1.64.0/cli.integtest.js +599 -0
  182. package/resources/cli-regression-patches/v1.64.1/NOTES.md +3 -0
  183. package/resources/cli-regression-patches/v1.64.1/cdk-helpers.js +324 -0
  184. package/resources/cli-regression-patches/v1.64.1/cli.integtest.js +599 -0
  185. package/resources/cli-regression-patches/v1.67.0/NOTES.md +2 -0
  186. package/resources/cli-regression-patches/v1.67.0/cdk-helpers.js +331 -0
  187. package/resources/cli-regression-patches/v2.130.0/NOTES.md +1 -0
  188. package/resources/cli-regression-patches/v2.130.0/node_modules/@aws-cdk-testing/cli-integ/resources/cdk-apps/sam_cdk_integ_app/lib/nested-stack.js +19 -0
  189. package/resources/cli-regression-patches/v2.130.0/node_modules/@aws-cdk-testing/cli-integ/resources/cdk-apps/sam_cdk_integ_app/lib/test-stack.js +134 -0
  190. package/resources/cli-regression-patches/v2.130.0/skip-tests.txt +5 -0
  191. package/resources/cli-regression-patches/v2.132.0/NOTES.md +1 -0
  192. package/resources/cli-regression-patches/v2.132.0/skip-tests.txt +4 -0
  193. package/resources/cli-regression-patches/v2.142.0/NOTES.md +1 -0
  194. package/resources/cli-regression-patches/v2.142.0/skip-tests.txt +4 -0
  195. package/resources/cli-regression-patches/v2.160.0/skip-tests.txt +2 -0
  196. package/resources/cli-regression-patches/v2.161.0/NOTES.md +1 -0
  197. package/resources/cli-regression-patches/v2.161.0/skip-tests.txt +5 -0
  198. package/resources/cli-regression-patches/v2.166.0/NOTES.md +1 -0
  199. package/resources/cli-regression-patches/v2.166.0/skip-tests.txt +2 -0
  200. package/resources/cloud-assemblies/0.36.0/InitStack.template.json +1 -0
  201. package/resources/cloud-assemblies/0.36.0/cdk.out +1 -0
  202. package/resources/cloud-assemblies/0.36.0/manifest.json +19 -0
  203. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/InitStack.template.json +2 -0
  204. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/cdk.out +1 -0
  205. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/manifest.json.js +37 -0
  206. package/resources/cloud-assemblies/1.10.0-request-azs/InitStack.template.json +2 -0
  207. package/resources/cloud-assemblies/1.10.0-request-azs/cdk.out +1 -0
  208. package/resources/cloud-assemblies/1.10.0-request-azs/manifest.json.js +34 -0
  209. package/resources/integ.jest.config.js +25 -0
  210. package/resources/templates/sqs-template.json +36 -0
  211. package/skip-tests.txt +8 -0
  212. package/tests/cli-integ-tests/README.md +47 -0
  213. package/tests/cli-integ-tests/bootstrapping.integtest.d.ts +1 -0
  214. package/tests/cli-integ-tests/bootstrapping.integtest.js +412 -0
  215. package/tests/cli-integ-tests/bootstrapping.integtest.ts +493 -0
  216. package/tests/cli-integ-tests/cli-lib.integtest.d.ts +1 -0
  217. package/tests/cli-integ-tests/cli-lib.integtest.js +62 -0
  218. package/tests/cli-integ-tests/cli-lib.integtest.ts +90 -0
  219. package/tests/cli-integ-tests/cli.integtest.d.ts +1 -0
  220. package/tests/cli-integ-tests/cli.integtest.js +2104 -0
  221. package/tests/cli-integ-tests/cli.integtest.ts +2874 -0
  222. package/tests/cli-integ-tests/garbage-collection.integtest.d.ts +1 -0
  223. package/tests/cli-integ-tests/garbage-collection.integtest.js +314 -0
  224. package/tests/cli-integ-tests/garbage-collection.integtest.ts +392 -0
  225. package/tests/init-csharp/init-csharp.integtest.d.ts +1 -0
  226. package/tests/init-csharp/init-csharp.integtest.js +14 -0
  227. package/tests/init-csharp/init-csharp.integtest.ts +15 -0
  228. package/tests/init-fsharp/init-fsharp.integtest.d.ts +1 -0
  229. package/tests/init-fsharp/init-fsharp.integtest.js +14 -0
  230. package/tests/init-fsharp/init-fsharp.integtest.ts +15 -0
  231. package/tests/init-go/init-go.integtest.d.ts +1 -0
  232. package/tests/init-go/init-go.integtest.js +21 -0
  233. package/tests/init-go/init-go.integtest.ts +23 -0
  234. package/tests/init-java/init-java.integtest.d.ts +1 -0
  235. package/tests/init-java/init-java.integtest.js +14 -0
  236. package/tests/init-java/init-java.integtest.ts +14 -0
  237. package/tests/init-javascript/init-javascript.integtest.d.ts +1 -0
  238. package/tests/init-javascript/init-javascript.integtest.js +53 -0
  239. package/tests/init-javascript/init-javascript.integtest.ts +59 -0
  240. package/tests/init-python/init-python.integtest.d.ts +1 -0
  241. package/tests/init-python/init-python.integtest.js +19 -0
  242. package/tests/init-python/init-python.integtest.ts +20 -0
  243. package/tests/init-typescript-app/init-typescript-app.integtest.d.ts +1 -0
  244. package/tests/init-typescript-app/init-typescript-app.integtest.js +54 -0
  245. package/tests/init-typescript-app/init-typescript-app.integtest.ts +66 -0
  246. package/tests/init-typescript-lib/init-typescript-lib.integtest.d.ts +1 -0
  247. package/tests/init-typescript-lib/init-typescript-lib.integtest.js +13 -0
  248. package/tests/init-typescript-lib/init-typescript-lib.integtest.ts +13 -0
  249. package/tests/tool-integrations/amplify.integtest.d.ts +1 -0
  250. package/tests/tool-integrations/amplify.integtest.js +39 -0
  251. package/tests/tool-integrations/amplify.integtest.ts +43 -0
  252. package/tests/tool-integrations/with-tool-context.d.ts +9 -0
  253. package/tests/tool-integrations/with-tool-context.js +13 -0
  254. package/tests/tool-integrations/with-tool-context.ts +14 -0
  255. package/tests/uberpackage/uberpackage.integtest.d.ts +1 -0
  256. package/tests/uberpackage/uberpackage.integtest.js +11 -0
  257. package/tests/uberpackage/uberpackage.integtest.ts +11 -0
@@ -0,0 +1,392 @@
1
+ import { BatchGetImageCommand, ListImagesCommand, PutImageCommand } from '@aws-sdk/client-ecr';
2
+ import { GetObjectTaggingCommand, ListObjectsV2Command, PutObjectTaggingCommand } from '@aws-sdk/client-s3';
3
+ import { integTest, randomString, withoutBootstrap } from '../../lib';
4
+
5
+ const S3_ISOLATED_TAG = 'aws-cdk:isolated';
6
+ const ECR_ISOLATED_TAG = 'aws-cdk.isolated';
7
+
8
+ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
9
+
10
+ integTest(
11
+ 'Garbage Collection deletes unused s3 objects',
12
+ withoutBootstrap(async (fixture) => {
13
+ const toolkitStackName = fixture.bootstrapStackName;
14
+ const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
15
+ fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
16
+
17
+ await fixture.cdkBootstrapModern({
18
+ toolkitStackName,
19
+ bootstrapBucketName,
20
+ });
21
+
22
+ await fixture.cdkDeploy('lambda', {
23
+ options: [
24
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
25
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
26
+ '--toolkit-stack-name', toolkitStackName,
27
+ '--force',
28
+ ],
29
+ });
30
+ fixture.log('Setup complete!');
31
+
32
+ await fixture.cdkDestroy('lambda', {
33
+ options: [
34
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
35
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
36
+ '--toolkit-stack-name', toolkitStackName,
37
+ '--force',
38
+ ],
39
+ });
40
+
41
+ await fixture.cdkGarbageCollect({
42
+ rollbackBufferDays: 0,
43
+ type: 's3',
44
+ bootstrapStackName: toolkitStackName,
45
+ });
46
+ fixture.log('Garbage collection complete!');
47
+
48
+ // assert that the bootstrap bucket is empty
49
+ await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }))
50
+ .then((result) => {
51
+ expect(result.Contents).toBeUndefined();
52
+ });
53
+ }),
54
+ );
55
+
56
+ integTest(
57
+ 'Garbage Collection deletes unused ecr images',
58
+ withoutBootstrap(async (fixture) => {
59
+ const toolkitStackName = fixture.bootstrapStackName;
60
+
61
+ await fixture.cdkBootstrapModern({
62
+ toolkitStackName,
63
+ });
64
+
65
+ const repoName = await fixture.bootstrapRepoName();
66
+
67
+ await fixture.cdkDeploy('docker-in-use', {
68
+ options: [
69
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
70
+ '--toolkit-stack-name', toolkitStackName,
71
+ '--force',
72
+ ],
73
+ });
74
+ fixture.log('Setup complete!');
75
+
76
+ await fixture.cdkDestroy('docker-in-use', {
77
+ options: [
78
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
79
+ '--toolkit-stack-name', toolkitStackName,
80
+ '--force',
81
+ ],
82
+ });
83
+
84
+ await fixture.cdkGarbageCollect({
85
+ rollbackBufferDays: 0,
86
+ type: 'ecr',
87
+ bootstrapStackName: toolkitStackName,
88
+ });
89
+ fixture.log('Garbage collection complete!');
90
+
91
+ // assert that the bootstrap repository is empty
92
+ await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
93
+ .then((result) => {
94
+ expect(result.imageIds).toEqual([]);
95
+ });
96
+ }),
97
+ );
98
+
99
+ integTest(
100
+ 'Garbage Collection keeps in use s3 objects',
101
+ withoutBootstrap(async (fixture) => {
102
+ const toolkitStackName = fixture.bootstrapStackName;
103
+ const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
104
+ fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
105
+
106
+ await fixture.cdkBootstrapModern({
107
+ toolkitStackName,
108
+ bootstrapBucketName,
109
+ });
110
+
111
+ await fixture.cdkDeploy('lambda', {
112
+ options: [
113
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
114
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
115
+ '--toolkit-stack-name', toolkitStackName,
116
+ '--force',
117
+ ],
118
+ });
119
+ fixture.log('Setup complete!');
120
+
121
+ await fixture.cdkGarbageCollect({
122
+ rollbackBufferDays: 0,
123
+ type: 's3',
124
+ bootstrapStackName: toolkitStackName,
125
+ });
126
+ fixture.log('Garbage collection complete!');
127
+
128
+ // assert that the bootstrap bucket has the object
129
+ await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }))
130
+ .then((result) => {
131
+ expect(result.Contents).toHaveLength(1);
132
+ });
133
+
134
+ await fixture.cdkDestroy('lambda', {
135
+ options: [
136
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
137
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
138
+ '--toolkit-stack-name', toolkitStackName,
139
+ '--force',
140
+ ],
141
+ });
142
+ fixture.log('Teardown complete!');
143
+ }),
144
+ );
145
+
146
+ integTest(
147
+ 'Garbage Collection keeps in use ecr images',
148
+ withoutBootstrap(async (fixture) => {
149
+ const toolkitStackName = fixture.bootstrapStackName;
150
+
151
+ await fixture.cdkBootstrapModern({
152
+ toolkitStackName,
153
+ });
154
+
155
+ const repoName = await fixture.bootstrapRepoName();
156
+
157
+ await fixture.cdkDeploy('docker-in-use', {
158
+ options: [
159
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
160
+ '--toolkit-stack-name', toolkitStackName,
161
+ '--force',
162
+ ],
163
+ });
164
+ fixture.log('Setup complete!');
165
+
166
+ await fixture.cdkGarbageCollect({
167
+ rollbackBufferDays: 0,
168
+ type: 'ecr',
169
+ bootstrapStackName: toolkitStackName,
170
+ });
171
+ fixture.log('Garbage collection complete!');
172
+
173
+ // assert that the bootstrap repository is empty
174
+ await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
175
+ .then((result) => {
176
+ expect(result.imageIds).toHaveLength(1);
177
+ });
178
+
179
+ await fixture.cdkDestroy('docker-in-use', {
180
+ options: [
181
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
182
+ '--toolkit-stack-name', toolkitStackName,
183
+ '--force',
184
+ ],
185
+ });
186
+ }),
187
+ );
188
+
189
+ integTest(
190
+ 'Garbage Collection tags unused s3 objects',
191
+ withoutBootstrap(async (fixture) => {
192
+ const toolkitStackName = fixture.bootstrapStackName;
193
+ const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
194
+ fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
195
+
196
+ await fixture.cdkBootstrapModern({
197
+ toolkitStackName,
198
+ bootstrapBucketName,
199
+ });
200
+
201
+ await fixture.cdkDeploy('lambda', {
202
+ options: [
203
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
204
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
205
+ '--toolkit-stack-name', toolkitStackName,
206
+ '--force',
207
+ ],
208
+ });
209
+ fixture.log('Setup complete!');
210
+
211
+ await fixture.cdkDestroy('lambda', {
212
+ options: [
213
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
214
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
215
+ '--toolkit-stack-name', toolkitStackName,
216
+ '--force',
217
+ ],
218
+ });
219
+
220
+ await fixture.cdkGarbageCollect({
221
+ rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
222
+ type: 's3',
223
+ bootstrapStackName: toolkitStackName,
224
+ });
225
+ fixture.log('Garbage collection complete!');
226
+
227
+ // assert that the bootstrap bucket has the object and is tagged
228
+ await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }))
229
+ .then(async (result) => {
230
+ expect(result.Contents).toHaveLength(2); // also the CFN template
231
+ const key = result.Contents![0].Key;
232
+ const tags = await fixture.aws.s3.send(new GetObjectTaggingCommand({ Bucket: bootstrapBucketName, Key: key }));
233
+ expect(tags.TagSet).toHaveLength(1);
234
+ });
235
+
236
+ await fixture.cdkDestroy('lambda', {
237
+ options: [
238
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
239
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
240
+ '--toolkit-stack-name', toolkitStackName,
241
+ '--force',
242
+ ],
243
+ });
244
+ }),
245
+ );
246
+
247
+ integTest(
248
+ 'Garbage Collection tags unused ecr images',
249
+ withoutBootstrap(async (fixture) => {
250
+ const toolkitStackName = fixture.bootstrapStackName;
251
+
252
+ await fixture.cdkBootstrapModern({
253
+ toolkitStackName,
254
+ });
255
+
256
+ const repoName = await fixture.bootstrapRepoName();
257
+
258
+ await fixture.cdkDeploy('docker-in-use', {
259
+ options: [
260
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
261
+ '--toolkit-stack-name', toolkitStackName,
262
+ '--force',
263
+ ],
264
+ });
265
+ fixture.log('Setup complete!');
266
+
267
+ await fixture.cdkDestroy('docker-in-use', {
268
+ options: [
269
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
270
+ '--toolkit-stack-name', toolkitStackName,
271
+ '--force',
272
+ ],
273
+ });
274
+
275
+ await fixture.cdkGarbageCollect({
276
+ rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
277
+ type: 'ecr',
278
+ bootstrapStackName: toolkitStackName,
279
+ });
280
+ fixture.log('Garbage collection complete!');
281
+
282
+ await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
283
+ .then((result) => {
284
+ expect(result.imageIds).toHaveLength(2); // the second tag comes in as a second 'id'
285
+ });
286
+ }),
287
+ );
288
+
289
+ integTest(
290
+ 'Garbage Collection untags in-use s3 objects',
291
+ withoutBootstrap(async (fixture) => {
292
+ const toolkitStackName = fixture.bootstrapStackName;
293
+ const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
294
+ fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
295
+
296
+ await fixture.cdkBootstrapModern({
297
+ toolkitStackName,
298
+ bootstrapBucketName,
299
+ });
300
+
301
+ await fixture.cdkDeploy('lambda', {
302
+ options: [
303
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
304
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
305
+ '--toolkit-stack-name', toolkitStackName,
306
+ '--force',
307
+ ],
308
+ });
309
+ fixture.log('Setup complete!');
310
+
311
+ // Artificially add tagging to the asset in the bootstrap bucket
312
+ const result = await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }));
313
+ const key = result.Contents!.filter((c) => c.Key?.split('.')[1] == 'zip')[0].Key; // fancy footwork to make sure we have the asset key
314
+ await fixture.aws.s3.send(new PutObjectTaggingCommand({
315
+ Bucket: bootstrapBucketName,
316
+ Key: key,
317
+ Tagging: {
318
+ TagSet: [{
319
+ Key: S3_ISOLATED_TAG,
320
+ Value: '12345',
321
+ }, {
322
+ Key: 'bogus',
323
+ Value: 'val',
324
+ }],
325
+ },
326
+ }));
327
+
328
+ await fixture.cdkGarbageCollect({
329
+ rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
330
+ type: 's3',
331
+ bootstrapStackName: toolkitStackName,
332
+ });
333
+ fixture.log('Garbage collection complete!');
334
+
335
+ // assert that the isolated object tag is removed while the other tag remains
336
+ const newTags = await fixture.aws.s3.send(new GetObjectTaggingCommand({ Bucket: bootstrapBucketName, Key: key }));
337
+
338
+ expect(newTags.TagSet).toEqual([{
339
+ Key: 'bogus',
340
+ Value: 'val',
341
+ }]);
342
+ }),
343
+ );
344
+
345
+ integTest(
346
+ 'Garbage Collection untags in-use ecr images',
347
+ withoutBootstrap(async (fixture) => {
348
+ const toolkitStackName = fixture.bootstrapStackName;
349
+
350
+ await fixture.cdkBootstrapModern({
351
+ toolkitStackName,
352
+ });
353
+
354
+ const repoName = await fixture.bootstrapRepoName();
355
+
356
+ await fixture.cdkDeploy('docker-in-use', {
357
+ options: [
358
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
359
+ '--toolkit-stack-name', toolkitStackName,
360
+ '--force',
361
+ ],
362
+ });
363
+ fixture.log('Setup complete!');
364
+
365
+ // Artificially add tagging to the asset in the bootstrap bucket
366
+ const imageIds = await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }));
367
+ const digest = imageIds.imageIds![0].imageDigest;
368
+ const imageManifests = await fixture.aws.ecr.send(new BatchGetImageCommand({ repositoryName: repoName, imageIds: [{ imageDigest: digest }] }));
369
+ const manifest = imageManifests.images![0].imageManifest;
370
+ await fixture.aws.ecr.send(new PutImageCommand({ repositoryName: repoName, imageManifest: manifest, imageDigest: digest, imageTag: `0-${ECR_ISOLATED_TAG}-12345` }));
371
+
372
+ await fixture.cdkGarbageCollect({
373
+ rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
374
+ type: 'ecr',
375
+ bootstrapStackName: toolkitStackName,
376
+ });
377
+ fixture.log('Garbage collection complete!');
378
+
379
+ await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
380
+ .then((result) => {
381
+ expect(result.imageIds).toHaveLength(1); // the second tag has been removed
382
+ });
383
+
384
+ await fixture.cdkDestroy('docker-in-use', {
385
+ options: [
386
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
387
+ '--toolkit-stack-name', toolkitStackName,
388
+ '--force',
389
+ ],
390
+ });
391
+ }),
392
+ );
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../lib");
4
+ ['app', 'sample-app'].forEach(template => {
5
+ (0, lib_1.integTest)(`init C♯ ${template}`, (0, lib_1.withTemporaryDirectory)((0, lib_1.withPackages)(async (context) => {
6
+ context.packages.assertJsiiPackagesAvailable();
7
+ const shell = lib_1.ShellHelper.fromContext(context);
8
+ await context.packages.makeCliAvailable();
9
+ await shell.shell(['cdk', 'init', '-l', 'csharp', template]);
10
+ await context.packages.initializeDotnetPackages(context.integTestDir);
11
+ await shell.shell(['cdk', 'synth']);
12
+ })));
13
+ });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1jc2hhcnAuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW5pdC1jc2hhcnAuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQXlGO0FBRXpGLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtJQUN2QyxJQUFBLGVBQVMsRUFBQyxXQUFXLFFBQVEsRUFBRSxFQUFFLElBQUEsNEJBQXNCLEVBQUMsSUFBQSxrQkFBWSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNyRixPQUFPLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFFL0MsTUFBTSxLQUFLLEdBQUcsaUJBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFMUMsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RSxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aFRlbXBvcmFyeURpcmVjdG9yeSwgU2hlbGxIZWxwZXIsIHdpdGhQYWNrYWdlcyB9IGZyb20gJy4uLy4uL2xpYic7XG5cblsnYXBwJywgJ3NhbXBsZS1hcHAnXS5mb3JFYWNoKHRlbXBsYXRlID0+IHtcbiAgaW50ZWdUZXN0KGBpbml0IEPima8gJHt0ZW1wbGF0ZX1gLCB3aXRoVGVtcG9yYXJ5RGlyZWN0b3J5KHdpdGhQYWNrYWdlcyhhc3luYyAoY29udGV4dCkgPT4ge1xuICAgIGNvbnRleHQucGFja2FnZXMuYXNzZXJ0SnNpaVBhY2thZ2VzQXZhaWxhYmxlKCk7XG5cbiAgICBjb25zdCBzaGVsbCA9IFNoZWxsSGVscGVyLmZyb21Db250ZXh0KGNvbnRleHQpO1xuICAgIGF3YWl0IGNvbnRleHQucGFja2FnZXMubWFrZUNsaUF2YWlsYWJsZSgpO1xuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWydjZGsnLCAnaW5pdCcsICctbCcsICdjc2hhcnAnLCB0ZW1wbGF0ZV0pO1xuICAgIGF3YWl0IGNvbnRleHQucGFja2FnZXMuaW5pdGlhbGl6ZURvdG5ldFBhY2thZ2VzKGNvbnRleHQuaW50ZWdUZXN0RGlyKTtcbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ2NkaycsICdzeW50aCddKTtcbiAgfSkpKTtcbn0pO1xuXG4iXX0=
@@ -0,0 +1,15 @@
1
+ import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
2
+
3
+ ['app', 'sample-app'].forEach(template => {
4
+ integTest(`init C♯ ${template}`, withTemporaryDirectory(withPackages(async (context) => {
5
+ context.packages.assertJsiiPackagesAvailable();
6
+
7
+ const shell = ShellHelper.fromContext(context);
8
+ await context.packages.makeCliAvailable();
9
+
10
+ await shell.shell(['cdk', 'init', '-l', 'csharp', template]);
11
+ await context.packages.initializeDotnetPackages(context.integTestDir);
12
+ await shell.shell(['cdk', 'synth']);
13
+ })));
14
+ });
15
+
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../lib");
4
+ ['app', 'sample-app'].forEach(template => {
5
+ (0, lib_1.integTest)(`init F♯ ${template}`, (0, lib_1.withTemporaryDirectory)((0, lib_1.withPackages)(async (context) => {
6
+ context.packages.assertJsiiPackagesAvailable();
7
+ const shell = lib_1.ShellHelper.fromContext(context);
8
+ await context.packages.makeCliAvailable();
9
+ await shell.shell(['cdk', 'init', '-l', 'fsharp', template]);
10
+ await context.packages.initializeDotnetPackages(context.integTestDir);
11
+ await shell.shell(['cdk', 'synth']);
12
+ })));
13
+ });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1mc2hhcnAuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW5pdC1mc2hhcnAuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQXlGO0FBRXpGLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtJQUN2QyxJQUFBLGVBQVMsRUFBQyxXQUFXLFFBQVEsRUFBRSxFQUFFLElBQUEsNEJBQXNCLEVBQUMsSUFBQSxrQkFBWSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNyRixPQUFPLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFFL0MsTUFBTSxLQUFLLEdBQUcsaUJBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFMUMsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RSxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aFRlbXBvcmFyeURpcmVjdG9yeSwgU2hlbGxIZWxwZXIsIHdpdGhQYWNrYWdlcyB9IGZyb20gJy4uLy4uL2xpYic7XG5cblsnYXBwJywgJ3NhbXBsZS1hcHAnXS5mb3JFYWNoKHRlbXBsYXRlID0+IHtcbiAgaW50ZWdUZXN0KGBpbml0IEbima8gJHt0ZW1wbGF0ZX1gLCB3aXRoVGVtcG9yYXJ5RGlyZWN0b3J5KHdpdGhQYWNrYWdlcyhhc3luYyAoY29udGV4dCkgPT4ge1xuICAgIGNvbnRleHQucGFja2FnZXMuYXNzZXJ0SnNpaVBhY2thZ2VzQXZhaWxhYmxlKCk7XG5cbiAgICBjb25zdCBzaGVsbCA9IFNoZWxsSGVscGVyLmZyb21Db250ZXh0KGNvbnRleHQpO1xuICAgIGF3YWl0IGNvbnRleHQucGFja2FnZXMubWFrZUNsaUF2YWlsYWJsZSgpO1xuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWydjZGsnLCAnaW5pdCcsICctbCcsICdmc2hhcnAnLCB0ZW1wbGF0ZV0pO1xuICAgIGF3YWl0IGNvbnRleHQucGFja2FnZXMuaW5pdGlhbGl6ZURvdG5ldFBhY2thZ2VzKGNvbnRleHQuaW50ZWdUZXN0RGlyKTtcbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ2NkaycsICdzeW50aCddKTtcbiAgfSkpKTtcbn0pO1xuXG4iXX0=
@@ -0,0 +1,15 @@
1
+ import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
2
+
3
+ ['app', 'sample-app'].forEach(template => {
4
+ integTest(`init F♯ ${template}`, withTemporaryDirectory(withPackages(async (context) => {
5
+ context.packages.assertJsiiPackagesAvailable();
6
+
7
+ const shell = ShellHelper.fromContext(context);
8
+ await context.packages.makeCliAvailable();
9
+
10
+ await shell.shell(['cdk', 'init', '-l', 'fsharp', template]);
11
+ await context.packages.initializeDotnetPackages(context.integTestDir);
12
+ await shell.shell(['cdk', 'synth']);
13
+ })));
14
+ });
15
+
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../lib");
4
+ ['app', 'sample-app'].forEach(template => {
5
+ (0, lib_1.integTest)(`init go ${template}`, (0, lib_1.withTemporaryDirectory)((0, lib_1.withPackages)(async (context) => {
6
+ const isCanary = !!process.env.IS_CANARY;
7
+ context.packages.assertJsiiPackagesAvailable();
8
+ const shell = lib_1.ShellHelper.fromContext(context);
9
+ await context.packages.makeCliAvailable();
10
+ await shell.shell(['cdk', 'init', '-l', 'go', template]);
11
+ // Canaries will use the generated go.mod as is
12
+ // For pipeline tests we replace the source with the locally build one
13
+ if (!isCanary) {
14
+ await shell.shell(['go', 'mod', 'edit', '-replace', 'github.com/aws/aws-cdk-go/awscdk/v2=$CODEBUILD_SRC_DIR/go/awscdk']);
15
+ }
16
+ await shell.shell(['go', 'mod', 'tidy']);
17
+ await shell.shell(['go', 'test']);
18
+ await shell.shell(['cdk', 'synth']);
19
+ })));
20
+ });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1nby5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbml0LWdvLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUF5RjtBQUV6RixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7SUFDdkMsSUFBQSxlQUFTLEVBQUMsV0FBVyxRQUFRLEVBQUUsRUFBRSxJQUFBLDRCQUFzQixFQUFDLElBQUEsa0JBQVksRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDckYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUUvQyxNQUFNLEtBQUssR0FBRyxpQkFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUUxQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUV6RCwrQ0FBK0M7UUFDL0Msc0VBQXNFO1FBQ3RFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxrRUFBa0UsQ0FBQyxDQUFDLENBQUM7UUFDM0gsQ0FBQztRQUVELE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aFRlbXBvcmFyeURpcmVjdG9yeSwgU2hlbGxIZWxwZXIsIHdpdGhQYWNrYWdlcyB9IGZyb20gJy4uLy4uL2xpYic7XG5cblsnYXBwJywgJ3NhbXBsZS1hcHAnXS5mb3JFYWNoKHRlbXBsYXRlID0+IHtcbiAgaW50ZWdUZXN0KGBpbml0IGdvICR7dGVtcGxhdGV9YCwgd2l0aFRlbXBvcmFyeURpcmVjdG9yeSh3aXRoUGFja2FnZXMoYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICBjb25zdCBpc0NhbmFyeSA9ICEhcHJvY2Vzcy5lbnYuSVNfQ0FOQVJZO1xuICAgIGNvbnRleHQucGFja2FnZXMuYXNzZXJ0SnNpaVBhY2thZ2VzQXZhaWxhYmxlKCk7XG5cbiAgICBjb25zdCBzaGVsbCA9IFNoZWxsSGVscGVyLmZyb21Db250ZXh0KGNvbnRleHQpO1xuICAgIGF3YWl0IGNvbnRleHQucGFja2FnZXMubWFrZUNsaUF2YWlsYWJsZSgpO1xuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWydjZGsnLCAnaW5pdCcsICctbCcsICdnbycsIHRlbXBsYXRlXSk7XG5cbiAgICAvLyBDYW5hcmllcyB3aWxsIHVzZSB0aGUgZ2VuZXJhdGVkIGdvLm1vZCBhcyBpc1xuICAgIC8vIEZvciBwaXBlbGluZSB0ZXN0cyB3ZSByZXBsYWNlIHRoZSBzb3VyY2Ugd2l0aCB0aGUgbG9jYWxseSBidWlsZCBvbmVcbiAgICBpZiAoIWlzQ2FuYXJ5KSB7XG4gICAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ2dvJywgJ21vZCcsICdlZGl0JywgJy1yZXBsYWNlJywgJ2dpdGh1Yi5jb20vYXdzL2F3cy1jZGstZ28vYXdzY2RrL3YyPSRDT0RFQlVJTERfU1JDX0RJUi9nby9hd3NjZGsnXSk7XG4gICAgfVxuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWydnbycsICdtb2QnLCAndGlkeSddKTtcbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ2dvJywgJ3Rlc3QnXSk7XG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWydjZGsnLCAnc3ludGgnXSk7XG4gIH0pKSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,23 @@
1
+ import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
2
+
3
+ ['app', 'sample-app'].forEach(template => {
4
+ integTest(`init go ${template}`, withTemporaryDirectory(withPackages(async (context) => {
5
+ const isCanary = !!process.env.IS_CANARY;
6
+ context.packages.assertJsiiPackagesAvailable();
7
+
8
+ const shell = ShellHelper.fromContext(context);
9
+ await context.packages.makeCliAvailable();
10
+
11
+ await shell.shell(['cdk', 'init', '-l', 'go', template]);
12
+
13
+ // Canaries will use the generated go.mod as is
14
+ // For pipeline tests we replace the source with the locally build one
15
+ if (!isCanary) {
16
+ await shell.shell(['go', 'mod', 'edit', '-replace', 'github.com/aws/aws-cdk-go/awscdk/v2=$CODEBUILD_SRC_DIR/go/awscdk']);
17
+ }
18
+
19
+ await shell.shell(['go', 'mod', 'tidy']);
20
+ await shell.shell(['go', 'test']);
21
+ await shell.shell(['cdk', 'synth']);
22
+ })));
23
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../lib");
4
+ ['app', 'sample-app'].forEach(template => {
5
+ (0, lib_1.integTest)(`init java ${template}`, (0, lib_1.withTemporaryDirectory)((0, lib_1.withPackages)(async (context) => {
6
+ context.packages.assertJsiiPackagesAvailable();
7
+ const shell = lib_1.ShellHelper.fromContext(context);
8
+ await context.packages.makeCliAvailable();
9
+ await shell.shell(['cdk', 'init', '-l', 'java', template]);
10
+ await shell.shell(['mvn', 'package']);
11
+ await shell.shell(['cdk', 'synth']);
12
+ })));
13
+ });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1qYXZhLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluaXQtamF2YS5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBeUY7QUFFekYsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO0lBQ3ZDLElBQUEsZUFBUyxFQUFDLGFBQWEsUUFBUSxFQUFFLEVBQUUsSUFBQSw0QkFBc0IsRUFBQyxJQUFBLGtCQUFZLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3ZGLE9BQU8sQ0FBQyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUUvQyxNQUFNLEtBQUssR0FBRyxpQkFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUUxQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aFRlbXBvcmFyeURpcmVjdG9yeSwgU2hlbGxIZWxwZXIsIHdpdGhQYWNrYWdlcyB9IGZyb20gJy4uLy4uL2xpYic7XG5cblsnYXBwJywgJ3NhbXBsZS1hcHAnXS5mb3JFYWNoKHRlbXBsYXRlID0+IHtcbiAgaW50ZWdUZXN0KGBpbml0IGphdmEgJHt0ZW1wbGF0ZX1gLCB3aXRoVGVtcG9yYXJ5RGlyZWN0b3J5KHdpdGhQYWNrYWdlcyhhc3luYyAoY29udGV4dCkgPT4ge1xuICAgIGNvbnRleHQucGFja2FnZXMuYXNzZXJ0SnNpaVBhY2thZ2VzQXZhaWxhYmxlKCk7XG5cbiAgICBjb25zdCBzaGVsbCA9IFNoZWxsSGVscGVyLmZyb21Db250ZXh0KGNvbnRleHQpO1xuICAgIGF3YWl0IGNvbnRleHQucGFja2FnZXMubWFrZUNsaUF2YWlsYWJsZSgpO1xuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWydjZGsnLCAnaW5pdCcsICctbCcsICdqYXZhJywgdGVtcGxhdGVdKTtcbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ212bicsICdwYWNrYWdlJ10pO1xuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnY2RrJywgJ3N5bnRoJ10pO1xuICB9KSkpO1xufSk7XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
2
+
3
+ ['app', 'sample-app'].forEach(template => {
4
+ integTest(`init java ${template}`, withTemporaryDirectory(withPackages(async (context) => {
5
+ context.packages.assertJsiiPackagesAvailable();
6
+
7
+ const shell = ShellHelper.fromContext(context);
8
+ await context.packages.makeCliAvailable();
9
+
10
+ await shell.shell(['cdk', 'init', '-l', 'java', template]);
11
+ await shell.shell(['mvn', 'package']);
12
+ await shell.shell(['cdk', 'synth']);
13
+ })));
14
+ });
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const path = require("path");
4
+ const fs = require("fs-extra");
5
+ const lib_1 = require("../../lib");
6
+ ['app', 'sample-app'].forEach(template => {
7
+ (0, lib_1.integTest)(`init javascript ${template}`, (0, lib_1.withTemporaryDirectory)((0, lib_1.withPackages)(async (context) => {
8
+ const shell = lib_1.ShellHelper.fromContext(context);
9
+ await context.packages.makeCliAvailable();
10
+ await shell.shell(['cdk', 'init', '-l', 'javascript', template]);
11
+ await shell.shell(['npm', 'prune']);
12
+ await shell.shell(['npm', 'ls']); // this will fail if we have unmet peer dependencies
13
+ await shell.shell(['npm', 'run', 'test']);
14
+ await shell.shell(['cdk', 'synth']);
15
+ })));
16
+ });
17
+ (0, lib_1.integTest)('Test importing CDK from ESM', (0, lib_1.withTemporaryDirectory)((0, lib_1.withPackages)(async (context) => {
18
+ // Use 'cdk init -l=javascript' to get set up, but use a different file
19
+ const shell = lib_1.ShellHelper.fromContext(context);
20
+ await context.packages.makeCliAvailable();
21
+ await shell.shell(['cdk', 'init', '-l', 'javascript', 'app']);
22
+ // Rewrite some files
23
+ await fs.writeFile(path.join(context.integTestDir, 'new-entrypoint.mjs'), `
24
+ // Test multiple styles of imports
25
+ import { Stack, aws_sns as sns } from 'aws-cdk-lib';
26
+ import { SqsSubscription } from 'aws-cdk-lib/aws-sns-subscriptions';
27
+ import * as sqs from 'aws-cdk-lib/aws-sqs';
28
+ import * as cdk from 'aws-cdk-lib';
29
+
30
+ class TestjsStack extends Stack {
31
+ constructor(scope, id, props) {
32
+ super(scope, id, props);
33
+
34
+ const queue = new sqs.Queue(this, 'TestjsQueue', {
35
+ visibilityTimeout: cdk.Duration.seconds(300)
36
+ });
37
+
38
+ const topic = new sns.Topic(this, 'TestjsTopic');
39
+
40
+ topic.addSubscription(new SqsSubscription(queue));
41
+ }
42
+ }
43
+
44
+ const app = new cdk.App();
45
+ new TestjsStack(app, 'TestjsStack');
46
+ `, { encoding: 'utf-8' });
47
+ // Rewrite 'cdk.json' to use new entrypoint
48
+ const cdkJson = await fs.readJson(path.join(context.integTestDir, 'cdk.json'));
49
+ cdkJson.app = 'node new-entrypoint.mjs';
50
+ await fs.writeJson(path.join(context.integTestDir, 'cdk.json'), cdkJson);
51
+ await shell.shell(['cdk', 'synth']);
52
+ })));
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1qYXZhc2NyaXB0LmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluaXQtamF2YXNjcmlwdC5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLG1DQUF5RjtBQUV6RixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7SUFDdkMsSUFBQSxlQUFTLEVBQUMsbUJBQW1CLFFBQVEsRUFBRSxFQUFFLElBQUEsNEJBQXNCLEVBQUMsSUFBQSxrQkFBWSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUM3RixNQUFNLEtBQUssR0FBRyxpQkFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUUxQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNqRSxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9EQUFvRDtRQUN0RixNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFMUMsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLGVBQVMsRUFBQyw2QkFBNkIsRUFBRSxJQUFBLDRCQUFzQixFQUFDLElBQUEsa0JBQVksRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDN0YsdUVBQXVFO0lBQ3ZFLE1BQU0sS0FBSyxHQUFHLGlCQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBRTFDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRTlELHFCQUFxQjtJQUNyQixNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLG9CQUFvQixDQUFDLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdUIzRSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFeEIsMkNBQTJDO0lBQzNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUMvRSxPQUFPLENBQUMsR0FBRyxHQUFHLHlCQUF5QixDQUFDO0lBQ3hDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFekUsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFdEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aFRlbXBvcmFyeURpcmVjdG9yeSwgU2hlbGxIZWxwZXIsIHdpdGhQYWNrYWdlcyB9IGZyb20gJy4uLy4uL2xpYic7XG5cblsnYXBwJywgJ3NhbXBsZS1hcHAnXS5mb3JFYWNoKHRlbXBsYXRlID0+IHtcbiAgaW50ZWdUZXN0KGBpbml0IGphdmFzY3JpcHQgJHt0ZW1wbGF0ZX1gLCB3aXRoVGVtcG9yYXJ5RGlyZWN0b3J5KHdpdGhQYWNrYWdlcyhhc3luYyAoY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHNoZWxsID0gU2hlbGxIZWxwZXIuZnJvbUNvbnRleHQoY29udGV4dCk7XG4gICAgYXdhaXQgY29udGV4dC5wYWNrYWdlcy5tYWtlQ2xpQXZhaWxhYmxlKCk7XG5cbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ2NkaycsICdpbml0JywgJy1sJywgJ2phdmFzY3JpcHQnLCB0ZW1wbGF0ZV0pO1xuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJ3BydW5lJ10pO1xuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJ2xzJ10pOyAvLyB0aGlzIHdpbGwgZmFpbCBpZiB3ZSBoYXZlIHVubWV0IHBlZXIgZGVwZW5kZW5jaWVzXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWyducG0nLCAncnVuJywgJ3Rlc3QnXSk7XG5cbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ2NkaycsICdzeW50aCddKTtcbiAgfSkpKTtcbn0pO1xuXG5pbnRlZ1Rlc3QoJ1Rlc3QgaW1wb3J0aW5nIENESyBmcm9tIEVTTScsIHdpdGhUZW1wb3JhcnlEaXJlY3Rvcnkod2l0aFBhY2thZ2VzKGFzeW5jIChjb250ZXh0KSA9PiB7XG4gIC8vIFVzZSAnY2RrIGluaXQgLWw9amF2YXNjcmlwdCcgdG8gZ2V0IHNldCB1cCwgYnV0IHVzZSBhIGRpZmZlcmVudCBmaWxlXG4gIGNvbnN0IHNoZWxsID0gU2hlbGxIZWxwZXIuZnJvbUNvbnRleHQoY29udGV4dCk7XG4gIGF3YWl0IGNvbnRleHQucGFja2FnZXMubWFrZUNsaUF2YWlsYWJsZSgpO1xuXG4gIGF3YWl0IHNoZWxsLnNoZWxsKFsnY2RrJywgJ2luaXQnLCAnLWwnLCAnamF2YXNjcmlwdCcsICdhcHAnXSk7XG5cbiAgLy8gUmV3cml0ZSBzb21lIGZpbGVzXG4gIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29udGV4dC5pbnRlZ1Rlc3REaXIsICduZXctZW50cnlwb2ludC5tanMnKSwgYFxuLy8gVGVzdCBtdWx0aXBsZSBzdHlsZXMgb2YgaW1wb3J0c1xuaW1wb3J0IHsgU3RhY2ssIGF3c19zbnMgYXMgc25zIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgU3FzU3Vic2NyaXB0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucy1zdWJzY3JpcHRpb25zJztcbmltcG9ydCAqIGFzIHNxcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3FzJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5cbmNsYXNzIFRlc3Rqc1N0YWNrIGV4dGVuZHMgU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZSwgaWQsIHByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBzcXMuUXVldWUodGhpcywgJ1Rlc3Rqc1F1ZXVlJywge1xuICAgICAgdmlzaWJpbGl0eVRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwMClcbiAgICB9KTtcblxuICAgIGNvbnN0IHRvcGljID0gbmV3IHNucy5Ub3BpYyh0aGlzLCAnVGVzdGpzVG9waWMnKTtcblxuICAgIHRvcGljLmFkZFN1YnNjcmlwdGlvbihuZXcgU3FzU3Vic2NyaXB0aW9uKHF1ZXVlKSk7XG4gIH1cbn1cblxuY29uc3QgYXBwID0gbmV3IGNkay5BcHAoKTtcbm5ldyBUZXN0anNTdGFjayhhcHAsICdUZXN0anNTdGFjaycpO1xuYCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAvLyBSZXdyaXRlICdjZGsuanNvbicgdG8gdXNlIG5ldyBlbnRyeXBvaW50XG4gIGNvbnN0IGNka0pzb24gPSBhd2FpdCBmcy5yZWFkSnNvbihwYXRoLmpvaW4oY29udGV4dC5pbnRlZ1Rlc3REaXIsICdjZGsuanNvbicpKTtcbiAgY2RrSnNvbi5hcHAgPSAnbm9kZSBuZXctZW50cnlwb2ludC5tanMnO1xuICBhd2FpdCBmcy53cml0ZUpzb24ocGF0aC5qb2luKGNvbnRleHQuaW50ZWdUZXN0RGlyLCAnY2RrLmpzb24nKSwgY2RrSnNvbik7XG5cbiAgYXdhaXQgc2hlbGwuc2hlbGwoWydjZGsnLCAnc3ludGgnXSk7XG5cbn0pKSk7XG4iXX0=