@aws/nx-plugin 1.0.0-rc.2 → 1.0.0-rc.21

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 (633) hide show
  1. package/LICENSE-THIRD-PARTY +3552 -4179
  2. package/README.md +8 -8
  3. package/executors.json +9 -0
  4. package/generators.json +100 -1
  5. package/package.json +16 -12
  6. package/sdk/agentcore-gateway.d.ts +6 -0
  7. package/sdk/agentcore-gateway.js +11 -0
  8. package/sdk/agentcore-gateway.js.map +1 -0
  9. package/sdk/license.d.ts +8 -0
  10. package/sdk/license.js +14 -0
  11. package/sdk/license.js.map +1 -0
  12. package/sdk/py.d.ts +6 -6
  13. package/sdk/py.js +7 -7
  14. package/sdk/py.js.map +1 -1
  15. package/sdk/ts.d.ts +18 -14
  16. package/sdk/ts.js +38 -32
  17. package/sdk/ts.js.map +1 -1
  18. package/src/agentcore-gateway/attach-upstream.d.ts +33 -0
  19. package/src/agentcore-gateway/attach-upstream.js +41 -0
  20. package/src/agentcore-gateway/attach-upstream.js.map +1 -0
  21. package/src/agentcore-gateway/files/cedar/policies/README.md +52 -0
  22. package/src/agentcore-gateway/files/cedar/policies/permit-all.cedar +11 -0
  23. package/src/agentcore-gateway/files/project/serve-local.ts.template +134 -0
  24. package/src/agentcore-gateway/gateway-connection/generator.d.ts +21 -0
  25. package/src/agentcore-gateway/gateway-connection/generator.js +102 -0
  26. package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -0
  27. package/src/agentcore-gateway/gateway-connection/schema.d.ts +12 -0
  28. package/src/agentcore-gateway/gateway-connection/schema.json +26 -0
  29. package/src/agentcore-gateway/generator.d.ts +25 -0
  30. package/src/agentcore-gateway/generator.js +129 -0
  31. package/src/agentcore-gateway/generator.js.map +1 -0
  32. package/src/agentcore-gateway/mcp-connection/generator.d.ts +19 -0
  33. package/src/agentcore-gateway/mcp-connection/generator.js +63 -0
  34. package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -0
  35. package/src/agentcore-gateway/mcp-connection/schema.d.ts +12 -0
  36. package/src/agentcore-gateway/mcp-connection/schema.json +26 -0
  37. package/src/agentcore-gateway/schema.d.ts +16 -0
  38. package/src/agentcore-gateway/schema.json +65 -0
  39. package/src/connection/agent-runtime-config.d.ts +1 -1
  40. package/src/connection/agent-runtime-config.js.map +1 -1
  41. package/src/connection/agent-serve-local.d.ts +2 -2
  42. package/src/connection/agent-serve-local.js +1 -1
  43. package/src/connection/agent-serve-local.js.map +1 -1
  44. package/src/connection/generator.d.ts +5 -5
  45. package/src/connection/generator.js +93 -37
  46. package/src/connection/generator.js.map +1 -1
  47. package/src/connection/serve-local.d.ts +1 -1
  48. package/src/connection/serve-local.js +1 -1
  49. package/src/connection/serve-local.js.map +1 -1
  50. package/src/infra/app/__snapshots__/generator.spec.ts.snap +47 -58
  51. package/src/infra/app/generator.d.ts +3 -3
  52. package/src/infra/app/generator.js +19 -17
  53. package/src/infra/app/generator.js.map +1 -1
  54. package/src/license/__snapshots__/config.spec.ts.snap +23 -0
  55. package/src/license/config-types.d.ts +18 -1
  56. package/src/license/config-types.js +4 -0
  57. package/src/license/config-types.js.map +1 -1
  58. package/src/license/config.d.ts +65 -7
  59. package/src/license/config.js +315 -7
  60. package/src/license/config.js.map +1 -1
  61. package/src/license/dependency-check/check.d.ts +16 -0
  62. package/src/license/dependency-check/check.js +111 -0
  63. package/src/license/dependency-check/check.js.map +1 -0
  64. package/src/license/dependency-check/collectors/collector.d.ts +21 -0
  65. package/src/license/dependency-check/collectors/collector.js +76 -0
  66. package/src/license/dependency-check/collectors/collector.js.map +1 -0
  67. package/src/license/dependency-check/collectors/npm-collector.d.ts +10 -0
  68. package/src/license/dependency-check/collectors/npm-collector.js +75 -0
  69. package/src/license/dependency-check/collectors/npm-collector.js.map +1 -0
  70. package/src/license/dependency-check/collectors/python-collector.d.ts +23 -0
  71. package/src/license/dependency-check/collectors/python-collector.js +121 -0
  72. package/src/license/dependency-check/collectors/python-collector.js.map +1 -0
  73. package/src/license/dependency-check/evaluator.d.ts +9 -0
  74. package/src/license/dependency-check/evaluator.js +122 -0
  75. package/src/license/dependency-check/evaluator.js.map +1 -0
  76. package/src/license/dependency-check/executor-schema.json +6 -0
  77. package/src/license/dependency-check/executor.d.ts +9 -0
  78. package/src/license/dependency-check/executor.js +43 -0
  79. package/src/license/dependency-check/executor.js.map +1 -0
  80. package/src/license/dependency-check/pre-approved.d.ts +6 -0
  81. package/src/license/dependency-check/pre-approved.js +1280 -0
  82. package/src/license/dependency-check/pre-approved.js.map +1 -0
  83. package/src/license/dependency-check/types.d.ts +45 -0
  84. package/src/license/dependency-check/types.js +7 -0
  85. package/src/license/dependency-check/types.js.map +1 -0
  86. package/src/license/generator.d.ts +3 -3
  87. package/src/license/generator.js +102 -14
  88. package/src/license/generator.js.map +1 -1
  89. package/src/license/index.d.ts +8 -0
  90. package/src/license/index.js +13 -0
  91. package/src/license/index.js.map +1 -0
  92. package/src/license/known-exceptions.d.ts +6 -0
  93. package/src/license/known-exceptions.js +26 -0
  94. package/src/license/known-exceptions.js.map +1 -0
  95. package/src/license/schema.d.ts +5 -0
  96. package/src/license/schema.json +6 -0
  97. package/src/license/sync/generator.d.ts +2 -2
  98. package/src/license/sync/generator.js +15 -15
  99. package/src/license/sync/generator.js.map +1 -1
  100. package/src/license/sync/project-file-sync.d.ts +3 -3
  101. package/src/license/sync/project-file-sync.js.map +1 -1
  102. package/src/mcp-server/generator-info.d.ts +5 -1
  103. package/src/mcp-server/generator-info.js +7 -7
  104. package/src/mcp-server/generator-info.js.map +1 -1
  105. package/src/mcp-server/guide-pipeline.d.ts +1 -1
  106. package/src/mcp-server/guide-pipeline.js +2 -2
  107. package/src/mcp-server/guide-pipeline.js.map +1 -1
  108. package/src/mcp-server/mdx-ast.js +4 -0
  109. package/src/mcp-server/mdx-ast.js.map +1 -1
  110. package/src/mcp-server/schema-registry.d.ts +9 -3
  111. package/src/mcp-server/schema-registry.js +22 -6
  112. package/src/mcp-server/schema-registry.js.map +1 -1
  113. package/src/mcp-server/server.js +3 -3
  114. package/src/mcp-server/server.js.map +1 -1
  115. package/src/mcp-server/tools/create-workspace-command.d.ts +1 -1
  116. package/src/mcp-server/tools/create-workspace-command.js +4 -4
  117. package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
  118. package/src/mcp-server/tools/general-guidance.d.ts +2 -2
  119. package/src/mcp-server/tools/general-guidance.js +2 -2
  120. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  121. package/src/mcp-server/tools/generator-guide.d.ts +2 -2
  122. package/src/mcp-server/tools/generator-guide.js.map +1 -1
  123. package/src/mcp-server/tools/list-generators.d.ts +2 -2
  124. package/src/mcp-server/tools/list-generators.js +1 -1
  125. package/src/mcp-server/tools/list-generators.js.map +1 -1
  126. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +1 -1
  127. package/src/open-api/ts-client/generator.d.ts +3 -3
  128. package/src/open-api/ts-client/generator.js +2 -2
  129. package/src/open-api/ts-client/generator.js.map +1 -1
  130. package/src/open-api/ts-hooks/generator.d.ts +3 -3
  131. package/src/open-api/ts-hooks/generator.js +2 -2
  132. package/src/open-api/ts-hooks/generator.js.map +1 -1
  133. package/src/open-api/ts-hooks/generator.spec.tsx +14 -14
  134. package/src/open-api/ts-metadata/generator.d.ts +3 -3
  135. package/src/open-api/ts-metadata/generator.js +1 -1
  136. package/src/open-api/ts-metadata/generator.js.map +1 -1
  137. package/src/open-api/utils/codegen-data/languages.d.ts +5 -1
  138. package/src/open-api/utils/codegen-data/languages.js +4 -4
  139. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  140. package/src/open-api/utils/codegen-data.d.ts +6 -2
  141. package/src/open-api/utils/codegen-data.js +6 -6
  142. package/src/open-api/utils/codegen-data.js.map +1 -1
  143. package/src/open-api/utils/normalise.d.ts +5 -1
  144. package/src/open-api/utils/normalise.js +5 -5
  145. package/src/open-api/utils/normalise.js.map +1 -1
  146. package/src/open-api/utils/parse.d.ts +2 -2
  147. package/src/open-api/utils/parse.js +4 -0
  148. package/src/open-api/utils/parse.js.map +1 -1
  149. package/src/open-api/utils/refs.d.ts +1 -1
  150. package/src/preset/__snapshots__/generator.spec.ts.snap +131 -13
  151. package/src/preset/generator.d.ts +4 -4
  152. package/src/preset/generator.js +21 -14
  153. package/src/preset/generator.js.map +1 -1
  154. package/src/preset/schema.d.ts +3 -1
  155. package/src/preset/schema.json +5 -0
  156. package/src/py/agent/__snapshots__/generator.spec.ts.snap +659 -21
  157. package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +201 -0
  158. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +30 -0
  159. package/src/py/agent/a2a-connection/generator.d.ts +3 -3
  160. package/src/py/agent/a2a-connection/generator.js +11 -10
  161. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  162. package/src/py/agent/files/common/agent.py.template +2 -0
  163. package/src/py/agent/files/http/init.py.template +7 -25
  164. package/src/py/agent/files/http/main.py.template +2 -3
  165. package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +197 -0
  166. package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
  167. package/src/py/agent/gateway-connection/generator.d.ts +10 -0
  168. package/src/py/agent/gateway-connection/generator.js +106 -0
  169. package/src/py/agent/gateway-connection/generator.js.map +1 -0
  170. package/src/py/agent/gateway-connection/schema.d.ts +12 -0
  171. package/src/py/agent/gateway-connection/schema.json +26 -0
  172. package/src/py/agent/generator.d.ts +3 -3
  173. package/src/py/agent/generator.js +47 -38
  174. package/src/py/agent/generator.js.map +1 -1
  175. package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +167 -81
  176. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +30 -0
  177. package/src/py/agent/mcp-connection/generator.d.ts +3 -3
  178. package/src/py/agent/mcp-connection/generator.js +11 -81
  179. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  180. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +8 -17
  181. package/src/py/agent/react-connection/generator.d.ts +3 -3
  182. package/src/py/agent/react-connection/generator.js +4 -4
  183. package/src/py/agent/react-connection/generator.js.map +1 -1
  184. package/src/py/agent/react-connection/serve-local.d.ts +2 -2
  185. package/src/py/agent/react-connection/serve-local.js.map +1 -1
  186. package/src/py/api/generator.d.ts +3 -3
  187. package/src/py/api/generator.js.map +1 -1
  188. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1486 -0
  189. package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
  190. package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
  191. package/src/py/dynamodb/agent-connection/generator.js +39 -0
  192. package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
  193. package/src/py/dynamodb/agent-connection/schema.d.ts +14 -0
  194. package/src/py/dynamodb/agent-connection/schema.json +22 -0
  195. package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +23 -0
  196. package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
  197. package/src/py/dynamodb/fast-api-connection/generator.js +37 -0
  198. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
  199. package/src/py/dynamodb/fast-api-connection/schema.d.ts +12 -0
  200. package/src/py/dynamodb/fast-api-connection/schema.json +18 -0
  201. package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
  202. package/src/py/dynamodb/files/__name__/client.py.template +39 -0
  203. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
  204. package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
  205. package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
  206. package/src/py/dynamodb/files/config.json.template +24 -0
  207. package/src/py/dynamodb/generator.d.ts +10 -0
  208. package/src/py/dynamodb/generator.js +106 -0
  209. package/src/py/dynamodb/generator.js.map +1 -0
  210. package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
  211. package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  212. package/src/py/dynamodb/mcp-server-connection/generator.js +39 -0
  213. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
  214. package/src/py/dynamodb/mcp-server-connection/schema.d.ts +14 -0
  215. package/src/py/dynamodb/mcp-server-connection/schema.json +22 -0
  216. package/src/py/dynamodb/schema.d.ts +15 -0
  217. package/src/py/dynamodb/schema.json +70 -0
  218. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +167 -39
  219. package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
  220. package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
  221. package/src/py/fast-api/generator.d.ts +3 -3
  222. package/src/py/fast-api/generator.js +23 -17
  223. package/src/py/fast-api/generator.js.map +1 -1
  224. package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +1 -1
  225. package/src/py/fast-api/react/generator.d.ts +3 -3
  226. package/src/py/fast-api/react/generator.js +2 -2
  227. package/src/py/fast-api/react/generator.js.map +1 -1
  228. package/src/py/fast-api/react/open-api.d.ts +1 -1
  229. package/src/py/fast-api/react/open-api.js +5 -2
  230. package/src/py/fast-api/react/open-api.js.map +1 -1
  231. package/src/py/lambda-function/generator.d.ts +3 -3
  232. package/src/py/lambda-function/generator.js +11 -11
  233. package/src/py/lambda-function/generator.js.map +1 -1
  234. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +83 -13
  235. package/src/py/mcp-server/generator.d.ts +3 -3
  236. package/src/py/mcp-server/generator.js +33 -26
  237. package/src/py/mcp-server/generator.js.map +1 -1
  238. package/src/py/project/generator.d.ts +3 -3
  239. package/src/py/project/generator.js +96 -70
  240. package/src/py/project/generator.js.map +1 -1
  241. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +19 -16
  242. package/src/smithy/project/files/build.Dockerfile.template +1 -0
  243. package/src/smithy/project/files/src/operations/echo.smithy.template +1 -0
  244. package/src/smithy/project/generator.d.ts +3 -3
  245. package/src/smithy/project/generator.js +30 -28
  246. package/src/smithy/project/generator.js.map +1 -1
  247. package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
  248. package/src/smithy/react-connection/generator.d.ts +3 -3
  249. package/src/smithy/react-connection/generator.js +3 -3
  250. package/src/smithy/react-connection/generator.js.map +1 -1
  251. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +14 -34
  252. package/src/smithy/ts/api/generator.d.ts +3 -3
  253. package/src/smithy/ts/api/generator.js +18 -12
  254. package/src/smithy/ts/api/generator.js.map +1 -1
  255. package/src/terraform/project/files/application/src/main.tf.template +6 -1
  256. package/src/terraform/project/generator.d.ts +3 -3
  257. package/src/terraform/project/generator.js +13 -8
  258. package/src/terraform/project/generator.js.map +1 -1
  259. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +163 -18
  260. package/src/trpc/backend/files/src/procedures/echo.ts.template +1 -1
  261. package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
  262. package/src/trpc/backend/generator.d.ts +3 -3
  263. package/src/trpc/backend/generator.js +11 -10
  264. package/src/trpc/backend/generator.js.map +1 -1
  265. package/src/trpc/backend/schema.d.ts +2 -2
  266. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +3 -3
  267. package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
  268. package/src/trpc/react/generator.d.ts +3 -3
  269. package/src/trpc/react/generator.js +5 -5
  270. package/src/trpc/react/generator.js.map +1 -1
  271. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +652 -14
  272. package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +256 -0
  273. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
  274. package/src/ts/agent/a2a-connection/generator.d.ts +3 -3
  275. package/src/ts/agent/a2a-connection/generator.js +8 -8
  276. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  277. package/src/ts/agent/files/common/agent.ts.template +6 -2
  278. package/src/ts/agent/files/http/router.ts.template +1 -1
  279. package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +220 -0
  280. package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
  281. package/src/ts/agent/gateway-connection/generator.d.ts +10 -0
  282. package/src/ts/agent/gateway-connection/generator.js +106 -0
  283. package/src/ts/agent/gateway-connection/generator.js.map +1 -0
  284. package/src/ts/agent/gateway-connection/schema.d.ts +12 -0
  285. package/src/ts/agent/gateway-connection/schema.json +26 -0
  286. package/src/ts/agent/generator.d.ts +3 -3
  287. package/src/ts/agent/generator.js +44 -32
  288. package/src/ts/agent/generator.js.map +1 -1
  289. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +191 -110
  290. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +22 -0
  291. package/src/ts/agent/mcp-connection/generator.d.ts +3 -3
  292. package/src/ts/agent/mcp-connection/generator.js +9 -21
  293. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  294. package/src/ts/agent/react-connection/generator.d.ts +3 -3
  295. package/src/ts/agent/react-connection/generator.js +9 -9
  296. package/src/ts/agent/react-connection/generator.js.map +1 -1
  297. package/src/ts/agent/react-connection/serve-local.d.ts +2 -2
  298. package/src/ts/api/generator.d.ts +3 -3
  299. package/src/ts/api/generator.js +4 -4
  300. package/src/ts/api/generator.js.map +1 -1
  301. package/src/ts/api/schema.d.ts +2 -1
  302. package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +7 -8
  303. package/src/ts/astro-docs/generator.d.ts +3 -3
  304. package/src/ts/astro-docs/generator.js +14 -11
  305. package/src/ts/astro-docs/generator.js.map +1 -1
  306. package/src/ts/docs/generator.d.ts +3 -3
  307. package/src/ts/docs/generator.js.map +1 -1
  308. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +1352 -0
  309. package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
  310. package/src/ts/dynamodb/agent-connection/generator.d.ts +10 -0
  311. package/src/ts/dynamodb/agent-connection/generator.js +32 -0
  312. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -0
  313. package/src/ts/dynamodb/agent-connection/schema.d.ts +14 -0
  314. package/src/ts/dynamodb/agent-connection/schema.json +22 -0
  315. package/src/ts/dynamodb/files/config.json.template +24 -0
  316. package/src/ts/dynamodb/files/src/client.ts.template +61 -0
  317. package/src/ts/dynamodb/files/src/entities/example.ts.template +47 -0
  318. package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -0
  319. package/src/ts/dynamodb/files/src/index.ts.template +2 -0
  320. package/src/ts/dynamodb/generator.d.ts +10 -0
  321. package/src/ts/dynamodb/generator.js +111 -0
  322. package/src/ts/dynamodb/generator.js.map +1 -0
  323. package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
  324. package/src/ts/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  325. package/src/ts/dynamodb/mcp-server-connection/generator.js +32 -0
  326. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -0
  327. package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +14 -0
  328. package/src/ts/dynamodb/mcp-server-connection/schema.json +22 -0
  329. package/src/ts/dynamodb/schema.d.ts +15 -0
  330. package/src/ts/dynamodb/schema.json +70 -0
  331. package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +23 -0
  332. package/src/ts/dynamodb/smithy-connection/generator.d.ts +10 -0
  333. package/src/ts/dynamodb/smithy-connection/generator.js +30 -0
  334. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -0
  335. package/src/ts/dynamodb/smithy-connection/schema.d.ts +12 -0
  336. package/src/ts/dynamodb/smithy-connection/schema.json +18 -0
  337. package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +23 -0
  338. package/src/ts/dynamodb/trpc-connection/generator.d.ts +10 -0
  339. package/src/ts/dynamodb/trpc-connection/generator.js +30 -0
  340. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -0
  341. package/src/ts/dynamodb/trpc-connection/schema.d.ts +12 -0
  342. package/src/ts/dynamodb/trpc-connection/schema.json +18 -0
  343. package/src/ts/lambda-function/generator.d.ts +3 -3
  344. package/src/ts/lambda-function/generator.js +8 -8
  345. package/src/ts/lambda-function/generator.js.map +1 -1
  346. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +32 -65
  347. package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +24 -0
  348. package/src/ts/lib/biome.d.ts +7 -0
  349. package/src/ts/lib/biome.js +58 -0
  350. package/src/ts/lib/biome.js.map +1 -0
  351. package/src/ts/lib/generator.d.ts +3 -3
  352. package/src/ts/lib/generator.js +27 -29
  353. package/src/ts/lib/generator.js.map +1 -1
  354. package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
  355. package/src/ts/lib/ts-project-utils.d.ts +12 -2
  356. package/src/ts/lib/ts-project-utils.js +30 -10
  357. package/src/ts/lib/ts-project-utils.js.map +1 -1
  358. package/src/ts/lib/vitest.d.ts +2 -2
  359. package/src/ts/lib/vitest.js +1 -1
  360. package/src/ts/lib/vitest.js.map +1 -1
  361. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +82 -12
  362. package/src/ts/mcp-server/generator.d.ts +3 -3
  363. package/src/ts/mcp-server/generator.js +34 -12
  364. package/src/ts/mcp-server/generator.js.map +1 -1
  365. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +19 -14
  366. package/src/ts/nx-generator/generator.d.ts +2 -2
  367. package/src/ts/nx-generator/generator.js +52 -19
  368. package/src/ts/nx-generator/generator.js.map +1 -1
  369. package/src/ts/nx-plugin/generator.d.ts +3 -3
  370. package/src/ts/nx-plugin/generator.js +10 -9
  371. package/src/ts/nx-plugin/generator.js.map +1 -1
  372. package/src/ts/nx-plugin/utils.d.ts +1 -1
  373. package/src/ts/nx-plugin/utils.js +10 -4
  374. package/src/ts/nx-plugin/utils.js.map +1 -1
  375. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +252 -388
  376. package/src/ts/rdb/agent-connection/generator.d.ts +3 -3
  377. package/src/ts/rdb/agent-connection/generator.js +4 -4
  378. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  379. package/src/ts/rdb/files/config.json.template +14 -0
  380. package/src/ts/rdb/files/prisma.config.ts.template +5 -4
  381. package/src/ts/rdb/files/src/index.ts.template +0 -1
  382. package/src/ts/rdb/files/src/prisma.ts.template +26 -21
  383. package/src/ts/rdb/generator.d.ts +3 -7
  384. package/src/ts/rdb/generator.js +52 -41
  385. package/src/ts/rdb/generator.js.map +1 -1
  386. package/src/ts/rdb/mcp-server-connection/generator.d.ts +3 -3
  387. package/src/ts/rdb/mcp-server-connection/generator.js +4 -4
  388. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  389. package/src/ts/rdb/smithy-connection/generator.d.ts +3 -3
  390. package/src/ts/rdb/smithy-connection/generator.js +4 -4
  391. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  392. package/src/ts/rdb/trpc-connection/generator.d.ts +3 -3
  393. package/src/ts/rdb/trpc-connection/generator.js +3 -3
  394. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  395. package/src/ts/rdb/utils.d.ts +1 -1
  396. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +1 -16
  397. package/src/ts/react-website/agui/generator.d.ts +1 -1
  398. package/src/ts/react-website/agui/generator.js +4 -5
  399. package/src/ts/react-website/agui/generator.js.map +1 -1
  400. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +530 -367
  401. package/src/ts/react-website/app/generator.d.ts +3 -3
  402. package/src/ts/react-website/app/generator.js +21 -17
  403. package/src/ts/react-website/app/generator.js.map +1 -1
  404. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +1 -7
  405. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +9 -3
  406. package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
  407. package/src/ts/react-website/cognito-auth/generator.d.ts +3 -3
  408. package/src/ts/react-website/cognito-auth/generator.js +10 -13
  409. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  410. package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +8 -6
  411. package/src/ts/react-website/cognito-auth/grit/cognito-auth-wrapper.grit +1 -1
  412. package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
  413. package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
  414. package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
  415. package/src/ts/react-website/cognito-auth/utils.d.ts +1 -1
  416. package/src/ts/react-website/cognito-auth/utils.js +1 -1
  417. package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
  418. package/src/ts/react-website/runtime-config/generator.d.ts +3 -3
  419. package/src/ts/react-website/runtime-config/generator.js +4 -4
  420. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  421. package/src/ts/sync/generator.d.ts +3 -3
  422. package/src/ts/sync/generator.js +2 -2
  423. package/src/ts/sync/generator.js.map +1 -1
  424. package/src/ts/website/app/generator.d.ts +3 -3
  425. package/src/ts/website/app/generator.js +1 -1
  426. package/src/ts/website/app/generator.js.map +1 -1
  427. package/src/ts/website/auth/generator.d.ts +3 -3
  428. package/src/ts/website/auth/generator.js +1 -1
  429. package/src/ts/website/auth/generator.js.map +1 -1
  430. package/src/utils/agent-chat/agent-chat.d.ts +31 -0
  431. package/src/utils/agent-chat/agent-chat.js +30 -0
  432. package/src/utils/agent-chat/agent-chat.js.map +1 -0
  433. package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
  434. package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
  435. package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
  436. package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
  437. package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
  438. package/src/utils/agent-connection/agent-connection.d.ts +67 -24
  439. package/src/utils/agent-connection/agent-connection.js +236 -44
  440. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  441. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
  442. package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
  443. package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
  444. package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
  445. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
  446. package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +22 -32
  447. package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
  448. package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
  449. package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +36 -0
  450. package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
  451. package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
  452. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
  453. package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
  454. package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
  455. package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
  456. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
  457. package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +5 -18
  458. package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
  459. package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
  460. package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
  461. package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
  462. package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
  463. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +11 -3
  464. package/src/utils/agent-core-constructs/agent-core-constructs.js +57 -12
  465. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  466. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +4 -0
  467. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +40 -0
  468. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +375 -0
  469. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
  470. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +335 -0
  471. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
  472. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +77 -9
  473. package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
  474. package/src/utils/api-constructs/api-constructs.d.ts +2 -2
  475. package/src/utils/api-constructs/api-constructs.js +1 -1
  476. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  477. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +3 -0
  478. package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +9 -0
  479. package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +23 -1
  480. package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
  481. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +3 -0
  482. package/src/utils/api-constructs/open-api-metadata.d.ts +2 -2
  483. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  484. package/src/utils/ast/website.d.ts +5 -1
  485. package/src/utils/ast/website.js +3 -3
  486. package/src/utils/ast/website.js.map +1 -1
  487. package/src/utils/ast.d.ts +33 -1
  488. package/src/utils/ast.js +89 -4
  489. package/src/utils/ast.js.map +1 -1
  490. package/src/utils/bundle/bundle.d.ts +1 -1
  491. package/src/utils/bundle/bundle.js +2 -2
  492. package/src/utils/bundle/bundle.js.map +1 -1
  493. package/src/utils/config/index.d.ts +5 -5
  494. package/src/utils/config/utils.d.ts +13 -3
  495. package/src/utils/config/utils.js +37 -5
  496. package/src/utils/config/utils.js.map +1 -1
  497. package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +1 -1
  498. package/src/utils/connection/open-api/react.d.ts +1 -1
  499. package/src/utils/connection/open-api/react.js +4 -4
  500. package/src/utils/connection/open-api/react.js.map +1 -1
  501. package/src/utils/containers.d.ts +1 -1
  502. package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +18 -0
  503. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +49 -0
  504. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -0
  505. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +43 -0
  506. package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +105 -0
  507. package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +62 -0
  508. package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +155 -0
  509. package/src/utils/files/common/scripts/src/dynamodb/create-local-table.ts.template +195 -0
  510. package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
  511. package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +91 -0
  512. package/src/utils/files/common/scripts/src/rdb/pull-image.ts.template +16 -0
  513. package/src/utils/files/common/scripts/src/rdb/start-container.ts.template +102 -0
  514. package/src/utils/files/common/scripts/src/rdb/wait-for-db.ts.template +59 -0
  515. package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +9 -3
  516. package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +7 -2
  517. package/src/utils/format.d.ts +45 -2
  518. package/src/utils/format.js +167 -46
  519. package/src/utils/format.js.map +1 -1
  520. package/src/utils/fs.d.ts +1 -1
  521. package/src/utils/fs.js.map +1 -1
  522. package/src/utils/function-constructs/function-constructs.d.ts +2 -2
  523. package/src/utils/function-constructs/function-constructs.js +1 -1
  524. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  525. package/src/utils/generators.d.ts +4 -0
  526. package/src/utils/generators.js +4 -4
  527. package/src/utils/generators.js.map +1 -1
  528. package/src/utils/git.d.ts +1 -1
  529. package/src/utils/git.js.map +1 -1
  530. package/src/utils/iac.d.ts +1 -1
  531. package/src/utils/iac.js.map +1 -1
  532. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +1 -5
  533. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +9 -3
  534. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +2 -4
  535. package/src/utils/identity-constructs/identity-constructs.d.ts +2 -2
  536. package/src/utils/identity-constructs/identity-constructs.js +1 -1
  537. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  538. package/src/utils/js.d.ts +4 -0
  539. package/src/utils/js.js +4 -4
  540. package/src/utils/js.js.map +1 -1
  541. package/src/utils/mcp.d.ts +25 -0
  542. package/src/utils/mcp.js +81 -0
  543. package/src/utils/mcp.js.map +1 -0
  544. package/src/utils/metrics.d.ts +9 -3
  545. package/src/utils/metrics.js +58 -28
  546. package/src/utils/metrics.js.map +1 -1
  547. package/src/utils/npm-scope.d.ts +1 -1
  548. package/src/utils/npm-scope.js.map +1 -1
  549. package/src/utils/nx.d.ts +7 -2
  550. package/src/utils/nx.js +46 -14
  551. package/src/utils/nx.js.map +1 -1
  552. package/src/utils/nxlv-python.d.ts +1 -1
  553. package/src/utils/paths.d.ts +1 -1
  554. package/src/utils/pnpm-workspace.d.ts +1 -1
  555. package/src/utils/pnpm-workspace.js.map +1 -1
  556. package/src/utils/port.d.ts +31 -3
  557. package/src/utils/port.js +74 -4
  558. package/src/utils/port.js.map +1 -1
  559. package/src/utils/py.d.ts +2 -2
  560. package/src/utils/py.js +13 -6
  561. package/src/utils/py.js.map +1 -1
  562. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +12 -2
  563. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +30 -1
  564. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +38 -16
  565. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +28 -13
  566. package/src/utils/rdb-constructs/rdb-constructs.d.ts +5 -4
  567. package/src/utils/rdb-constructs/rdb-constructs.js +3 -11
  568. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  569. package/src/utils/shared-constructs-constants.d.ts +1 -0
  570. package/src/utils/shared-constructs-constants.js +2 -1
  571. package/src/utils/shared-constructs-constants.js.map +1 -1
  572. package/src/utils/shared-constructs.d.ts +2 -2
  573. package/src/utils/shared-constructs.js +7 -7
  574. package/src/utils/shared-constructs.js.map +1 -1
  575. package/src/utils/shared-dynamodb-scripts.d.ts +11 -0
  576. package/src/utils/shared-dynamodb-scripts.js +23 -0
  577. package/src/utils/shared-dynamodb-scripts.js.map +1 -0
  578. package/src/utils/shared-infra-config.d.ts +1 -1
  579. package/src/utils/shared-infra-config.js +1 -1
  580. package/src/utils/shared-infra-config.js.map +1 -1
  581. package/src/utils/shared-infra-scripts.d.ts +11 -0
  582. package/src/utils/shared-infra-scripts.js +35 -0
  583. package/src/utils/shared-infra-scripts.js.map +1 -0
  584. package/src/utils/shared-rdb-scripts.d.ts +11 -0
  585. package/src/utils/shared-rdb-scripts.js +20 -0
  586. package/src/utils/shared-rdb-scripts.js.map +1 -0
  587. package/src/utils/shared-scripts.d.ts +2 -5
  588. package/src/utils/shared-scripts.js +2 -23
  589. package/src/utils/shared-scripts.js.map +1 -1
  590. package/src/utils/shared-shadcn.d.ts +1 -1
  591. package/src/utils/shared-shadcn.js +1 -13
  592. package/src/utils/shared-shadcn.js.map +1 -1
  593. package/src/utils/test.d.ts +5 -1
  594. package/src/utils/test.js +9 -5
  595. package/src/utils/test.js.map +1 -1
  596. package/src/utils/toml.d.ts +1 -1
  597. package/src/utils/toml.js +4 -0
  598. package/src/utils/toml.js.map +1 -1
  599. package/src/utils/versions.d.ts +82 -83
  600. package/src/utils/versions.js +81 -82
  601. package/src/utils/versions.js.map +1 -1
  602. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +72 -5
  603. package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +63 -15
  604. package/src/utils/website-constructs/website-constructs.d.ts +2 -2
  605. package/src/utils/website-constructs/website-constructs.js +1 -1
  606. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  607. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
  608. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
  609. package/src/py/agent/scripts/http/chat.ts.template +0 -38
  610. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
  611. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
  612. package/src/ts/agent/scripts/http/chat.ts.template +0 -35
  613. package/src/ts/lib/eslint.d.ts +0 -14
  614. package/src/ts/lib/eslint.js +0 -90
  615. package/src/ts/lib/eslint.js.map +0 -1
  616. package/src/ts/lib/grit/eslint-dependency-checks-warn.grit +0 -1
  617. package/src/ts/rdb/files/scripts/docker-pull.ts.template +0 -15
  618. package/src/ts/rdb/files/scripts/docker-start.ts.template +0 -84
  619. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
  620. package/src/ts/rdb/files/src/constants.ts.template +0 -8
  621. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
  622. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
  623. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
  624. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
  625. /package/src/utils/agent-connection/files/{core-runtime-config/with-session-id.ts.template → core-strands/base/with-session-id-strands.ts.template} +0 -0
  626. /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
  627. /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
  628. /package/src/utils/files/common/scripts/src/{infra-deploy.ts.template → infra/infra-deploy.ts.template} +0 -0
  629. /package/src/utils/files/common/scripts/src/{infra-destroy.ts.template → infra/infra-destroy.ts.template} +0 -0
  630. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +0 -0
  631. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
  632. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +0 -0
  633. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
