@aws/nx-plugin 1.0.0-rc.7 → 1.0.0-rc.71

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 (1358) hide show
  1. package/LICENSE-THIRD-PARTY +7044 -6135
  2. package/README.md +9 -7
  3. package/generators.json +152 -10
  4. package/migrations.json +161 -0
  5. package/package.json +41 -22
  6. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +295 -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/agentcore-harness/__snapshots__/generator.spec.ts.snap +238 -0
  51. package/src/agentcore-harness/files/project/README.md.template +83 -0
  52. package/src/agentcore-harness/files/project/scripts/chat.ts.template +99 -0
  53. package/src/agentcore-harness/files/project/src/PROMPT.md.template +16 -0
  54. package/src/agentcore-harness/generator.d.ts +62 -0
  55. package/src/agentcore-harness/generator.js +158 -0
  56. package/src/agentcore-harness/generator.js.map +1 -0
  57. package/src/agentcore-harness/schema.d.js +8 -0
  58. package/src/agentcore-harness/schema.d.js.map +1 -0
  59. package/src/agentcore-harness/schema.d.ts +17 -0
  60. package/src/agentcore-harness/schema.json +53 -0
  61. package/src/connection/agent-local-dev.d.ts +49 -0
  62. package/src/connection/agent-local-dev.js +84 -0
  63. package/src/connection/agent-local-dev.js.map +1 -0
  64. package/src/connection/agent-runtime-config.js +9 -14
  65. package/src/connection/agent-runtime-config.js.map +1 -1
  66. package/src/connection/gateway-runtime-config.d.ts +19 -0
  67. package/src/connection/gateway-runtime-config.js +47 -0
  68. package/src/connection/gateway-runtime-config.js.map +1 -0
  69. package/src/connection/generator.d.ts +3 -10
  70. package/src/connection/generator.js +172 -194
  71. package/src/connection/generator.js.map +1 -1
  72. package/src/connection/{serve-local.d.ts → local-dev.d.ts} +3 -3
  73. package/src/connection/local-dev.js +37 -0
  74. package/src/connection/local-dev.js.map +1 -0
  75. package/src/connection/scaffold-catalog.d.ts +267 -0
  76. package/src/connection/scaffold-catalog.js +347 -0
  77. package/src/connection/scaffold-catalog.js.map +1 -0
  78. package/src/connection/schema-resolver.d.ts +5 -0
  79. package/src/connection/schema-resolver.js +27 -0
  80. package/src/connection/schema-resolver.js.map +1 -0
  81. package/src/connection/schema.d.js +6 -0
  82. package/src/connection/schema.d.js.map +1 -0
  83. package/src/connection/schema.d.ts +1 -0
  84. package/src/connection/schema.json +5 -0
  85. package/src/connection/supported-connections.d.ts +116 -0
  86. package/src/connection/supported-connections.js +163 -0
  87. package/src/connection/supported-connections.js.map +1 -0
  88. package/src/index.js +2 -5
  89. package/src/index.js.map +1 -1
  90. package/src/infra/app/__snapshots__/generator.spec.ts.snap +119 -72
  91. package/src/infra/app/files/app/README.md.template +8 -4
  92. package/src/infra/app/files/app/src/main.ts.template +5 -1
  93. package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
  94. package/src/infra/app/generator.d.ts +43 -0
  95. package/src/infra/app/generator.js +195 -127
  96. package/src/infra/app/generator.js.map +1 -1
  97. package/src/infra/app/schema.d.js +6 -0
  98. package/src/infra/app/schema.d.js.map +1 -0
  99. package/src/infra/app/schema.d.ts +1 -1
  100. package/src/infra/app/schema.json +5 -0
  101. package/src/init/generator.d.ts +31 -0
  102. package/src/init/generator.js +46 -0
  103. package/src/init/generator.js.map +1 -0
  104. package/src/init/schema.d.js +6 -0
  105. package/src/init/schema.d.js.map +1 -0
  106. package/src/init/schema.d.ts +16 -0
  107. package/src/init/schema.json +35 -0
  108. package/src/internal/test-matrix/generator.d.ts +29 -0
  109. package/src/internal/test-matrix/generator.js +698 -0
  110. package/src/internal/test-matrix/generator.js.map +1 -0
  111. package/src/internal/test-matrix/schema.d.js +6 -0
  112. package/src/internal/test-matrix/schema.d.js.map +1 -0
  113. package/src/internal/test-matrix/schema.d.ts +12 -0
  114. package/src/internal/test-matrix/schema.json +21 -0
  115. package/src/license/config-types.js +5 -3
  116. package/src/license/config-types.js.map +1 -1
  117. package/src/license/config.d.ts +1 -1
  118. package/src/license/config.js +267 -242
  119. package/src/license/config.js.map +1 -1
  120. package/src/license/dependency-check/check.js +51 -46
  121. package/src/license/dependency-check/check.js.map +1 -1
  122. package/src/license/dependency-check/collectors/collector.js +41 -71
  123. package/src/license/dependency-check/collectors/collector.js.map +1 -1
  124. package/src/license/dependency-check/collectors/npm-collector.js +34 -41
  125. package/src/license/dependency-check/collectors/npm-collector.js.map +1 -1
  126. package/src/license/dependency-check/collectors/python-collector.js +55 -62
  127. package/src/license/dependency-check/collectors/python-collector.js.map +1 -1
  128. package/src/license/dependency-check/evaluator.js +40 -68
  129. package/src/license/dependency-check/evaluator.js.map +1 -1
  130. package/src/license/dependency-check/executor.js +30 -22
  131. package/src/license/dependency-check/executor.js.map +1 -1
  132. package/src/license/dependency-check/pre-approved.js +949 -336
  133. package/src/license/dependency-check/pre-approved.js.map +1 -1
  134. package/src/license/dependency-check/types.js +2 -3
  135. package/src/license/dependency-check/types.js.map +1 -1
  136. package/src/license/generator.js +65 -68
  137. package/src/license/generator.js.map +1 -1
  138. package/src/license/index.js +3 -9
  139. package/src/license/index.js.map +1 -1
  140. package/src/license/known-exceptions.d.ts +1 -1
  141. package/src/license/known-exceptions.js +19 -13
  142. package/src/license/known-exceptions.js.map +1 -1
  143. package/src/license/schema.d.js +6 -0
  144. package/src/license/schema.d.js.map +1 -0
  145. package/src/license/schema.d.ts +2 -0
  146. package/src/license/schema.json +5 -0
  147. package/src/license/sync/generator.js +94 -119
  148. package/src/license/sync/generator.js.map +1 -1
  149. package/src/license/sync/project-file-sync.js +28 -35
  150. package/src/license/sync/project-file-sync.js.map +1 -1
  151. package/src/mcp-server/dev-server.d.ts +1 -0
  152. package/src/mcp-server/dev-server.js +18 -0
  153. package/src/mcp-server/dev-server.js.map +1 -0
  154. package/src/mcp-server/generator-info.js +149 -165
  155. package/src/mcp-server/generator-info.js.map +1 -1
  156. package/src/mcp-server/guide-pipeline.js +199 -206
  157. package/src/mcp-server/guide-pipeline.js.map +1 -1
  158. package/src/mcp-server/guide-render.js +10 -25
  159. package/src/mcp-server/guide-render.js.map +1 -1
  160. package/src/mcp-server/index.js +6 -10
  161. package/src/mcp-server/index.js.map +1 -1
  162. package/src/mcp-server/mdx-ast.js +39 -57
  163. package/src/mcp-server/mdx-ast.js.map +1 -1
  164. package/src/mcp-server/option-filter.js +33 -47
  165. package/src/mcp-server/option-filter.js.map +1 -1
  166. package/src/mcp-server/schema-registry.d.ts +9 -3
  167. package/src/mcp-server/schema-registry.js +41 -38
  168. package/src/mcp-server/schema-registry.js.map +1 -1
  169. package/src/mcp-server/schema.d.ts +1 -1
  170. package/src/mcp-server/schema.js +9 -7
  171. package/src/mcp-server/schema.js.map +1 -1
  172. package/src/mcp-server/server.js +24 -24
  173. package/src/mcp-server/server.js.map +1 -1
  174. package/src/mcp-server/tools/add-to-existing-project.d.ts +12 -0
  175. package/src/mcp-server/tools/add-to-existing-project.js +36 -0
  176. package/src/mcp-server/tools/add-to-existing-project.js.map +1 -0
  177. package/src/mcp-server/tools/create-workspace-command.js +23 -24
  178. package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
  179. package/src/mcp-server/tools/general-guidance.d.ts +1 -1
  180. package/src/mcp-server/tools/general-guidance.js +55 -32
  181. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  182. package/src/mcp-server/tools/generator-guide.js +29 -37
  183. package/src/mcp-server/tools/generator-guide.js.map +1 -1
  184. package/src/mcp-server/tools/list-generators.js +19 -25
  185. package/src/mcp-server/tools/list-generators.js.map +1 -1
  186. package/src/mcp-server/tools/upgrade-workspace.d.ts +11 -0
  187. package/src/mcp-server/tools/upgrade-workspace.js +32 -0
  188. package/src/mcp-server/tools/upgrade-workspace.js.map +1 -0
  189. package/src/migrations/latest/py-agent-a2a-httpx-client-per-call/metadata.json +3 -0
  190. package/src/migrations/latest/py-agent-a2a-httpx-client-per-call/migration.d.ts +6 -0
  191. package/src/migrations/latest/py-agent-a2a-httpx-client-per-call/migration.js +329 -0
  192. package/src/migrations/latest/py-agent-a2a-httpx-client-per-call/migration.js.map +1 -0
  193. package/src/migrations/latest/py-agent-a2a-lifespan-construction/metadata.json +3 -0
  194. package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.d.ts +6 -0
  195. package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.js +234 -0
  196. package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.js.map +1 -0
  197. package/src/migrations/latest/smithy-server-package-rename/metadata.json +3 -0
  198. package/src/migrations/latest/smithy-server-package-rename/migration.d.ts +6 -0
  199. package/src/migrations/latest/smithy-server-package-rename/migration.js +123 -0
  200. package/src/migrations/latest/smithy-server-package-rename/migration.js.map +1 -0
  201. package/src/migrations/latest/translate-script-whole-file-writes/files/build-system-prompt.ts.fixture +23 -0
  202. package/src/migrations/latest/translate-script-whole-file-writes/files/build-user-prompt.ts.fixture +96 -0
  203. package/src/migrations/latest/translate-script-whole-file-writes/files/config-path.ts.fixture +1 -0
  204. package/src/migrations/latest/translate-script-whole-file-writes/files/file-to-translate.ts.fixture +10 -0
  205. package/src/migrations/latest/translate-script-whole-file-writes/files/get-files-to-translate.ts.fixture +96 -0
  206. package/src/migrations/latest/translate-script-whole-file-writes/files/header.ts.fixture +15 -0
  207. package/src/migrations/latest/translate-script-whole-file-writes/files/log.ts.fixture +18 -0
  208. package/src/migrations/latest/translate-script-whole-file-writes/files/main-call.ts.fixture +6 -0
  209. package/src/migrations/latest/translate-script-whole-file-writes/files/main.ts.fixture +79 -0
  210. package/src/migrations/latest/translate-script-whole-file-writes/files/project-root.ts.fixture +1 -0
  211. package/src/migrations/latest/translate-script-whole-file-writes/files/run-with-concurrency.ts.fixture +57 -0
  212. package/src/migrations/latest/translate-script-whole-file-writes/files/scripts-dir.ts.fixture +1 -0
  213. package/src/migrations/latest/translate-script-whole-file-writes/files/translate-file-for-language.ts.fixture +61 -0
  214. package/src/migrations/latest/translate-script-whole-file-writes/grit/already-migrated.grit +1 -0
  215. package/src/migrations/latest/translate-script-whole-file-writes/grit/build-system-prompt.grit +6 -0
  216. package/src/migrations/latest/translate-script-whole-file-writes/grit/build-user-prompt.grit +6 -0
  217. package/src/migrations/latest/translate-script-whole-file-writes/grit/config-path.grit +1 -0
  218. package/src/migrations/latest/translate-script-whole-file-writes/grit/file-to-translate.grit +11 -0
  219. package/src/migrations/latest/translate-script-whole-file-writes/grit/get-files-to-translate.grit +7 -0
  220. package/src/migrations/latest/translate-script-whole-file-writes/grit/log.grit +3 -0
  221. package/src/migrations/latest/translate-script-whole-file-writes/grit/main-call.grit +1 -0
  222. package/src/migrations/latest/translate-script-whole-file-writes/grit/main.grit +8 -0
  223. package/src/migrations/latest/translate-script-whole-file-writes/grit/project-root.grit +1 -0
  224. package/src/migrations/latest/translate-script-whole-file-writes/grit/run-with-concurrency.grit +6 -0
  225. package/src/migrations/latest/translate-script-whole-file-writes/grit/translate-file-for-language.grit +6 -0
  226. package/src/migrations/latest/translate-script-whole-file-writes/metadata.json +3 -0
  227. package/src/migrations/latest/translate-script-whole-file-writes/migration.d.ts +2 -0
  228. package/src/migrations/latest/translate-script-whole-file-writes/migration.js +103 -0
  229. package/src/migrations/latest/translate-script-whole-file-writes/migration.js.map +1 -0
  230. package/src/migrations/latest/translate-script-whole-file-writes/test-fixtures/released-script-first.ts.fixture +430 -0
  231. package/src/migrations/latest/translate-script-whole-file-writes/test-fixtures/released-script.ts.fixture +431 -0
  232. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/metadata.json +3 -0
  233. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.d.ts +6 -0
  234. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.js +65 -0
  235. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.js.map +1 -0
  236. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/metadata.json +3 -0
  237. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.d.ts +6 -0
  238. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.js +108 -0
  239. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.js.map +1 -0
  240. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/metadata.json +3 -0
  241. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.d.ts +6 -0
  242. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.js +128 -0
  243. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.js.map +1 -0
  244. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/metadata.json +3 -0
  245. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.d.ts +6 -0
  246. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.js +215 -0
  247. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.js.map +1 -0
  248. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/metadata.json +3 -0
  249. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.d.ts +6 -0
  250. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.js +93 -0
  251. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
  252. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/metadata.json +3 -0
  253. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.d.ts +96 -0
  254. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.js +670 -0
  255. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.js.map +1 -0
  256. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/metadata.json +3 -0
  257. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.d.ts +6 -0
  258. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.js +89 -0
  259. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.js.map +1 -0
  260. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/metadata.json +3 -0
  261. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.d.ts +6 -0
  262. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.js +449 -0
  263. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.js.map +1 -0
  264. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/metadata.json +3 -0
  265. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.d.ts +6 -0
  266. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.js +78 -0
  267. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.js.map +1 -0
  268. package/src/{smithy/project/files/build.Dockerfile.template → migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/rc57-service.Dockerfile.fixture} +1 -4
  269. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/__snapshots__/migration.spec.ts.snap +223 -0
  270. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/metadata.json +3 -0
  271. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.d.ts +6 -0
  272. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.js +217 -0
  273. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.js.map +1 -0
  274. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/__snapshots__/migration.spec.ts.snap +149 -0
  275. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/metadata.json +3 -0
  276. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.d.ts +6 -0
  277. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.js +195 -0
  278. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.js.map +1 -0
  279. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/__snapshots__/migration.spec.ts.snap +57 -0
  280. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/metadata.json +3 -0
  281. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.d.ts +6 -0
  282. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.js +77 -0
  283. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.js.map +1 -0
  284. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/__snapshots__/migration.spec.ts.snap +48 -0
  285. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/metadata.json +3 -0
  286. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.d.ts +6 -0
  287. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.js +91 -0
  288. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.js.map +1 -0
  289. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/metadata.json +3 -0
  290. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.d.ts +6 -0
  291. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.js +412 -0
  292. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.js.map +1 -0
  293. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/metadata.json +3 -0
  294. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.d.ts +6 -0
  295. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.js +33 -0
  296. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.js.map +1 -0
  297. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/metadata.json +3 -0
  298. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.d.ts +6 -0
  299. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.js +83 -0
  300. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.js.map +1 -0
  301. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/legacy-service.Dockerfile.fixture +95 -0
  302. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/metadata.json +3 -0
  303. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.d.ts +6 -0
  304. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.js +154 -0
  305. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.js.map +1 -0
  306. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/metadata.json +3 -0
  307. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.d.ts +6 -0
  308. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.js +71 -0
  309. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.js.map +1 -0
  310. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/metadata.json +3 -0
  311. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.d.ts +6 -0
  312. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.js +57 -0
  313. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.js.map +1 -0
  314. package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
  315. package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
  316. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +298 -74
  317. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +748 -103
  318. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +230 -37
  319. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +249 -52
  320. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5535 -0
  321. package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
  322. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +305 -71
  323. package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +298 -0
  324. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +353 -82
  325. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +176 -55
  326. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +100 -24
  327. package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
  328. package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
  329. package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
  330. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +200 -48
  331. package/src/open-api/ts-client/files/client.gen.ts.template +358 -24
  332. package/src/open-api/ts-client/files/types.gen.ts.template +6 -4
  333. package/src/open-api/ts-client/generator.js +41 -26
  334. package/src/open-api/ts-client/generator.js.map +1 -1
  335. package/src/open-api/ts-client/schema.d.js +6 -0
  336. package/src/open-api/ts-client/schema.d.js.map +1 -0
  337. package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +7 -2
  338. package/src/open-api/ts-hooks/generator.js +17 -21
  339. package/src/open-api/ts-hooks/generator.js.map +1 -1
  340. package/src/open-api/ts-hooks/generator.spec.tsx +70 -0
  341. package/src/open-api/ts-hooks/schema.d.js +6 -0
  342. package/src/open-api/ts-hooks/schema.d.js.map +1 -0
  343. package/src/open-api/ts-metadata/generator.js +12 -20
  344. package/src/open-api/ts-metadata/generator.js.map +1 -1
  345. package/src/open-api/ts-metadata/schema.d.js +6 -0
  346. package/src/open-api/ts-metadata/schema.d.js.map +1 -0
  347. package/src/open-api/utils/codegen-data/languages.d.ts +0 -6
  348. package/src/open-api/utils/codegen-data/languages.js +59 -66
  349. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  350. package/src/open-api/utils/codegen-data/types.d.ts +255 -10
  351. package/src/open-api/utils/codegen-data/types.js +54 -30
  352. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  353. package/src/open-api/utils/codegen-data.d.ts +2 -2
  354. package/src/open-api/utils/codegen-data.js +494 -674
  355. package/src/open-api/utils/codegen-data.js.map +1 -1
  356. package/src/open-api/utils/normalise.js +437 -246
  357. package/src/open-api/utils/normalise.js.map +1 -1
  358. package/src/open-api/utils/parse.js +8 -14
  359. package/src/open-api/utils/parse.js.map +1 -1
  360. package/src/open-api/utils/parser.d.ts +55 -0
  361. package/src/open-api/utils/parser.js +787 -0
  362. package/src/open-api/utils/parser.js.map +1 -0
  363. package/src/open-api/utils/refs.js +12 -22
  364. package/src/open-api/utils/refs.js.map +1 -1
  365. package/src/open-api/utils/types.d.ts +18 -0
  366. package/src/open-api/utils/types.js +5 -2
  367. package/src/open-api/utils/types.js.map +1 -1
  368. package/src/preset/__snapshots__/generator.spec.ts.snap +101 -20
  369. package/src/preset/generator.d.ts +14 -1
  370. package/src/preset/generator.js +76 -151
  371. package/src/preset/generator.js.map +1 -1
  372. package/src/preset/schema.d.js +6 -0
  373. package/src/preset/schema.d.js.map +1 -0
  374. package/src/preset/schema.d.ts +4 -1
  375. package/src/preset/schema.json +16 -5
  376. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +326 -0
  377. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +738 -0
  378. package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +191 -315
  379. package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +231 -0
  380. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +29 -0
  381. package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +29 -0
  382. package/src/py/agent/a2a-connection/generator.d.ts +24 -0
  383. package/src/py/agent/a2a-connection/generator.js +145 -88
  384. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  385. package/src/py/agent/a2a-connection/schema.d.js +8 -0
  386. package/src/py/agent/a2a-connection/schema.d.js.map +1 -0
  387. package/src/py/agent/a2a-connection/schema.d.ts +1 -0
  388. package/src/py/agent/a2a-connection/schema.json +5 -0
  389. package/src/py/agent/files/deploy/Dockerfile.template +8 -1
  390. package/src/py/agent/files/langchain/a2a/main.py.template +94 -0
  391. package/src/py/agent/files/langchain/ag-ui/main.py.template +87 -0
  392. package/src/py/agent/files/langchain/common/agent.py.template +30 -0
  393. package/src/py/agent/files/{http → langchain/http}/init.py.template +17 -25
  394. package/src/py/agent/files/langchain/http/main.py.template +81 -0
  395. package/src/py/agent/files/{a2a → strands/a2a}/main.py.template +33 -15
  396. package/src/py/agent/files/strands/ag-ui/main.py.template +89 -0
  397. package/src/py/agent/files/{common → strands/common}/agent.py.template +2 -0
  398. package/src/py/agent/files/strands/http/init.py.template +97 -0
  399. package/src/py/agent/files/{http → strands/http}/main.py.template +4 -13
  400. package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
  401. package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
  402. package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
  403. package/src/py/agent/gateway-connection/generator.d.ts +33 -0
  404. package/src/py/agent/gateway-connection/generator.js +153 -0
  405. package/src/py/agent/gateway-connection/generator.js.map +1 -0
  406. package/src/py/agent/gateway-connection/schema.d.js +6 -0
  407. package/src/py/agent/gateway-connection/schema.d.js.map +1 -0
  408. package/src/py/agent/gateway-connection/schema.d.ts +13 -0
  409. package/src/py/agent/gateway-connection/schema.json +31 -0
  410. package/src/py/agent/generator.d.ts +154 -1
  411. package/src/py/agent/generator.js +396 -197
  412. package/src/py/agent/generator.js.map +1 -1
  413. package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +154 -89
  414. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +31 -0
  415. package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +31 -0
  416. package/src/py/agent/mcp-connection/generator.d.ts +23 -0
  417. package/src/py/agent/mcp-connection/generator.js +103 -130
  418. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  419. package/src/py/agent/mcp-connection/schema.d.js +8 -0
  420. package/src/py/agent/mcp-connection/schema.d.js.map +1 -0
  421. package/src/py/agent/mcp-connection/schema.d.ts +1 -0
  422. package/src/py/agent/mcp-connection/schema.json +5 -0
  423. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +17 -19
  424. package/src/py/agent/react-connection/generator.d.ts +150 -1
  425. package/src/py/agent/react-connection/generator.js +105 -65
  426. package/src/py/agent/react-connection/generator.js.map +1 -1
  427. package/src/py/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +4 -4
  428. package/src/py/agent/react-connection/local-dev.js +36 -0
  429. package/src/py/agent/react-connection/local-dev.js.map +1 -0
  430. package/src/py/agent/react-connection/schema.d.js +8 -0
  431. package/src/py/agent/react-connection/schema.d.js.map +1 -0
  432. package/src/py/agent/react-connection/schema.d.ts +1 -0
  433. package/src/py/agent/react-connection/schema.json +5 -0
  434. package/src/py/agent/schema.d.js +6 -0
  435. package/src/py/agent/schema.d.js.map +1 -0
  436. package/src/py/agent/schema.d.ts +5 -1
  437. package/src/py/agent/schema.json +15 -1
  438. package/src/py/api/generator.js +12 -11
  439. package/src/py/api/generator.js.map +1 -1
  440. package/src/py/api/schema.d.js +6 -0
  441. package/src/py/api/schema.d.js.map +1 -0
  442. package/src/py/api/schema.d.ts +1 -0
  443. package/src/py/api/schema.json +5 -0
  444. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1520 -0
  445. package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +63 -0
  446. package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
  447. package/src/py/dynamodb/agent-connection/generator.js +45 -0
  448. package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
  449. package/src/py/dynamodb/agent-connection/schema.d.js +8 -0
  450. package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -0
  451. package/src/py/dynamodb/agent-connection/schema.d.ts +15 -0
  452. package/src/py/dynamodb/agent-connection/schema.json +27 -0
  453. package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +32 -0
  454. package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
  455. package/src/py/dynamodb/fast-api-connection/generator.js +39 -0
  456. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
  457. package/src/py/dynamodb/fast-api-connection/schema.d.js +8 -0
  458. package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -0
  459. package/src/py/dynamodb/fast-api-connection/schema.d.ts +13 -0
  460. package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
  461. package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
  462. package/src/py/dynamodb/files/__name__/client.py.template +39 -0
  463. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
  464. package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
  465. package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
  466. package/src/py/dynamodb/files/config.json.template +24 -0
  467. package/src/py/dynamodb/generator.d.ts +39 -0
  468. package/src/py/dynamodb/generator.js +130 -0
  469. package/src/py/dynamodb/generator.js.map +1 -0
  470. package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +63 -0
  471. package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  472. package/src/py/dynamodb/mcp-server-connection/generator.js +45 -0
  473. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
  474. package/src/py/dynamodb/mcp-server-connection/schema.d.js +8 -0
  475. package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  476. package/src/py/dynamodb/mcp-server-connection/schema.d.ts +15 -0
  477. package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
  478. package/src/py/dynamodb/schema.d.js +6 -0
  479. package/src/py/dynamodb/schema.d.js.map +1 -0
  480. package/src/py/dynamodb/schema.d.ts +16 -0
  481. package/src/py/dynamodb/schema.json +76 -0
  482. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +240 -4693
  483. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +5409 -0
  484. package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
  485. package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
  486. package/src/py/fast-api/generator.d.ts +72 -0
  487. package/src/py/fast-api/generator.js +134 -95
  488. package/src/py/fast-api/generator.js.map +1 -1
  489. package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +4 -3
  490. package/src/py/fast-api/react/generator.d.ts +16 -1
  491. package/src/py/fast-api/react/generator.js +38 -26
  492. package/src/py/fast-api/react/generator.js.map +1 -1
  493. package/src/py/fast-api/react/open-api.js +31 -29
  494. package/src/py/fast-api/react/open-api.js.map +1 -1
  495. package/src/py/fast-api/react/schema.d.js +6 -0
  496. package/src/py/fast-api/react/schema.d.js.map +1 -0
  497. package/src/py/fast-api/react/schema.d.ts +1 -0
  498. package/src/py/fast-api/react/schema.json +5 -0
  499. package/src/py/fast-api/schema.d.js +6 -0
  500. package/src/py/fast-api/schema.d.js.map +1 -0
  501. package/src/py/fast-api/schema.d.ts +1 -0
  502. package/src/py/fast-api/schema.json +6 -0
  503. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  504. package/src/py/lambda-function/generator.d.ts +21 -0
  505. package/src/py/lambda-function/generator.js +82 -62
  506. package/src/py/lambda-function/generator.js.map +1 -1
  507. package/src/py/lambda-function/schema.d.js +6 -0
  508. package/src/py/lambda-function/schema.d.js.map +1 -0
  509. package/src/py/lambda-function/schema.d.ts +1 -0
  510. package/src/py/lambda-function/schema.json +5 -0
  511. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +221 -21
  512. package/src/py/mcp-server/files/deploy/Dockerfile.template +8 -1
  513. package/src/py/mcp-server/generator.d.ts +68 -0
  514. package/src/py/mcp-server/generator.js +204 -131
  515. package/src/py/mcp-server/generator.js.map +1 -1
  516. package/src/py/mcp-server/schema.d.js +6 -0
  517. package/src/py/mcp-server/schema.d.js.map +1 -0
  518. package/src/py/mcp-server/schema.d.ts +1 -0
  519. package/src/py/mcp-server/schema.json +6 -0
  520. package/src/py/project/generator.d.ts +27 -1
  521. package/src/py/project/generator.js +248 -130
  522. package/src/py/project/generator.js.map +1 -1
  523. package/src/py/project/schema.d.js +6 -0
  524. package/src/py/project/schema.d.js.map +1 -0
  525. package/src/py/project/schema.d.ts +1 -0
  526. package/src/py/project/schema.json +5 -0
  527. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2070 -0
  528. package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +123 -0
  529. package/src/py/rdb/agent-connection/generator.d.ts +10 -0
  530. package/src/py/rdb/agent-connection/generator.js +52 -0
  531. package/src/py/rdb/agent-connection/generator.js.map +1 -0
  532. package/src/py/rdb/agent-connection/schema.d.js +8 -0
  533. package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
  534. package/src/py/rdb/agent-connection/schema.d.ts +15 -0
  535. package/src/py/rdb/agent-connection/schema.json +27 -0
  536. package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +51 -0
  537. package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
  538. package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
  539. package/src/py/rdb/fast-api-connection/generator.js +56 -0
  540. package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
  541. package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
  542. package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
  543. package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
  544. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  545. package/src/py/rdb/files/Dockerfile.create-db-user.template +14 -0
  546. package/src/py/rdb/files/Dockerfile.migration.template +14 -0
  547. package/src/py/rdb/files/__name__/__init__.py.template +3 -0
  548. package/src/py/rdb/files/__name__/connection.py.template +55 -0
  549. package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
  550. package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
  551. package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
  552. package/src/py/rdb/files/__name__/models/example.py.template +8 -0
  553. package/src/py/rdb/files/__name__/utils.py.template +104 -0
  554. package/src/py/rdb/files/alembic.ini.template +38 -0
  555. package/src/py/rdb/files/config.json.template +14 -0
  556. package/src/py/rdb/files/migrations/env.py.template +80 -0
  557. package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
  558. package/src/py/rdb/generator.d.ts +103 -0
  559. package/src/py/rdb/generator.js +328 -0
  560. package/src/py/rdb/generator.js.map +1 -0
  561. package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +119 -0
  562. package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
  563. package/src/py/rdb/mcp-server-connection/generator.js +52 -0
  564. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
  565. package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
  566. package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
  567. package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
  568. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  569. package/src/py/rdb/schema.d.js +6 -0
  570. package/src/py/rdb/schema.d.js.map +1 -0
  571. package/src/py/rdb/schema.d.ts +16 -0
  572. package/src/py/rdb/schema.json +78 -0
  573. package/src/py/rdb/utils.d.ts +6 -0
  574. package/src/py/rdb/utils.js +16 -0
  575. package/src/py/rdb/utils.js.map +1 -0
  576. package/src/sdk/agentcore-gateway.d.ts +6 -0
  577. package/src/sdk/agentcore-gateway.js +7 -0
  578. package/src/sdk/agentcore-gateway.js.map +1 -0
  579. package/src/sdk/connection.d.ts +6 -0
  580. package/src/sdk/connection.js +6 -0
  581. package/src/sdk/connection.js.map +1 -0
  582. package/src/sdk/license.d.ts +8 -0
  583. package/src/sdk/license.js +7 -0
  584. package/src/sdk/license.js.map +1 -0
  585. package/src/sdk/open-api.d.ts +10 -0
  586. package/src/sdk/open-api.js +8 -0
  587. package/src/sdk/open-api.js.map +1 -0
  588. package/src/sdk/py.d.ts +18 -0
  589. package/src/sdk/py.js +12 -0
  590. package/src/sdk/py.js.map +1 -0
  591. package/src/sdk/terraform.d.ts +6 -0
  592. package/src/sdk/terraform.js +7 -0
  593. package/src/sdk/terraform.js.map +1 -0
  594. package/src/sdk/ts.d.ts +39 -0
  595. package/src/sdk/ts.js +41 -0
  596. package/src/sdk/ts.js.map +1 -0
  597. package/{sdk/utils/format.d.ts → src/sdk/utils/ast.d.ts} +1 -1
  598. package/src/sdk/utils/ast.js +6 -0
  599. package/src/sdk/utils/ast.js.map +1 -0
  600. package/{sdk/utils/ast.d.ts → src/sdk/utils/format.d.ts} +1 -2
  601. package/src/sdk/utils/format.js +6 -0
  602. package/src/sdk/utils/format.js.map +1 -0
  603. package/{sdk → src/sdk}/utils/test.d.ts +1 -1
  604. package/src/sdk/utils/test.js +6 -0
  605. package/src/sdk/utils/test.js.map +1 -0
  606. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +245 -242
  607. package/src/smithy/project/files/{smithy-build.json.template → service/smithy-build.json.template} +5 -5
  608. package/src/smithy/project/files/{src → service/src}/operations/echo.smithy.template +1 -0
  609. package/src/smithy/project/files/shapes/smithy-build.json.template +7 -0
  610. package/src/smithy/project/files/shapes/src/main.smithy.template +11 -0
  611. package/src/smithy/project/files/ssdk-bundle/ssdk.rolldown.config.mjs.template +52 -0
  612. package/src/smithy/project/generator.d.ts +90 -0
  613. package/src/smithy/project/generator.js +223 -56
  614. package/src/smithy/project/generator.js.map +1 -1
  615. package/src/smithy/project/schema.d.js +6 -0
  616. package/src/smithy/project/schema.d.js.map +1 -0
  617. package/src/smithy/project/schema.d.ts +2 -0
  618. package/src/smithy/project/schema.json +28 -1
  619. package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
  620. package/src/smithy/react-connection/generator.d.ts +15 -0
  621. package/src/smithy/react-connection/generator.js +54 -48
  622. package/src/smithy/react-connection/generator.js.map +1 -1
  623. package/src/smithy/react-connection/schema.d.js +6 -0
  624. package/src/smithy/react-connection/schema.d.js.map +1 -0
  625. package/src/smithy/react-connection/schema.d.ts +1 -0
  626. package/src/smithy/react-connection/schema.json +5 -0
  627. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +871 -109
  628. package/src/smithy/ts/api/files/handler.ts.template +3 -3
  629. package/src/smithy/ts/api/files/local-server.ts.template +3 -3
  630. package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
  631. package/src/smithy/ts/api/files/service.ts.template +3 -3
  632. package/src/smithy/ts/api/generator.d.ts +88 -0
  633. package/src/smithy/ts/api/generator.js +187 -114
  634. package/src/smithy/ts/api/generator.js.map +1 -1
  635. package/src/smithy/ts/api/schema.d.js +6 -0
  636. package/src/smithy/ts/api/schema.d.js.map +1 -0
  637. package/src/smithy/ts/api/schema.d.ts +1 -0
  638. package/src/smithy/ts/api/schema.json +6 -0
  639. package/src/terraform/project/files/application/scripts/bootstrap.ts.template +40 -1
  640. package/src/terraform/project/files/application/src/main.tf.template +6 -1
  641. package/src/terraform/project/files/application/src/providers.tf.template +1 -1
  642. package/src/terraform/project/generator.d.ts +50 -0
  643. package/src/terraform/project/generator.js +212 -111
  644. package/src/terraform/project/generator.js.map +1 -1
  645. package/src/terraform/project/schema.d.js +9 -0
  646. package/src/terraform/project/schema.d.js.map +1 -0
  647. package/src/terraform/project/schema.d.ts +1 -0
  648. package/src/terraform/project/schema.json +5 -0
  649. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +1182 -184
  650. package/src/trpc/backend/files/src/client/index.ts.template +1 -1
  651. package/src/trpc/backend/files/src/handler.ts.template +1 -1
  652. package/src/trpc/backend/files/src/index.ts.template +5 -5
  653. package/src/trpc/backend/files/src/init.ts.template +1 -1
  654. package/src/trpc/backend/files/src/local-server.ts.template +1 -1
  655. package/src/trpc/backend/files/src/middleware/index.ts.template +7 -7
  656. package/src/trpc/backend/files/src/procedures/echo.ts.template +3 -3
  657. package/src/trpc/backend/files/src/router.ts.template +2 -2
  658. package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
  659. package/src/trpc/backend/files/src/schema/index.ts.template +1 -1
  660. package/src/trpc/backend/generator.d.ts +90 -1
  661. package/src/trpc/backend/generator.js +177 -100
  662. package/src/trpc/backend/generator.js.map +1 -1
  663. package/src/trpc/backend/schema.d.js +6 -0
  664. package/src/trpc/backend/schema.d.js.map +1 -0
  665. package/src/trpc/backend/schema.d.ts +1 -0
  666. package/src/trpc/backend/schema.json +6 -0
  667. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +4 -4
  668. package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
  669. package/src/trpc/react/generator.d.ts +38 -1
  670. package/src/trpc/react/generator.js +105 -63
  671. package/src/trpc/react/generator.js.map +1 -1
  672. package/src/trpc/react/schema.d.js +6 -0
  673. package/src/trpc/react/schema.d.js.map +1 -0
  674. package/src/trpc/react/schema.d.ts +1 -0
  675. package/src/trpc/react/schema.json +5 -0
  676. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +1452 -25
  677. package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +258 -0
  678. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
  679. package/src/ts/agent/a2a-connection/generator.d.ts +46 -0
  680. package/src/ts/agent/a2a-connection/generator.js +110 -63
  681. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  682. package/src/ts/agent/a2a-connection/schema.d.js +8 -0
  683. package/src/ts/agent/a2a-connection/schema.d.js.map +1 -0
  684. package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
  685. package/src/ts/agent/a2a-connection/schema.json +5 -0
  686. package/src/ts/agent/files/a2a/index.ts.template +1 -1
  687. package/src/ts/agent/files/ag-ui/index.ts.template +36 -11
  688. package/src/ts/agent/files/common/agent.ts.template +15 -2
  689. package/src/ts/agent/files/common/session.ts.template +43 -0
  690. package/src/ts/agent/files/deploy/Dockerfile.template +13 -2
  691. package/src/ts/agent/files/http/client.ts.template +2 -2
  692. package/src/ts/agent/files/http/index.ts.template +2 -2
  693. package/src/ts/agent/files/http/router.ts.template +5 -5
  694. package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +222 -0
  695. package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
  696. package/src/ts/agent/gateway-connection/generator.d.ts +47 -0
  697. package/src/ts/agent/gateway-connection/generator.js +144 -0
  698. package/src/ts/agent/gateway-connection/generator.js.map +1 -0
  699. package/src/ts/agent/gateway-connection/schema.d.js +6 -0
  700. package/src/ts/agent/gateway-connection/schema.d.js.map +1 -0
  701. package/src/ts/agent/gateway-connection/schema.d.ts +13 -0
  702. package/src/ts/agent/gateway-connection/schema.json +31 -0
  703. package/src/ts/agent/generator.d.ts +205 -0
  704. package/src/ts/agent/generator.js +339 -156
  705. package/src/ts/agent/generator.js.map +1 -1
  706. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +194 -113
  707. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +23 -0
  708. package/src/ts/agent/mcp-connection/generator.d.ts +37 -0
  709. package/src/ts/agent/mcp-connection/generator.js +88 -65
  710. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  711. package/src/ts/agent/mcp-connection/schema.d.js +8 -0
  712. package/src/ts/agent/mcp-connection/schema.d.js.map +1 -0
  713. package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
  714. package/src/ts/agent/mcp-connection/schema.json +5 -0
  715. package/src/ts/agent/react-connection/__snapshots__/generator.spec.ts.snap +8 -4
  716. package/src/ts/agent/react-connection/files/src/components/__agentNameClassName__AgentClientProvider.tsx.template +2 -1
  717. package/src/ts/agent/react-connection/generator.d.ts +202 -1
  718. package/src/ts/agent/react-connection/generator.js +158 -99
  719. package/src/ts/agent/react-connection/generator.js.map +1 -1
  720. package/src/ts/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +2 -2
  721. package/src/ts/agent/react-connection/local-dev.js +17 -0
  722. package/src/ts/agent/react-connection/local-dev.js.map +1 -0
  723. package/src/ts/agent/react-connection/schema.d.js +8 -0
  724. package/src/ts/agent/react-connection/schema.d.js.map +1 -0
  725. package/src/ts/agent/react-connection/schema.d.ts +1 -0
  726. package/src/ts/agent/react-connection/schema.json +5 -0
  727. package/src/ts/agent/schema.d.js +6 -0
  728. package/src/ts/agent/schema.d.js.map +1 -0
  729. package/src/ts/agent/schema.d.ts +4 -0
  730. package/src/ts/agent/schema.json +14 -0
  731. package/src/ts/api/generator.js +16 -16
  732. package/src/ts/api/generator.js.map +1 -1
  733. package/src/ts/api/schema.d.js +6 -0
  734. package/src/ts/api/schema.d.js.map +1 -0
  735. package/src/ts/api/schema.d.ts +1 -0
  736. package/src/ts/api/schema.json +5 -0
  737. package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +28 -14
  738. package/src/ts/astro-docs/files/base/src/content/docs/en/index.mdx.template +2 -2
  739. package/src/ts/astro-docs/files/base/src/content.config.ts.template +4 -4
  740. package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +272 -150
  741. package/src/ts/astro-docs/generator.d.ts +38 -0
  742. package/src/ts/astro-docs/generator.js +126 -61
  743. package/src/ts/astro-docs/generator.js.map +1 -1
  744. package/src/ts/astro-docs/schema.d.js +6 -0
  745. package/src/ts/astro-docs/schema.d.js.map +1 -0
  746. package/src/ts/astro-docs/schema.d.ts +2 -2
  747. package/src/ts/astro-docs/schema.json +3 -3
  748. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +982 -0
  749. package/src/ts/dcr-proxy/generator.d.ts +34 -0
  750. package/src/ts/dcr-proxy/generator.js +115 -0
  751. package/src/ts/dcr-proxy/generator.js.map +1 -0
  752. package/src/ts/dcr-proxy/schema.d.js +6 -0
  753. package/src/ts/dcr-proxy/schema.d.js.map +1 -0
  754. package/src/ts/dcr-proxy/schema.d.ts +13 -0
  755. package/src/ts/dcr-proxy/schema.json +44 -0
  756. package/src/ts/docs/generator.js +10 -10
  757. package/src/ts/docs/generator.js.map +1 -1
  758. package/src/ts/docs/schema.d.js +6 -0
  759. package/src/ts/docs/schema.d.js.map +1 -0
  760. package/src/ts/docs/schema.d.ts +1 -4
  761. package/src/ts/docs/schema.json +3 -3
  762. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +400 -518
  763. package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +23 -5
  764. package/src/ts/dynamodb/agent-connection/generator.js +27 -23
  765. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
  766. package/src/ts/dynamodb/agent-connection/schema.d.js +8 -0
  767. package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -0
  768. package/src/ts/dynamodb/agent-connection/schema.d.ts +1 -0
  769. package/src/ts/dynamodb/agent-connection/schema.json +5 -0
  770. package/src/ts/dynamodb/files/config.json.template +24 -0
  771. package/src/ts/dynamodb/files/src/client.ts.template +30 -11
  772. package/src/ts/dynamodb/files/src/entities/example.ts.template +1 -1
  773. package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -1
  774. package/src/ts/dynamodb/files/src/index.ts.template +2 -11
  775. package/src/ts/dynamodb/generator.d.ts +41 -0
  776. package/src/ts/dynamodb/generator.js +106 -64
  777. package/src/ts/dynamodb/generator.js.map +1 -1
  778. package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +23 -5
  779. package/src/ts/dynamodb/mcp-server-connection/generator.js +27 -23
  780. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
  781. package/src/ts/dynamodb/mcp-server-connection/schema.d.js +8 -0
  782. package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  783. package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +1 -0
  784. package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
  785. package/src/ts/dynamodb/schema.d.js +6 -0
  786. package/src/ts/dynamodb/schema.d.js.map +1 -0
  787. package/src/ts/dynamodb/schema.d.ts +2 -0
  788. package/src/ts/dynamodb/schema.json +26 -2
  789. package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +12 -3
  790. package/src/ts/dynamodb/smithy-connection/generator.js +22 -22
  791. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
  792. package/src/ts/dynamodb/smithy-connection/schema.d.js +8 -0
  793. package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -0
  794. package/src/ts/dynamodb/smithy-connection/schema.d.ts +1 -0
  795. package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
  796. package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +12 -3
  797. package/src/ts/dynamodb/trpc-connection/generator.js +22 -22
  798. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
  799. package/src/ts/dynamodb/trpc-connection/schema.d.js +8 -0
  800. package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -0
  801. package/src/ts/dynamodb/trpc-connection/schema.d.ts +1 -0
  802. package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
  803. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +8 -6
  804. package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
  805. package/src/ts/lambda-function/generator.d.ts +38 -0
  806. package/src/ts/lambda-function/generator.js +98 -65
  807. package/src/ts/lambda-function/generator.js.map +1 -1
  808. package/src/ts/lambda-function/io.js +83 -52
  809. package/src/ts/lambda-function/io.js.map +1 -1
  810. package/src/ts/lambda-function/schema.d.js +6 -0
  811. package/src/ts/lambda-function/schema.d.js.map +1 -0
  812. package/src/ts/lambda-function/schema.d.ts +1 -0
  813. package/src/ts/lambda-function/schema.json +5 -0
  814. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +83 -45
  815. package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +1 -1
  816. package/src/ts/lib/biome.js +71 -35
  817. package/src/ts/lib/biome.js.map +1 -1
  818. package/src/ts/lib/generator.d.ts +7 -0
  819. package/src/ts/lib/generator.js +115 -103
  820. package/src/ts/lib/generator.js.map +1 -1
  821. package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
  822. package/src/ts/lib/schema.d.js +6 -0
  823. package/src/ts/lib/schema.d.js.map +1 -0
  824. package/src/ts/lib/schema.d.ts +1 -1
  825. package/src/ts/lib/schema.json +5 -0
  826. package/src/ts/lib/ts-project-utils.d.ts +13 -1
  827. package/src/ts/lib/ts-project-utils.js +96 -71
  828. package/src/ts/lib/ts-project-utils.js.map +1 -1
  829. package/src/ts/lib/types.d.ts +6 -0
  830. package/src/ts/lib/types.js +5 -2
  831. package/src/ts/lib/types.js.map +1 -1
  832. package/src/ts/lib/vitest.d.ts +10 -1
  833. package/src/ts/lib/vitest.js +54 -26
  834. package/src/ts/lib/vitest.js.map +1 -1
  835. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +221 -44
  836. package/src/ts/mcp-server/files/Dockerfile.template +13 -2
  837. package/src/ts/mcp-server/generator.d.ts +110 -0
  838. package/src/ts/mcp-server/generator.js +231 -148
  839. package/src/ts/mcp-server/generator.js.map +1 -1
  840. package/src/ts/mcp-server/schema.d.js +6 -0
  841. package/src/ts/mcp-server/schema.d.js.map +1 -0
  842. package/src/ts/mcp-server/schema.d.ts +1 -0
  843. package/src/ts/mcp-server/schema.json +6 -0
  844. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +28 -13
  845. package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
  846. package/src/ts/nx-generator/files/common/schema.json.template +5 -0
  847. package/src/ts/nx-generator/files/local/generator.spec.ts.template +1 -1
  848. package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
  849. package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
  850. package/src/ts/nx-generator/generator.d.ts +3 -0
  851. package/src/ts/nx-generator/generator.js +124 -73
  852. package/src/ts/nx-generator/generator.js.map +1 -1
  853. package/src/ts/nx-generator/schema.d.js +6 -0
  854. package/src/ts/nx-generator/schema.d.js.map +1 -0
  855. package/src/ts/nx-generator/schema.d.ts +1 -0
  856. package/src/ts/nx-generator/schema.json +5 -0
  857. package/src/ts/nx-migration/files/migration.spec.ts.template +26 -0
  858. package/src/ts/nx-migration/files/migration.ts.template +65 -0
  859. package/src/ts/nx-migration/files/prompt.md.template +46 -0
  860. package/src/ts/nx-migration/generator.d.ts +27 -0
  861. package/src/ts/nx-migration/generator.js +147 -0
  862. package/src/ts/nx-migration/generator.js.map +1 -0
  863. package/src/ts/nx-migration/schema.d.js +6 -0
  864. package/src/ts/nx-migration/schema.d.js.map +1 -0
  865. package/src/ts/nx-migration/schema.d.ts +13 -0
  866. package/src/ts/nx-migration/schema.json +63 -0
  867. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +36 -25
  868. package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
  869. package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
  870. package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
  871. package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
  872. package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
  873. package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
  874. package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +4 -4
  875. package/src/ts/nx-plugin/generator.d.ts +3 -0
  876. package/src/ts/nx-plugin/generator.js +67 -50
  877. package/src/ts/nx-plugin/generator.js.map +1 -1
  878. package/src/ts/nx-plugin/schema.d.js +9 -0
  879. package/src/ts/nx-plugin/schema.d.js.map +1 -0
  880. package/src/ts/nx-plugin/schema.json +5 -0
  881. package/src/ts/nx-plugin/utils.d.ts +27 -2
  882. package/src/ts/nx-plugin/utils.js +66 -51
  883. package/src/ts/nx-plugin/utils.js.map +1 -1
  884. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +553 -644
  885. package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +16 -6
  886. package/src/ts/rdb/agent-connection/generator.js +44 -39
  887. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  888. package/src/ts/rdb/agent-connection/schema.d.js +8 -0
  889. package/src/ts/rdb/agent-connection/schema.d.js.map +1 -0
  890. package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
  891. package/src/ts/rdb/agent-connection/schema.json +5 -0
  892. package/src/ts/rdb/files/Dockerfile.template +19 -1
  893. package/src/ts/rdb/files/config.json.template +14 -0
  894. package/src/ts/rdb/files/prisma.config.ts.template +6 -5
  895. package/src/ts/rdb/files/src/create-db-user-handler.ts.template +9 -11
  896. package/src/ts/rdb/files/src/index.ts.template +1 -2
  897. package/src/ts/rdb/files/src/migration-handler.ts.template +5 -30
  898. package/src/ts/rdb/files/src/prisma.ts.template +33 -25
  899. package/src/ts/rdb/files/src/utils.ts.template +3 -0
  900. package/src/ts/rdb/generator.d.ts +117 -4
  901. package/src/ts/rdb/generator.js +257 -138
  902. package/src/ts/rdb/generator.js.map +1 -1
  903. package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +16 -6
  904. package/src/ts/rdb/mcp-server-connection/generator.js +42 -37
  905. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  906. package/src/ts/rdb/mcp-server-connection/schema.d.js +8 -0
  907. package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -0
  908. package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
  909. package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
  910. package/src/ts/rdb/schema.d.js +6 -0
  911. package/src/ts/rdb/schema.d.js.map +1 -0
  912. package/src/ts/rdb/schema.d.ts +1 -0
  913. package/src/ts/rdb/schema.json +7 -1
  914. package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +18 -9
  915. package/src/ts/rdb/smithy-connection/generator.js +48 -43
  916. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  917. package/src/ts/rdb/smithy-connection/schema.d.js +8 -0
  918. package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -0
  919. package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
  920. package/src/ts/rdb/smithy-connection/schema.json +5 -0
  921. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +12 -3
  922. package/src/ts/rdb/trpc-connection/generator.js +37 -31
  923. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  924. package/src/ts/rdb/trpc-connection/schema.d.js +8 -0
  925. package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -0
  926. package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
  927. package/src/ts/rdb/trpc-connection/schema.json +5 -0
  928. package/src/ts/rdb/utils.js +9 -11
  929. package/src/ts/rdb/utils.js.map +1 -1
  930. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +17 -16
  931. package/src/ts/react-website/agui/generator.d.ts +97 -0
  932. package/src/ts/react-website/agui/generator.js +114 -67
  933. package/src/ts/react-website/agui/generator.js.map +1 -1
  934. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +1391 -644
  935. package/src/ts/react-website/app/files/app/common/README.md.template +1 -1
  936. package/src/ts/react-website/app/generator.d.ts +142 -2
  937. package/src/ts/react-website/app/generator.js +333 -209
  938. package/src/ts/react-website/app/generator.js.map +1 -1
  939. package/src/ts/react-website/app/schema.d.js +6 -0
  940. package/src/ts/react-website/app/schema.d.js.map +1 -0
  941. package/src/ts/react-website/app/schema.d.ts +1 -1
  942. package/src/ts/react-website/app/schema.json +12 -6
  943. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +161 -26
  944. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +48 -12
  945. package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
  946. package/src/ts/react-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +2 -2
  947. package/src/ts/react-website/cognito-auth/generator.d.ts +25 -1
  948. package/src/ts/react-website/cognito-auth/generator.js +79 -64
  949. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  950. package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +3 -1
  951. package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
  952. package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
  953. package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
  954. package/src/ts/react-website/cognito-auth/schema.d.js +6 -0
  955. package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -0
  956. package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
  957. package/src/ts/react-website/cognito-auth/schema.json +5 -0
  958. package/src/ts/react-website/cognito-auth/utils.js +34 -32
  959. package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
  960. package/src/ts/react-website/runtime-config/__snapshots__/generator.spec.ts.snap +2 -2
  961. package/src/ts/react-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +2 -2
  962. package/src/ts/react-website/runtime-config/generator.js +29 -31
  963. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  964. package/src/ts/react-website/runtime-config/schema.d.js +6 -0
  965. package/src/ts/react-website/runtime-config/schema.d.js.map +1 -0
  966. package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
  967. package/src/ts/react-website/runtime-config/schema.json +5 -0
  968. package/src/ts/sync/generator.js +137 -60
  969. package/src/ts/sync/generator.js.map +1 -1
  970. package/src/ts/website/app/generator.js +10 -10
  971. package/src/ts/website/app/generator.js.map +1 -1
  972. package/src/ts/website/app/schema.d.js +6 -0
  973. package/src/ts/website/app/schema.d.js.map +1 -0
  974. package/src/ts/website/app/schema.d.ts +1 -1
  975. package/src/ts/website/app/schema.json +11 -6
  976. package/src/ts/website/auth/generator.d.ts +1 -1
  977. package/src/ts/website/auth/generator.js +11 -10
  978. package/src/ts/website/auth/generator.js.map +1 -1
  979. package/src/ts/website/auth/schema.d.js +6 -0
  980. package/src/ts/website/auth/schema.d.js.map +1 -0
  981. package/src/ts/website/auth/schema.d.ts +1 -0
  982. package/src/ts/website/auth/schema.json +5 -0
  983. package/src/utils/__snapshots__/shared-constructs.spec.ts.snap +21 -0
  984. package/src/utils/add-dependencies.d.ts +38 -0
  985. package/src/utils/add-dependencies.js +83 -0
  986. package/src/utils/add-dependencies.js.map +1 -0
  987. package/src/utils/agent-chat/agent-chat.d.ts +31 -0
  988. package/src/utils/agent-chat/agent-chat.js +31 -0
  989. package/src/utils/agent-chat/agent-chat.js.map +1 -0
  990. package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
  991. package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
  992. package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
  993. package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
  994. package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
  995. package/src/utils/agent-connection/agent-connection.d.ts +139 -26
  996. package/src/utils/agent-connection/agent-connection.js +500 -103
  997. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  998. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
  999. package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
  1000. package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
  1001. package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
  1002. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
  1003. package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +33 -33
  1004. package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
  1005. package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
  1006. package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +47 -0
  1007. package/src/utils/agent-connection/files/core-strands/base/tool-errors-strands.ts.template +29 -0
  1008. 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
  1009. package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
  1010. package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
  1011. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
  1012. package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
  1013. package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
  1014. package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
  1015. package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +105 -0
  1016. package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
  1017. package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
  1018. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
  1019. package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +6 -18
  1020. package/src/utils/agent-connection/files/py-core-runtime-config/session_context.py.template +2 -2
  1021. package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
  1022. package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +111 -0
  1023. package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
  1024. 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} +2 -2
  1025. package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
  1026. package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
  1027. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +79 -0
  1028. package/src/utils/agent-core-constructs/agent-core-constructs.js +212 -38
  1029. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  1030. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +170 -6
  1031. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +87 -0
  1032. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.ts.template +366 -0
  1033. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +624 -0
  1034. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
  1035. package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +212 -1
  1036. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +521 -0
  1037. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
  1038. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.tf.template +282 -0
  1039. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +159 -13
  1040. package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
  1041. package/src/utils/api-constructs/api-constructs.d.ts +30 -2
  1042. package/src/utils/api-constructs/api-constructs.js +82 -32
  1043. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  1044. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +20 -15
  1045. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +24 -16
  1046. package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +26 -9
  1047. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +70 -0
  1048. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +82 -0
  1049. package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +56 -17
  1050. package/src/utils/api-constructs/files/cdk/core/api/trpc/trpc-utils.ts.template +1 -1
  1051. package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
  1052. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +101 -12
  1053. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +194 -8
  1054. package/src/utils/api-constructs/files/terraform/core/api/http/http-api/http-api.tf.template +1 -1
  1055. package/src/utils/api-constructs/files/terraform/core/api/rest/api-gateway-account/api-gateway-account.tf.template +83 -0
  1056. package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +5 -11
  1057. package/src/utils/api-constructs/open-api-metadata.js +22 -22
  1058. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  1059. package/src/utils/ast/website.js +18 -20
  1060. package/src/utils/ast/website.js.map +1 -1
  1061. package/src/utils/ast.d.ts +9 -0
  1062. package/src/utils/ast.js +125 -86
  1063. package/src/utils/ast.js.map +1 -1
  1064. package/src/utils/base-tsconfig.d.ts +30 -0
  1065. package/src/utils/base-tsconfig.js +32 -0
  1066. package/src/utils/base-tsconfig.js.map +1 -0
  1067. package/src/utils/bundle/bundle.d.ts +6 -1
  1068. package/src/utils/bundle/bundle.js +58 -48
  1069. package/src/utils/bundle/bundle.js.map +1 -1
  1070. package/src/utils/commands.d.ts +14 -3
  1071. package/src/utils/commands.js +83 -28
  1072. package/src/utils/commands.js.map +1 -1
  1073. package/src/utils/config/index.d.ts +18 -2
  1074. package/src/utils/config/index.js +5 -4
  1075. package/src/utils/config/index.js.map +1 -1
  1076. package/src/utils/config/utils.d.ts +8 -2
  1077. package/src/utils/config/utils.js +56 -59
  1078. package/src/utils/config/utils.js.map +1 -1
  1079. package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +16 -3
  1080. package/src/utils/connection/open-api/react.d.ts +31 -5
  1081. package/src/utils/connection/open-api/react.js +106 -76
  1082. package/src/utils/connection/open-api/react.js.map +1 -1
  1083. package/src/utils/containers.js +22 -23
  1084. package/src/utils/containers.js.map +1 -1
  1085. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.d.ts +38 -0
  1086. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js +93 -0
  1087. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js.map +1 -0
  1088. package/src/utils/dcr-proxy-constructs/files/cdk/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.ts.template +227 -0
  1089. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorization-server-metadata.ts.template +39 -0
  1090. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorize.ts.template +26 -0
  1091. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/mcp-proxy.ts.template +89 -0
  1092. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/protected-resource-metadata.ts.template +13 -0
  1093. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/register.ts.template +70 -0
  1094. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/token.ts.template +75 -0
  1095. package/src/utils/dcr-proxy-constructs/files/terraform/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.tf.template +410 -0
  1096. package/src/utils/declared-dependencies.d.ts +140 -0
  1097. package/src/utils/declared-dependencies.js +64 -0
  1098. package/src/utils/declared-dependencies.js.map +1 -0
  1099. package/src/utils/dependencies.d.ts +18 -0
  1100. package/src/utils/dependencies.js +206 -0
  1101. package/src/utils/dependencies.js.map +1 -0
  1102. package/src/utils/docker.d.ts +89 -0
  1103. package/src/utils/docker.js +125 -0
  1104. package/src/utils/docker.js.map +1 -0
  1105. package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +1 -1
  1106. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +39 -41
  1107. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
  1108. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +18 -5
  1109. package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +1 -1
  1110. package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +24 -17
  1111. package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +1 -1
  1112. package/src/utils/files/common/constructs/src/core/cloudfront.ts.template +14 -0
  1113. package/src/utils/files/common/constructs/src/core/index.ts.template +5 -4
  1114. package/src/utils/files/common/constructs/src/index.ts.template +2 -2
  1115. package/src/utils/files/common/infra-config/src/index.ts.template +3 -3
  1116. package/src/utils/files/common/infra-config/src/resolve-stage.ts.template +2 -2
  1117. package/src/utils/files/common/infra-config/src/stages.config.ts.template +1 -1
  1118. package/src/{ts/dynamodb/files/scripts → utils/files/common/scripts/src/dynamodb}/create-local-table.ts.template +65 -31
  1119. package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
  1120. package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +103 -0
  1121. package/src/utils/files/common/scripts/src/infra/infra-deploy.ts.template +2 -0
  1122. package/src/utils/files/common/scripts/src/infra/infra-destroy.ts.template +2 -0
  1123. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +6 -3
  1124. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +3 -3
  1125. package/src/utils/files/common/scripts/src/rdb/mysql/wait-for-mysql-db.ts.template +32 -0
  1126. package/src/utils/files/common/scripts/src/rdb/postgres/wait-for-postgres-db.ts.template +32 -0
  1127. package/src/utils/files/common/scripts/src/rdb/shared/pull-image.ts.template +16 -0
  1128. package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +115 -0
  1129. package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
  1130. package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
  1131. package/src/utils/files/shadcn/components.json.template +1 -1
  1132. package/src/utils/files/terraform/src/core/asset-bucket/asset-bucket.tf.template +63 -72
  1133. package/src/utils/files/terraform/src/core/runtime-config/appconfig/appconfig.tf.template +1 -1
  1134. package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +12 -6
  1135. package/src/utils/files/terraform/src/core/runtime-config/entry/entry.tf.template +1 -1
  1136. package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +9 -4
  1137. package/src/utils/files/website/hooks/sigv4/useSigV4.tsx.template +1 -1
  1138. package/src/utils/format.d.ts +39 -4
  1139. package/src/utils/format.js +318 -198
  1140. package/src/utils/format.js.map +1 -1
  1141. package/src/utils/fs.d.ts +24 -5
  1142. package/src/utils/fs.js +40 -15
  1143. package/src/utils/fs.js.map +1 -1
  1144. package/src/utils/function-constructs/files/cdk/app/lambda-functions/__nameKebabCase__.ts.template +1 -1
  1145. package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
  1146. package/src/utils/function-constructs/function-constructs.js +22 -25
  1147. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  1148. package/src/utils/generators.js +18 -20
  1149. package/src/utils/generators.js.map +1 -1
  1150. package/src/utils/git.js +19 -34
  1151. package/src/utils/git.js.map +1 -1
  1152. package/src/utils/iac-providers.js +5 -5
  1153. package/src/utils/iac-providers.js.map +1 -1
  1154. package/src/utils/iac.js +12 -14
  1155. package/src/utils/iac.js.map +1 -1
  1156. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +153 -24
  1157. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +28 -9
  1158. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +129 -12
  1159. package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
  1160. package/src/utils/identity-constructs/identity-constructs.d.ts +10 -0
  1161. package/src/utils/identity-constructs/identity-constructs.js +52 -31
  1162. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  1163. package/src/utils/init.d.ts +72 -0
  1164. package/src/utils/init.js +300 -0
  1165. package/src/utils/init.js.map +1 -0
  1166. package/src/utils/install.d.ts +32 -0
  1167. package/src/utils/install.js +58 -0
  1168. package/src/utils/install.js.map +1 -0
  1169. package/src/utils/js.js +27 -20
  1170. package/src/utils/js.js.map +1 -1
  1171. package/src/utils/mcp.d.ts +9 -0
  1172. package/src/utils/mcp.js +42 -41
  1173. package/src/utils/mcp.js.map +1 -1
  1174. package/src/utils/metrics.d.ts +7 -1
  1175. package/src/utils/metrics.js +61 -46
  1176. package/src/utils/metrics.js.map +1 -1
  1177. package/src/utils/migration-manifest.d.ts +58 -0
  1178. package/src/utils/migration-manifest.js +76 -0
  1179. package/src/utils/migration-manifest.js.map +1 -0
  1180. package/src/utils/migration-versions.d.ts +145 -0
  1181. package/src/utils/migration-versions.js +250 -0
  1182. package/src/utils/migration-versions.js.map +1 -0
  1183. package/src/utils/mock-project-graph.js +8 -12
  1184. package/src/utils/mock-project-graph.js.map +1 -1
  1185. package/src/utils/module-format.d.ts +25 -0
  1186. package/src/utils/module-format.js +45 -0
  1187. package/src/utils/module-format.js.map +1 -0
  1188. package/src/utils/names.d.ts +22 -0
  1189. package/src/utils/names.js +44 -48
  1190. package/src/utils/names.js.map +1 -1
  1191. package/src/utils/npm-scope.d.ts +0 -4
  1192. package/src/utils/npm-scope.js +7 -20
  1193. package/src/utils/npm-scope.js.map +1 -1
  1194. package/src/utils/nx.d.ts +74 -3
  1195. package/src/utils/nx.js +196 -75
  1196. package/src/utils/nx.js.map +1 -1
  1197. package/src/utils/nxlv-python.js +27 -15
  1198. package/src/utils/nxlv-python.js.map +1 -1
  1199. package/src/utils/object.js +5 -11
  1200. package/src/utils/object.js.map +1 -1
  1201. package/src/utils/paths.js +11 -15
  1202. package/src/utils/paths.js.map +1 -1
  1203. package/src/utils/pkg-manager.js +4 -9
  1204. package/src/utils/pkg-manager.js.map +1 -1
  1205. package/src/utils/pnpm-workspace.d.ts +1 -12
  1206. package/src/utils/pnpm-workspace.js +16 -43
  1207. package/src/utils/pnpm-workspace.js.map +1 -1
  1208. package/src/utils/port.d.ts +28 -6
  1209. package/src/utils/port.js +67 -28
  1210. package/src/utils/port.js.map +1 -1
  1211. package/src/utils/project-package-json.d.ts +39 -0
  1212. package/src/utils/project-package-json.js +119 -0
  1213. package/src/utils/project-package-json.js.map +1 -0
  1214. package/src/utils/py.d.ts +17 -3
  1215. package/src/utils/py.js +73 -48
  1216. package/src/utils/py.js.map +1 -1
  1217. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +72 -18
  1218. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +112 -88
  1219. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +127 -53
  1220. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +60 -53
  1221. package/src/utils/rdb-constructs/rdb-constructs.d.ts +12 -1
  1222. package/src/utils/rdb-constructs/rdb-constructs.js +38 -41
  1223. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  1224. package/src/utils/ruff.d.ts +59 -0
  1225. package/src/utils/ruff.js +140 -0
  1226. package/src/utils/ruff.js.map +1 -0
  1227. package/src/utils/shared-constructs-constants.d.ts +46 -4
  1228. package/src/utils/shared-constructs-constants.js +50 -15
  1229. package/src/utils/shared-constructs-constants.js.map +1 -1
  1230. package/src/utils/shared-constructs.d.ts +4 -1
  1231. package/src/utils/shared-constructs.js +62 -67
  1232. package/src/utils/shared-constructs.js.map +1 -1
  1233. package/src/utils/shared-dynamodb-scripts.d.ts +18 -0
  1234. package/src/utils/shared-dynamodb-scripts.js +35 -0
  1235. package/src/utils/shared-dynamodb-scripts.js.map +1 -0
  1236. package/src/utils/shared-infra-config.js +31 -30
  1237. package/src/utils/shared-infra-config.js.map +1 -1
  1238. package/src/utils/shared-infra-scripts.d.ts +26 -0
  1239. package/src/utils/shared-infra-scripts.js +58 -0
  1240. package/src/utils/shared-infra-scripts.js.map +1 -0
  1241. package/src/utils/shared-rdb-scripts.d.ts +27 -0
  1242. package/src/utils/shared-rdb-scripts.js +59 -0
  1243. package/src/utils/shared-rdb-scripts.js.map +1 -0
  1244. package/src/utils/shared-scripts.d.ts +1 -4
  1245. package/src/utils/shared-scripts.js +12 -38
  1246. package/src/utils/shared-scripts.js.map +1 -1
  1247. package/src/utils/shared-shadcn.d.ts +26 -1
  1248. package/src/utils/shared-shadcn.js +93 -67
  1249. package/src/utils/shared-shadcn.js.map +1 -1
  1250. package/src/utils/smithy.d.ts +59 -0
  1251. package/src/utils/smithy.js +73 -0
  1252. package/src/utils/smithy.js.map +1 -0
  1253. package/src/utils/test-git.d.ts +39 -0
  1254. package/src/utils/test-git.js +117 -0
  1255. package/src/utils/test-git.js.map +1 -0
  1256. package/src/utils/test.d.ts +10 -0
  1257. package/src/utils/test.js +44 -25
  1258. package/src/utils/test.js.map +1 -1
  1259. package/src/utils/toml.d.ts +5 -0
  1260. package/src/utils/toml.js +17 -15
  1261. package/src/utils/toml.js.map +1 -1
  1262. package/src/utils/version-upgrade-migration/migration.d.ts +14 -0
  1263. package/src/utils/version-upgrade-migration/migration.js +16 -0
  1264. package/src/utils/version-upgrade-migration/migration.js.map +1 -0
  1265. package/src/utils/version-upgrade-migration/nx-package-updates.d.ts +45 -0
  1266. package/src/utils/version-upgrade-migration/nx-package-updates.js +50 -0
  1267. package/src/utils/version-upgrade-migration/nx-package-updates.js.map +1 -0
  1268. package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +76 -0
  1269. package/src/utils/version-upgrade-migration/owned-dependencies.js +146 -0
  1270. package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -0
  1271. package/src/utils/version-upgrade-migration/register.d.ts +29 -0
  1272. package/src/utils/version-upgrade-migration/register.js +42 -0
  1273. package/src/utils/version-upgrade-migration/register.js.map +1 -0
  1274. package/src/utils/version-upgrade-migration/sync-embedded-versions.d.ts +26 -0
  1275. package/src/utils/version-upgrade-migration/sync-embedded-versions.js +352 -0
  1276. package/src/utils/version-upgrade-migration/sync-embedded-versions.js.map +1 -0
  1277. package/src/utils/version-upgrade-migration/sync-metrics-version.d.ts +13 -0
  1278. package/src/utils/version-upgrade-migration/sync-metrics-version.js +33 -0
  1279. package/src/utils/version-upgrade-migration/sync-metrics-version.js.map +1 -0
  1280. package/src/utils/version-upgrade-migration/sync-vended-versions.d.ts +10 -0
  1281. package/src/utils/version-upgrade-migration/sync-vended-versions.js +518 -0
  1282. package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -0
  1283. package/src/utils/version-upgrade-migration/vended-upgrade.d.ts +14 -0
  1284. package/src/utils/version-upgrade-migration/vended-upgrade.js +40 -0
  1285. package/src/utils/version-upgrade-migration/vended-upgrade.js.map +1 -0
  1286. package/src/utils/versions.d.ts +240 -108
  1287. package/src/utils/versions.js +265 -121
  1288. package/src/utils/versions.js.map +1 -1
  1289. package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +2 -2
  1290. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +207 -41
  1291. package/src/utils/website-constructs/files/terraform/app/static-websites/__websiteNameKebabCase__/__websiteNameKebabCase__.tf.template +1 -1
  1292. package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +145 -93
  1293. package/src/utils/website-constructs/website-constructs.d.ts +11 -0
  1294. package/src/utils/website-constructs/website-constructs.js +49 -30
  1295. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  1296. package/bin/aws-nx-mcp.d.ts +0 -2
  1297. package/bin/aws-nx-mcp.js +0 -17
  1298. package/bin/aws-nx-mcp.js.map +0 -1
  1299. package/sdk/connection.d.ts +0 -6
  1300. package/sdk/connection.js +0 -10
  1301. package/sdk/connection.js.map +0 -1
  1302. package/sdk/license.d.ts +0 -8
  1303. package/sdk/license.js +0 -13
  1304. package/sdk/license.js.map +0 -1
  1305. package/sdk/open-api.d.ts +0 -10
  1306. package/sdk/open-api.js +0 -15
  1307. package/sdk/open-api.js.map +0 -1
  1308. package/sdk/py.d.ts +0 -14
  1309. package/sdk/py.js +0 -18
  1310. package/sdk/py.js.map +0 -1
  1311. package/sdk/terraform.d.ts +0 -6
  1312. package/sdk/terraform.js +0 -11
  1313. package/sdk/terraform.js.map +0 -1
  1314. package/sdk/ts.d.ts +0 -29
  1315. package/sdk/ts.js +0 -47
  1316. package/sdk/ts.js.map +0 -1
  1317. package/sdk/utils/ast.js +0 -12
  1318. package/sdk/utils/ast.js.map +0 -1
  1319. package/sdk/utils/format.js +0 -10
  1320. package/sdk/utils/format.js.map +0 -1
  1321. package/sdk/utils/test.js +0 -10
  1322. package/sdk/utils/test.js.map +0 -1
  1323. package/src/connection/agent-serve-local.d.ts +0 -33
  1324. package/src/connection/agent-serve-local.js +0 -48
  1325. package/src/connection/agent-serve-local.js.map +0 -1
  1326. package/src/connection/serve-local.js +0 -41
  1327. package/src/connection/serve-local.js.map +0 -1
  1328. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
  1329. package/src/py/agent/files/ag-ui/main.py.template +0 -37
  1330. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
  1331. package/src/py/agent/react-connection/serve-local.js +0 -30
  1332. package/src/py/agent/react-connection/serve-local.js.map +0 -1
  1333. package/src/py/agent/scripts/http/chat.ts.template +0 -38
  1334. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
  1335. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
  1336. package/src/ts/agent/react-connection/serve-local.js +0 -19
  1337. package/src/ts/agent/react-connection/serve-local.js.map +0 -1
  1338. package/src/ts/agent/scripts/http/chat.ts.template +0 -35
  1339. package/src/ts/dynamodb/files/scripts/pull-image.ts.template +0 -15
  1340. package/src/ts/dynamodb/files/scripts/start-container.ts.template +0 -81
  1341. package/src/ts/dynamodb/files/src/constants.ts.template +0 -9
  1342. package/src/ts/dynamodb/files/src/gsi.ts.template +0 -14
  1343. package/src/ts/rdb/files/scripts/pull-image.ts.template +0 -15
  1344. package/src/ts/rdb/files/scripts/start-container.ts.template +0 -84
  1345. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
  1346. package/src/ts/rdb/files/src/constants.ts.template +0 -8
  1347. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
  1348. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
  1349. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
  1350. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
  1351. package/src/utils/files/common/scripts/src/infra-deploy.ts.template +0 -2
  1352. package/src/utils/files/common/scripts/src/infra-destroy.ts.template +0 -2
  1353. package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
  1354. /package/src/py/agent/files/{common → strands/common}/__init__.py.template +0 -0
  1355. /package/src/smithy/project/files/{src → service/src}/main.smithy.template +0 -0
  1356. /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
  1357. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
  1358. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
