@aws/nx-plugin 1.0.0-rc.6 → 1.0.0-rc.60

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 (1262) hide show
  1. package/LICENSE-THIRD-PARTY +7104 -6167
  2. package/README.md +8 -7
  3. package/generators.json +145 -10
  4. package/migrations.json +111 -0
  5. package/package.json +41 -22
  6. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +273 -0
  7. package/src/agentcore-gateway/agent-connection/generator.d.ts +19 -0
  8. package/src/agentcore-gateway/agent-connection/generator.js +95 -0
  9. package/src/agentcore-gateway/agent-connection/generator.js.map +1 -0
  10. package/src/agentcore-gateway/agent-connection/schema.d.js +6 -0
  11. package/src/agentcore-gateway/agent-connection/schema.d.js.map +1 -0
  12. package/src/agentcore-gateway/agent-connection/schema.d.ts +13 -0
  13. package/src/agentcore-gateway/agent-connection/schema.json +31 -0
  14. package/src/agentcore-gateway/attach-upstream.d.ts +49 -0
  15. package/src/agentcore-gateway/attach-upstream.js +59 -0
  16. package/src/agentcore-gateway/attach-upstream.js.map +1 -0
  17. package/src/agentcore-gateway/files/cedar/policies/README.md +61 -0
  18. package/src/agentcore-gateway/files/cedar/policies/permit-all.cedar +26 -0
  19. package/src/agentcore-gateway/files/project/http/local-dev.ts.template +77 -0
  20. package/src/agentcore-gateway/files/project/mcp/local-dev.ts.template +134 -0
  21. package/src/agentcore-gateway/gateway-connection/generator.d.ts +21 -0
  22. package/src/agentcore-gateway/gateway-connection/generator.js +103 -0
  23. package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -0
  24. package/src/agentcore-gateway/gateway-connection/schema.d.js +6 -0
  25. package/src/agentcore-gateway/gateway-connection/schema.d.js.map +1 -0
  26. package/src/agentcore-gateway/gateway-connection/schema.d.ts +13 -0
  27. package/src/agentcore-gateway/gateway-connection/schema.json +31 -0
  28. package/src/agentcore-gateway/generator.d.ts +89 -0
  29. package/src/agentcore-gateway/generator.js +212 -0
  30. package/src/agentcore-gateway/generator.js.map +1 -0
  31. package/src/agentcore-gateway/mcp-connection/generator.d.ts +19 -0
  32. package/src/agentcore-gateway/mcp-connection/generator.js +61 -0
  33. package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -0
  34. package/src/agentcore-gateway/mcp-connection/schema.d.js +6 -0
  35. package/src/agentcore-gateway/mcp-connection/schema.d.js.map +1 -0
  36. package/src/agentcore-gateway/mcp-connection/schema.d.ts +13 -0
  37. package/src/agentcore-gateway/mcp-connection/schema.json +31 -0
  38. package/src/agentcore-gateway/react-connection/__snapshots__/generator.spec.ts.snap +68 -0
  39. package/src/agentcore-gateway/react-connection/generator.d.ts +19 -0
  40. package/src/agentcore-gateway/react-connection/generator.js +119 -0
  41. package/src/agentcore-gateway/react-connection/generator.js.map +1 -0
  42. package/src/agentcore-gateway/react-connection/schema.d.js +6 -0
  43. package/src/agentcore-gateway/react-connection/schema.d.js.map +1 -0
  44. package/src/agentcore-gateway/react-connection/schema.d.ts +13 -0
  45. package/src/agentcore-gateway/react-connection/schema.json +31 -0
  46. package/src/agentcore-gateway/schema.d.js +6 -0
  47. package/src/agentcore-gateway/schema.d.js.map +1 -0
  48. package/src/agentcore-gateway/schema.d.ts +17 -0
  49. package/src/agentcore-gateway/schema.json +72 -0
  50. package/src/connection/agent-local-dev.d.ts +49 -0
  51. package/src/connection/agent-local-dev.js +84 -0
  52. package/src/connection/agent-local-dev.js.map +1 -0
  53. package/src/connection/agent-runtime-config.js +9 -14
  54. package/src/connection/agent-runtime-config.js.map +1 -1
  55. package/src/connection/gateway-runtime-config.d.ts +19 -0
  56. package/src/connection/gateway-runtime-config.js +47 -0
  57. package/src/connection/gateway-runtime-config.js.map +1 -0
  58. package/src/connection/generator.d.ts +3 -10
  59. package/src/connection/generator.js +172 -194
  60. package/src/connection/generator.js.map +1 -1
  61. package/src/connection/{serve-local.d.ts → local-dev.d.ts} +3 -3
  62. package/src/connection/local-dev.js +37 -0
  63. package/src/connection/local-dev.js.map +1 -0
  64. package/src/connection/scaffold-catalog.d.ts +267 -0
  65. package/src/connection/scaffold-catalog.js +347 -0
  66. package/src/connection/scaffold-catalog.js.map +1 -0
  67. package/src/connection/schema-resolver.d.ts +5 -0
  68. package/src/connection/schema-resolver.js +27 -0
  69. package/src/connection/schema-resolver.js.map +1 -0
  70. package/src/connection/schema.d.js +6 -0
  71. package/src/connection/schema.d.js.map +1 -0
  72. package/src/connection/schema.d.ts +1 -0
  73. package/src/connection/schema.json +5 -0
  74. package/src/connection/supported-connections.d.ts +116 -0
  75. package/src/connection/supported-connections.js +163 -0
  76. package/src/connection/supported-connections.js.map +1 -0
  77. package/src/index.js +2 -5
  78. package/src/index.js.map +1 -1
  79. package/src/infra/app/__snapshots__/generator.spec.ts.snap +91 -72
  80. package/src/infra/app/files/app/src/main.ts.template +1 -1
  81. package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
  82. package/src/infra/app/generator.d.ts +43 -0
  83. package/src/infra/app/generator.js +179 -127
  84. package/src/infra/app/generator.js.map +1 -1
  85. package/src/infra/app/schema.d.js +6 -0
  86. package/src/infra/app/schema.d.js.map +1 -0
  87. package/src/infra/app/schema.d.ts +1 -1
  88. package/src/infra/app/schema.json +5 -0
  89. package/src/init/generator.d.ts +31 -0
  90. package/src/init/generator.js +46 -0
  91. package/src/init/generator.js.map +1 -0
  92. package/src/init/schema.d.js +6 -0
  93. package/src/init/schema.d.js.map +1 -0
  94. package/src/init/schema.d.ts +16 -0
  95. package/src/init/schema.json +35 -0
  96. package/src/internal/test-matrix/generator.d.ts +29 -0
  97. package/src/internal/test-matrix/generator.js +698 -0
  98. package/src/internal/test-matrix/generator.js.map +1 -0
  99. package/src/internal/test-matrix/schema.d.js +6 -0
  100. package/src/internal/test-matrix/schema.d.js.map +1 -0
  101. package/src/internal/test-matrix/schema.d.ts +12 -0
  102. package/src/internal/test-matrix/schema.json +21 -0
  103. package/src/license/config-types.js +5 -3
  104. package/src/license/config-types.js.map +1 -1
  105. package/src/license/config.d.ts +1 -1
  106. package/src/license/config.js +267 -242
  107. package/src/license/config.js.map +1 -1
  108. package/src/license/dependency-check/check.js +51 -46
  109. package/src/license/dependency-check/check.js.map +1 -1
  110. package/src/license/dependency-check/collectors/collector.js +41 -71
  111. package/src/license/dependency-check/collectors/collector.js.map +1 -1
  112. package/src/license/dependency-check/collectors/npm-collector.js +34 -41
  113. package/src/license/dependency-check/collectors/npm-collector.js.map +1 -1
  114. package/src/license/dependency-check/collectors/python-collector.js +55 -62
  115. package/src/license/dependency-check/collectors/python-collector.js.map +1 -1
  116. package/src/license/dependency-check/evaluator.js +40 -68
  117. package/src/license/dependency-check/evaluator.js.map +1 -1
  118. package/src/license/dependency-check/executor.js +30 -22
  119. package/src/license/dependency-check/executor.js.map +1 -1
  120. package/src/license/dependency-check/pre-approved.js +949 -336
  121. package/src/license/dependency-check/pre-approved.js.map +1 -1
  122. package/src/license/dependency-check/types.js +2 -3
  123. package/src/license/dependency-check/types.js.map +1 -1
  124. package/src/license/generator.js +65 -68
  125. package/src/license/generator.js.map +1 -1
  126. package/src/license/index.js +3 -9
  127. package/src/license/index.js.map +1 -1
  128. package/src/license/known-exceptions.d.ts +1 -1
  129. package/src/license/known-exceptions.js +19 -13
  130. package/src/license/known-exceptions.js.map +1 -1
  131. package/src/license/schema.d.js +6 -0
  132. package/src/license/schema.d.js.map +1 -0
  133. package/src/license/schema.d.ts +2 -0
  134. package/src/license/schema.json +5 -0
  135. package/src/license/sync/generator.js +94 -119
  136. package/src/license/sync/generator.js.map +1 -1
  137. package/src/license/sync/project-file-sync.js +28 -35
  138. package/src/license/sync/project-file-sync.js.map +1 -1
  139. package/src/mcp-server/dev-server.d.ts +1 -0
  140. package/src/mcp-server/dev-server.js +18 -0
  141. package/src/mcp-server/dev-server.js.map +1 -0
  142. package/src/mcp-server/generator-info.js +149 -165
  143. package/src/mcp-server/generator-info.js.map +1 -1
  144. package/src/mcp-server/guide-pipeline.js +199 -206
  145. package/src/mcp-server/guide-pipeline.js.map +1 -1
  146. package/src/mcp-server/guide-render.js +10 -25
  147. package/src/mcp-server/guide-render.js.map +1 -1
  148. package/src/mcp-server/index.js +6 -10
  149. package/src/mcp-server/index.js.map +1 -1
  150. package/src/mcp-server/mdx-ast.js +39 -57
  151. package/src/mcp-server/mdx-ast.js.map +1 -1
  152. package/src/mcp-server/option-filter.js +33 -47
  153. package/src/mcp-server/option-filter.js.map +1 -1
  154. package/src/mcp-server/schema-registry.d.ts +9 -3
  155. package/src/mcp-server/schema-registry.js +41 -38
  156. package/src/mcp-server/schema-registry.js.map +1 -1
  157. package/src/mcp-server/schema.d.ts +1 -1
  158. package/src/mcp-server/schema.js +9 -7
  159. package/src/mcp-server/schema.js.map +1 -1
  160. package/src/mcp-server/server.js +24 -24
  161. package/src/mcp-server/server.js.map +1 -1
  162. package/src/mcp-server/tools/add-to-existing-project.d.ts +12 -0
  163. package/src/mcp-server/tools/add-to-existing-project.js +36 -0
  164. package/src/mcp-server/tools/add-to-existing-project.js.map +1 -0
  165. package/src/mcp-server/tools/create-workspace-command.js +23 -24
  166. package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
  167. package/src/mcp-server/tools/general-guidance.d.ts +1 -1
  168. package/src/mcp-server/tools/general-guidance.js +53 -31
  169. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  170. package/src/mcp-server/tools/generator-guide.js +29 -37
  171. package/src/mcp-server/tools/generator-guide.js.map +1 -1
  172. package/src/mcp-server/tools/list-generators.js +19 -25
  173. package/src/mcp-server/tools/list-generators.js.map +1 -1
  174. package/src/mcp-server/tools/upgrade-workspace.d.ts +11 -0
  175. package/src/mcp-server/tools/upgrade-workspace.js +32 -0
  176. package/src/mcp-server/tools/upgrade-workspace.js.map +1 -0
  177. package/src/migrations/latest/gateway-agent-targets/__snapshots__/migration.spec.ts.snap +223 -0
  178. package/src/migrations/latest/gateway-agent-targets/metadata.json +3 -0
  179. package/src/migrations/latest/gateway-agent-targets/migration.d.ts +6 -0
  180. package/src/migrations/latest/gateway-agent-targets/migration.js +217 -0
  181. package/src/migrations/latest/gateway-agent-targets/migration.js.map +1 -0
  182. package/src/migrations/latest/gateway-cognito-passthrough/__snapshots__/migration.spec.ts.snap +149 -0
  183. package/src/migrations/latest/gateway-cognito-passthrough/metadata.json +3 -0
  184. package/src/migrations/latest/gateway-cognito-passthrough/migration.d.ts +6 -0
  185. package/src/migrations/latest/gateway-cognito-passthrough/migration.js +195 -0
  186. package/src/migrations/latest/gateway-cognito-passthrough/migration.js.map +1 -0
  187. package/src/migrations/latest/smithy-ssdk-bundle-pins/metadata.json +3 -0
  188. package/src/migrations/latest/smithy-ssdk-bundle-pins/migration.d.ts +6 -0
  189. package/src/migrations/latest/smithy-ssdk-bundle-pins/migration.js +78 -0
  190. package/src/migrations/latest/smithy-ssdk-bundle-pins/migration.js.map +1 -0
  191. package/src/migrations/latest/strip-pip-from-python-images/__snapshots__/migration.spec.ts.snap +48 -0
  192. package/src/migrations/latest/strip-pip-from-python-images/metadata.json +3 -0
  193. package/src/migrations/latest/strip-pip-from-python-images/migration.d.ts +6 -0
  194. package/src/migrations/latest/strip-pip-from-python-images/migration.js +91 -0
  195. package/src/migrations/latest/strip-pip-from-python-images/migration.js.map +1 -0
  196. package/src/migrations/latest/waf-log-group-removal/__snapshots__/migration.spec.ts.snap +57 -0
  197. package/src/migrations/latest/waf-log-group-removal/metadata.json +3 -0
  198. package/src/migrations/latest/waf-log-group-removal/migration.d.ts +6 -0
  199. package/src/migrations/latest/waf-log-group-removal/migration.js +77 -0
  200. package/src/migrations/latest/waf-log-group-removal/migration.js.map +1 -0
  201. package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/metadata.json +3 -0
  202. package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/migration.d.ts +6 -0
  203. package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/migration.js +65 -0
  204. package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/migration.js.map +1 -0
  205. package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/metadata.json +3 -0
  206. package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/migration.d.ts +6 -0
  207. package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/migration.js +108 -0
  208. package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/migration.js.map +1 -0
  209. package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/metadata.json +3 -0
  210. package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/migration.d.ts +6 -0
  211. package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/migration.js +128 -0
  212. package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/migration.js.map +1 -0
  213. package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/metadata.json +3 -0
  214. package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/migration.d.ts +6 -0
  215. package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/migration.js +215 -0
  216. package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/migration.js.map +1 -0
  217. package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/metadata.json +3 -0
  218. package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/migration.d.ts +6 -0
  219. package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/migration.js +93 -0
  220. package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
  221. package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/metadata.json +3 -0
  222. package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/migration.d.ts +96 -0
  223. package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/migration.js +670 -0
  224. package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/migration.js.map +1 -0
  225. package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/metadata.json +3 -0
  226. package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/migration.d.ts +6 -0
  227. package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/migration.js +89 -0
  228. package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/migration.js.map +1 -0
  229. package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/metadata.json +3 -0
  230. package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/migration.d.ts +6 -0
  231. package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/migration.js +449 -0
  232. package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/migration.js.map +1 -0
  233. package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
  234. package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
  235. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +298 -74
  236. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +748 -103
  237. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +230 -37
  238. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +249 -52
  239. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5535 -0
  240. package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
  241. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +305 -71
  242. package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +298 -0
  243. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +353 -82
  244. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +176 -55
  245. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +100 -24
  246. package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
  247. package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
  248. package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
  249. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +200 -48
  250. package/src/open-api/ts-client/files/client.gen.ts.template +358 -24
  251. package/src/open-api/ts-client/files/types.gen.ts.template +6 -4
  252. package/src/open-api/ts-client/generator.js +41 -26
  253. package/src/open-api/ts-client/generator.js.map +1 -1
  254. package/src/open-api/ts-client/schema.d.js +6 -0
  255. package/src/open-api/ts-client/schema.d.js.map +1 -0
  256. package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +7 -2
  257. package/src/open-api/ts-hooks/generator.js +17 -21
  258. package/src/open-api/ts-hooks/generator.js.map +1 -1
  259. package/src/open-api/ts-hooks/generator.spec.tsx +70 -0
  260. package/src/open-api/ts-hooks/schema.d.js +6 -0
  261. package/src/open-api/ts-hooks/schema.d.js.map +1 -0
  262. package/src/open-api/ts-metadata/generator.js +12 -20
  263. package/src/open-api/ts-metadata/generator.js.map +1 -1
  264. package/src/open-api/ts-metadata/schema.d.js +6 -0
  265. package/src/open-api/ts-metadata/schema.d.js.map +1 -0
  266. package/src/open-api/utils/codegen-data/languages.d.ts +0 -6
  267. package/src/open-api/utils/codegen-data/languages.js +59 -66
  268. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  269. package/src/open-api/utils/codegen-data/types.d.ts +255 -10
  270. package/src/open-api/utils/codegen-data/types.js +54 -30
  271. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  272. package/src/open-api/utils/codegen-data.d.ts +2 -2
  273. package/src/open-api/utils/codegen-data.js +494 -674
  274. package/src/open-api/utils/codegen-data.js.map +1 -1
  275. package/src/open-api/utils/normalise.js +437 -246
  276. package/src/open-api/utils/normalise.js.map +1 -1
  277. package/src/open-api/utils/parse.js +8 -14
  278. package/src/open-api/utils/parse.js.map +1 -1
  279. package/src/open-api/utils/parser.d.ts +55 -0
  280. package/src/open-api/utils/parser.js +787 -0
  281. package/src/open-api/utils/parser.js.map +1 -0
  282. package/src/open-api/utils/refs.js +12 -22
  283. package/src/open-api/utils/refs.js.map +1 -1
  284. package/src/open-api/utils/types.d.ts +18 -0
  285. package/src/open-api/utils/types.js +5 -2
  286. package/src/open-api/utils/types.js.map +1 -1
  287. package/src/preset/__snapshots__/generator.spec.ts.snap +99 -20
  288. package/src/preset/generator.d.ts +14 -1
  289. package/src/preset/generator.js +76 -151
  290. package/src/preset/generator.js.map +1 -1
  291. package/src/preset/schema.d.js +6 -0
  292. package/src/preset/schema.d.js.map +1 -0
  293. package/src/preset/schema.d.ts +4 -1
  294. package/src/preset/schema.json +16 -5
  295. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +334 -0
  296. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +734 -0
  297. package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +191 -315
  298. package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +190 -0
  299. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +31 -0
  300. package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +29 -0
  301. package/src/py/agent/a2a-connection/generator.d.ts +24 -0
  302. package/src/py/agent/a2a-connection/generator.js +145 -88
  303. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  304. package/src/py/agent/a2a-connection/schema.d.js +8 -0
  305. package/src/py/agent/a2a-connection/schema.d.js.map +1 -0
  306. package/src/py/agent/a2a-connection/schema.d.ts +1 -0
  307. package/src/py/agent/a2a-connection/schema.json +5 -0
  308. package/src/py/agent/files/a2a-langchain/main.py.template +89 -0
  309. package/src/py/agent/files/ag-ui-langchain/main.py.template +83 -0
  310. package/src/py/agent/files/common/agent.py.template +2 -0
  311. package/src/py/agent/files/common-langchain/agent.py.template +30 -0
  312. package/src/py/agent/files/deploy/Dockerfile.template +8 -1
  313. package/src/py/agent/files/http/init.py.template +7 -25
  314. package/src/py/agent/files/http/main.py.template +3 -4
  315. package/src/py/agent/files/http-langchain/main.py.template +84 -0
  316. package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
  317. package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
  318. package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
  319. package/src/py/agent/gateway-connection/generator.d.ts +33 -0
  320. package/src/py/agent/gateway-connection/generator.js +153 -0
  321. package/src/py/agent/gateway-connection/generator.js.map +1 -0
  322. package/src/py/agent/gateway-connection/schema.d.js +6 -0
  323. package/src/py/agent/gateway-connection/schema.d.js.map +1 -0
  324. package/src/py/agent/gateway-connection/schema.d.ts +13 -0
  325. package/src/py/agent/gateway-connection/schema.json +31 -0
  326. package/src/py/agent/generator.d.ts +146 -1
  327. package/src/py/agent/generator.js +406 -197
  328. package/src/py/agent/generator.js.map +1 -1
  329. package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +154 -89
  330. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +31 -0
  331. package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +31 -0
  332. package/src/py/agent/mcp-connection/generator.d.ts +23 -0
  333. package/src/py/agent/mcp-connection/generator.js +103 -130
  334. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  335. package/src/py/agent/mcp-connection/schema.d.js +8 -0
  336. package/src/py/agent/mcp-connection/schema.d.js.map +1 -0
  337. package/src/py/agent/mcp-connection/schema.d.ts +1 -0
  338. package/src/py/agent/mcp-connection/schema.json +5 -0
  339. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +17 -19
  340. package/src/py/agent/react-connection/generator.d.ts +150 -1
  341. package/src/py/agent/react-connection/generator.js +105 -65
  342. package/src/py/agent/react-connection/generator.js.map +1 -1
  343. package/src/py/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +4 -4
  344. package/src/py/agent/react-connection/local-dev.js +36 -0
  345. package/src/py/agent/react-connection/local-dev.js.map +1 -0
  346. package/src/py/agent/react-connection/schema.d.js +8 -0
  347. package/src/py/agent/react-connection/schema.d.js.map +1 -0
  348. package/src/py/agent/react-connection/schema.d.ts +1 -0
  349. package/src/py/agent/react-connection/schema.json +5 -0
  350. package/src/py/agent/schema.d.js +6 -0
  351. package/src/py/agent/schema.d.js.map +1 -0
  352. package/src/py/agent/schema.d.ts +5 -1
  353. package/src/py/agent/schema.json +15 -1
  354. package/src/py/api/generator.js +12 -11
  355. package/src/py/api/generator.js.map +1 -1
  356. package/src/py/api/schema.d.js +6 -0
  357. package/src/py/api/schema.d.js.map +1 -0
  358. package/src/py/api/schema.d.ts +1 -0
  359. package/src/py/api/schema.json +5 -0
  360. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1520 -0
  361. package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +63 -0
  362. package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
  363. package/src/py/dynamodb/agent-connection/generator.js +45 -0
  364. package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
  365. package/src/py/dynamodb/agent-connection/schema.d.js +8 -0
  366. package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -0
  367. package/src/py/dynamodb/agent-connection/schema.d.ts +15 -0
  368. package/src/py/dynamodb/agent-connection/schema.json +27 -0
  369. package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +32 -0
  370. package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
  371. package/src/py/dynamodb/fast-api-connection/generator.js +39 -0
  372. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
  373. package/src/py/dynamodb/fast-api-connection/schema.d.js +8 -0
  374. package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -0
  375. package/src/py/dynamodb/fast-api-connection/schema.d.ts +13 -0
  376. package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
  377. package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
  378. package/src/py/dynamodb/files/__name__/client.py.template +39 -0
  379. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
  380. package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
  381. package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
  382. package/src/py/dynamodb/files/config.json.template +24 -0
  383. package/src/py/dynamodb/generator.d.ts +39 -0
  384. package/src/py/dynamodb/generator.js +130 -0
  385. package/src/py/dynamodb/generator.js.map +1 -0
  386. package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +63 -0
  387. package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  388. package/src/py/dynamodb/mcp-server-connection/generator.js +45 -0
  389. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
  390. package/src/py/dynamodb/mcp-server-connection/schema.d.js +8 -0
  391. package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  392. package/src/py/dynamodb/mcp-server-connection/schema.d.ts +15 -0
  393. package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
  394. package/src/py/dynamodb/schema.d.js +6 -0
  395. package/src/py/dynamodb/schema.d.js.map +1 -0
  396. package/src/py/dynamodb/schema.d.ts +16 -0
  397. package/src/py/dynamodb/schema.json +76 -0
  398. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +240 -4693
  399. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +5409 -0
  400. package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
  401. package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
  402. package/src/py/fast-api/generator.d.ts +68 -0
  403. package/src/py/fast-api/generator.js +134 -95
  404. package/src/py/fast-api/generator.js.map +1 -1
  405. package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +4 -3
  406. package/src/py/fast-api/react/generator.d.ts +16 -1
  407. package/src/py/fast-api/react/generator.js +38 -26
  408. package/src/py/fast-api/react/generator.js.map +1 -1
  409. package/src/py/fast-api/react/open-api.js +31 -29
  410. package/src/py/fast-api/react/open-api.js.map +1 -1
  411. package/src/py/fast-api/react/schema.d.js +6 -0
  412. package/src/py/fast-api/react/schema.d.js.map +1 -0
  413. package/src/py/fast-api/react/schema.d.ts +1 -0
  414. package/src/py/fast-api/react/schema.json +5 -0
  415. package/src/py/fast-api/schema.d.js +6 -0
  416. package/src/py/fast-api/schema.d.js.map +1 -0
  417. package/src/py/fast-api/schema.d.ts +1 -0
  418. package/src/py/fast-api/schema.json +6 -0
  419. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  420. package/src/py/lambda-function/generator.d.ts +21 -0
  421. package/src/py/lambda-function/generator.js +82 -62
  422. package/src/py/lambda-function/generator.js.map +1 -1
  423. package/src/py/lambda-function/schema.d.js +6 -0
  424. package/src/py/lambda-function/schema.d.js.map +1 -0
  425. package/src/py/lambda-function/schema.d.ts +1 -0
  426. package/src/py/lambda-function/schema.json +5 -0
  427. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +221 -21
  428. package/src/py/mcp-server/files/deploy/Dockerfile.template +8 -1
  429. package/src/py/mcp-server/generator.d.ts +60 -0
  430. package/src/py/mcp-server/generator.js +204 -131
  431. package/src/py/mcp-server/generator.js.map +1 -1
  432. package/src/py/mcp-server/schema.d.js +6 -0
  433. package/src/py/mcp-server/schema.d.js.map +1 -0
  434. package/src/py/mcp-server/schema.d.ts +1 -0
  435. package/src/py/mcp-server/schema.json +6 -0
  436. package/src/py/project/generator.d.ts +27 -1
  437. package/src/py/project/generator.js +248 -130
  438. package/src/py/project/generator.js.map +1 -1
  439. package/src/py/project/schema.d.js +6 -0
  440. package/src/py/project/schema.d.js.map +1 -0
  441. package/src/py/project/schema.d.ts +1 -0
  442. package/src/py/project/schema.json +5 -0
  443. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2070 -0
  444. package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +123 -0
  445. package/src/py/rdb/agent-connection/generator.d.ts +10 -0
  446. package/src/py/rdb/agent-connection/generator.js +52 -0
  447. package/src/py/rdb/agent-connection/generator.js.map +1 -0
  448. package/src/py/rdb/agent-connection/schema.d.js +8 -0
  449. package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
  450. package/src/py/rdb/agent-connection/schema.d.ts +15 -0
  451. package/src/py/rdb/agent-connection/schema.json +27 -0
  452. package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +51 -0
  453. package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
  454. package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
  455. package/src/py/rdb/fast-api-connection/generator.js +56 -0
  456. package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
  457. package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
  458. package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
  459. package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
  460. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  461. package/src/py/rdb/files/Dockerfile.create-db-user.template +14 -0
  462. package/src/py/rdb/files/Dockerfile.migration.template +14 -0
  463. package/src/py/rdb/files/__name__/__init__.py.template +3 -0
  464. package/src/py/rdb/files/__name__/connection.py.template +55 -0
  465. package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
  466. package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
  467. package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
  468. package/src/py/rdb/files/__name__/models/example.py.template +8 -0
  469. package/src/py/rdb/files/__name__/utils.py.template +104 -0
  470. package/src/py/rdb/files/alembic.ini.template +38 -0
  471. package/src/py/rdb/files/config.json.template +14 -0
  472. package/src/py/rdb/files/migrations/env.py.template +80 -0
  473. package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
  474. package/src/py/rdb/generator.d.ts +95 -0
  475. package/src/py/rdb/generator.js +328 -0
  476. package/src/py/rdb/generator.js.map +1 -0
  477. package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +119 -0
  478. package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
  479. package/src/py/rdb/mcp-server-connection/generator.js +52 -0
  480. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
  481. package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
  482. package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
  483. package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
  484. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  485. package/src/py/rdb/schema.d.js +6 -0
  486. package/src/py/rdb/schema.d.js.map +1 -0
  487. package/src/py/rdb/schema.d.ts +16 -0
  488. package/src/py/rdb/schema.json +78 -0
  489. package/src/py/rdb/utils.d.ts +6 -0
  490. package/src/py/rdb/utils.js +16 -0
  491. package/src/py/rdb/utils.js.map +1 -0
  492. package/src/sdk/agentcore-gateway.d.ts +6 -0
  493. package/src/sdk/agentcore-gateway.js +7 -0
  494. package/src/sdk/agentcore-gateway.js.map +1 -0
  495. package/src/sdk/connection.d.ts +6 -0
  496. package/src/sdk/connection.js +6 -0
  497. package/src/sdk/connection.js.map +1 -0
  498. package/src/sdk/license.d.ts +8 -0
  499. package/src/sdk/license.js +7 -0
  500. package/src/sdk/license.js.map +1 -0
  501. package/src/sdk/open-api.d.ts +10 -0
  502. package/src/sdk/open-api.js +8 -0
  503. package/src/sdk/open-api.js.map +1 -0
  504. package/src/sdk/py.d.ts +18 -0
  505. package/src/sdk/py.js +12 -0
  506. package/src/sdk/py.js.map +1 -0
  507. package/src/sdk/terraform.d.ts +6 -0
  508. package/src/sdk/terraform.js +7 -0
  509. package/src/sdk/terraform.js.map +1 -0
  510. package/src/sdk/ts.d.ts +39 -0
  511. package/src/sdk/ts.js +41 -0
  512. package/src/sdk/ts.js.map +1 -0
  513. package/{sdk/utils/format.d.ts → src/sdk/utils/ast.d.ts} +1 -1
  514. package/src/sdk/utils/ast.js +6 -0
  515. package/src/sdk/utils/ast.js.map +1 -0
  516. package/{sdk/utils/ast.d.ts → src/sdk/utils/format.d.ts} +1 -2
  517. package/src/sdk/utils/format.js +6 -0
  518. package/src/sdk/utils/format.js.map +1 -0
  519. package/{sdk → src/sdk}/utils/test.d.ts +1 -1
  520. package/src/sdk/utils/test.js +6 -0
  521. package/src/sdk/utils/test.js.map +1 -0
  522. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +132 -32
  523. package/src/smithy/project/files/{build.Dockerfile.template → service/build.Dockerfile.template} +3 -6
  524. package/src/smithy/project/files/{src → service/src}/operations/echo.smithy.template +1 -0
  525. package/src/smithy/project/files/shapes/build.Dockerfile.template +33 -0
  526. package/src/smithy/project/files/shapes/smithy-build.json.template +7 -0
  527. package/src/smithy/project/files/shapes/src/main.smithy.template +11 -0
  528. package/src/smithy/project/generator.d.ts +32 -0
  529. package/src/smithy/project/generator.js +101 -56
  530. package/src/smithy/project/generator.js.map +1 -1
  531. package/src/smithy/project/schema.d.js +6 -0
  532. package/src/smithy/project/schema.d.js.map +1 -0
  533. package/src/smithy/project/schema.d.ts +2 -0
  534. package/src/smithy/project/schema.json +28 -1
  535. package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
  536. package/src/smithy/react-connection/generator.d.ts +15 -0
  537. package/src/smithy/react-connection/generator.js +54 -48
  538. package/src/smithy/react-connection/generator.js.map +1 -1
  539. package/src/smithy/react-connection/schema.d.js +6 -0
  540. package/src/smithy/react-connection/schema.d.js.map +1 -0
  541. package/src/smithy/react-connection/schema.d.ts +1 -0
  542. package/src/smithy/react-connection/schema.json +5 -0
  543. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +847 -104
  544. package/src/smithy/ts/api/files/handler.ts.template +2 -2
  545. package/src/smithy/ts/api/files/local-server.ts.template +2 -2
  546. package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
  547. package/src/smithy/ts/api/files/service.ts.template +3 -3
  548. package/src/smithy/ts/api/generator.d.ts +84 -0
  549. package/src/smithy/ts/api/generator.js +187 -114
  550. package/src/smithy/ts/api/generator.js.map +1 -1
  551. package/src/smithy/ts/api/schema.d.js +6 -0
  552. package/src/smithy/ts/api/schema.d.js.map +1 -0
  553. package/src/smithy/ts/api/schema.d.ts +1 -0
  554. package/src/smithy/ts/api/schema.json +6 -0
  555. package/src/terraform/project/files/application/scripts/bootstrap.ts.template +40 -1
  556. package/src/terraform/project/files/application/src/main.tf.template +6 -1
  557. package/src/terraform/project/files/application/src/providers.tf.template +1 -1
  558. package/src/terraform/project/generator.d.ts +50 -0
  559. package/src/terraform/project/generator.js +212 -111
  560. package/src/terraform/project/generator.js.map +1 -1
  561. package/src/terraform/project/schema.d.js +9 -0
  562. package/src/terraform/project/schema.d.js.map +1 -0
  563. package/src/terraform/project/schema.d.ts +1 -0
  564. package/src/terraform/project/schema.json +5 -0
  565. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +1182 -184
  566. package/src/trpc/backend/files/src/client/index.ts.template +1 -1
  567. package/src/trpc/backend/files/src/handler.ts.template +1 -1
  568. package/src/trpc/backend/files/src/index.ts.template +5 -5
  569. package/src/trpc/backend/files/src/init.ts.template +1 -1
  570. package/src/trpc/backend/files/src/local-server.ts.template +1 -1
  571. package/src/trpc/backend/files/src/middleware/index.ts.template +7 -7
  572. package/src/trpc/backend/files/src/procedures/echo.ts.template +3 -3
  573. package/src/trpc/backend/files/src/router.ts.template +2 -2
  574. package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
  575. package/src/trpc/backend/files/src/schema/index.ts.template +1 -1
  576. package/src/trpc/backend/generator.d.ts +90 -1
  577. package/src/trpc/backend/generator.js +177 -100
  578. package/src/trpc/backend/generator.js.map +1 -1
  579. package/src/trpc/backend/schema.d.js +6 -0
  580. package/src/trpc/backend/schema.d.js.map +1 -0
  581. package/src/trpc/backend/schema.d.ts +1 -0
  582. package/src/trpc/backend/schema.json +6 -0
  583. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +4 -4
  584. package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
  585. package/src/trpc/react/generator.d.ts +38 -1
  586. package/src/trpc/react/generator.js +105 -63
  587. package/src/trpc/react/generator.js.map +1 -1
  588. package/src/trpc/react/schema.d.js +6 -0
  589. package/src/trpc/react/schema.d.js.map +1 -0
  590. package/src/trpc/react/schema.d.ts +1 -0
  591. package/src/trpc/react/schema.json +5 -0
  592. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +1452 -25
  593. package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +258 -0
  594. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
  595. package/src/ts/agent/a2a-connection/generator.d.ts +46 -0
  596. package/src/ts/agent/a2a-connection/generator.js +110 -63
  597. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  598. package/src/ts/agent/a2a-connection/schema.d.js +8 -0
  599. package/src/ts/agent/a2a-connection/schema.d.js.map +1 -0
  600. package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
  601. package/src/ts/agent/a2a-connection/schema.json +5 -0
  602. package/src/ts/agent/files/a2a/index.ts.template +1 -1
  603. package/src/ts/agent/files/ag-ui/index.ts.template +36 -11
  604. package/src/ts/agent/files/common/agent.ts.template +15 -2
  605. package/src/ts/agent/files/common/session.ts.template +43 -0
  606. package/src/ts/agent/files/deploy/Dockerfile.template +13 -2
  607. package/src/ts/agent/files/http/client.ts.template +2 -2
  608. package/src/ts/agent/files/http/index.ts.template +2 -2
  609. package/src/ts/agent/files/http/router.ts.template +5 -5
  610. package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +222 -0
  611. package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
  612. package/src/ts/agent/gateway-connection/generator.d.ts +47 -0
  613. package/src/ts/agent/gateway-connection/generator.js +144 -0
  614. package/src/ts/agent/gateway-connection/generator.js.map +1 -0
  615. package/src/ts/agent/gateway-connection/schema.d.js +6 -0
  616. package/src/ts/agent/gateway-connection/schema.d.js.map +1 -0
  617. package/src/ts/agent/gateway-connection/schema.d.ts +13 -0
  618. package/src/ts/agent/gateway-connection/schema.json +31 -0
  619. package/src/ts/agent/generator.d.ts +197 -0
  620. package/src/ts/agent/generator.js +339 -156
  621. package/src/ts/agent/generator.js.map +1 -1
  622. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +194 -113
  623. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +23 -0
  624. package/src/ts/agent/mcp-connection/generator.d.ts +37 -0
  625. package/src/ts/agent/mcp-connection/generator.js +88 -65
  626. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  627. package/src/ts/agent/mcp-connection/schema.d.js +8 -0
  628. package/src/ts/agent/mcp-connection/schema.d.js.map +1 -0
  629. package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
  630. package/src/ts/agent/mcp-connection/schema.json +5 -0
  631. package/src/ts/agent/react-connection/__snapshots__/generator.spec.ts.snap +8 -4
  632. package/src/ts/agent/react-connection/files/src/components/__agentNameClassName__AgentClientProvider.tsx.template +2 -1
  633. package/src/ts/agent/react-connection/generator.d.ts +202 -1
  634. package/src/ts/agent/react-connection/generator.js +158 -99
  635. package/src/ts/agent/react-connection/generator.js.map +1 -1
  636. package/src/ts/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +2 -2
  637. package/src/ts/agent/react-connection/local-dev.js +17 -0
  638. package/src/ts/agent/react-connection/local-dev.js.map +1 -0
  639. package/src/ts/agent/react-connection/schema.d.js +8 -0
  640. package/src/ts/agent/react-connection/schema.d.js.map +1 -0
  641. package/src/ts/agent/react-connection/schema.d.ts +1 -0
  642. package/src/ts/agent/react-connection/schema.json +5 -0
  643. package/src/ts/agent/schema.d.js +6 -0
  644. package/src/ts/agent/schema.d.js.map +1 -0
  645. package/src/ts/agent/schema.d.ts +4 -0
  646. package/src/ts/agent/schema.json +14 -0
  647. package/src/ts/api/generator.js +16 -16
  648. package/src/ts/api/generator.js.map +1 -1
  649. package/src/ts/api/schema.d.js +6 -0
  650. package/src/ts/api/schema.d.js.map +1 -0
  651. package/src/ts/api/schema.d.ts +1 -0
  652. package/src/ts/api/schema.json +5 -0
  653. package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +14 -14
  654. package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +3 -2
  655. package/src/ts/astro-docs/generator.d.ts +38 -0
  656. package/src/ts/astro-docs/generator.js +126 -61
  657. package/src/ts/astro-docs/generator.js.map +1 -1
  658. package/src/ts/astro-docs/schema.d.js +6 -0
  659. package/src/ts/astro-docs/schema.d.js.map +1 -0
  660. package/src/ts/astro-docs/schema.d.ts +2 -2
  661. package/src/ts/astro-docs/schema.json +3 -3
  662. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +982 -0
  663. package/src/ts/dcr-proxy/generator.d.ts +34 -0
  664. package/src/ts/dcr-proxy/generator.js +115 -0
  665. package/src/ts/dcr-proxy/generator.js.map +1 -0
  666. package/src/ts/dcr-proxy/schema.d.js +6 -0
  667. package/src/ts/dcr-proxy/schema.d.js.map +1 -0
  668. package/src/ts/dcr-proxy/schema.d.ts +13 -0
  669. package/src/ts/dcr-proxy/schema.json +44 -0
  670. package/src/ts/docs/generator.js +10 -10
  671. package/src/ts/docs/generator.js.map +1 -1
  672. package/src/ts/docs/schema.d.js +6 -0
  673. package/src/ts/docs/schema.d.js.map +1 -0
  674. package/src/ts/docs/schema.d.ts +1 -4
  675. package/src/ts/docs/schema.json +3 -3
  676. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +400 -518
  677. package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +23 -5
  678. package/src/ts/dynamodb/agent-connection/generator.js +27 -23
  679. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
  680. package/src/ts/dynamodb/agent-connection/schema.d.js +8 -0
  681. package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -0
  682. package/src/ts/dynamodb/agent-connection/schema.d.ts +1 -0
  683. package/src/ts/dynamodb/agent-connection/schema.json +5 -0
  684. package/src/ts/dynamodb/files/config.json.template +24 -0
  685. package/src/ts/dynamodb/files/src/client.ts.template +30 -11
  686. package/src/ts/dynamodb/files/src/entities/example.ts.template +1 -1
  687. package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -1
  688. package/src/ts/dynamodb/files/src/index.ts.template +2 -11
  689. package/src/ts/dynamodb/generator.d.ts +41 -0
  690. package/src/ts/dynamodb/generator.js +106 -64
  691. package/src/ts/dynamodb/generator.js.map +1 -1
  692. package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +23 -5
  693. package/src/ts/dynamodb/mcp-server-connection/generator.js +27 -23
  694. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
  695. package/src/ts/dynamodb/mcp-server-connection/schema.d.js +8 -0
  696. package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  697. package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +1 -0
  698. package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
  699. package/src/ts/dynamodb/schema.d.js +6 -0
  700. package/src/ts/dynamodb/schema.d.js.map +1 -0
  701. package/src/ts/dynamodb/schema.d.ts +2 -0
  702. package/src/ts/dynamodb/schema.json +26 -2
  703. package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +12 -3
  704. package/src/ts/dynamodb/smithy-connection/generator.js +22 -22
  705. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
  706. package/src/ts/dynamodb/smithy-connection/schema.d.js +8 -0
  707. package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -0
  708. package/src/ts/dynamodb/smithy-connection/schema.d.ts +1 -0
  709. package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
  710. package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +12 -3
  711. package/src/ts/dynamodb/trpc-connection/generator.js +22 -22
  712. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
  713. package/src/ts/dynamodb/trpc-connection/schema.d.js +8 -0
  714. package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -0
  715. package/src/ts/dynamodb/trpc-connection/schema.d.ts +1 -0
  716. package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
  717. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +8 -6
  718. package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
  719. package/src/ts/lambda-function/generator.d.ts +38 -0
  720. package/src/ts/lambda-function/generator.js +98 -65
  721. package/src/ts/lambda-function/generator.js.map +1 -1
  722. package/src/ts/lambda-function/io.js +83 -52
  723. package/src/ts/lambda-function/io.js.map +1 -1
  724. package/src/ts/lambda-function/schema.d.js +6 -0
  725. package/src/ts/lambda-function/schema.d.js.map +1 -0
  726. package/src/ts/lambda-function/schema.d.ts +1 -0
  727. package/src/ts/lambda-function/schema.json +5 -0
  728. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +83 -45
  729. package/src/ts/lib/biome.js +71 -35
  730. package/src/ts/lib/biome.js.map +1 -1
  731. package/src/ts/lib/generator.d.ts +7 -0
  732. package/src/ts/lib/generator.js +115 -103
  733. package/src/ts/lib/generator.js.map +1 -1
  734. package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
  735. package/src/ts/lib/schema.d.js +6 -0
  736. package/src/ts/lib/schema.d.js.map +1 -0
  737. package/src/ts/lib/schema.d.ts +1 -1
  738. package/src/ts/lib/schema.json +5 -0
  739. package/src/ts/lib/ts-project-utils.d.ts +13 -1
  740. package/src/ts/lib/ts-project-utils.js +96 -71
  741. package/src/ts/lib/ts-project-utils.js.map +1 -1
  742. package/src/ts/lib/types.d.ts +6 -0
  743. package/src/ts/lib/types.js +5 -2
  744. package/src/ts/lib/types.js.map +1 -1
  745. package/src/ts/lib/vitest.d.ts +10 -1
  746. package/src/ts/lib/vitest.js +42 -26
  747. package/src/ts/lib/vitest.js.map +1 -1
  748. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +221 -44
  749. package/src/ts/mcp-server/files/Dockerfile.template +13 -2
  750. package/src/ts/mcp-server/generator.d.ts +102 -0
  751. package/src/ts/mcp-server/generator.js +231 -148
  752. package/src/ts/mcp-server/generator.js.map +1 -1
  753. package/src/ts/mcp-server/schema.d.js +6 -0
  754. package/src/ts/mcp-server/schema.d.js.map +1 -0
  755. package/src/ts/mcp-server/schema.d.ts +1 -0
  756. package/src/ts/mcp-server/schema.json +6 -0
  757. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +27 -12
  758. package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
  759. package/src/ts/nx-generator/files/common/schema.json.template +5 -0
  760. package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
  761. package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
  762. package/src/ts/nx-generator/generator.d.ts +3 -0
  763. package/src/ts/nx-generator/generator.js +124 -73
  764. package/src/ts/nx-generator/generator.js.map +1 -1
  765. package/src/ts/nx-generator/schema.d.js +6 -0
  766. package/src/ts/nx-generator/schema.d.js.map +1 -0
  767. package/src/ts/nx-generator/schema.d.ts +1 -0
  768. package/src/ts/nx-generator/schema.json +5 -0
  769. package/src/ts/nx-migration/files/migration.spec.ts.template +26 -0
  770. package/src/ts/nx-migration/files/migration.ts.template +65 -0
  771. package/src/ts/nx-migration/files/prompt.md.template +46 -0
  772. package/src/ts/nx-migration/generator.d.ts +27 -0
  773. package/src/ts/nx-migration/generator.js +141 -0
  774. package/src/ts/nx-migration/generator.js.map +1 -0
  775. package/src/ts/nx-migration/schema.d.js +6 -0
  776. package/src/ts/nx-migration/schema.d.js.map +1 -0
  777. package/src/ts/nx-migration/schema.d.ts +13 -0
  778. package/src/ts/nx-migration/schema.json +63 -0
  779. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +36 -25
  780. package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
  781. package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
  782. package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
  783. package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
  784. package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
  785. package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
  786. package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +4 -4
  787. package/src/ts/nx-plugin/generator.d.ts +3 -0
  788. package/src/ts/nx-plugin/generator.js +67 -50
  789. package/src/ts/nx-plugin/generator.js.map +1 -1
  790. package/src/ts/nx-plugin/schema.d.js +9 -0
  791. package/src/ts/nx-plugin/schema.d.js.map +1 -0
  792. package/src/ts/nx-plugin/schema.json +5 -0
  793. package/src/ts/nx-plugin/utils.d.ts +27 -2
  794. package/src/ts/nx-plugin/utils.js +66 -51
  795. package/src/ts/nx-plugin/utils.js.map +1 -1
  796. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +551 -642
  797. package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +16 -6
  798. package/src/ts/rdb/agent-connection/generator.js +44 -39
  799. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  800. package/src/ts/rdb/agent-connection/schema.d.js +8 -0
  801. package/src/ts/rdb/agent-connection/schema.d.js.map +1 -0
  802. package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
  803. package/src/ts/rdb/agent-connection/schema.json +5 -0
  804. package/src/ts/rdb/files/Dockerfile.template +19 -1
  805. package/src/ts/rdb/files/config.json.template +14 -0
  806. package/src/ts/rdb/files/prisma.config.ts.template +6 -5
  807. package/src/ts/rdb/files/src/create-db-user-handler.ts.template +9 -11
  808. package/src/ts/rdb/files/src/index.ts.template +1 -2
  809. package/src/ts/rdb/files/src/migration-handler.ts.template +5 -30
  810. package/src/ts/rdb/files/src/prisma.ts.template +33 -25
  811. package/src/ts/rdb/files/src/utils.ts.template +3 -0
  812. package/src/ts/rdb/generator.d.ts +109 -4
  813. package/src/ts/rdb/generator.js +257 -138
  814. package/src/ts/rdb/generator.js.map +1 -1
  815. package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +16 -6
  816. package/src/ts/rdb/mcp-server-connection/generator.js +42 -37
  817. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  818. package/src/ts/rdb/mcp-server-connection/schema.d.js +8 -0
  819. package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -0
  820. package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
  821. package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
  822. package/src/ts/rdb/schema.d.js +6 -0
  823. package/src/ts/rdb/schema.d.js.map +1 -0
  824. package/src/ts/rdb/schema.d.ts +1 -0
  825. package/src/ts/rdb/schema.json +7 -1
  826. package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +12 -3
  827. package/src/ts/rdb/smithy-connection/generator.js +48 -43
  828. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  829. package/src/ts/rdb/smithy-connection/schema.d.js +8 -0
  830. package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -0
  831. package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
  832. package/src/ts/rdb/smithy-connection/schema.json +5 -0
  833. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +12 -3
  834. package/src/ts/rdb/trpc-connection/generator.js +37 -31
  835. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  836. package/src/ts/rdb/trpc-connection/schema.d.js +8 -0
  837. package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -0
  838. package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
  839. package/src/ts/rdb/trpc-connection/schema.json +5 -0
  840. package/src/ts/rdb/utils.js +9 -11
  841. package/src/ts/rdb/utils.js.map +1 -1
  842. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +17 -16
  843. package/src/ts/react-website/agui/generator.d.ts +97 -0
  844. package/src/ts/react-website/agui/generator.js +114 -67
  845. package/src/ts/react-website/agui/generator.js.map +1 -1
  846. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +1381 -634
  847. package/src/ts/react-website/app/generator.d.ts +142 -2
  848. package/src/ts/react-website/app/generator.js +330 -206
  849. package/src/ts/react-website/app/generator.js.map +1 -1
  850. package/src/ts/react-website/app/schema.d.js +6 -0
  851. package/src/ts/react-website/app/schema.d.js.map +1 -0
  852. package/src/ts/react-website/app/schema.d.ts +1 -1
  853. package/src/ts/react-website/app/schema.json +12 -6
  854. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +161 -26
  855. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +48 -12
  856. package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
  857. package/src/ts/react-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +2 -2
  858. package/src/ts/react-website/cognito-auth/generator.d.ts +25 -1
  859. package/src/ts/react-website/cognito-auth/generator.js +79 -64
  860. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  861. package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +3 -1
  862. package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
  863. package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
  864. package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
  865. package/src/ts/react-website/cognito-auth/schema.d.js +6 -0
  866. package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -0
  867. package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
  868. package/src/ts/react-website/cognito-auth/schema.json +5 -0
  869. package/src/ts/react-website/cognito-auth/utils.js +34 -32
  870. package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
  871. package/src/ts/react-website/runtime-config/__snapshots__/generator.spec.ts.snap +2 -2
  872. package/src/ts/react-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +2 -2
  873. package/src/ts/react-website/runtime-config/generator.js +29 -31
  874. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  875. package/src/ts/react-website/runtime-config/schema.d.js +6 -0
  876. package/src/ts/react-website/runtime-config/schema.d.js.map +1 -0
  877. package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
  878. package/src/ts/react-website/runtime-config/schema.json +5 -0
  879. package/src/ts/sync/generator.js +137 -60
  880. package/src/ts/sync/generator.js.map +1 -1
  881. package/src/ts/website/app/generator.js +10 -10
  882. package/src/ts/website/app/generator.js.map +1 -1
  883. package/src/ts/website/app/schema.d.js +6 -0
  884. package/src/ts/website/app/schema.d.js.map +1 -0
  885. package/src/ts/website/app/schema.d.ts +1 -1
  886. package/src/ts/website/app/schema.json +11 -6
  887. package/src/ts/website/auth/generator.d.ts +1 -1
  888. package/src/ts/website/auth/generator.js +11 -10
  889. package/src/ts/website/auth/generator.js.map +1 -1
  890. package/src/ts/website/auth/schema.d.js +6 -0
  891. package/src/ts/website/auth/schema.d.js.map +1 -0
  892. package/src/ts/website/auth/schema.d.ts +1 -0
  893. package/src/ts/website/auth/schema.json +5 -0
  894. package/src/utils/__snapshots__/shared-constructs.spec.ts.snap +21 -0
  895. package/src/utils/add-dependencies.d.ts +38 -0
  896. package/src/utils/add-dependencies.js +83 -0
  897. package/src/utils/add-dependencies.js.map +1 -0
  898. package/src/utils/agent-chat/agent-chat.d.ts +31 -0
  899. package/src/utils/agent-chat/agent-chat.js +31 -0
  900. package/src/utils/agent-chat/agent-chat.js.map +1 -0
  901. package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
  902. package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
  903. package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
  904. package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
  905. package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
  906. package/src/utils/agent-connection/agent-connection.d.ts +139 -26
  907. package/src/utils/agent-connection/agent-connection.js +500 -103
  908. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  909. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
  910. package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
  911. package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
  912. package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
  913. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
  914. package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +33 -33
  915. package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
  916. package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
  917. package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +47 -0
  918. package/src/utils/agent-connection/files/core-strands/base/tool-errors-strands.ts.template +29 -0
  919. package/src/utils/agent-connection/files/{core-runtime-config/with-session-id.ts.template → core-strands/base/with-session-id-strands.ts.template} +1 -1
  920. package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
  921. package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
  922. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
  923. package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
  924. package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
  925. package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
  926. package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +99 -0
  927. package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
  928. package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
  929. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
  930. package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +6 -18
  931. package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
  932. package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
  933. package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
  934. package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
  935. package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
  936. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +54 -0
  937. package/src/utils/agent-core-constructs/agent-core-constructs.js +153 -38
  938. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  939. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +170 -6
  940. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +87 -0
  941. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +624 -0
  942. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
  943. package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +212 -1
  944. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +505 -0
  945. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
  946. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +159 -13
  947. package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
  948. package/src/utils/api-constructs/api-constructs.d.ts +30 -2
  949. package/src/utils/api-constructs/api-constructs.js +82 -32
  950. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  951. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +20 -15
  952. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +24 -16
  953. package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +26 -9
  954. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +70 -0
  955. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +82 -0
  956. package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +56 -17
  957. package/src/utils/api-constructs/files/cdk/core/api/trpc/trpc-utils.ts.template +1 -1
  958. package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
  959. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +101 -12
  960. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +194 -8
  961. package/src/utils/api-constructs/files/terraform/core/api/http/http-api/http-api.tf.template +1 -1
  962. package/src/utils/api-constructs/files/terraform/core/api/rest/api-gateway-account/api-gateway-account.tf.template +83 -0
  963. package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +5 -11
  964. package/src/utils/api-constructs/open-api-metadata.js +22 -22
  965. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  966. package/src/utils/ast/website.js +18 -20
  967. package/src/utils/ast/website.js.map +1 -1
  968. package/src/utils/ast.d.ts +9 -0
  969. package/src/utils/ast.js +125 -86
  970. package/src/utils/ast.js.map +1 -1
  971. package/src/utils/base-tsconfig.d.ts +30 -0
  972. package/src/utils/base-tsconfig.js +32 -0
  973. package/src/utils/base-tsconfig.js.map +1 -0
  974. package/src/utils/bundle/bundle.d.ts +6 -1
  975. package/src/utils/bundle/bundle.js +57 -47
  976. package/src/utils/bundle/bundle.js.map +1 -1
  977. package/src/utils/commands.d.ts +14 -3
  978. package/src/utils/commands.js +83 -28
  979. package/src/utils/commands.js.map +1 -1
  980. package/src/utils/config/index.d.ts +18 -2
  981. package/src/utils/config/index.js +5 -4
  982. package/src/utils/config/index.js.map +1 -1
  983. package/src/utils/config/utils.d.ts +8 -2
  984. package/src/utils/config/utils.js +56 -59
  985. package/src/utils/config/utils.js.map +1 -1
  986. package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +16 -3
  987. package/src/utils/connection/open-api/react.d.ts +31 -5
  988. package/src/utils/connection/open-api/react.js +106 -76
  989. package/src/utils/connection/open-api/react.js.map +1 -1
  990. package/src/utils/containers.js +22 -23
  991. package/src/utils/containers.js.map +1 -1
  992. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.d.ts +38 -0
  993. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js +93 -0
  994. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js.map +1 -0
  995. package/src/utils/dcr-proxy-constructs/files/cdk/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.ts.template +227 -0
  996. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorization-server-metadata.ts.template +39 -0
  997. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorize.ts.template +26 -0
  998. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/mcp-proxy.ts.template +89 -0
  999. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/protected-resource-metadata.ts.template +13 -0
  1000. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/register.ts.template +70 -0
  1001. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/token.ts.template +75 -0
  1002. package/src/utils/dcr-proxy-constructs/files/terraform/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.tf.template +410 -0
  1003. package/src/utils/declared-dependencies.d.ts +140 -0
  1004. package/src/utils/declared-dependencies.js +64 -0
  1005. package/src/utils/declared-dependencies.js.map +1 -0
  1006. package/src/utils/dependencies.d.ts +18 -0
  1007. package/src/utils/dependencies.js +206 -0
  1008. package/src/utils/dependencies.js.map +1 -0
  1009. package/src/utils/docker.d.ts +87 -0
  1010. package/src/utils/docker.js +125 -0
  1011. package/src/utils/docker.js.map +1 -0
  1012. package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +1 -1
  1013. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +39 -41
  1014. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
  1015. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +18 -5
  1016. package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +1 -1
  1017. package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +24 -17
  1018. package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +1 -1
  1019. package/src/utils/files/common/constructs/src/core/cloudfront.ts.template +14 -0
  1020. package/src/utils/files/common/constructs/src/core/index.ts.template +5 -4
  1021. package/src/utils/files/common/constructs/src/index.ts.template +2 -2
  1022. package/src/utils/files/common/infra-config/src/index.ts.template +3 -3
  1023. package/src/utils/files/common/infra-config/src/resolve-stage.ts.template +2 -2
  1024. package/src/utils/files/common/infra-config/src/stages.config.ts.template +1 -1
  1025. package/src/{ts/dynamodb/files/scripts → utils/files/common/scripts/src/dynamodb}/create-local-table.ts.template +65 -31
  1026. package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
  1027. package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +103 -0
  1028. package/src/utils/files/common/scripts/src/infra/infra-deploy.ts.template +2 -0
  1029. package/src/utils/files/common/scripts/src/infra/infra-destroy.ts.template +2 -0
  1030. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +6 -3
  1031. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +3 -3
  1032. package/src/utils/files/common/scripts/src/rdb/mysql/wait-for-mysql-db.ts.template +32 -0
  1033. package/src/utils/files/common/scripts/src/rdb/postgres/wait-for-postgres-db.ts.template +32 -0
  1034. package/src/utils/files/common/scripts/src/rdb/shared/pull-image.ts.template +16 -0
  1035. package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +115 -0
  1036. package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
  1037. package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
  1038. package/src/utils/files/shadcn/components.json.template +1 -1
  1039. package/src/utils/files/terraform/src/core/asset-bucket/asset-bucket.tf.template +63 -72
  1040. package/src/utils/files/terraform/src/core/runtime-config/appconfig/appconfig.tf.template +1 -1
  1041. package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +12 -6
  1042. package/src/utils/files/terraform/src/core/runtime-config/entry/entry.tf.template +1 -1
  1043. package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +9 -4
  1044. package/src/utils/files/website/hooks/sigv4/useSigV4.tsx.template +1 -1
  1045. package/src/utils/format.d.ts +39 -4
  1046. package/src/utils/format.js +327 -127
  1047. package/src/utils/format.js.map +1 -1
  1048. package/src/utils/fs.d.ts +16 -5
  1049. package/src/utils/fs.js +29 -15
  1050. package/src/utils/fs.js.map +1 -1
  1051. package/src/utils/function-constructs/files/cdk/app/lambda-functions/__nameKebabCase__.ts.template +1 -1
  1052. package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
  1053. package/src/utils/function-constructs/function-constructs.js +22 -25
  1054. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  1055. package/src/utils/generators.js +18 -20
  1056. package/src/utils/generators.js.map +1 -1
  1057. package/src/utils/git.js +19 -34
  1058. package/src/utils/git.js.map +1 -1
  1059. package/src/utils/iac-providers.js +5 -5
  1060. package/src/utils/iac-providers.js.map +1 -1
  1061. package/src/utils/iac.js +12 -14
  1062. package/src/utils/iac.js.map +1 -1
  1063. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +153 -24
  1064. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +28 -9
  1065. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +129 -12
  1066. package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
  1067. package/src/utils/identity-constructs/identity-constructs.d.ts +10 -0
  1068. package/src/utils/identity-constructs/identity-constructs.js +52 -31
  1069. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  1070. package/src/utils/init.d.ts +72 -0
  1071. package/src/utils/init.js +300 -0
  1072. package/src/utils/init.js.map +1 -0
  1073. package/src/utils/install.d.ts +32 -0
  1074. package/src/utils/install.js +58 -0
  1075. package/src/utils/install.js.map +1 -0
  1076. package/src/utils/js.js +27 -20
  1077. package/src/utils/js.js.map +1 -1
  1078. package/src/utils/mcp.d.ts +9 -0
  1079. package/src/utils/mcp.js +42 -41
  1080. package/src/utils/mcp.js.map +1 -1
  1081. package/src/utils/metrics.d.ts +7 -1
  1082. package/src/utils/metrics.js +61 -46
  1083. package/src/utils/metrics.js.map +1 -1
  1084. package/src/utils/migration-manifest.d.ts +58 -0
  1085. package/src/utils/migration-manifest.js +76 -0
  1086. package/src/utils/migration-manifest.js.map +1 -0
  1087. package/src/utils/migration-versions.d.ts +116 -0
  1088. package/src/utils/migration-versions.js +186 -0
  1089. package/src/utils/migration-versions.js.map +1 -0
  1090. package/src/utils/mock-project-graph.js +8 -12
  1091. package/src/utils/mock-project-graph.js.map +1 -1
  1092. package/src/utils/module-format.d.ts +25 -0
  1093. package/src/utils/module-format.js +45 -0
  1094. package/src/utils/module-format.js.map +1 -0
  1095. package/src/utils/names.d.ts +22 -0
  1096. package/src/utils/names.js +44 -48
  1097. package/src/utils/names.js.map +1 -1
  1098. package/src/utils/npm-scope.d.ts +0 -4
  1099. package/src/utils/npm-scope.js +7 -20
  1100. package/src/utils/npm-scope.js.map +1 -1
  1101. package/src/utils/nx.d.ts +74 -3
  1102. package/src/utils/nx.js +196 -75
  1103. package/src/utils/nx.js.map +1 -1
  1104. package/src/utils/nxlv-python.js +27 -15
  1105. package/src/utils/nxlv-python.js.map +1 -1
  1106. package/src/utils/object.js +5 -11
  1107. package/src/utils/object.js.map +1 -1
  1108. package/src/utils/paths.js +11 -15
  1109. package/src/utils/paths.js.map +1 -1
  1110. package/src/utils/pkg-manager.js +4 -9
  1111. package/src/utils/pkg-manager.js.map +1 -1
  1112. package/src/utils/pnpm-workspace.d.ts +1 -12
  1113. package/src/utils/pnpm-workspace.js +16 -43
  1114. package/src/utils/pnpm-workspace.js.map +1 -1
  1115. package/src/utils/port.d.ts +28 -6
  1116. package/src/utils/port.js +67 -28
  1117. package/src/utils/port.js.map +1 -1
  1118. package/src/utils/project-package-json.d.ts +39 -0
  1119. package/src/utils/project-package-json.js +119 -0
  1120. package/src/utils/project-package-json.js.map +1 -0
  1121. package/src/utils/py.d.ts +17 -3
  1122. package/src/utils/py.js +73 -48
  1123. package/src/utils/py.js.map +1 -1
  1124. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +72 -18
  1125. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +112 -88
  1126. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +127 -53
  1127. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +60 -53
  1128. package/src/utils/rdb-constructs/rdb-constructs.d.ts +12 -1
  1129. package/src/utils/rdb-constructs/rdb-constructs.js +38 -41
  1130. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  1131. package/src/utils/ruff.d.ts +59 -0
  1132. package/src/utils/ruff.js +140 -0
  1133. package/src/utils/ruff.js.map +1 -0
  1134. package/src/utils/shared-constructs-constants.d.ts +46 -4
  1135. package/src/utils/shared-constructs-constants.js +50 -15
  1136. package/src/utils/shared-constructs-constants.js.map +1 -1
  1137. package/src/utils/shared-constructs.d.ts +4 -1
  1138. package/src/utils/shared-constructs.js +62 -67
  1139. package/src/utils/shared-constructs.js.map +1 -1
  1140. package/src/utils/shared-dynamodb-scripts.d.ts +18 -0
  1141. package/src/utils/shared-dynamodb-scripts.js +35 -0
  1142. package/src/utils/shared-dynamodb-scripts.js.map +1 -0
  1143. package/src/utils/shared-infra-config.js +31 -30
  1144. package/src/utils/shared-infra-config.js.map +1 -1
  1145. package/src/utils/shared-infra-scripts.d.ts +26 -0
  1146. package/src/utils/shared-infra-scripts.js +58 -0
  1147. package/src/utils/shared-infra-scripts.js.map +1 -0
  1148. package/src/utils/shared-rdb-scripts.d.ts +27 -0
  1149. package/src/utils/shared-rdb-scripts.js +59 -0
  1150. package/src/utils/shared-rdb-scripts.js.map +1 -0
  1151. package/src/utils/shared-scripts.d.ts +1 -4
  1152. package/src/utils/shared-scripts.js +12 -38
  1153. package/src/utils/shared-scripts.js.map +1 -1
  1154. package/src/utils/shared-shadcn.d.ts +26 -1
  1155. package/src/utils/shared-shadcn.js +93 -67
  1156. package/src/utils/shared-shadcn.js.map +1 -1
  1157. package/src/utils/test-git.d.ts +39 -0
  1158. package/src/utils/test-git.js +117 -0
  1159. package/src/utils/test-git.js.map +1 -0
  1160. package/src/utils/test.d.ts +10 -0
  1161. package/src/utils/test.js +44 -25
  1162. package/src/utils/test.js.map +1 -1
  1163. package/src/utils/toml.d.ts +5 -0
  1164. package/src/utils/toml.js +17 -15
  1165. package/src/utils/toml.js.map +1 -1
  1166. package/src/utils/version-upgrade-migration/migration.d.ts +14 -0
  1167. package/src/utils/version-upgrade-migration/migration.js +16 -0
  1168. package/src/utils/version-upgrade-migration/migration.js.map +1 -0
  1169. package/src/utils/version-upgrade-migration/nx-package-updates.d.ts +45 -0
  1170. package/src/utils/version-upgrade-migration/nx-package-updates.js +50 -0
  1171. package/src/utils/version-upgrade-migration/nx-package-updates.js.map +1 -0
  1172. package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +76 -0
  1173. package/src/utils/version-upgrade-migration/owned-dependencies.js +146 -0
  1174. package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -0
  1175. package/src/utils/version-upgrade-migration/register.d.ts +29 -0
  1176. package/src/utils/version-upgrade-migration/register.js +42 -0
  1177. package/src/utils/version-upgrade-migration/register.js.map +1 -0
  1178. package/src/utils/version-upgrade-migration/sync-embedded-versions.d.ts +26 -0
  1179. package/src/utils/version-upgrade-migration/sync-embedded-versions.js +304 -0
  1180. package/src/utils/version-upgrade-migration/sync-embedded-versions.js.map +1 -0
  1181. package/src/utils/version-upgrade-migration/sync-metrics-version.d.ts +13 -0
  1182. package/src/utils/version-upgrade-migration/sync-metrics-version.js +33 -0
  1183. package/src/utils/version-upgrade-migration/sync-metrics-version.js.map +1 -0
  1184. package/src/utils/version-upgrade-migration/sync-vended-versions.d.ts +10 -0
  1185. package/src/utils/version-upgrade-migration/sync-vended-versions.js +518 -0
  1186. package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -0
  1187. package/src/utils/version-upgrade-migration/vended-upgrade.d.ts +14 -0
  1188. package/src/utils/version-upgrade-migration/vended-upgrade.js +40 -0
  1189. package/src/utils/version-upgrade-migration/vended-upgrade.js.map +1 -0
  1190. package/src/utils/versions.d.ts +206 -106
  1191. package/src/utils/versions.js +238 -119
  1192. package/src/utils/versions.js.map +1 -1
  1193. package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +2 -2
  1194. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +207 -41
  1195. package/src/utils/website-constructs/files/terraform/app/static-websites/__websiteNameKebabCase__/__websiteNameKebabCase__.tf.template +1 -1
  1196. package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +145 -93
  1197. package/src/utils/website-constructs/website-constructs.d.ts +11 -0
  1198. package/src/utils/website-constructs/website-constructs.js +49 -30
  1199. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  1200. package/bin/aws-nx-mcp.d.ts +0 -2
  1201. package/bin/aws-nx-mcp.js +0 -17
  1202. package/bin/aws-nx-mcp.js.map +0 -1
  1203. package/sdk/connection.d.ts +0 -6
  1204. package/sdk/connection.js +0 -10
  1205. package/sdk/connection.js.map +0 -1
  1206. package/sdk/license.d.ts +0 -8
  1207. package/sdk/license.js +0 -13
  1208. package/sdk/license.js.map +0 -1
  1209. package/sdk/open-api.d.ts +0 -10
  1210. package/sdk/open-api.js +0 -15
  1211. package/sdk/open-api.js.map +0 -1
  1212. package/sdk/py.d.ts +0 -14
  1213. package/sdk/py.js +0 -18
  1214. package/sdk/py.js.map +0 -1
  1215. package/sdk/terraform.d.ts +0 -6
  1216. package/sdk/terraform.js +0 -11
  1217. package/sdk/terraform.js.map +0 -1
  1218. package/sdk/ts.d.ts +0 -29
  1219. package/sdk/ts.js +0 -47
  1220. package/sdk/ts.js.map +0 -1
  1221. package/sdk/utils/ast.js +0 -12
  1222. package/sdk/utils/ast.js.map +0 -1
  1223. package/sdk/utils/format.js +0 -10
  1224. package/sdk/utils/format.js.map +0 -1
  1225. package/sdk/utils/test.js +0 -10
  1226. package/sdk/utils/test.js.map +0 -1
  1227. package/src/connection/agent-serve-local.d.ts +0 -33
  1228. package/src/connection/agent-serve-local.js +0 -48
  1229. package/src/connection/agent-serve-local.js.map +0 -1
  1230. package/src/connection/serve-local.js +0 -41
  1231. package/src/connection/serve-local.js.map +0 -1
  1232. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
  1233. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
  1234. package/src/py/agent/react-connection/serve-local.js +0 -30
  1235. package/src/py/agent/react-connection/serve-local.js.map +0 -1
  1236. package/src/py/agent/scripts/http/chat.ts.template +0 -38
  1237. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
  1238. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
  1239. package/src/ts/agent/react-connection/serve-local.js +0 -19
  1240. package/src/ts/agent/react-connection/serve-local.js.map +0 -1
  1241. package/src/ts/agent/scripts/http/chat.ts.template +0 -35
  1242. package/src/ts/dynamodb/files/scripts/pull-image.ts.template +0 -15
  1243. package/src/ts/dynamodb/files/scripts/start-container.ts.template +0 -81
  1244. package/src/ts/dynamodb/files/src/constants.ts.template +0 -9
  1245. package/src/ts/dynamodb/files/src/gsi.ts.template +0 -14
  1246. package/src/ts/rdb/files/scripts/pull-image.ts.template +0 -15
  1247. package/src/ts/rdb/files/scripts/start-container.ts.template +0 -84
  1248. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
  1249. package/src/ts/rdb/files/src/constants.ts.template +0 -8
  1250. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
  1251. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
  1252. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
  1253. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
  1254. package/src/utils/files/common/scripts/src/infra-deploy.ts.template +0 -2
  1255. package/src/utils/files/common/scripts/src/infra-destroy.ts.template +0 -2
  1256. package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
  1257. /package/src/smithy/project/files/{smithy-build.json.template → service/smithy-build.json.template} +0 -0
  1258. /package/src/smithy/project/files/{src → service/src}/main.smithy.template +0 -0
  1259. /package/src/utils/agent-connection/files/{py-core-runtime-config/with_session_id.py.template → py-core-strands/base/with_session_id_strands.py.template} +0 -0
  1260. /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
  1261. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
  1262. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