@@ -22,144 +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/docker-pull.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/docker-start.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',
76
- '--name',
77
- containerName,
78
- '-e',
79
- \`MYSQL_DATABASE=\${dbName}\`,
80
- '-e',
81
- \`MYSQL_ROOT_PASSWORD=\${dbPassword}\`,
82
- '-p',
83
- \`\${hostPort}:3306\`,
84
- '-v',
85
- \`\${containerName}-data:/var/lib/mysql\`,
86
- '-d',
87
- image,
88
- ];
89
- const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
90
- if (create.status !== 0) process.exit(create.status ?? 1);
91
- }
92
-
93
- const logs = spawn(ENGINE, ['logs', '-f', containerName], {
94
- stdio: ['ignore', 'inherit', 'inherit'],
95
- });
96
-
97
- let exiting = false;
98
-
99
- const cleanup = () => {
100
- if (exiting) return;
101
- exiting = true;
102
- spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
103
- logs.kill();
104
- process.exit(0);
105
- };
106
-
107
- process.on('SIGTERM', cleanup);
108
- process.on('SIGINT', cleanup);
109
- process.on('SIGHUP', cleanup);
110
-
111
- logs.on('exit', (code) => {
112
- if (!exiting) process.exit(code ?? 0);
113
- });
114
- "
115
- `;
116
-
117
- exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/wait-for-db.ts 1`] = `
118
- "import { createConnection, Connection } from 'mariadb';
119
-
120
- const noop = () => undefined;
121
-
122
- const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
123
- const timeoutAt = Date.now() + 60000;
124
-
125
- while (Date.now() < timeoutAt) {
126
- let conn: Connection | undefined;
127
- try {
128
- conn = await createConnection({
129
- host: 'localhost',
130
- port: parseInt(portArg),
131
- user: userArg,
132
- password: passwordArg,
133
- database: dbArg,
134
- connectTimeout: 500,
135
- allowPublicKeyRetrieval: true,
136
- });
137
- await conn.end();
138
- console.log('Database is ready.');
139
- process.exit(0);
140
- } catch {
141
- console.log('Database is not ready.');
142
- await conn?.end().catch(noop);
143
- }
144
- await new Promise((r) => setTimeout(r, 200));
145
- }
146
-
147
- throw new Error(\`Timed out waiting for mysql on port \${portArg}\`);
148
- "
149
- `;
150
-
151
- exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/constants.ts 1`] = `
152
- "export const DB_PACKAGE_NAME = 'Db';
153
-
154
- // Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
155
- export const LOCAL_DB_PORT = 3306;
156
- export const LOCAL_DB_HOST = 'localhost';
157
- export const LOCAL_DB_NAME = 'database_name';
158
- export const LOCAL_DB_USER = 'root';
159
- export const LOCAL_DB_PASSWORD = 'password';
160
- "
161
- `;
162
-
163
25
  exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/create-db-user-handler.ts 1`] = `
164
26
  "import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
165
27
  import { randomBytes } from 'node:crypto';
@@ -237,8 +99,7 @@ export const handler = async (
237
99
  `;