@@ -0,0 +1,2070 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`py#rdb generator > should generate MySQL dependencies and templates 1`] = `
4
+ "import ssl
5
+ from collections.abc import AsyncGenerator
6
+ from contextlib import asynccontextmanager
7
+
8
+ import boto3
9
+ from sqlalchemy import event
10
+ from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
11
+
12
+ from .utils import build_database_url, get_database_config, get_local_dev_config, is_local_dev
13
+
14
+ # Generated: must match runtimeConfigKey in config.json
15
+ _runtime_config_key = "Db"
16
+
17
+ _engine = None
18
+
19
+
20
+ def get_engine():
21
+ global _engine
22
+ if _engine is not None:
23
+ return _engine
24
+ if is_local_dev():
25
+ cfg = get_local_dev_config()
26
+ url = build_database_url(cfg["dbUser"], cfg["host"], cfg["port"], cfg["dbName"])
27
+ ssl_args: dict = {}
28
+ else:
29
+ config = get_database_config(_runtime_config_key)
30
+ url = build_database_url(
31
+ config["dbUser"],
32
+ config["hostname"],
33
+ config["port"],
34
+ config["database"],
35
+ )
36
+ ssl_args = {"ssl": ssl.create_default_context()}
37
+ _engine = create_async_engine(url, connect_args=ssl_args)
38
+
39
+ @event.listens_for(_engine.sync_engine, "do_connect")
40
+ def provide_password(_dialect, _connection_record, _cargs, connection_params):
41
+ if is_local_dev():
42
+ connection_params["password"] = get_local_dev_config()["dbPassword"]
43
+ else:
44
+ config = get_database_config(_runtime_config_key)
45
+ connection_params["password"] = boto3.client(
46
+ "rds",
47
+ region_name=config["region"],
48
+ ).generate_db_auth_token(
49
+ DBHostname=config["hostname"],
50
+ Port=config["port"],
51
+ DBUsername=config["dbUser"],
52
+ )
53
+
54
+ return _engine
55
+
56
+
57
+ @asynccontextmanager
58
+ async def session_context() -> AsyncGenerator[AsyncSession]:
59
+ async with AsyncSession(get_engine()) as session:
60
+ yield session
61
+ "
62
+ `;
63
+
64
+ exports[`py#rdb generator > should generate MySQL dependencies and templates 2`] = `
65
+ "import asyncio
66
+ import ssl
67
+
68
+ from alembic import command
69
+ from alembic.config import Config
70
+ from sqlalchemy.ext.asyncio import create_async_engine
71
+ from sqlalchemy.pool import NullPool
72
+
73
+ from .utils import build_database_url, get_database_secret, with_connection_retry
74
+
75
+
76
+ def _apply_migrations(sync_conn, alembic_cfg: Config) -> None:
77
+ alembic_cfg.attributes["connection"] = sync_conn
78
+ command.upgrade(alembic_cfg, "head")
79
+
80
+
81
+ async def _run_migrations() -> None:
82
+ secret = get_database_secret()
83
+ database_url = build_database_url(
84
+ secret["username"],
85
+ secret["host"],
86
+ secret["port"],
87
+ secret["dbname"],
88
+ password=secret["password"],
89
+ )
90
+ alembic_cfg = Config("alembic.ini")
91
+ engine = create_async_engine(
92
+ database_url,
93
+ poolclass=NullPool,
94
+ connect_args={"ssl": ssl.create_default_context()},
95
+ )
96
+ try:
97
+ async with engine.begin() as conn:
98
+ await conn.run_sync(lambda c: _apply_migrations(c, alembic_cfg))
99
+ finally:
100
+ await engine.dispose()
101
+
102
+
103
+ def handler(_event, _context):
104
+ with_connection_retry(lambda: asyncio.run(_run_migrations()))
105
+ "
106
+ `;
107
+
108
+ exports[`py#rdb generator > should generate MySQL dependencies and templates 3`] = `
109
+ "import asyncio
110
+ import secrets
111
+ import ssl
112
+ from typing import Any
113
+
114
+ import aiomysql
115
+
116
+ from .utils import get_database_secret, with_connection_retry
117
+
118
+
119
+ async def _ensure_database_user(db_user: str) -> None:
120
+ secret = get_database_secret()
121
+ conn = await aiomysql.connect(
122
+ host=secret["host"],
123
+ port=int(secret["port"]),
124
+ db=secret["dbname"],
125
+ user=secret["username"],
126
+ password=secret["password"],
127
+ ssl=ssl.create_default_context(),
128
+ )
129
+ try:
130
+ async with conn.cursor() as cursor:
131
+ await cursor.execute(
132
+ "CREATE USER IF NOT EXISTS %s@'%%' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'",
133
+ (db_user,),
134
+ )
135
+ await cursor.execute(
136
+ "ALTER USER %s@'%%' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS' REQUIRE SSL",
137
+ (db_user,),
138
+ )
139
+ await cursor.execute(
140
+ f"GRANT SELECT, INSERT, UPDATE, DELETE ON \`{secret['dbname']}\`.* TO %s@'%%'",
141
+ (db_user,),
142
+ )
143
+ await conn.commit()
144
+ finally:
145
+ conn.close()
146
+
147
+
148
+ _PHYSICAL_RESOURCE_ID_PREFIX = "db-user:"
149
+
150
+
151
+ def _resolve_db_user(physical_resource_id: str | None) -> str:
152
+ if physical_resource_id and physical_resource_id.startswith(_PHYSICAL_RESOURCE_ID_PREFIX):
153
+ return physical_resource_id[len(_PHYSICAL_RESOURCE_ID_PREFIX) :]
154
+ return f"db_{secrets.token_hex(8)}"
155
+
156
+
157
+ def handler(event: dict[str, Any], _context: Any) -> dict[str, Any]:
158
+ db_user = _resolve_db_user(event.get("PhysicalResourceId"))
159
+
160
+ if event.get("RequestType") != "Delete":
161
+ with_connection_retry(lambda: asyncio.run(_ensure_database_user(db_user)))
162
+
163
+ return {
164
+ "PhysicalResourceId": f"{_PHYSICAL_RESOURCE_ID_PREFIX}{db_user}",
165
+ "Data": {"dbUser": db_user},
166
+ }
167
+ "
168
+ `;
169
+
170
+ exports[`py#rdb generator > should generate MySQL dependencies and templates 4`] = `
171
+ "FROM public.ecr.aws/lambda/python:3.14
172
+
173
+ # Patch OS packages beyond the base image's pinned release so the image is
174
+ # free of known HIGH/CRITICAL vulnerabilities
175
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all
176
+
177
+ WORKDIR \${LAMBDA_TASK_ROOT}
178
+
179
+ COPY . .
180
+
181
+ ADD https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem /etc/pki/ca-trust/source/anchors/global-bundle.pem
182
+ RUN update-ca-trust
183
+
184
+ CMD ["proj_db.migration_handler.handler"]
185
+ "
186
+ `;
187
+
188
+ exports[`py#rdb generator > should generate MySQL dependencies and templates 5`] = `
189
+ "FROM public.ecr.aws/lambda/python:3.14
190
+
191
+ # Patch OS packages beyond the base image's pinned release so the image is
192
+ # free of known HIGH/CRITICAL vulnerabilities
193
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all
194
+
195
+ WORKDIR \${LAMBDA_TASK_ROOT}
196
+
197
+ COPY . .
198
+
199
+ ADD https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem /etc/pki/ca-trust/source/anchors/global-bundle.pem
200
+ RUN update-ca-trust
201
+
202
+ CMD ["proj_db.create_db_user_handler.handler"]
203
+ "
204
+ `;
205
+
206
+ exports[`py#rdb generator > should generate Terraform modules 1`] = `
207
+ "terraform {
208
+ required_version = ">= 1.0"
209
+
210
+ required_providers {
211
+ archive = {
212
+ source = "hashicorp/archive"
213
+ version = "2.8.0"
214
+ }
215
+ aws = {
216
+ source = "hashicorp/aws"
217
+ version = "6.60.0"
218
+ }
219
+ null = {
220
+ source = "hashicorp/null"
221
+ version = "3.3.0"
222
+ }
223
+ random = {
224
+ source = "hashicorp/random"
225
+ version = "3.9.0"
226
+ }
227
+ }
228
+ }
229
+
230
+ variable "vpc_id" {
231
+ description = "VPC where the Aurora cluster will be deployed."
232
+ type = string
233
+ }
234
+
235
+ variable "database_subnet_ids" {
236
+ description = "Subnet IDs for the Aurora cluster and RDS Proxy. Private isolated subnets are fine — no outbound egress required."
237
+ type = list(string)
238
+ }
239
+
240
+ variable "lambda_subnet_ids" {
241
+ description = "Subnet IDs for the create-db-user and migration Lambda functions. Must have outbound egress to AWS service endpoints (e.g. Secrets Manager) — use private subnets with a NAT gateway."
242
+ type = list(string)
243
+ }
244
+
245
+ variable "engine_version" {
246
+ description = "Aurora engine version."
247
+ type = string
248
+ default = null
249
+ }
250
+
251
+ variable "port" {
252
+ description = "Database port for the selected Aurora engine."
253
+ type = number
254
+ default = null
255
+ }
256
+
257
+ variable "serverless_min_capacity" {
258
+ description = "Minimum Aurora Serverless v2 ACUs."
259
+ type = number
260
+ default = 0.5
261
+ }
262
+
263
+ variable "serverless_max_capacity" {
264
+ description = "Maximum Aurora Serverless v2 ACUs."
265
+ type = number
266
+ default = 4
267
+ }
268
+
269
+ variable "instance_count" {
270
+ description = "Number of Aurora instances to create."
271
+ type = number
272
+ default = 1
273
+ }
274
+
275
+ variable "deletion_protection" {
276
+ description = "Whether deletion protection is enabled."
277
+ type = bool
278
+ default = true
279
+ }
280
+
281
+ variable "skip_final_snapshot" {
282
+ description = "Whether to skip the final snapshot on deletion."
283
+ type = bool
284
+ default = false
285
+ }
286
+
287
+ variable "enable_rds_proxy" {
288
+ description = "Whether to provision an RDS Proxy in front of the Aurora cluster."
289
+ type = bool
290
+ default = true
291
+ }
292
+
293
+ variable "enable_credential_rotation" {
294
+ description = "Whether to enable automatic credential rotation for the admin secret."
295
+ type = bool
296
+ default = true
297
+ }
298
+
299
+ variable "enable_cloudwatch_logs" {
300
+ description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL also enables verbose statement logging."
301
+ type = bool
302
+ default = false
303
+ }
304
+
305
+ variable "enable_performance_insights" {
306
+ description = "Whether to enable Performance Insights on Aurora cluster instances."
307
+ type = bool
308
+ default = true
309
+ }
310
+
311
+ variable "performance_insights_retention_period" {
312
+ description = "Retention period, in days, for Performance Insights data when enabled."
313
+ type = number
314
+ default = 7
315
+ }
316
+
317
+ variable "enable_backup" {
318
+ description = "Whether to provision an AWS Backup plan for the Aurora cluster."
319
+ type = bool
320
+ default = false
321
+ }
322
+
323
+ variable "tags" {
324
+ description = "Tags to apply to all resources."
325
+ type = map(string)
326
+ default = {}
327
+ }
328
+
329
+ variable "migration_docker_image_tag" {
330
+ description = "Docker image tag for the migration handler. Defaults to the tag built by the Nx docker target."
331
+ type = string
332
+ default = "proj-db-migration:latest"
333
+ }
334
+
335
+ variable "create_db_user_docker_image_tag" {
336
+ description = "Docker image tag for the Python create-db-user handler. Defaults to the tag built by the Nx docker target."
337
+ type = string
338
+ default = "proj-db-create-db-user:latest"
339
+ }
340
+
341
+
342
+ data "aws_region" "current" {}
343
+ data "aws_caller_identity" "current" {}
344
+
345
+ resource "random_string" "suffix" {
346
+ length = 8
347
+ special = false
348
+ upper = false
349
+ }
350
+
351
+ locals {
352
+ config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
353
+ runtime_config_key = local.config.runtimeConfigKey
354
+ migration_function_name = "db-migration-\${random_string.suffix.result}"
355
+ create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
356
+ database_runtime_user = "db_\${random_string.suffix.result}"
357
+ }
358
+
359
+ module "aurora" {
360
+ source = "../../../core/rdb/aurora"
361
+ #checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
362
+ name = "db"
363
+ vpc_id = var.vpc_id
364
+ subnet_ids = var.database_subnet_ids
365
+ lambda_subnet_ids = var.lambda_subnet_ids
366
+ engine = "aurora-postgresql"
367
+ engine_version = var.engine_version
368
+ database_name = "database_name"
369
+ admin_user = "databaseUser"
370
+ port = var.port
371
+ serverless_min_capacity = var.serverless_min_capacity
372
+ serverless_max_capacity = var.serverless_max_capacity
373
+ instance_count = var.instance_count
374
+ deletion_protection = var.deletion_protection
375
+ skip_final_snapshot = var.skip_final_snapshot
376
+ enable_rds_proxy = var.enable_rds_proxy
377
+ enable_credential_rotation = var.enable_credential_rotation
378
+ enable_cloudwatch_logs = var.enable_cloudwatch_logs
379
+ enable_performance_insights = var.enable_performance_insights
380
+ performance_insights_retention_period = var.performance_insights_retention_period
381
+ enable_backup = var.enable_backup
382
+ tags = var.tags
383
+ }
384
+
385
+ resource "aws_iam_role_policy" "proxy_db_user_connect" {
386
+ count = var.enable_rds_proxy ? 1 : 0
387
+
388
+ role = module.aurora.proxy_role_name
389
+
390
+ policy = jsonencode({
391
+ Version = "2012-10-17"
392
+ Statement = [
393
+ {
394
+ Effect = "Allow"
395
+ Action = ["rds-db:connect"]
396
+ Resource = [
397
+ "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}"
398
+ ]
399
+ }
400
+ ]
401
+ })
402
+ }
403
+
404
+
405
+ module "add_rdb_to_runtime_config" {
406
+ source = "../../../core/runtime-config/entry"
407
+
408
+ namespace = "database"
409
+ key = local.runtime_config_key
410
+ value = {
411
+ hostname = module.aurora.cluster_endpoint
412
+ port = module.aurora.cluster_port
413
+ database = module.aurora.database_name
414
+ adminUser = module.aurora.admin_user
415
+ dbUser = local.database_runtime_user
416
+ region = data.aws_region.current.region
417
+ }
418
+ }
419
+
420
+ resource "aws_ecr_repository" "migration_handler" {
421
+ #checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
422
+ name = "db-migration-\${random_string.suffix.result}"
423
+ image_tag_mutability = "IMMUTABLE"
424
+ force_delete = true
425
+
426
+ image_scanning_configuration {
427
+ scan_on_push = true
428
+ }
429
+
430
+ tags = var.tags
431
+ }
432
+
433
+ resource "aws_ecr_repository_policy" "migration_handler" {
434
+ repository = aws_ecr_repository.migration_handler.name
435
+
436
+ policy = jsonencode({
437
+ Version = "2012-10-17"
438
+ Statement = [
439
+ {
440
+ Sid = "AllowPushPull"
441
+ Effect = "Allow"
442
+ Principal = {
443
+ AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root"
444
+ }
445
+ Action = [
446
+ "ecr:BatchCheckLayerAvailability",
447
+ "ecr:CompleteLayerUpload",
448
+ "ecr:GetDownloadUrlForLayer",
449
+ "ecr:InitiateLayerUpload",
450
+ "ecr:PutImage",
451
+ "ecr:UploadLayerPart"
452
+ ]
453
+ },
454
+ {
455
+ Sid = "AllowLambdaPull"
456
+ Effect = "Allow"
457
+ Principal = {
458
+ Service = "lambda.amazonaws.com"
459
+ }
460
+ Action = [
461
+ "ecr:BatchCheckLayerAvailability",
462
+ "ecr:BatchGetImage",
463
+ "ecr:GetDownloadUrlForLayer"
464
+ ]
465
+ }
466
+ ]
467
+ })
468
+ }
469
+
470
+ data "external" "docker_digest" {
471
+ program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.migration_docker_image_tag} --format '{{.Id}}')'\\"}' "]
472
+ }
473
+
474
+ locals {
475
+ # Content-based, immutable image tag derived from the local image digest
476
+ image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
477
+ }
478
+ data "external" "create_db_user_docker_digest" {
479
+ program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.create_db_user_docker_image_tag} --format '{{.Id}}')'\\"}' "]
480
+ }
481
+
482
+ locals {
483
+ create_db_user_image_tag = replace(data.external.create_db_user_docker_digest.result.digest, "sha256:", "")
484
+ }
485
+
486
+ resource "null_resource" "docker_publish" {
487
+ triggers = {
488
+ docker_digest = data.external.docker_digest.result.digest
489
+ repository_url = aws_ecr_repository.migration_handler.repository_url
490
+ migration_docker_image_tag = var.migration_docker_image_tag
491
+ image_tag = local.image_tag
492
+ create_db_user_docker_digest = data.external.create_db_user_docker_digest.result.digest
493
+ create_db_user_docker_image_tag = var.create_db_user_docker_image_tag
494
+ create_db_user_image_tag = local.create_db_user_image_tag
495
+ }
496
+
497
+ provisioner "local-exec" {
498
+ command = <<-EOT
499
+ aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
500
+ docker tag "$MIGRATION_DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
501
+ docker push "$REPOSITORY_URL:$IMAGE_TAG"
502
+ docker tag "$CREATE_DB_USER_DOCKER_IMAGE_TAG" "$REPOSITORY_URL:create-db-user-$CREATE_DB_USER_IMAGE_TAG"
503
+ docker push "$REPOSITORY_URL:create-db-user-$CREATE_DB_USER_IMAGE_TAG"
504
+ EOT
505
+ environment = {
506
+ AWS_REGION = data.aws_region.current.region
507
+ REPOSITORY_URL = self.triggers.repository_url
508
+ MIGRATION_DOCKER_IMAGE_TAG = self.triggers.migration_docker_image_tag
509
+ IMAGE_TAG = self.triggers.image_tag
510
+ CREATE_DB_USER_DOCKER_IMAGE_TAG = self.triggers.create_db_user_docker_image_tag
511
+ CREATE_DB_USER_IMAGE_TAG = self.triggers.create_db_user_image_tag
512
+ }
513
+ }
514
+
515
+ depends_on = [aws_ecr_repository_policy.migration_handler]
516
+ }
517
+
518
+ resource "aws_iam_role" "migration_handler" {
519
+ name = "DbMigrationHandlerRole-\${random_string.suffix.result}"
520
+
521
+ assume_role_policy = jsonencode({
522
+ Version = "2012-10-17"
523
+ Statement = [
524
+ {
525
+ Effect = "Allow"
526
+ Principal = {
527
+ Service = "lambda.amazonaws.com"
528
+ }
529
+ Action = "sts:AssumeRole"
530
+ }
531
+ ]
532
+ })
533
+
534
+ tags = var.tags
535
+ }
536
+
537
+ resource "aws_iam_role_policy_attachment" "migration_handler_basic_execution" {
538
+ role = aws_iam_role.migration_handler.name
539
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
540
+ }
541
+
542
+ resource "aws_iam_role_policy_attachment" "migration_handler_vpc_access" {
543
+ role = aws_iam_role.migration_handler.name
544
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
545
+ }
546
+
547
+ resource "aws_iam_role_policy_attachment" "migration_handler_xray" {
548
+ role = aws_iam_role.migration_handler.name
549
+ policy_arn = "arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess"
550
+ }
551
+
552
+ resource "aws_iam_role_policy" "migration_handler_access" {
553
+ role = aws_iam_role.migration_handler.name
554
+
555
+ policy = jsonencode({
556
+ Version = "2012-10-17"
557
+ Statement = [
558
+ {
559
+ Effect = "Allow"
560
+ Action = [
561
+ "secretsmanager:GetSecretValue"
562
+ ]
563
+ Resource = [module.aurora.secret_arn]
564
+ },
565
+ {
566
+ Effect = "Allow"
567
+ Action = [
568
+ "kms:Decrypt"
569
+ ]
570
+ Resource = [module.aurora.kms_key_arn]
571
+ }
572
+ ]
573
+ })
574
+ }
575
+
576
+ resource "aws_iam_role" "create_db_user" {
577
+ name = "DbCreateDbUserRole-\${random_string.suffix.result}"
578
+
579
+ assume_role_policy = jsonencode({
580
+ Version = "2012-10-17"
581
+ Statement = [
582
+ {
583
+ Effect = "Allow"
584
+ Principal = {
585
+ Service = "lambda.amazonaws.com"
586
+ }
587
+ Action = "sts:AssumeRole"
588
+ }
589
+ ]
590
+ })
591
+
592
+ tags = var.tags
593
+ }
594
+
595
+ resource "aws_iam_role_policy_attachment" "create_db_user_basic_execution" {
596
+ role = aws_iam_role.create_db_user.name
597
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
598
+ }
599
+
600
+ resource "aws_iam_role_policy_attachment" "create_db_user_vpc_access" {
601
+ role = aws_iam_role.create_db_user.name
602
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
603
+ }
604
+
605
+ resource "aws_iam_role_policy_attachment" "create_db_user_xray" {
606
+ role = aws_iam_role.create_db_user.name
607
+ policy_arn = "arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess"
608
+ }
609
+
610
+ resource "aws_iam_role_policy" "create_db_user_secret_access" {
611
+ role = aws_iam_role.create_db_user.name
612
+
613
+ policy = jsonencode({
614
+ Version = "2012-10-17"
615
+ Statement = [
616
+ {
617
+ Effect = "Allow"
618
+ Action = [
619
+ "secretsmanager:GetSecretValue"
620
+ ]
621
+ Resource = [module.aurora.secret_arn]
622
+ },
623
+ {
624
+ Effect = "Allow"
625
+ Action = [
626
+ "kms:Decrypt"
627
+ ]
628
+ Resource = [module.aurora.kms_key_arn]
629
+ }
630
+ ]
631
+ })
632
+ }
633
+
634
+ resource "aws_cloudwatch_log_group" "migration_handler" {
635
+ #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
636
+ #checkov:skip=CKV_AWS_338:Log retention set to forever
637
+ #checkov:skip=CKV_AWS_66:Log retention set to forever
638
+ name = "/aws/lambda/\${local.migration_function_name}"
639
+ tags = var.tags
640
+ }
641
+
642
+ resource "aws_cloudwatch_log_group" "create_db_user" {
643
+ #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
644
+ #checkov:skip=CKV_AWS_338:Log retention set to forever
645
+ #checkov:skip=CKV_AWS_66:Log retention set to forever
646
+ name = "/aws/lambda/\${local.create_db_user_function_name}"
647
+ tags = var.tags
648
+ }
649
+
650
+ resource "aws_security_group" "migration_handler" {
651
+ name_prefix = "db-migration-"
652
+ description = "Security group for the migration Lambda function"
653
+ vpc_id = var.vpc_id
654
+ tags = var.tags
655
+ }
656
+
657
+ resource "aws_vpc_security_group_egress_rule" "migration_handler_to_database" {
658
+ security_group_id = aws_security_group.migration_handler.id
659
+ referenced_security_group_id = module.aurora.database_security_group_id
660
+ from_port = module.aurora.cluster_port
661
+ to_port = module.aurora.cluster_port
662
+ ip_protocol = "tcp"
663
+ description = "Allow outbound traffic to Aurora on database port"
664
+ }
665
+
666
+ resource "aws_vpc_security_group_egress_rule" "migration_handler_https" {
667
+ security_group_id = aws_security_group.migration_handler.id
668
+ cidr_ipv4 = "0.0.0.0/0"
669
+ from_port = 443
670
+ to_port = 443
671
+ ip_protocol = "tcp"
672
+ description = "Allow outbound HTTPS to AWS service endpoints"
673
+ }
674
+
675
+ resource "aws_security_group" "create_db_user" {
676
+ name_prefix = "db-create-db-user-"
677
+ description = "Security group for the create-db-user Lambda function"
678
+ vpc_id = var.vpc_id
679
+ tags = var.tags
680
+ }
681
+
682
+ resource "aws_vpc_security_group_egress_rule" "create_db_user_to_database" {
683
+ security_group_id = aws_security_group.create_db_user.id
684
+ referenced_security_group_id = module.aurora.database_security_group_id
685
+ from_port = module.aurora.cluster_port
686
+ to_port = module.aurora.cluster_port
687
+ ip_protocol = "tcp"
688
+ description = "Allow outbound traffic to Aurora on database port"
689
+ }
690
+
691
+ resource "aws_vpc_security_group_egress_rule" "create_db_user_https" {
692
+ security_group_id = aws_security_group.create_db_user.id
693
+ cidr_ipv4 = "0.0.0.0/0"
694
+ from_port = 443
695
+ to_port = 443
696
+ ip_protocol = "tcp"
697
+ description = "Allow outbound HTTPS to AWS service endpoints"
698
+ }
699
+
700
+ resource "aws_vpc_security_group_ingress_rule" "migration_handler_to_database" {
701
+ security_group_id = module.aurora.database_security_group_id
702
+ referenced_security_group_id = aws_security_group.migration_handler.id
703
+ from_port = module.aurora.cluster_port
704
+ to_port = module.aurora.cluster_port
705
+ ip_protocol = "tcp"
706
+ description = "Allow inbound traffic from migration Lambda on database port"
707
+ }
708
+
709
+ resource "aws_vpc_security_group_ingress_rule" "create_db_user_to_database" {
710
+ security_group_id = module.aurora.database_security_group_id
711
+ referenced_security_group_id = aws_security_group.create_db_user.id
712
+ from_port = module.aurora.cluster_port
713
+ to_port = module.aurora.cluster_port
714
+ ip_protocol = "tcp"
715
+ description = "Allow inbound traffic from create-db-user Lambda on database port"
716
+ }
717
+
718
+ resource "aws_lambda_function" "create_db_user" {
719
+ #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for the create-db-user handler
720
+ #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for the create-db-user handler
721
+ #checkov:skip=CKV_AWS_173:Lambda environment variables encrypted by managed key
722
+ #checkov:skip=CKV_AWS_272:Code signing not configured as deployment packages are built and deployed within the same pipeline
723
+ package_type = "Image"
724
+ image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:create-db-user-\${local.create_db_user_image_tag}"
725
+ function_name = local.create_db_user_function_name
726
+ role = aws_iam_role.create_db_user.arn
727
+ timeout = 300
728
+ architectures = ["arm64"]
729
+
730
+ image_config {
731
+ command = ["proj_db.create_db_user_handler.handler"]
732
+ }
733
+
734
+ tracing_config {
735
+ mode = "Active"
736
+ }
737
+
738
+ vpc_config {
739
+ subnet_ids = var.lambda_subnet_ids
740
+ security_group_ids = [aws_security_group.create_db_user.id]
741
+ }
742
+
743
+ environment {
744
+ variables = {
745
+ DATABASE_SECRET_ARN = module.aurora.secret_arn
746
+ }
747
+ }
748
+
749
+ tags = var.tags
750
+
751
+ depends_on = [
752
+ null_resource.docker_publish,
753
+ aws_iam_role_policy_attachment.create_db_user_basic_execution,
754
+ aws_iam_role_policy_attachment.create_db_user_vpc_access,
755
+ aws_iam_role_policy_attachment.create_db_user_xray,
756
+ aws_iam_role_policy.create_db_user_secret_access,
757
+ aws_cloudwatch_log_group.create_db_user,
758
+ aws_vpc_security_group_ingress_rule.create_db_user_to_database
759
+ ]
760
+ }
761
+
762
+ resource "null_resource" "create_db_user_trigger" {
763
+ triggers = {
764
+ cluster_arn = module.aurora.cluster_arn
765
+ function_name = aws_lambda_function.create_db_user.function_name
766
+ db_user = local.database_runtime_user
767
+ bundle_hash = data.external.create_db_user_docker_digest.result.digest
768
+ }
769
+
770
+ provisioner "local-exec" {
771
+ command = <<-EOT
772
+ output_file=$(mktemp)
773
+ response=$(aws lambda invoke \\
774
+ --region "$AWS_REGION" \\
775
+ --function-name "$FUNCTION_NAME" \\
776
+ --cli-binary-format raw-in-base64-out \\
777
+ --payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
778
+ "$output_file")
779
+ cat "$output_file"
780
+ echo "$response"
781
+ if echo "$response" | grep -q '"FunctionError"'; then
782
+ rm -f "$output_file"
783
+ exit 1
784
+ fi
785
+ rm -f "$output_file"
786
+ EOT
787
+ environment = {
788
+ AWS_REGION = data.aws_region.current.region
789
+ FUNCTION_NAME = self.triggers.function_name
790
+ DB_USER = self.triggers.db_user
791
+ }
792
+ }
793
+
794
+ depends_on = [aws_lambda_function.create_db_user, module.aurora]
795
+ }
796
+
797
+ resource "aws_lambda_function" "migration_handler" {
798
+ #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for the migration handler
799
+ #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for the migration handler
800
+ #checkov:skip=CKV_AWS_173:Lambda environment variables encrypted by managed key
801
+ #checkov:skip=CKV_AWS_272:Code signing does not apply to container image Lambda functions
802
+ package_type = "Image"
803
+ function_name = local.migration_function_name
804
+ role = aws_iam_role.migration_handler.arn
805
+ image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
806
+ memory_size = 1024
807
+ timeout = 300
808
+ architectures = ["arm64"]
809
+
810
+ tracing_config {
811
+ mode = "Active"
812
+ }
813
+
814
+ vpc_config {
815
+ subnet_ids = var.lambda_subnet_ids
816
+ security_group_ids = [aws_security_group.migration_handler.id]
817
+ }
818
+
819
+ environment {
820
+ variables = {
821
+ DATABASE_SECRET_ARN = module.aurora.secret_arn
822
+ }
823
+ }
824
+
825
+ tags = var.tags
826
+
827
+ depends_on = [
828
+ null_resource.docker_publish,
829
+ aws_iam_role_policy_attachment.migration_handler_basic_execution,
830
+ aws_iam_role_policy_attachment.migration_handler_vpc_access,
831
+ aws_iam_role_policy_attachment.migration_handler_xray,
832
+ aws_iam_role_policy.migration_handler_access,
833
+ aws_cloudwatch_log_group.migration_handler,
834
+ aws_vpc_security_group_ingress_rule.migration_handler_to_database
835
+ ]
836
+ }
837
+
838
+ resource "null_resource" "migration_trigger" {
839
+ triggers = {
840
+ docker_digest = data.external.docker_digest.result.digest
841
+ cluster_arn = module.aurora.cluster_arn
842
+ database_ready = module.aurora.database_ready
843
+ function_name = aws_lambda_function.migration_handler.function_name
844
+ }
845
+
846
+ provisioner "local-exec" {
847
+ command = <<-EOT
848
+ output_file=$(mktemp)
849
+ response=$(aws lambda invoke \\
850
+ --region "$AWS_REGION" \\
851
+ --function-name "$FUNCTION_NAME" \\
852
+ --cli-binary-format raw-in-base64-out \\
853
+ "$output_file")
854
+ cat "$output_file"
855
+ echo "$response"
856
+ if echo "$response" | grep -q '"FunctionError"'; then
857
+ rm -f "$output_file"
858
+ exit 1
859
+ fi
860
+ rm -f "$output_file"
861
+ EOT
862
+ environment = {
863
+ AWS_REGION = data.aws_region.current.region
864
+ FUNCTION_NAME = self.triggers.function_name
865
+ }
866
+ }
867
+
868
+ depends_on = [
869
+ aws_lambda_function.migration_handler,
870
+ module.aurora,
871
+ null_resource.create_db_user_trigger,
872
+ aws_iam_role_policy.proxy_db_user_connect
873
+ ]
874
+ }
875
+
876
+ output "security_group_id" {
877
+ description = "Security group ID to allow inbound connections to the database (proxy SG if RDS Proxy is enabled, otherwise DB SG)."
878
+ value = module.aurora.security_group_id
879
+ }
880
+
881
+ output "database_security_group_id" {
882
+ description = "Security group ID of the Aurora cluster directly, used for direct DB access rules (e.g. when RDS Proxy is disabled)."
883
+ value = module.aurora.database_security_group_id
884
+ }
885
+
886
+ output "cluster_resource_id" {
887
+ description = "Resource ID of the Aurora cluster, used for IAM rds-db:connect policies."
888
+ value = module.aurora.cluster_resource_id
889
+ }
890
+
891
+ output "proxy_resource_id" {
892
+ description = "Resource identifier of the RDS Proxy (prx-XXXX), used for IAM rds-db:connect policies when connecting through the proxy. Null if RDS Proxy is disabled."
893
+ value = module.aurora.proxy_resource_id
894
+ }
895
+
896
+ output "connect_resource_id" {
897
+ 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."
898
+ value = module.aurora.connect_resource_id
899
+ }
900
+
901
+ output "kms_key_arn" {
902
+ description = "ARN of the KMS key protecting Aurora and the admin credentials secret, used to grant decrypt access alongside secret_arn."
903
+ value = module.aurora.kms_key_arn
904
+ }
905
+
906
+ output "cluster_arn" {
907
+ description = "ARN of the Aurora cluster."
908
+ value = module.aurora.cluster_arn
909
+ }
910
+
911
+ output "cluster_endpoint" {
912
+ description = "Writer endpoint of the Aurora cluster."
913
+ value = module.aurora.cluster_endpoint
914
+ }
915
+
916
+ output "reader_endpoint" {
917
+ description = "Reader endpoint of the Aurora cluster."
918
+ value = module.aurora.reader_endpoint
919
+ }
920
+
921
+ output "cluster_port" {
922
+ description = "Port exposed by the Aurora cluster."
923
+ value = module.aurora.cluster_port
924
+ }
925
+
926
+ output "secret_arn" {
927
+ description = "ARN of the generated admin credentials secret."
928
+ value = module.aurora.secret_arn
929
+ }
930
+
931
+ output "database_runtime_user" {
932
+ description = "Application database user created for IAM-authenticated access."
933
+ value = local.database_runtime_user
934
+ }
935
+ "
936
+ `;
937
+
938
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/migrations/env.py 1`] = `
939
+ "import asyncio
940
+ import json
941
+ import os
942
+ from logging.config import fileConfig
943
+
944
+ from alembic import context
945
+ from sqlalchemy import URL
946
+ from sqlalchemy.ext.asyncio import create_async_engine
947
+ from sqlmodel import SQLModel
948
+
949
+ # Import all models to register them in SQLModel.metadata
950
+ from proj_db.models import * # noqa: F403
951
+
952
+ config = context.config
953
+
954
+ if config.config_file_name is not None:
955
+ fileConfig(config.config_file_name)
956
+
957
+ target_metadata = SQLModel.metadata
958
+
959
+
960
+ def _get_local_url():
961
+ if os.environ.get("LOCAL_DEV") == "true":
962
+ config_path = os.path.join(os.path.dirname(__file__), "..", "config.json")
963
+ with open(config_path) as f:
964
+ cfg = json.load(f)["localDev"]
965
+ engine = cfg["dbEngine"]
966
+ driver = "mysql+aiomysql" if engine == "mysql" else "postgresql+asyncpg"
967
+ return URL.create(
968
+ driver,
969
+ username=cfg["dbUser"],
970
+ password=cfg["dbPassword"],
971
+ host=cfg["host"],
972
+ port=cfg["port"],
973
+ database=cfg["dbName"],
974
+ )
975
+
976
+ raise RuntimeError("Run alembic via nx run <project>:alembic")
977
+
978
+
979
+ # Generates SQL script without a live DB connection (alembic upgrade head --sql)
980
+ def run_migrations_offline() -> None:
981
+ context.configure(
982
+ url=_get_local_url(),
983
+ target_metadata=target_metadata,
984
+ literal_binds=True,
985
+ dialect_opts={"paramstyle": "named"},
986
+ )
987
+ with context.begin_transaction():
988
+ context.run_migrations()
989
+
990
+
991
+ def _run_migrations_sync(sync_conn) -> None:
992
+ context.configure(connection=sync_conn, target_metadata=target_metadata)
993
+ with context.begin_transaction():
994
+ context.run_migrations()
995
+
996
+
997
+ # Runs migrations against a live DB connection
998
+ def run_migrations_online() -> None:
999
+ supplied_connection = config.attributes.get("connection")
1000
+ # Connection injected by migration_handler.py (Lambda)
1001
+ if supplied_connection is not None:
1002
+ _run_migrations_sync(supplied_connection)
1003
+ return
1004
+
1005
+ # Local alembic commands run via nx run <project>:alembic
1006
+ async def _run_async() -> None:
1007
+ engine = create_async_engine(_get_local_url())
1008
+ async with engine.begin() as conn:
1009
+ await conn.run_sync(_run_migrations_sync)
1010
+ await engine.dispose()
1011
+
1012
+ asyncio.run(_run_async())
1013
+
1014
+
1015
+ if context.is_offline_mode():
1016
+ run_migrations_offline()
1017
+ else:
1018
+ run_migrations_online()
1019
+ "
1020
+ `;
1021
+
1022
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/migrations/script.py.mako 1`] = `
1023
+ """"\${message}
1024
+
1025
+ Revision ID: \${up_revision}
1026
+ Revises: \${down_revision | comma,n}
1027
+ Create Date: \${create_date}
1028
+
1029
+ """
1030
+ from typing import Sequence, Union
1031
+
1032
+ from alembic import op
1033
+ import sqlalchemy as sa
1034
+ \${imports if imports else ""}
1035
+
1036
+ # revision identifiers, used by Alembic.
1037
+ revision: str = \${repr(up_revision)}
1038
+ down_revision: Union[str, Sequence[str], None] = \${repr(down_revision)}
1039
+ branch_labels: Union[str, Sequence[str], None] = \${repr(branch_labels)}
1040
+ depends_on: Union[str, Sequence[str], None] = \${repr(depends_on)}
1041
+
1042
+
1043
+ def upgrade() -> None:
1044
+ """Upgrade schema."""
1045
+ \${upgrades if upgrades else "pass"}
1046
+
1047
+
1048
+ def downgrade() -> None:
1049
+ """Downgrade schema."""
1050
+ \${downgrades if downgrades else "pass"}
1051
+ "
1052
+ `;
1053
+
1054
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/migrations/versions/.gitkeep 1`] = `""`;
1055
+
1056
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/proj_db/__init__.py 1`] = `
1057
+ "from .connection import get_engine, is_local_dev, session_context
1058
+
1059
+ __all__ = ["get_engine", "is_local_dev", "session_context"]
1060
+ "
1061
+ `;
1062
+
1063
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/proj_db/connection.py 1`] = `
1064
+ "import ssl
1065
+ from collections.abc import AsyncGenerator
1066
+ from contextlib import asynccontextmanager
1067
+
1068
+ import boto3
1069
+ from sqlalchemy import event
1070
+ from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
1071
+
1072
+ from .utils import build_database_url, get_database_config, get_local_dev_config, is_local_dev
1073
+
1074
+ # Generated: must match runtimeConfigKey in config.json
1075
+ _runtime_config_key = "Db"
1076
+
1077
+ _engine = None
1078
+
1079
+
1080
+ def get_engine():
1081
+ global _engine
1082
+ if _engine is not None:
1083
+ return _engine
1084
+ if is_local_dev():
1085
+ cfg = get_local_dev_config()
1086
+ url = build_database_url(cfg["dbUser"], cfg["host"], cfg["port"], cfg["dbName"])
1087
+ ssl_args: dict = {}
1088
+ else:
1089
+ config = get_database_config(_runtime_config_key)
1090
+ url = build_database_url(
1091
+ config["dbUser"],
1092
+ config["hostname"],
1093
+ config["port"],
1094
+ config["database"],
1095
+ )
1096
+ ssl_args = {"ssl": ssl.create_default_context()}
1097
+ _engine = create_async_engine(url, connect_args=ssl_args)
1098
+
1099
+ @event.listens_for(_engine.sync_engine, "do_connect")
1100
+ def provide_password(_dialect, _connection_record, _cargs, connection_params):
1101
+ if is_local_dev():
1102
+ connection_params["password"] = get_local_dev_config()["dbPassword"]
1103
+ else:
1104
+ config = get_database_config(_runtime_config_key)
1105
+ connection_params["password"] = boto3.client(
1106
+ "rds",
1107
+ region_name=config["region"],
1108
+ ).generate_db_auth_token(
1109
+ DBHostname=config["hostname"],
1110
+ Port=config["port"],
1111
+ DBUsername=config["dbUser"],
1112
+ )
1113
+
1114
+ return _engine
1115
+
1116
+
1117
+ @asynccontextmanager
1118
+ async def session_context() -> AsyncGenerator[AsyncSession]:
1119
+ async with AsyncSession(get_engine()) as session:
1120
+ yield session
1121
+ "
1122
+ `;
1123
+
1124
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/proj_db/create_db_user_handler.py 1`] = `
1125
+ "import asyncio
1126
+ import secrets
1127
+ import ssl
1128
+ from typing import Any
1129
+
1130
+ import asyncpg
1131
+
1132
+ from .utils import get_database_secret, with_connection_retry
1133
+
1134
+
1135
+ async def _ensure_database_user(db_user: str) -> None:
1136
+ secret = get_database_secret()
1137
+ conn = await asyncpg.connect(
1138
+ host=secret["host"],
1139
+ port=int(secret["port"]),
1140
+ database=secret["dbname"],
1141
+ user=secret["username"],
1142
+ password=secret["password"],
1143
+ ssl=ssl.create_default_context(),
1144
+ )
1145
+ try:
1146
+ quoted = await conn.fetchrow(
1147
+ "SELECT quote_ident($1) AS role_q, quote_ident($2) AS db_q",
1148
+ db_user,
1149
+ secret["dbname"],
1150
+ )
1151
+ role_q, db_q = quoted["role_q"], quoted["db_q"]
1152
+ row = await conn.fetchrow("SELECT 1 FROM pg_roles WHERE rolname = $1", db_user)
1153
+ if row is None:
1154
+ await conn.execute(f"CREATE ROLE {role_q} WITH LOGIN")
1155
+ await conn.execute(f"""
1156
+ ALTER ROLE {role_q} WITH LOGIN;
1157
+ GRANT CONNECT ON DATABASE {db_q} TO {role_q};
1158
+ GRANT USAGE ON SCHEMA public TO {role_q};
1159
+ GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO {role_q};
1160
+ GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO {role_q};
1161
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
1162
+ GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO {role_q};
1163
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
1164
+ GRANT USAGE, SELECT ON SEQUENCES TO {role_q};
1165
+ GRANT rds_iam TO {role_q};
1166
+ """)
1167
+ finally:
1168
+ await conn.close()
1169
+
1170
+
1171
+ _PHYSICAL_RESOURCE_ID_PREFIX = "db-user:"
1172
+
1173
+
1174
+ def _resolve_db_user(physical_resource_id: str | None) -> str:
1175
+ if physical_resource_id and physical_resource_id.startswith(_PHYSICAL_RESOURCE_ID_PREFIX):
1176
+ return physical_resource_id[len(_PHYSICAL_RESOURCE_ID_PREFIX) :]
1177
+ return f"db_{secrets.token_hex(8)}"
1178
+
1179
+
1180
+ def handler(event: dict[str, Any], _context: Any) -> dict[str, Any]:
1181
+ db_user = _resolve_db_user(event.get("PhysicalResourceId"))
1182
+
1183
+ if event.get("RequestType") != "Delete":
1184
+ with_connection_retry(lambda: asyncio.run(_ensure_database_user(db_user)))
1185
+
1186
+ return {
1187
+ "PhysicalResourceId": f"{_PHYSICAL_RESOURCE_ID_PREFIX}{db_user}",
1188
+ "Data": {"dbUser": db_user},
1189
+ }
1190
+ "
1191
+ `;
1192
+
1193
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/proj_db/migration_handler.py 1`] = `
1194
+ "import asyncio
1195
+ import ssl
1196
+
1197
+ from alembic import command
1198
+ from alembic.config import Config
1199
+ from sqlalchemy.ext.asyncio import create_async_engine
1200
+ from sqlalchemy.pool import NullPool
1201
+
1202
+ from .utils import build_database_url, get_database_secret, with_connection_retry
1203
+
1204
+
1205
+ def _apply_migrations(sync_conn, alembic_cfg: Config) -> None:
1206
+ alembic_cfg.attributes["connection"] = sync_conn
1207
+ command.upgrade(alembic_cfg, "head")
1208
+
1209
+
1210
+ async def _run_migrations() -> None:
1211
+ secret = get_database_secret()
1212
+ database_url = build_database_url(
1213
+ secret["username"],
1214
+ secret["host"],
1215
+ secret["port"],
1216
+ secret["dbname"],
1217
+ password=secret["password"],
1218
+ )
1219
+ alembic_cfg = Config("alembic.ini")
1220
+ engine = create_async_engine(
1221
+ database_url,
1222
+ poolclass=NullPool,
1223
+ connect_args={"ssl": ssl.create_default_context()},
1224
+ )
1225
+ try:
1226
+ async with engine.begin() as conn:
1227
+ await conn.run_sync(lambda c: _apply_migrations(c, alembic_cfg))
1228
+ finally:
1229
+ await engine.dispose()
1230
+
1231
+
1232
+ def handler(_event, _context):
1233
+ with_connection_retry(lambda: asyncio.run(_run_migrations()))
1234
+ "
1235
+ `;
1236
+
1237
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/proj_db/models/__init__.py 1`] = `
1238
+ "from .example import ExampleModel
1239
+
1240
+ __all__ = ["ExampleModel"]
1241
+ "
1242
+ `;
1243
+
1244
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/proj_db/models/example.py 1`] = `
1245
+ "from sqlalchemy import Column, String
1246
+ from sqlmodel import Field, SQLModel
1247
+
1248
+
1249
+ class ExampleModel(SQLModel, table=True):
1250
+ id: int | None = Field(default=None, primary_key=True)
1251
+ name: str = Field(sa_column=Column(String(255), nullable=False))
1252
+ description: str | None = Field(default=None, sa_column=Column(String(255), nullable=True))
1253
+ "
1254
+ `;
1255
+
1256
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic > packages/db/proj_db/utils.py 1`] = `
1257
+ "import json
1258
+ import os
1259
+ import time
1260
+ from collections.abc import Callable
1261
+ from typing import Any
1262
+
1263
+ import boto3
1264
+ from aws_lambda_powertools.utilities.parameters import AppConfigProvider
1265
+ from sqlalchemy import URL
1266
+
1267
+ DatabaseConfig = dict[str, Any]
1268
+ DatabaseSecret = dict[str, Any]
1269
+
1270
+
1271
+ def build_database_url(
1272
+ username: str,
1273
+ host: str,
1274
+ port: int,
1275
+ database: str,
1276
+ password: str | None = None,
1277
+ ) -> URL:
1278
+ return URL.create(
1279
+ drivername="postgresql+asyncpg",
1280
+ username=username,
1281
+ password=password,
1282
+ host=host,
1283
+ port=port,
1284
+ database=database,
1285
+ )
1286
+
1287
+
1288
+ def is_local_dev() -> bool:
1289
+ return os.environ.get("LOCAL_DEV") == "true"
1290
+
1291
+
1292
+ def get_local_dev_config() -> dict:
1293
+ config_path = os.path.join(os.path.dirname(__file__), "..", "config.json")
1294
+ with open(config_path) as f:
1295
+ return json.load(f)["localDev"]
1296
+
1297
+
1298
+ def get_database_secret() -> DatabaseSecret:
1299
+ secret_arn = os.environ.get("DATABASE_SECRET_ARN")
1300
+ if not secret_arn:
1301
+ raise ValueError("Missing required environment variable DATABASE_SECRET_ARN.")
1302
+ client = boto3.client("secretsmanager")
1303
+ response = client.get_secret_value(SecretId=secret_arn)
1304
+ return json.loads(response["SecretString"])
1305
+
1306
+
1307
+ _database_config: dict[str, DatabaseConfig] = {}
1308
+
1309
+
1310
+ def get_database_config(runtime_config_key: str) -> DatabaseConfig:
1311
+ if runtime_config_key not in _database_config:
1312
+ app_id = os.environ.get("RUNTIME_CONFIG_APP_ID")
1313
+ if not app_id:
1314
+ raise ValueError("Missing required environment variable RUNTIME_CONFIG_APP_ID.")
1315
+ provider = AppConfigProvider(application=app_id, environment="default")
1316
+ config = provider.get("database", transform="json")
1317
+ if not isinstance(config, dict):
1318
+ raise ValueError("Unexpected RuntimeConfig format: expected JSON object.")
1319
+ db_config = config.get(runtime_config_key)
1320
+ if not db_config:
1321
+ raise ValueError(f"RuntimeConfig is missing database.{runtime_config_key}.")
1322
+ _database_config[runtime_config_key] = db_config
1323
+ return _database_config[runtime_config_key]
1324
+
1325
+
1326
+ _TRANSIENT_ERROR_PATTERNS = [
1327
+ "timeout",
1328
+ "connection refused",
1329
+ "could not connect",
1330
+ "connection reset",
1331
+ "connection timed out",
1332
+ "operationalerror",
1333
+ "password authentication failed",
1334
+ "access denied",
1335
+ "temporary failure",
1336
+ ]
1337
+
1338
+
1339
+ def is_transient_connection_error(error: Exception) -> bool:
1340
+ error_str = str(error).lower()
1341
+ return any(p in error_str for p in _TRANSIENT_ERROR_PATTERNS)
1342
+
1343
+
1344
+ def with_connection_retry[T](
1345
+ fn: Callable[[], T],
1346
+ max_attempts: int = 6,
1347
+ delay_seconds: float = 10.0,
1348
+ ) -> T:
1349
+ for attempt in range(1, max_attempts + 1):
1350
+ try:
1351
+ return fn()
1352
+ except Exception as e:
1353
+ if attempt == max_attempts or not is_transient_connection_error(e):
1354
+ raise
1355
+ wait = delay_seconds * attempt
1356
+ print(f"Transient connection error (attempt {attempt}/{max_attempts}), retrying in {wait:.0f}s: {e}")
1357
+ time.sleep(wait)
1358
+ raise RuntimeError("unreachable")
1359
+ "
1360
+ `;
1361
+
1362
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 1`] = `
1363
+ "[alembic]
1364
+ script_location = migrations
1365
+ file_template = %%(year)d%%(month).2d%%(day).2d_%%(hour).2d%%(minute).2d_%%(rev)s_%%(slug)s
1366
+ prepend_sys_path = .
1367
+
1368
+ [loggers]
1369
+ keys = root,sqlalchemy,alembic
1370
+
1371
+ [handlers]
1372
+ keys = console
1373
+
1374
+ [formatters]
1375
+ keys = generic
1376
+
1377
+ [logger_root]
1378
+ level = WARN
1379
+ handlers = console
1380
+ qualname =
1381
+
1382
+ [logger_sqlalchemy]
1383
+ level = WARN
1384
+ handlers =
1385
+ qualname = sqlalchemy.engine
1386
+
1387
+ [logger_alembic]
1388
+ level = INFO
1389
+ handlers =
1390
+ qualname = alembic
1391
+
1392
+ [handler_console]
1393
+ class = StreamHandler
1394
+ args = (sys.stderr,)
1395
+ level = NOTSET
1396
+ formatter = generic
1397
+
1398
+ [formatter_generic]
1399
+ format = %(levelname)-5.5s [%(name)s] %(message)s
1400
+ datefmt = %H:%M:%S
1401
+ "
1402
+ `;
1403
+
1404
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 2`] = `
1405
+ "FROM public.ecr.aws/lambda/python:3.14
1406
+
1407
+ # Patch OS packages beyond the base image's pinned release so the image is
1408
+ # free of known HIGH/CRITICAL vulnerabilities
1409
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all
1410
+
1411
+ WORKDIR \${LAMBDA_TASK_ROOT}
1412
+
1413
+ COPY . .
1414
+
1415
+ ADD https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem /etc/pki/ca-trust/source/anchors/global-bundle.pem
1416
+ RUN update-ca-trust
1417
+
1418
+ CMD ["proj_db.migration_handler.handler"]
1419
+ "
1420
+ `;
1421
+
1422
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 3`] = `
1423
+ "FROM public.ecr.aws/lambda/python:3.14
1424
+
1425
+ # Patch OS packages beyond the base image's pinned release so the image is
1426
+ # free of known HIGH/CRITICAL vulnerabilities
1427
+ RUN microdnf upgrade -y --releasever latest && microdnf clean all
1428
+
1429
+ WORKDIR \${LAMBDA_TASK_ROOT}
1430
+
1431
+ COPY . .
1432
+
1433
+ ADD https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem /etc/pki/ca-trust/source/anchors/global-bundle.pem
1434
+ RUN update-ca-trust
1435
+
1436
+ CMD ["proj_db.create_db_user_handler.handler"]
1437
+ "
1438
+ `;
1439
+
1440
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 4`] = `
1441
+ "{
1442
+ "runtimeConfigKey": "Db",
1443
+ "localDev": {
1444
+ "containerEngine": "docker",
1445
+ "containerName": "proj-database_name",
1446
+ "image": "public.ecr.aws/docker/library/postgres:17.7",
1447
+ "port": 5432,
1448
+ "host": "localhost",
1449
+ "dbName": "database_name",
1450
+ "dbUser": "dbadmin",
1451
+ "dbPassword": "password",
1452
+ "dbEngine": "postgres"
1453
+ }
1454
+ }
1455
+ "
1456
+ `;
1457
+
1458
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 5`] = `
1459
+ "[tool.coverage.run]
1460
+ branch = true
1461
+ source = [ "proj_db" ]
1462
+
1463
+ [tool.coverage.report]
1464
+ exclude_lines = [ "if TYPE_CHECKING:" ]
1465
+ show_missing = true
1466
+
1467
+ [tool.pytest.ini_options]
1468
+ addopts = """
1469
+ --cov
1470
+ --cov-report html:'../../coverage/packages/db/html'
1471
+ --cov-report xml:'../../coverage/packages/db/coverage.xml'
1472
+ --html='../../reports/packages/db/unittests/html/index.html'
1473
+ --junitxml='../../reports/packages/db/unittests/junit.xml'
1474
+ """
1475
+
1476
+ [tool.hatch.build.targets.wheel]
1477
+ packages = [ "proj_db" ]
1478
+
1479
+ [tool.hatch.metadata]
1480
+ allow-direct-references = true
1481
+
1482
+ [tool.ruff]
1483
+ exclude = [ ".ruff_cache", ".svn", ".tox", ".venv", "dist" ]
1484
+ line-length = 120
1485
+ indent-width = 4
1486
+
1487
+ [tool.ruff.lint]
1488
+ select = [ "E", "F", "UP", "B", "SIM", "I" ]
1489
+ ignore = [ ]
1490
+ fixable = [ "ALL" ]
1491
+ unfixable = [ ]
1492
+
1493
+ [project]
1494
+ name = "proj-db"
1495
+ version = "1.0.0"
1496
+ description = "Automatically generated by Nx."
1497
+ requires-python = ">=3.14"
1498
+ readme = "README.md"
1499
+ dependencies = [
1500
+ "sqlmodel==0.0.39",
1501
+ "alembic==1.19.1",
1502
+ "greenlet==3.5.4",
1503
+ "asyncpg==0.31.0",
1504
+ "boto3==1.43.67",
1505
+ "aws-lambda-powertools==3.31.1"
1506
+ ]
1507
+
1508
+ [build-system]
1509
+ requires = [ "hatchling" ]
1510
+ build-backend = "hatchling.build"
1511
+ "
1512
+ `;
1513
+
1514
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 6`] = `
1515
+ "import * as path from 'path';
1516
+ import * as url from 'url';
1517
+ import { readFileSync } from 'fs';
1518
+ import { Construct } from 'constructs';
1519
+ import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
1520
+ import {
1521
+ DockerImageCode,
1522
+ DockerImageFunction,
1523
+ Function,
1524
+ FunctionOptions,
1525
+ } from 'aws-cdk-lib/aws-lambda';
1526
+ import {
1527
+ AuroraDatabase,
1528
+ AuroraDatabaseEngines,
1529
+ AuroraDatabaseProps,
1530
+ } from '../../core/rdb/aurora.js';
1531
+ import { findWorkspaceRoot } from '../../core/workspace.js';
1532
+
1533
+ const { runtimeConfigKey } = JSON.parse(
1534
+ readFileSync(
1535
+ path.join(
1536
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
1537
+ 'packages/db/config.json',
1538
+ ),
1539
+ 'utf-8',
1540
+ ),
1541
+ ) as { runtimeConfigKey: string };
1542
+
1543
+ const migrationBundleDir = path.join(
1544
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
1545
+ 'dist/packages/db/docker/migration',
1546
+ );
1547
+
1548
+ const createDbUserBundleDir = path.join(
1549
+ findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
1550
+ 'dist/packages/db/docker/create-db-user',
1551
+ );
1552
+
1553
+ export type DbProps = Omit<
1554
+ AuroraDatabaseProps,
1555
+ 'databaseName' | 'adminUser' | 'runtimeConfigKey' | 'engine'
1556
+ >;
1557
+
1558
+ /**
1559
+ * CDK construct that provisions an Aurora Serverless v2 cluster.
1560
+ */
1561
+ export class Db extends AuroraDatabase {
1562
+ constructor(scope: Construct, id: string, props: DbProps) {
1563
+ super(scope, id, {
1564
+ ...props,
1565
+ databaseName: 'database_name',
1566
+ adminUser: 'databaseUser',
1567
+ runtimeConfigKey,
1568
+ engine: AuroraDatabaseEngines.postgres({}),
1569
+ });
1570
+ }
1571
+
1572
+ protected override createDbUserHandler(baseProps: FunctionOptions): Function {
1573
+ return new DockerImageFunction(this, 'CreateDbUserHandler', {
1574
+ ...baseProps,
1575
+ code: DockerImageCode.fromImageAsset(createDbUserBundleDir, {
1576
+ platform: Platform.LINUX_ARM64,
1577
+ }),
1578
+ });
1579
+ }
1580
+
1581
+ protected override createMigrationHandler(
1582
+ baseProps: FunctionOptions,
1583
+ ): Function {
1584
+ return new DockerImageFunction(this, 'MigrationHandler', {
1585
+ ...baseProps,
1586
+ code: DockerImageCode.fromImageAsset(migrationBundleDir, {
1587
+ platform: Platform.LINUX_ARM64,
1588
+ }),
1589
+ });
1590
+ }
1591
+ }
1592
+ "
1593
+ `;
1594
+
1595
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 7`] = `
1596
+ "import asyncio
1597
+ import secrets
1598
+ import ssl
1599
+ from typing import Any
1600
+
1601
+ import asyncpg
1602
+
1603
+ from .utils import get_database_secret, with_connection_retry
1604
+
1605
+
1606
+ async def _ensure_database_user(db_user: str) -> None:
1607
+ secret = get_database_secret()
1608
+ conn = await asyncpg.connect(
1609
+ host=secret["host"],
1610
+ port=int(secret["port"]),
1611
+ database=secret["dbname"],
1612
+ user=secret["username"],
1613
+ password=secret["password"],
1614
+ ssl=ssl.create_default_context(),
1615
+ )
1616
+ try:
1617
+ quoted = await conn.fetchrow(
1618
+ "SELECT quote_ident($1) AS role_q, quote_ident($2) AS db_q",
1619
+ db_user,
1620
+ secret["dbname"],
1621
+ )
1622
+ role_q, db_q = quoted["role_q"], quoted["db_q"]
1623
+ row = await conn.fetchrow("SELECT 1 FROM pg_roles WHERE rolname = $1", db_user)
1624
+ if row is None:
1625
+ await conn.execute(f"CREATE ROLE {role_q} WITH LOGIN")
1626
+ await conn.execute(f"""
1627
+ ALTER ROLE {role_q} WITH LOGIN;
1628
+ GRANT CONNECT ON DATABASE {db_q} TO {role_q};
1629
+ GRANT USAGE ON SCHEMA public TO {role_q};
1630
+ GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO {role_q};
1631
+ GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO {role_q};
1632
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
1633
+ GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO {role_q};
1634
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
1635
+ GRANT USAGE, SELECT ON SEQUENCES TO {role_q};
1636
+ GRANT rds_iam TO {role_q};
1637
+ """)
1638
+ finally:
1639
+ await conn.close()
1640
+
1641
+
1642
+ _PHYSICAL_RESOURCE_ID_PREFIX = "db-user:"
1643
+
1644
+
1645
+ def _resolve_db_user(physical_resource_id: str | None) -> str:
1646
+ if physical_resource_id and physical_resource_id.startswith(_PHYSICAL_RESOURCE_ID_PREFIX):
1647
+ return physical_resource_id[len(_PHYSICAL_RESOURCE_ID_PREFIX) :]
1648
+ return f"db_{secrets.token_hex(8)}"
1649
+
1650
+
1651
+ def handler(event: dict[str, Any], _context: Any) -> dict[str, Any]:
1652
+ db_user = _resolve_db_user(event.get("PhysicalResourceId"))
1653
+
1654
+ if event.get("RequestType") != "Delete":
1655
+ with_connection_retry(lambda: asyncio.run(_ensure_database_user(db_user)))
1656
+
1657
+ return {
1658
+ "PhysicalResourceId": f"{_PHYSICAL_RESOURCE_ID_PREFIX}{db_user}",
1659
+ "Data": {"dbUser": db_user},
1660
+ }
1661
+ "
1662
+ `;
1663
+
1664
+ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with Alembic 8`] = `
1665
+ "import { CfnOutput, Duration, RemovalPolicy, Stack } from 'aws-cdk-lib';
1666
+ import { CustomResource } from 'aws-cdk-lib';
1667
+ import { IConnectable, IVpc, Port, SubnetType } from 'aws-cdk-lib/aws-ec2';
1668
+ import { IGrantable, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
1669
+ import { Key } from 'aws-cdk-lib/aws-kms';
1670
+ import {
1671
+ Architecture,
1672
+ Function,
1673
+ FunctionOptions,
1674
+ Tracing,
1675
+ } from 'aws-cdk-lib/aws-lambda';
1676
+ import {
1677
+ AuroraMysqlEngineVersion,
1678
+ AuroraPostgresEngineVersion,
1679
+ ClusterInstance,
1680
+ Credentials,
1681
+ DatabaseCluster,
1682
+ DatabaseClusterEngine,
1683
+ DatabaseClusterProps,
1684
+ DatabaseProxy,
1685
+ DefaultAuthScheme,
1686
+ IClusterEngine,
1687
+ } from 'aws-cdk-lib/aws-rds';
1688
+ import { Provider } from 'aws-cdk-lib/custom-resources';
1689
+ import { Trigger } from 'aws-cdk-lib/triggers';
1690
+ import { Construct } from 'constructs';
1691
+ import { RuntimeConfig } from '../runtime-config.js';
1692
+
1693
+ export type AuroraDatabaseEngineVersion =
1694
+ | AuroraMysqlEngineVersion
1695
+ | AuroraPostgresEngineVersion;
1696
+
1697
+ export interface AuroraDatabaseEngine {
1698
+ /**
1699
+ * Discriminant identifying the engine type.
1700
+ */
1701
+ readonly type: 'mysql' | 'postgres';
1702
+
1703
+ /**
1704
+ * Default Aurora engine version used when one is not explicitly provided.
1705
+ */
1706
+ readonly defaultVersion: AuroraDatabaseEngineVersion;
1707
+
1708
+ /**
1709
+ * Builds the CDK cluster engine for the provided engine version.
1710
+ */
1711
+ clusterEngine(version: AuroraDatabaseEngineVersion): IClusterEngine;
1712
+ }
1713
+
1714
+ export class AuroraDatabaseEngines {
1715
+ public static mysql({
1716
+ defaultVersion = AuroraMysqlEngineVersion.VER_3_12_0,
1717
+ }: {
1718
+ defaultVersion?: AuroraMysqlEngineVersion;
1719
+ }): AuroraDatabaseEngine {
1720
+ return {
1721
+ type: 'mysql',
1722
+ defaultVersion,
1723
+ clusterEngine: (version) =>
1724
+ DatabaseClusterEngine.auroraMysql({
1725
+ version: version as AuroraMysqlEngineVersion,
1726
+ }),
1727
+ };
1728
+ }
1729
+
1730
+ public static postgres({
1731
+ defaultVersion = AuroraPostgresEngineVersion.VER_17_7,
1732
+ }: {
1733
+ defaultVersion?: AuroraPostgresEngineVersion;
1734
+ }): AuroraDatabaseEngine {
1735
+ return {
1736
+ type: 'postgres',
1737
+ defaultVersion,
1738
+ clusterEngine: (version) =>
1739
+ DatabaseClusterEngine.auroraPostgres({
1740
+ version: version as AuroraPostgresEngineVersion,
1741
+ }),
1742
+ };
1743
+ }
1744
+ }
1745
+
1746
+ type _AuroraDatabaseProps = Omit<
1747
+ DatabaseClusterProps,
1748
+ | 'credentials'
1749
+ | 'defaultDatabaseName'
1750
+ | 'engine'
1751
+ | 'iamAuthentication'
1752
+ | 'instanceProps'
1753
+ | 'writer'
1754
+ >;
1755
+
1756
+ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
1757
+ /**
1758
+ * VPC where the Aurora cluster will be deployed.
1759
+ */
1760
+ readonly vpc: IVpc;
1761
+
1762
+ /**
1763
+ * Aurora engine preset used to build the cluster.
1764
+ */
1765
+ readonly engine: AuroraDatabaseEngine;
1766
+
1767
+ /**
1768
+ * The engine version to deploy.
1769
+ *
1770
+ * @default - engine.defaultVersion
1771
+ */
1772
+ readonly engineVersion?: AuroraDatabaseEngineVersion;
1773
+
1774
+ /**
1775
+ * Admin username used when generating credentials.
1776
+ */
1777
+ readonly adminUser: string;
1778
+
1779
+ /**
1780
+ * The initial database created in the cluster.
1781
+ */
1782
+ readonly databaseName: string;
1783
+
1784
+ /**
1785
+ * RuntimeConfig key used under the \`database\` namespace.
1786
+ */
1787
+ readonly runtimeConfigKey: string;
1788
+
1789
+ /**
1790
+ * Writer instance for the Aurora cluster.
1791
+ */
1792
+ readonly writer?: DatabaseClusterProps['writer'];
1793
+
1794
+ /**
1795
+ * Whether to provision an RDS Proxy in front of the Aurora cluster.
1796
+ *
1797
+ * @default true
1798
+ */
1799
+ readonly enableRdsProxy?: boolean;
1800
+
1801
+ /**
1802
+ * Whether to enable automatic credential rotation for the admin secret.
1803
+ *
1804
+ * @default true
1805
+ */
1806
+ readonly enableCredentialRotation?: boolean;
1807
+
1808
+ /**
1809
+ * Whether to enable deletion protection on the Aurora cluster.
1810
+ *
1811
+ * @default true
1812
+ */
1813
+ readonly deletionProtection?: boolean;
1814
+
1815
+ /**
1816
+ * Removal policy applied to the Aurora cluster.
1817
+ *
1818
+ * @default RemovalPolicy.RETAIN
1819
+ */
1820
+ readonly removalPolicy?: RemovalPolicy;
1821
+
1822
+ /**
1823
+ * Whether to enable automatic key rotation on the KMS key used to encrypt the Aurora cluster and its credentials secret.
1824
+ *
1825
+ * @default true
1826
+ */
1827
+ readonly enableKeyRotation?: boolean;
1828
+
1829
+ /**
1830
+ * Whether to export Aurora engine logs to CloudWatch Logs.
1831
+ * See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
1832
+ *
1833
+ * PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables
1834
+ * Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL).
1835
+ * Neither logs statement parameter values, to avoid leaking PII into log data.
1836
+ *
1837
+ * @default true
1838
+ */
1839
+ readonly enableCloudwatchLogs?: boolean;
1840
+
1841
+ /**
1842
+ * Whether to enable Performance Insights on the Aurora writer instance.
1843
+ *
1844
+ * @default true
1845
+ */
1846
+ readonly enablePerformanceInsights?: boolean;
1847
+ }
1848
+
1849
+ /**
1850
+ * Reusable Aurora database construct that supports different Aurora engines
1851
+ * through typed engine presets.
1852
+ */
1853
+ export abstract class AuroraDatabase extends Construct {
1854
+ public readonly cluster: DatabaseCluster;
1855
+ public readonly proxy?: DatabaseProxy;
1856
+ private readonly adminUser: string;
1857
+ private readonly dbUser: string;
1858
+
1859
+ constructor(
1860
+ scope: Construct,
1861
+ id: string,
1862
+ {
1863
+ vpc,
1864
+ adminUser,
1865
+ databaseName,
1866
+ runtimeConfigKey,
1867
+ vpcSubnets,
1868
+ writer,
1869
+ enableRdsProxy = true,
1870
+ enableCredentialRotation = true,
1871
+ deletionProtection = true,
1872
+ removalPolicy = RemovalPolicy.RETAIN,
1873
+ enableKeyRotation = true,
1874
+ enableCloudwatchLogs = true,
1875
+ enablePerformanceInsights = true,
1876
+ engine,
1877
+ engineVersion,
1878
+ ...clusterProps
1879
+ }: AuroraDatabaseProps,
1880
+ ) {
1881
+ super(scope, id);
1882
+
1883
+ this.adminUser = adminUser;
1884
+
1885
+ const key = new Key(this, 'EncryptionKey', { enableKeyRotation });
1886
+ this.cluster = new DatabaseCluster(this, 'DatabaseCluster', {
1887
+ ...clusterProps,
1888
+ vpc,
1889
+ vpcSubnets,
1890
+ engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
1891
+ writer:
1892
+ writer ??
1893
+ ClusterInstance.serverlessV2('writer', {
1894
+ enablePerformanceInsights,
1895
+ performanceInsightEncryptionKey: enablePerformanceInsights
1896
+ ? key
1897
+ : undefined,
1898
+ }),
1899
+ credentials: Credentials.fromGeneratedSecret(adminUser, {
1900
+ encryptionKey: key,
1901
+ }),
1902
+ iamAuthentication: true,
1903
+ monitoringInterval: Duration.seconds(5),
1904
+ cloudwatchLogsExports: enableCloudwatchLogs
1905
+ ? engine.type === 'mysql'
1906
+ ? ['audit', 'error']
1907
+ : ['postgresql']
1908
+ : undefined,
1909
+ parameters: enableCloudwatchLogs
1910
+ ? engine.type === 'mysql'
1911
+ ? {
1912
+ server_audit_logging: '1',
1913
+ server_audit_events: 'CONNECT,QUERY_DDL',
1914
+ }
1915
+ : // Only safe statement-at-a-time; a multi-statement batch mixing
1916
+ // DDL with DML (e.g. one \`psql -c "a;b;c"\` call) logs the whole
1917
+ // raw text verbatim, including any literal DML values.
1918
+ { log_statement: 'ddl' }
1919
+ : undefined,
1920
+ defaultDatabaseName: databaseName,
1921
+ storageEncrypted: true,
1922
+ storageEncryptionKey: key,
1923
+ deletionProtection,
1924
+ removalPolicy,
1925
+ });
1926
+
1927
+ if (enableCredentialRotation) {
1928
+ this.cluster.addRotationSingleUser({
1929
+ automaticallyAfter: Duration.days(30),
1930
+ vpcSubnets: {
1931
+ subnetType: SubnetType.PRIVATE_WITH_EGRESS,
1932
+ },
1933
+ });
1934
+ }
1935
+
1936
+ const proxyRole = enableRdsProxy
1937
+ ? new Role(this, 'DatabaseProxyRole', {
1938
+ assumedBy: new ServicePrincipal('rds.amazonaws.com'),
1939
+ })
1940
+ : undefined;
1941
+
1942
+ if (enableRdsProxy) {
1943
+ this.proxy = this.cluster.addProxy('DatabaseProxy', {
1944
+ vpc,
1945
+ vpcSubnets,
1946
+ defaultAuthScheme: DefaultAuthScheme.IAM_AUTH,
1947
+ role: proxyRole,
1948
+ });
1949
+ }
1950
+
1951
+ const databaseHostname =
1952
+ this.proxy?.endpoint ?? this.cluster.clusterEndpoint.hostname;
1953
+ const databasePort = this.cluster.clusterEndpoint.port;
1954
+
1955
+ const commonProps: FunctionOptions = {
1956
+ vpc,
1957
+ timeout: Duration.minutes(5),
1958
+ tracing: Tracing.ACTIVE,
1959
+ architecture: Architecture.ARM_64,
1960
+ };
1961
+
1962
+ const createDbUserHandler = this.createDbUserHandler({
1963
+ ...commonProps,
1964
+ vpcSubnets: {
1965
+ subnetType: SubnetType.PRIVATE_WITH_EGRESS,
1966
+ },
1967
+ });
1968
+ createDbUserHandler.addEnvironment(
1969
+ 'DATABASE_SECRET_ARN',
1970
+ this.cluster.secret!.secretArn,
1971
+ );
1972
+ this.cluster.connections.allowDefaultPortFrom(
1973
+ createDbUserHandler,
1974
+ 'Allow the create-db-user handler to connect to the database',
1975
+ );
1976
+ this.grantSecretRead(createDbUserHandler);
1977
+
1978
+ const createDbUserProvider = new Provider(this, 'CreateDbUserProvider', {
1979
+ onEventHandler: createDbUserHandler,
1980
+ });
1981
+
1982
+ const createDbUserResource = new CustomResource(
1983
+ this,
1984
+ 'CreateDbUserResource',
1985
+ {
1986
+ serviceToken: createDbUserProvider.serviceToken,
1987
+ properties: {
1988
+ clusterIdentifier: this.cluster.clusterIdentifier,
1989
+ },
1990
+ },
1991
+ );
1992
+ createDbUserResource.node.addDependency(this.cluster);
1993
+ this.dbUser = createDbUserResource.getAttString('dbUser');
1994
+ if (this.proxy && proxyRole) {
1995
+ this.cluster.grantConnect(proxyRole, this.dbUser);
1996
+ }
1997
+
1998
+ const rc = RuntimeConfig.ensure(this);
1999
+ rc.set('database', runtimeConfigKey, {
2000
+ hostname: databaseHostname,
2001
+ port: databasePort,
2002
+ database: databaseName,
2003
+ adminUser: this.adminUser,
2004
+ dbUser: this.dbUser,
2005
+ region: Stack.of(this).region,
2006
+ });
2007
+
2008
+ const migrationHandler = this.createMigrationHandler({
2009
+ ...commonProps,
2010
+ memorySize: 1024,
2011
+ });
2012
+ migrationHandler.addEnvironment(
2013
+ 'DATABASE_SECRET_ARN',
2014
+ this.cluster.secret!.secretArn,
2015
+ );
2016
+ this.cluster.connections.allowDefaultPortFrom(migrationHandler);
2017
+ this.grantSecretRead(migrationHandler);
2018
+
2019
+ const migrationTrigger = new Trigger(this, 'MigrationTrigger', {
2020
+ handler: migrationHandler,
2021
+ });
2022
+ migrationTrigger.node.addDependency(createDbUserResource);
2023
+
2024
+ new CfnOutput(this, 'ClusterEndpoint', {
2025
+ value: this.cluster.clusterEndpoint.hostname,
2026
+ });
2027
+
2028
+ if (this.proxy?.endpoint) {
2029
+ new CfnOutput(this, 'ProxyEndpoint', {
2030
+ value: this.proxy?.endpoint,
2031
+ });
2032
+ }
2033
+ }
2034
+
2035
+ /**
2036
+ * Creates the Lambda handler used to create or reconcile the application database user.
2037
+ */
2038
+ protected abstract createDbUserHandler(baseProps: FunctionOptions): Function;
2039
+
2040
+ /**
2041
+ * Creates the Lambda handler used to run database migrations.
2042
+ */
2043
+ protected abstract createMigrationHandler(
2044
+ baseProps: FunctionOptions,
2045
+ ): Function;
2046
+
2047
+ public allowDefaultPortFrom(other: IConnectable, description?: string): void {
2048
+ if (this.proxy) {
2049
+ this.proxy.connections.allowFrom(
2050
+ other,
2051
+ Port.tcp(this.cluster.clusterEndpoint.port),
2052
+ description,
2053
+ );
2054
+ } else {
2055
+ this.cluster.connections.allowDefaultPortFrom(other, description);
2056
+ }
2057
+ }
2058
+
2059
+ public grantSecretRead(grantee: IGrantable) {
2060
+ return this.cluster.secret!.grantRead(grantee);
2061
+ }
2062
+
2063
+ public grantConnect(grantee: IGrantable) {
2064
+ return this.proxy
2065
+ ? this.proxy.grantConnect(grantee, this.dbUser)
2066
+ : this.cluster.grantConnect(grantee, this.dbUser);
2067
+ }
2068
+ }
2069
+ "
2070
+ `;