@@ -22,137 +22,6 @@ datasource db {
22
22
  "
23
23
  `;
24
24
 
25
- exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/pull-image.ts 1`] = `
26
- "import { spawnSync } from 'child_process';
27
-
28
- const ENGINE = 'docker';
29
- const image = process.argv[2];
30
-
31
- const inspect = spawnSync(ENGINE, ['image', 'inspect', image], {
32
- stdio: 'ignore',
33
- });
34
-
35
- if (inspect.status !== 0) {
36
- const pull = spawnSync(ENGINE, ['pull', image], { stdio: 'inherit' });
37
- if (pull.status !== 0) {
38
- process.exit(pull.status ?? 1);
39
- }
40
- }
41
- "
42
- `;
43
-
44
- exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/start-container.ts 1`] = `
45
- "import { spawn, spawnSync } from 'child_process';
46
-
47
- const ENGINE = 'docker';
48
-
49
- const [containerName, image, hostPort, dbName, dbPassword] =
50
- process.argv.slice(2);
51
-
52
- const containerExists = (): boolean =>
53
- spawnSync(ENGINE, ['container', 'inspect', containerName], {
54
- stdio: 'ignore',
55
- }).status === 0;
56
-
57
- const isRunning = (): boolean => {
58
- const result = spawnSync(
59
- ENGINE,
60
- ['container', 'inspect', '-f', '{{.State.Running}}', containerName],
61
- { encoding: 'utf-8' },
62
- );
63
- return result.status === 0 && result.stdout.trim() === 'true';
64
- };
65
-
66
- if (containerExists()) {
67
- if (!isRunning()) {
68
- const start = spawnSync(ENGINE, ['start', containerName], {
69
- stdio: 'inherit',
70
- });
71
- if (start.status !== 0) process.exit(start.status ?? 1);
72
- }
73
- } else {
74
- const runArgs = (
75
- \`run --rm --name \${containerName}\` +
76
- \` -e MYSQL_DATABASE=\${dbName}\` +
77
- \` -e MYSQL_ROOT_PASSWORD=\${dbPassword}\` +
78
- \` -p \${hostPort}:3306\` +
79
- \` -v \${containerName}-data:/var/lib/mysql\` +
80
- \` -d \${image}\`
81
- ).split(' ');
82
- const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
83
- if (create.status !== 0) process.exit(create.status ?? 1);
84
- }
85
-
86
- const logs = spawn(ENGINE, ['logs', '-f', containerName], {
87
- stdio: ['ignore', 'inherit', 'inherit'],
88
- });
89
-
90
- let exiting = false;
91
-
92
- const cleanup = () => {
93
- if (exiting) return;
94
- exiting = true;
95
- spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
96
- logs.kill();
97
- process.exit(0);
98
- };
99
-
100
- process.on('SIGTERM', cleanup);
101
- process.on('SIGINT', cleanup);
102
- process.on('SIGHUP', cleanup);
103
-
104
- logs.on('exit', (code) => {
105
- if (!exiting) process.exit(code ?? 0);
106
- });
107
- "
108
- `;
109
-
110
- exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/wait-for-db.ts 1`] = `
111
- "import { createConnection, Connection } from 'mariadb';
112
-
113
- const noop = () => undefined;
114
-
115
- const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
116
- const timeoutAt = Date.now() + 60000;
117
-
118
- while (Date.now() < timeoutAt) {
119
- let conn: Connection | undefined;
120
- try {
121
- conn = await createConnection({
122
- host: 'localhost',
123
- port: parseInt(portArg),
124
- user: userArg,
125
- password: passwordArg,
126
- database: dbArg,
127
- connectTimeout: 500,
128
- allowPublicKeyRetrieval: true,
129
- });
130
- await conn.end();
131
- console.log('Database is ready.');
132
- process.exit(0);
133
- } catch {
134
- console.log('Database is not ready.');
135
- await conn?.end().catch(noop);
136
- }
137
- await new Promise((r) => setTimeout(r, 200));
138
- }
139
-
140
- throw new Error(\`Timed out waiting for mysql on port \${portArg}\`);
141
- "
142
- `;
143
-
144
- exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/constants.ts 1`] = `
145
- "export const DB_PACKAGE_NAME = 'Db';
146
-
147
- // Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
148
- export const LOCAL_DB_PORT = 3306;
149
- export const LOCAL_DB_HOST = 'localhost';
150
- export const LOCAL_DB_NAME = 'database_name';
151
- export const LOCAL_DB_USER = 'root';
152
- export const LOCAL_DB_PASSWORD = 'password';
153
- "
154
- `;
155
-
156
25
  exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/create-db-user-handler.ts 1`] = `
157
26
  "import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
158
27
  import { randomBytes } from 'node:crypto';
@@ -199,7 +68,7 @@ const ensureDatabaseUser = async (dbUser: string): Promise<void> => {
199
68
  [
200
69
  \`CREATE USER IF NOT EXISTS \${quotedUser}@\${quotedHost} IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'\`,
201
70
  \`ALTER USER \${quotedUser}@\${quotedHost} IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS' REQUIRE SSL\`,
202
- \`GRANT ALL PRIVILEGES ON \${quotedDbName}.* TO \${quotedUser}@\${quotedHost}\`,
71
+ \`GRANT SELECT, INSERT, UPDATE, DELETE ON \${quotedDbName}.* TO \${quotedUser}@\${quotedHost}\`,
203
72
  ].join(';\\n'),
204
73
  );
205
74
  } finally {
@@ -230,13 +99,13 @@ export const handler = async (
230
99
  `;
231
100
 
232
101
  exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/index.ts 1`] = `
233
- "export { DB_PACKAGE_NAME } from './constants.js';
234
- export { getPrisma } from './prisma.js';
102
+ "export { getPrisma } from './prisma.js';
235
103
  "
236
104
  `;
237
105
 
238
106
  exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/migration-handler.ts 1`] = `
239
107
  "import { execFile } from 'node:child_process';
108
+ import { join } from 'node:path';
240
109
  import { promisify } from 'node:util';
241
110
  import { getDatabaseSecret, withConnectionRetry } from './utils.js';
242
111
 
@@ -254,7 +123,8 @@ const buildDatabaseUrl = async (): Promise<string> => {
254
123
  export const handler = async () => {
255
124
  await withConnectionRetry(async () => {
256
125
  const databaseUrl = await buildDatabaseUrl();
257
- await promisify(execFile)('npx', ['prisma', 'migrate', 'deploy'], {
126
+ const prisma = join(__dirname, 'node_modules', '.bin', 'prisma');
127
+ await promisify(execFile)(prisma, ['migrate', 'deploy'], {
258
128
  cwd: __dirname,
259
129
  env: {
260
130
  ...process.env,
@@ -270,26 +140,30 @@ exports[`ts#rdb generator > should add mysql prisma dependencies when engine is
270
140
  "import { PrismaMariaDb } from '@prisma/adapter-mariadb';
271
141
  import { Signer } from '@aws-sdk/rds-signer';
272
142
  import { Prisma, PrismaClient } from '../generated/prisma/client.js';
273
- import {
274
- DB_PACKAGE_NAME,
275
- LOCAL_DB_HOST,
276
- LOCAL_DB_NAME,
277
- LOCAL_DB_PASSWORD,
278
- LOCAL_DB_PORT,
279
- LOCAL_DB_USER,
280
- } from './constants.js';
143
+ import { readFileSync } from 'fs';
144
+ import { join, dirname } from 'path';
145
+ import { fileURLToPath } from 'url';
281
146
  import { getDatabaseConfig } from './utils.js';
282
147
 
148
+ // Generated: must match runtimeConfigKey in config.json
149
+ const runtimeConfigKey = 'Db';
150
+
151
+ const __dirname = dirname(fileURLToPath(import.meta.url));
152
+ // config.json is only present in local dev (not included in the deployed bundle); guard with LOCAL_DEV check
153
+ const localDev = () =>
154
+ JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8')).localDev;
155
+
283
156
  export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
284
157
  log: LogOpts[] = ['warn', 'error'] as LogOpts[],
285
158
  ): Promise<PrismaClient<LogOpts>> => {
286
- if (process.env.SERVE_LOCAL === 'true') {
159
+ if (process.env.LOCAL_DEV === 'true') {
160
+ const { host, port, dbName, dbUser, dbPassword } = localDev();
287
161
  const adapter = new PrismaMariaDb({
288
- host: LOCAL_DB_HOST,
289
- port: LOCAL_DB_PORT,
290
- database: LOCAL_DB_NAME,
291
- user: LOCAL_DB_USER,
292
- password: LOCAL_DB_PASSWORD,
162
+ host,
163
+ port,
164
+ database: dbName,
165
+ user: dbUser,
166
+ password: dbPassword,
293
167
  allowPublicKeyRetrieval: true,
294
168
  });
295
169
  return new PrismaClient({
@@ -299,7 +173,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
299
173
  }
300
174
 
301
175
  const { hostname, port, database, dbUser, region } =
302
- await getDatabaseConfig(DB_PACKAGE_NAME);
176
+ await getDatabaseConfig(runtimeConfigKey);
303
177
  const iamAuthToken = await new Signer({
304
178
  hostname,
305
179
  port,
@@ -424,6 +298,9 @@ const transientErrorPatterns = [
424
298
  'ECONNREFUSED',
425
299
  'ENOTFOUND',
426
300
  'P1000', // Prisma: authentication failed
301
+ 'P1001', // Prisma: can't reach database server
302
+ 'P1002', // Prisma: database server reached but timed out
303
+ 'P1010', // Prisma: user denied access (IAM auth grant not yet propagated)
427
304
  'ER_ACCESS_DENIED_ERROR', // MySQL: access denied
428
305
  ];
429
306
 
@@ -484,14 +361,10 @@ import { CustomResource } from 'aws-cdk-lib';
484
361
  import { IConnectable, IVpc, Port, SubnetType } from 'aws-cdk-lib/aws-ec2';
485
362
  import { IGrantable, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
486
363
  import { Key } from 'aws-cdk-lib/aws-kms';
487
- import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
488
364
  import {
489
365
  Architecture,
490
- Code,
491
- DockerImageCode,
492
- DockerImageFunction,
493
366
  Function,
494
- Runtime,
367
+ FunctionOptions,
495
368
  Tracing,
496
369
  } from 'aws-cdk-lib/aws-lambda';
497
370
  import {
@@ -607,16 +480,6 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
607
480
  */
608
481
  readonly runtimeConfigKey: string;
609
482
 
610
- /**
611
- * Migration bundle used to create a migration handler Lambda.
612
- */
613
- readonly migrationBundleDir: string;
614
-
615
- /**
616
- * Bundle used to create or reconcile the application database user.
617
- */
618
- readonly createDbUserBundleDir: string;
619
-
620
483
  /**
621
484
  * Writer instance for the Aurora cluster.
622
485
  */
@@ -656,6 +519,25 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
656
519
  * @default true
657
520
  */
658
521
  readonly enableKeyRotation?: boolean;
522
+
523
+ /**
524
+ * Whether to export Aurora engine logs to CloudWatch Logs.
525
+ * See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
526
+ *
527
+ * PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables
528
+ * Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL).
529
+ * Neither logs statement parameter values, to avoid leaking PII into log data.
530
+ *
531
+ * @default true
532
+ */
533
+ readonly enableCloudwatchLogs?: boolean;
534
+
535
+ /**
536
+ * Whether to enable Performance Insights on the Aurora writer instance.
537
+ *
538
+ * @default true
539
+ */
540
+ readonly enablePerformanceInsights?: boolean;
659
541
  }
660
542
 
661
543
  /**
@@ -676,8 +558,6 @@ export abstract class AuroraDatabase extends Construct {
676
558
  adminUser,
677
559
  databaseName,
678
560
  runtimeConfigKey,
679
- migrationBundleDir,
680
- createDbUserBundleDir,
681
561
  vpcSubnets,
682
562
  writer,
683
563
  enableRdsProxy = true,
@@ -685,6 +565,8 @@ export abstract class AuroraDatabase extends Construct {
685
565
  deletionProtection = true,
686
566
  removalPolicy = RemovalPolicy.RETAIN,
687
567
  enableKeyRotation = true,
568
+ enableCloudwatchLogs = true,
569
+ enablePerformanceInsights = true,
688
570
  engine,
689
571
  engineVersion,
690
572
  ...clusterProps
@@ -700,12 +582,35 @@ export abstract class AuroraDatabase extends Construct {
700
582
  vpc,
701
583
  vpcSubnets,
702
584
  engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
703
- writer: writer ?? ClusterInstance.serverlessV2('writer'),
585
+ writer:
586
+ writer ??
587
+ ClusterInstance.serverlessV2('writer', {
588
+ enablePerformanceInsights,
589
+ performanceInsightEncryptionKey: enablePerformanceInsights
590
+ ? key
591
+ : undefined,
592
+ }),
704
593
  credentials: Credentials.fromGeneratedSecret(adminUser, {
705
594
  encryptionKey: key,
706
595
  }),
707
596
  iamAuthentication: true,
708
597
  monitoringInterval: Duration.seconds(5),
598
+ cloudwatchLogsExports: enableCloudwatchLogs
599
+ ? engine.type === 'mysql'
600
+ ? ['audit', 'error']
601
+ : ['postgresql']
602
+ : undefined,
603
+ parameters: enableCloudwatchLogs
604
+ ? engine.type === 'mysql'
605
+ ? {
606
+ server_audit_logging: '1',
607
+ server_audit_events: 'CONNECT,QUERY_DDL',
608
+ }
609
+ : // Only safe statement-at-a-time; a multi-statement batch mixing
610
+ // DDL with DML (e.g. one \`psql -c "a;b;c"\` call) logs the whole
611
+ // raw text verbatim, including any literal DML values.
612
+ { log_statement: 'ddl' }
613
+ : undefined,
709
614
  defaultDatabaseName: databaseName,
710
615
  storageEncrypted: true,
711
616
  storageEncryptionKey: key,
@@ -741,23 +646,23 @@ export abstract class AuroraDatabase extends Construct {
741
646
  this.proxy?.endpoint ?? this.cluster.clusterEndpoint.hostname;
742
647
  const databasePort = this.cluster.clusterEndpoint.port;
743
648
 
744
- const createDbUserHandler = new Function(this, 'CreateDbUserHandler', {
745
- code: Code.fromAsset(createDbUserBundleDir),
746
- handler: 'index.handler',
747
- runtime: Runtime.NODEJS_LATEST,
649
+ const commonProps: FunctionOptions = {
650
+ vpc,
748
651
  timeout: Duration.minutes(5),
749
652
  tracing: Tracing.ACTIVE,
750
- vpc,
653
+ architecture: Architecture.ARM_64,
654
+ };
655
+
656
+ const createDbUserHandler = this.createDbUserHandler({
657
+ ...commonProps,
751
658
  vpcSubnets: {
752
659
  subnetType: SubnetType.PRIVATE_WITH_EGRESS,
753
660
  },
754
- environment: {
755
- DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
756
- NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
757
- },
758
- architecture: Architecture.ARM_64,
759
661
  });
760
-
662
+ createDbUserHandler.addEnvironment(
663
+ 'DATABASE_SECRET_ARN',
664
+ this.cluster.secret!.secretArn,
665
+ );
761
666
  this.cluster.connections.allowDefaultPortFrom(
762
667
  createDbUserHandler,
763
668
  'Allow the create-db-user handler to connect to the database',
@@ -794,40 +699,21 @@ export abstract class AuroraDatabase extends Construct {
794
699
  region: Stack.of(this).region,
795
700
  });
796
701
 
797
- const migrationHandler = new DockerImageFunction(this, 'MigrationHandler', {
798
- code: DockerImageCode.fromImageAsset(migrationBundleDir, {
799
- platform: Platform.LINUX_ARM64,
800
- }),
702
+ const migrationHandler = this.createMigrationHandler({
703
+ ...commonProps,
801
704
  memorySize: 1024,
802
- timeout: Duration.minutes(5),
803
- tracing: Tracing.ACTIVE,
804
- vpc,
805
- environment:
806
- engine.type === 'mysql'
807
- ? {
808
- DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
809
- }
810
- : {
811
- HOSTNAME: databaseHostname,
812
- DATABASE: databaseName,
813
- PORT: databasePort.toString(),
814
- DBUSER: this.dbUser,
815
- },
816
- architecture: Architecture.ARM_64,
817
705
  });
706
+ migrationHandler.addEnvironment(
707
+ 'DATABASE_SECRET_ARN',
708
+ this.cluster.secret!.secretArn,
709
+ );
710
+ this.cluster.connections.allowDefaultPortFrom(migrationHandler);
711
+ this.grantSecretRead(migrationHandler);
818
712
 
819
- if (engine.type === 'mysql') {
820
- this.cluster.connections.allowDefaultPortFrom(migrationHandler);
821
- this.grantSecretRead(migrationHandler);
822
- } else {
823
- this.allowDefaultPortFrom(migrationHandler);
824
- this.grantConnect(migrationHandler);
825
- }
826
-
827
- const trigger = new Trigger(this, 'MigrationTrigger', {
713
+ const migrationTrigger = new Trigger(this, 'MigrationTrigger', {
828
714
  handler: migrationHandler,
829
715
  });
830
- trigger.node.addDependency(createDbUserResource);
716
+ migrationTrigger.node.addDependency(createDbUserResource);
831
717
 
832
718
  new CfnOutput(this, 'ClusterEndpoint', {
833
719
  value: this.cluster.clusterEndpoint.hostname,
@@ -840,6 +726,18 @@ export abstract class AuroraDatabase extends Construct {
840
726
  }
841
727
  }
842
728
 
729
+ /**
730
+ * Creates the Lambda handler used to create or reconcile the application database user.
731
+ */
732
+ protected abstract createDbUserHandler(baseProps: FunctionOptions): Function;
733
+
734
+ /**
735
+ * Creates the Lambda handler used to run database migrations.
736
+ */
737
+ protected abstract createMigrationHandler(
738
+ baseProps: FunctionOptions,
739
+ ): Function;
740
+
843
741
  public allowDefaultPortFrom(other: IConnectable, description?: string): void {
844
742
  if (this.proxy) {
845
743
  this.proxy.connections.allowFrom(
@@ -867,17 +765,14 @@ export abstract class AuroraDatabase extends Construct {
867
765
 
868
766
  exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL 2`] = `
869
767
  "import { defineConfig } from 'prisma/config';
768
+ import { readFileSync } from 'fs';
870
769
 
871
770
  const getDatabaseUrl = async () => {
872
- if (process.env.SERVE_LOCAL === 'true') {
873
- const {
874
- LOCAL_DB_HOST,
875
- LOCAL_DB_NAME,
876
- LOCAL_DB_PASSWORD,
877
- LOCAL_DB_PORT,
878
- LOCAL_DB_USER,
879
- } = await import('./src/constants.js');
880
- return \`mysql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
771
+ if (process.env.LOCAL_DEV === 'true') {
772
+ const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
773
+ readFileSync('config.json', 'utf-8'),
774
+ ).localDev;
775
+ return \`mysql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
881
776
  }
882
777
  return process.env.DATABASE_URL;
883
778
  };
@@ -904,15 +799,15 @@ terraform {
904
799
  required_providers {
905
800
  aws = {
906
801
  source = "hashicorp/aws"
907
- version = "~> 6.33"
802
+ version = "6.57.1"
908
803
  }
909
804
  null = {
910
805
  source = "hashicorp/null"
911
- version = ">= 3.0"
806
+ version = "3.3.0"
912
807
  }
913
808
  random = {
914
809
  source = "hashicorp/random"
915
- version = ">= 3.0"
810
+ version = "3.9.0"
916
811
  }
917
812
  }
918
813
  }
@@ -1021,9 +916,9 @@ variable "enable_credential_rotation" {
1021
916
  }
1022
917
 
1023
918
  variable "enable_cloudwatch_logs" {
1024
- description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL also enables verbose statement logging."
919
+ description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL). Neither logs statement parameter values, to avoid leaking PII into log data."
1025
920
  type = bool
1026
- default = false
921
+ default = true
1027
922
  }
1028
923
 
1029
924
  variable "enable_performance_insights" {
@@ -1056,10 +951,19 @@ variable "tags" {
1056
951
  default = {}
1057
952
  }
1058
953
 
954
+ # Suffix appended to physical resource names so that multiple deployments
955
+ # (e.g. separate environments in the same account and region) don't collide.
956
+ resource "random_string" "suffix" {
957
+ length = 8
958
+ special = false
959
+ upper = false
960
+ }
961
+
1059
962
  locals {
1060
963
  default_port = var.engine == "aurora-mysql" ? 3306 : 5432
1061
964
  default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
1062
965
  parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
966
+ cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
1063
967
  }
1064
968
 
1065
969
  resource "aws_rds_cluster_parameter_group" "database" {
@@ -1069,11 +973,30 @@ resource "aws_rds_cluster_parameter_group" "database" {
1069
973
  family = local.parameter_group_family
1070
974
  description = "Parameter group for \${var.name} Aurora cluster"
1071
975
 
976
+ # Only safe statement-at-a-time; a multi-statement batch mixing DDL with
977
+ # DML (e.g. one \`psql -c "a;b;c"\` call) logs the whole raw text verbatim,
978
+ # including any literal DML values.
1072
979
  dynamic "parameter" {
1073
980
  for_each = var.engine == "aurora-postgresql" ? [1] : []
1074
981
  content {
1075
982
  name = "log_statement"
1076
- value = "all"
983
+ value = "ddl"
984
+ }
985
+ }
986
+
987
+ dynamic "parameter" {
988
+ for_each = var.engine == "aurora-mysql" ? [1] : []
989
+ content {
990
+ name = "server_audit_logging"
991
+ value = "1"
992
+ }
993
+ }
994
+
995
+ dynamic "parameter" {
996
+ for_each = var.engine == "aurora-mysql" ? [1] : []
997
+ content {
998
+ name = "server_audit_events"
999
+ value = "CONNECT,QUERY_DDL"
1077
1000
  }
1078
1001
  }
1079
1002
 
@@ -1157,7 +1080,7 @@ resource "aws_security_group" "database" {
1157
1080
  }
1158
1081
 
1159
1082
  resource "aws_db_subnet_group" "database" {
1160
- name = "\${var.name}-aurora"
1083
+ name = local.cluster_name
1161
1084
  subnet_ids = var.subnet_ids
1162
1085
 
1163
1086
  tags = merge(var.tags, {
@@ -1195,9 +1118,9 @@ resource "aws_secretsmanager_secret_version" "credentials" {
1195
1118
  }
1196
1119
 
1197
1120
  resource "aws_rds_cluster" "database" {
1198
- #checkov:skip=CKV2_AWS_27:Query logging can be enabled with enable_cloudwatch_logs; this module defaults to CDK-equivalent behavior unless logging is requested
1121
+ #checkov:skip=CKV2_AWS_27:Query logging is enabled by default via enable_cloudwatch_logs; checkov cannot resolve the conditional count expression on aws_rds_cluster_parameter_group.database
1199
1122
  #checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
1200
- cluster_identifier = "\${var.name}-aurora"
1123
+ cluster_identifier = local.cluster_name
1201
1124
  engine = var.engine
1202
1125
  engine_version = coalesce(var.engine_version, local.default_engine_version)
1203
1126
  database_name = var.database_name
@@ -1211,12 +1134,12 @@ resource "aws_rds_cluster" "database" {
1211
1134
  kms_key_id = aws_kms_key.database.arn
1212
1135
  deletion_protection = var.deletion_protection
1213
1136
  skip_final_snapshot = var.skip_final_snapshot
1214
- final_snapshot_identifier = var.skip_final_snapshot ? null : "\${var.name}-aurora-final-snapshot"
1137
+ final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
1215
1138
  iam_database_authentication_enabled = true
1216
1139
  monitoring_interval = 5
1217
1140
  monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
1218
1141
  copy_tags_to_snapshot = true
1219
- enabled_cloudwatch_logs_exports = var.enable_cloudwatch_logs ? (var.engine == "aurora-mysql" ? ["audit", "error", "general", "slowquery"] : ["postgresql"]) : null
1142
+ enabled_cloudwatch_logs_exports = var.enable_cloudwatch_logs ? (var.engine == "aurora-mysql" ? ["audit", "error"] : ["postgresql"]) : null
1220
1143
 
1221
1144
  serverlessv2_scaling_configuration {
1222
1145
  min_capacity = var.serverless_min_capacity
@@ -1231,7 +1154,7 @@ resource "aws_rds_cluster" "database" {
1231
1154
  resource "aws_rds_cluster_instance" "database" {
1232
1155
  count = var.instance_count
1233
1156
 
1234
- identifier = "\${var.name}-aurora-\${count.index + 1}"
1157
+ identifier = "\${local.cluster_name}-\${count.index + 1}"
1235
1158
  cluster_identifier = aws_rds_cluster.database.id
1236
1159
  instance_class = "db.serverless"
1237
1160
  engine = aws_rds_cluster.database.engine
@@ -1285,7 +1208,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
1285
1208
  resource "aws_cloudformation_stack" "credentials_rotation" {
1286
1209
  #checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
1287
1210
  count = var.enable_credential_rotation ? 1 : 0
1288
- name = "\${var.name}-aurora-credentials-rotation"
1211
+ name = "\${local.cluster_name}-credentials-rotation"
1289
1212
 
1290
1213
  capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
1291
1214
 
@@ -1299,7 +1222,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
1299
1222
  SecretId = aws_secretsmanager_secret.credentials.arn
1300
1223
  HostedRotationLambda = {
1301
1224
  RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
1302
- RotationLambdaName = "\${var.name}-aurora-credentials-rotation"
1225
+ RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
1303
1226
  VpcSecurityGroupIds = aws_security_group.rotation[0].id
1304
1227
  VpcSubnetIds = join(",", var.lambda_subnet_ids)
1305
1228
  }
@@ -1342,27 +1265,6 @@ resource "aws_iam_role" "proxy" {
1342
1265
  })
1343
1266
  }
1344
1267
 
1345
- resource "aws_iam_role_policy" "proxy_secret_access" {
1346
- count = var.enable_rds_proxy ? 1 : 0
1347
- role = aws_iam_role.proxy[0].name
1348
-
1349
- policy = jsonencode({
1350
- Version = "2012-10-17"
1351
- Statement = [
1352
- {
1353
- Effect = "Allow"
1354
- Action = ["secretsmanager:GetSecretValue"]
1355
- Resource = [aws_secretsmanager_secret.credentials.arn]
1356
- },
1357
- {
1358
- Effect = "Allow"
1359
- Action = ["kms:Decrypt"]
1360
- Resource = [aws_kms_key.database.arn]
1361
- }
1362
- ]
1363
- })
1364
- }
1365
-
1366
1268
  resource "aws_security_group" "proxy" {
1367
1269
  #checkov:skip=CKV2_AWS_5:Security group is attached to aws_db_proxy.aurora; Checkov cannot resolve count-conditional cross-resource references
1368
1270
  count = var.enable_rds_proxy ? 1 : 0
@@ -1379,24 +1281,13 @@ resource "aws_security_group" "proxy" {
1379
1281
  resource "aws_db_proxy" "aurora" {
1380
1282
  count = var.enable_rds_proxy ? 1 : 0
1381
1283
 
1382
- name = "\${var.name}-proxy"
1284
+ name = "\${var.name}-proxy-\${random_string.suffix.result}"
1383
1285
  default_auth_scheme = "IAM_AUTH"
1384
1286
  engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
1385
1287
  role_arn = aws_iam_role.proxy[0].arn
1386
1288
  vpc_subnet_ids = var.subnet_ids
1387
1289
  vpc_security_group_ids = [aws_security_group.proxy[0].id]
1388
1290
  require_tls = true
1389
-
1390
- auth {
1391
- auth_scheme = "SECRETS"
1392
- iam_auth = "REQUIRED"
1393
- secret_arn = aws_secretsmanager_secret.credentials.arn
1394
- }
1395
-
1396
- depends_on = [
1397
- aws_iam_role_policy.proxy_secret_access,
1398
- aws_secretsmanager_secret_version.credentials,
1399
- ]
1400
1291
  }
1401
1292
 
1402
1293
  resource "aws_db_proxy_default_target_group" "default" {
@@ -1428,9 +1319,9 @@ resource "null_resource" "proxy_target_ready" {
1428
1319
  deadline=$((start_time + 600))
1429
1320
  while true; do
1430
1321
  target_state=$(aws rds describe-db-proxy-targets \\
1431
- --region \${data.aws_region.current.region} \\
1432
- --db-proxy-name \${self.triggers.db_proxy_name} \\
1433
- --target-group-name \${self.triggers.target_group_name} \\
1322
+ --region "$AWS_REGION" \\
1323
+ --db-proxy-name "$DB_PROXY_NAME" \\
1324
+ --target-group-name "$TARGET_GROUP_NAME" \\
1434
1325
  --query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
1435
1326
  --output text)
1436
1327
 
@@ -1440,13 +1331,19 @@ resource "null_resource" "proxy_target_ready" {
1440
1331
 
1441
1332
  current_time=$(date +%s)
1442
1333
  if [ "$current_time" -ge "$deadline" ]; then
1443
- echo "RDS Proxy target \${self.triggers.db_cluster_identifier} did not become AVAILABLE within 10 minutes. Last state: $target_state"
1334
+ echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
1444
1335
  exit 1
1445
1336
  fi
1446
1337
 
1447
1338
  sleep 10
1448
1339
  done
1449
1340
  EOT
1341
+ environment = {
1342
+ AWS_REGION = data.aws_region.current.region
1343
+ DB_PROXY_NAME = self.triggers.db_proxy_name
1344
+ TARGET_GROUP_NAME = self.triggers.target_group_name
1345
+ DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
1346
+ }
1450
1347
  }
1451
1348
 
1452
1349
  depends_on = [
@@ -1525,7 +1422,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
1525
1422
  resource "aws_backup_vault" "database" {
1526
1423
  count = var.enable_backup ? 1 : 0
1527
1424
 
1528
- name = "\${var.name}-aurora-backup"
1425
+ name = "\${local.cluster_name}-backup"
1529
1426
  kms_key_arn = aws_kms_key.database.arn
1530
1427
  tags = var.tags
1531
1428
  }
@@ -1533,7 +1430,7 @@ resource "aws_backup_vault" "database" {
1533
1430
  resource "aws_backup_plan" "database" {
1534
1431
  count = var.enable_backup ? 1 : 0
1535
1432
 
1536
- name = "\${var.name}-aurora-backup"
1433
+ name = "\${local.cluster_name}-backup"
1537
1434
 
1538
1435
  rule {
1539
1436
  rule_name = "daily-backup"
@@ -1573,6 +1470,11 @@ output "proxy_resource_id" {
1573
1470
  value = var.enable_rds_proxy ? split(":", aws_db_proxy.aurora[0].arn)[6] : null
1574
1471
  }
1575
1472
 
1473
+ output "connect_resource_id" {
1474
+ description = "Resource ID to use in IAM rds-db:connect policies for the application database user. Resolves to the RDS Proxy resource ID when the proxy is enabled (the default), or the Aurora cluster resource ID when it is disabled — connecting through the proxy and connecting directly to the cluster are different IAM permission boundaries."
1475
+ value = var.enable_rds_proxy ? split(":", aws_db_proxy.aurora[0].arn)[6] : aws_rds_cluster.database.cluster_resource_id
1476
+ }
1477
+
1576
1478
  output "cluster_endpoint" {
1577
1479
  description = "Writer endpoint of the Aurora cluster or proxy."
1578
1480
  value = var.enable_rds_proxy ? aws_db_proxy.aurora[0].endpoint : aws_rds_cluster.database.endpoint
@@ -1647,19 +1549,19 @@ exports[`ts#rdb generator > should generate terraform modules when iac is Terraf
1647
1549
  required_providers {
1648
1550
  archive = {
1649
1551
  source = "hashicorp/archive"
1650
- version = "~> 2.5"
1552
+ version = "2.8.0"
1651
1553
  }
1652
1554
  aws = {
1653
1555
  source = "hashicorp/aws"
1654
- version = "~> 6.33"
1556
+ version = "6.57.1"
1655
1557
  }
1656
1558
  null = {
1657
1559
  source = "hashicorp/null"
1658
- version = ">= 3.0"
1560
+ version = "3.3.0"
1659
1561
  }
1660
1562
  random = {
1661
1563
  source = "hashicorp/random"
1662
- version = ">= 3.0"
1564
+ version = "3.9.0"
1663
1565
  }
1664
1566
  }
1665
1567
  }
@@ -1763,12 +1665,13 @@ variable "tags" {
1763
1665
  default = {}
1764
1666
  }
1765
1667
 
1766
- variable "docker_image_tag" {
1668
+ variable "migration_docker_image_tag" {
1767
1669
  description = "Docker image tag for the migration handler. Defaults to the tag built by the Nx docker target."
1768
1670
  type = string
1769
1671
  default = "proj-db-migration:latest"
1770
1672
  }
1771
1673
 
1674
+
1772
1675
  variable "asset_bucket_name" {
1773
1676
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
1774
1677
  type = string
@@ -1784,10 +1687,12 @@ resource "random_string" "suffix" {
1784
1687
  }
1785
1688
 
1786
1689
  locals {
1787
- create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
1788
- migration_function_name = "db-migration-\${random_string.suffix.result}"
1690
+ config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
1691
+ runtime_config_key = local.config.runtimeConfigKey
1692
+ create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
1693
+ migration_function_name = "db-migration-\${random_string.suffix.result}"
1789
1694
  create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
1790
- database_runtime_user = "db_\${random_string.suffix.result}"
1695
+ database_runtime_user = "db_\${random_string.suffix.result}"
1791
1696
  }
1792
1697
 
1793
1698
  module "aurora" {
@@ -1853,7 +1758,7 @@ module "add_rdb_to_runtime_config" {
1853
1758
  source = "../../../core/runtime-config/entry"
1854
1759
 
1855
1760
  namespace = "database"
1856
- key = "Db"
1761
+ key = local.runtime_config_key
1857
1762
  value = {
1858
1763
  hostname = module.aurora.cluster_endpoint
1859
1764
  port = module.aurora.cluster_port
@@ -1866,9 +1771,8 @@ module "add_rdb_to_runtime_config" {
1866
1771
 
1867
1772
  resource "aws_ecr_repository" "migration_handler" {
1868
1773
  #checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
1869
- #checkov:skip=CKV_AWS_51:Mutable tags are intentional; the migration handler is always pushed as latest and redeployment is gated on docker_digest changes in null_resource.docker_publish
1870
1774
  name = "db-migration-\${random_string.suffix.result}"
1871
- image_tag_mutability = "MUTABLE"
1775
+ image_tag_mutability = "IMMUTABLE"
1872
1776
  force_delete = true
1873
1777
 
1874
1778
  image_scanning_configuration {
@@ -1916,22 +1820,34 @@ resource "aws_ecr_repository_policy" "migration_handler" {
1916
1820
  }
1917
1821
 
1918
1822
  data "external" "docker_digest" {
1919
- program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.docker_image_tag} --format '{{.Id}}')'\\"}' "]
1823
+ program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.migration_docker_image_tag} --format '{{.Id}}')'\\"}' "]
1824
+ }
1825
+
1826
+ locals {
1827
+ # Content-based, immutable image tag derived from the local image digest
1828
+ image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
1920
1829
  }
1921
1830
 
1922
1831
  resource "null_resource" "docker_publish" {
1923
1832
  triggers = {
1924
1833
  docker_digest = data.external.docker_digest.result.digest
1925
1834
  repository_url = aws_ecr_repository.migration_handler.repository_url
1926
- docker_image_tag = var.docker_image_tag
1835
+ migration_docker_image_tag = var.migration_docker_image_tag
1836
+ image_tag = local.image_tag
1927
1837
  }
1928
1838
 
1929
1839
  provisioner "local-exec" {
1930
1840
  command = <<-EOT
1931
- aws ecr get-login-password --region \${data.aws_region.current.region} | docker login --username AWS --password-stdin \${self.triggers.repository_url}
1932
- docker tag \${self.triggers.docker_image_tag} \${self.triggers.repository_url}:latest
1933
- docker push \${self.triggers.repository_url}:latest
1841
+ aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
1842
+ docker tag "$MIGRATION_DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
1843
+ docker push "$REPOSITORY_URL:$IMAGE_TAG"
1934
1844
  EOT
1845
+ environment = {
1846
+ AWS_REGION = data.aws_region.current.region
1847
+ REPOSITORY_URL = self.triggers.repository_url
1848
+ MIGRATION_DOCKER_IMAGE_TAG = self.triggers.migration_docker_image_tag
1849
+ IMAGE_TAG = self.triggers.image_tag
1850
+ }
1935
1851
  }
1936
1852
 
1937
1853
  depends_on = [aws_ecr_repository_policy.migration_handler]
@@ -1980,11 +1896,16 @@ resource "aws_iam_role_policy" "migration_handler_access" {
1980
1896
  {
1981
1897
  Effect = "Allow"
1982
1898
  Action = [
1983
- "rds-db:connect"
1899
+ "secretsmanager:GetSecretValue"
1984
1900
  ]
1985
- Resource = [
1986
- "arn:aws:rds-db:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:dbuser:\${var.enable_rds_proxy ? module.aurora.proxy_resource_id : module.aurora.cluster_resource_id}/\${local.database_runtime_user}"
1901
+ Resource = [module.aurora.secret_arn]
1902
+ },
1903
+ {
1904
+ Effect = "Allow"
1905
+ Action = [
1906
+ "kms:Decrypt"
1987
1907
  ]
1908
+ Resource = [module.aurora.kms_key_arn]
1988
1909
  }
1989
1910
  ]
1990
1911
  })
@@ -2073,7 +1994,7 @@ resource "aws_security_group" "migration_handler" {
2073
1994
 
2074
1995
  resource "aws_vpc_security_group_egress_rule" "migration_handler_to_database" {
2075
1996
  security_group_id = aws_security_group.migration_handler.id
2076
- referenced_security_group_id = module.aurora.security_group_id
1997
+ referenced_security_group_id = module.aurora.database_security_group_id
2077
1998
  from_port = module.aurora.cluster_port
2078
1999
  to_port = module.aurora.cluster_port
2079
2000
  ip_protocol = "tcp"
@@ -2115,7 +2036,7 @@ resource "aws_vpc_security_group_egress_rule" "create_db_user_https" {
2115
2036
  }
2116
2037
 
2117
2038
  resource "aws_vpc_security_group_ingress_rule" "migration_handler_to_database" {
2118
- security_group_id = module.aurora.security_group_id
2039
+ security_group_id = module.aurora.database_security_group_id
2119
2040
  referenced_security_group_id = aws_security_group.migration_handler.id
2120
2041
  from_port = module.aurora.cluster_port
2121
2042
  to_port = module.aurora.cluster_port
@@ -2189,10 +2110,10 @@ resource "null_resource" "create_db_user_trigger" {
2189
2110
  command = <<-EOT
2190
2111
  output_file=$(mktemp)
2191
2112
  response=$(aws lambda invoke \\
2192
- --region \${data.aws_region.current.region} \\
2193
- --function-name \${self.triggers.function_name} \\
2113
+ --region "$AWS_REGION" \\
2114
+ --function-name "$FUNCTION_NAME" \\
2194
2115
  --cli-binary-format raw-in-base64-out \\
2195
- --payload '{"RequestType":"Create","PhysicalResourceId":"db-user:\${self.triggers.db_user}"}' \\
2116
+ --payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
2196
2117
  "$output_file")
2197
2118
  cat "$output_file"
2198
2119
  echo "$response"
@@ -2202,6 +2123,11 @@ resource "null_resource" "create_db_user_trigger" {
2202
2123
  fi
2203
2124
  rm -f "$output_file"
2204
2125
  EOT
2126
+ environment = {
2127
+ AWS_REGION = data.aws_region.current.region
2128
+ FUNCTION_NAME = self.triggers.function_name
2129
+ DB_USER = self.triggers.db_user
2130
+ }
2205
2131
  }
2206
2132
 
2207
2133
  depends_on = [aws_lambda_function.create_db_user, module.aurora]
@@ -2215,7 +2141,7 @@ resource "aws_lambda_function" "migration_handler" {
2215
2141
  package_type = "Image"
2216
2142
  function_name = local.migration_function_name
2217
2143
  role = aws_iam_role.migration_handler.arn
2218
- image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:latest"
2144
+ image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
2219
2145
  memory_size = 1024
2220
2146
  timeout = 300
2221
2147
  architectures = ["arm64"]
@@ -2231,10 +2157,7 @@ resource "aws_lambda_function" "migration_handler" {
2231
2157
 
2232
2158
  environment {
2233
2159
  variables = {
2234
- HOSTNAME = module.aurora.cluster_endpoint
2235
- DATABASE = module.aurora.database_name
2236
- PORT = tostring(module.aurora.cluster_port)
2237
- DBUSER = local.database_runtime_user
2160
+ DATABASE_SECRET_ARN = module.aurora.secret_arn
2238
2161
  }
2239
2162
  }
2240
2163
 
@@ -2264,8 +2187,8 @@ resource "null_resource" "migration_trigger" {
2264
2187
  command = <<-EOT
2265
2188
  output_file=$(mktemp)
2266
2189
  response=$(aws lambda invoke \\
2267
- --region \${data.aws_region.current.region} \\
2268
- --function-name \${self.triggers.function_name} \\
2190
+ --region "$AWS_REGION" \\
2191
+ --function-name "$FUNCTION_NAME" \\
2269
2192
  --cli-binary-format raw-in-base64-out \\
2270
2193
  "$output_file")
2271
2194
  cat "$output_file"
@@ -2276,6 +2199,10 @@ resource "null_resource" "migration_trigger" {
2276
2199
  fi
2277
2200
  rm -f "$output_file"
2278
2201
  EOT
2202
+ environment = {
2203
+ AWS_REGION = data.aws_region.current.region
2204
+ FUNCTION_NAME = self.triggers.function_name
2205
+ }
2279
2206
  }
2280
2207
 
2281
2208
  depends_on = [
@@ -2306,6 +2233,11 @@ output "proxy_resource_id" {
2306
2233
  value = module.aurora.proxy_resource_id
2307
2234
  }
2308
2235
 
2236
+ output "connect_resource_id" {
2237
+ description = "Resource ID to use in IAM rds-db:connect policies for the application database user. Resolves to the RDS Proxy resource ID when the proxy is enabled (the default), or the Aurora cluster resource ID when it is disabled — connecting through the proxy and connecting directly to the cluster are different IAM permission boundaries."
2238
+ value = module.aurora.connect_resource_id
2239
+ }
2240
+
2309
2241
  output "kms_key_arn" {
2310
2242
  description = "ARN of the KMS key protecting Aurora and the admin credentials secret, used to grant decrypt access alongside secret_arn."
2311
2243
  value = module.aurora.kms_key_arn
@@ -2340,7 +2272,6 @@ output "database_runtime_user" {
2340
2272
  description = "Application database user created for IAM-authenticated access."
2341
2273
  value = local.database_runtime_user
2342
2274
  }
2343
-
2344
2275
  "
2345
2276
  `;
2346
2277
 
@@ -2354,15 +2285,15 @@ terraform {
2354
2285
  required_providers {
2355
2286
  aws = {
2356
2287
  source = "hashicorp/aws"
2357
- version = "~> 6.33"
2288
+ version = "6.57.1"
2358
2289
  }
2359
2290
  null = {
2360
2291
  source = "hashicorp/null"
2361
- version = ">= 3.0"
2292
+ version = "3.3.0"
2362
2293
  }
2363
2294
  random = {
2364
2295
  source = "hashicorp/random"
2365
- version = ">= 3.0"
2296
+ version = "3.9.0"
2366
2297
  }
2367
2298
  }
2368
2299
  }
@@ -2471,9 +2402,9 @@ variable "enable_credential_rotation" {
2471
2402
  }
2472
2403
 
2473
2404
  variable "enable_cloudwatch_logs" {
2474
- description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL also enables verbose statement logging."
2405
+ description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL). Neither logs statement parameter values, to avoid leaking PII into log data."
2475
2406
  type = bool
2476
- default = false
2407
+ default = true
2477
2408
  }
2478
2409
 
2479
2410
  variable "enable_performance_insights" {
@@ -2506,10 +2437,19 @@ variable "tags" {
2506
2437
  default = {}
2507
2438
  }
2508
2439
 
2440
+ # Suffix appended to physical resource names so that multiple deployments
2441
+ # (e.g. separate environments in the same account and region) don't collide.
2442
+ resource "random_string" "suffix" {
2443
+ length = 8
2444
+ special = false
2445
+ upper = false
2446
+ }
2447
+
2509
2448
  locals {
2510
2449
  default_port = var.engine == "aurora-mysql" ? 3306 : 5432
2511
2450
  default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
2512
2451
  parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
2452
+ cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
2513
2453
  }
2514
2454
 
2515
2455
  resource "aws_rds_cluster_parameter_group" "database" {
@@ -2519,11 +2459,30 @@ resource "aws_rds_cluster_parameter_group" "database" {
2519
2459
  family = local.parameter_group_family
2520
2460
  description = "Parameter group for \${var.name} Aurora cluster"
2521
2461
 
2462
+ # Only safe statement-at-a-time; a multi-statement batch mixing DDL with
2463
+ # DML (e.g. one \`psql -c "a;b;c"\` call) logs the whole raw text verbatim,
2464
+ # including any literal DML values.
2522
2465
  dynamic "parameter" {
2523
2466
  for_each = var.engine == "aurora-postgresql" ? [1] : []
2524
2467
  content {
2525
2468
  name = "log_statement"
2526
- value = "all"
2469
+ value = "ddl"
2470
+ }
2471
+ }
2472
+
2473
+ dynamic "parameter" {
2474
+ for_each = var.engine == "aurora-mysql" ? [1] : []
2475
+ content {
2476
+ name = "server_audit_logging"
2477
+ value = "1"
2478
+ }
2479
+ }
2480
+
2481
+ dynamic "parameter" {
2482
+ for_each = var.engine == "aurora-mysql" ? [1] : []
2483
+ content {
2484
+ name = "server_audit_events"
2485
+ value = "CONNECT,QUERY_DDL"
2527
2486
  }
2528
2487
  }
2529
2488
 
@@ -2607,7 +2566,7 @@ resource "aws_security_group" "database" {
2607
2566
  }
2608
2567
 
2609
2568
  resource "aws_db_subnet_group" "database" {
2610
- name = "\${var.name}-aurora"
2569
+ name = local.cluster_name
2611
2570
  subnet_ids = var.subnet_ids
2612
2571
 
2613
2572
  tags = merge(var.tags, {
@@ -2645,9 +2604,9 @@ resource "aws_secretsmanager_secret_version" "credentials" {
2645
2604
  }
2646
2605
 
2647
2606
  resource "aws_rds_cluster" "database" {
2648
- #checkov:skip=CKV2_AWS_27:Query logging can be enabled with enable_cloudwatch_logs; this module defaults to CDK-equivalent behavior unless logging is requested
2607
+ #checkov:skip=CKV2_AWS_27:Query logging is enabled by default via enable_cloudwatch_logs; checkov cannot resolve the conditional count expression on aws_rds_cluster_parameter_group.database
2649
2608
  #checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
2650
- cluster_identifier = "\${var.name}-aurora"
2609
+ cluster_identifier = local.cluster_name
2651
2610
  engine = var.engine
2652
2611
  engine_version = coalesce(var.engine_version, local.default_engine_version)
2653
2612
  database_name = var.database_name
@@ -2661,12 +2620,12 @@ resource "aws_rds_cluster" "database" {
2661
2620
  kms_key_id = aws_kms_key.database.arn
2662
2621
  deletion_protection = var.deletion_protection
2663
2622
  skip_final_snapshot = var.skip_final_snapshot
2664
- final_snapshot_identifier = var.skip_final_snapshot ? null : "\${var.name}-aurora-final-snapshot"
2623
+ final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
2665
2624
  iam_database_authentication_enabled = true
2666
2625
  monitoring_interval = 5
2667
2626
  monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
2668
2627
  copy_tags_to_snapshot = true
2669
- enabled_cloudwatch_logs_exports = var.enable_cloudwatch_logs ? (var.engine == "aurora-mysql" ? ["audit", "error", "general", "slowquery"] : ["postgresql"]) : null
2628
+ enabled_cloudwatch_logs_exports = var.enable_cloudwatch_logs ? (var.engine == "aurora-mysql" ? ["audit", "error"] : ["postgresql"]) : null
2670
2629
 
2671
2630
  serverlessv2_scaling_configuration {
2672
2631
  min_capacity = var.serverless_min_capacity
@@ -2681,7 +2640,7 @@ resource "aws_rds_cluster" "database" {
2681
2640
  resource "aws_rds_cluster_instance" "database" {
2682
2641
  count = var.instance_count
2683
2642
 
2684
- identifier = "\${var.name}-aurora-\${count.index + 1}"
2643
+ identifier = "\${local.cluster_name}-\${count.index + 1}"
2685
2644
  cluster_identifier = aws_rds_cluster.database.id
2686
2645
  instance_class = "db.serverless"
2687
2646
  engine = aws_rds_cluster.database.engine
@@ -2735,7 +2694,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
2735
2694
  resource "aws_cloudformation_stack" "credentials_rotation" {
2736
2695
  #checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
2737
2696
  count = var.enable_credential_rotation ? 1 : 0
2738
- name = "\${var.name}-aurora-credentials-rotation"
2697
+ name = "\${local.cluster_name}-credentials-rotation"
2739
2698
 
2740
2699
  capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
2741
2700
 
@@ -2749,7 +2708,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
2749
2708
  SecretId = aws_secretsmanager_secret.credentials.arn
2750
2709
  HostedRotationLambda = {
2751
2710
  RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
2752
- RotationLambdaName = "\${var.name}-aurora-credentials-rotation"
2711
+ RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
2753
2712
  VpcSecurityGroupIds = aws_security_group.rotation[0].id
2754
2713
  VpcSubnetIds = join(",", var.lambda_subnet_ids)
2755
2714
  }
@@ -2792,27 +2751,6 @@ resource "aws_iam_role" "proxy" {
2792
2751
  })
2793
2752
  }
2794
2753
 
2795
- resource "aws_iam_role_policy" "proxy_secret_access" {
2796
- count = var.enable_rds_proxy ? 1 : 0
2797
- role = aws_iam_role.proxy[0].name
2798
-
2799
- policy = jsonencode({
2800
- Version = "2012-10-17"
2801
- Statement = [
2802
- {
2803
- Effect = "Allow"
2804
- Action = ["secretsmanager:GetSecretValue"]
2805
- Resource = [aws_secretsmanager_secret.credentials.arn]
2806
- },
2807
- {
2808
- Effect = "Allow"
2809
- Action = ["kms:Decrypt"]
2810
- Resource = [aws_kms_key.database.arn]
2811
- }
2812
- ]
2813
- })
2814
- }
2815
-
2816
2754
  resource "aws_security_group" "proxy" {
2817
2755
  #checkov:skip=CKV2_AWS_5:Security group is attached to aws_db_proxy.aurora; Checkov cannot resolve count-conditional cross-resource references
2818
2756
  count = var.enable_rds_proxy ? 1 : 0
@@ -2829,24 +2767,13 @@ resource "aws_security_group" "proxy" {
2829
2767
  resource "aws_db_proxy" "aurora" {
2830
2768
  count = var.enable_rds_proxy ? 1 : 0
2831
2769
 
2832
- name = "\${var.name}-proxy"
2770
+ name = "\${var.name}-proxy-\${random_string.suffix.result}"
2833
2771
  default_auth_scheme = "IAM_AUTH"
2834
2772
  engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
2835
2773
  role_arn = aws_iam_role.proxy[0].arn
2836
2774
  vpc_subnet_ids = var.subnet_ids
2837
2775
  vpc_security_group_ids = [aws_security_group.proxy[0].id]
2838
2776
  require_tls = true
2839
-
2840
- auth {
2841
- auth_scheme = "SECRETS"
2842
- iam_auth = "REQUIRED"
2843
- secret_arn = aws_secretsmanager_secret.credentials.arn
2844
- }
2845
-
2846
- depends_on = [
2847
- aws_iam_role_policy.proxy_secret_access,
2848
- aws_secretsmanager_secret_version.credentials,
2849
- ]
2850
2777
  }
2851
2778
 
2852
2779
  resource "aws_db_proxy_default_target_group" "default" {
@@ -2878,9 +2805,9 @@ resource "null_resource" "proxy_target_ready" {
2878
2805
  deadline=$((start_time + 600))
2879
2806
  while true; do
2880
2807
  target_state=$(aws rds describe-db-proxy-targets \\
2881
- --region \${data.aws_region.current.region} \\
2882
- --db-proxy-name \${self.triggers.db_proxy_name} \\
2883
- --target-group-name \${self.triggers.target_group_name} \\
2808
+ --region "$AWS_REGION" \\
2809
+ --db-proxy-name "$DB_PROXY_NAME" \\
2810
+ --target-group-name "$TARGET_GROUP_NAME" \\
2884
2811
  --query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
2885
2812
  --output text)
2886
2813
 
@@ -2890,13 +2817,19 @@ resource "null_resource" "proxy_target_ready" {
2890
2817
 
2891
2818
  current_time=$(date +%s)
2892
2819
  if [ "$current_time" -ge "$deadline" ]; then
2893
- echo "RDS Proxy target \${self.triggers.db_cluster_identifier} did not become AVAILABLE within 10 minutes. Last state: $target_state"
2820
+ echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
2894
2821
  exit 1
2895
2822
  fi
2896
2823
 
2897
2824
  sleep 10
2898
2825
  done
2899
2826
  EOT
2827
+ environment = {
2828
+ AWS_REGION = data.aws_region.current.region
2829
+ DB_PROXY_NAME = self.triggers.db_proxy_name
2830
+ TARGET_GROUP_NAME = self.triggers.target_group_name
2831
+ DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
2832
+ }
2900
2833
  }
2901
2834
 
2902
2835
  depends_on = [
@@ -2975,7 +2908,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
2975
2908
  resource "aws_backup_vault" "database" {
2976
2909
  count = var.enable_backup ? 1 : 0
2977
2910
 
2978
- name = "\${var.name}-aurora-backup"
2911
+ name = "\${local.cluster_name}-backup"
2979
2912
  kms_key_arn = aws_kms_key.database.arn
2980
2913
  tags = var.tags
2981
2914
  }
@@ -2983,7 +2916,7 @@ resource "aws_backup_vault" "database" {
2983
2916
  resource "aws_backup_plan" "database" {
2984
2917
  count = var.enable_backup ? 1 : 0
2985
2918
 
2986
- name = "\${var.name}-aurora-backup"
2919
+ name = "\${local.cluster_name}-backup"
2987
2920
 
2988
2921
  rule {
2989
2922
  rule_name = "daily-backup"
@@ -3023,6 +2956,11 @@ output "proxy_resource_id" {
3023
2956
  value = var.enable_rds_proxy ? split(":", aws_db_proxy.aurora[0].arn)[6] : null
3024
2957
  }
3025
2958
 
2959
+ output "connect_resource_id" {
2960
+ description = "Resource ID to use in IAM rds-db:connect policies for the application database user. Resolves to the RDS Proxy resource ID when the proxy is enabled (the default), or the Aurora cluster resource ID when it is disabled — connecting through the proxy and connecting directly to the cluster are different IAM permission boundaries."
2961
+ value = var.enable_rds_proxy ? split(":", aws_db_proxy.aurora[0].arn)[6] : aws_rds_cluster.database.cluster_resource_id
2962
+ }
2963
+
3026
2964
  output "cluster_endpoint" {
3027
2965
  description = "Writer endpoint of the Aurora cluster or proxy."
3028
2966
  value = var.enable_rds_proxy ? aws_db_proxy.aurora[0].endpoint : aws_rds_cluster.database.endpoint
@@ -3097,19 +3035,19 @@ exports[`ts#rdb generator > should generate terraform modules with MySQL engine
3097
3035
  required_providers {
3098
3036
  archive = {
3099
3037
  source = "hashicorp/archive"
3100
- version = "~> 2.5"
3038
+ version = "2.8.0"
3101
3039
  }
3102
3040
  aws = {
3103
3041
  source = "hashicorp/aws"
3104
- version = "~> 6.33"
3042
+ version = "6.57.1"
3105
3043
  }
3106
3044
  null = {
3107
3045
  source = "hashicorp/null"
3108
- version = ">= 3.0"
3046
+ version = "3.3.0"
3109
3047
  }
3110
3048
  random = {
3111
3049
  source = "hashicorp/random"
3112
- version = ">= 3.0"
3050
+ version = "3.9.0"
3113
3051
  }
3114
3052
  }
3115
3053
  }
@@ -3213,12 +3151,13 @@ variable "tags" {
3213
3151
  default = {}
3214
3152
  }
3215
3153
 
3216
- variable "docker_image_tag" {
3154
+ variable "migration_docker_image_tag" {
3217
3155
  description = "Docker image tag for the migration handler. Defaults to the tag built by the Nx docker target."
3218
3156
  type = string
3219
3157
  default = "proj-db-migration:latest"
3220
3158
  }
3221
3159
 
3160
+
3222
3161
  variable "asset_bucket_name" {
3223
3162
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
3224
3163
  type = string
@@ -3234,10 +3173,12 @@ resource "random_string" "suffix" {
3234
3173
  }
3235
3174
 
3236
3175
  locals {
3237
- create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
3238
- migration_function_name = "db-migration-\${random_string.suffix.result}"
3176
+ config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
3177
+ runtime_config_key = local.config.runtimeConfigKey
3178
+ create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
3179
+ migration_function_name = "db-migration-\${random_string.suffix.result}"
3239
3180
  create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
3240
- database_runtime_user = "db_\${random_string.suffix.result}"
3181
+ database_runtime_user = "db_\${random_string.suffix.result}"
3241
3182
  }
3242
3183
 
3243
3184
  module "aurora" {
@@ -3276,10 +3217,17 @@ resource "aws_iam_role_policy" "proxy_db_user_connect" {
3276
3217
  Statement = [
3277
3218
  {
3278
3219
  Effect = "Allow"
3279
- Action = ["rds-db:connect"]
3280
- Resource = [
3281
- "arn:aws:rds-db:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:dbuser:\${module.aurora.cluster_resource_id}/\${local.database_runtime_user}"
3220
+ Action = [
3221
+ "secretsmanager:GetSecretValue"
3222
+ ]
3223
+ Resource = [module.aurora.secret_arn]
3224
+ },
3225
+ {
3226
+ Effect = "Allow"
3227
+ Action = [
3228
+ "kms:Decrypt"
3282
3229
  ]
3230
+ Resource = [module.aurora.kms_key_arn]
3283
3231
  }
3284
3232
  ]
3285
3233
  })
@@ -3303,7 +3251,7 @@ module "add_rdb_to_runtime_config" {
3303
3251
  source = "../../../core/runtime-config/entry"
3304
3252
 
3305
3253
  namespace = "database"
3306
- key = "Db"
3254
+ key = local.runtime_config_key
3307
3255
  value = {
3308
3256
  hostname = module.aurora.cluster_endpoint
3309
3257
  port = module.aurora.cluster_port
@@ -3316,9 +3264,8 @@ module "add_rdb_to_runtime_config" {
3316
3264
 
3317
3265
  resource "aws_ecr_repository" "migration_handler" {
3318
3266
  #checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
3319
- #checkov:skip=CKV_AWS_51:Mutable tags are intentional; the migration handler is always pushed as latest and redeployment is gated on docker_digest changes in null_resource.docker_publish
3320
3267
  name = "db-migration-\${random_string.suffix.result}"
3321
- image_tag_mutability = "MUTABLE"
3268
+ image_tag_mutability = "IMMUTABLE"
3322
3269
  force_delete = true
3323
3270
 
3324
3271
  image_scanning_configuration {
@@ -3366,22 +3313,34 @@ resource "aws_ecr_repository_policy" "migration_handler" {
3366
3313
  }
3367
3314
 
3368
3315
  data "external" "docker_digest" {
3369
- program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.docker_image_tag} --format '{{.Id}}')'\\"}' "]
3316
+ program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.migration_docker_image_tag} --format '{{.Id}}')'\\"}' "]
3317
+ }
3318
+
3319
+ locals {
3320
+ # Content-based, immutable image tag derived from the local image digest
3321
+ image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
3370
3322
  }
3371
3323
 
3372
3324
  resource "null_resource" "docker_publish" {
3373
3325
  triggers = {
3374
3326
  docker_digest = data.external.docker_digest.result.digest
3375
3327
  repository_url = aws_ecr_repository.migration_handler.repository_url
3376
- docker_image_tag = var.docker_image_tag
3328
+ migration_docker_image_tag = var.migration_docker_image_tag
3329
+ image_tag = local.image_tag
3377
3330
  }
3378
3331
 
3379
3332
  provisioner "local-exec" {
3380
3333
  command = <<-EOT
3381
- aws ecr get-login-password --region \${data.aws_region.current.region} | docker login --username AWS --password-stdin \${self.triggers.repository_url}
3382
- docker tag \${self.triggers.docker_image_tag} \${self.triggers.repository_url}:latest
3383
- docker push \${self.triggers.repository_url}:latest
3334
+ aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
3335
+ docker tag "$MIGRATION_DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
3336
+ docker push "$REPOSITORY_URL:$IMAGE_TAG"
3384
3337
  EOT
3338
+ environment = {
3339
+ AWS_REGION = data.aws_region.current.region
3340
+ REPOSITORY_URL = self.triggers.repository_url
3341
+ MIGRATION_DOCKER_IMAGE_TAG = self.triggers.migration_docker_image_tag
3342
+ IMAGE_TAG = self.triggers.image_tag
3343
+ }
3385
3344
  }
3386
3345
 
3387
3346
  depends_on = [aws_ecr_repository_policy.migration_handler]
@@ -3644,10 +3603,10 @@ resource "null_resource" "create_db_user_trigger" {
3644
3603
  command = <<-EOT
3645
3604
  output_file=$(mktemp)
3646
3605
  response=$(aws lambda invoke \\
3647
- --region \${data.aws_region.current.region} \\
3648
- --function-name \${self.triggers.function_name} \\
3606
+ --region "$AWS_REGION" \\
3607
+ --function-name "$FUNCTION_NAME" \\
3649
3608
  --cli-binary-format raw-in-base64-out \\
3650
- --payload '{"RequestType":"Create","PhysicalResourceId":"db-user:\${self.triggers.db_user}"}' \\
3609
+ --payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
3651
3610
  "$output_file")
3652
3611
  cat "$output_file"
3653
3612
  echo "$response"
@@ -3657,6 +3616,11 @@ resource "null_resource" "create_db_user_trigger" {
3657
3616
  fi
3658
3617
  rm -f "$output_file"
3659
3618
  EOT
3619
+ environment = {
3620
+ AWS_REGION = data.aws_region.current.region
3621
+ FUNCTION_NAME = self.triggers.function_name
3622
+ DB_USER = self.triggers.db_user
3623
+ }
3660
3624
  }
3661
3625
 
3662
3626
  depends_on = [aws_lambda_function.create_db_user, module.aurora]
@@ -3670,7 +3634,7 @@ resource "aws_lambda_function" "migration_handler" {
3670
3634
  package_type = "Image"
3671
3635
  function_name = local.migration_function_name
3672
3636
  role = aws_iam_role.migration_handler.arn
3673
- image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:latest"
3637
+ image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
3674
3638
  memory_size = 1024
3675
3639
  timeout = 300
3676
3640
  architectures = ["arm64"]
@@ -3715,8 +3679,8 @@ resource "null_resource" "migration_trigger" {
3715
3679
  command = <<-EOT
3716
3680
  output_file=$(mktemp)
3717
3681
  response=$(aws lambda invoke \\
3718
- --region \${data.aws_region.current.region} \\
3719
- --function-name \${self.triggers.function_name} \\
3682
+ --region "$AWS_REGION" \\
3683
+ --function-name "$FUNCTION_NAME" \\
3720
3684
  --cli-binary-format raw-in-base64-out \\
3721
3685
  "$output_file")
3722
3686
  cat "$output_file"
@@ -3727,6 +3691,10 @@ resource "null_resource" "migration_trigger" {
3727
3691
  fi
3728
3692
  rm -f "$output_file"
3729
3693
  EOT
3694
+ environment = {
3695
+ AWS_REGION = data.aws_region.current.region
3696
+ FUNCTION_NAME = self.triggers.function_name
3697
+ }
3730
3698
  }
3731
3699
 
3732
3700
  depends_on = [
@@ -3757,6 +3725,11 @@ output "proxy_resource_id" {
3757
3725
  value = module.aurora.proxy_resource_id
3758
3726
  }
3759
3727
 
3728
+ output "connect_resource_id" {
3729
+ description = "Resource ID to use in IAM rds-db:connect policies for the application database user. Resolves to the RDS Proxy resource ID when the proxy is enabled (the default), or the Aurora cluster resource ID when it is disabled — connecting through the proxy and connecting directly to the cluster are different IAM permission boundaries."
3730
+ value = module.aurora.connect_resource_id
3731
+ }
3732
+
3760
3733
  output "kms_key_arn" {
3761
3734
  description = "ARN of the KMS key protecting Aurora and the admin credentials secret, used to grant decrypt access alongside secret_arn."
3762
3735
  value = module.aurora.kms_key_arn
@@ -3791,7 +3764,6 @@ output "database_runtime_user" {
3791
3764
  description = "Application database user created for IAM-authenticated access."
3792
3765
  value = local.database_runtime_user
3793
3766
  }
3794
-
3795
3767
  "
3796
3768
  `;
3797
3769
 
@@ -3817,139 +3789,6 @@ datasource db {
3817
3789
  "
3818
3790
  `;
3819
3791
 
3820
- exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/pull-image.ts 1`] = `
3821
- "import { spawnSync } from 'child_process';
3822
-
3823
- const ENGINE = 'docker';
3824
- const image = process.argv[2];
3825
-
3826
- const inspect = spawnSync(ENGINE, ['image', 'inspect', image], {
3827
- stdio: 'ignore',
3828
- });
3829
-
3830
- if (inspect.status !== 0) {
3831
- const pull = spawnSync(ENGINE, ['pull', image], { stdio: 'inherit' });
3832
- if (pull.status !== 0) {
3833
- process.exit(pull.status ?? 1);
3834
- }
3835
- }
3836
- "
3837
- `;
3838
-
3839
- exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/start-container.ts 1`] = `
3840
- "import { spawn, spawnSync } from 'child_process';
3841
-
3842
- const ENGINE = 'docker';
3843
-
3844
- const [containerName, image, hostPort, dbName, dbUser, dbPassword] =
3845
- process.argv.slice(2);
3846
-
3847
- const containerExists = (): boolean =>
3848
- spawnSync(ENGINE, ['container', 'inspect', containerName], {
3849
- stdio: 'ignore',
3850
- }).status === 0;
3851
-
3852
- const isRunning = (): boolean => {
3853
- const result = spawnSync(
3854
- ENGINE,
3855
- ['container', 'inspect', '-f', '{{.State.Running}}', containerName],
3856
- { encoding: 'utf-8' },
3857
- );
3858
- return result.status === 0 && result.stdout.trim() === 'true';
3859
- };
3860
-
3861
- if (containerExists()) {
3862
- if (!isRunning()) {
3863
- const start = spawnSync(ENGINE, ['start', containerName], {
3864
- stdio: 'inherit',
3865
- });
3866
- if (start.status !== 0) process.exit(start.status ?? 1);
3867
- }
3868
- } else {
3869
- const runArgs = (
3870
- \`run --rm --name \${containerName}\` +
3871
- \` -e POSTGRES_DB=\${dbName}\` +
3872
- \` -e POSTGRES_USER=\${dbUser}\` +
3873
- \` -e POSTGRES_PASSWORD=\${dbPassword}\` +
3874
- \` -e PGDATA=/var/lib/postgresql/17/docker\` +
3875
- \` -p \${hostPort}:5432\` +
3876
- \` -v \${containerName}-data:/var/lib/postgresql\` +
3877
- \` -d \${image}\`
3878
- ).split(' ');
3879
- const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
3880
- if (create.status !== 0) process.exit(create.status ?? 1);
3881
- }
3882
-
3883
- const logs = spawn(ENGINE, ['logs', '-f', containerName], {
3884
- stdio: ['ignore', 'inherit', 'inherit'],
3885
- });
3886
-
3887
- let exiting = false;
3888
-
3889
- const cleanup = () => {
3890
- if (exiting) return;
3891
- exiting = true;
3892
- spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
3893
- logs.kill();
3894
- process.exit(0);
3895
- };
3896
-
3897
- process.on('SIGTERM', cleanup);
3898
- process.on('SIGINT', cleanup);
3899
- process.on('SIGHUP', cleanup);
3900
-
3901
- logs.on('exit', (code) => {
3902
- if (!exiting) process.exit(code ?? 0);
3903
- });
3904
- "
3905
- `;
3906
-
3907
- exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/wait-for-db.ts 1`] = `
3908
- "import { Client } from 'pg';
3909
-
3910
- const noop = () => undefined;
3911
-
3912
- const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
3913
- const timeoutAt = Date.now() + 60000;
3914
-
3915
- while (Date.now() < timeoutAt) {
3916
- const client = new Client({
3917
- host: 'localhost',
3918
- port: parseInt(portArg),
3919
- user: userArg,
3920
- password: passwordArg,
3921
- database: dbArg,
3922
- connectionTimeoutMillis: 500,
3923
- });
3924
- client.on('error', noop);
3925
- try {
3926
- await client.connect();
3927
- await client.end();
3928
- console.log('Database is ready.');
3929
- process.exit(0);
3930
- } catch {
3931
- console.log('Database is not ready.');
3932
- await client.end().catch(noop);
3933
- }
3934
- await new Promise((r) => setTimeout(r, 200));
3935
- }
3936
-
3937
- throw new Error(\`Timed out waiting for postgres on port \${portArg}\`);
3938
- "
3939
- `;
3940
-
3941
- exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/constants.ts 1`] = `
3942
- "export const DB_PACKAGE_NAME = 'Db';
3943
-
3944
- // Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
3945
- export const LOCAL_DB_PORT = 5432;
3946
- export const LOCAL_DB_HOST = 'localhost';
3947
- export const LOCAL_DB_NAME = 'database_name';
3948
- export const LOCAL_DB_USER = 'dbadmin';
3949
- export const LOCAL_DB_PASSWORD = 'password';
3950
- "
3951
- `;
3952
-
3953
3792
  exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/create-db-user-handler.ts 1`] = `
3954
3793
  "import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
3955
3794
  import { randomBytes } from 'node:crypto';
@@ -3999,14 +3838,12 @@ const ensureDatabaseUser = async (dbUser: string): Promise<void> => {
3999
3838
 
4000
3839
  await client.query(
4001
3840
  \`ALTER ROLE \${quotedDbUser} WITH LOGIN;
4002
- GRANT ALL PRIVILEGES ON DATABASE \${quotedDbName} TO \${quotedDbUser};
4003
- GRANT USAGE, CREATE ON SCHEMA public TO \${quotedDbUser};
4004
- GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \${quotedDbUser};
4005
- GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \${quotedDbUser};
4006
- GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO \${quotedDbUser};
4007
- ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO \${quotedDbUser};
4008
- ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO \${quotedDbUser};
4009
- ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON FUNCTIONS TO \${quotedDbUser};
3841
+ GRANT CONNECT ON DATABASE \${quotedDbName} TO \${quotedDbUser};
3842
+ GRANT USAGE ON SCHEMA public TO \${quotedDbUser};
3843
+ GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \${quotedDbUser};
3844
+ GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO \${quotedDbUser};
3845
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \${quotedDbUser};
3846
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO \${quotedDbUser};
4010
3847
  GRANT rds_iam TO \${quotedDbUser};\`,
4011
3848
  );
4012
3849
 
@@ -4041,43 +3878,32 @@ export const handler = async (
4041
3878
  `;
4042
3879
 
4043
3880
  exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/index.ts 1`] = `
4044
- "export { DB_PACKAGE_NAME } from './constants.js';
4045
- export { getPrisma } from './prisma.js';
3881
+ "export { getPrisma } from './prisma.js';
4046
3882
  "
4047
3883
  `;
4048
3884
 
4049
3885
  exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/migration-handler.ts 1`] = `
4050
3886
  "import { execFile } from 'node:child_process';
3887
+ import { join } from 'node:path';
4051
3888
  import { promisify } from 'node:util';
4052
- import { Signer } from '@aws-sdk/rds-signer';
4053
- import { withConnectionRetry } from './utils.js';
3889
+ import { getDatabaseSecret, withConnectionRetry } from './utils.js';
4054
3890
 
4055
3891
  const buildDatabaseUrl = async (): Promise<string> => {
4056
- const hostname = process.env.HOSTNAME!;
4057
- const port = process.env.PORT!;
4058
- const database = process.env.DATABASE!;
4059
- const dbUser = process.env.DBUSER!;
4060
- const region = process.env.AWS_REGION!;
4061
-
4062
- const iamAuthToken = await new Signer({
4063
- hostname,
4064
- port: Number(port),
4065
- region,
4066
- username: dbUser,
4067
- }).getAuthToken();
3892
+ const { host, port, dbname, username, password } = await getDatabaseSecret();
4068
3893
 
4069
3894
  return (
4070
- \`postgresql://\${encodeURIComponent(dbUser)}\` +
4071
- \`:\${encodeURIComponent(iamAuthToken)}\` +
4072
- \`@\${hostname}:\${port}/\${database}\` +
4073
- \`?sslaccept=strict\` // \`sslaccept\` is the correct parameter here for postgresql. The Prisma CLI Rust engine does not use the standard libpq \`sslmode\` option.
3895
+ \`postgresql://\${encodeURIComponent(username)}\` +
3896
+ \`:\${encodeURIComponent(password)}\` +
3897
+ \`@\${host}:\${port}/\${dbname}\` +
3898
+ \`?sslaccept=strict\`
4074
3899
  );
4075
3900
  };
4076
3901
 
4077
3902
  export const handler = async () => {
4078
3903
  await withConnectionRetry(async () => {
4079
3904
  const databaseUrl = await buildDatabaseUrl();
4080
- await promisify(execFile)('npx', ['prisma', 'migrate', 'deploy'], {
3905
+ const prisma = join(__dirname, 'node_modules', '.bin', 'prisma');
3906
+ await promisify(execFile)(prisma, ['migrate', 'deploy'], {
4081
3907
  cwd: __dirname,
4082
3908
  env: {
4083
3909
  ...process.env,
@@ -4094,16 +3920,19 @@ exports[`ts#rdb generator > should generate the aurora shared construct > packag
4094
3920
  import { Signer } from '@aws-sdk/rds-signer';
4095
3921
  import { Prisma, PrismaClient } from '../generated/prisma/client.js';
4096
3922
  import { Pool } from 'pg';
4097
- import {
4098
- DB_PACKAGE_NAME,
4099
- LOCAL_DB_HOST,
4100
- LOCAL_DB_NAME,
4101
- LOCAL_DB_PASSWORD,
4102
- LOCAL_DB_PORT,
4103
- LOCAL_DB_USER,
4104
- } from './constants.js';
3923
+ import { readFileSync } from 'fs';
3924
+ import { join, dirname } from 'path';
3925
+ import { fileURLToPath } from 'url';
4105
3926
  import { getDatabaseConfig } from './utils.js';
4106
3927
 
3928
+ // Generated: must match runtimeConfigKey in config.json
3929
+ const runtimeConfigKey = 'Db';
3930
+
3931
+ const __dirname = dirname(fileURLToPath(import.meta.url));
3932
+ // config.json is only present in local dev (not included in the deployed bundle); guard with LOCAL_DEV check
3933
+ const localDev = () =>
3934
+ JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8')).localDev;
3935
+
4107
3936
  let prismaClient: PrismaClient<Prisma.LogLevel> | undefined;
4108
3937
 
4109
3938
  export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
@@ -4111,14 +3940,15 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
4111
3940
  ): Promise<PrismaClient<LogOpts>> => {
4112
3941
  if (prismaClient) return prismaClient;
4113
3942
 
4114
- if (process.env.SERVE_LOCAL === 'true') {
3943
+ if (process.env.LOCAL_DEV === 'true') {
3944
+ const { host, port, dbName, dbUser, dbPassword } = localDev();
4115
3945
  const adapter = new PrismaPg(
4116
3946
  new Pool({
4117
- host: LOCAL_DB_HOST,
4118
- port: LOCAL_DB_PORT,
4119
- database: LOCAL_DB_NAME,
4120
- user: LOCAL_DB_USER,
4121
- password: LOCAL_DB_PASSWORD,
3947
+ host,
3948
+ port,
3949
+ database: dbName,
3950
+ user: dbUser,
3951
+ password: dbPassword,
4122
3952
  allowExitOnIdle: true,
4123
3953
  }),
4124
3954
  );
@@ -4130,7 +3960,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
4130
3960
  }
4131
3961
 
4132
3962
  const { hostname, port, database, dbUser, region } =
4133
- await getDatabaseConfig(DB_PACKAGE_NAME);
3963
+ await getDatabaseConfig(runtimeConfigKey);
4134
3964
  const adapter = new PrismaPg(
4135
3965
  new Pool({
4136
3966
  host: hostname,
@@ -4260,6 +4090,9 @@ const transientErrorPatterns = [
4260
4090
  'ECONNREFUSED',
4261
4091
  'ENOTFOUND',
4262
4092
  'P1000', // Prisma: authentication failed
4093
+ 'P1001', // Prisma: can't reach database server
4094
+ 'P1002', // Prisma: database server reached but timed out
4095
+ 'P1010', // Prisma: user denied access (IAM auth grant not yet propagated)
4263
4096
  'ER_ACCESS_DENIED_ERROR', // MySQL: access denied
4264
4097
  ];
4265
4098
 
@@ -4320,14 +4153,10 @@ import { CustomResource } from 'aws-cdk-lib';
4320
4153
  import { IConnectable, IVpc, Port, SubnetType } from 'aws-cdk-lib/aws-ec2';
4321
4154
  import { IGrantable, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
4322
4155
  import { Key } from 'aws-cdk-lib/aws-kms';
4323
- import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
4324
4156
  import {
4325
4157
  Architecture,
4326
- Code,
4327
- DockerImageCode,
4328
- DockerImageFunction,
4329
4158
  Function,
4330
- Runtime,
4159
+ FunctionOptions,
4331
4160
  Tracing,
4332
4161
  } from 'aws-cdk-lib/aws-lambda';
4333
4162
  import {
@@ -4443,16 +4272,6 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
4443
4272
  */
4444
4273
  readonly runtimeConfigKey: string;
4445
4274
 
4446
- /**
4447
- * Migration bundle used to create a migration handler Lambda.
4448
- */
4449
- readonly migrationBundleDir: string;
4450
-
4451
- /**
4452
- * Bundle used to create or reconcile the application database user.
4453
- */
4454
- readonly createDbUserBundleDir: string;
4455
-
4456
4275
  /**
4457
4276
  * Writer instance for the Aurora cluster.
4458
4277
  */
@@ -4492,6 +4311,25 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
4492
4311
  * @default true
4493
4312
  */
4494
4313
  readonly enableKeyRotation?: boolean;
4314
+
4315
+ /**
4316
+ * Whether to export Aurora engine logs to CloudWatch Logs.
4317
+ * See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
4318
+ *
4319
+ * PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables
4320
+ * Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL).
4321
+ * Neither logs statement parameter values, to avoid leaking PII into log data.
4322
+ *
4323
+ * @default true
4324
+ */
4325
+ readonly enableCloudwatchLogs?: boolean;
4326
+
4327
+ /**
4328
+ * Whether to enable Performance Insights on the Aurora writer instance.
4329
+ *
4330
+ * @default true
4331
+ */
4332
+ readonly enablePerformanceInsights?: boolean;
4495
4333
  }
4496
4334
 
4497
4335
  /**
@@ -4512,8 +4350,6 @@ export abstract class AuroraDatabase extends Construct {
4512
4350
  adminUser,
4513
4351
  databaseName,
4514
4352
  runtimeConfigKey,
4515
- migrationBundleDir,
4516
- createDbUserBundleDir,
4517
4353
  vpcSubnets,
4518
4354
  writer,
4519
4355
  enableRdsProxy = true,
@@ -4521,6 +4357,8 @@ export abstract class AuroraDatabase extends Construct {
4521
4357
  deletionProtection = true,
4522
4358
  removalPolicy = RemovalPolicy.RETAIN,
4523
4359
  enableKeyRotation = true,
4360
+ enableCloudwatchLogs = true,
4361
+ enablePerformanceInsights = true,
4524
4362
  engine,
4525
4363
  engineVersion,
4526
4364
  ...clusterProps
@@ -4536,12 +4374,35 @@ export abstract class AuroraDatabase extends Construct {
4536
4374
  vpc,
4537
4375
  vpcSubnets,
4538
4376
  engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
4539
- writer: writer ?? ClusterInstance.serverlessV2('writer'),
4377
+ writer:
4378
+ writer ??
4379
+ ClusterInstance.serverlessV2('writer', {
4380
+ enablePerformanceInsights,
4381
+ performanceInsightEncryptionKey: enablePerformanceInsights
4382
+ ? key
4383
+ : undefined,
4384
+ }),
4540
4385
  credentials: Credentials.fromGeneratedSecret(adminUser, {
4541
4386
  encryptionKey: key,
4542
4387
  }),
4543
4388
  iamAuthentication: true,
4544
4389
  monitoringInterval: Duration.seconds(5),
4390
+ cloudwatchLogsExports: enableCloudwatchLogs
4391
+ ? engine.type === 'mysql'
4392
+ ? ['audit', 'error']
4393
+ : ['postgresql']
4394
+ : undefined,
4395
+ parameters: enableCloudwatchLogs
4396
+ ? engine.type === 'mysql'
4397
+ ? {
4398
+ server_audit_logging: '1',
4399
+ server_audit_events: 'CONNECT,QUERY_DDL',
4400
+ }
4401
+ : // Only safe statement-at-a-time; a multi-statement batch mixing
4402
+ // DDL with DML (e.g. one \`psql -c "a;b;c"\` call) logs the whole
4403
+ // raw text verbatim, including any literal DML values.
4404
+ { log_statement: 'ddl' }
4405
+ : undefined,
4545
4406
  defaultDatabaseName: databaseName,
4546
4407
  storageEncrypted: true,
4547
4408
  storageEncryptionKey: key,
@@ -4577,23 +4438,23 @@ export abstract class AuroraDatabase extends Construct {
4577
4438
  this.proxy?.endpoint ?? this.cluster.clusterEndpoint.hostname;
4578
4439
  const databasePort = this.cluster.clusterEndpoint.port;
4579
4440
 
4580
- const createDbUserHandler = new Function(this, 'CreateDbUserHandler', {
4581
- code: Code.fromAsset(createDbUserBundleDir),
4582
- handler: 'index.handler',
4583
- runtime: Runtime.NODEJS_LATEST,
4441
+ const commonProps: FunctionOptions = {
4442
+ vpc,
4584
4443
  timeout: Duration.minutes(5),
4585
4444
  tracing: Tracing.ACTIVE,
4586
- vpc,
4445
+ architecture: Architecture.ARM_64,
4446
+ };
4447
+
4448
+ const createDbUserHandler = this.createDbUserHandler({
4449
+ ...commonProps,
4587
4450
  vpcSubnets: {
4588
4451
  subnetType: SubnetType.PRIVATE_WITH_EGRESS,
4589
4452
  },
4590
- environment: {
4591
- DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
4592
- NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
4593
- },
4594
- architecture: Architecture.ARM_64,
4595
4453
  });
4596
-
4454
+ createDbUserHandler.addEnvironment(
4455
+ 'DATABASE_SECRET_ARN',
4456
+ this.cluster.secret!.secretArn,
4457
+ );
4597
4458
  this.cluster.connections.allowDefaultPortFrom(
4598
4459
  createDbUserHandler,
4599
4460
  'Allow the create-db-user handler to connect to the database',
@@ -4630,40 +4491,21 @@ export abstract class AuroraDatabase extends Construct {
4630
4491
  region: Stack.of(this).region,
4631
4492
  });
4632
4493
 
4633
- const migrationHandler = new DockerImageFunction(this, 'MigrationHandler', {
4634
- code: DockerImageCode.fromImageAsset(migrationBundleDir, {
4635
- platform: Platform.LINUX_ARM64,
4636
- }),
4494
+ const migrationHandler = this.createMigrationHandler({
4495
+ ...commonProps,
4637
4496
  memorySize: 1024,
4638
- timeout: Duration.minutes(5),
4639
- tracing: Tracing.ACTIVE,
4640
- vpc,
4641
- environment:
4642
- engine.type === 'mysql'
4643
- ? {
4644
- DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
4645
- }
4646
- : {
4647
- HOSTNAME: databaseHostname,
4648
- DATABASE: databaseName,
4649
- PORT: databasePort.toString(),
4650
- DBUSER: this.dbUser,
4651
- },
4652
- architecture: Architecture.ARM_64,
4653
4497
  });
4498
+ migrationHandler.addEnvironment(
4499
+ 'DATABASE_SECRET_ARN',
4500
+ this.cluster.secret!.secretArn,
4501
+ );
4502
+ this.cluster.connections.allowDefaultPortFrom(migrationHandler);
4503
+ this.grantSecretRead(migrationHandler);
4654
4504
 
4655
- if (engine.type === 'mysql') {
4656
- this.cluster.connections.allowDefaultPortFrom(migrationHandler);
4657
- this.grantSecretRead(migrationHandler);
4658
- } else {
4659
- this.allowDefaultPortFrom(migrationHandler);
4660
- this.grantConnect(migrationHandler);
4661
- }
4662
-
4663
- const trigger = new Trigger(this, 'MigrationTrigger', {
4505
+ const migrationTrigger = new Trigger(this, 'MigrationTrigger', {
4664
4506
  handler: migrationHandler,
4665
4507
  });
4666
- trigger.node.addDependency(createDbUserResource);
4508
+ migrationTrigger.node.addDependency(createDbUserResource);
4667
4509
 
4668
4510
  new CfnOutput(this, 'ClusterEndpoint', {
4669
4511
  value: this.cluster.clusterEndpoint.hostname,
@@ -4676,6 +4518,18 @@ export abstract class AuroraDatabase extends Construct {
4676
4518
  }
4677
4519
  }
4678
4520
 
4521
+ /**
4522
+ * Creates the Lambda handler used to create or reconcile the application database user.
4523
+ */
4524
+ protected abstract createDbUserHandler(baseProps: FunctionOptions): Function;
4525
+
4526
+ /**
4527
+ * Creates the Lambda handler used to run database migrations.
4528
+ */
4529
+ protected abstract createMigrationHandler(
4530
+ baseProps: FunctionOptions,
4531
+ ): Function;
4532
+
4679
4533
  public allowDefaultPortFrom(other: IConnectable, description?: string): void {
4680
4534
  if (this.proxy) {
4681
4535
  this.proxy.connections.allowFrom(
@@ -4704,8 +4558,17 @@ export abstract class AuroraDatabase extends Construct {
4704
4558
  exports[`ts#rdb generator > should generate the aurora shared construct 2`] = `
4705
4559
  "import * as path from 'path';
4706
4560
  import * as url from 'url';
4561
+ import { readFileSync } from 'fs';
4707
4562
  import { Construct } from 'constructs';
4708
- import { DB_PACKAGE_NAME } from ':proj/db';
4563
+ import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
4564
+ import {
4565
+ Code,
4566
+ DockerImageCode,
4567
+ DockerImageFunction,
4568
+ Function,
4569
+ FunctionOptions,
4570
+ Runtime,
4571
+ } from 'aws-cdk-lib/aws-lambda';
4709
4572
  import {
4710
4573
  AuroraDatabase,
4711
4574
  AuroraDatabaseEngines,
@@ -4713,14 +4576,29 @@ import {
4713
4576
  } from '../../core/rdb/aurora.js';
4714
4577
  import { findWorkspaceRoot } from '../../core/workspace.js';
4715
4578
 
4579
+ const { runtimeConfigKey } = JSON.parse(
4580
+ readFileSync(
4581
+ path.join(
4582
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
4583
+ 'packages/db/config.json',
4584
+ ),
4585
+ 'utf-8',
4586
+ ),
4587
+ ) as { runtimeConfigKey: string };
4588
+
4589
+ const migrationBundleDir = path.join(
4590
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
4591
+ 'dist/packages/db/bundle/migration',
4592
+ );
4593
+
4594
+ const createDbUserBundleDir = path.join(
4595
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
4596
+ 'dist/packages/db/bundle/create-db-user',
4597
+ );
4598
+
4716
4599
  export type DbProps = Omit<
4717
4600
  AuroraDatabaseProps,
4718
- | 'databaseName'
4719
- | 'adminUser'
4720
- | 'createDbUserBundleDir'
4721
- | 'engine'
4722
- | 'runtimeConfigKey'
4723
- | 'migrationBundleDir'
4601
+ 'databaseName' | 'adminUser' | 'runtimeConfigKey' | 'engine'
4724
4602
  >;
4725
4603
 
4726
4604
  /**
@@ -4732,35 +4610,47 @@ export class Db extends AuroraDatabase {
4732
4610
  ...props,
4733
4611
  databaseName: 'database_name',
4734
4612
  adminUser: 'databaseUser',
4735
- runtimeConfigKey: DB_PACKAGE_NAME,
4736
- migrationBundleDir: path.join(
4737
- findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
4738
- 'dist/packages/db/bundle/migration',
4739
- ),
4740
- createDbUserBundleDir: path.join(
4741
- findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
4742
- 'dist/packages/db/bundle/create-db-user',
4743
- ),
4613
+ runtimeConfigKey,
4744
4614
  engine: AuroraDatabaseEngines.postgres({}),
4745
4615
  });
4746
4616
  }
4617
+
4618
+ protected override createDbUserHandler(baseProps: FunctionOptions): Function {
4619
+ return new Function(this, 'CreateDbUserHandler', {
4620
+ ...baseProps,
4621
+ code: Code.fromAsset(createDbUserBundleDir),
4622
+ handler: 'index.handler',
4623
+ runtime: Runtime.NODEJS_LATEST,
4624
+ environment: {
4625
+ NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
4626
+ },
4627
+ });
4628
+ }
4629
+
4630
+ protected override createMigrationHandler(
4631
+ baseProps: FunctionOptions,
4632
+ ): Function {
4633
+ return new DockerImageFunction(this, 'MigrationHandler', {
4634
+ ...baseProps,
4635
+ code: DockerImageCode.fromImageAsset(migrationBundleDir, {
4636
+ platform: Platform.LINUX_ARM64,
4637
+ }),
4638
+ });
4639
+ }
4747
4640
  }
4748
4641
  "
4749
4642
  `;
4750
4643
 
4751
4644
  exports[`ts#rdb generator > should generate the aurora shared construct 3`] = `
4752
4645
  "import { defineConfig } from 'prisma/config';
4646
+ import { readFileSync } from 'fs';
4753
4647
 
4754
4648
  const getDatabaseUrl = async () => {
4755
- if (process.env.SERVE_LOCAL === 'true') {
4756
- const {
4757
- LOCAL_DB_HOST,
4758
- LOCAL_DB_NAME,
4759
- LOCAL_DB_PASSWORD,
4760
- LOCAL_DB_PORT,
4761
- LOCAL_DB_USER,
4762
- } = await import('./src/constants.js');
4763
- return \`postgresql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
4649
+ if (process.env.LOCAL_DEV === 'true') {
4650
+ const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
4651
+ readFileSync('config.json', 'utf-8'),
4652
+ ).localDev;
4653
+ return \`postgresql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
4764
4654
  }
4765
4655
  return process.env.DATABASE_URL;
4766
4656
  };
@@ -4780,9 +4670,27 @@ export default defineConfig({
4780
4670
  exports[`ts#rdb generator > should generate the aurora shared construct 4`] = `
4781
4671
  "FROM public.ecr.aws/lambda/nodejs:24
4782
4672
 
4673
+ # Upgrade npm to a version free of known HIGH/CRITICAL vulnerabilities
4674
+ RUN npm install -g npm@12.0.2
4675
+
4676
+ # Patch OS packages beyond the base image's pinned release, and drop the
4677
+ # runtime's convenience copy of the AWS SDK (the handler bundle inlines its
4678
+ # own dependencies), keeping the image free of known HIGH/CRITICAL
4679
+ # vulnerabilities
4680
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
4681
+ && rm -rf /var/runtime/node_modules/@aws-sdk
4682
+
4783
4683
  WORKDIR \${LAMBDA_TASK_ROOT}
4784
4684
 
4785
- RUN npm install prisma@7.8.0
4685
+ # npm blocks dependency install scripts by default; allow prisma's so its
4686
+ # postinstall downloads the schema-engine binary needed to run migrations.
4687
+ # npm is removed once prisma is installed — the handler runs prisma's own
4688
+ # binary directly, and npm's bundled dependencies would otherwise carry known
4689
+ # HIGH/CRITICAL vulnerabilities into the image.
4690
+ RUN printf 'allow-scripts[]=prisma\\nallow-scripts[]=@prisma/engines\\n' > .npmrc \\
4691
+ && npm install prisma@7.9.1 \\
4692
+ && rm .npmrc \\
4693
+ && npm uninstall -g npm
4786
4694
 
4787
4695
  COPY index.js ./index.js
4788
4696
  COPY prisma ./prisma
@@ -4828,6 +4736,7 @@ exports[`ts#rdb generator > should generate the aurora shared construct 6`] = `
4828
4736
  "export * from './rdb/aurora.js';
4829
4737
  export * from './app.js';
4830
4738
  export * from './checkov.js';
4739
+ export * from './cloudfront.js';
4831
4740
  export * from './runtime-config.js';
4832
4741
  export * from './workspace.js';
4833
4742
  "