238
100
 
239
101
  exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/index.ts 1`] = `
240
- "export { DB_PACKAGE_NAME } from './constants.js';
241
- export { getPrisma } from './prisma.js';
102
+ "export { getPrisma } from './prisma.js';
242
103
  "
243
104
  `;
244
105
 
@@ -277,26 +138,31 @@ exports[`ts#rdb generator > should add mysql prisma dependencies when engine is
277
138
  "import { PrismaMariaDb } from '@prisma/adapter-mariadb';
278
139
  import { Signer } from '@aws-sdk/rds-signer';
279
140
  import { Prisma, PrismaClient } from '../generated/prisma/client.js';
280
- import {
281
- DB_PACKAGE_NAME,
282
- LOCAL_DB_HOST,
283
- LOCAL_DB_NAME,
284
- LOCAL_DB_PASSWORD,
285
- LOCAL_DB_PORT,
286
- LOCAL_DB_USER,
287
- } from './constants.js';
141
+ import { readFileSync } from 'fs';
142
+ import { join, dirname } from 'path';
143
+ import { fileURLToPath } from 'url';
288
144
  import { getDatabaseConfig } from './utils.js';
289
145
 
146
+ // Generated: must match runtimeConfigKey in config.json
147
+ const runtimeConfigKey = 'Db';
148
+
149
+ const __dirname = dirname(fileURLToPath(import.meta.url));
150
+ // config.json is only present in local dev (not included in the deployed bundle); guard with SERVE_LOCAL check
151
+ const serveLocal = () =>
152
+ JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8'))
153
+ .serveLocal;
154
+
290
155
  export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
