aws-cdk 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 (402) hide show
  1. package/CONTRIBUTING.md +276 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +16 -0
  4. package/README.md +1274 -0
  5. package/THIRD_PARTY_LICENSES +26821 -0
  6. package/bin/cdk +6 -0
  7. package/build-info.json +4 -0
  8. package/db.json.gz +0 -0
  9. package/generate.sh +25 -0
  10. package/images/garbage-collection.png +0 -0
  11. package/lib/api/aws-auth/account-cache.d.ts +39 -0
  12. package/lib/api/aws-auth/account-cache.js +102 -0
  13. package/lib/api/aws-auth/awscli-compatible.d.ts +42 -0
  14. package/lib/api/aws-auth/awscli-compatible.js +264 -0
  15. package/lib/api/aws-auth/cached.d.ts +11 -0
  16. package/lib/api/aws-auth/cached.js +26 -0
  17. package/lib/api/aws-auth/credential-plugins.d.ts +36 -0
  18. package/lib/api/aws-auth/credential-plugins.js +153 -0
  19. package/lib/api/aws-auth/index.d.ts +3 -0
  20. package/lib/api/aws-auth/index.js +20 -0
  21. package/lib/api/aws-auth/provider-caching.d.ts +13 -0
  22. package/lib/api/aws-auth/provider-caching.js +24 -0
  23. package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
  24. package/lib/api/aws-auth/sdk-logger.js +130 -0
  25. package/lib/api/aws-auth/sdk-provider.d.ts +207 -0
  26. package/lib/api/aws-auth/sdk-provider.js +359 -0
  27. package/lib/api/aws-auth/sdk.d.ts +223 -0
  28. package/lib/api/aws-auth/sdk.js +366 -0
  29. package/lib/api/aws-auth/tracing.d.ts +11 -0
  30. package/lib/api/aws-auth/tracing.js +61 -0
  31. package/lib/api/aws-auth/user-agent.d.ts +7 -0
  32. package/lib/api/aws-auth/user-agent.js +21 -0
  33. package/lib/api/aws-auth/util.d.ts +6 -0
  34. package/lib/api/aws-auth/util.js +23 -0
  35. package/lib/api/bootstrap/bootstrap-environment.d.ts +33 -0
  36. package/lib/api/bootstrap/bootstrap-environment.js +322 -0
  37. package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
  38. package/lib/api/bootstrap/bootstrap-props.js +14 -0
  39. package/lib/api/bootstrap/bootstrap-template.yaml +692 -0
  40. package/lib/api/bootstrap/deploy-bootstrap.d.ts +37 -0
  41. package/lib/api/bootstrap/deploy-bootstrap.js +143 -0
  42. package/lib/api/bootstrap/index.d.ts +2 -0
  43. package/lib/api/bootstrap/index.js +19 -0
  44. package/lib/api/bootstrap/legacy-template.d.ts +2 -0
  45. package/lib/api/bootstrap/legacy-template.js +82 -0
  46. package/lib/api/context.d.ts +40 -0
  47. package/lib/api/context.js +82 -0
  48. package/lib/api/cxapp/cloud-assembly.d.ts +150 -0
  49. package/lib/api/cxapp/cloud-assembly.js +305 -0
  50. package/lib/api/cxapp/cloud-executable.d.ts +44 -0
  51. package/lib/api/cxapp/cloud-executable.js +90 -0
  52. package/lib/api/cxapp/environments.d.ts +9 -0
  53. package/lib/api/cxapp/environments.js +66 -0
  54. package/lib/api/cxapp/exec.d.ts +56 -0
  55. package/lib/api/cxapp/exec.js +275 -0
  56. package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
  57. package/lib/api/deployments/asset-manifest-builder.js +35 -0
  58. package/lib/api/deployments/asset-publishing.d.ts +77 -0
  59. package/lib/api/deployments/asset-publishing.js +163 -0
  60. package/lib/api/deployments/assets.d.ts +10 -0
  61. package/lib/api/deployments/assets.js +111 -0
  62. package/lib/api/deployments/checks.d.ts +8 -0
  63. package/lib/api/deployments/checks.js +73 -0
  64. package/lib/api/deployments/cloudformation.d.ts +235 -0
  65. package/lib/api/deployments/cloudformation.js +598 -0
  66. package/lib/api/deployments/deploy-stack.d.ts +177 -0
  67. package/lib/api/deployments/deploy-stack.js +484 -0
  68. package/lib/api/deployments/deployment-method.d.ts +24 -0
  69. package/lib/api/deployments/deployment-method.js +3 -0
  70. package/lib/api/deployments/deployment-result.d.ts +21 -0
  71. package/lib/api/deployments/deployment-result.js +10 -0
  72. package/lib/api/deployments/deployments.d.ts +340 -0
  73. package/lib/api/deployments/deployments.js +369 -0
  74. package/lib/api/deployments/hotswap-deployments.d.ts +14 -0
  75. package/lib/api/deployments/hotswap-deployments.js +357 -0
  76. package/lib/api/deployments/index.d.ts +6 -0
  77. package/lib/api/deployments/index.js +23 -0
  78. package/lib/api/deployments/nested-stack-helpers.d.ts +25 -0
  79. package/lib/api/deployments/nested-stack-helpers.js +88 -0
  80. package/lib/api/environment-access.d.ts +138 -0
  81. package/lib/api/environment-access.js +203 -0
  82. package/lib/api/environment-resources.d.ts +73 -0
  83. package/lib/api/environment-resources.js +208 -0
  84. package/lib/api/evaluate-cloudformation-template.d.ts +84 -0
  85. package/lib/api/evaluate-cloudformation-template.js +443 -0
  86. package/lib/api/garbage-collection/garbage-collector.d.ts +152 -0
  87. package/lib/api/garbage-collection/garbage-collector.js +607 -0
  88. package/lib/api/garbage-collection/progress-printer.d.ts +21 -0
  89. package/lib/api/garbage-collection/progress-printer.js +69 -0
  90. package/lib/api/garbage-collection/stack-refresh.d.ts +44 -0
  91. package/lib/api/garbage-collection/stack-refresh.js +154 -0
  92. package/lib/api/hotswap/appsync-mapping-templates.d.ts +3 -0
  93. package/lib/api/hotswap/appsync-mapping-templates.js +157 -0
  94. package/lib/api/hotswap/code-build-projects.d.ts +3 -0
  95. package/lib/api/hotswap/code-build-projects.js +55 -0
  96. package/lib/api/hotswap/common.d.ts +126 -0
  97. package/lib/api/hotswap/common.js +170 -0
  98. package/lib/api/hotswap/ecs-services.d.ts +3 -0
  99. package/lib/api/hotswap/ecs-services.js +140 -0
  100. package/lib/api/hotswap/lambda-functions.d.ts +3 -0
  101. package/lib/api/hotswap/lambda-functions.js +309 -0
  102. package/lib/api/hotswap/s3-bucket-deployments.d.ts +9 -0
  103. package/lib/api/hotswap/s3-bucket-deployments.js +112 -0
  104. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +3 -0
  105. package/lib/api/hotswap/stepfunctions-state-machines.js +42 -0
  106. package/lib/api/index.d.ts +5 -0
  107. package/lib/api/index.js +22 -0
  108. package/lib/api/logs/find-cloudwatch-logs.d.ts +24 -0
  109. package/lib/api/logs/find-cloudwatch-logs.js +97 -0
  110. package/lib/api/logs/logs-monitor.d.ts +53 -0
  111. package/lib/api/logs/logs-monitor.js +169 -0
  112. package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
  113. package/lib/api/plugin/context-provider-plugin.js +7 -0
  114. package/lib/api/plugin/index.d.ts +3 -0
  115. package/lib/api/plugin/index.js +20 -0
  116. package/lib/api/plugin/mode.d.ts +4 -0
  117. package/lib/api/plugin/mode.js +9 -0
  118. package/lib/api/plugin/plugin.d.ts +63 -0
  119. package/lib/api/plugin/plugin.js +106 -0
  120. package/lib/api/settings.d.ts +29 -0
  121. package/lib/api/settings.js +141 -0
  122. package/lib/api/tags.d.ts +9 -0
  123. package/lib/api/tags.js +10 -0
  124. package/lib/api/toolkit-info.d.ts +51 -0
  125. package/lib/api/toolkit-info.js +156 -0
  126. package/lib/api/util/cloudformation/stack-activity-monitor.d.ts +237 -0
  127. package/lib/api/util/cloudformation/stack-activity-monitor.js +550 -0
  128. package/lib/api/util/cloudformation/stack-event-poller.d.ts +63 -0
  129. package/lib/api/util/cloudformation/stack-event-poller.js +129 -0
  130. package/lib/api/util/cloudformation/stack-status.d.ts +42 -0
  131. package/lib/api/util/cloudformation/stack-status.js +88 -0
  132. package/lib/api/util/display.d.ts +13 -0
  133. package/lib/api/util/display.js +80 -0
  134. package/lib/api/util/placeholders.d.ts +10 -0
  135. package/lib/api/util/placeholders.js +24 -0
  136. package/lib/api/util/rwlock.d.ts +65 -0
  137. package/lib/api/util/rwlock.js +179 -0
  138. package/lib/api/util/string-manipulation.d.ts +10 -0
  139. package/lib/api/util/string-manipulation.js +33 -0
  140. package/lib/api/util/template-body-parameter.d.ts +21 -0
  141. package/lib/api/util/template-body-parameter.js +104 -0
  142. package/lib/cli/cdk-toolkit.d.ts +594 -0
  143. package/lib/cli/cdk-toolkit.js +1019 -0
  144. package/lib/cli/cli-config.d.ts +10 -0
  145. package/lib/cli/cli-config.js +406 -0
  146. package/lib/cli/cli.d.ts +4 -0
  147. package/lib/cli/cli.js +538 -0
  148. package/lib/cli/convert-to-user-input.d.ts +3 -0
  149. package/lib/cli/convert-to-user-input.js +434 -0
  150. package/lib/cli/parse-command-line-arguments.d.ts +1 -0
  151. package/lib/cli/parse-command-line-arguments.js +806 -0
  152. package/lib/cli/platform-warnings.d.ts +2 -0
  153. package/lib/cli/platform-warnings.js +45 -0
  154. package/lib/cli/user-configuration.d.ts +90 -0
  155. package/lib/cli/user-configuration.js +272 -0
  156. package/lib/cli/user-input.d.ts +1163 -0
  157. package/lib/cli/user-input.js +3 -0
  158. package/lib/cli/util/console-formatters.d.ts +18 -0
  159. package/lib/cli/util/console-formatters.js +42 -0
  160. package/lib/cli/util/npm.d.ts +1 -0
  161. package/lib/cli/util/npm.js +22 -0
  162. package/lib/cli/util/yargs-helpers.d.ts +22 -0
  163. package/lib/cli/util/yargs-helpers.js +49 -0
  164. package/lib/cli/version.d.ts +13 -0
  165. package/lib/cli/version.js +120 -0
  166. package/lib/commands/context.d.ts +35 -0
  167. package/lib/commands/context.js +156 -0
  168. package/lib/commands/docs.d.ts +13 -0
  169. package/lib/commands/docs.js +32 -0
  170. package/lib/commands/doctor.d.ts +1 -0
  171. package/lib/commands/doctor.js +69 -0
  172. package/lib/commands/migrate.d.ts +327 -0
  173. package/lib/commands/migrate.js +804 -0
  174. package/lib/context-providers/ami.d.ts +11 -0
  175. package/lib/context-providers/ami.js +50 -0
  176. package/lib/context-providers/availability-zones.d.ts +11 -0
  177. package/lib/context-providers/availability-zones.js +27 -0
  178. package/lib/context-providers/endpoint-service-availability-zones.d.ts +11 -0
  179. package/lib/context-providers/endpoint-service-availability-zones.js +33 -0
  180. package/lib/context-providers/hosted-zones.d.ts +10 -0
  181. package/lib/context-providers/hosted-zones.js +67 -0
  182. package/lib/context-providers/index.d.ts +30 -0
  183. package/lib/context-providers/index.js +109 -0
  184. package/lib/context-providers/keys.d.ts +11 -0
  185. package/lib/context-providers/keys.js +52 -0
  186. package/lib/context-providers/load-balancers.d.ts +20 -0
  187. package/lib/context-providers/load-balancers.js +159 -0
  188. package/lib/context-providers/security-groups.d.ts +9 -0
  189. package/lib/context-providers/security-groups.js +70 -0
  190. package/lib/context-providers/ssm-parameters.d.ts +23 -0
  191. package/lib/context-providers/ssm-parameters.js +59 -0
  192. package/lib/context-providers/vpcs.d.ts +11 -0
  193. package/lib/context-providers/vpcs.js +288 -0
  194. package/lib/diff.d.ts +28 -0
  195. package/lib/diff.js +165 -0
  196. package/lib/import.d.ts +182 -0
  197. package/lib/import.js +335 -0
  198. package/lib/index.d.ts +3 -0
  199. package/lib/index.js +348304 -0
  200. package/lib/index_bg.wasm +0 -0
  201. package/lib/init-hooks.d.ts +40 -0
  202. package/lib/init-hooks.js +64 -0
  203. package/lib/init-templates/.init-version.json +1 -0
  204. package/lib/init-templates/.no-packagejson-validator +0 -0
  205. package/lib/init-templates/.recommended-feature-flags.json +68 -0
  206. package/lib/init-templates/LICENSE +16 -0
  207. package/lib/init-templates/app/csharp/.template.gitignore +342 -0
  208. package/lib/init-templates/app/csharp/README.md +14 -0
  209. package/lib/init-templates/app/csharp/cdk.template.json +15 -0
  210. package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
  211. package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +13 -0
  212. package/lib/init-templates/app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
  213. package/lib/init-templates/app/csharp/src/%name.PascalCased%/Program.template.cs +44 -0
  214. package/lib/init-templates/app/csharp/src/%name.PascalCased%.template.sln +18 -0
  215. package/lib/init-templates/app/fsharp/.template.gitignore +342 -0
  216. package/lib/init-templates/app/fsharp/README.md +18 -0
  217. package/lib/init-templates/app/fsharp/cdk.template.json +14 -0
  218. package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
  219. package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +8 -0
  220. package/lib/init-templates/app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
  221. package/lib/init-templates/app/fsharp/src/%name.PascalCased%.template.sln +18 -0
  222. package/lib/init-templates/app/go/%name%.template.go +70 -0
  223. package/lib/init-templates/app/go/%name%_test.template.go +26 -0
  224. package/lib/init-templates/app/go/.template.gitignore +19 -0
  225. package/lib/init-templates/app/go/README.md +12 -0
  226. package/lib/init-templates/app/go/cdk.template.json +13 -0
  227. package/lib/init-templates/app/go/go.template.mod +9 -0
  228. package/lib/init-templates/app/info.json +4 -0
  229. package/lib/init-templates/app/java/.template.gitignore +13 -0
  230. package/lib/init-templates/app/java/README.md +18 -0
  231. package/lib/init-templates/app/java/cdk.json +13 -0
  232. package/lib/init-templates/app/java/pom.xml +60 -0
  233. package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +42 -0
  234. package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +24 -0
  235. package/lib/init-templates/app/java/src/test/java/com/myorg/%name.PascalCased%Test.template.java +26 -0
  236. package/lib/init-templates/app/javascript/.template.gitignore +5 -0
  237. package/lib/init-templates/app/javascript/.template.npmignore +3 -0
  238. package/lib/init-templates/app/javascript/README.md +12 -0
  239. package/lib/init-templates/app/javascript/bin/%name%.template.js +21 -0
  240. package/lib/init-templates/app/javascript/cdk.template.json +15 -0
  241. package/lib/init-templates/app/javascript/jest.config.js +3 -0
  242. package/lib/init-templates/app/javascript/lib/%name%-stack.template.js +23 -0
  243. package/lib/init-templates/app/javascript/package.json +20 -0
  244. package/lib/init-templates/app/javascript/test/%name%.test.template.js +17 -0
  245. package/lib/init-templates/app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +19 -0
  246. package/lib/init-templates/app/python/%name.PythonModule%/__init__.py +0 -0
  247. package/lib/init-templates/app/python/.template.gitignore +10 -0
  248. package/lib/init-templates/app/python/README.template.md +58 -0
  249. package/lib/init-templates/app/python/app.template.py +28 -0
  250. package/lib/init-templates/app/python/cdk.template.json +15 -0
  251. package/lib/init-templates/app/python/requirements-dev.txt +1 -0
  252. package/lib/init-templates/app/python/requirements.txt +2 -0
  253. package/lib/init-templates/app/python/source.bat +13 -0
  254. package/lib/init-templates/app/python/tests/__init__.py +0 -0
  255. package/lib/init-templates/app/python/tests/unit/__init__.py +0 -0
  256. package/lib/init-templates/app/python/tests/unit/test_%name.PythonModule%_stack.template.py +15 -0
  257. package/lib/init-templates/app/typescript/.template.gitignore +8 -0
  258. package/lib/init-templates/app/typescript/.template.npmignore +6 -0
  259. package/lib/init-templates/app/typescript/README.md +14 -0
  260. package/lib/init-templates/app/typescript/bin/%name%.template.ts +20 -0
  261. package/lib/init-templates/app/typescript/cdk.template.json +17 -0
  262. package/lib/init-templates/app/typescript/jest.config.js +8 -0
  263. package/lib/init-templates/app/typescript/lib/%name%-stack.template.ts +16 -0
  264. package/lib/init-templates/app/typescript/package.json +26 -0
  265. package/lib/init-templates/app/typescript/test/%name%.test.template.ts +17 -0
  266. package/lib/init-templates/app/typescript/tsconfig.json +31 -0
  267. package/lib/init-templates/lib/info.json +4 -0
  268. package/lib/init-templates/lib/typescript/.template.gitignore +8 -0
  269. package/lib/init-templates/lib/typescript/.template.npmignore +6 -0
  270. package/lib/init-templates/lib/typescript/README.template.md +12 -0
  271. package/lib/init-templates/lib/typescript/jest.config.js +8 -0
  272. package/lib/init-templates/lib/typescript/lib/index.template.ts +21 -0
  273. package/lib/init-templates/lib/typescript/package.json +24 -0
  274. package/lib/init-templates/lib/typescript/test/%name%.test.template.ts +18 -0
  275. package/lib/init-templates/lib/typescript/tsconfig.json +31 -0
  276. package/lib/init-templates/sample-app/csharp/.template.gitignore +342 -0
  277. package/lib/init-templates/sample-app/csharp/README.template.md +19 -0
  278. package/lib/init-templates/sample-app/csharp/cdk.template.json +15 -0
  279. package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
  280. package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +24 -0
  281. package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
  282. package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/Program.template.cs +15 -0
  283. package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%.template.sln +18 -0
  284. package/lib/init-templates/sample-app/fsharp/.template.gitignore +342 -0
  285. package/lib/init-templates/sample-app/fsharp/README.template.md +20 -0
  286. package/lib/init-templates/sample-app/fsharp/cdk.template.json +14 -0
  287. package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
  288. package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +14 -0
  289. package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
  290. package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%.template.sln +18 -0
  291. package/lib/init-templates/sample-app/go/%name%.template.go +73 -0
  292. package/lib/init-templates/sample-app/go/%name%_test.template.go +25 -0
  293. package/lib/init-templates/sample-app/go/.template.gitignore +19 -0
  294. package/lib/init-templates/sample-app/go/README.md +12 -0
  295. package/lib/init-templates/sample-app/go/cdk.template.json +13 -0
  296. package/lib/init-templates/sample-app/go/go.template.mod +9 -0
  297. package/lib/init-templates/sample-app/info.json +4 -0
  298. package/lib/init-templates/sample-app/java/.template.gitignore +13 -0
  299. package/lib/init-templates/sample-app/java/README.template.md +19 -0
  300. package/lib/init-templates/sample-app/java/cdk.json +13 -0
  301. package/lib/init-templates/sample-app/java/pom.xml +55 -0
  302. package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +13 -0
  303. package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +29 -0
  304. package/lib/init-templates/sample-app/java/src/test/java/com/myorg/%name.PascalCased%StackTest.template.java +27 -0
  305. package/lib/init-templates/sample-app/javascript/.template.gitignore +5 -0
  306. package/lib/init-templates/sample-app/javascript/.template.npmignore +3 -0
  307. package/lib/init-templates/sample-app/javascript/README.template.md +13 -0
  308. package/lib/init-templates/sample-app/javascript/bin/%name%.template.js +6 -0
  309. package/lib/init-templates/sample-app/javascript/cdk.template.json +15 -0
  310. package/lib/init-templates/sample-app/javascript/jest.config.js +3 -0
  311. package/lib/init-templates/sample-app/javascript/lib/%name%-stack.template.js +25 -0
  312. package/lib/init-templates/sample-app/javascript/package.json +20 -0
  313. package/lib/init-templates/sample-app/javascript/test/%name%.test.template.js +16 -0
  314. package/lib/init-templates/sample-app/javascript/tsconfig.json +34 -0
  315. package/lib/init-templates/sample-app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +26 -0
  316. package/lib/init-templates/sample-app/python/%name.PythonModule%/__init__.py +0 -0
  317. package/lib/init-templates/sample-app/python/.template.gitignore +22 -0
  318. package/lib/init-templates/sample-app/python/README.template.md +65 -0
  319. package/lib/init-templates/sample-app/python/app.template.py +11 -0
  320. package/lib/init-templates/sample-app/python/cdk.template.json +15 -0
  321. package/lib/init-templates/sample-app/python/requirements-dev.txt +1 -0
  322. package/lib/init-templates/sample-app/python/requirements.txt +2 -0
  323. package/lib/init-templates/sample-app/python/source.bat +13 -0
  324. package/lib/init-templates/sample-app/python/tests/__init__.py +0 -0
  325. package/lib/init-templates/sample-app/python/tests/unit/__init__.py +0 -0
  326. package/lib/init-templates/sample-app/python/tests/unit/test_%name.PythonModule%_stack.template.py +21 -0
  327. package/lib/init-templates/sample-app/typescript/.template.gitignore +8 -0
  328. package/lib/init-templates/sample-app/typescript/.template.npmignore +6 -0
  329. package/lib/init-templates/sample-app/typescript/README.template.md +15 -0
  330. package/lib/init-templates/sample-app/typescript/bin/%name%.template.ts +6 -0
  331. package/lib/init-templates/sample-app/typescript/cdk.template.json +17 -0
  332. package/lib/init-templates/sample-app/typescript/jest.config.js +8 -0
  333. package/lib/init-templates/sample-app/typescript/lib/%name%-stack.template.ts +19 -0
  334. package/lib/init-templates/sample-app/typescript/package.json +26 -0
  335. package/lib/init-templates/sample-app/typescript/test/%name%.test.template.ts +17 -0
  336. package/lib/init-templates/sample-app/typescript/tsconfig.json +31 -0
  337. package/lib/init.d.ts +52 -0
  338. package/lib/init.js +430 -0
  339. package/lib/legacy-exports-source.d.ts +27 -0
  340. package/lib/legacy-exports-source.js +88 -0
  341. package/lib/legacy-exports.d.ts +10 -0
  342. package/lib/legacy-exports.js +28 -0
  343. package/lib/legacy-logging-source.d.ts +32 -0
  344. package/lib/legacy-logging-source.js +107 -0
  345. package/lib/list-stacks.d.ts +22 -0
  346. package/lib/list-stacks.js +23 -0
  347. package/lib/logging.d.ts +109 -0
  348. package/lib/logging.js +159 -0
  349. package/lib/migrator.d.ts +25 -0
  350. package/lib/migrator.js +67 -0
  351. package/lib/notices.d.ts +156 -0
  352. package/lib/notices.js +373 -0
  353. package/lib/os.d.ts +7 -0
  354. package/lib/os.js +92 -0
  355. package/lib/serialize.d.ts +27 -0
  356. package/lib/serialize.js +86 -0
  357. package/lib/toolkit/cli-io-host.d.ts +208 -0
  358. package/lib/toolkit/cli-io-host.js +282 -0
  359. package/lib/toolkit/error.d.ts +44 -0
  360. package/lib/toolkit/error.js +78 -0
  361. package/lib/tree.d.ts +31 -0
  362. package/lib/tree.js +40 -0
  363. package/lib/util/archive.d.ts +1 -0
  364. package/lib/util/archive.js +86 -0
  365. package/lib/util/arrays.d.ts +14 -0
  366. package/lib/util/arrays.js +36 -0
  367. package/lib/util/bool.d.ts +7 -0
  368. package/lib/util/bool.js +13 -0
  369. package/lib/util/bytes.d.ts +8 -0
  370. package/lib/util/bytes.js +21 -0
  371. package/lib/util/content-hash.d.ts +5 -0
  372. package/lib/util/content-hash.js +43 -0
  373. package/lib/util/directories.d.ts +23 -0
  374. package/lib/util/directories.js +57 -0
  375. package/lib/util/error.d.ts +9 -0
  376. package/lib/util/error.js +22 -0
  377. package/lib/util/index.d.ts +5 -0
  378. package/lib/util/index.js +22 -0
  379. package/lib/util/objects.d.ts +52 -0
  380. package/lib/util/objects.js +183 -0
  381. package/lib/util/parallel.d.ts +6 -0
  382. package/lib/util/parallel.js +44 -0
  383. package/lib/util/tables.d.ts +1 -0
  384. package/lib/util/tables.js +10 -0
  385. package/lib/util/type-brands.d.ts +39 -0
  386. package/lib/util/type-brands.js +38 -0
  387. package/lib/util/types.d.ts +27 -0
  388. package/lib/util/types.js +25 -0
  389. package/lib/util/validate-notification-arn.d.ts +4 -0
  390. package/lib/util/validate-notification-arn.js +10 -0
  391. package/lib/util/version-range.d.ts +2 -0
  392. package/lib/util/version-range.js +36 -0
  393. package/lib/util/work-graph-builder.d.ts +32 -0
  394. package/lib/util/work-graph-builder.js +167 -0
  395. package/lib/util/work-graph-types.d.ts +50 -0
  396. package/lib/util/work-graph-types.js +14 -0
  397. package/lib/util/work-graph.d.ts +70 -0
  398. package/lib/util/work-graph.js +344 -0
  399. package/lib/util/yaml-cfn.d.ts +15 -0
  400. package/lib/util/yaml-cfn.js +56 -0
  401. package/package.json +197 -0
  402. package/scripts/user-input-gen +2 -0
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RWLock = void 0;
4
+ const fs_1 = require("fs");
5
+ const path = require("path");
6
+ const error_1 = require("../../toolkit/error");
7
+ /**
8
+ * A single-writer/multi-reader lock on a directory
9
+ *
10
+ * It uses marker files with PIDs in them as a locking marker; the PIDs will be
11
+ * checked for liveness, so that if the process exits without cleaning up the
12
+ * files the lock is implicitly released.
13
+ *
14
+ * This class is not 100% race safe, but in practice it should be a lot
15
+ * better than the 0 protection we have today.
16
+ */
17
+ /* istanbul ignore next: code paths are unpredictable */
18
+ class RWLock {
19
+ constructor(directory) {
20
+ this.directory = directory;
21
+ this.readCounter = 0;
22
+ this.pidString = `${process.pid}`;
23
+ this.writerFile = path.join(this.directory, 'synth.lock');
24
+ }
25
+ /**
26
+ * Acquire a writer lock.
27
+ *
28
+ * No other readers or writers must exist for the given directory.
29
+ */
30
+ async acquireWrite() {
31
+ await this.assertNoOtherWriters();
32
+ const readers = await this.currentReaders();
33
+ if (readers.length > 0) {
34
+ throw new error_1.ToolkitError(`Other CLIs (PID=${readers}) are currently reading from ${this.directory}. Invoke the CLI in sequence, or use '--output' to synth into different directories.`);
35
+ }
36
+ await writeFileAtomic(this.writerFile, this.pidString);
37
+ return {
38
+ release: async () => {
39
+ await deleteFile(this.writerFile);
40
+ },
41
+ convertToReaderLock: async () => {
42
+ // Acquire the read lock before releasing the write lock. Slightly less
43
+ // chance of racing!
44
+ const ret = await this.doAcquireRead();
45
+ await deleteFile(this.writerFile);
46
+ return ret;
47
+ },
48
+ };
49
+ }
50
+ /**
51
+ * Acquire a read lock
52
+ *
53
+ * Will fail if there are any writers.
54
+ */
55
+ async acquireRead() {
56
+ await this.assertNoOtherWriters();
57
+ return this.doAcquireRead();
58
+ }
59
+ /**
60
+ * Obtains the name fo a (new) `readerFile` to use. This includes a counter so
61
+ * that if multiple threads of the same PID attempt to concurrently acquire
62
+ * the same lock, they're guaranteed to use a different reader file name (only
63
+ * one thread will ever execute JS code at once, guaranteeing the readCounter
64
+ * is incremented "atomically" from the point of view of this PID.).
65
+ */
66
+ readerFile() {
67
+ return path.join(this.directory, `read.${this.pidString}.${++this.readCounter}.lock`);
68
+ }
69
+ /**
70
+ * Do the actual acquiring of a read lock.
71
+ */
72
+ async doAcquireRead() {
73
+ const readerFile = this.readerFile();
74
+ await writeFileAtomic(readerFile, this.pidString);
75
+ return {
76
+ release: async () => {
77
+ await deleteFile(readerFile);
78
+ },
79
+ };
80
+ }
81
+ async assertNoOtherWriters() {
82
+ const writer = await this.currentWriter();
83
+ if (writer) {
84
+ throw new error_1.ToolkitError(`Another CLI (PID=${writer}) is currently synthing to ${this.directory}. Invoke the CLI in sequence, or use '--output' to synth into different directories.`);
85
+ }
86
+ }
87
+ /**
88
+ * Check the current writer (if any)
89
+ */
90
+ async currentWriter() {
91
+ const contents = await readFileIfExists(this.writerFile);
92
+ if (!contents) {
93
+ return undefined;
94
+ }
95
+ const pid = parseInt(contents, 10);
96
+ if (!processExists(pid)) {
97
+ // Do cleanup of a stray file now
98
+ await deleteFile(this.writerFile);
99
+ return undefined;
100
+ }
101
+ return pid;
102
+ }
103
+ /**
104
+ * Check the current readers (if any)
105
+ */
106
+ async currentReaders() {
107
+ const re = /^read\.([^.]+)\.[^.]+\.lock$/;
108
+ const ret = new Array();
109
+ let children;
110
+ try {
111
+ children = await fs_1.promises.readdir(this.directory, { encoding: 'utf-8' });
112
+ }
113
+ catch (e) {
114
+ // Can't be locked if the directory doesn't exist
115
+ if (e.code === 'ENOENT') {
116
+ return [];
117
+ }
118
+ throw e;
119
+ }
120
+ for (const fname of children) {
121
+ const m = fname.match(re);
122
+ if (m) {
123
+ const pid = parseInt(m[1], 10);
124
+ if (processExists(pid)) {
125
+ ret.push(pid);
126
+ }
127
+ else {
128
+ // Do cleanup of a stray file now
129
+ await deleteFile(path.join(this.directory, fname));
130
+ }
131
+ }
132
+ }
133
+ return ret;
134
+ }
135
+ }
136
+ exports.RWLock = RWLock;
137
+ /* istanbul ignore next: code paths are unpredictable */
138
+ async function readFileIfExists(filename) {
139
+ try {
140
+ return await fs_1.promises.readFile(filename, { encoding: 'utf-8' });
141
+ }
142
+ catch (e) {
143
+ if (e.code === 'ENOENT') {
144
+ return undefined;
145
+ }
146
+ throw e;
147
+ }
148
+ }
149
+ let tmpCounter = 0;
150
+ /* istanbul ignore next: code paths are unpredictable */
151
+ async function writeFileAtomic(filename, contents) {
152
+ await fs_1.promises.mkdir(path.dirname(filename), { recursive: true });
153
+ const tmpFile = `${filename}.${process.pid}_${++tmpCounter}`;
154
+ await fs_1.promises.writeFile(tmpFile, contents, { encoding: 'utf-8' });
155
+ await fs_1.promises.rename(tmpFile, filename);
156
+ }
157
+ /* istanbul ignore next: code paths are unpredictable */
158
+ async function deleteFile(filename) {
159
+ try {
160
+ await fs_1.promises.unlink(filename);
161
+ }
162
+ catch (e) {
163
+ if (e.code === 'ENOENT') {
164
+ return;
165
+ }
166
+ throw e;
167
+ }
168
+ }
169
+ /* istanbul ignore next: code paths are unpredictable */
170
+ function processExists(pid) {
171
+ try {
172
+ process.kill(pid, 0);
173
+ return true;
174
+ }
175
+ catch (e) {
176
+ return false;
177
+ }
178
+ }
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicndsb2NrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicndsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJCQUFvQztBQUNwQyw2QkFBNkI7QUFDN0IsK0NBQW1EO0FBRW5EOzs7Ozs7Ozs7R0FTRztBQUNILHdEQUF3RDtBQUN4RCxNQUFhLE1BQU07SUFLakIsWUFBNEIsU0FBaUI7UUFBakIsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUZyQyxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUd0QixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLFlBQVk7UUFDdkIsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUVsQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLG9CQUFZLENBQUMsbUJBQW1CLE9BQU8sZ0NBQWdDLElBQUksQ0FBQyxTQUFTLHNGQUFzRixDQUFDLENBQUM7UUFDekwsQ0FBQztRQUVELE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXZELE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2xCLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsbUJBQW1CLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQzlCLHVFQUF1RTtnQkFDdkUsb0JBQW9CO2dCQUNwQixNQUFNLEdBQUcs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QUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3RCxNQUFNLGFBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCx3REFBd0Q7QUFDeEQsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUN4QyxJQUFJLENBQUM7UUFDSCxNQUFNLGFBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUM7SUFDVixDQUFDO0FBQ0gsQ0FBQztBQUVELHdEQUF3RDtBQUN4RCxTQUFTLGFBQWEsQ0FBQyxHQUFXO0lBQ2hDLElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC9lcnJvcic7XG5cbi8qKlxuICogQSBzaW5nbGUtd3JpdGVyL211bHRpLXJlYWRlciBsb2NrIG9uIGEgZGlyZWN0b3J5XG4gKlxuICogSXQgdXNlcyBtYXJrZXIgZmlsZXMgd2l0aCBQSURzIGluIHRoZW0gYXMgYSBsb2NraW5nIG1hcmtlcjsgdGhlIFBJRHMgd2lsbCBiZVxuICogY2hlY2tlZCBmb3IgbGl2ZW5lc3MsIHNvIHRoYXQgaWYgdGhlIHByb2Nlc3MgZXhpdHMgd2l0aG91dCBjbGVhbmluZyB1cCB0aGVcbiAqIGZpbGVzIHRoZSBsb2NrIGlzIGltcGxpY2l0bHkgcmVsZWFzZWQuXG4gKlxuICogVGhpcyBjbGFzcyBpcyBub3QgMTAwJSByYWNlIHNhZmUsIGJ1dCBpbiBwcmFjdGljZSBpdCBzaG91bGQgYmUgYSBsb3RcbiAqIGJldHRlciB0aGFuIHRoZSAwIHByb3RlY3Rpb24gd2UgaGF2ZSB0b2RheS5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGNvZGUgcGF0aHMgYXJlIHVucHJlZGljdGFibGUgKi9cbmV4cG9ydCBjbGFzcyBSV0xvY2sge1xuICBwcml2YXRlIHJlYWRvbmx5IHBpZFN0cmluZzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlckZpbGU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkQ291bnRlciA9IDA7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nKSB7XG4gICAgdGhpcy5waWRTdHJpbmcgPSBgJHtwcm9jZXNzLnBpZH1gO1xuXG4gICAgdGhpcy53cml0ZXJGaWxlID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnc3ludGgubG9jaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgYSB3cml0ZXIgbG9jay5cbiAgICpcbiAgICogTm8gb3RoZXIgcmVhZGVycyBvciB3cml0ZXJzIG11c3QgZXhpc3QgZm9yIHRoZSBnaXZlbiBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWNxdWlyZVdyaXRlKCk6IFByb21pc2U8SVdyaXRlckxvY2s+IHtcbiAgICBhd2FpdCB0aGlzLmFzc2VydE5vT3RoZXJXcml0ZXJzKCk7XG5cbiAgICBjb25zdCByZWFkZXJzID0gYXdhaXQgdGhpcy5jdXJyZW50UmVhZGVycygpO1xuICAgIGlmIChyZWFkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYE90aGVyIENMSXMgKFBJRD0ke3JlYWRlcnN9KSBhcmUgY3VycmVudGx5IHJlYWRpbmcgZnJvbSAke3RoaXMuZGlyZWN0b3J5fS4gSW52b2tlIHRoZSBDTEkgaW4gc2VxdWVuY2UsIG9yIHVzZSAnLS1vdXRwdXQnIHRvIHN5bnRoIGludG8gZGlmZmVyZW50IGRpcmVjdG9yaWVzLmApO1xuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZUF0b21pYyh0aGlzLndyaXRlckZpbGUsIHRoaXMucGlkU3RyaW5nKTtcblxuICAgIHJldHVybiB7XG4gICAgICByZWxlYXNlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZUZpbGUodGhpcy53cml0ZXJGaWxlKTtcbiAgICAgIH0sXG4gICAgICBjb252ZXJ0VG9SZWFkZXJMb2NrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlYWQgbG9jayBiZWZvcmUgcmVsZWFzaW5nIHRoZSB3cml0ZSBsb2NrLiBTbGlnaHRseSBsZXNzXG4gICAgICAgIC8vIGNoYW5jZSBvZiByYWNpbmchXG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuZG9BY3F1aXJlUmVhZCgpO1xuICAgICAgICBhd2FpdCBkZWxldGVGaWxlKHRoaXMud3JpdGVyRmlsZSk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBhIHJlYWQgbG9ja1xuICAgKlxuICAgKiBXaWxsIGZhaWwgaWYgdGhlcmUgYXJlIGFueSB3cml0ZXJzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjcXVpcmVSZWFkKCk6IFByb21pc2U8SUxvY2s+IHtcbiAgICBhd2FpdCB0aGlzLmFzc2VydE5vT3RoZXJXcml0ZXJzKCk7XG4gICAgcmV0dXJuIHRoaXMuZG9BY3F1aXJlUmVhZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGFpbnMgdGhlIG5hbWUgZm8gYSAobmV3KSBgcmVhZGVyRmlsZWAgdG8gdXNlLiBUaGlzIGluY2x1ZGVzIGEgY291bnRlciBzb1xuICAgKiB0aGF0IGlmIG11bHRpcGxlIHRocmVhZHMgb2YgdGhlIHNhbWUgUElEIGF0dGVtcHQgdG8gY29uY3VycmVudGx5IGFjcXVpcmVcbiAgICogdGhlIHNhbWUgbG9jaywgdGhleSdyZSBndWFyYW50ZWVkIHRvIHVzZSBhIGRpZmZlcmVudCByZWFkZXIgZmlsZSBuYW1lIChvbmx5XG4gICAqIG9uZSB0aHJlYWQgd2lsbCBldmVyIGV4ZWN1dGUgSlMgY29kZSBhdCBvbmNlLCBndWFyYW50ZWVpbmcgdGhlIHJlYWRDb3VudGVyXG4gICAqIGlzIGluY3JlbWVudGVkIFwiYXRvbWljYWxseVwiIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhpcyBQSUQuKS5cbiAgICovXG4gIHByaXZhdGUgcmVhZGVyRmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGByZWFkLiR7dGhpcy5waWRTdHJpbmd9LiR7Kyt0aGlzLnJlYWRDb3VudGVyfS5sb2NrYCk7XG4gIH1cblxuICAvKipcbiAgICogRG8gdGhlIGFjdHVhbCBhY3F1aXJpbmcgb2YgYSByZWFkIGxvY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRvQWNxdWlyZVJlYWQoKTogUHJvbWlzZTxJTG9jaz4ge1xuICAgIGNvbnN0IHJlYWRlckZpbGUgPSB0aGlzLnJlYWRlckZpbGUoKTtcbiAgICBhd2FpdCB3cml0ZUZpbGVBdG9taWMocmVhZGVyRmlsZSwgdGhpcy5waWRTdHJpbmcpO1xuICAgIHJldHVybiB7XG4gICAgICByZWxlYXNlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZUZpbGUocmVhZGVyRmlsZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFzc2VydE5vT3RoZXJXcml0ZXJzKCkge1xuICAgIGNvbnN0IHdyaXRlciA9IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlcigpO1xuICAgIGlmICh3cml0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYEFub3RoZXIgQ0xJIChQSUQ9JHt3cml0ZXJ9KSBpcyBjdXJyZW50bHkgc3ludGhpbmcgdG8gJHt0aGlzLmRpcmVjdG9yeX0uIEludm9rZSB0aGUgQ0xJIGluIHNlcXVlbmNlLCBvciB1c2UgJy0tb3V0cHV0JyB0byBzeW50aCBpbnRvIGRpZmZlcmVudCBkaXJlY3Rvcmllcy5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIGN1cnJlbnQgd3JpdGVyIChpZiBhbnkpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGN1cnJlbnRXcml0ZXIoKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IHJlYWRGaWxlSWZFeGlzdHModGhpcy53cml0ZXJGaWxlKTtcbiAgICBpZiAoIWNvbnRlbnRzKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cblxuICAgIGNvbnN0IHBpZCA9IHBhcnNlSW50KGNvbnRlbnRzLCAxMCk7XG4gICAgaWYgKCFwcm9jZXNzRXhpc3RzKHBpZCkpIHtcbiAgICAgIC8vIERvIGNsZWFudXAgb2YgYSBzdHJheSBmaWxlIG5vd1xuICAgICAgYXdhaXQgZGVsZXRlRmlsZSh0aGlzLndyaXRlckZpbGUpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSBjdXJyZW50IHJlYWRlcnMgKGlmIGFueSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3VycmVudFJlYWRlcnMoKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHJlID0gL15yZWFkXFwuKFteLl0rKVxcLlteLl0rXFwubG9jayQvO1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cbiAgICBsZXQgY2hpbGRyZW47XG4gICAgdHJ5IHtcbiAgICAgIGNoaWxkcmVuID0gYXdhaXQgZnMucmVhZGRpcih0aGlzLmRpcmVjdG9yeSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIC8vIENhbid0IGJlIGxvY2tlZCBpZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGlmIChlLmNvZGUgPT09ICdFTk9FTlQnKSB7IHJldHVybiBbXTsgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZuYW1lIG9mIGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBtID0gZm5hbWUubWF0Y2gocmUpO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgY29uc3QgcGlkID0gcGFyc2VJbnQobVsxXSwgMTApO1xuICAgICAgICBpZiAocHJvY2Vzc0V4aXN0cyhwaWQpKSB7XG4gICAgICAgICAgcmV0LnB1c2gocGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEbyBjbGVhbnVwIG9mIGEgc3RyYXkgZmlsZSBub3dcbiAgICAgICAgICBhd2FpdCBkZWxldGVGaWxlKHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgZm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5cbi8qKlxuICogQW4gYWNxdWlyZWQgbG9ja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElMb2NrIHtcbiAgcmVsZWFzZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEFuIGFjcXVpcmVkIHdyaXRlciBsb2NrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVdyaXRlckxvY2sgZXh0ZW5kcyBJTG9jayB7XG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSB3cml0ZXIgbG9jayB0byBhIHJlYWRlciBsb2NrXG4gICAqL1xuICBjb252ZXJ0VG9SZWFkZXJMb2NrKCk6IFByb21pc2U8SUxvY2s+O1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogY29kZSBwYXRocyBhcmUgdW5wcmVkaWN0YWJsZSAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEZpbGVJZkV4aXN0cyhmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZEZpbGUoZmlsZW5hbWUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGlmIChlLmNvZGUgPT09ICdFTk9FTlQnKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbmxldCB0bXBDb3VudGVyID0gMDtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBjb2RlIHBhdGhzIGFyZSB1bnByZWRpY3RhYmxlICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUZpbGVBdG9taWMoZmlsZW5hbWU6IHN0cmluZywgY29udGVudHM6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZW5hbWUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgdG1wRmlsZSA9IGAke2ZpbGVuYW1lfS4ke3Byb2Nlc3MucGlkfV8keysrdG1wQ291bnRlcn1gO1xuICBhd2FpdCBmcy53cml0ZUZpbGUodG1wRmlsZSwgY29udGVudHMsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gIGF3YWl0IGZzLnJlbmFtZSh0bXBGaWxlLCBmaWxlbmFtZSk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBjb2RlIHBhdGhzIGFyZSB1bnByZWRpY3RhYmxlICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGaWxlKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy51bmxpbmsoZmlsZW5hbWUpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICBpZiAoZS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBjb2RlIHBhdGhzIGFyZSB1bnByZWRpY3RhYmxlICovXG5mdW5jdGlvbiBwcm9jZXNzRXhpc3RzKHBpZDogbnVtYmVyKSB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Pad 's' on the left with 'char' until it is n characters wide
3
+ */
4
+ export declare function leftPad(s: string, n: number, char: string): string;
5
+ /**
6
+ * Formats time in milliseconds (which we get from 'Date.getTime()')
7
+ * to a human-readable time; returns time in seconds rounded to 2
8
+ * decimal places.
9
+ */
10
+ export declare function formatTime(num: number): number;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.leftPad = leftPad;
4
+ exports.formatTime = formatTime;
5
+ /**
6
+ * Pad 's' on the left with 'char' until it is n characters wide
7
+ */
8
+ function leftPad(s, n, char) {
9
+ const padding = Math.max(0, n - s.length);
10
+ return char.repeat(padding) + s;
11
+ }
12
+ /**
13
+ * Formats time in milliseconds (which we get from 'Date.getTime()')
14
+ * to a human-readable time; returns time in seconds rounded to 2
15
+ * decimal places.
16
+ */
17
+ function formatTime(num) {
18
+ return roundPercentage(millisecondsToSeconds(num));
19
+ }
20
+ /**
21
+ * Rounds a decimal number to two decimal points.
22
+ * The function is useful for fractions that need to be outputted as percentages.
23
+ */
24
+ function roundPercentage(num) {
25
+ return Math.round(100 * num) / 100;
26
+ }
27
+ /**
28
+ * Given a time in milliseconds, return an equivalent amount in seconds.
29
+ */
30
+ function millisecondsToSeconds(num) {
31
+ return num / 1000;
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLW1hbmlwdWxhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0cmluZy1tYW5pcHVsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSwwQkFHQztBQU9ELGdDQUVDO0FBZkQ7O0dBRUc7QUFDSCxTQUFnQixPQUFPLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxJQUFZO0lBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxHQUFXO0lBQ3BDLE9BQU8sZUFBZSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLEdBQVc7SUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDckMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxHQUFXO0lBQ3hDLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYWQgJ3MnIG9uIHRoZSBsZWZ0IHdpdGggJ2NoYXInIHVudGlsIGl0IGlzIG4gY2hhcmFjdGVycyB3aWRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZWZ0UGFkKHM6IHN0cmluZywgbjogbnVtYmVyLCBjaGFyOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFkZGluZyA9IE1hdGgubWF4KDAsIG4gLSBzLmxlbmd0aCk7XG4gIHJldHVybiBjaGFyLnJlcGVhdChwYWRkaW5nKSArIHM7XG59XG5cbi8qKlxuICogRm9ybWF0cyB0aW1lIGluIG1pbGxpc2Vjb25kcyAod2hpY2ggd2UgZ2V0IGZyb20gJ0RhdGUuZ2V0VGltZSgpJylcbiAqIHRvIGEgaHVtYW4tcmVhZGFibGUgdGltZTsgcmV0dXJucyB0aW1lIGluIHNlY29uZHMgcm91bmRlZCB0byAyXG4gKiBkZWNpbWFsIHBsYWNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWUobnVtOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gcm91bmRQZXJjZW50YWdlKG1pbGxpc2Vjb25kc1RvU2Vjb25kcyhudW0pKTtcbn1cblxuLyoqXG4gKiBSb3VuZHMgYSBkZWNpbWFsIG51bWJlciB0byB0d28gZGVjaW1hbCBwb2ludHMuXG4gKiBUaGUgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBmcmFjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIG91dHB1dHRlZCBhcyBwZXJjZW50YWdlcy5cbiAqL1xuZnVuY3Rpb24gcm91bmRQZXJjZW50YWdlKG51bTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoMTAwICogbnVtKSAvIDEwMDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIHRpbWUgaW4gbWlsbGlzZWNvbmRzLCByZXR1cm4gYW4gZXF1aXZhbGVudCBhbW91bnQgaW4gc2Vjb25kcy5cbiAqL1xuZnVuY3Rpb24gbWlsbGlzZWNvbmRzVG9TZWNvbmRzKG51bTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIG51bSAvIDEwMDA7XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { type CloudFormationStackArtifact, type Environment } from '@aws-cdk/cx-api';
2
+ import { type AssetManifestBuilder } from '../deployments';
3
+ import { EnvironmentResources } from '../environment-resources';
4
+ export type TemplateBodyParameter = {
5
+ TemplateBody?: string;
6
+ TemplateURL?: string;
7
+ };
8
+ /**
9
+ * Prepares the body parameter for +CreateChangeSet+.
10
+ *
11
+ * If the template is small enough to be inlined into the API call, just return
12
+ * it immediately.
13
+ *
14
+ * Otherwise, add it to the asset manifest to get uploaded to the staging
15
+ * bucket and return its coordinates. If there is no staging bucket, an error
16
+ * is thrown.
17
+ *
18
+ * @param stack the synthesized stack that provides the CloudFormation template
19
+ * @param toolkitInfo information about the toolkit stack
20
+ */
21
+ export declare function makeBodyParameter(stack: CloudFormationStackArtifact, resolvedEnvironment: Environment, assetManifest: AssetManifestBuilder, resources: EnvironmentResources, overrideTemplate?: any): Promise<TemplateBodyParameter>;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeBodyParameter = makeBodyParameter;
4
+ const path = require("path");
5
+ const cx_api_1 = require("@aws-cdk/cx-api");
6
+ const client_s3_1 = require("@aws-sdk/client-s3");
7
+ const middleware_endpoint_1 = require("@smithy/middleware-endpoint");
8
+ const chalk = require("chalk");
9
+ const fs = require("fs-extra");
10
+ const logging_1 = require("../../logging");
11
+ const serialize_1 = require("../../serialize");
12
+ const error_1 = require("../../toolkit/error");
13
+ const content_hash_1 = require("../../util/content-hash");
14
+ const LARGE_TEMPLATE_SIZE_KB = 50;
15
+ /**
16
+ * Prepares the body parameter for +CreateChangeSet+.
17
+ *
18
+ * If the template is small enough to be inlined into the API call, just return
19
+ * it immediately.
20
+ *
21
+ * Otherwise, add it to the asset manifest to get uploaded to the staging
22
+ * bucket and return its coordinates. If there is no staging bucket, an error
23
+ * is thrown.
24
+ *
25
+ * @param stack the synthesized stack that provides the CloudFormation template
26
+ * @param toolkitInfo information about the toolkit stack
27
+ */
28
+ async function makeBodyParameter(stack, resolvedEnvironment, assetManifest, resources, overrideTemplate) {
29
+ // If the template has already been uploaded to S3, just use it from there.
30
+ if (stack.stackTemplateAssetObjectUrl && !overrideTemplate) {
31
+ return {
32
+ TemplateURL: await restUrlFromManifest(stack.stackTemplateAssetObjectUrl, resolvedEnvironment),
33
+ };
34
+ }
35
+ // Otherwise, pass via API call (if small) or upload here (if large)
36
+ const templateJson = (0, serialize_1.toYAML)(overrideTemplate !== null && overrideTemplate !== void 0 ? overrideTemplate : stack.template);
37
+ if (templateJson.length <= LARGE_TEMPLATE_SIZE_KB * 1024) {
38
+ return { TemplateBody: templateJson };
39
+ }
40
+ const toolkitInfo = await resources.lookupToolkit();
41
+ if (!toolkitInfo.found) {
42
+ (0, logging_1.error)(`The template for stack "${stack.displayName}" is ${Math.round(templateJson.length / 1024)}KiB. ` +
43
+ `Templates larger than ${LARGE_TEMPLATE_SIZE_KB}KiB must be uploaded to S3.\n` +
44
+ 'Run the following command in order to setup an S3 bucket in this environment, and then re-deploy:\n\n', chalk.blue(`\t$ cdk bootstrap ${resolvedEnvironment.name}\n`));
45
+ throw new error_1.ToolkitError('Template too large to deploy ("cdk bootstrap" is required)');
46
+ }
47
+ const templateHash = (0, content_hash_1.contentHash)(templateJson);
48
+ const key = `cdk/${stack.id}/${templateHash}.yml`;
49
+ let templateFile = stack.templateFile;
50
+ if (overrideTemplate) {
51
+ // Add a variant of this template
52
+ templateFile = `${stack.templateFile}-${templateHash}.yaml`;
53
+ const templateFilePath = path.join(stack.assembly.directory, templateFile);
54
+ await fs.writeFile(templateFilePath, templateJson, { encoding: 'utf-8' });
55
+ }
56
+ assetManifest.addFileAsset(templateHash, {
57
+ path: templateFile,
58
+ }, {
59
+ bucketName: toolkitInfo.bucketName,
60
+ objectKey: key,
61
+ });
62
+ const templateURL = `${toolkitInfo.bucketUrl}/${key}`;
63
+ (0, logging_1.debug)('Storing template in S3 at:', templateURL);
64
+ return { TemplateURL: templateURL };
65
+ }
66
+ /**
67
+ * Format an S3 URL in the manifest for use with CloudFormation
68
+ *
69
+ * Replaces environment placeholders (which this field may contain),
70
+ * and reformats s3://.../... urls into S3 REST URLs (which CloudFormation
71
+ * expects)
72
+ */
73
+ async function restUrlFromManifest(url, environment) {
74
+ const doNotUseMarker = '**DONOTUSE**';
75
+ const region = environment.region;
76
+ // This URL may contain placeholders, so still substitute those.
77
+ url = cx_api_1.EnvironmentPlaceholders.replace(url, {
78
+ accountId: environment.account,
79
+ region,
80
+ partition: doNotUseMarker,
81
+ });
82
+ // Yes, this is extremely crude, but we don't actually need this so I'm not inclined to spend
83
+ // a lot of effort trying to thread the right value to this location.
84
+ if (url.indexOf(doNotUseMarker) > -1) {
85
+ throw new error_1.ToolkitError("Cannot use '${AWS::Partition}' in the 'stackTemplateAssetObjectUrl' field");
86
+ }
87
+ const s3Url = url.match(/s3:\/\/([^/]+)\/(.*)$/);
88
+ if (!s3Url) {
89
+ return url;
90
+ }
91
+ // We need to pass an 'https://s3.REGION.amazonaws.com[.cn]/bucket/object' URL to CloudFormation, but we
92
+ // got an 's3://bucket/object' URL instead. Construct the rest API URL here.
93
+ const bucketName = s3Url[1];
94
+ const objectKey = s3Url[2];
95
+ // SDK v3 no longer allows for getting endpoints from only region.
96
+ // A command and client config must now be provided.
97
+ const s3 = new client_s3_1.S3Client({ region });
98
+ const endpoint = await (0, middleware_endpoint_1.getEndpointFromInstructions)({}, client_s3_1.HeadObjectCommand, {
99
+ ...s3.config,
100
+ });
101
+ endpoint.url.hostname;
102
+ return `${endpoint.url.origin}/${bucketName}/${objectKey}`;
103
+ }
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtYm9keS1wYXJhbWV0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0ZW1wbGF0ZS1ib2R5LXBhcmFtZXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWlDQSw4Q0EwREM7QUEzRkQsNkJBQTZCO0FBQzdCLDRDQUE4RztBQUM5RyxrREFBaUU7QUFDakUscUVBQTBFO0FBQzFFLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IsMkNBQTZDO0FBQzdDLCtDQUF5QztBQUN6QywrQ0FBbUQ7QUFDbkQsMERBQXNEO0FBU3RELE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsS0FBa0MsRUFDbEMsbUJBQWdDLEVBQ2hDLGFBQW1DLEVBQ25DLFNBQStCLEVBQy9CLGdCQUFzQjtJQUV0QiwyRUFBMkU7SUFDM0UsSUFBSSxLQUFLLENBQUMsMkJBQTJCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzNELE9BQU87WUFDTCxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsbUJBQW1CLENBQUM7U0FDL0YsQ0FBQztJQUNKLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsTUFBTSxZQUFZLEdBQUcsSUFBQSxrQkFBTSxFQUFDLGdCQUFnQixhQUFoQixnQkFBZ0IsY0FBaEIsZ0JBQWdCLEdBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWhFLElBQUksWUFBWSxDQUFDLE1BQU0sSUFBSSxzQkFBc0IsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNwRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLElB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QUFHLEVBQUUsQ0FBQyxNQUFNO0tBQ2IsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFFdEIsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLFVBQVUsSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUM3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHR5cGUgQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCB0eXBlIEVudmlyb25tZW50LCBFbnZpcm9ubWVudFBsYWNlaG9sZGVycyB9IGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgeyBIZWFkT2JqZWN0Q29tbWFuZCwgUzNDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0IHsgZ2V0RW5kcG9pbnRGcm9tSW5zdHJ1Y3Rpb25zIH0gZnJvbSAnQHNtaXRoeS9taWRkbGV3YXJlLWVuZHBvaW50JztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGRlYnVnLCBlcnJvciB9IGZyb20gJy4uLy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgdG9ZQU1MIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvZXJyb3InO1xuaW1wb3J0IHsgY29udGVudEhhc2ggfSBmcm9tICcuLi8uLi91dGlsL2NvbnRlbnQtaGFzaCc7XG5pbXBvcnQgeyB0eXBlIEFzc2V0TWFuaWZlc3RCdWlsZGVyIH0gZnJvbSAnLi4vZGVwbG95bWVudHMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRSZXNvdXJjZXMgfSBmcm9tICcuLi9lbnZpcm9ubWVudC1yZXNvdXJjZXMnO1xuXG5leHBvcnQgdHlwZSBUZW1wbGF0ZUJvZHlQYXJhbWV0ZXIgPSB7XG4gIFRlbXBsYXRlQm9keT86IHN0cmluZztcbiAgVGVtcGxhdGVVUkw/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBMQVJHRV9URU1QTEFURV9TSVpFX0tCID0gNTA7XG5cbi8qKlxuICogUHJlcGFyZXMgdGhlIGJvZHkgcGFyYW1ldGVyIGZvciArQ3JlYXRlQ2hhbmdlU2V0Ky5cbiAqXG4gKiBJZiB0aGUgdGVtcGxhdGUgaXMgc21hbGwgZW5vdWdoIHRvIGJlIGlubGluZWQgaW50byB0aGUgQVBJIGNhbGwsIGp1c3QgcmV0dXJuXG4gKiBpdCBpbW1lZGlhdGVseS5cbiAqXG4gKiBPdGhlcndpc2UsIGFkZCBpdCB0byB0aGUgYXNzZXQgbWFuaWZlc3QgdG8gZ2V0IHVwbG9hZGVkIHRvIHRoZSBzdGFnaW5nXG4gKiBidWNrZXQgYW5kIHJldHVybiBpdHMgY29vcmRpbmF0ZXMuIElmIHRoZXJlIGlzIG5vIHN0YWdpbmcgYnVja2V0LCBhbiBlcnJvclxuICogaXMgdGhyb3duLlxuICpcbiAqIEBwYXJhbSBzdGFjayAgICAgdGhlIHN5bnRoZXNpemVkIHN0YWNrIHRoYXQgcHJvdmlkZXMgdGhlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlXG4gKiBAcGFyYW0gdG9vbGtpdEluZm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRvb2xraXQgc3RhY2tcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1ha2VCb2R5UGFyYW1ldGVyKFxuICBzdGFjazogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICByZXNvbHZlZEVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgYXNzZXRNYW5pZmVzdDogQXNzZXRNYW5pZmVzdEJ1aWxkZXIsXG4gIHJlc291cmNlczogRW52aXJvbm1lbnRSZXNvdXJjZXMsXG4gIG92ZXJyaWRlVGVtcGxhdGU/OiBhbnksXG4pOiBQcm9taXNlPFRlbXBsYXRlQm9keVBhcmFtZXRlcj4ge1xuICAvLyBJZiB0aGUgdGVtcGxhdGUgaGFzIGFscmVhZHkgYmVlbiB1cGxvYWRlZCB0byBTMywganVzdCB1c2UgaXQgZnJvbSB0aGVyZS5cbiAgaWYgKHN0YWNrLnN0YWNrVGVtcGxhdGVBc3NldE9iamVjdFVybCAmJiAhb3ZlcnJpZGVUZW1wbGF0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICBUZW1wbGF0ZVVSTDogYXdhaXQgcmVzdFVybEZyb21NYW5pZmVzdChzdGFjay5zdGFja1RlbXBsYXRlQXNzZXRPYmplY3RVcmwsIHJlc29sdmVkRW52aXJvbm1lbnQpLFxuICAgIH07XG4gIH1cblxuICAvLyBPdGhlcndpc2UsIHBhc3MgdmlhIEFQSSBjYWxsIChpZiBzbWFsbCkgb3IgdXBsb2FkIGhlcmUgKGlmIGxhcmdlKVxuICBjb25zdCB0ZW1wbGF0ZUpzb24gPSB0b1lBTUwob3ZlcnJpZGVUZW1wbGF0ZSA/PyBzdGFjay50ZW1wbGF0ZSk7XG5cbiAgaWYgKHRlbXBsYXRlSnNvbi5sZW5ndGggPD0gTEFSR0VfVEVNUExBVEVfU0laRV9LQiAqIDEwMjQpIHtcbiAgICByZXR1cm4geyBUZW1wbGF0ZUJvZHk6IHRlbXBsYXRlSnNvbiB9O1xuICB9XG5cbiAgY29uc3QgdG9vbGtpdEluZm8gPSBhd2FpdCByZXNvdXJjZXMubG9va3VwVG9vbGtpdCgpO1xuICBpZiAoIXRvb2xraXRJbmZvLmZvdW5kKSB7XG4gICAgZXJyb3IoXG4gICAgICBgVGhlIHRlbXBsYXRlIGZvciBzdGFjayBcIiR7c3RhY2suZGlzcGxheU5hbWV9XCIgaXMgJHtNYXRoLnJvdW5kKHRlbXBsYXRlSnNvbi5sZW5ndGggLyAxMDI0KX1LaUIuIGAgK1xuICAgICAgICBgVGVtcGxhdGVzIGxhcmdlciB0aGFuICR7TEFSR0VfVEVNUExBVEVfU0laRV9LQn1LaUIgbXVzdCBiZSB1cGxvYWRlZCB0byBTMy5cXG5gICtcbiAgICAgICAgJ1J1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaW4gb3JkZXIgdG8gc2V0dXAgYW4gUzMgYnVja2V0IGluIHRoaXMgZW52aXJvbm1lbnQsIGFuZCB0aGVuIHJlLWRlcGxveTpcXG5cXG4nLFxuICAgICAgY2hhbGsuYmx1ZShgXFx0JCBjZGsgYm9vdHN0cmFwICR7cmVzb2x2ZWRFbnZpcm9ubWVudC5uYW1lfVxcbmApLFxuICAgICk7XG5cbiAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdUZW1wbGF0ZSB0b28gbGFyZ2UgdG8gZGVwbG95IChcImNkayBib290c3RyYXBcIiBpcyByZXF1aXJlZCknKTtcbiAgfVxuXG4gIGNvbnN0IHRlbXBsYXRlSGFzaCA9IGNvbnRlbnRIYXNoKHRlbXBsYXRlSnNvbik7XG4gIGNvbnN0IGtleSA9IGBjZGsvJHtzdGFjay5pZH0vJHt0ZW1wbGF0ZUhhc2h9LnltbGA7XG5cbiAgbGV0IHRlbXBsYXRlRmlsZSA9IHN0YWNrLnRlbXBsYXRlRmlsZTtcbiAgaWYgKG92ZXJyaWRlVGVtcGxhdGUpIHtcbiAgICAvLyBBZGQgYSB2YXJpYW50IG9mIHRoaXMgdGVtcGxhdGVcbiAgICB0ZW1wbGF0ZUZpbGUgPSBgJHtzdGFjay50ZW1wbGF0ZUZpbGV9LSR7dGVtcGxhdGVIYXNofS55YW1sYDtcbiAgICBjb25zdCB0ZW1wbGF0ZUZpbGVQYXRoID0gcGF0aC5qb2luKHN0YWNrLmFzc2VtYmx5LmRpcmVjdG9yeSwgdGVtcGxhdGVGaWxlKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcGxhdGVGaWxlUGF0aCwgdGVtcGxhdGVKc29uLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICB9XG5cbiAgYXNzZXRNYW5pZmVzdC5hZGRGaWxlQXNzZXQoXG4gICAgdGVtcGxhdGVIYXNoLFxuICAgIHtcbiAgICAgIHBhdGg6IHRlbXBsYXRlRmlsZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHRvb2xraXRJbmZvLmJ1Y2tldE5hbWUsXG4gICAgICBvYmplY3RLZXk6IGtleSxcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IHRlbXBsYXRlVVJMID0gYCR7dG9vbGtpdEluZm8uYnVja2V0VXJsfS8ke2tleX1gO1xuICBkZWJ1ZygnU3RvcmluZyB0ZW1wbGF0ZSBpbiBTMyBhdDonLCB0ZW1wbGF0ZVVSTCk7XG4gIHJldHVybiB7IFRlbXBsYXRlVVJMOiB0ZW1wbGF0ZVVSTCB9O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhbiBTMyBVUkwgaW4gdGhlIG1hbmlmZXN0IGZvciB1c2Ugd2l0aCBDbG91ZEZvcm1hdGlvblxuICpcbiAqIFJlcGxhY2VzIGVudmlyb25tZW50IHBsYWNlaG9sZGVycyAod2hpY2ggdGhpcyBmaWVsZCBtYXkgY29udGFpbiksXG4gKiBhbmQgcmVmb3JtYXRzIHMzOi8vLi4uLy4uLiB1cmxzIGludG8gUzMgUkVTVCBVUkxzICh3aGljaCBDbG91ZEZvcm1hdGlvblxuICogZXhwZWN0cylcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzdFVybEZyb21NYW5pZmVzdCh1cmw6IHN0cmluZywgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZG9Ob3RVc2VNYXJrZXIgPSAnKipET05PVFVTRSoqJztcbiAgY29uc3QgcmVnaW9uID0gZW52aXJvbm1lbnQucmVnaW9uO1xuICAvLyBUaGlzIFVSTCBtYXkgY29udGFpbiBwbGFjZWhvbGRlcnMsIHNvIHN0aWxsIHN1YnN0aXR1dGUgdGhvc2UuXG4gIHVybCA9IEVudmlyb25tZW50UGxhY2Vob2xkZXJzLnJlcGxhY2UodXJsLCB7XG4gICAgYWNjb3VudElkOiBlbnZpcm9ubWVudC5hY2NvdW50LFxuICAgIHJlZ2lvbixcbiAgICBwYXJ0aXRpb246IGRvTm90VXNlTWFya2VyLFxuICB9KTtcblxuICAvLyBZZXMsIHRoaXMgaXMgZXh0cmVtZWx5IGNydWRlLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0aGlzIHNvIEknbSBub3QgaW5jbGluZWQgdG8gc3BlbmRcbiAgLy8gYSBsb3Qgb2YgZWZmb3J0IHRyeWluZyB0byB0aHJlYWQgdGhlIHJpZ2h0IHZhbHVlIHRvIHRoaXMgbG9jYXRpb24uXG4gIGlmICh1cmwuaW5kZXhPZihkb05vdFVzZU1hcmtlcikgPiAtMSkge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXCJDYW5ub3QgdXNlICcke0FXUzo6UGFydGl0aW9ufScgaW4gdGhlICdzdGFja1RlbXBsYXRlQXNzZXRPYmplY3RVcmwnIGZpZWxkXCIpO1xuICB9XG5cbiAgY29uc3QgczNVcmwgPSB1cmwubWF0Y2goL3MzOlxcL1xcLyhbXi9dKylcXC8oLiopJC8pO1xuICBpZiAoIXMzVXJsKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIC8vIFdlIG5lZWQgdG8gcGFzcyBhbiAnaHR0cHM6Ly9zMy5SRUdJT04uYW1hem9uYXdzLmNvbVsuY25dL2J1Y2tldC9vYmplY3QnIFVSTCB0byBDbG91ZEZvcm1hdGlvbiwgYnV0IHdlXG4gIC8vIGdvdCBhbiAnczM6Ly9idWNrZXQvb2JqZWN0JyBVUkwgaW5zdGVhZC4gQ29uc3RydWN0IHRoZSByZXN0IEFQSSBVUkwgaGVyZS5cbiAgY29uc3QgYnVja2V0TmFtZSA9IHMzVXJsWzFdO1xuICBjb25zdCBvYmplY3RLZXkgPSBzM1VybFsyXTtcblxuICAvLyBTREsgdjMgbm8gbG9uZ2VyIGFsbG93cyBmb3IgZ2V0dGluZyBlbmRwb2ludHMgZnJvbSBvbmx5IHJlZ2lvbi5cbiAgLy8gQSBjb21tYW5kIGFuZCBjbGllbnQgY29uZmlnIG11c3Qgbm93IGJlIHByb3ZpZGVkLlxuICBjb25zdCBzMyA9IG5ldyBTM0NsaWVudCh7IHJlZ2lvbiB9KTtcbiAgY29uc3QgZW5kcG9pbnQgPSBhd2FpdCBnZXRFbmRwb2ludEZyb21JbnN0cnVjdGlvbnMoe30sIEhlYWRPYmplY3RDb21tYW5kLCB7XG4gICAgLi4uczMuY29uZmlnLFxuICB9KTtcbiAgZW5kcG9pbnQudXJsLmhvc3RuYW1lO1xuXG4gIHJldHVybiBgJHtlbmRwb2ludC51cmwub3JpZ2lufS8ke2J1Y2tldE5hbWV9LyR7b2JqZWN0S2V5fWA7XG59XG4iXX0=