@aws-cdk-testing/cli-integ 2.61.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 (165) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +16 -0
  3. package/README.md +151 -0
  4. package/bin/apply-patches +19 -0
  5. package/bin/download-and-run-old-tests +52 -0
  6. package/bin/query-github +2 -0
  7. package/bin/query-github.d.ts +1 -0
  8. package/bin/query-github.js +55 -0
  9. package/bin/run-suite +2 -0
  10. package/bin/run-suite.d.ts +1 -0
  11. package/bin/run-suite.js +126 -0
  12. package/bin/stage-distribution +2 -0
  13. package/bin/stage-distribution.d.ts +1 -0
  14. package/bin/stage-distribution.js +209 -0
  15. package/bin/test-root +2 -0
  16. package/bin/test-root.d.ts +1 -0
  17. package/bin/test-root.js +6 -0
  18. package/entrypoints/test-cli-regression-against-current-code.sh +11 -0
  19. package/entrypoints/test-cli-regression-against-latest-release.sh +11 -0
  20. package/entrypoints/test-cli-regression.bash +83 -0
  21. package/entrypoints/test.sh +12 -0
  22. package/lib/aws.d.ts +55 -0
  23. package/lib/aws.js +243 -0
  24. package/lib/corking.d.ts +13 -0
  25. package/lib/corking.js +34 -0
  26. package/lib/files.d.ts +15 -0
  27. package/lib/files.js +80 -0
  28. package/lib/github.d.ts +4 -0
  29. package/lib/github.js +43 -0
  30. package/lib/index.d.ts +12 -0
  31. package/lib/index.js +25 -0
  32. package/lib/integ-test.d.ts +11 -0
  33. package/lib/integ-test.js +55 -0
  34. package/lib/lists.d.ts +1 -0
  35. package/lib/lists.js +12 -0
  36. package/lib/memoize.d.ts +6 -0
  37. package/lib/memoize.js +19 -0
  38. package/lib/npm.d.ts +4 -0
  39. package/lib/npm.js +15 -0
  40. package/lib/package-sources/release-source.d.ts +22 -0
  41. package/lib/package-sources/release-source.js +67 -0
  42. package/lib/package-sources/repo-source.d.ts +23 -0
  43. package/lib/package-sources/repo-source.js +92 -0
  44. package/lib/package-sources/repo-tools/npm +2 -0
  45. package/lib/package-sources/repo-tools/npm.d.ts +1 -0
  46. package/lib/package-sources/repo-tools/npm.js +42 -0
  47. package/lib/package-sources/source.d.ts +24 -0
  48. package/lib/package-sources/source.js +3 -0
  49. package/lib/package-sources/subprocess.d.ts +3 -0
  50. package/lib/package-sources/subprocess.js +18 -0
  51. package/lib/resource-pool.d.ts +54 -0
  52. package/lib/resource-pool.js +120 -0
  53. package/lib/resources.d.ts +1 -0
  54. package/lib/resources.js +6 -0
  55. package/lib/shell.d.ts +59 -0
  56. package/lib/shell.js +118 -0
  57. package/lib/staging/codeartifact.d.ts +44 -0
  58. package/lib/staging/codeartifact.js +258 -0
  59. package/lib/staging/maven.d.ts +5 -0
  60. package/lib/staging/maven.js +83 -0
  61. package/lib/staging/npm.d.ts +4 -0
  62. package/lib/staging/npm.js +56 -0
  63. package/lib/staging/nuget.d.ts +4 -0
  64. package/lib/staging/nuget.js +71 -0
  65. package/lib/staging/parallel-shell.d.ts +6 -0
  66. package/lib/staging/parallel-shell.js +46 -0
  67. package/lib/staging/pypi.d.ts +4 -0
  68. package/lib/staging/pypi.js +49 -0
  69. package/lib/staging/usage-dir.d.ts +31 -0
  70. package/lib/staging/usage-dir.js +87 -0
  71. package/lib/with-aws.d.ts +13 -0
  72. package/lib/with-aws.js +60 -0
  73. package/lib/with-cdk-app.d.ts +146 -0
  74. package/lib/with-cdk-app.js +398 -0
  75. package/lib/with-packages.d.ts +5 -0
  76. package/lib/with-packages.js +14 -0
  77. package/lib/with-sam.d.ts +33 -0
  78. package/lib/with-sam.js +240 -0
  79. package/lib/with-temporary-directory.d.ts +5 -0
  80. package/lib/with-temporary-directory.js +32 -0
  81. package/lib/xpmutex.d.ts +43 -0
  82. package/lib/xpmutex.js +207 -0
  83. package/package.json +73 -0
  84. package/resources/cdk-apps/app/app.js +463 -0
  85. package/resources/cdk-apps/app/cdk.json +7 -0
  86. package/resources/cdk-apps/app/docker/Dockerfile +2 -0
  87. package/resources/cdk-apps/app/docker/Dockerfile.Custom +2 -0
  88. package/resources/cdk-apps/app/lambda/index.js +4 -0
  89. package/resources/cdk-apps/app/lambda/response.json +3 -0
  90. package/resources/cdk-apps/app/nested-stack.js +49 -0
  91. package/resources/cdk-apps/cfn-include-app/.gitignore +1 -0
  92. package/resources/cdk-apps/cfn-include-app/cdk.json +4 -0
  93. package/resources/cdk-apps/cfn-include-app/cfn-include-app.js +21 -0
  94. package/resources/cdk-apps/cfn-include-app/example-template.json +13 -0
  95. package/resources/cdk-apps/sam_cdk_integ_app/bin/test-app.js +11 -0
  96. package/resources/cdk-apps/sam_cdk_integ_app/cdk.json +6 -0
  97. package/resources/cdk-apps/sam_cdk_integ_app/lib/nested-stack.js +19 -0
  98. package/resources/cdk-apps/sam_cdk_integ_app/lib/test-stack.js +134 -0
  99. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/.no-packagejson-validator +0 -0
  100. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/Dockerfile +9 -0
  101. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/app.js +22 -0
  102. package/resources/cdk-apps/sam_cdk_integ_app/src/docker/DockerImageFunctionConstruct/package.json +18 -0
  103. package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.mod +5 -0
  104. package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/go.sum +17 -0
  105. package/resources/cdk-apps/sam_cdk_integ_app/src/go/GoFunctionConstruct/main.go +17 -0
  106. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/.no-packagejson-validator +0 -0
  107. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/app.ts +16 -0
  108. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package-lock.json +12 -0
  109. package/resources/cdk-apps/sam_cdk_integ_app/src/nodejs/NodeJsFunctionConstruct/package.json +5 -0
  110. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/app.py +15 -0
  111. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Function/requirements.txt +1 -0
  112. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/layer_version_dependency.py +5 -0
  113. package/resources/cdk-apps/sam_cdk_integ_app/src/python/Layer/requirements.txt +1 -0
  114. package/resources/cdk-apps/sam_cdk_integ_app/src/rest-api-definition.yaml +12 -0
  115. package/resources/cli-regression-patches/v1.119.0/NOTES.md +5 -0
  116. package/resources/cli-regression-patches/v1.119.0/cli.integtest.js +659 -0
  117. package/resources/cli-regression-patches/v1.130.0/NOTES.md +12 -0
  118. package/resources/cli-regression-patches/v1.130.0/app/app.js +378 -0
  119. package/resources/cli-regression-patches/v1.130.0/bootstrapping.integtest.js +220 -0
  120. package/resources/cli-regression-patches/v1.44.0/NOTES.md +18 -0
  121. package/resources/cli-regression-patches/v1.44.0/bootstrapping.integtest.js +126 -0
  122. package/resources/cli-regression-patches/v1.44.0/test.sh +26 -0
  123. package/resources/cli-regression-patches/v1.61.1/NOTES.md +2 -0
  124. package/resources/cli-regression-patches/v1.61.1/skip-tests.txt +16 -0
  125. package/resources/cli-regression-patches/v1.62.0/NOTES.md +2 -0
  126. package/resources/cli-regression-patches/v1.62.0/aws-helpers.js +245 -0
  127. package/resources/cli-regression-patches/v1.63.0/NOTES.md +1 -0
  128. package/resources/cli-regression-patches/v1.63.0/skip-tests.txt +7 -0
  129. package/resources/cli-regression-patches/v1.64.0/NOTES.md +3 -0
  130. package/resources/cli-regression-patches/v1.64.0/cdk-helpers.js +325 -0
  131. package/resources/cli-regression-patches/v1.64.0/cli.integtest.js +599 -0
  132. package/resources/cli-regression-patches/v1.64.1/NOTES.md +3 -0
  133. package/resources/cli-regression-patches/v1.64.1/cdk-helpers.js +324 -0
  134. package/resources/cli-regression-patches/v1.64.1/cli.integtest.js +599 -0
  135. package/resources/cli-regression-patches/v1.67.0/NOTES.md +2 -0
  136. package/resources/cli-regression-patches/v1.67.0/cdk-helpers.js +331 -0
  137. package/resources/cloud-assemblies/0.36.0/InitStack.template.json +1 -0
  138. package/resources/cloud-assemblies/0.36.0/manifest.json +19 -0
  139. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/InitStack.template.json +2 -0
  140. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/manifest.json.js +37 -0
  141. package/resources/cloud-assemblies/1.10.0-request-azs/InitStack.template.json +2 -0
  142. package/resources/cloud-assemblies/1.10.0-request-azs/manifest.json.js +34 -0
  143. package/resources/integ.jest.config.js +25 -0
  144. package/skip-tests.txt +8 -0
  145. package/tests/cli-integ-tests/README.md +47 -0
  146. package/tests/cli-integ-tests/bootstrapping.integtest.d.ts +1 -0
  147. package/tests/cli-integ-tests/bootstrapping.integtest.js +271 -0
  148. package/tests/cli-integ-tests/cli.integtest.d.ts +1 -0
  149. package/tests/cli-integ-tests/cli.integtest.js +1029 -0
  150. package/tests/init-csharp/init-csharp.integtest.d.ts +1 -0
  151. package/tests/init-csharp/init-csharp.integtest.js +14 -0
  152. package/tests/init-fsharp/init-fsharp.integtest.d.ts +1 -0
  153. package/tests/init-fsharp/init-fsharp.integtest.js +14 -0
  154. package/tests/init-java/init-java.integtest.d.ts +1 -0
  155. package/tests/init-java/init-java.integtest.js +14 -0
  156. package/tests/init-javascript/init-javascript.integtest.d.ts +1 -0
  157. package/tests/init-javascript/init-javascript.integtest.js +15 -0
  158. package/tests/init-python/init-python.integtest.d.ts +1 -0
  159. package/tests/init-python/init-python.integtest.js +19 -0
  160. package/tests/init-typescript-app/init-typescript-app.integtest.d.ts +1 -0
  161. package/tests/init-typescript-app/init-typescript-app.integtest.js +49 -0
  162. package/tests/init-typescript-lib/init-typescript-lib.integtest.d.ts +1 -0
  163. package/tests/init-typescript-lib/init-typescript-lib.integtest.js +13 -0
  164. package/tests/uberpackage/uberpackage.integtest.d.ts +1 -0
  165. package/tests/uberpackage/uberpackage.integtest.js +11 -0
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uploadNpmPackages = exports.npmLogin = void 0;
4
+ /* eslint-disable no-console */
5
+ const path = require("path");
6
+ const files_1 = require("../files");
7
+ const shell_1 = require("../shell");
8
+ const parallel_shell_1 = require("./parallel-shell");
9
+ async function npmLogin(login, usageDir) {
10
+ // Creating an ~/.npmrc that references an envvar is what you're supposed to do. (https://docs.npmjs.com/private-modules/ci-server-config)
11
+ await writeNpmLoginToken(usageDir, login.npmEndpoint, '${NPM_TOKEN}');
12
+ // Add variables to env file
13
+ await usageDir.addToEnv(npmEnv(usageDir, login));
14
+ }
15
+ exports.npmLogin = npmLogin;
16
+ function npmEnv(usageDir, login) {
17
+ return {
18
+ npm_config_userconfig: path.join(usageDir.directory, '.npmrc'),
19
+ npm_config_registry: login.npmEndpoint,
20
+ npm_config_always_auth: 'true',
21
+ NPM_TOKEN: login.authToken,
22
+ };
23
+ }
24
+ async function uploadNpmPackages(packages, login, usageDir) {
25
+ await parallel_shell_1.parallelShell(packages, async (pkg, output) => {
26
+ console.log(`⏳ ${pkg}`);
27
+ // path.resolve() is required -- if the filename ends up looking like `js/bla.tgz` then NPM thinks it's a short form GitHub name.
28
+ await shell_1.shell(['node', require.resolve('npm'), 'publish', path.resolve(pkg)], {
29
+ modEnv: npmEnv(usageDir, login),
30
+ show: 'error',
31
+ output,
32
+ });
33
+ console.log(`✅ ${pkg}`);
34
+ }, (pkg, output) => {
35
+ if (output.toString().includes('code EPUBLISHCONFLICT')) {
36
+ console.log(`❌ ${pkg}: already exists. Skipped.`);
37
+ return 'skip';
38
+ }
39
+ if (output.toString().includes('code EPRIVATE')) {
40
+ console.log(`❌ ${pkg}: is private. Skipped.`);
41
+ return 'skip';
42
+ }
43
+ return 'fail';
44
+ });
45
+ }
46
+ exports.uploadNpmPackages = uploadNpmPackages;
47
+ async function writeNpmLoginToken(usageDir, endpoint, token) {
48
+ const rcFile = path.join(usageDir.directory, '.npmrc');
49
+ const lines = await files_1.loadLines(rcFile);
50
+ const key = `${endpoint.replace(/^https:/, '')}:_authToken`;
51
+ files_1.updateIniKey(lines, key, token);
52
+ await files_1.writeLines(rcFile, lines);
53
+ return rcFile;
54
+ }
55
+ // Environment variable, .npmrc in same directory as package.json or in home dir
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibnBtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUMvQiw2QkFBNkI7QUFDN0Isb0NBQStEO0FBQy9ELG9DQUFpQztBQUVqQyxxREFBaUQ7QUFHMUMsS0FBSyxVQUFVLFFBQVEsQ0FBQyxLQUF1QixFQUFFLFFBQWtCO0lBQ3hFLDBJQUEwSTtJQUMxSSxNQUFNLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRXRFLDRCQUE0QjtJQUM1QixNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFORCw0QkFNQztBQUVELFNBQVMsTUFBTSxDQUFDLFFBQWtCLEVBQUUsS0FBdUI7SUFDekQsT0FBTztRQUNMLHFCQUFxQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7UUFDOUQsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLFdBQVc7UUFDdEMsc0JBQXNCLEVBQUUsTUFBTTtRQUM5QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsUUFBa0IsRUFBRSxLQUF1QixFQUFFLFFBQWtCO0lBQ3JHLE1BQU0sOEJBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztRQUV4QixpSUFBaUk7UUFDakksTUFBTSxhQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQzFFLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQztZQUMvQixJQUFJLEVBQUUsT0FBTztZQUNiLE1BQU07U0FDUCxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDakIsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQUU7WUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsNEJBQTRCLENBQUMsQ0FBQztZQUNsRCxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLHdCQUF3QixDQUFDLENBQUM7WUFDOUMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQXZCRCw4Q0F1QkM7QUFFRCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsUUFBa0IsRUFBRSxRQUFnQixFQUFFLEtBQWE7SUFDbkYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0saUJBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV0QyxNQUFNLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUM7SUFDNUQsb0JBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRWhDLE1BQU0sa0JBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELGdGQUFnRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyB1cGRhdGVJbmlLZXksIGxvYWRMaW5lcywgd3JpdGVMaW5lcyB9IGZyb20gJy4uL2ZpbGVzJztcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSAnLi4vc2hlbGwnO1xuaW1wb3J0IHsgTG9naW5JbmZvcm1hdGlvbiB9IGZyb20gJy4vY29kZWFydGlmYWN0JztcbmltcG9ydCB7IHBhcmFsbGVsU2hlbGwgfSBmcm9tICcuL3BhcmFsbGVsLXNoZWxsJztcbmltcG9ydCB7IFVzYWdlRGlyIH0gZnJvbSAnLi91c2FnZS1kaXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnBtTG9naW4obG9naW46IExvZ2luSW5mb3JtYXRpb24sIHVzYWdlRGlyOiBVc2FnZURpcikge1xuICAvLyBDcmVhdGluZyBhbiB+Ly5ucG1yYyB0aGF0IHJlZmVyZW5jZXMgYW4gZW52dmFyIGlzIHdoYXQgeW91J3JlIHN1cHBvc2VkIHRvIGRvLiAoaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9wcml2YXRlLW1vZHVsZXMvY2ktc2VydmVyLWNvbmZpZylcbiAgYXdhaXQgd3JpdGVOcG1Mb2dpblRva2VuKHVzYWdlRGlyLCBsb2dpbi5ucG1FbmRwb2ludCwgJyR7TlBNX1RPS0VOfScpO1xuXG4gIC8vIEFkZCB2YXJpYWJsZXMgdG8gZW52IGZpbGVcbiAgYXdhaXQgdXNhZ2VEaXIuYWRkVG9FbnYobnBtRW52KHVzYWdlRGlyLCBsb2dpbikpO1xufVxuXG5mdW5jdGlvbiBucG1FbnYodXNhZ2VEaXI6IFVzYWdlRGlyLCBsb2dpbjogTG9naW5JbmZvcm1hdGlvbikge1xuICByZXR1cm4ge1xuICAgIG5wbV9jb25maWdfdXNlcmNvbmZpZzogcGF0aC5qb2luKHVzYWdlRGlyLmRpcmVjdG9yeSwgJy5ucG1yYycpLFxuICAgIG5wbV9jb25maWdfcmVnaXN0cnk6IGxvZ2luLm5wbUVuZHBvaW50LFxuICAgIG5wbV9jb25maWdfYWx3YXlzX2F1dGg6ICd0cnVlJywgLy8gTmVjZXNzYXJ5IGZvciBOUE0gNiwgb3RoZXJ3aXNlIGl0IHdpbGwgc29tZXRpbWVzIG5vdCBwYXNzIHRoZSB0b2tlblxuICAgIE5QTV9UT0tFTjogbG9naW4uYXV0aFRva2VuLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBsb2FkTnBtUGFja2FnZXMocGFja2FnZXM6IHN0cmluZ1tdLCBsb2dpbjogTG9naW5JbmZvcm1hdGlvbiwgdXNhZ2VEaXI6IFVzYWdlRGlyKSB7XG4gIGF3YWl0IHBhcmFsbGVsU2hlbGwocGFja2FnZXMsIGFzeW5jIChwa2csIG91dHB1dCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGDij7MgJHtwa2d9YCk7XG5cbiAgICAvLyBwYXRoLnJlc29sdmUoKSBpcyByZXF1aXJlZCAtLSBpZiB0aGUgZmlsZW5hbWUgZW5kcyB1cCBsb29raW5nIGxpa2UgYGpzL2JsYS50Z3pgIHRoZW4gTlBNIHRoaW5rcyBpdCdzIGEgc2hvcnQgZm9ybSBHaXRIdWIgbmFtZS5cbiAgICBhd2FpdCBzaGVsbChbJ25vZGUnLCByZXF1aXJlLnJlc29sdmUoJ25wbScpLCAncHVibGlzaCcsIHBhdGgucmVzb2x2ZShwa2cpXSwge1xuICAgICAgbW9kRW52OiBucG1FbnYodXNhZ2VEaXIsIGxvZ2luKSxcbiAgICAgIHNob3c6ICdlcnJvcicsXG4gICAgICBvdXRwdXQsXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyFICR7cGtnfWApO1xuICB9LCAocGtnLCBvdXRwdXQpID0+IHtcbiAgICBpZiAob3V0cHV0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ2NvZGUgRVBVQkxJU0hDT05GTElDVCcpKSB7XG4gICAgICBjb25zb2xlLmxvZyhg4p2MICR7cGtnfTogYWxyZWFkeSBleGlzdHMuIFNraXBwZWQuYCk7XG4gICAgICByZXR1cm4gJ3NraXAnO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ2NvZGUgRVBSSVZBVEUnKSkge1xuICAgICAgY29uc29sZS5sb2coYOKdjCAke3BrZ306IGlzIHByaXZhdGUuIFNraXBwZWQuYCk7XG4gICAgICByZXR1cm4gJ3NraXAnO1xuICAgIH1cbiAgICByZXR1cm4gJ2ZhaWwnO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVOcG1Mb2dpblRva2VuKHVzYWdlRGlyOiBVc2FnZURpciwgZW5kcG9pbnQ6IHN0cmluZywgdG9rZW46IHN0cmluZykge1xuICBjb25zdCByY0ZpbGUgPSBwYXRoLmpvaW4odXNhZ2VEaXIuZGlyZWN0b3J5LCAnLm5wbXJjJyk7XG4gIGNvbnN0IGxpbmVzID0gYXdhaXQgbG9hZExpbmVzKHJjRmlsZSk7XG5cbiAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnQucmVwbGFjZSgvXmh0dHBzOi8sICcnKX06X2F1dGhUb2tlbmA7XG4gIHVwZGF0ZUluaUtleShsaW5lcywga2V5LCB0b2tlbik7XG5cbiAgYXdhaXQgd3JpdGVMaW5lcyhyY0ZpbGUsIGxpbmVzKTtcbiAgcmV0dXJuIHJjRmlsZTtcbn1cblxuLy8gRW52aXJvbm1lbnQgdmFyaWFibGUsIC5ucG1yYyBpbiBzYW1lIGRpcmVjdG9yeSBhcyBwYWNrYWdlLmpzb24gb3IgaW4gaG9tZSBkaXIiXX0=
@@ -0,0 +1,4 @@
1
+ import { LoginInformation } from './codeartifact';
2
+ import { UsageDir } from './usage-dir';
3
+ export declare function nugetLogin(login: LoginInformation, usageDir: UsageDir): Promise<void>;
4
+ export declare function uploadDotnetPackages(packages: string[], usageDir: UsageDir): Promise<void>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uploadDotnetPackages = exports.nugetLogin = void 0;
4
+ /* eslint-disable no-console */
5
+ const files_1 = require("../files");
6
+ const shell_1 = require("../shell");
7
+ const parallel_shell_1 = require("./parallel-shell");
8
+ async function nugetLogin(login, usageDir) {
9
+ // NuGet.Config MUST live in the current directory or in the home directory, and there is no environment
10
+ // variable to configure its location.
11
+ await writeNuGetConfigFile(usageDir.cwdFile('NuGet.Config'), login);
12
+ }
13
+ exports.nugetLogin = nugetLogin;
14
+ async function uploadDotnetPackages(packages, usageDir) {
15
+ await usageDir.copyCwdFileHere('NuGet.Config');
16
+ await parallel_shell_1.parallelShell(packages, async (pkg, output) => {
17
+ console.log(`⏳ ${pkg}`);
18
+ await shell_1.shell(['dotnet', 'nuget', 'push',
19
+ pkg,
20
+ '--source', 'CodeArtifact',
21
+ '--no-symbols',
22
+ '--force-english-output',
23
+ '--disable-buffering',
24
+ '--timeout', '600',
25
+ '--skip-duplicate'], {
26
+ output,
27
+ });
28
+ console.log(`✅ ${pkg}`);
29
+ }, (pkg, output) => {
30
+ if (output.toString().includes('Conflict')) {
31
+ console.log(`❌ ${pkg}: already exists. Skipped.`);
32
+ return 'skip';
33
+ }
34
+ if (output.includes('System.Threading.AbandonedMutexException')) {
35
+ console.log(`♻️ ${pkg}: AbandonedMutexException. Probably a sign of throttling, retrying.`);
36
+ return 'retry';
37
+ }
38
+ if (output.includes('Too Many Requests')) {
39
+ console.log(`♻️ ${pkg}: Too many requests. Retrying.`);
40
+ return 'retry';
41
+ }
42
+ if (output.includes('System.IO.IOException: The system cannot open the device or file specified.')) {
43
+ console.log(`♻️ ${pkg}: Some error that we've seen before as a result of throttling. Retrying.`);
44
+ return 'retry';
45
+ }
46
+ return 'fail';
47
+ });
48
+ }
49
+ exports.uploadDotnetPackages = uploadDotnetPackages;
50
+ async function writeNuGetConfigFile(filename, login) {
51
+ // `dotnet nuget push` has an `--api-key` parameter, but CodeArtifact
52
+ // does not support that. We must authenticate with Basic auth.
53
+ await files_1.writeFile(filename, `<?xml version="1.0" encoding="utf-8"?>
54
+ <configuration>
55
+ <packageSources>
56
+ <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
57
+ <add key="CodeArtifact" value="${login.nugetEndpoint}v3/index.json" />
58
+ </packageSources>
59
+ <activePackageSource>
60
+ <add key="CodeArtifact" value="${login.nugetEndpoint}v3/index.json" />
61
+ </activePackageSource>
62
+ <packageSourceCredentials>
63
+ <CodeArtifact>
64
+ <add key="Username" value="aws" />
65
+ <add key="ClearTextPassword" value="${login.authToken}" />
66
+ </CodeArtifact>
67
+ </packageSourceCredentials>
68
+ </configuration>`);
69
+ }
70
+ // NuGet.Config in current directory
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVnZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudWdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBK0I7QUFDL0Isb0NBQXFDO0FBQ3JDLG9DQUFpQztBQUVqQyxxREFBaUQ7QUFHMUMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxLQUF1QixFQUFFLFFBQWtCO0lBQzFFLHdHQUF3RztJQUN4RyxzQ0FBc0M7SUFDdEMsTUFBTSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFKRCxnQ0FJQztBQUVNLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxRQUFrQixFQUFFLFFBQWtCO0lBQy9FLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUUvQyxNQUFNLDhCQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFeEIsTUFBTSxhQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU07WUFDcEMsR0FBRztZQUNILFVBQVUsRUFBRSxjQUFjO1lBQzFCLGNBQWM7WUFDZCx3QkFBd0I7WUFDeEIscUJBQXFCO1lBQ3JCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLGtCQUFrQixDQUFDLEVBQUU7WUFDckIsTUFBTTtTQUNQLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNkLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsMENBQTBDLENBQUMsRUFBRTtZQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxxRUFBcUUsQ0FBQyxDQUFDO1lBQzVGLE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsZ0NBQWdDLENBQUMsQ0FBQztZQUN2RCxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyw2RUFBNkUsQ0FBQyxFQUFFO1lBQ2xHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLDBFQUEwRSxDQUFDLENBQUM7WUFDakcsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUF0Q0Qsb0RBc0NDO0FBRUQsS0FBSyxVQUFVLG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsS0FBdUI7SUFDM0UscUVBQXFFO0lBQ3JFLCtEQUErRDtJQUMvRCxNQUFNLGlCQUFTLENBQUMsUUFBUSxFQUFFOzs7O3FDQUlTLEtBQUssQ0FBQyxhQUFhOzs7cUNBR25CLEtBQUssQ0FBQyxhQUFhOzs7Ozs4Q0FLVixLQUFLLENBQUMsU0FBUzs7O2lCQUc1QyxDQUFDLENBQUM7QUFDbkIsQ0FBQztBQUVELG9DQUFvQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJy4uL2ZpbGVzJztcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSAnLi4vc2hlbGwnO1xuaW1wb3J0IHsgTG9naW5JbmZvcm1hdGlvbiB9IGZyb20gJy4vY29kZWFydGlmYWN0JztcbmltcG9ydCB7IHBhcmFsbGVsU2hlbGwgfSBmcm9tICcuL3BhcmFsbGVsLXNoZWxsJztcbmltcG9ydCB7IFVzYWdlRGlyIH0gZnJvbSAnLi91c2FnZS1kaXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbnVnZXRMb2dpbihsb2dpbjogTG9naW5JbmZvcm1hdGlvbiwgdXNhZ2VEaXI6IFVzYWdlRGlyKSB7XG4gIC8vIE51R2V0LkNvbmZpZyBNVVNUIGxpdmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9yIGluIHRoZSBob21lIGRpcmVjdG9yeSwgYW5kIHRoZXJlIGlzIG5vIGVudmlyb25tZW50XG4gIC8vIHZhcmlhYmxlIHRvIGNvbmZpZ3VyZSBpdHMgbG9jYXRpb24uXG4gIGF3YWl0IHdyaXRlTnVHZXRDb25maWdGaWxlKHVzYWdlRGlyLmN3ZEZpbGUoJ051R2V0LkNvbmZpZycpLCBsb2dpbik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGxvYWREb3RuZXRQYWNrYWdlcyhwYWNrYWdlczogc3RyaW5nW10sIHVzYWdlRGlyOiBVc2FnZURpcikge1xuICBhd2FpdCB1c2FnZURpci5jb3B5Q3dkRmlsZUhlcmUoJ051R2V0LkNvbmZpZycpO1xuXG4gIGF3YWl0IHBhcmFsbGVsU2hlbGwocGFja2FnZXMsIGFzeW5jIChwa2csIG91dHB1dCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGDij7MgJHtwa2d9YCk7XG5cbiAgICBhd2FpdCBzaGVsbChbJ2RvdG5ldCcsICdudWdldCcsICdwdXNoJyxcbiAgICAgIHBrZyxcbiAgICAgICctLXNvdXJjZScsICdDb2RlQXJ0aWZhY3QnLFxuICAgICAgJy0tbm8tc3ltYm9scycsXG4gICAgICAnLS1mb3JjZS1lbmdsaXNoLW91dHB1dCcsXG4gICAgICAnLS1kaXNhYmxlLWJ1ZmZlcmluZycsXG4gICAgICAnLS10aW1lb3V0JywgJzYwMCcsXG4gICAgICAnLS1za2lwLWR1cGxpY2F0ZSddLCB7XG4gICAgICBvdXRwdXQsXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyFICR7cGtnfWApO1xuICB9LFxuICAocGtnLCBvdXRwdXQpID0+IHtcbiAgICBpZiAob3V0cHV0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0NvbmZsaWN0JykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGDinYwgJHtwa2d9OiBhbHJlYWR5IGV4aXN0cy4gU2tpcHBlZC5gKTtcbiAgICAgIHJldHVybiAnc2tpcCc7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuaW5jbHVkZXMoJ1N5c3RlbS5UaHJlYWRpbmcuQWJhbmRvbmVkTXV0ZXhFeGNlcHRpb24nKSkge1xuICAgICAgY29uc29sZS5sb2coYOKZu++4jyAke3BrZ306IEFiYW5kb25lZE11dGV4RXhjZXB0aW9uLiBQcm9iYWJseSBhIHNpZ24gb2YgdGhyb3R0bGluZywgcmV0cnlpbmcuYCk7XG4gICAgICByZXR1cm4gJ3JldHJ5JztcbiAgICB9XG4gICAgaWYgKG91dHB1dC5pbmNsdWRlcygnVG9vIE1hbnkgUmVxdWVzdHMnKSkge1xuICAgICAgY29uc29sZS5sb2coYOKZu++4jyAke3BrZ306IFRvbyBtYW55IHJlcXVlc3RzLiBSZXRyeWluZy5gKTtcbiAgICAgIHJldHVybiAncmV0cnknO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LmluY2x1ZGVzKCdTeXN0ZW0uSU8uSU9FeGNlcHRpb246IFRoZSBzeXN0ZW0gY2Fubm90IG9wZW4gdGhlIGRldmljZSBvciBmaWxlIHNwZWNpZmllZC4nKSkge1xuICAgICAgY29uc29sZS5sb2coYOKZu++4jyAke3BrZ306IFNvbWUgZXJyb3IgdGhhdCB3ZSd2ZSBzZWVuIGJlZm9yZSBhcyBhIHJlc3VsdCBvZiB0aHJvdHRsaW5nLiBSZXRyeWluZy5gKTtcbiAgICAgIHJldHVybiAncmV0cnknO1xuICAgIH1cbiAgICByZXR1cm4gJ2ZhaWwnO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVOdUdldENvbmZpZ0ZpbGUoZmlsZW5hbWU6IHN0cmluZywgbG9naW46IExvZ2luSW5mb3JtYXRpb24pIHtcbiAgLy8gYGRvdG5ldCBudWdldCBwdXNoYCBoYXMgYW4gYC0tYXBpLWtleWAgcGFyYW1ldGVyLCBidXQgQ29kZUFydGlmYWN0XG4gIC8vIGRvZXMgbm90IHN1cHBvcnQgdGhhdC4gV2UgbXVzdCBhdXRoZW50aWNhdGUgd2l0aCBCYXNpYyBhdXRoLlxuICBhd2FpdCB3cml0ZUZpbGUoZmlsZW5hbWUsIGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz5cbjxjb25maWd1cmF0aW9uPlxuICA8cGFja2FnZVNvdXJjZXM+XG4gICAgPGFkZCBrZXk9XCJudWdldC5vcmdcIiB2YWx1ZT1cImh0dHBzOi8vYXBpLm51Z2V0Lm9yZy92My9pbmRleC5qc29uXCIgcHJvdG9jb2xWZXJzaW9uPVwiM1wiIC8+XG4gICAgPGFkZCBrZXk9XCJDb2RlQXJ0aWZhY3RcIiB2YWx1ZT1cIiR7bG9naW4ubnVnZXRFbmRwb2ludH12My9pbmRleC5qc29uXCIgLz5cbiAgPC9wYWNrYWdlU291cmNlcz5cbiAgPGFjdGl2ZVBhY2thZ2VTb3VyY2U+XG4gICAgPGFkZCBrZXk9XCJDb2RlQXJ0aWZhY3RcIiB2YWx1ZT1cIiR7bG9naW4ubnVnZXRFbmRwb2ludH12My9pbmRleC5qc29uXCIgLz5cbiAgPC9hY3RpdmVQYWNrYWdlU291cmNlPlxuICA8cGFja2FnZVNvdXJjZUNyZWRlbnRpYWxzPlxuICAgIDxDb2RlQXJ0aWZhY3Q+XG4gICAgICAgIDxhZGQga2V5PVwiVXNlcm5hbWVcIiB2YWx1ZT1cImF3c1wiIC8+XG4gICAgICAgIDxhZGQga2V5PVwiQ2xlYXJUZXh0UGFzc3dvcmRcIiB2YWx1ZT1cIiR7bG9naW4uYXV0aFRva2VufVwiIC8+XG4gICAgICA8L0NvZGVBcnRpZmFjdD5cbiAgPC9wYWNrYWdlU291cmNlQ3JlZGVudGlhbHM+XG48L2NvbmZpZ3VyYXRpb24+YCk7XG59XG5cbi8vIE51R2V0LkNvbmZpZyBpbiBjdXJyZW50IGRpcmVjdG9yeSJdfQ==
@@ -0,0 +1,6 @@
1
+ /// <reference types="node" />
2
+ export declare type ErrorResponse = 'fail' | 'skip' | 'retry';
3
+ /**
4
+ * Run a function in parallel with cached output
5
+ */
6
+ export declare function parallelShell<A>(inputs: A[], block: (x: A, output: NodeJS.WritableStream) => Promise<void>, swallowError?: (x: A, output: string) => ErrorResponse): Promise<void>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parallelShell = void 0;
4
+ const p_queue_1 = require("p-queue");
5
+ const aws_1 = require("../aws");
6
+ const corking_1 = require("../corking");
7
+ /**
8
+ * Run a function in parallel with cached output
9
+ */
10
+ async function parallelShell(inputs, block, swallowError) {
11
+ // Limit to 10 for now, too many instances of Maven exhaust the CodeBuild instance memory
12
+ const q = new p_queue_1.default({ concurrency: Number(process.env.CONCURRENCY) || 10 });
13
+ await q.addAll(inputs.map(input => async () => {
14
+ let attempts = 10;
15
+ let sleepMs = 500;
16
+ while (true) {
17
+ const output = new corking_1.MemoryStream();
18
+ try {
19
+ await block(input, output);
20
+ return;
21
+ }
22
+ catch (e) {
23
+ switch (swallowError?.(input, output.toString())) {
24
+ case 'skip':
25
+ return;
26
+ case 'retry':
27
+ if (--attempts > 0) {
28
+ await aws_1.sleep(Math.floor(Math.random() * sleepMs));
29
+ sleepMs *= 2;
30
+ continue;
31
+ }
32
+ break;
33
+ case 'fail':
34
+ case undefined:
35
+ break;
36
+ }
37
+ // eslint-disable-next-line no-console
38
+ console.error(output.toString());
39
+ throw e;
40
+ }
41
+ }
42
+ }));
43
+ await q.onEmpty();
44
+ }
45
+ exports.parallelShell = parallelShell;
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYWxsZWwtc2hlbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXJhbGxlbC1zaGVsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBNkI7QUFDN0IsZ0NBQStCO0FBQy9CLHdDQUEwQztBQUsxQzs7R0FFRztBQUNJLEtBQUssVUFBVSxhQUFhLENBQ2pDLE1BQVcsRUFDWCxLQUE2RCxFQUM3RCxZQUFzRDtJQUV0RCx5RkFBeUY7SUFDekYsTUFBTSxDQUFDLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0UsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUM1QyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxFQUFFO1lBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxzQkFBWSxFQUFFLENBQUM7WUFDbEMsSUFBSTtnQkFDRixNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzNCLE9BQU87YUFDUjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLFFBQVEsWUFBWSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO29CQUNoRCxLQUFLLE1BQU07d0JBQ1QsT0FBTztvQkFFVCxLQUFLLE9BQU87d0JBQ1YsSUFBSSxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUU7NEJBQ2xCLE1BQU0sV0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7NEJBQ2pELE9BQU8sSUFBSSxDQUFDLENBQUM7NEJBQ2IsU0FBUzt5QkFDVjt3QkFDRCxNQUFNO29CQUVSLEtBQUssTUFBTSxDQUFDO29CQUNaLEtBQUssU0FBUzt3QkFDWixNQUFNO2lCQUNUO2dCQUVELHNDQUFzQztnQkFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLENBQUM7YUFDVDtTQUNGO0lBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUF6Q0Qsc0NBeUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBRdWV1ZSBmcm9tICdwLXF1ZXVlJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi4vYXdzJztcbmltcG9ydCB7IE1lbW9yeVN0cmVhbSB9IGZyb20gJy4uL2NvcmtpbmcnO1xuXG5cbmV4cG9ydCB0eXBlIEVycm9yUmVzcG9uc2UgPSAnZmFpbCcgfCAnc2tpcCcgfCAncmV0cnknO1xuXG4vKipcbiAqIFJ1biBhIGZ1bmN0aW9uIGluIHBhcmFsbGVsIHdpdGggY2FjaGVkIG91dHB1dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyYWxsZWxTaGVsbDxBPihcbiAgaW5wdXRzOiBBW10sXG4gIGJsb2NrOiAoeDogQSwgb3V0cHV0OiBOb2RlSlMuV3JpdGFibGVTdHJlYW0pID0+IFByb21pc2U8dm9pZD4sXG4gIHN3YWxsb3dFcnJvcj86ICh4OiBBLCBvdXRwdXQ6IHN0cmluZykgPT4gRXJyb3JSZXNwb25zZSxcbikge1xuICAvLyBMaW1pdCB0byAxMCBmb3Igbm93LCB0b28gbWFueSBpbnN0YW5jZXMgb2YgTWF2ZW4gZXhoYXVzdCB0aGUgQ29kZUJ1aWxkIGluc3RhbmNlIG1lbW9yeVxuICBjb25zdCBxID0gbmV3IFBRdWV1ZSh7IGNvbmN1cnJlbmN5OiBOdW1iZXIocHJvY2Vzcy5lbnYuQ09OQ1VSUkVOQ1kpIHx8IDEwIH0pO1xuICBhd2FpdCBxLmFkZEFsbChpbnB1dHMubWFwKGlucHV0ID0+IGFzeW5jICgpID0+IHtcbiAgICBsZXQgYXR0ZW1wdHMgPSAxMDtcbiAgICBsZXQgc2xlZXBNcyA9IDUwMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYmxvY2soaW5wdXQsIG91dHB1dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc3dpdGNoIChzd2FsbG93RXJyb3I/LihpbnB1dCwgb3V0cHV0LnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgY2FzZSAnc2tpcCc6XG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICBjYXNlICdyZXRyeSc6XG4gICAgICAgICAgICBpZiAoLS1hdHRlbXB0cyA+IDApIHtcbiAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogc2xlZXBNcykpO1xuICAgICAgICAgICAgICBzbGVlcE1zICo9IDI7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdmYWlsJzpcbiAgICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5lcnJvcihvdXRwdXQudG9TdHJpbmcoKSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9KSk7XG5cbiAgYXdhaXQgcS5vbkVtcHR5KCk7XG59Il19
@@ -0,0 +1,4 @@
1
+ import { LoginInformation } from './codeartifact';
2
+ import { UsageDir } from './usage-dir';
3
+ export declare function pypiLogin(login: LoginInformation, usageDir: UsageDir): Promise<void>;
4
+ export declare function uploadPythonPackages(packages: string[], login: LoginInformation): Promise<void>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uploadPythonPackages = exports.pypiLogin = void 0;
4
+ /* eslint-disable no-console */
5
+ const path = require("path");
6
+ const files_1 = require("../files");
7
+ const shell_1 = require("../shell");
8
+ const parallel_shell_1 = require("./parallel-shell");
9
+ async function pypiLogin(login, usageDir) {
10
+ // Write pip config file and set environment var
11
+ await files_1.writeFile(path.join(usageDir.directory, 'pip.conf'), [
12
+ '[global]',
13
+ `index-url = https://aws:${login.authToken}@${login.pypiEndpoint.replace(/^https:\/\//, '')}simple/`,
14
+ ].join('\n'));
15
+ await usageDir.addToEnv({
16
+ PIP_CONFIG_FILE: `${usageDir.directory}/pip.conf`,
17
+ });
18
+ }
19
+ exports.pypiLogin = pypiLogin;
20
+ async function uploadPythonPackages(packages, login) {
21
+ await shell_1.shell(['pip', 'install', 'twine'], { show: 'error' });
22
+ // Even though twine supports uploading all packages in one go, we have to upload them
23
+ // individually since CodeArtifact does not support Twine's `--skip-existing`. Fun beans.
24
+ await parallel_shell_1.parallelShell(packages, async (pkg, output) => {
25
+ console.log(`⏳ ${pkg}`);
26
+ await shell_1.shell(['twine', 'upload', '--verbose', pkg], {
27
+ modEnv: {
28
+ TWINE_USERNAME: 'aws',
29
+ TWINE_PASSWORD: login.authToken,
30
+ TWINE_REPOSITORY_URL: login.pypiEndpoint,
31
+ },
32
+ show: 'error',
33
+ output,
34
+ });
35
+ console.log(`✅ ${pkg}`);
36
+ }, (pkg, output) => {
37
+ if (output.toString().includes('This package is configured to block new versions') || output.toString().includes('409 Conflict')) {
38
+ console.log(`❌ ${pkg}: already exists. Skipped.`);
39
+ return 'skip';
40
+ }
41
+ if (output.includes('429 Too Many Requests ')) {
42
+ console.log(`♻️ ${pkg}: 429 Too Many Requests. Retrying.`);
43
+ return 'retry';
44
+ }
45
+ return 'fail';
46
+ });
47
+ }
48
+ exports.uploadPythonPackages = uploadPythonPackages;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHlwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInB5cGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3QixvQ0FBcUM7QUFDckMsb0NBQWlDO0FBRWpDLHFEQUFpRDtBQUcxQyxLQUFLLFVBQVUsU0FBUyxDQUFDLEtBQXVCLEVBQUUsUUFBa0I7SUFDekUsZ0RBQWdEO0lBQ2hELE1BQU0saUJBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDekQsVUFBVTtRQUNWLDJCQUEyQixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsU0FBUztLQUNyRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2QsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3RCLGVBQWUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxTQUFTLFdBQVc7S0FDbEQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVRELDhCQVNDO0FBRU0sS0FBSyxVQUFVLG9CQUFvQixDQUFDLFFBQWtCLEVBQUUsS0FBdUI7SUFDcEYsTUFBTSxhQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFNUQsc0ZBQXNGO0lBQ3RGLHlGQUF5RjtJQUN6RixNQUFNLDhCQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFeEIsTUFBTSxhQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNqRCxNQUFNLEVBQUU7Z0JBQ04sY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLGNBQWMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDL0Isb0JBQW9CLEVBQUUsS0FBSyxDQUFDLFlBQVk7YUFDekM7WUFDRCxJQUFJLEVBQUUsT0FBTztZQUNiLE1BQU07U0FDUCxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDakIsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLGtEQUFrRCxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNoSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsRUFBRTtZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQzNELE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBOUJELG9EQThCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyB3cml0ZUZpbGUgfSBmcm9tICcuLi9maWxlcyc7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gJy4uL3NoZWxsJztcbmltcG9ydCB7IExvZ2luSW5mb3JtYXRpb24gfSBmcm9tICcuL2NvZGVhcnRpZmFjdCc7XG5pbXBvcnQgeyBwYXJhbGxlbFNoZWxsIH0gZnJvbSAnLi9wYXJhbGxlbC1zaGVsbCc7XG5pbXBvcnQgeyBVc2FnZURpciB9IGZyb20gJy4vdXNhZ2UtZGlyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB5cGlMb2dpbihsb2dpbjogTG9naW5JbmZvcm1hdGlvbiwgdXNhZ2VEaXI6IFVzYWdlRGlyKSB7XG4gIC8vIFdyaXRlIHBpcCBjb25maWcgZmlsZSBhbmQgc2V0IGVudmlyb25tZW50IHZhclxuICBhd2FpdCB3cml0ZUZpbGUocGF0aC5qb2luKHVzYWdlRGlyLmRpcmVjdG9yeSwgJ3BpcC5jb25mJyksIFtcbiAgICAnW2dsb2JhbF0nLFxuICAgIGBpbmRleC11cmwgPSBodHRwczovL2F3czoke2xvZ2luLmF1dGhUb2tlbn1AJHtsb2dpbi5weXBpRW5kcG9pbnQucmVwbGFjZSgvXmh0dHBzOlxcL1xcLy8sICcnKX1zaW1wbGUvYCxcbiAgXS5qb2luKCdcXG4nKSk7XG4gIGF3YWl0IHVzYWdlRGlyLmFkZFRvRW52KHtcbiAgICBQSVBfQ09ORklHX0ZJTEU6IGAke3VzYWdlRGlyLmRpcmVjdG9yeX0vcGlwLmNvbmZgLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwbG9hZFB5dGhvblBhY2thZ2VzKHBhY2thZ2VzOiBzdHJpbmdbXSwgbG9naW46IExvZ2luSW5mb3JtYXRpb24pIHtcbiAgYXdhaXQgc2hlbGwoWydwaXAnLCAnaW5zdGFsbCcsICd0d2luZSddLCB7IHNob3c6ICdlcnJvcicgfSk7XG5cbiAgLy8gRXZlbiB0aG91Z2ggdHdpbmUgc3VwcG9ydHMgdXBsb2FkaW5nIGFsbCBwYWNrYWdlcyBpbiBvbmUgZ28sIHdlIGhhdmUgdG8gdXBsb2FkIHRoZW1cbiAgLy8gaW5kaXZpZHVhbGx5IHNpbmNlIENvZGVBcnRpZmFjdCBkb2VzIG5vdCBzdXBwb3J0IFR3aW5lJ3MgYC0tc2tpcC1leGlzdGluZ2AuIEZ1biBiZWFucy5cbiAgYXdhaXQgcGFyYWxsZWxTaGVsbChwYWNrYWdlcywgYXN5bmMgKHBrZywgb3V0cHV0KSA9PiB7XG4gICAgY29uc29sZS5sb2coYOKPsyAke3BrZ31gKTtcblxuICAgIGF3YWl0IHNoZWxsKFsndHdpbmUnLCAndXBsb2FkJywgJy0tdmVyYm9zZScsIHBrZ10sIHtcbiAgICAgIG1vZEVudjoge1xuICAgICAgICBUV0lORV9VU0VSTkFNRTogJ2F3cycsXG4gICAgICAgIFRXSU5FX1BBU1NXT1JEOiBsb2dpbi5hdXRoVG9rZW4sXG4gICAgICAgIFRXSU5FX1JFUE9TSVRPUllfVVJMOiBsb2dpbi5weXBpRW5kcG9pbnQsXG4gICAgICB9LFxuICAgICAgc2hvdzogJ2Vycm9yJyxcbiAgICAgIG91dHB1dCxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinIUgJHtwa2d9YCk7XG4gIH0sIChwa2csIG91dHB1dCkgPT4ge1xuICAgIGlmIChvdXRwdXQudG9TdHJpbmcoKS5pbmNsdWRlcygnVGhpcyBwYWNrYWdlIGlzIGNvbmZpZ3VyZWQgdG8gYmxvY2sgbmV3IHZlcnNpb25zJykgfHwgb3V0cHV0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJzQwOSBDb25mbGljdCcpKSB7XG4gICAgICBjb25zb2xlLmxvZyhg4p2MICR7cGtnfTogYWxyZWFkeSBleGlzdHMuIFNraXBwZWQuYCk7XG4gICAgICByZXR1cm4gJ3NraXAnO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LmluY2x1ZGVzKCc0MjkgVG9vIE1hbnkgUmVxdWVzdHMgJykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGDimbvvuI8gJHtwa2d9OiA0MjkgVG9vIE1hbnkgUmVxdWVzdHMuIFJldHJ5aW5nLmApO1xuICAgICAgcmV0dXJuICdyZXRyeSc7XG4gICAgfVxuICAgIHJldHVybiAnZmFpbCc7XG4gIH0pO1xufSJdfQ==
@@ -0,0 +1,31 @@
1
+ export declare const DEFAULT_USAGE_DIR: string;
2
+ /**
3
+ * The usage directory is where we write per-session config files to access the CodeArtifact repository.
4
+ *
5
+ * Some config files may be written in a system-global location, but they will not be active unless the
6
+ * contents of this directory have been sourced/copied into the current terminal.
7
+ *
8
+ * CONTRACT
9
+ *
10
+ * There are two special entries:
11
+ *
12
+ * - `env`, a file with `key=value` entries for environment variables to set.
13
+ * - `cwd/`, a directory with files that need to be copied into the current directory before each command.
14
+ *
15
+ * Other than these, code may write tempfiles to this directory if it wants, but there is no meaning
16
+ * implied for other files.
17
+ */
18
+ export declare class UsageDir {
19
+ readonly directory: string;
20
+ static default(): UsageDir;
21
+ readonly envFile: string;
22
+ readonly cwdDir: string;
23
+ private constructor();
24
+ clean(): Promise<void>;
25
+ addToEnv(settings: Record<string, string>): Promise<void>;
26
+ currentEnv(): Promise<Record<string, string>>;
27
+ cwdFile(filename: string): string;
28
+ activateInCurrentProcess(): Promise<void>;
29
+ copyCwdFileHere(...filenames: string[]): Promise<void>;
30
+ advertise(): void;
31
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UsageDir = exports.DEFAULT_USAGE_DIR = void 0;
4
+ const path = require("path");
5
+ const fs = require("fs-extra");
6
+ const files_1 = require("../files");
7
+ exports.DEFAULT_USAGE_DIR = path.join(files_1.homeDir(), '.codeartifact/usage');
8
+ /**
9
+ * The usage directory is where we write per-session config files to access the CodeArtifact repository.
10
+ *
11
+ * Some config files may be written in a system-global location, but they will not be active unless the
12
+ * contents of this directory have been sourced/copied into the current terminal.
13
+ *
14
+ * CONTRACT
15
+ *
16
+ * There are two special entries:
17
+ *
18
+ * - `env`, a file with `key=value` entries for environment variables to set.
19
+ * - `cwd/`, a directory with files that need to be copied into the current directory before each command.
20
+ *
21
+ * Other than these, code may write tempfiles to this directory if it wants, but there is no meaning
22
+ * implied for other files.
23
+ */
24
+ class UsageDir {
25
+ constructor(directory) {
26
+ this.directory = directory;
27
+ this.envFile = path.join(this.directory, 'env');
28
+ this.cwdDir = path.join(this.directory, 'cwd');
29
+ }
30
+ static default() {
31
+ return new UsageDir(exports.DEFAULT_USAGE_DIR);
32
+ }
33
+ async clean() {
34
+ await fs.rm(this.directory, { recursive: true, force: true });
35
+ await fs.mkdirp(path.join(this.directory, 'cwd'));
36
+ await fs.writeFile(path.join(this.directory, 'env'), '', { encoding: 'utf-8' });
37
+ await this.addToEnv({
38
+ CWD_FILES_DIR: path.join(this.directory, 'cwd'),
39
+ });
40
+ // Write a bash helper to load these settings
41
+ await fs.writeFile(path.join(this.directory, 'activate.bash'), [
42
+ `while read -u10 line; do [[ -z $line ]] || export "$line"; done 10<${this.directory}/env`,
43
+ 'cp -R $CWD_FILES_DIR/ .',
44
+ ].join('\n'), { encoding: 'utf-8' });
45
+ }
46
+ async addToEnv(settings) {
47
+ const lines = await files_1.loadLines(this.envFile);
48
+ for (const [k, v] of Object.entries(settings)) {
49
+ files_1.updateIniKey(lines, k, v);
50
+ }
51
+ await files_1.writeLines(this.envFile, lines);
52
+ }
53
+ async currentEnv() {
54
+ const lines = await files_1.loadLines(this.envFile);
55
+ const splitter = /^([a-zA-Z0-9_-]+)\s*=\s*(.*)$/;
56
+ const ret = {};
57
+ for (const line of lines) {
58
+ const m = line.match(splitter);
59
+ if (m) {
60
+ ret[m[1]] = m[2];
61
+ }
62
+ }
63
+ return ret;
64
+ }
65
+ cwdFile(filename) {
66
+ return path.join(this.cwdDir, filename);
67
+ }
68
+ async activateInCurrentProcess() {
69
+ for (const [k, v] of Object.entries(await this.currentEnv())) {
70
+ process.env[k] = v;
71
+ }
72
+ await files_1.copyDirectoryContents(this.cwdDir, '.');
73
+ }
74
+ async copyCwdFileHere(...filenames) {
75
+ for (const file of filenames) {
76
+ await fs.copyFile(path.join(this.cwdDir, file), file);
77
+ }
78
+ }
79
+ advertise() {
80
+ // eslint-disable-next-line no-console
81
+ console.log('To activate these settings in the current terminal:');
82
+ // eslint-disable-next-line no-console
83
+ console.log(` source ${this.directory}/activate.bash`);
84
+ }
85
+ }
86
+ exports.UsageDir = UsageDir;
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2UtZGlyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidXNhZ2UtZGlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0Isb0NBQStGO0FBRWxGLFFBQUEsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFPLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBRTdFOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQWEsUUFBUTtJQVFuQixZQUFvQyxTQUFpQjtRQUFqQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ25ELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFWTSxNQUFNLENBQUMsT0FBTztRQUNuQixPQUFPLElBQUksUUFBUSxDQUFDLHlCQUFpQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQVVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVoRixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDbEIsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7U0FDaEQsQ0FBQyxDQUFDO1FBRUgsNkNBQTZDO1FBQzdDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLEVBQUU7WUFDN0Qsc0VBQXNFLElBQUksQ0FBQyxTQUFTLE1BQU07WUFDMUYseUJBQXlCO1NBQzFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBZ0M7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxpQkFBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM3QyxvQkFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFDRCxNQUFNLGtCQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxLQUFLLEdBQUcsTUFBTSxpQkFBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1QyxNQUFNLFFBQVEsR0FBRywrQkFBK0IsQ0FBQztRQUVqRCxNQUFNLEdBQUcsR0FBMkIsRUFBRSxDQUFDO1FBQ3ZDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsQjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sT0FBTyxDQUFDLFFBQWdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsd0JBQXdCO1FBQ25DLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUU7WUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEI7UUFFRCxNQUFNLDZCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxTQUFtQjtRQUNqRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUM1QixNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVNLFNBQVM7UUFDZCxzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ25FLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ0Y7QUE1RUQsNEJBNEVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGNvcHlEaXJlY3RvcnlDb250ZW50cywgaG9tZURpciwgbG9hZExpbmVzLCB1cGRhdGVJbmlLZXksIHdyaXRlTGluZXMgfSBmcm9tICcuLi9maWxlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1VTQUdFX0RJUiA9IHBhdGguam9pbihob21lRGlyKCksICcuY29kZWFydGlmYWN0L3VzYWdlJyk7XG5cbi8qKlxuICogVGhlIHVzYWdlIGRpcmVjdG9yeSBpcyB3aGVyZSB3ZSB3cml0ZSBwZXItc2Vzc2lvbiBjb25maWcgZmlsZXMgdG8gYWNjZXNzIHRoZSBDb2RlQXJ0aWZhY3QgcmVwb3NpdG9yeS5cbiAqXG4gKiBTb21lIGNvbmZpZyBmaWxlcyBtYXkgYmUgd3JpdHRlbiBpbiBhIHN5c3RlbS1nbG9iYWwgbG9jYXRpb24sIGJ1dCB0aGV5IHdpbGwgbm90IGJlIGFjdGl2ZSB1bmxlc3MgdGhlXG4gKiBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSBoYXZlIGJlZW4gc291cmNlZC9jb3BpZWQgaW50byB0aGUgY3VycmVudCB0ZXJtaW5hbC5cbiAqXG4gKiBDT05UUkFDVFxuICpcbiAqIFRoZXJlIGFyZSB0d28gc3BlY2lhbCBlbnRyaWVzOlxuICpcbiAqIC0gYGVudmAsIGEgZmlsZSB3aXRoIGBrZXk9dmFsdWVgIGVudHJpZXMgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byAgc2V0LlxuICogLSBgY3dkL2AsIGEgZGlyZWN0b3J5IHdpdGggZmlsZXMgdGhhdCBuZWVkIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgZWFjaCBjb21tYW5kLlxuICpcbiAqIE90aGVyIHRoYW4gdGhlc2UsIGNvZGUgbWF5IHdyaXRlIHRlbXBmaWxlcyB0byB0aGlzIGRpcmVjdG9yeSBpZiBpdCB3YW50cywgYnV0IHRoZXJlIGlzIG5vIG1lYW5pbmdcbiAqIGltcGxpZWQgZm9yIG90aGVyIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgVXNhZ2VEaXIge1xuICBwdWJsaWMgc3RhdGljIGRlZmF1bHQoKSB7XG4gICAgcmV0dXJuIG5ldyBVc2FnZURpcihERUZBVUxUX1VTQUdFX0RJUik7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZW52RmlsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3dkRGlyOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmVudkZpbGUgPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdlbnYnKTtcbiAgICB0aGlzLmN3ZERpciA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2N3ZCcpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFuKCkge1xuICAgIGF3YWl0IGZzLnJtKHRoaXMuZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMubWtkaXJwKHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2N3ZCcpKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnZW52JyksICcnLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5hZGRUb0Vudih7XG4gICAgICBDV0RfRklMRVNfRElSOiBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdjd2QnKSxcbiAgICB9KTtcblxuICAgIC8vIFdyaXRlIGEgYmFzaCBoZWxwZXIgdG8gbG9hZCB0aGVzZSBzZXR0aW5nc1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksICdhY3RpdmF0ZS5iYXNoJyksIFtcbiAgICAgIGB3aGlsZSByZWFkIC11MTAgbGluZTsgZG8gW1sgLXogJGxpbmUgXV0gfHwgZXhwb3J0IFwiJGxpbmVcIjsgZG9uZSAxMDwke3RoaXMuZGlyZWN0b3J5fS9lbnZgLFxuICAgICAgJ2NwIC1SICRDV0RfRklMRVNfRElSLyAuJywgLy8gQ29weSBmaWxlcyBmcm9tIGRpcmVjdG9yeSBldmVuIGlmIGl0IGlzIGVtcHR5XG4gICAgXS5qb2luKCdcXG4nKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRUb0VudihzZXR0aW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIGNvbnN0IGxpbmVzID0gYXdhaXQgbG9hZExpbmVzKHRoaXMuZW52RmlsZSk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MpKSB7XG4gICAgICB1cGRhdGVJbmlLZXkobGluZXMsIGssIHYpO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZUxpbmVzKHRoaXMuZW52RmlsZSwgbGluZXMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGN1cnJlbnRFbnYoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgY29uc3QgbGluZXMgPSBhd2FpdCBsb2FkTGluZXModGhpcy5lbnZGaWxlKTtcblxuICAgIGNvbnN0IHNwbGl0dGVyID0gL14oW2EtekEtWjAtOV8tXSspXFxzKj1cXHMqKC4qKSQvO1xuXG4gICAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCBtID0gbGluZS5tYXRjaChzcGxpdHRlcik7XG4gICAgICBpZiAobSkge1xuICAgICAgICByZXRbbVsxXV0gPSBtWzJdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIGN3ZEZpbGUoZmlsZW5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5jd2REaXIsIGZpbGVuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZUluQ3VycmVudFByb2Nlc3MoKSB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYXdhaXQgdGhpcy5jdXJyZW50RW52KCkpKSB7XG4gICAgICBwcm9jZXNzLmVudltrXSA9IHY7XG4gICAgfVxuXG4gICAgYXdhaXQgY29weURpcmVjdG9yeUNvbnRlbnRzKHRoaXMuY3dkRGlyLCAnLicpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvcHlDd2RGaWxlSGVyZSguLi5maWxlbmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVuYW1lcykge1xuICAgICAgYXdhaXQgZnMuY29weUZpbGUocGF0aC5qb2luKHRoaXMuY3dkRGlyLCBmaWxlKSwgZmlsZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkdmVydGlzZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKCdUbyBhY3RpdmF0ZSB0aGVzZSBzZXR0aW5ncyBpbiB0aGUgY3VycmVudCB0ZXJtaW5hbDonKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKGAgICAgc291cmNlICR7dGhpcy5kaXJlY3Rvcnl9L2FjdGl2YXRlLmJhc2hgKTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,13 @@
1
+ import { AwsClients } from './aws';
2
+ import { TestContext } from './integ-test';
3
+ import { ResourcePool } from './resource-pool';
4
+ export declare type AwsContext = {
5
+ readonly aws: AwsClients;
6
+ };
7
+ /**
8
+ * Higher order function to execute a block with an AWS client setup
9
+ *
10
+ * Allocate the next region from the REGION pool and dispose it afterwards.
11
+ */
12
+ export declare function withAws<A extends TestContext>(block: (context: A & AwsContext) => Promise<void>): (context: A) => Promise<void>;
13
+ export declare function regionPool(): ResourcePool;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.regionPool = exports.withAws = void 0;
4
+ const aws_1 = require("./aws");
5
+ const resource_pool_1 = require("./resource-pool");
6
+ /**
7
+ * Higher order function to execute a block with an AWS client setup
8
+ *
9
+ * Allocate the next region from the REGION pool and dispose it afterwards.
10
+ */
11
+ function withAws(block) {
12
+ return (context) => regionPool().using(async (region) => {
13
+ const aws = await aws_1.AwsClients.forRegion(region, context.output);
14
+ await sanityCheck(aws);
15
+ return block({ ...context, aws });
16
+ });
17
+ }
18
+ exports.withAws = withAws;
19
+ let _regionPool;
20
+ function regionPool() {
21
+ if (_regionPool !== undefined) {
22
+ return _regionPool;
23
+ }
24
+ const REGIONS = process.env.AWS_REGIONS
25
+ ? process.env.AWS_REGIONS.split(',')
26
+ : [process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION ?? 'us-east-1'];
27
+ // eslint-disable-next-line no-console
28
+ console.log(`Using regions: ${REGIONS}\n`);
29
+ _regionPool = resource_pool_1.ResourcePool.withResources('aws_regions', REGIONS);
30
+ return _regionPool;
31
+ }
32
+ exports.regionPool = regionPool;
33
+ /**
34
+ * Perform a one-time quick sanity check that the AWS clients have properly configured credentials
35
+ *
36
+ * If we don't do this, calls are going to fail and they'll be retried and everything will take
37
+ * forever before the user notices a simple misconfiguration.
38
+ *
39
+ * We can't check for the presence of environment variables since credentials could come from
40
+ * anywhere, so do simple account retrieval.
41
+ *
42
+ * Only do it once per process.
43
+ */
44
+ async function sanityCheck(aws) {
45
+ if (sanityChecked === undefined) {
46
+ try {
47
+ await aws.account();
48
+ sanityChecked = true;
49
+ }
50
+ catch (e) {
51
+ sanityChecked = false;
52
+ throw new Error(`AWS credentials probably not configured, got error: ${e.message}`);
53
+ }
54
+ }
55
+ if (!sanityChecked) {
56
+ throw new Error('AWS credentials probably not configured, see previous error');
57
+ }
58
+ }
59
+ let sanityChecked;
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1hd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3aXRoLWF3cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBbUM7QUFFbkMsbURBQStDO0FBSS9DOzs7O0dBSUc7QUFDSCxTQUFnQixPQUFPLENBQXdCLEtBQWlEO0lBQzlGLE9BQU8sQ0FBQyxPQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDekQsTUFBTSxHQUFHLEdBQUcsTUFBTSxnQkFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXZCLE9BQU8sS0FBSyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFQRCwwQkFPQztBQUVELElBQUksV0FBcUMsQ0FBQztBQUMxQyxTQUFnQixVQUFVO0lBQ3hCLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtRQUM3QixPQUFPLFdBQVcsQ0FBQztLQUNwQjtJQUVELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVztRQUNyQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLFdBQVcsQ0FBQyxDQUFDO0lBRTlFLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixPQUFPLElBQUksQ0FBQyxDQUFDO0lBRTNDLFdBQVcsR0FBRyw0QkFBWSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQWRELGdDQWNDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILEtBQUssVUFBVSxXQUFXLENBQUMsR0FBZTtJQUN4QyxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7UUFDL0IsSUFBSTtZQUNGLE1BQU0sR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDdEI7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDckY7S0FDRjtJQUNELElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0tBQ2hGO0FBQ0gsQ0FBQztBQUNELElBQUksYUFBa0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF3c0NsaWVudHMgfSBmcm9tICcuL2F3cyc7XG5pbXBvcnQgeyBUZXN0Q29udGV4dCB9IGZyb20gJy4vaW50ZWctdGVzdCc7XG5pbXBvcnQgeyBSZXNvdXJjZVBvb2wgfSBmcm9tICcuL3Jlc291cmNlLXBvb2wnO1xuXG5leHBvcnQgdHlwZSBBd3NDb250ZXh0ID0geyByZWFkb25seSBhd3M6IEF3c0NsaWVudHMgfTtcblxuLyoqXG4gKiBIaWdoZXIgb3JkZXIgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhIGJsb2NrIHdpdGggYW4gQVdTIGNsaWVudCBzZXR1cFxuICpcbiAqIEFsbG9jYXRlIHRoZSBuZXh0IHJlZ2lvbiBmcm9tIHRoZSBSRUdJT04gcG9vbCBhbmQgZGlzcG9zZSBpdCBhZnRlcndhcmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aEF3czxBIGV4dGVuZHMgVGVzdENvbnRleHQ+KGJsb2NrOiAoY29udGV4dDogQSAmIEF3c0NvbnRleHQpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgcmV0dXJuIChjb250ZXh0OiBBKSA9PiByZWdpb25Qb29sKCkudXNpbmcoYXN5bmMgKHJlZ2lvbikgPT4ge1xuICAgIGNvbnN0IGF3cyA9IGF3YWl0IEF3c0NsaWVudHMuZm9yUmVnaW9uKHJlZ2lvbiwgY29udGV4dC5vdXRwdXQpO1xuICAgIGF3YWl0IHNhbml0eUNoZWNrKGF3cyk7XG5cbiAgICByZXR1cm4gYmxvY2soeyAuLi5jb250ZXh0LCBhd3MgfSk7XG4gIH0pO1xufVxuXG5sZXQgX3JlZ2lvblBvb2w6IHVuZGVmaW5lZCB8IFJlc291cmNlUG9vbDtcbmV4cG9ydCBmdW5jdGlvbiByZWdpb25Qb29sKCk6IFJlc291cmNlUG9vbCB7XG4gIGlmIChfcmVnaW9uUG9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIF9yZWdpb25Qb29sO1xuICB9XG5cbiAgY29uc3QgUkVHSU9OUyA9IHByb2Nlc3MuZW52LkFXU19SRUdJT05TXG4gICAgPyBwcm9jZXNzLmVudi5BV1NfUkVHSU9OUy5zcGxpdCgnLCcpXG4gICAgOiBbcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA/PyBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04gPz8gJ3VzLWVhc3QtMSddO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUubG9nKGBVc2luZyByZWdpb25zOiAke1JFR0lPTlN9XFxuYCk7XG5cbiAgX3JlZ2lvblBvb2wgPSBSZXNvdXJjZVBvb2wud2l0aFJlc291cmNlcygnYXdzX3JlZ2lvbnMnLCBSRUdJT05TKTtcbiAgcmV0dXJuIF9yZWdpb25Qb29sO1xufVxuXG4vKipcbiAqIFBlcmZvcm0gYSBvbmUtdGltZSBxdWljayBzYW5pdHkgY2hlY2sgdGhhdCB0aGUgQVdTIGNsaWVudHMgaGF2ZSBwcm9wZXJseSBjb25maWd1cmVkIGNyZWRlbnRpYWxzXG4gKlxuICogSWYgd2UgZG9uJ3QgZG8gdGhpcywgY2FsbHMgYXJlIGdvaW5nIHRvIGZhaWwgYW5kIHRoZXknbGwgYmUgcmV0cmllZCBhbmQgZXZlcnl0aGluZyB3aWxsIHRha2VcbiAqIGZvcmV2ZXIgYmVmb3JlIHRoZSB1c2VyIG5vdGljZXMgYSBzaW1wbGUgbWlzY29uZmlndXJhdGlvbi5cbiAqXG4gKiBXZSBjYW4ndCBjaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBzaW5jZSBjcmVkZW50aWFscyBjb3VsZCBjb21lIGZyb21cbiAqIGFueXdoZXJlLCBzbyBkbyBzaW1wbGUgYWNjb3VudCByZXRyaWV2YWwuXG4gKlxuICogT25seSBkbyBpdCBvbmNlIHBlciBwcm9jZXNzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzYW5pdHlDaGVjayhhd3M6IEF3c0NsaWVudHMpIHtcbiAgaWYgKHNhbml0eUNoZWNrZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhd3MuYWNjb3VudCgpO1xuICAgICAgc2FuaXR5Q2hlY2tlZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2FuaXR5Q2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBV1MgY3JlZGVudGlhbHMgcHJvYmFibHkgbm90IGNvbmZpZ3VyZWQsIGdvdCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIGlmICghc2FuaXR5Q2hlY2tlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQVdTIGNyZWRlbnRpYWxzIHByb2JhYmx5IG5vdCBjb25maWd1cmVkLCBzZWUgcHJldmlvdXMgZXJyb3InKTtcbiAgfVxufVxubGV0IHNhbml0eUNoZWNrZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7Il19
@@ -0,0 +1,146 @@
1
+ /// <reference types="node" />
2
+ import { AwsClients } from './aws';
3
+ import { TestContext } from './integ-test';
4
+ import { IPackageSource } from './package-sources/source';
5
+ import { ShellOptions, ShellHelper } from './shell';
6
+ import { AwsContext } from './with-aws';
7
+ /**
8
+ * Higher order function to execute a block with a CDK app fixture
9
+ *
10
+ * Requires an AWS client to be passed in.
11
+ *
12
+ * For backwards compatibility with existing tests (so we don't have to change
13
+ * too much) the inner block is expected to take a `TestFixture` object.
14
+ */
15
+ export declare function withCdkApp<A extends TestContext & AwsContext>(block: (context: TestFixture) => Promise<void>): (context: A) => Promise<void>;
16
+ export declare function withMonolithicCfnIncludeCdkApp<A extends TestContext>(block: (context: TestFixture) => Promise<void>): (context: A) => Promise<void>;
17
+ /**
18
+ * Default test fixture for most (all?) integ tests
19
+ *
20
+ * It's a composition of withAws/withCdkApp, expecting the test block to take a `TestFixture`
21
+ * object.
22
+ *
23
+ * We could have put `withAws(withCdkApp(fixture => { /... actual test here.../ }))` in every
24
+ * test declaration but centralizing it is going to make it convenient to modify in the future.
25
+ */
26
+ export declare function withDefaultFixture(block: (context: TestFixture) => Promise<void>): (context: TestContext) => Promise<void>;
27
+ export interface CdkCliOptions extends ShellOptions {
28
+ options?: string[];
29
+ neverRequireApproval?: boolean;
30
+ verbose?: boolean;
31
+ }
32
+ /**
33
+ * Prepare a target dir byreplicating a source directory
34
+ */
35
+ export declare function cloneDirectory(source: string, target: string, output?: NodeJS.WritableStream): Promise<void>;
36
+ interface CommonCdkBootstrapCommandOptions {
37
+ readonly toolkitStackName: string;
38
+ /**
39
+ * @default false
40
+ */
41
+ readonly verbose?: boolean;
42
+ /**
43
+ * @default - auto-generated CloudFormation name
44
+ */
45
+ readonly bootstrapBucketName?: string;
46
+ readonly cliOptions?: CdkCliOptions;
47
+ /**
48
+ * @default - none
49
+ */
50
+ readonly tags?: string;
51
+ }
52
+ export interface CdkLegacyBootstrapCommandOptions extends CommonCdkBootstrapCommandOptions {
53
+ /**
54
+ * @default false
55
+ */
56
+ readonly noExecute?: boolean;
57
+ /**
58
+ * @default true
59
+ */
60
+ readonly publicAccessBlockConfiguration?: boolean;
61
+ }
62
+ export interface CdkModernBootstrapCommandOptions extends CommonCdkBootstrapCommandOptions {
63
+ /**
64
+ * @default false
65
+ */
66
+ readonly force?: boolean;
67
+ /**
68
+ * @default - none
69
+ */
70
+ readonly cfnExecutionPolicy?: string;
71
+ /**
72
+ * @default false
73
+ */
74
+ readonly showTemplate?: boolean;
75
+ readonly template?: string;
76
+ /**
77
+ * @default false
78
+ */
79
+ readonly terminationProtection?: boolean;
80
+ /**
81
+ * @default undefined
82
+ */
83
+ readonly examplePermissionsBoundary?: boolean;
84
+ /**
85
+ * @default undefined
86
+ */
87
+ readonly customPermissionsBoundary?: string;
88
+ }
89
+ export declare class TestFixture extends ShellHelper {
90
+ readonly integTestDir: string;
91
+ readonly stackNamePrefix: string;
92
+ readonly output: NodeJS.WritableStream;
93
+ readonly aws: AwsClients;
94
+ readonly randomString: string;
95
+ readonly qualifier: string;
96
+ private readonly bucketsToDelete;
97
+ readonly packages: IPackageSource;
98
+ constructor(integTestDir: string, stackNamePrefix: string, output: NodeJS.WritableStream, aws: AwsClients, randomString: string);
99
+ log(s: string): void;
100
+ cdkDeploy(stackNames: string | string[], options?: CdkCliOptions): Promise<string>;
101
+ cdkSynth(options?: CdkCliOptions): Promise<string>;
102
+ cdkDestroy(stackNames: string | string[], options?: CdkCliOptions): Promise<string>;
103
+ cdkBootstrapLegacy(options: CdkLegacyBootstrapCommandOptions): Promise<string>;
104
+ cdkBootstrapModern(options: CdkModernBootstrapCommandOptions): Promise<string>;
105
+ cdk(args: string[], options?: CdkCliOptions): Promise<string>;
106
+ template(stackName: string): any;
107
+ get bootstrapStackName(): string;
108
+ fullStackName(stackName: string): string;
109
+ fullStackName(stackNames: string[]): string[];
110
+ /**
111
+ * Append this to the list of buckets to potentially delete
112
+ *
113
+ * At the end of a test, we clean up buckets that may not have gotten destroyed
114
+ * (for whatever reason).
115
+ */
116
+ rememberToDeleteBucket(bucketName: string): void;
117
+ /**
118
+ * Cleanup leftover stacks and buckets
119
+ */
120
+ dispose(success: boolean): Promise<void>;
121
+ /**
122
+ * Return the stacks starting with our testing prefix that should be deleted
123
+ */
124
+ private deleteableStacks;
125
+ private sortBootstrapStacksToTheEnd;
126
+ }
127
+ /**
128
+ * Install the given NPM packages, identified by their names and versions
129
+ *
130
+ * Works by writing the packages to a `package.json` file, and
131
+ * then running NPM7's "install" on it. The use of NPM7 will automatically
132
+ * install required peerDependencies.
133
+ *
134
+ * If we're running in REPO mode and we find the package in the set of local
135
+ * packages in the repository, we'll write the directory name to `package.json`
136
+ * so that NPM will create a symlink (this allows running tests against
137
+ * built-but-unpackaged modules, and saves dev cycle time).
138
+ *
139
+ * Be aware you MUST install all the packages you directly depend upon! In the case
140
+ * of a repo/symlinking install, transitive dependencies WILL NOT be installed in the
141
+ * current directory's `node_modules` directory, because they will already have been
142
+ * symlinked from the TARGET directory's `node_modules` directory (which is sufficient
143
+ * for Node's dependency lookup mechanism).
144
+ */
145
+ export declare function installNpmPackages(fixture: TestFixture, packages: Record<string, string>): Promise<void>;
146
+ export {};