291
156
  log: LogOpts[] = ['warn', 'error'] as LogOpts[],
292
157
  ): Promise<PrismaClient<LogOpts>> => {
293
158
  if (process.env.SERVE_LOCAL === 'true') {
159
+ const { host, port, dbName, dbUser, dbPassword } = serveLocal();
294
160
  const adapter = new PrismaMariaDb({
295
- host: LOCAL_DB_HOST,
296
- port: LOCAL_DB_PORT,
297
- database: LOCAL_DB_NAME,
298
- user: LOCAL_DB_USER,
299
- password: LOCAL_DB_PASSWORD,
161
+ host,
162
+ port,
163
+ database: dbName,
164
+ user: dbUser,
165
+ password: dbPassword,
300
166
  allowPublicKeyRetrieval: true,
301
167
  });
302
168
  return new PrismaClient({
@@ -306,7 +172,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
306
172
  }
307
173
 
308
174
  const { hostname, port, database, dbUser, region } =
309
- await getDatabaseConfig(DB_PACKAGE_NAME);
175
+ await getDatabaseConfig(runtimeConfigKey);
310
176
  const iamAuthToken = await new Signer({
311
177
  hostname,
312
178
  port,
@@ -663,6 +529,21 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
663
529
  * @default true
664
530
  */
665
531
  readonly enableKeyRotation?: boolean;
532
+
533
+ /**
534
+ * Whether to export Aurora engine logs to CloudWatch Logs.
535
+ * See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
536
+ *
537
+ * @default false
538
+ */
539
+ readonly enableCloudwatchLogs?: boolean;
540
+
541
+ /**
542
+ * Whether to enable Performance Insights on the Aurora writer instance.
543
+ *
544
+ * @default true
545
+ */
546
+ readonly enablePerformanceInsights?: boolean;
666
547
  }
667
548
 
668
549
  /**
@@ -692,6 +573,8 @@ export abstract class AuroraDatabase extends Construct {
692
573
  deletionProtection = true,
693
574
  removalPolicy = RemovalPolicy.RETAIN,
694
575
  enableKeyRotation = true,
576
+ enableCloudwatchLogs = false,
577
+ enablePerformanceInsights = true,
695
578
  engine,
696
579
  engineVersion,
697
580
  ...clusterProps
@@ -707,12 +590,24 @@ export abstract class AuroraDatabase extends Construct {
707
590
  vpc,
708
591
  vpcSubnets,
709
592
  engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
710
- writer: writer ?? ClusterInstance.serverlessV2('writer'),
593
+ writer:
594
+ writer ??
595
+ ClusterInstance.serverlessV2('writer', {
596
+ enablePerformanceInsights,
597
+ performanceInsightEncryptionKey: enablePerformanceInsights
598
+ ? key
599
+ : undefined,
600
+ }),
711
601
  credentials: Credentials.fromGeneratedSecret(adminUser, {
712
602
  encryptionKey: key,
713
603
  }),
714
604
  iamAuthentication: true,
715
605
  monitoringInterval: Duration.seconds(5),
606
+ cloudwatchLogsExports: enableCloudwatchLogs
607
+ ? engine.type === 'mysql'
608
+ ? ['audit', 'error', 'general', 'slowquery']
609
+ : ['postgresql']
610
+ : undefined,
716
611
  defaultDatabaseName: databaseName,
717
612
  storageEncrypted: true,
718
613
  storageEncryptionKey: key,
@@ -874,17 +769,14 @@ export abstract class AuroraDatabase extends Construct {
874
769
 
875
770
  exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL 2`] = `
876
771
  "import { defineConfig } from 'prisma/config';
772
+ import { readFileSync } from 'fs';
877
773
 
878
774
  const getDatabaseUrl = async () => {
879
775
  if (process.env.SERVE_LOCAL === 'true') {
880
- const {
881
- LOCAL_DB_HOST,
882
- LOCAL_DB_NAME,
883
- LOCAL_DB_PASSWORD,
884
- LOCAL_DB_PORT,
885
- LOCAL_DB_USER,
886
- } = await import('./src/constants.js');
887
- return \`mysql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
776
+ const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
777
+ readFileSync('config.json', 'utf-8'),
778
+ ).serveLocal;
779
+ return \`mysql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
888
780
  }
889
781
  return process.env.DATABASE_URL;
890
782
  };
@@ -1063,10 +955,19 @@ variable "tags" {
1063
955
  default = {}
1064
956
  }
1065
957
 
958
+ # Suffix appended to physical resource names so that multiple deployments
959
+ # (e.g. separate environments in the same account and region) don't collide.
960
+ resource "random_string" "suffix" {
961
+ length = 8
962
+ special = false
963
+ upper = false
964
+ }
965
+
1066
966
  locals {
1067
967
  default_port = var.engine == "aurora-mysql" ? 3306 : 5432
1068
968
  default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
1069
969
  parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
970
+ cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
1070
971
  }
1071
972
 
1072
973
  resource "aws_rds_cluster_parameter_group" "database" {
@@ -1164,7 +1065,7 @@ resource "aws_security_group" "database" {
1164
1065
  }
1165
1066
 
1166
1067
  resource "aws_db_subnet_group" "database" {
1167
- name = "\${var.name}-aurora"
1068
+ name = local.cluster_name
1168
1069
  subnet_ids = var.subnet_ids
1169
1070
 
1170
1071
  tags = merge(var.tags, {
@@ -1204,7 +1105,7 @@ resource "aws_secretsmanager_secret_version" "credentials" {
1204
1105
  resource "aws_rds_cluster" "database" {
1205
1106
  #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
1206
1107
  #checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
1207
- cluster_identifier = "\${var.name}-aurora"
1108
+ cluster_identifier = local.cluster_name
1208
1109
  engine = var.engine
1209
1110
  engine_version = coalesce(var.engine_version, local.default_engine_version)
1210
1111
  database_name = var.database_name
@@ -1218,7 +1119,7 @@ resource "aws_rds_cluster" "database" {
1218
1119
  kms_key_id = aws_kms_key.database.arn
1219
1120
  deletion_protection = var.deletion_protection
1220
1121
  skip_final_snapshot = var.skip_final_snapshot
1221
- final_snapshot_identifier = var.skip_final_snapshot ? null : "\${var.name}-aurora-final-snapshot"
1122
+ final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
1222
1123
  iam_database_authentication_enabled = true
1223
1124
  monitoring_interval = 5
1224
1125
  monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
@@ -1238,7 +1139,7 @@ resource "aws_rds_cluster" "database" {
1238
1139
  resource "aws_rds_cluster_instance" "database" {
1239
1140
  count = var.instance_count
1240
1141
 
1241
- identifier = "\${var.name}-aurora-\${count.index + 1}"
1142
+ identifier = "\${local.cluster_name}-\${count.index + 1}"
1242
1143
  cluster_identifier = aws_rds_cluster.database.id
1243
1144
  instance_class = "db.serverless"
1244
1145
  engine = aws_rds_cluster.database.engine
@@ -1292,7 +1193,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
1292
1193
  resource "aws_cloudformation_stack" "credentials_rotation" {
1293
1194
  #checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
1294
1195
  count = var.enable_credential_rotation ? 1 : 0
1295
- name = "\${var.name}-aurora-credentials-rotation"
1196
+ name = "\${local.cluster_name}-credentials-rotation"
1296
1197
 
1297
1198
  capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
1298
1199
 
@@ -1306,7 +1207,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
1306
1207
  SecretId = aws_secretsmanager_secret.credentials.arn
1307
1208
  HostedRotationLambda = {
1308
1209
  RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
1309
- RotationLambdaName = "\${var.name}-aurora-credentials-rotation"
1210
+ RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
1310
1211
  VpcSecurityGroupIds = aws_security_group.rotation[0].id
1311
1212
  VpcSubnetIds = join(",", var.lambda_subnet_ids)
1312
1213
  }
@@ -1386,7 +1287,7 @@ resource "aws_security_group" "proxy" {
1386
1287
  resource "aws_db_proxy" "aurora" {
1387
1288
  count = var.enable_rds_proxy ? 1 : 0
1388
1289
 
1389
- name = "\${var.name}-proxy"
1290
+ name = "\${var.name}-proxy-\${random_string.suffix.result}"
1390
1291
  default_auth_scheme = "IAM_AUTH"
1391
1292
  engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
1392
1293
  role_arn = aws_iam_role.proxy[0].arn
@@ -1435,9 +1336,9 @@ resource "null_resource" "proxy_target_ready" {
1435
1336
  deadline=$((start_time + 600))
1436
1337
  while true; do
1437
1338
  target_state=$(aws rds describe-db-proxy-targets \\
1438
- --region \${data.aws_region.current.region} \\
1439
- --db-proxy-name \${self.triggers.db_proxy_name} \\
1440
- --target-group-name \${self.triggers.target_group_name} \\
1339
+ --region "$AWS_REGION" \\
1340
+ --db-proxy-name "$DB_PROXY_NAME" \\
1341
+ --target-group-name "$TARGET_GROUP_NAME" \\
1441
1342
  --query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
1442
1343
  --output text)
1443
1344
 
@@ -1447,13 +1348,19 @@ resource "null_resource" "proxy_target_ready" {
1447
1348
 
1448
1349
  current_time=$(date +%s)
1449
1350
  if [ "$current_time" -ge "$deadline" ]; then
1450
- echo "RDS Proxy target \${self.triggers.db_cluster_identifier} did not become AVAILABLE within 10 minutes. Last state: $target_state"
1351
+ echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
1451
1352
  exit 1
1452
1353
  fi
1453
1354
 
1454
1355
  sleep 10
1455
1356
  done
1456
1357
  EOT
1358
+ environment = {
1359
+ AWS_REGION = data.aws_region.current.region
1360
+ DB_PROXY_NAME = self.triggers.db_proxy_name
1361
+ TARGET_GROUP_NAME = self.triggers.target_group_name
1362
+ DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
1363
+ }
1457
1364
  }
1458
1365
 
1459
1366
  depends_on = [
@@ -1532,7 +1439,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
1532
1439
  resource "aws_backup_vault" "database" {
1533
1440
  count = var.enable_backup ? 1 : 0
1534
1441
 
1535
- name = "\${var.name}-aurora-backup"
1442
+ name = "\${local.cluster_name}-backup"
1536
1443
  kms_key_arn = aws_kms_key.database.arn
1537
1444
  tags = var.tags
1538
1445
  }
@@ -1540,7 +1447,7 @@ resource "aws_backup_vault" "database" {
1540
1447
  resource "aws_backup_plan" "database" {
1541
1448
  count = var.enable_backup ? 1 : 0
1542
1449
 
1543
- name = "\${var.name}-aurora-backup"
1450
+ name = "\${local.cluster_name}-backup"
1544
1451
 
1545
1452
  rule {
1546
1453
  rule_name = "daily-backup"
@@ -1791,10 +1698,12 @@ resource "random_string" "suffix" {
1791
1698
  }
1792
1699
 
1793
1700
  locals {
1794
- create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
1795
- migration_function_name = "db-migration-\${random_string.suffix.result}"
1701
+ config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
1702
+ runtime_config_key = local.config.runtimeConfigKey
1703
+ create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
1704
+ migration_function_name = "db-migration-\${random_string.suffix.result}"
1796
1705
  create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
1797
- database_runtime_user = "db_\${random_string.suffix.result}"
1706
+ database_runtime_user = "db_\${random_string.suffix.result}"
1798
1707
  }
1799
1708
 
1800
1709
  module "aurora" {
@@ -1860,7 +1769,7 @@ module "add_rdb_to_runtime_config" {
1860
1769
  source = "../../../core/runtime-config/entry"
1861
1770
 
1862
1771
  namespace = "database"
1863
- key = "Db"
1772
+ key = local.runtime_config_key
1864
1773
  value = {
1865
1774
  hostname = module.aurora.cluster_endpoint
1866
1775
  port = module.aurora.cluster_port
@@ -1873,9 +1782,8 @@ module "add_rdb_to_runtime_config" {
1873
1782
 
1874
1783
  resource "aws_ecr_repository" "migration_handler" {
1875
1784
  #checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
1876
- #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
1877
1785
  name = "db-migration-\${random_string.suffix.result}"
1878
- image_tag_mutability = "MUTABLE"
1786
+ image_tag_mutability = "IMMUTABLE"
1879
1787
  force_delete = true
1880
1788
 
1881
1789
  image_scanning_configuration {
@@ -1926,19 +1834,31 @@ data "external" "docker_digest" {
1926
1834
  program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.docker_image_tag} --format '{{.Id}}')'\\"}' "]
1927
1835
  }
1928
1836
 
1837
+ locals {
1838
+ # Content-based, immutable image tag derived from the local image digest
1839
+ image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
1840
+ }
1841
+
1929
1842
  resource "null_resource" "docker_publish" {
1930
1843
  triggers = {
1931
1844
  docker_digest = data.external.docker_digest.result.digest
1932
1845
  repository_url = aws_ecr_repository.migration_handler.repository_url
1933
1846
  docker_image_tag = var.docker_image_tag
1847
+ image_tag = local.image_tag
1934
1848
  }
1935
1849
 
1936
1850
  provisioner "local-exec" {
1937
1851
  command = <<-EOT
1938
- aws ecr get-login-password --region \${data.aws_region.current.region} | docker login --username AWS --password-stdin \${self.triggers.repository_url}
1939
- docker tag \${self.triggers.docker_image_tag} \${self.triggers.repository_url}:latest
1940
- docker push \${self.triggers.repository_url}:latest
1852
+ aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
1853
+ docker tag "$DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
1854
+ docker push "$REPOSITORY_URL:$IMAGE_TAG"
1941
1855
  EOT
1856
+ environment = {
1857
+ AWS_REGION = data.aws_region.current.region
1858
+ REPOSITORY_URL = self.triggers.repository_url
1859
+ DOCKER_IMAGE_TAG = self.triggers.docker_image_tag
1860
+ IMAGE_TAG = self.triggers.image_tag
1861
+ }
1942
1862
  }
1943
1863
 
1944
1864
  depends_on = [aws_ecr_repository_policy.migration_handler]
@@ -2196,10 +2116,10 @@ resource "null_resource" "create_db_user_trigger" {
2196
2116
  command = <<-EOT
2197
2117
  output_file=$(mktemp)
2198
2118
  response=$(aws lambda invoke \\
2199
- --region \${data.aws_region.current.region} \\
2200
- --function-name \${self.triggers.function_name} \\
2119
+ --region "$AWS_REGION" \\
2120
+ --function-name "$FUNCTION_NAME" \\
2201
2121
  --cli-binary-format raw-in-base64-out \\
2202
- --payload '{"RequestType":"Create","PhysicalResourceId":"db-user:\${self.triggers.db_user}"}' \\
2122
+ --payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
2203
2123
  "$output_file")
2204
2124
  cat "$output_file"
2205
2125
  echo "$response"
@@ -2209,6 +2129,11 @@ resource "null_resource" "create_db_user_trigger" {
2209
2129
  fi
2210
2130
  rm -f "$output_file"
2211
2131
  EOT
2132
+ environment = {
2133
+ AWS_REGION = data.aws_region.current.region
2134
+ FUNCTION_NAME = self.triggers.function_name
2135
+ DB_USER = self.triggers.db_user
2136
+ }
2212
2137
  }
2213
2138
 
2214
2139
  depends_on = [aws_lambda_function.create_db_user, module.aurora]
@@ -2222,7 +2147,7 @@ resource "aws_lambda_function" "migration_handler" {
2222
2147
  package_type = "Image"
2223
2148
  function_name = local.migration_function_name
2224
2149
  role = aws_iam_role.migration_handler.arn
2225
- image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:latest"
2150
+ image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
2226
2151
  memory_size = 1024
2227
2152
  timeout = 300
2228
2153
  architectures = ["arm64"]
@@ -2271,8 +2196,8 @@ resource "null_resource" "migration_trigger" {
2271
2196
  command = <<-EOT
2272
2197
  output_file=$(mktemp)
2273
2198
  response=$(aws lambda invoke \\
2274
- --region \${data.aws_region.current.region} \\
2275
- --function-name \${self.triggers.function_name} \\
2199
+ --region "$AWS_REGION" \\
2200
+ --function-name "$FUNCTION_NAME" \\
2276
2201
  --cli-binary-format raw-in-base64-out \\
2277
2202
  "$output_file")
2278
2203
  cat "$output_file"
@@ -2283,6 +2208,10 @@ resource "null_resource" "migration_trigger" {
2283
2208
  fi
2284
2209
  rm -f "$output_file"
2285
2210
  EOT
2211
+ environment = {
2212
+ AWS_REGION = data.aws_region.current.region
2213
+ FUNCTION_NAME = self.triggers.function_name
2214
+ }
2286
2215
  }
2287
2216
 
2288
2217
  depends_on = [
@@ -2513,10 +2442,19 @@ variable "tags" {
2513
2442
  default = {}
2514
2443
  }
2515
2444
 
2445
+ # Suffix appended to physical resource names so that multiple deployments
2446
+ # (e.g. separate environments in the same account and region) don't collide.
2447
+ resource "random_string" "suffix" {
2448
+ length = 8
2449
+ special = false
2450
+ upper = false
2451
+ }
2452
+
2516
2453
  locals {
2517
2454
  default_port = var.engine == "aurora-mysql" ? 3306 : 5432
2518
2455
  default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
2519
2456
  parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
2457
+ cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
2520
2458
  }
2521
2459
 
2522
2460
  resource "aws_rds_cluster_parameter_group" "database" {
@@ -2614,7 +2552,7 @@ resource "aws_security_group" "database" {
2614
2552
  }
2615
2553
 
2616
2554
  resource "aws_db_subnet_group" "database" {
2617
- name = "\${var.name}-aurora"
2555
+ name = local.cluster_name
2618
2556
  subnet_ids = var.subnet_ids
2619
2557
 
2620
2558
  tags = merge(var.tags, {
@@ -2654,7 +2592,7 @@ resource "aws_secretsmanager_secret_version" "credentials" {
2654
2592
  resource "aws_rds_cluster" "database" {
2655
2593
  #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
2656
2594
  #checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
2657
- cluster_identifier = "\${var.name}-aurora"
2595
+ cluster_identifier = local.cluster_name
2658
2596
  engine = var.engine
2659
2597
  engine_version = coalesce(var.engine_version, local.default_engine_version)
2660
2598
  database_name = var.database_name
@@ -2668,7 +2606,7 @@ resource "aws_rds_cluster" "database" {
2668
2606
  kms_key_id = aws_kms_key.database.arn
2669
2607
  deletion_protection = var.deletion_protection
2670
2608
  skip_final_snapshot = var.skip_final_snapshot
2671
- final_snapshot_identifier = var.skip_final_snapshot ? null : "\${var.name}-aurora-final-snapshot"
2609
+ final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
2672
2610
  iam_database_authentication_enabled = true
2673
2611
  monitoring_interval = 5
2674
2612
  monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
@@ -2688,7 +2626,7 @@ resource "aws_rds_cluster" "database" {
2688
2626
  resource "aws_rds_cluster_instance" "database" {
2689
2627
  count = var.instance_count
2690
2628
 
2691
- identifier = "\${var.name}-aurora-\${count.index + 1}"
2629
+ identifier = "\${local.cluster_name}-\${count.index + 1}"
2692
2630
  cluster_identifier = aws_rds_cluster.database.id
2693
2631
  instance_class = "db.serverless"
2694
2632
  engine = aws_rds_cluster.database.engine
@@ -2742,7 +2680,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
2742
2680
  resource "aws_cloudformation_stack" "credentials_rotation" {
2743
2681
  #checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
2744
2682
  count = var.enable_credential_rotation ? 1 : 0
2745
- name = "\${var.name}-aurora-credentials-rotation"
2683
+ name = "\${local.cluster_name}-credentials-rotation"
2746
2684
 
2747
2685
  capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
2748
2686
 
@@ -2756,7 +2694,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
2756
2694
  SecretId = aws_secretsmanager_secret.credentials.arn
2757
2695
  HostedRotationLambda = {
2758
2696
  RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
2759
- RotationLambdaName = "\${var.name}-aurora-credentials-rotation"
2697
+ RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
2760
2698
  VpcSecurityGroupIds = aws_security_group.rotation[0].id
2761
2699
  VpcSubnetIds = join(",", var.lambda_subnet_ids)
2762
2700
  }
@@ -2836,7 +2774,7 @@ resource "aws_security_group" "proxy" {
2836
2774
  resource "aws_db_proxy" "aurora" {
2837
2775
  count = var.enable_rds_proxy ? 1 : 0
2838
2776
 
2839
- name = "\${var.name}-proxy"
2777
+ name = "\${var.name}-proxy-\${random_string.suffix.result}"
2840
2778
  default_auth_scheme = "IAM_AUTH"
2841
2779
  engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
2842
2780
  role_arn = aws_iam_role.proxy[0].arn
@@ -2885,9 +2823,9 @@ resource "null_resource" "proxy_target_ready" {
2885
2823
  deadline=$((start_time + 600))
2886
2824
  while true; do
2887
2825
  target_state=$(aws rds describe-db-proxy-targets \\
2888
- --region \${data.aws_region.current.region} \\
2889
- --db-proxy-name \${self.triggers.db_proxy_name} \\
2890
- --target-group-name \${self.triggers.target_group_name} \\
2826
+ --region "$AWS_REGION" \\
2827
+ --db-proxy-name "$DB_PROXY_NAME" \\
2828
+ --target-group-name "$TARGET_GROUP_NAME" \\
2891
2829
  --query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
2892
2830
  --output text)
2893
2831
 
@@ -2897,13 +2835,19 @@ resource "null_resource" "proxy_target_ready" {
2897
2835
 
2898
2836
  current_time=$(date +%s)
2899
2837
  if [ "$current_time" -ge "$deadline" ]; then
2900
- echo "RDS Proxy target \${self.triggers.db_cluster_identifier} did not become AVAILABLE within 10 minutes. Last state: $target_state"
2838
+ echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
2901
2839
  exit 1
2902
2840
  fi
2903
2841
 
2904
2842
  sleep 10
2905
2843
  done
2906
2844
  EOT
2845
+ environment = {
2846
+ AWS_REGION = data.aws_region.current.region
2847
+ DB_PROXY_NAME = self.triggers.db_proxy_name
2848
+ TARGET_GROUP_NAME = self.triggers.target_group_name
2849
+ DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
2850
+ }
2907
2851
  }
2908
2852
 
2909
2853
  depends_on = [
@@ -2982,7 +2926,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
2982
2926
  resource "aws_backup_vault" "database" {
2983
2927
  count = var.enable_backup ? 1 : 0
2984
2928
 
2985
- name = "\${var.name}-aurora-backup"
2929
+ name = "\${local.cluster_name}-backup"
2986
2930
  kms_key_arn = aws_kms_key.database.arn
2987
2931
  tags = var.tags
2988
2932
  }
@@ -2990,7 +2934,7 @@ resource "aws_backup_vault" "database" {
2990
2934
  resource "aws_backup_plan" "database" {
2991
2935
  count = var.enable_backup ? 1 : 0
2992
2936
 
2993
- name = "\${var.name}-aurora-backup"
2937
+ name = "\${local.cluster_name}-backup"
2994
2938
 
2995
2939
  rule {
2996
2940
  rule_name = "daily-backup"
@@ -3241,10 +3185,12 @@ resource "random_string" "suffix" {
3241
3185
  }
3242
3186
 
3243
3187
  locals {
3244
- create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
3245
- migration_function_name = "db-migration-\${random_string.suffix.result}"
3188
+ config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
3189
+ runtime_config_key = local.config.runtimeConfigKey
3190
+ create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
3191
+ migration_function_name = "db-migration-\${random_string.suffix.result}"
3246
3192
  create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
3247
- database_runtime_user = "db_\${random_string.suffix.result}"
3193
+ database_runtime_user = "db_\${random_string.suffix.result}"
3248
3194
  }
3249
3195
 
3250
3196
  module "aurora" {
@@ -3310,7 +3256,7 @@ module "add_rdb_to_runtime_config" {
3310
3256
  source = "../../../core/runtime-config/entry"
3311
3257
 
3312
3258
  namespace = "database"
3313
- key = "Db"
3259
+ key = local.runtime_config_key
3314
3260
  value = {
3315
3261
  hostname = module.aurora.cluster_endpoint
3316
3262
  port = module.aurora.cluster_port
@@ -3323,9 +3269,8 @@ module "add_rdb_to_runtime_config" {
3323
3269
 
3324
3270
  resource "aws_ecr_repository" "migration_handler" {
3325
3271
  #checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
3326
- #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
3327
3272
  name = "db-migration-\${random_string.suffix.result}"
3328
- image_tag_mutability = "MUTABLE"
3273
+ image_tag_mutability = "IMMUTABLE"
3329
3274
  force_delete = true
3330
3275
 
3331
3276
  image_scanning_configuration {
@@ -3376,19 +3321,31 @@ data "external" "docker_digest" {
3376
3321
  program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.docker_image_tag} --format '{{.Id}}')'\\"}' "]
3377
3322
  }
3378
3323
 
3324
+ locals {
3325
+ # Content-based, immutable image tag derived from the local image digest
3326
+ image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
3327
+ }
3328
+
3379
3329
  resource "null_resource" "docker_publish" {
3380
3330
  triggers = {
3381
3331
  docker_digest = data.external.docker_digest.result.digest
3382
3332
  repository_url = aws_ecr_repository.migration_handler.repository_url
3383
3333
  docker_image_tag = var.docker_image_tag
3334
+ image_tag = local.image_tag
3384
3335
  }
3385
3336
 
3386
3337
  provisioner "local-exec" {
3387
3338
  command = <<-EOT
3388
- aws ecr get-login-password --region \${data.aws_region.current.region} | docker login --username AWS --password-stdin \${self.triggers.repository_url}
3389
- docker tag \${self.triggers.docker_image_tag} \${self.triggers.repository_url}:latest
3390
- docker push \${self.triggers.repository_url}:latest
3339
+ aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
3340
+ docker tag "$DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
3341
+ docker push "$REPOSITORY_URL:$IMAGE_TAG"
3391
3342
  EOT
3343
+ environment = {
3344
+ AWS_REGION = data.aws_region.current.region
3345
+ REPOSITORY_URL = self.triggers.repository_url
3346
+ DOCKER_IMAGE_TAG = self.triggers.docker_image_tag
3347
+ IMAGE_TAG = self.triggers.image_tag
3348
+ }
3392
3349
  }
3393
3350
 
3394
3351
  depends_on = [aws_ecr_repository_policy.migration_handler]
@@ -3651,10 +3608,10 @@ resource "null_resource" "create_db_user_trigger" {
3651
3608
  command = <<-EOT
3652
3609
  output_file=$(mktemp)
3653
3610
  response=$(aws lambda invoke \\
3654
- --region \${data.aws_region.current.region} \\
3655
- --function-name \${self.triggers.function_name} \\
3611
+ --region "$AWS_REGION" \\
3612
+ --function-name "$FUNCTION_NAME" \\
3656
3613
  --cli-binary-format raw-in-base64-out \\
3657
- --payload '{"RequestType":"Create","PhysicalResourceId":"db-user:\${self.triggers.db_user}"}' \\
3614
+ --payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
3658
3615
  "$output_file")
3659
3616
  cat "$output_file"
3660
3617
  echo "$response"
@@ -3664,6 +3621,11 @@ resource "null_resource" "create_db_user_trigger" {
3664
3621
  fi
3665
3622
  rm -f "$output_file"
3666
3623
  EOT
3624
+ environment = {
3625
+ AWS_REGION = data.aws_region.current.region
3626
+ FUNCTION_NAME = self.triggers.function_name
3627
+ DB_USER = self.triggers.db_user
3628
+ }
3667
3629
  }
3668
3630
 
3669
3631
  depends_on = [aws_lambda_function.create_db_user, module.aurora]
@@ -3677,7 +3639,7 @@ resource "aws_lambda_function" "migration_handler" {
3677
3639
  package_type = "Image"
3678
3640
  function_name = local.migration_function_name
3679
3641
  role = aws_iam_role.migration_handler.arn
3680
- image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:latest"
3642
+ image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
3681
3643
  memory_size = 1024
3682
3644
  timeout = 300
3683
3645
  architectures = ["arm64"]
@@ -3722,8 +3684,8 @@ resource "null_resource" "migration_trigger" {
3722
3684
  command = <<-EOT
3723
3685
  output_file=$(mktemp)
3724
3686
  response=$(aws lambda invoke \\
3725
- --region \${data.aws_region.current.region} \\
3726
- --function-name \${self.triggers.function_name} \\
3687
+ --region "$AWS_REGION" \\
3688
+ --function-name "$FUNCTION_NAME" \\
3727
3689
  --cli-binary-format raw-in-base64-out \\
3728
3690
  "$output_file")
3729
3691
  cat "$output_file"
@@ -3734,6 +3696,10 @@ resource "null_resource" "migration_trigger" {
3734
3696
  fi
3735
3697
  rm -f "$output_file"
3736
3698
  EOT
3699
+ environment = {
3700
+ AWS_REGION = data.aws_region.current.region
3701
+ FUNCTION_NAME = self.triggers.function_name
3702
+ }
3737
3703
  }
3738
3704
 
3739
3705
  depends_on = [
@@ -3824,148 +3790,6 @@ datasource db {
3824
3790
  "
3825
3791
  `;
3826
3792
 
3827
- exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/docker-pull.ts 1`] = `
3828
- "import { spawnSync } from 'child_process';
3829
-
3830
- const ENGINE = 'docker';
3831
- const image = process.argv[2];
3832
-
3833
- const inspect = spawnSync(ENGINE, ['image', 'inspect', image], {
3834
- stdio: 'ignore',
3835
- });
3836
-
3837
- if (inspect.status !== 0) {
3838
- const pull = spawnSync(ENGINE, ['pull', image], { stdio: 'inherit' });
3839
- if (pull.status !== 0) {
3840
- process.exit(pull.status ?? 1);
3841
- }
3842
- }
3843
- "
3844
- `;
3845
-
3846
- exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/docker-start.ts 1`] = `
3847
- "import { spawn, spawnSync } from 'child_process';
3848
-
3849
- const ENGINE = 'docker';
3850
-
3851
- const [containerName, image, hostPort, dbName, dbUser, dbPassword] =
3852
- process.argv.slice(2);
3853
-
3854
- const containerExists = (): boolean =>
3855
- spawnSync(ENGINE, ['container', 'inspect', containerName], {
3856
- stdio: 'ignore',
3857
- }).status === 0;
3858
-
3859
- const isRunning = (): boolean => {
3860
- const result = spawnSync(
3861
- ENGINE,
3862
- ['container', 'inspect', '-f', '{{.State.Running}}', containerName],
3863
- { encoding: 'utf-8' },
3864
- );
3865
- return result.status === 0 && result.stdout.trim() === 'true';
3866
- };
3867
-
3868
- if (containerExists()) {
3869
- if (!isRunning()) {
3870
- const start = spawnSync(ENGINE, ['start', containerName], {
3871
- stdio: 'inherit',
3872
- });
3873
- if (start.status !== 0) process.exit(start.status ?? 1);
3874
- }
3875
- } else {
3876
- const runArgs = [
3877
- 'run',
3878
- '--name',
3879
- containerName,
3880
- '-e',
3881
- \`POSTGRES_DB=\${dbName}\`,
3882
- '-e',
3883
- \`POSTGRES_USER=\${dbUser}\`,
3884
- '-e',
3885
- \`POSTGRES_PASSWORD=\${dbPassword}\`,
3886
- '-e',
3887
- \`PGDATA=/var/lib/postgresql/17/docker\`,
3888
- '-p',
3889
- \`\${hostPort}:5432\`,
3890
- '-v',
3891
- \`\${containerName}-data:/var/lib/postgresql\`,
3892
- '-d',
3893
- image,
3894
- ];
3895
- const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
3896
- if (create.status !== 0) process.exit(create.status ?? 1);
3897
- }
3898
-
3899
- const logs = spawn(ENGINE, ['logs', '-f', containerName], {
3900
- stdio: ['ignore', 'inherit', 'inherit'],
3901
- });
3902
-
3903
- let exiting = false;
3904
-
3905
- const cleanup = () => {
3906
- if (exiting) return;
3907
- exiting = true;
3908
- spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
3909
- logs.kill();
3910
- process.exit(0);
3911
- };
3912
-
3913
- process.on('SIGTERM', cleanup);
3914
- process.on('SIGINT', cleanup);
3915
- process.on('SIGHUP', cleanup);
3916
-
3917
- logs.on('exit', (code) => {
3918
- if (!exiting) process.exit(code ?? 0);
3919
- });
3920
- "
3921
- `;
3922
-
3923
- exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/wait-for-db.ts 1`] = `
3924
- "import { Client } from 'pg';
3925
-
3926
- const noop = () => undefined;
3927
-
3928
- const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
3929
- const timeoutAt = Date.now() + 60000;
3930
-
3931
- while (Date.now() < timeoutAt) {
3932
- const client = new Client({
3933
- host: 'localhost',
3934
- port: parseInt(portArg),
3935
- user: userArg,
3936
- password: passwordArg,
3937
- database: dbArg,
3938
- connectionTimeoutMillis: 500,
3939
- });
3940
- client.on('error', noop);
3941
- try {
3942
- await client.connect();
3943
- await client.end();
3944
- console.log('Database is ready.');
3945
- process.exit(0);
3946
- } catch {
3947
- console.log('Database is not ready.');
3948
- await client.end().catch(noop);
3949
- }
3950
- await new Promise((r) => setTimeout(r, 200));
3951
- }
3952
-
3953
- throw new Error(\`Timed out waiting for postgres on port \${portArg}\`);
3954
- "
3955
- `;
3956
-
3957
- exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/constants.ts 1`] = `
3958
- "export const DB_PACKAGE_NAME = 'Db';
3959
-
3960
- // Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
3961
- export const LOCAL_DB_PORT = 5432;
3962
- export const LOCAL_DB_HOST = 'localhost';
3963
- export const LOCAL_DB_NAME = 'database_name';
3964
- export const LOCAL_DB_USER = 'dbadmin';
3965
- export const LOCAL_DB_PASSWORD = 'password';
3966
- "
3967
- `;
3968
-
3969
3793
  exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/create-db-user-handler.ts 1`] = `
3970
3794
  "import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
3971
3795
  import { randomBytes } from 'node:crypto';
@@ -4057,8 +3881,7 @@ export const handler = async (
4057
3881
  `;
4058
3882
 
4059
3883
  exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/index.ts 1`] = `
4060
- "export { DB_PACKAGE_NAME } from './constants.js';
4061
- export { getPrisma } from './prisma.js';
3884
+ "export { getPrisma } from './prisma.js';
4062
3885
  "
4063
3886
  `;
4064
3887
 
@@ -4110,16 +3933,20 @@ exports[`ts#rdb generator > should generate the aurora shared construct > packag
4110
3933
  import { Signer } from '@aws-sdk/rds-signer';
4111
3934
  import { Prisma, PrismaClient } from '../generated/prisma/client.js';
4112
3935
  import { Pool } from 'pg';
4113
- import {
4114
- DB_PACKAGE_NAME,
4115
- LOCAL_DB_HOST,
4116
- LOCAL_DB_NAME,
4117
- LOCAL_DB_PASSWORD,
4118
- LOCAL_DB_PORT,
4119
- LOCAL_DB_USER,
4120
- } from './constants.js';
3936
+ import { readFileSync } from 'fs';
3937
+ import { join, dirname } from 'path';
3938
+ import { fileURLToPath } from 'url';
4121
3939
  import { getDatabaseConfig } from './utils.js';
4122
3940
 
3941
+ // Generated: must match runtimeConfigKey in config.json
3942
+ const runtimeConfigKey = 'Db';
3943
+
3944
+ const __dirname = dirname(fileURLToPath(import.meta.url));
3945
+ // config.json is only present in local dev (not included in the deployed bundle); guard with SERVE_LOCAL check
3946
+ const serveLocal = () =>
3947
+ JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8'))
3948
+ .serveLocal;
3949
+
4123
3950
  let prismaClient: PrismaClient<Prisma.LogLevel> | undefined;
4124
3951
 
4125
3952
  export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
@@ -4128,13 +3955,14 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
4128
3955
  if (prismaClient) return prismaClient;
4129
3956
 
4130
3957
  if (process.env.SERVE_LOCAL === 'true') {
3958
+ const { host, port, dbName, dbUser, dbPassword } = serveLocal();
4131
3959
  const adapter = new PrismaPg(
4132
3960
  new Pool({
4133
- host: LOCAL_DB_HOST,
4134
- port: LOCAL_DB_PORT,
4135
- database: LOCAL_DB_NAME,
4136
- user: LOCAL_DB_USER,
4137
- password: LOCAL_DB_PASSWORD,
3961
+ host,
3962
+ port,
3963
+ database: dbName,
3964
+ user: dbUser,
3965
+ password: dbPassword,
4138
3966
  allowExitOnIdle: true,
4139
3967
  }),
4140
3968
  );
@@ -4146,7 +3974,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
4146
3974
  }
4147
3975
 
4148
3976
  const { hostname, port, database, dbUser, region } =
4149
- await getDatabaseConfig(DB_PACKAGE_NAME);
3977
+ await getDatabaseConfig(runtimeConfigKey);
4150
3978
  const adapter = new PrismaPg(
4151
3979
  new Pool({
4152
3980
  host: hostname,
@@ -4508,6 +4336,21 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
4508
4336
  * @default true
4509
4337
  */
4510
4338
  readonly enableKeyRotation?: boolean;
4339
+
4340
+ /**
4341
+ * Whether to export Aurora engine logs to CloudWatch Logs.
4342
+ * See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
4343
+ *
4344
+ * @default false
4345
+ */
4346
+ readonly enableCloudwatchLogs?: boolean;
4347
+
4348
+ /**
4349
+ * Whether to enable Performance Insights on the Aurora writer instance.
4350
+ *
4351
+ * @default true
4352
+ */
4353
+ readonly enablePerformanceInsights?: boolean;
4511
4354
  }
4512
4355
 
4513
4356
  /**
@@ -4537,6 +4380,8 @@ export abstract class AuroraDatabase extends Construct {
4537
4380
  deletionProtection = true,
4538
4381
  removalPolicy = RemovalPolicy.RETAIN,
4539
4382
  enableKeyRotation = true,
4383
+ enableCloudwatchLogs = false,
4384
+ enablePerformanceInsights = true,
4540
4385
  engine,
4541
4386
  engineVersion,
4542
4387
  ...clusterProps
@@ -4552,12 +4397,24 @@ export abstract class AuroraDatabase extends Construct {
4552
4397
  vpc,
4553
4398
  vpcSubnets,
4554
4399
  engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
4555
- writer: writer ?? ClusterInstance.serverlessV2('writer'),
4400
+ writer:
4401
+ writer ??
4402
+ ClusterInstance.serverlessV2('writer', {
4403
+ enablePerformanceInsights,
4404
+ performanceInsightEncryptionKey: enablePerformanceInsights
4405
+ ? key
4406
+ : undefined,
4407
+ }),
4556
4408
  credentials: Credentials.fromGeneratedSecret(adminUser, {
4557
4409
  encryptionKey: key,
4558
4410
  }),
4559
4411
  iamAuthentication: true,
4560
4412
  monitoringInterval: Duration.seconds(5),
4413
+ cloudwatchLogsExports: enableCloudwatchLogs
4414
+ ? engine.type === 'mysql'
4415
+ ? ['audit', 'error', 'general', 'slowquery']
4416
+ : ['postgresql']
4417
+ : undefined,
4561
4418
  defaultDatabaseName: databaseName,
4562
4419
  storageEncrypted: true,
4563
4420
  storageEncryptionKey: key,
@@ -4720,8 +4577,8 @@ export abstract class AuroraDatabase extends Construct {
4720
4577
  exports[`ts#rdb generator > should generate the aurora shared construct 2`] = `
4721
4578
  "import * as path from 'path';
4722
4579
  import * as url from 'url';
4580
+ import { readFileSync } from 'fs';
4723
4581
  import { Construct } from 'constructs';
4724
- import { DB_PACKAGE_NAME } from ':proj/db';
4725
4582
  import {
4726
4583
  AuroraDatabase,
4727
4584
  AuroraDatabaseEngines,
@@ -4729,6 +4586,16 @@ import {
4729
4586
  } from '../../core/rdb/aurora.js';
4730
4587
  import { findWorkspaceRoot } from '../../core/workspace.js';
4731
4588
 
4589
+ const { runtimeConfigKey } = JSON.parse(
4590
+ readFileSync(
4591
+ path.join(
4592
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
4593
+ 'packages/db/config.json',
4594
+ ),
4595
+ 'utf-8',
4596
+ ),
4597
+ ) as { runtimeConfigKey: string };
4598
+
4732
4599
  export type DbProps = Omit<
4733
4600
  AuroraDatabaseProps,
4734
4601
  | 'databaseName'
@@ -4748,7 +4615,7 @@ export class Db extends AuroraDatabase {
4748
4615
  ...props,
4749
4616
  databaseName: 'database_name',
4750
4617
  adminUser: 'databaseUser',
4751
- runtimeConfigKey: DB_PACKAGE_NAME,
4618
+ runtimeConfigKey,
4752
4619
  migrationBundleDir: path.join(
4753
4620
  findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
4754
4621
  'dist/packages/db/bundle/migration',
@@ -4766,17 +4633,14 @@ export class Db extends AuroraDatabase {
4766
4633
 
4767
4634
  exports[`ts#rdb generator > should generate the aurora shared construct 3`] = `
4768
4635
  "import { defineConfig } from 'prisma/config';
4636
+ import { readFileSync } from 'fs';
4769
4637
 
4770
4638
  const getDatabaseUrl = async () => {
4771
4639
  if (process.env.SERVE_LOCAL === 'true') {
4772
- const {
4773
- LOCAL_DB_HOST,
4774
- LOCAL_DB_NAME,
4775
- LOCAL_DB_PASSWORD,
4776
- LOCAL_DB_PORT,
4777
- LOCAL_DB_USER,
4778
- } = await import('./src/constants.js');
4779
- return \`postgresql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
4640
+ const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
4641
+ readFileSync('config.json', 'utf-8'),
4642
+ ).serveLocal;
4643
+ return \`postgresql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
4780
4644
  }
4781
4645
  return process.env.DATABASE_URL;
4782
4646
  };