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

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 (1354) 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 +156 -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-lifespan-construction/metadata.json +3 -0
  190. package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.d.ts +6 -0
  191. package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.js +234 -0
  192. package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.js.map +1 -0
  193. package/src/migrations/latest/smithy-server-package-rename/metadata.json +3 -0
  194. package/src/migrations/latest/smithy-server-package-rename/migration.d.ts +6 -0
  195. package/src/migrations/latest/smithy-server-package-rename/migration.js +123 -0
  196. package/src/migrations/latest/smithy-server-package-rename/migration.js.map +1 -0
  197. package/src/migrations/latest/translate-script-whole-file-writes/files/build-system-prompt.ts.fixture +23 -0
  198. package/src/migrations/latest/translate-script-whole-file-writes/files/build-user-prompt.ts.fixture +96 -0
  199. package/src/migrations/latest/translate-script-whole-file-writes/files/config-path.ts.fixture +1 -0
  200. package/src/migrations/latest/translate-script-whole-file-writes/files/file-to-translate.ts.fixture +10 -0
  201. package/src/migrations/latest/translate-script-whole-file-writes/files/get-files-to-translate.ts.fixture +96 -0
  202. package/src/migrations/latest/translate-script-whole-file-writes/files/header.ts.fixture +15 -0
  203. package/src/migrations/latest/translate-script-whole-file-writes/files/log.ts.fixture +18 -0
  204. package/src/migrations/latest/translate-script-whole-file-writes/files/main-call.ts.fixture +6 -0
  205. package/src/migrations/latest/translate-script-whole-file-writes/files/main.ts.fixture +79 -0
  206. package/src/migrations/latest/translate-script-whole-file-writes/files/project-root.ts.fixture +1 -0
  207. package/src/migrations/latest/translate-script-whole-file-writes/files/run-with-concurrency.ts.fixture +57 -0
  208. package/src/migrations/latest/translate-script-whole-file-writes/files/scripts-dir.ts.fixture +1 -0
  209. package/src/migrations/latest/translate-script-whole-file-writes/files/translate-file-for-language.ts.fixture +61 -0
  210. package/src/migrations/latest/translate-script-whole-file-writes/grit/already-migrated.grit +1 -0
  211. package/src/migrations/latest/translate-script-whole-file-writes/grit/build-system-prompt.grit +6 -0
  212. package/src/migrations/latest/translate-script-whole-file-writes/grit/build-user-prompt.grit +6 -0
  213. package/src/migrations/latest/translate-script-whole-file-writes/grit/config-path.grit +1 -0
  214. package/src/migrations/latest/translate-script-whole-file-writes/grit/file-to-translate.grit +11 -0
  215. package/src/migrations/latest/translate-script-whole-file-writes/grit/get-files-to-translate.grit +7 -0
  216. package/src/migrations/latest/translate-script-whole-file-writes/grit/log.grit +3 -0
  217. package/src/migrations/latest/translate-script-whole-file-writes/grit/main-call.grit +1 -0
  218. package/src/migrations/latest/translate-script-whole-file-writes/grit/main.grit +8 -0
  219. package/src/migrations/latest/translate-script-whole-file-writes/grit/project-root.grit +1 -0
  220. package/src/migrations/latest/translate-script-whole-file-writes/grit/run-with-concurrency.grit +6 -0
  221. package/src/migrations/latest/translate-script-whole-file-writes/grit/translate-file-for-language.grit +6 -0
  222. package/src/migrations/latest/translate-script-whole-file-writes/metadata.json +3 -0
  223. package/src/migrations/latest/translate-script-whole-file-writes/migration.d.ts +2 -0
  224. package/src/migrations/latest/translate-script-whole-file-writes/migration.js +103 -0
  225. package/src/migrations/latest/translate-script-whole-file-writes/migration.js.map +1 -0
  226. package/src/migrations/latest/translate-script-whole-file-writes/test-fixtures/released-script-first.ts.fixture +430 -0
  227. package/src/migrations/latest/translate-script-whole-file-writes/test-fixtures/released-script.ts.fixture +431 -0
  228. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/metadata.json +3 -0
  229. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.d.ts +6 -0
  230. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.js +65 -0
  231. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.js.map +1 -0
  232. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/metadata.json +3 -0
  233. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.d.ts +6 -0
  234. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.js +108 -0
  235. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.js.map +1 -0
  236. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/metadata.json +3 -0
  237. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.d.ts +6 -0
  238. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.js +128 -0
  239. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.js.map +1 -0
  240. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/metadata.json +3 -0
  241. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.d.ts +6 -0
  242. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.js +215 -0
  243. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.js.map +1 -0
  244. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/metadata.json +3 -0
  245. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.d.ts +6 -0
  246. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.js +93 -0
  247. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
  248. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/metadata.json +3 -0
  249. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.d.ts +96 -0
  250. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.js +670 -0
  251. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.js.map +1 -0
  252. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/metadata.json +3 -0
  253. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.d.ts +6 -0
  254. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.js +89 -0
  255. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.js.map +1 -0
  256. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/metadata.json +3 -0
  257. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.d.ts +6 -0
  258. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.js +449 -0
  259. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.js.map +1 -0
  260. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/metadata.json +3 -0
  261. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.d.ts +6 -0
  262. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.js +78 -0
  263. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.js.map +1 -0
  264. 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
  265. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/__snapshots__/migration.spec.ts.snap +223 -0
  266. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/metadata.json +3 -0
  267. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.d.ts +6 -0
  268. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.js +217 -0
  269. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.js.map +1 -0
  270. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/__snapshots__/migration.spec.ts.snap +149 -0
  271. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/metadata.json +3 -0
  272. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.d.ts +6 -0
  273. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.js +195 -0
  274. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.js.map +1 -0
  275. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/__snapshots__/migration.spec.ts.snap +57 -0
  276. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/metadata.json +3 -0
  277. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.d.ts +6 -0
  278. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.js +77 -0
  279. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.js.map +1 -0
  280. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/__snapshots__/migration.spec.ts.snap +48 -0
  281. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/metadata.json +3 -0
  282. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.d.ts +6 -0
  283. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.js +91 -0
  284. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.js.map +1 -0
  285. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/metadata.json +3 -0
  286. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.d.ts +6 -0
  287. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.js +412 -0
  288. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.js.map +1 -0
  289. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/metadata.json +3 -0
  290. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.d.ts +6 -0
  291. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.js +33 -0
  292. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.js.map +1 -0
  293. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/metadata.json +3 -0
  294. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.d.ts +6 -0
  295. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.js +83 -0
  296. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.js.map +1 -0
  297. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/legacy-service.Dockerfile.fixture +95 -0
  298. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/metadata.json +3 -0
  299. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.d.ts +6 -0
  300. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.js +154 -0
  301. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.js.map +1 -0
  302. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/metadata.json +3 -0
  303. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.d.ts +6 -0
  304. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.js +71 -0
  305. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.js.map +1 -0
  306. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/metadata.json +3 -0
  307. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.d.ts +6 -0
  308. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.js +57 -0
  309. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.js.map +1 -0
  310. package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
  311. package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
  312. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +298 -74
  313. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +748 -103
  314. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +230 -37
  315. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +249 -52
  316. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5535 -0
  317. package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
  318. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +305 -71
  319. package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +298 -0
  320. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +353 -82
  321. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +176 -55
  322. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +100 -24
  323. package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
  324. package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
  325. package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
  326. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +200 -48
  327. package/src/open-api/ts-client/files/client.gen.ts.template +358 -24
  328. package/src/open-api/ts-client/files/types.gen.ts.template +6 -4
  329. package/src/open-api/ts-client/generator.js +41 -26
  330. package/src/open-api/ts-client/generator.js.map +1 -1
  331. package/src/open-api/ts-client/schema.d.js +6 -0
  332. package/src/open-api/ts-client/schema.d.js.map +1 -0
  333. package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +7 -2
  334. package/src/open-api/ts-hooks/generator.js +17 -21
  335. package/src/open-api/ts-hooks/generator.js.map +1 -1
  336. package/src/open-api/ts-hooks/generator.spec.tsx +70 -0
  337. package/src/open-api/ts-hooks/schema.d.js +6 -0
  338. package/src/open-api/ts-hooks/schema.d.js.map +1 -0
  339. package/src/open-api/ts-metadata/generator.js +12 -20
  340. package/src/open-api/ts-metadata/generator.js.map +1 -1
  341. package/src/open-api/ts-metadata/schema.d.js +6 -0
  342. package/src/open-api/ts-metadata/schema.d.js.map +1 -0
  343. package/src/open-api/utils/codegen-data/languages.d.ts +0 -6
  344. package/src/open-api/utils/codegen-data/languages.js +59 -66
  345. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  346. package/src/open-api/utils/codegen-data/types.d.ts +255 -10
  347. package/src/open-api/utils/codegen-data/types.js +54 -30
  348. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  349. package/src/open-api/utils/codegen-data.d.ts +2 -2
  350. package/src/open-api/utils/codegen-data.js +494 -674
  351. package/src/open-api/utils/codegen-data.js.map +1 -1
  352. package/src/open-api/utils/normalise.js +437 -246
  353. package/src/open-api/utils/normalise.js.map +1 -1
  354. package/src/open-api/utils/parse.js +8 -14
  355. package/src/open-api/utils/parse.js.map +1 -1
  356. package/src/open-api/utils/parser.d.ts +55 -0
  357. package/src/open-api/utils/parser.js +787 -0
  358. package/src/open-api/utils/parser.js.map +1 -0
  359. package/src/open-api/utils/refs.js +12 -22
  360. package/src/open-api/utils/refs.js.map +1 -1
  361. package/src/open-api/utils/types.d.ts +18 -0
  362. package/src/open-api/utils/types.js +5 -2
  363. package/src/open-api/utils/types.js.map +1 -1
  364. package/src/preset/__snapshots__/generator.spec.ts.snap +101 -20
  365. package/src/preset/generator.d.ts +14 -1
  366. package/src/preset/generator.js +76 -151
  367. package/src/preset/generator.js.map +1 -1
  368. package/src/preset/schema.d.js +6 -0
  369. package/src/preset/schema.d.js.map +1 -0
  370. package/src/preset/schema.d.ts +4 -1
  371. package/src/preset/schema.json +16 -5
  372. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +326 -0
  373. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +738 -0
  374. package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +191 -315
  375. package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +190 -0
  376. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +31 -0
  377. package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +29 -0
  378. package/src/py/agent/a2a-connection/generator.d.ts +24 -0
  379. package/src/py/agent/a2a-connection/generator.js +145 -88
  380. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  381. package/src/py/agent/a2a-connection/schema.d.js +8 -0
  382. package/src/py/agent/a2a-connection/schema.d.js.map +1 -0
  383. package/src/py/agent/a2a-connection/schema.d.ts +1 -0
  384. package/src/py/agent/a2a-connection/schema.json +5 -0
  385. package/src/py/agent/files/deploy/Dockerfile.template +8 -1
  386. package/src/py/agent/files/langchain/a2a/main.py.template +94 -0
  387. package/src/py/agent/files/langchain/ag-ui/main.py.template +87 -0
  388. package/src/py/agent/files/langchain/common/agent.py.template +30 -0
  389. package/src/py/agent/files/{http → langchain/http}/init.py.template +17 -25
  390. package/src/py/agent/files/langchain/http/main.py.template +81 -0
  391. package/src/py/agent/files/{a2a → strands/a2a}/main.py.template +33 -15
  392. package/src/py/agent/files/strands/ag-ui/main.py.template +89 -0
  393. package/src/py/agent/files/{common → strands/common}/agent.py.template +2 -0
  394. package/src/py/agent/files/strands/http/init.py.template +97 -0
  395. package/src/py/agent/files/{http → strands/http}/main.py.template +4 -13
  396. package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
  397. package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
  398. package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
  399. package/src/py/agent/gateway-connection/generator.d.ts +33 -0
  400. package/src/py/agent/gateway-connection/generator.js +153 -0
  401. package/src/py/agent/gateway-connection/generator.js.map +1 -0
  402. package/src/py/agent/gateway-connection/schema.d.js +6 -0
  403. package/src/py/agent/gateway-connection/schema.d.js.map +1 -0
  404. package/src/py/agent/gateway-connection/schema.d.ts +13 -0
  405. package/src/py/agent/gateway-connection/schema.json +31 -0
  406. package/src/py/agent/generator.d.ts +154 -1
  407. package/src/py/agent/generator.js +396 -197
  408. package/src/py/agent/generator.js.map +1 -1
  409. package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +154 -89
  410. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +31 -0
  411. package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +31 -0
  412. package/src/py/agent/mcp-connection/generator.d.ts +23 -0
  413. package/src/py/agent/mcp-connection/generator.js +103 -130
  414. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  415. package/src/py/agent/mcp-connection/schema.d.js +8 -0
  416. package/src/py/agent/mcp-connection/schema.d.js.map +1 -0
  417. package/src/py/agent/mcp-connection/schema.d.ts +1 -0
  418. package/src/py/agent/mcp-connection/schema.json +5 -0
  419. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +17 -19
  420. package/src/py/agent/react-connection/generator.d.ts +150 -1
  421. package/src/py/agent/react-connection/generator.js +105 -65
  422. package/src/py/agent/react-connection/generator.js.map +1 -1
  423. package/src/py/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +4 -4
  424. package/src/py/agent/react-connection/local-dev.js +36 -0
  425. package/src/py/agent/react-connection/local-dev.js.map +1 -0
  426. package/src/py/agent/react-connection/schema.d.js +8 -0
  427. package/src/py/agent/react-connection/schema.d.js.map +1 -0
  428. package/src/py/agent/react-connection/schema.d.ts +1 -0
  429. package/src/py/agent/react-connection/schema.json +5 -0
  430. package/src/py/agent/schema.d.js +6 -0
  431. package/src/py/agent/schema.d.js.map +1 -0
  432. package/src/py/agent/schema.d.ts +5 -1
  433. package/src/py/agent/schema.json +15 -1
  434. package/src/py/api/generator.js +12 -11
  435. package/src/py/api/generator.js.map +1 -1
  436. package/src/py/api/schema.d.js +6 -0
  437. package/src/py/api/schema.d.js.map +1 -0
  438. package/src/py/api/schema.d.ts +1 -0
  439. package/src/py/api/schema.json +5 -0
  440. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1520 -0
  441. package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +63 -0
  442. package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
  443. package/src/py/dynamodb/agent-connection/generator.js +45 -0
  444. package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
  445. package/src/py/dynamodb/agent-connection/schema.d.js +8 -0
  446. package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -0
  447. package/src/py/dynamodb/agent-connection/schema.d.ts +15 -0
  448. package/src/py/dynamodb/agent-connection/schema.json +27 -0
  449. package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +32 -0
  450. package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
  451. package/src/py/dynamodb/fast-api-connection/generator.js +39 -0
  452. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
  453. package/src/py/dynamodb/fast-api-connection/schema.d.js +8 -0
  454. package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -0
  455. package/src/py/dynamodb/fast-api-connection/schema.d.ts +13 -0
  456. package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
  457. package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
  458. package/src/py/dynamodb/files/__name__/client.py.template +39 -0
  459. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
  460. package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
  461. package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
  462. package/src/py/dynamodb/files/config.json.template +24 -0
  463. package/src/py/dynamodb/generator.d.ts +39 -0
  464. package/src/py/dynamodb/generator.js +130 -0
  465. package/src/py/dynamodb/generator.js.map +1 -0
  466. package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +63 -0
  467. package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  468. package/src/py/dynamodb/mcp-server-connection/generator.js +45 -0
  469. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
  470. package/src/py/dynamodb/mcp-server-connection/schema.d.js +8 -0
  471. package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  472. package/src/py/dynamodb/mcp-server-connection/schema.d.ts +15 -0
  473. package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
  474. package/src/py/dynamodb/schema.d.js +6 -0
  475. package/src/py/dynamodb/schema.d.js.map +1 -0
  476. package/src/py/dynamodb/schema.d.ts +16 -0
  477. package/src/py/dynamodb/schema.json +76 -0
  478. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +240 -4693
  479. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +5409 -0
  480. package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
  481. package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
  482. package/src/py/fast-api/generator.d.ts +72 -0
  483. package/src/py/fast-api/generator.js +134 -95
  484. package/src/py/fast-api/generator.js.map +1 -1
  485. package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +4 -3
  486. package/src/py/fast-api/react/generator.d.ts +16 -1
  487. package/src/py/fast-api/react/generator.js +38 -26
  488. package/src/py/fast-api/react/generator.js.map +1 -1
  489. package/src/py/fast-api/react/open-api.js +31 -29
  490. package/src/py/fast-api/react/open-api.js.map +1 -1
  491. package/src/py/fast-api/react/schema.d.js +6 -0
  492. package/src/py/fast-api/react/schema.d.js.map +1 -0
  493. package/src/py/fast-api/react/schema.d.ts +1 -0
  494. package/src/py/fast-api/react/schema.json +5 -0
  495. package/src/py/fast-api/schema.d.js +6 -0
  496. package/src/py/fast-api/schema.d.js.map +1 -0
  497. package/src/py/fast-api/schema.d.ts +1 -0
  498. package/src/py/fast-api/schema.json +6 -0
  499. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  500. package/src/py/lambda-function/generator.d.ts +21 -0
  501. package/src/py/lambda-function/generator.js +82 -62
  502. package/src/py/lambda-function/generator.js.map +1 -1
  503. package/src/py/lambda-function/schema.d.js +6 -0
  504. package/src/py/lambda-function/schema.d.js.map +1 -0
  505. package/src/py/lambda-function/schema.d.ts +1 -0
  506. package/src/py/lambda-function/schema.json +5 -0
  507. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +221 -21
  508. package/src/py/mcp-server/files/deploy/Dockerfile.template +8 -1
  509. package/src/py/mcp-server/generator.d.ts +68 -0
  510. package/src/py/mcp-server/generator.js +204 -131
  511. package/src/py/mcp-server/generator.js.map +1 -1
  512. package/src/py/mcp-server/schema.d.js +6 -0
  513. package/src/py/mcp-server/schema.d.js.map +1 -0
  514. package/src/py/mcp-server/schema.d.ts +1 -0
  515. package/src/py/mcp-server/schema.json +6 -0
  516. package/src/py/project/generator.d.ts +27 -1
  517. package/src/py/project/generator.js +248 -130
  518. package/src/py/project/generator.js.map +1 -1
  519. package/src/py/project/schema.d.js +6 -0
  520. package/src/py/project/schema.d.js.map +1 -0
  521. package/src/py/project/schema.d.ts +1 -0
  522. package/src/py/project/schema.json +5 -0
  523. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2070 -0
  524. package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +123 -0
  525. package/src/py/rdb/agent-connection/generator.d.ts +10 -0
  526. package/src/py/rdb/agent-connection/generator.js +52 -0
  527. package/src/py/rdb/agent-connection/generator.js.map +1 -0
  528. package/src/py/rdb/agent-connection/schema.d.js +8 -0
  529. package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
  530. package/src/py/rdb/agent-connection/schema.d.ts +15 -0
  531. package/src/py/rdb/agent-connection/schema.json +27 -0
  532. package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +51 -0
  533. package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
  534. package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
  535. package/src/py/rdb/fast-api-connection/generator.js +56 -0
  536. package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
  537. package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
  538. package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
  539. package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
  540. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  541. package/src/py/rdb/files/Dockerfile.create-db-user.template +14 -0
  542. package/src/py/rdb/files/Dockerfile.migration.template +14 -0
  543. package/src/py/rdb/files/__name__/__init__.py.template +3 -0
  544. package/src/py/rdb/files/__name__/connection.py.template +55 -0
  545. package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
  546. package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
  547. package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
  548. package/src/py/rdb/files/__name__/models/example.py.template +8 -0
  549. package/src/py/rdb/files/__name__/utils.py.template +104 -0
  550. package/src/py/rdb/files/alembic.ini.template +38 -0
  551. package/src/py/rdb/files/config.json.template +14 -0
  552. package/src/py/rdb/files/migrations/env.py.template +80 -0
  553. package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
  554. package/src/py/rdb/generator.d.ts +103 -0
  555. package/src/py/rdb/generator.js +328 -0
  556. package/src/py/rdb/generator.js.map +1 -0
  557. package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +119 -0
  558. package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
  559. package/src/py/rdb/mcp-server-connection/generator.js +52 -0
  560. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
  561. package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
  562. package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
  563. package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
  564. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  565. package/src/py/rdb/schema.d.js +6 -0
  566. package/src/py/rdb/schema.d.js.map +1 -0
  567. package/src/py/rdb/schema.d.ts +16 -0
  568. package/src/py/rdb/schema.json +78 -0
  569. package/src/py/rdb/utils.d.ts +6 -0
  570. package/src/py/rdb/utils.js +16 -0
  571. package/src/py/rdb/utils.js.map +1 -0
  572. package/src/sdk/agentcore-gateway.d.ts +6 -0
  573. package/src/sdk/agentcore-gateway.js +7 -0
  574. package/src/sdk/agentcore-gateway.js.map +1 -0
  575. package/src/sdk/connection.d.ts +6 -0
  576. package/src/sdk/connection.js +6 -0
  577. package/src/sdk/connection.js.map +1 -0
  578. package/src/sdk/license.d.ts +8 -0
  579. package/src/sdk/license.js +7 -0
  580. package/src/sdk/license.js.map +1 -0
  581. package/src/sdk/open-api.d.ts +10 -0
  582. package/src/sdk/open-api.js +8 -0
  583. package/src/sdk/open-api.js.map +1 -0
  584. package/src/sdk/py.d.ts +18 -0
  585. package/src/sdk/py.js +12 -0
  586. package/src/sdk/py.js.map +1 -0
  587. package/src/sdk/terraform.d.ts +6 -0
  588. package/src/sdk/terraform.js +7 -0
  589. package/src/sdk/terraform.js.map +1 -0
  590. package/src/sdk/ts.d.ts +39 -0
  591. package/src/sdk/ts.js +41 -0
  592. package/src/sdk/ts.js.map +1 -0
  593. package/{sdk/utils/format.d.ts → src/sdk/utils/ast.d.ts} +1 -1
  594. package/src/sdk/utils/ast.js +6 -0
  595. package/src/sdk/utils/ast.js.map +1 -0
  596. package/{sdk/utils/ast.d.ts → src/sdk/utils/format.d.ts} +1 -2
  597. package/src/sdk/utils/format.js +6 -0
  598. package/src/sdk/utils/format.js.map +1 -0
  599. package/{sdk → src/sdk}/utils/test.d.ts +1 -1
  600. package/src/sdk/utils/test.js +6 -0
  601. package/src/sdk/utils/test.js.map +1 -0
  602. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +245 -242
  603. package/src/smithy/project/files/{smithy-build.json.template → service/smithy-build.json.template} +5 -5
  604. package/src/smithy/project/files/{src → service/src}/operations/echo.smithy.template +1 -0
  605. package/src/smithy/project/files/shapes/smithy-build.json.template +7 -0
  606. package/src/smithy/project/files/shapes/src/main.smithy.template +11 -0
  607. package/src/smithy/project/files/ssdk-bundle/ssdk.rolldown.config.mjs.template +52 -0
  608. package/src/smithy/project/generator.d.ts +90 -0
  609. package/src/smithy/project/generator.js +223 -56
  610. package/src/smithy/project/generator.js.map +1 -1
  611. package/src/smithy/project/schema.d.js +6 -0
  612. package/src/smithy/project/schema.d.js.map +1 -0
  613. package/src/smithy/project/schema.d.ts +2 -0
  614. package/src/smithy/project/schema.json +28 -1
  615. package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
  616. package/src/smithy/react-connection/generator.d.ts +15 -0
  617. package/src/smithy/react-connection/generator.js +54 -48
  618. package/src/smithy/react-connection/generator.js.map +1 -1
  619. package/src/smithy/react-connection/schema.d.js +6 -0
  620. package/src/smithy/react-connection/schema.d.js.map +1 -0
  621. package/src/smithy/react-connection/schema.d.ts +1 -0
  622. package/src/smithy/react-connection/schema.json +5 -0
  623. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +871 -109
  624. package/src/smithy/ts/api/files/handler.ts.template +3 -3
  625. package/src/smithy/ts/api/files/local-server.ts.template +3 -3
  626. package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
  627. package/src/smithy/ts/api/files/service.ts.template +3 -3
  628. package/src/smithy/ts/api/generator.d.ts +88 -0
  629. package/src/smithy/ts/api/generator.js +187 -114
  630. package/src/smithy/ts/api/generator.js.map +1 -1
  631. package/src/smithy/ts/api/schema.d.js +6 -0
  632. package/src/smithy/ts/api/schema.d.js.map +1 -0
  633. package/src/smithy/ts/api/schema.d.ts +1 -0
  634. package/src/smithy/ts/api/schema.json +6 -0
  635. package/src/terraform/project/files/application/scripts/bootstrap.ts.template +40 -1
  636. package/src/terraform/project/files/application/src/main.tf.template +6 -1
  637. package/src/terraform/project/files/application/src/providers.tf.template +1 -1
  638. package/src/terraform/project/generator.d.ts +50 -0
  639. package/src/terraform/project/generator.js +212 -111
  640. package/src/terraform/project/generator.js.map +1 -1
  641. package/src/terraform/project/schema.d.js +9 -0
  642. package/src/terraform/project/schema.d.js.map +1 -0
  643. package/src/terraform/project/schema.d.ts +1 -0
  644. package/src/terraform/project/schema.json +5 -0
  645. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +1182 -184
  646. package/src/trpc/backend/files/src/client/index.ts.template +1 -1
  647. package/src/trpc/backend/files/src/handler.ts.template +1 -1
  648. package/src/trpc/backend/files/src/index.ts.template +5 -5
  649. package/src/trpc/backend/files/src/init.ts.template +1 -1
  650. package/src/trpc/backend/files/src/local-server.ts.template +1 -1
  651. package/src/trpc/backend/files/src/middleware/index.ts.template +7 -7
  652. package/src/trpc/backend/files/src/procedures/echo.ts.template +3 -3
  653. package/src/trpc/backend/files/src/router.ts.template +2 -2
  654. package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
  655. package/src/trpc/backend/files/src/schema/index.ts.template +1 -1
  656. package/src/trpc/backend/generator.d.ts +90 -1
  657. package/src/trpc/backend/generator.js +177 -100
  658. package/src/trpc/backend/generator.js.map +1 -1
  659. package/src/trpc/backend/schema.d.js +6 -0
  660. package/src/trpc/backend/schema.d.js.map +1 -0
  661. package/src/trpc/backend/schema.d.ts +1 -0
  662. package/src/trpc/backend/schema.json +6 -0
  663. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +4 -4
  664. package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
  665. package/src/trpc/react/generator.d.ts +38 -1
  666. package/src/trpc/react/generator.js +105 -63
  667. package/src/trpc/react/generator.js.map +1 -1
  668. package/src/trpc/react/schema.d.js +6 -0
  669. package/src/trpc/react/schema.d.js.map +1 -0
  670. package/src/trpc/react/schema.d.ts +1 -0
  671. package/src/trpc/react/schema.json +5 -0
  672. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +1452 -25
  673. package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +258 -0
  674. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
  675. package/src/ts/agent/a2a-connection/generator.d.ts +46 -0
  676. package/src/ts/agent/a2a-connection/generator.js +110 -63
  677. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  678. package/src/ts/agent/a2a-connection/schema.d.js +8 -0
  679. package/src/ts/agent/a2a-connection/schema.d.js.map +1 -0
  680. package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
  681. package/src/ts/agent/a2a-connection/schema.json +5 -0
  682. package/src/ts/agent/files/a2a/index.ts.template +1 -1
  683. package/src/ts/agent/files/ag-ui/index.ts.template +36 -11
  684. package/src/ts/agent/files/common/agent.ts.template +15 -2
  685. package/src/ts/agent/files/common/session.ts.template +43 -0
  686. package/src/ts/agent/files/deploy/Dockerfile.template +13 -2
  687. package/src/ts/agent/files/http/client.ts.template +2 -2
  688. package/src/ts/agent/files/http/index.ts.template +2 -2
  689. package/src/ts/agent/files/http/router.ts.template +5 -5
  690. package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +222 -0
  691. package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
  692. package/src/ts/agent/gateway-connection/generator.d.ts +47 -0
  693. package/src/ts/agent/gateway-connection/generator.js +144 -0
  694. package/src/ts/agent/gateway-connection/generator.js.map +1 -0
  695. package/src/ts/agent/gateway-connection/schema.d.js +6 -0
  696. package/src/ts/agent/gateway-connection/schema.d.js.map +1 -0
  697. package/src/ts/agent/gateway-connection/schema.d.ts +13 -0
  698. package/src/ts/agent/gateway-connection/schema.json +31 -0
  699. package/src/ts/agent/generator.d.ts +205 -0
  700. package/src/ts/agent/generator.js +339 -156
  701. package/src/ts/agent/generator.js.map +1 -1
  702. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +194 -113
  703. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +23 -0
  704. package/src/ts/agent/mcp-connection/generator.d.ts +37 -0
  705. package/src/ts/agent/mcp-connection/generator.js +88 -65
  706. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  707. package/src/ts/agent/mcp-connection/schema.d.js +8 -0
  708. package/src/ts/agent/mcp-connection/schema.d.js.map +1 -0
  709. package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
  710. package/src/ts/agent/mcp-connection/schema.json +5 -0
  711. package/src/ts/agent/react-connection/__snapshots__/generator.spec.ts.snap +8 -4
  712. package/src/ts/agent/react-connection/files/src/components/__agentNameClassName__AgentClientProvider.tsx.template +2 -1
  713. package/src/ts/agent/react-connection/generator.d.ts +202 -1
  714. package/src/ts/agent/react-connection/generator.js +158 -99
  715. package/src/ts/agent/react-connection/generator.js.map +1 -1
  716. package/src/ts/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +2 -2
  717. package/src/ts/agent/react-connection/local-dev.js +17 -0
  718. package/src/ts/agent/react-connection/local-dev.js.map +1 -0
  719. package/src/ts/agent/react-connection/schema.d.js +8 -0
  720. package/src/ts/agent/react-connection/schema.d.js.map +1 -0
  721. package/src/ts/agent/react-connection/schema.d.ts +1 -0
  722. package/src/ts/agent/react-connection/schema.json +5 -0
  723. package/src/ts/agent/schema.d.js +6 -0
  724. package/src/ts/agent/schema.d.js.map +1 -0
  725. package/src/ts/agent/schema.d.ts +4 -0
  726. package/src/ts/agent/schema.json +14 -0
  727. package/src/ts/api/generator.js +16 -16
  728. package/src/ts/api/generator.js.map +1 -1
  729. package/src/ts/api/schema.d.js +6 -0
  730. package/src/ts/api/schema.d.js.map +1 -0
  731. package/src/ts/api/schema.d.ts +1 -0
  732. package/src/ts/api/schema.json +5 -0
  733. package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +28 -14
  734. package/src/ts/astro-docs/files/base/src/content/docs/en/index.mdx.template +2 -2
  735. package/src/ts/astro-docs/files/base/src/content.config.ts.template +4 -4
  736. package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +272 -150
  737. package/src/ts/astro-docs/generator.d.ts +38 -0
  738. package/src/ts/astro-docs/generator.js +126 -61
  739. package/src/ts/astro-docs/generator.js.map +1 -1
  740. package/src/ts/astro-docs/schema.d.js +6 -0
  741. package/src/ts/astro-docs/schema.d.js.map +1 -0
  742. package/src/ts/astro-docs/schema.d.ts +2 -2
  743. package/src/ts/astro-docs/schema.json +3 -3
  744. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +982 -0
  745. package/src/ts/dcr-proxy/generator.d.ts +34 -0
  746. package/src/ts/dcr-proxy/generator.js +115 -0
  747. package/src/ts/dcr-proxy/generator.js.map +1 -0
  748. package/src/ts/dcr-proxy/schema.d.js +6 -0
  749. package/src/ts/dcr-proxy/schema.d.js.map +1 -0
  750. package/src/ts/dcr-proxy/schema.d.ts +13 -0
  751. package/src/ts/dcr-proxy/schema.json +44 -0
  752. package/src/ts/docs/generator.js +10 -10
  753. package/src/ts/docs/generator.js.map +1 -1
  754. package/src/ts/docs/schema.d.js +6 -0
  755. package/src/ts/docs/schema.d.js.map +1 -0
  756. package/src/ts/docs/schema.d.ts +1 -4
  757. package/src/ts/docs/schema.json +3 -3
  758. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +400 -518
  759. package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +23 -5
  760. package/src/ts/dynamodb/agent-connection/generator.js +27 -23
  761. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
  762. package/src/ts/dynamodb/agent-connection/schema.d.js +8 -0
  763. package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -0
  764. package/src/ts/dynamodb/agent-connection/schema.d.ts +1 -0
  765. package/src/ts/dynamodb/agent-connection/schema.json +5 -0
  766. package/src/ts/dynamodb/files/config.json.template +24 -0
  767. package/src/ts/dynamodb/files/src/client.ts.template +30 -11
  768. package/src/ts/dynamodb/files/src/entities/example.ts.template +1 -1
  769. package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -1
  770. package/src/ts/dynamodb/files/src/index.ts.template +2 -11
  771. package/src/ts/dynamodb/generator.d.ts +41 -0
  772. package/src/ts/dynamodb/generator.js +106 -64
  773. package/src/ts/dynamodb/generator.js.map +1 -1
  774. package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +23 -5
  775. package/src/ts/dynamodb/mcp-server-connection/generator.js +27 -23
  776. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
  777. package/src/ts/dynamodb/mcp-server-connection/schema.d.js +8 -0
  778. package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  779. package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +1 -0
  780. package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
  781. package/src/ts/dynamodb/schema.d.js +6 -0
  782. package/src/ts/dynamodb/schema.d.js.map +1 -0
  783. package/src/ts/dynamodb/schema.d.ts +2 -0
  784. package/src/ts/dynamodb/schema.json +26 -2
  785. package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +12 -3
  786. package/src/ts/dynamodb/smithy-connection/generator.js +22 -22
  787. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
  788. package/src/ts/dynamodb/smithy-connection/schema.d.js +8 -0
  789. package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -0
  790. package/src/ts/dynamodb/smithy-connection/schema.d.ts +1 -0
  791. package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
  792. package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +12 -3
  793. package/src/ts/dynamodb/trpc-connection/generator.js +22 -22
  794. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
  795. package/src/ts/dynamodb/trpc-connection/schema.d.js +8 -0
  796. package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -0
  797. package/src/ts/dynamodb/trpc-connection/schema.d.ts +1 -0
  798. package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
  799. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +8 -6
  800. package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
  801. package/src/ts/lambda-function/generator.d.ts +38 -0
  802. package/src/ts/lambda-function/generator.js +98 -65
  803. package/src/ts/lambda-function/generator.js.map +1 -1
  804. package/src/ts/lambda-function/io.js +83 -52
  805. package/src/ts/lambda-function/io.js.map +1 -1
  806. package/src/ts/lambda-function/schema.d.js +6 -0
  807. package/src/ts/lambda-function/schema.d.js.map +1 -0
  808. package/src/ts/lambda-function/schema.d.ts +1 -0
  809. package/src/ts/lambda-function/schema.json +5 -0
  810. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +83 -45
  811. package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +1 -1
  812. package/src/ts/lib/biome.js +71 -35
  813. package/src/ts/lib/biome.js.map +1 -1
  814. package/src/ts/lib/generator.d.ts +7 -0
  815. package/src/ts/lib/generator.js +115 -103
  816. package/src/ts/lib/generator.js.map +1 -1
  817. package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
  818. package/src/ts/lib/schema.d.js +6 -0
  819. package/src/ts/lib/schema.d.js.map +1 -0
  820. package/src/ts/lib/schema.d.ts +1 -1
  821. package/src/ts/lib/schema.json +5 -0
  822. package/src/ts/lib/ts-project-utils.d.ts +13 -1
  823. package/src/ts/lib/ts-project-utils.js +96 -71
  824. package/src/ts/lib/ts-project-utils.js.map +1 -1
  825. package/src/ts/lib/types.d.ts +6 -0
  826. package/src/ts/lib/types.js +5 -2
  827. package/src/ts/lib/types.js.map +1 -1
  828. package/src/ts/lib/vitest.d.ts +10 -1
  829. package/src/ts/lib/vitest.js +54 -26
  830. package/src/ts/lib/vitest.js.map +1 -1
  831. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +221 -44
  832. package/src/ts/mcp-server/files/Dockerfile.template +13 -2
  833. package/src/ts/mcp-server/generator.d.ts +110 -0
  834. package/src/ts/mcp-server/generator.js +231 -148
  835. package/src/ts/mcp-server/generator.js.map +1 -1
  836. package/src/ts/mcp-server/schema.d.js +6 -0
  837. package/src/ts/mcp-server/schema.d.js.map +1 -0
  838. package/src/ts/mcp-server/schema.d.ts +1 -0
  839. package/src/ts/mcp-server/schema.json +6 -0
  840. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +28 -13
  841. package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
  842. package/src/ts/nx-generator/files/common/schema.json.template +5 -0
  843. package/src/ts/nx-generator/files/local/generator.spec.ts.template +1 -1
  844. package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
  845. package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
  846. package/src/ts/nx-generator/generator.d.ts +3 -0
  847. package/src/ts/nx-generator/generator.js +124 -73
  848. package/src/ts/nx-generator/generator.js.map +1 -1
  849. package/src/ts/nx-generator/schema.d.js +6 -0
  850. package/src/ts/nx-generator/schema.d.js.map +1 -0
  851. package/src/ts/nx-generator/schema.d.ts +1 -0
  852. package/src/ts/nx-generator/schema.json +5 -0
  853. package/src/ts/nx-migration/files/migration.spec.ts.template +26 -0
  854. package/src/ts/nx-migration/files/migration.ts.template +65 -0
  855. package/src/ts/nx-migration/files/prompt.md.template +46 -0
  856. package/src/ts/nx-migration/generator.d.ts +27 -0
  857. package/src/ts/nx-migration/generator.js +147 -0
  858. package/src/ts/nx-migration/generator.js.map +1 -0
  859. package/src/ts/nx-migration/schema.d.js +6 -0
  860. package/src/ts/nx-migration/schema.d.js.map +1 -0
  861. package/src/ts/nx-migration/schema.d.ts +13 -0
  862. package/src/ts/nx-migration/schema.json +63 -0
  863. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +36 -25
  864. package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
  865. package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
  866. package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
  867. package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
  868. package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
  869. package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
  870. package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +4 -4
  871. package/src/ts/nx-plugin/generator.d.ts +3 -0
  872. package/src/ts/nx-plugin/generator.js +67 -50
  873. package/src/ts/nx-plugin/generator.js.map +1 -1
  874. package/src/ts/nx-plugin/schema.d.js +9 -0
  875. package/src/ts/nx-plugin/schema.d.js.map +1 -0
  876. package/src/ts/nx-plugin/schema.json +5 -0
  877. package/src/ts/nx-plugin/utils.d.ts +27 -2
  878. package/src/ts/nx-plugin/utils.js +66 -51
  879. package/src/ts/nx-plugin/utils.js.map +1 -1
  880. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +553 -644
  881. package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +16 -6
  882. package/src/ts/rdb/agent-connection/generator.js +44 -39
  883. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  884. package/src/ts/rdb/agent-connection/schema.d.js +8 -0
  885. package/src/ts/rdb/agent-connection/schema.d.js.map +1 -0
  886. package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
  887. package/src/ts/rdb/agent-connection/schema.json +5 -0
  888. package/src/ts/rdb/files/Dockerfile.template +19 -1
  889. package/src/ts/rdb/files/config.json.template +14 -0
  890. package/src/ts/rdb/files/prisma.config.ts.template +6 -5
  891. package/src/ts/rdb/files/src/create-db-user-handler.ts.template +9 -11
  892. package/src/ts/rdb/files/src/index.ts.template +1 -2
  893. package/src/ts/rdb/files/src/migration-handler.ts.template +5 -30
  894. package/src/ts/rdb/files/src/prisma.ts.template +33 -25
  895. package/src/ts/rdb/files/src/utils.ts.template +3 -0
  896. package/src/ts/rdb/generator.d.ts +117 -4
  897. package/src/ts/rdb/generator.js +257 -138
  898. package/src/ts/rdb/generator.js.map +1 -1
  899. package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +16 -6
  900. package/src/ts/rdb/mcp-server-connection/generator.js +42 -37
  901. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  902. package/src/ts/rdb/mcp-server-connection/schema.d.js +8 -0
  903. package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -0
  904. package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
  905. package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
  906. package/src/ts/rdb/schema.d.js +6 -0
  907. package/src/ts/rdb/schema.d.js.map +1 -0
  908. package/src/ts/rdb/schema.d.ts +1 -0
  909. package/src/ts/rdb/schema.json +7 -1
  910. package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +18 -9
  911. package/src/ts/rdb/smithy-connection/generator.js +48 -43
  912. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  913. package/src/ts/rdb/smithy-connection/schema.d.js +8 -0
  914. package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -0
  915. package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
  916. package/src/ts/rdb/smithy-connection/schema.json +5 -0
  917. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +12 -3
  918. package/src/ts/rdb/trpc-connection/generator.js +37 -31
  919. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  920. package/src/ts/rdb/trpc-connection/schema.d.js +8 -0
  921. package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -0
  922. package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
  923. package/src/ts/rdb/trpc-connection/schema.json +5 -0
  924. package/src/ts/rdb/utils.js +9 -11
  925. package/src/ts/rdb/utils.js.map +1 -1
  926. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +17 -16
  927. package/src/ts/react-website/agui/generator.d.ts +97 -0
  928. package/src/ts/react-website/agui/generator.js +114 -67
  929. package/src/ts/react-website/agui/generator.js.map +1 -1
  930. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +1391 -644
  931. package/src/ts/react-website/app/files/app/common/README.md.template +1 -1
  932. package/src/ts/react-website/app/generator.d.ts +142 -2
  933. package/src/ts/react-website/app/generator.js +333 -209
  934. package/src/ts/react-website/app/generator.js.map +1 -1
  935. package/src/ts/react-website/app/schema.d.js +6 -0
  936. package/src/ts/react-website/app/schema.d.js.map +1 -0
  937. package/src/ts/react-website/app/schema.d.ts +1 -1
  938. package/src/ts/react-website/app/schema.json +12 -6
  939. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +161 -26
  940. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +48 -12
  941. package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
  942. package/src/ts/react-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +2 -2
  943. package/src/ts/react-website/cognito-auth/generator.d.ts +25 -1
  944. package/src/ts/react-website/cognito-auth/generator.js +79 -64
  945. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  946. package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +3 -1
  947. package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
  948. package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
  949. package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
  950. package/src/ts/react-website/cognito-auth/schema.d.js +6 -0
  951. package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -0
  952. package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
  953. package/src/ts/react-website/cognito-auth/schema.json +5 -0
  954. package/src/ts/react-website/cognito-auth/utils.js +34 -32
  955. package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
  956. package/src/ts/react-website/runtime-config/__snapshots__/generator.spec.ts.snap +2 -2
  957. package/src/ts/react-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +2 -2
  958. package/src/ts/react-website/runtime-config/generator.js +29 -31
  959. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  960. package/src/ts/react-website/runtime-config/schema.d.js +6 -0
  961. package/src/ts/react-website/runtime-config/schema.d.js.map +1 -0
  962. package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
  963. package/src/ts/react-website/runtime-config/schema.json +5 -0
  964. package/src/ts/sync/generator.js +137 -60
  965. package/src/ts/sync/generator.js.map +1 -1
  966. package/src/ts/website/app/generator.js +10 -10
  967. package/src/ts/website/app/generator.js.map +1 -1
  968. package/src/ts/website/app/schema.d.js +6 -0
  969. package/src/ts/website/app/schema.d.js.map +1 -0
  970. package/src/ts/website/app/schema.d.ts +1 -1
  971. package/src/ts/website/app/schema.json +11 -6
  972. package/src/ts/website/auth/generator.d.ts +1 -1
  973. package/src/ts/website/auth/generator.js +11 -10
  974. package/src/ts/website/auth/generator.js.map +1 -1
  975. package/src/ts/website/auth/schema.d.js +6 -0
  976. package/src/ts/website/auth/schema.d.js.map +1 -0
  977. package/src/ts/website/auth/schema.d.ts +1 -0
  978. package/src/ts/website/auth/schema.json +5 -0
  979. package/src/utils/__snapshots__/shared-constructs.spec.ts.snap +21 -0
  980. package/src/utils/add-dependencies.d.ts +38 -0
  981. package/src/utils/add-dependencies.js +83 -0
  982. package/src/utils/add-dependencies.js.map +1 -0
  983. package/src/utils/agent-chat/agent-chat.d.ts +31 -0
  984. package/src/utils/agent-chat/agent-chat.js +31 -0
  985. package/src/utils/agent-chat/agent-chat.js.map +1 -0
  986. package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
  987. package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
  988. package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
  989. package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
  990. package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
  991. package/src/utils/agent-connection/agent-connection.d.ts +139 -26
  992. package/src/utils/agent-connection/agent-connection.js +500 -103
  993. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  994. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
  995. package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
  996. package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
  997. package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
  998. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
  999. package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +33 -33
  1000. package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
  1001. package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
  1002. package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +47 -0
  1003. package/src/utils/agent-connection/files/core-strands/base/tool-errors-strands.ts.template +29 -0
  1004. 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
  1005. package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
  1006. package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
  1007. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
  1008. package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
  1009. package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
  1010. package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
  1011. package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +99 -0
  1012. package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
  1013. package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
  1014. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
  1015. package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +6 -18
  1016. package/src/utils/agent-connection/files/py-core-runtime-config/session_context.py.template +2 -2
  1017. package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
  1018. package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
  1019. package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
  1020. 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
  1021. package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
  1022. package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
  1023. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +79 -0
  1024. package/src/utils/agent-core-constructs/agent-core-constructs.js +212 -38
  1025. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  1026. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +170 -6
  1027. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +87 -0
  1028. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.ts.template +366 -0
  1029. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +624 -0
  1030. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
  1031. package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +212 -1
  1032. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +521 -0
  1033. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
  1034. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.tf.template +282 -0
  1035. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +159 -13
  1036. package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
  1037. package/src/utils/api-constructs/api-constructs.d.ts +30 -2
  1038. package/src/utils/api-constructs/api-constructs.js +82 -32
  1039. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  1040. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +20 -15
  1041. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +24 -16
  1042. package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +26 -9
  1043. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +70 -0
  1044. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +82 -0
  1045. package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +56 -17
  1046. package/src/utils/api-constructs/files/cdk/core/api/trpc/trpc-utils.ts.template +1 -1
  1047. package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
  1048. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +101 -12
  1049. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +194 -8
  1050. package/src/utils/api-constructs/files/terraform/core/api/http/http-api/http-api.tf.template +1 -1
  1051. package/src/utils/api-constructs/files/terraform/core/api/rest/api-gateway-account/api-gateway-account.tf.template +83 -0
  1052. package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +5 -11
  1053. package/src/utils/api-constructs/open-api-metadata.js +22 -22
  1054. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  1055. package/src/utils/ast/website.js +18 -20
  1056. package/src/utils/ast/website.js.map +1 -1
  1057. package/src/utils/ast.d.ts +9 -0
  1058. package/src/utils/ast.js +125 -86
  1059. package/src/utils/ast.js.map +1 -1
  1060. package/src/utils/base-tsconfig.d.ts +30 -0
  1061. package/src/utils/base-tsconfig.js +32 -0
  1062. package/src/utils/base-tsconfig.js.map +1 -0
  1063. package/src/utils/bundle/bundle.d.ts +6 -1
  1064. package/src/utils/bundle/bundle.js +58 -48
  1065. package/src/utils/bundle/bundle.js.map +1 -1
  1066. package/src/utils/commands.d.ts +14 -3
  1067. package/src/utils/commands.js +83 -28
  1068. package/src/utils/commands.js.map +1 -1
  1069. package/src/utils/config/index.d.ts +18 -2
  1070. package/src/utils/config/index.js +5 -4
  1071. package/src/utils/config/index.js.map +1 -1
  1072. package/src/utils/config/utils.d.ts +8 -2
  1073. package/src/utils/config/utils.js +56 -59
  1074. package/src/utils/config/utils.js.map +1 -1
  1075. package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +16 -3
  1076. package/src/utils/connection/open-api/react.d.ts +31 -5
  1077. package/src/utils/connection/open-api/react.js +106 -76
  1078. package/src/utils/connection/open-api/react.js.map +1 -1
  1079. package/src/utils/containers.js +22 -23
  1080. package/src/utils/containers.js.map +1 -1
  1081. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.d.ts +38 -0
  1082. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js +93 -0
  1083. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js.map +1 -0
  1084. package/src/utils/dcr-proxy-constructs/files/cdk/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.ts.template +227 -0
  1085. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorization-server-metadata.ts.template +39 -0
  1086. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorize.ts.template +26 -0
  1087. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/mcp-proxy.ts.template +89 -0
  1088. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/protected-resource-metadata.ts.template +13 -0
  1089. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/register.ts.template +70 -0
  1090. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/token.ts.template +75 -0
  1091. package/src/utils/dcr-proxy-constructs/files/terraform/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.tf.template +410 -0
  1092. package/src/utils/declared-dependencies.d.ts +140 -0
  1093. package/src/utils/declared-dependencies.js +64 -0
  1094. package/src/utils/declared-dependencies.js.map +1 -0
  1095. package/src/utils/dependencies.d.ts +18 -0
  1096. package/src/utils/dependencies.js +206 -0
  1097. package/src/utils/dependencies.js.map +1 -0
  1098. package/src/utils/docker.d.ts +89 -0
  1099. package/src/utils/docker.js +125 -0
  1100. package/src/utils/docker.js.map +1 -0
  1101. package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +1 -1
  1102. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +39 -41
  1103. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
  1104. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +18 -5
  1105. package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +1 -1
  1106. package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +24 -17
  1107. package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +1 -1
  1108. package/src/utils/files/common/constructs/src/core/cloudfront.ts.template +14 -0
  1109. package/src/utils/files/common/constructs/src/core/index.ts.template +5 -4
  1110. package/src/utils/files/common/constructs/src/index.ts.template +2 -2
  1111. package/src/utils/files/common/infra-config/src/index.ts.template +3 -3
  1112. package/src/utils/files/common/infra-config/src/resolve-stage.ts.template +2 -2
  1113. package/src/utils/files/common/infra-config/src/stages.config.ts.template +1 -1
  1114. package/src/{ts/dynamodb/files/scripts → utils/files/common/scripts/src/dynamodb}/create-local-table.ts.template +65 -31
  1115. package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
  1116. package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +103 -0
  1117. package/src/utils/files/common/scripts/src/infra/infra-deploy.ts.template +2 -0
  1118. package/src/utils/files/common/scripts/src/infra/infra-destroy.ts.template +2 -0
  1119. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +6 -3
  1120. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +3 -3
  1121. package/src/utils/files/common/scripts/src/rdb/mysql/wait-for-mysql-db.ts.template +32 -0
  1122. package/src/utils/files/common/scripts/src/rdb/postgres/wait-for-postgres-db.ts.template +32 -0
  1123. package/src/utils/files/common/scripts/src/rdb/shared/pull-image.ts.template +16 -0
  1124. package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +115 -0
  1125. package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
  1126. package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
  1127. package/src/utils/files/shadcn/components.json.template +1 -1
  1128. package/src/utils/files/terraform/src/core/asset-bucket/asset-bucket.tf.template +63 -72
  1129. package/src/utils/files/terraform/src/core/runtime-config/appconfig/appconfig.tf.template +1 -1
  1130. package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +12 -6
  1131. package/src/utils/files/terraform/src/core/runtime-config/entry/entry.tf.template +1 -1
  1132. package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +9 -4
  1133. package/src/utils/files/website/hooks/sigv4/useSigV4.tsx.template +1 -1
  1134. package/src/utils/format.d.ts +39 -4
  1135. package/src/utils/format.js +318 -198
  1136. package/src/utils/format.js.map +1 -1
  1137. package/src/utils/fs.d.ts +24 -5
  1138. package/src/utils/fs.js +40 -15
  1139. package/src/utils/fs.js.map +1 -1
  1140. package/src/utils/function-constructs/files/cdk/app/lambda-functions/__nameKebabCase__.ts.template +1 -1
  1141. package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
  1142. package/src/utils/function-constructs/function-constructs.js +22 -25
  1143. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  1144. package/src/utils/generators.js +18 -20
  1145. package/src/utils/generators.js.map +1 -1
  1146. package/src/utils/git.js +19 -34
  1147. package/src/utils/git.js.map +1 -1
  1148. package/src/utils/iac-providers.js +5 -5
  1149. package/src/utils/iac-providers.js.map +1 -1
  1150. package/src/utils/iac.js +12 -14
  1151. package/src/utils/iac.js.map +1 -1
  1152. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +153 -24
  1153. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +28 -9
  1154. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +129 -12
  1155. package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
  1156. package/src/utils/identity-constructs/identity-constructs.d.ts +10 -0
  1157. package/src/utils/identity-constructs/identity-constructs.js +52 -31
  1158. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  1159. package/src/utils/init.d.ts +72 -0
  1160. package/src/utils/init.js +300 -0
  1161. package/src/utils/init.js.map +1 -0
  1162. package/src/utils/install.d.ts +32 -0
  1163. package/src/utils/install.js +58 -0
  1164. package/src/utils/install.js.map +1 -0
  1165. package/src/utils/js.js +27 -20
  1166. package/src/utils/js.js.map +1 -1
  1167. package/src/utils/mcp.d.ts +9 -0
  1168. package/src/utils/mcp.js +42 -41
  1169. package/src/utils/mcp.js.map +1 -1
  1170. package/src/utils/metrics.d.ts +7 -1
  1171. package/src/utils/metrics.js +61 -46
  1172. package/src/utils/metrics.js.map +1 -1
  1173. package/src/utils/migration-manifest.d.ts +58 -0
  1174. package/src/utils/migration-manifest.js +76 -0
  1175. package/src/utils/migration-manifest.js.map +1 -0
  1176. package/src/utils/migration-versions.d.ts +145 -0
  1177. package/src/utils/migration-versions.js +250 -0
  1178. package/src/utils/migration-versions.js.map +1 -0
  1179. package/src/utils/mock-project-graph.js +8 -12
  1180. package/src/utils/mock-project-graph.js.map +1 -1
  1181. package/src/utils/module-format.d.ts +25 -0
  1182. package/src/utils/module-format.js +45 -0
  1183. package/src/utils/module-format.js.map +1 -0
  1184. package/src/utils/names.d.ts +22 -0
  1185. package/src/utils/names.js +44 -48
  1186. package/src/utils/names.js.map +1 -1
  1187. package/src/utils/npm-scope.d.ts +0 -4
  1188. package/src/utils/npm-scope.js +7 -20
  1189. package/src/utils/npm-scope.js.map +1 -1
  1190. package/src/utils/nx.d.ts +74 -3
  1191. package/src/utils/nx.js +196 -75
  1192. package/src/utils/nx.js.map +1 -1
  1193. package/src/utils/nxlv-python.js +27 -15
  1194. package/src/utils/nxlv-python.js.map +1 -1
  1195. package/src/utils/object.js +5 -11
  1196. package/src/utils/object.js.map +1 -1
  1197. package/src/utils/paths.js +11 -15
  1198. package/src/utils/paths.js.map +1 -1
  1199. package/src/utils/pkg-manager.js +4 -9
  1200. package/src/utils/pkg-manager.js.map +1 -1
  1201. package/src/utils/pnpm-workspace.d.ts +1 -12
  1202. package/src/utils/pnpm-workspace.js +16 -43
  1203. package/src/utils/pnpm-workspace.js.map +1 -1
  1204. package/src/utils/port.d.ts +28 -6
  1205. package/src/utils/port.js +67 -28
  1206. package/src/utils/port.js.map +1 -1
  1207. package/src/utils/project-package-json.d.ts +39 -0
  1208. package/src/utils/project-package-json.js +119 -0
  1209. package/src/utils/project-package-json.js.map +1 -0
  1210. package/src/utils/py.d.ts +17 -3
  1211. package/src/utils/py.js +73 -48
  1212. package/src/utils/py.js.map +1 -1
  1213. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +72 -18
  1214. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +112 -88
  1215. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +127 -53
  1216. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +60 -53
  1217. package/src/utils/rdb-constructs/rdb-constructs.d.ts +12 -1
  1218. package/src/utils/rdb-constructs/rdb-constructs.js +38 -41
  1219. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  1220. package/src/utils/ruff.d.ts +59 -0
  1221. package/src/utils/ruff.js +140 -0
  1222. package/src/utils/ruff.js.map +1 -0
  1223. package/src/utils/shared-constructs-constants.d.ts +46 -4
  1224. package/src/utils/shared-constructs-constants.js +50 -15
  1225. package/src/utils/shared-constructs-constants.js.map +1 -1
  1226. package/src/utils/shared-constructs.d.ts +4 -1
  1227. package/src/utils/shared-constructs.js +62 -67
  1228. package/src/utils/shared-constructs.js.map +1 -1
  1229. package/src/utils/shared-dynamodb-scripts.d.ts +18 -0
  1230. package/src/utils/shared-dynamodb-scripts.js +35 -0
  1231. package/src/utils/shared-dynamodb-scripts.js.map +1 -0
  1232. package/src/utils/shared-infra-config.js +31 -30
  1233. package/src/utils/shared-infra-config.js.map +1 -1
  1234. package/src/utils/shared-infra-scripts.d.ts +26 -0
  1235. package/src/utils/shared-infra-scripts.js +58 -0
  1236. package/src/utils/shared-infra-scripts.js.map +1 -0
  1237. package/src/utils/shared-rdb-scripts.d.ts +27 -0
  1238. package/src/utils/shared-rdb-scripts.js +59 -0
  1239. package/src/utils/shared-rdb-scripts.js.map +1 -0
  1240. package/src/utils/shared-scripts.d.ts +1 -4
  1241. package/src/utils/shared-scripts.js +12 -38
  1242. package/src/utils/shared-scripts.js.map +1 -1
  1243. package/src/utils/shared-shadcn.d.ts +26 -1
  1244. package/src/utils/shared-shadcn.js +93 -67
  1245. package/src/utils/shared-shadcn.js.map +1 -1
  1246. package/src/utils/smithy.d.ts +59 -0
  1247. package/src/utils/smithy.js +73 -0
  1248. package/src/utils/smithy.js.map +1 -0
  1249. package/src/utils/test-git.d.ts +39 -0
  1250. package/src/utils/test-git.js +117 -0
  1251. package/src/utils/test-git.js.map +1 -0
  1252. package/src/utils/test.d.ts +10 -0
  1253. package/src/utils/test.js +44 -25
  1254. package/src/utils/test.js.map +1 -1
  1255. package/src/utils/toml.d.ts +5 -0
  1256. package/src/utils/toml.js +17 -15
  1257. package/src/utils/toml.js.map +1 -1
  1258. package/src/utils/version-upgrade-migration/migration.d.ts +14 -0
  1259. package/src/utils/version-upgrade-migration/migration.js +16 -0
  1260. package/src/utils/version-upgrade-migration/migration.js.map +1 -0
  1261. package/src/utils/version-upgrade-migration/nx-package-updates.d.ts +45 -0
  1262. package/src/utils/version-upgrade-migration/nx-package-updates.js +50 -0
  1263. package/src/utils/version-upgrade-migration/nx-package-updates.js.map +1 -0
  1264. package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +76 -0
  1265. package/src/utils/version-upgrade-migration/owned-dependencies.js +146 -0
  1266. package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -0
  1267. package/src/utils/version-upgrade-migration/register.d.ts +29 -0
  1268. package/src/utils/version-upgrade-migration/register.js +42 -0
  1269. package/src/utils/version-upgrade-migration/register.js.map +1 -0
  1270. package/src/utils/version-upgrade-migration/sync-embedded-versions.d.ts +26 -0
  1271. package/src/utils/version-upgrade-migration/sync-embedded-versions.js +352 -0
  1272. package/src/utils/version-upgrade-migration/sync-embedded-versions.js.map +1 -0
  1273. package/src/utils/version-upgrade-migration/sync-metrics-version.d.ts +13 -0
  1274. package/src/utils/version-upgrade-migration/sync-metrics-version.js +33 -0
  1275. package/src/utils/version-upgrade-migration/sync-metrics-version.js.map +1 -0
  1276. package/src/utils/version-upgrade-migration/sync-vended-versions.d.ts +10 -0
  1277. package/src/utils/version-upgrade-migration/sync-vended-versions.js +518 -0
  1278. package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -0
  1279. package/src/utils/version-upgrade-migration/vended-upgrade.d.ts +14 -0
  1280. package/src/utils/version-upgrade-migration/vended-upgrade.js +40 -0
  1281. package/src/utils/version-upgrade-migration/vended-upgrade.js.map +1 -0
  1282. package/src/utils/versions.d.ts +240 -108
  1283. package/src/utils/versions.js +265 -121
  1284. package/src/utils/versions.js.map +1 -1
  1285. package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +2 -2
  1286. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +207 -41
  1287. package/src/utils/website-constructs/files/terraform/app/static-websites/__websiteNameKebabCase__/__websiteNameKebabCase__.tf.template +1 -1
  1288. package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +145 -93
  1289. package/src/utils/website-constructs/website-constructs.d.ts +11 -0
  1290. package/src/utils/website-constructs/website-constructs.js +49 -30
  1291. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  1292. package/bin/aws-nx-mcp.d.ts +0 -2
  1293. package/bin/aws-nx-mcp.js +0 -17
  1294. package/bin/aws-nx-mcp.js.map +0 -1
  1295. package/sdk/connection.d.ts +0 -6
  1296. package/sdk/connection.js +0 -10
  1297. package/sdk/connection.js.map +0 -1
  1298. package/sdk/license.d.ts +0 -8
  1299. package/sdk/license.js +0 -13
  1300. package/sdk/license.js.map +0 -1
  1301. package/sdk/open-api.d.ts +0 -10
  1302. package/sdk/open-api.js +0 -15
  1303. package/sdk/open-api.js.map +0 -1
  1304. package/sdk/py.d.ts +0 -14
  1305. package/sdk/py.js +0 -18
  1306. package/sdk/py.js.map +0 -1
  1307. package/sdk/terraform.d.ts +0 -6
  1308. package/sdk/terraform.js +0 -11
  1309. package/sdk/terraform.js.map +0 -1
  1310. package/sdk/ts.d.ts +0 -29
  1311. package/sdk/ts.js +0 -47
  1312. package/sdk/ts.js.map +0 -1
  1313. package/sdk/utils/ast.js +0 -12
  1314. package/sdk/utils/ast.js.map +0 -1
  1315. package/sdk/utils/format.js +0 -10
  1316. package/sdk/utils/format.js.map +0 -1
  1317. package/sdk/utils/test.js +0 -10
  1318. package/sdk/utils/test.js.map +0 -1
  1319. package/src/connection/agent-serve-local.d.ts +0 -33
  1320. package/src/connection/agent-serve-local.js +0 -48
  1321. package/src/connection/agent-serve-local.js.map +0 -1
  1322. package/src/connection/serve-local.js +0 -41
  1323. package/src/connection/serve-local.js.map +0 -1
  1324. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
  1325. package/src/py/agent/files/ag-ui/main.py.template +0 -37
  1326. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
  1327. package/src/py/agent/react-connection/serve-local.js +0 -30
  1328. package/src/py/agent/react-connection/serve-local.js.map +0 -1
  1329. package/src/py/agent/scripts/http/chat.ts.template +0 -38
  1330. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
  1331. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
  1332. package/src/ts/agent/react-connection/serve-local.js +0 -19
  1333. package/src/ts/agent/react-connection/serve-local.js.map +0 -1
  1334. package/src/ts/agent/scripts/http/chat.ts.template +0 -35
  1335. package/src/ts/dynamodb/files/scripts/pull-image.ts.template +0 -15
  1336. package/src/ts/dynamodb/files/scripts/start-container.ts.template +0 -81
  1337. package/src/ts/dynamodb/files/src/constants.ts.template +0 -9
  1338. package/src/ts/dynamodb/files/src/gsi.ts.template +0 -14
  1339. package/src/ts/rdb/files/scripts/pull-image.ts.template +0 -15
  1340. package/src/ts/rdb/files/scripts/start-container.ts.template +0 -84
  1341. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
  1342. package/src/ts/rdb/files/src/constants.ts.template +0 -8
  1343. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
  1344. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
  1345. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
  1346. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
  1347. package/src/utils/files/common/scripts/src/infra-deploy.ts.template +0 -2
  1348. package/src/utils/files/common/scripts/src/infra-destroy.ts.template +0 -2
  1349. package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
  1350. /package/src/py/agent/files/{common → strands/common}/__init__.py.template +0 -0
  1351. /package/src/smithy/project/files/{src → service/src}/main.smithy.template +0 -0
  1352. /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
  1353. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
  1354. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
@@ -281,7 +281,7 @@ import { EchoInputSchema, EchoOutputSchema } from '../schema/index.js';
281
281
  export const echo = publicProcedure
282
282
  .input(EchoInputSchema)
283
283
  .output(EchoOutputSchema)
284
- .query((opts) => ({ result: opts.input.message }));
284
+ .query((opts) => ({ message: opts.input.message }));
285
285
  "
286
286
  `;
287
287
 
@@ -303,13 +303,13 @@ exports[`trpc backend generator > should generate the project > apps/test-api/sr
303
303
  "import { z } from 'zod';
304
304
 
305
305
  export const EchoInputSchema = z.object({
306
- message: z.string(),
306
+ message: z.string().max(1024),
307
307
  });
308
308
 
309
309
  export type IEchoInput = z.TypeOf<typeof EchoInputSchema>;
310
310
 
311
311
  export const EchoOutputSchema = z.object({
312
- result: z.string(),
312
+ message: z.string().max(1024),
313
313
  });
314
314
 
315
315
  export type IEchoOutput = z.TypeOf<typeof EchoOutputSchema>;
@@ -380,9 +380,10 @@ import {
380
380
  IntegrationBuilder,
381
381
  RestApiIntegration,
382
382
  } from '../../core/api/utils.js';
383
+ import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
383
384
  import { AddCorsPreflightAspect, RestApi } from '../../core/api/rest-api.js';
384
385
  import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
385
- import { AppRouter, appRouter } from ':proj/test-api';
386
+ import { AppRouter, appRouter } from '@proj/test-api';
386
387
 
387
388
  // String union type for all API operation names
388
389
  type Operations = Procedures<AppRouter>;
@@ -435,7 +436,7 @@ export class TestApi<
435
436
  return IntegrationBuilder.rest({
436
437
  pattern: 'isolated',
437
438
  operations: routerToOperations(appRouter),
438
- defaultIntegrationOptions: <FunctionProps>{
439
+ defaultIntegrationOptions: {
439
440
  runtime: Runtime.NODEJS_LATEST,
440
441
  handler: 'index.handler',
441
442
  code: Code.fromAsset(
@@ -448,7 +449,7 @@ export class TestApi<
448
449
  ),
449
450
  timeout: Duration.seconds(30),
450
451
  tracing: Tracing.ACTIVE,
451
- },
452
+ } as FunctionProps,
452
453
  buildDefaultIntegration: (op, props: FunctionProps) => {
453
454
  const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
454
455
  handler.addEnvironment(
@@ -478,6 +479,9 @@ export class TestApi<
478
479
  authorizer: new CognitoUserPoolsAuthorizer(scope, 'TestApiAuthorizer', {
479
480
  cognitoUserPools: [props.identity.userPool],
480
481
  }),
482
+ // Accept access tokens from both sign-in flows: 'openid' (Cognito hosted UI)
483
+ // and 'aws.cognito.signin.user.admin' (Cognito admin/SRP auth APIs).
484
+ authorizationScopes: ['openid', 'aws.cognito.signin.user.admin'],
481
485
  },
482
486
  deployOptions: {
483
487
  tracingEnabled: true,
@@ -504,7 +508,9 @@ export class TestApi<
504
508
  *
505
509
  * Configures the provided CloudFront distribution domains or origin strings
506
510
  * as the only permitted CORS origins in API Gateway preflight responses and the
507
- * AWS Lambda integrations.
511
+ * AWS Lambda integrations. Any custom domain names (aliases) configured on a
512
+ * CloudFront distribution are included automatically alongside its default
513
+ * \`*.cloudfront.net\` domain.
508
514
  *
509
515
  * @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
510
516
  */
@@ -515,12 +521,14 @@ export class TestApi<
515
521
  | { cloudFrontDistribution: Distribution }
516
522
  )[]
517
523
  ) {
518
- const allowedOrigins = origins.map((origin) =>
524
+ const allowedOrigins = origins.flatMap((origin) =>
519
525
  typeof origin === 'string'
520
- ? origin
521
- : 'cloudFrontDistribution' in origin
522
- ? \`https://\${origin.cloudFrontDistribution.distributionDomainName}\`
523
- : \`https://\${origin.distributionDomainName}\`,
526
+ ? [origin]
527
+ : findCloudFrontDomainNames(
528
+ 'cloudFrontDistribution' in origin
529
+ ? origin.cloudFrontDistribution
530
+ : origin,
531
+ ).map((domain) => \`https://\${domain}\`),
524
532
  );
525
533
 
526
534
  this.allowedOrigins = allowedOrigins;
@@ -589,9 +597,10 @@ import {
589
597
  HttpApiIntegration,
590
598
  IntegrationBuilder,
591
599
  } from '../../core/api/utils.js';
600
+ import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
592
601
  import { HttpApi } from '../../core/api/http-api.js';
593
602
  import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
594
- import { AppRouter, appRouter } from ':proj/test-api';
603
+ import { AppRouter, appRouter } from '@proj/test-api';
595
604
 
596
605
  // String union type for all API operation names
597
606
  type Operations = Procedures<AppRouter>;
@@ -637,7 +646,7 @@ export class TestApi<
637
646
  return IntegrationBuilder.http({
638
647
  pattern: 'isolated',
639
648
  operations: routerToOperations(appRouter),
640
- defaultIntegrationOptions: <FunctionProps>{
649
+ defaultIntegrationOptions: {
641
650
  runtime: Runtime.NODEJS_LATEST,
642
651
  handler: 'index.handler',
643
652
  code: Code.fromAsset(
@@ -650,7 +659,7 @@ export class TestApi<
650
659
  ),
651
660
  timeout: Duration.seconds(30),
652
661
  tracing: Tracing.ACTIVE,
653
- },
662
+ } as FunctionProps,
654
663
  buildDefaultIntegration: (op, props: FunctionProps) => {
655
664
  const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
656
665
  handler.addEnvironment(
@@ -706,6 +715,8 @@ export class TestApi<
706
715
  * as the only permitted CORS origins
707
716
  * in the API gateway. The CORS origins are not configured within the AWS Lambda
708
717
  * integrations since the associated header is controlled by API Gateway v2.
718
+ * Any custom domain names (aliases) configured on a CloudFront distribution are
719
+ * included automatically alongside its default \`*.cloudfront.net\` domain.
709
720
  *
710
721
  * @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
711
722
  */
@@ -716,12 +727,14 @@ export class TestApi<
716
727
  | { cloudFrontDistribution: Distribution }
717
728
  )[]
718
729
  ) {
719
- const allowedOrigins = origins.map((origin) =>
730
+ const allowedOrigins = origins.flatMap((origin) =>
720
731
  typeof origin === 'string'
721
- ? origin
722
- : 'cloudFrontDistribution' in origin
723
- ? \`https://\${origin.cloudFrontDistribution.distributionDomainName}\`
724
- : \`https://\${origin.distributionDomainName}\`,
732
+ ? [origin]
733
+ : findCloudFrontDomainNames(
734
+ 'cloudFrontDistribution' in origin
735
+ ? origin.cloudFrontDistribution
736
+ : origin,
737
+ ).map((domain) => \`https://\${domain}\`),
725
738
  );
726
739
 
727
740
  const cfnApi = this.api.node.defaultChild;
@@ -801,9 +814,10 @@ import {
801
814
  IntegrationBuilder,
802
815
  RestApiIntegration,
803
816
  } from '../../core/api/utils.js';
817
+ import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
804
818
  import { AddCorsPreflightAspect, RestApi } from '../../core/api/rest-api.js';
805
819
  import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
806
- import { AppRouter, appRouter } from ':proj/test-api';
820
+ import { AppRouter, appRouter } from '@proj/test-api';
807
821
 
808
822
  // String union type for all API operation names
809
823
  type Operations = Procedures<AppRouter>;
@@ -850,7 +864,7 @@ export class TestApi<
850
864
  return IntegrationBuilder.rest({
851
865
  pattern: 'isolated',
852
866
  operations: routerToOperations(appRouter),
853
- defaultIntegrationOptions: <FunctionProps>{
867
+ defaultIntegrationOptions: {
854
868
  runtime: Runtime.NODEJS_LATEST,
855
869
  handler: 'index.handler',
856
870
  code: Code.fromAsset(
@@ -863,7 +877,7 @@ export class TestApi<
863
877
  ),
864
878
  timeout: Duration.seconds(30),
865
879
  tracing: Tracing.ACTIVE,
866
- },
880
+ } as FunctionProps,
867
881
  buildDefaultIntegration: (op, props: FunctionProps) => {
868
882
  const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
869
883
  handler.addEnvironment(
@@ -938,7 +952,9 @@ export class TestApi<
938
952
  *
939
953
  * Configures the provided CloudFront distribution domains or origin strings
940
954
  * as the only permitted CORS origins in API Gateway preflight responses and the
941
- * AWS Lambda integrations.
955
+ * AWS Lambda integrations. Any custom domain names (aliases) configured on a
956
+ * CloudFront distribution are included automatically alongside its default
957
+ * \`*.cloudfront.net\` domain.
942
958
  *
943
959
  * @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
944
960
  */
@@ -949,12 +965,14 @@ export class TestApi<
949
965
  | { cloudFrontDistribution: Distribution }
950
966
  )[]
951
967
  ) {
952
- const allowedOrigins = origins.map((origin) =>
968
+ const allowedOrigins = origins.flatMap((origin) =>
953
969
  typeof origin === 'string'
954
- ? origin
955
- : 'cloudFrontDistribution' in origin
956
- ? \`https://\${origin.cloudFrontDistribution.distributionDomainName}\`
957
- : \`https://\${origin.distributionDomainName}\`,
970
+ ? [origin]
971
+ : findCloudFrontDomainNames(
972
+ 'cloudFrontDistribution' in origin
973
+ ? origin.cloudFrontDistribution
974
+ : origin,
975
+ ).map((domain) => \`https://\${domain}\`),
958
976
  );
959
977
 
960
978
  this.allowedOrigins = allowedOrigins;
@@ -1021,9 +1039,10 @@ import {
1021
1039
  HttpApiIntegration,
1022
1040
  IntegrationBuilder,
1023
1041
  } from '../../core/api/utils.js';
1042
+ import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
1024
1043
  import { HttpApi } from '../../core/api/http-api.js';
1025
1044
  import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
1026
- import { AppRouter, appRouter } from ':proj/test-api';
1045
+ import { AppRouter, appRouter } from '@proj/test-api';
1027
1046
 
1028
1047
  // String union type for all API operation names
1029
1048
  type Operations = Procedures<AppRouter>;
@@ -1062,7 +1081,7 @@ export class TestApi<
1062
1081
  return IntegrationBuilder.http({
1063
1082
  pattern: 'isolated',
1064
1083
  operations: routerToOperations(appRouter),
1065
- defaultIntegrationOptions: <FunctionProps>{
1084
+ defaultIntegrationOptions: {
1066
1085
  runtime: Runtime.NODEJS_LATEST,
1067
1086
  handler: 'index.handler',
1068
1087
  code: Code.fromAsset(
@@ -1075,7 +1094,7 @@ export class TestApi<
1075
1094
  ),
1076
1095
  timeout: Duration.seconds(30),
1077
1096
  tracing: Tracing.ACTIVE,
1078
- },
1097
+ } as FunctionProps,
1079
1098
  buildDefaultIntegration: (op, props: FunctionProps) => {
1080
1099
  const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
1081
1100
  handler.addEnvironment(
@@ -1150,6 +1169,8 @@ export class TestApi<
1150
1169
  * as the only permitted CORS origins
1151
1170
  * in the API gateway. The CORS origins are not configured within the AWS Lambda
1152
1171
  * integrations since the associated header is controlled by API Gateway v2.
1172
+ * Any custom domain names (aliases) configured on a CloudFront distribution are
1173
+ * included automatically alongside its default \`*.cloudfront.net\` domain.
1153
1174
  *
1154
1175
  * @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
1155
1176
  */
@@ -1160,12 +1181,14 @@ export class TestApi<
1160
1181
  | { cloudFrontDistribution: Distribution }
1161
1182
  )[]
1162
1183
  ) {
1163
- const allowedOrigins = origins.map((origin) =>
1184
+ const allowedOrigins = origins.flatMap((origin) =>
1164
1185
  typeof origin === 'string'
1165
- ? origin
1166
- : 'cloudFrontDistribution' in origin
1167
- ? \`https://\${origin.cloudFrontDistribution.distributionDomainName}\`
1168
- : \`https://\${origin.distributionDomainName}\`,
1186
+ ? [origin]
1187
+ : findCloudFrontDomainNames(
1188
+ 'cloudFrontDistribution' in origin
1189
+ ? origin.cloudFrontDistribution
1190
+ : origin,
1191
+ ).map((domain) => \`https://\${domain}\`),
1169
1192
  );
1170
1193
 
1171
1194
  const cfnApi = this.api.node.defaultChild;
@@ -1199,15 +1222,18 @@ import {
1199
1222
  HttpApiIntegration,
1200
1223
  OperationDetails,
1201
1224
  } from './utils.js';
1202
- import { CfnOutput } from 'aws-cdk-lib';
1225
+ import { CfnOutput, Stack } from 'aws-cdk-lib';
1203
1226
  import {
1204
1227
  HttpApi as _HttpApi,
1205
1228
  HttpApiProps as _HttpApiProps,
1206
1229
  HttpMethod,
1207
1230
  HttpStage,
1208
1231
  LogGroupLogDestination,
1232
+ ThrottleSettings,
1209
1233
  } from 'aws-cdk-lib/aws-apigatewayv2';
1210
1234
  import { LogGroup } from 'aws-cdk-lib/aws-logs';
1235
+ import { Key } from 'aws-cdk-lib/aws-kms';
1236
+ import { ServicePrincipal } from 'aws-cdk-lib/aws-iam';
1211
1237
  import { suppressRules } from '../checkov.js';
1212
1238
 
1213
1239
  /**
@@ -1232,6 +1258,12 @@ export interface HttpApiProps<
1232
1258
  * Map of operation names to their API Gateway integrations
1233
1259
  */
1234
1260
  readonly integrations: TIntegrations;
1261
+ /**
1262
+ * Default throttling limits applied to the API's default stage.
1263
+ *
1264
+ * @default { rateLimit: 10000, burstLimit: 5000 }
1265
+ */
1266
+ readonly throttle?: ThrottleSettings;
1235
1267
  }
1236
1268
 
1237
1269
  /**
@@ -1265,6 +1297,7 @@ export class HttpApi<
1265
1297
  apiName,
1266
1298
  operations,
1267
1299
  integrations,
1300
+ throttle = { rateLimit: 10000, burstLimit: 5000 },
1268
1301
  ...props
1269
1302
  }: HttpApiProps<TIntegrations, TOperation>,
1270
1303
  ) {
@@ -1277,12 +1310,18 @@ export class HttpApi<
1277
1310
  ...props,
1278
1311
  });
1279
1312
 
1280
- const accessLogGroup = new LogGroup(this, 'AccessLogs');
1281
- suppressRules(
1282
- accessLogGroup,
1283
- ['CKV_AWS_158'],
1284
- 'Using default CloudWatch log encryption',
1313
+ // Customer-managed key for access log encryption at rest
1314
+ const logsKey = new Key(this, 'AccessLogsKey', {
1315
+ enableKeyRotation: true,
1316
+ });
1317
+ const stack = Stack.of(this);
1318
+ logsKey.grantEncryptDecrypt(
1319
+ new ServicePrincipal(\`logs.\${stack.region}.amazonaws.com\`),
1285
1320
  );
1321
+
1322
+ const accessLogGroup = new LogGroup(this, 'AccessLogs', {
1323
+ encryptionKey: logsKey,
1324
+ });
1286
1325
  suppressRules(
1287
1326
  accessLogGroup,
1288
1327
  ['CKV_AWS_66', 'CKV_AWS_338'],
@@ -1292,6 +1331,7 @@ export class HttpApi<
1292
1331
  this.defaultStage = new HttpStage(this, 'DefaultStage', {
1293
1332
  httpApi: this.api,
1294
1333
  autoDeploy: true,
1334
+ throttle,
1295
1335
  accessLogSettings: {
1296
1336
  destination: new LogGroupLogDestination(accessLogGroup),
1297
1337
  },
@@ -1371,9 +1411,10 @@ import {
1371
1411
  HttpApiIntegration,
1372
1412
  IntegrationBuilder,
1373
1413
  } from '../../core/api/utils.js';
1414
+ import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
1374
1415
  import { HttpApi } from '../../core/api/http-api.js';
1375
1416
  import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
1376
- import { AppRouter, appRouter } from ':proj/test-api';
1417
+ import { AppRouter, appRouter } from '@proj/test-api';
1377
1418
 
1378
1419
  // String union type for all API operation names
1379
1420
  type Operations = Procedures<AppRouter>;
@@ -1412,7 +1453,7 @@ export class TestApi<
1412
1453
  return IntegrationBuilder.http({
1413
1454
  pattern: 'isolated',
1414
1455
  operations: routerToOperations(appRouter),
1415
- defaultIntegrationOptions: <FunctionProps>{
1456
+ defaultIntegrationOptions: {
1416
1457
  runtime: Runtime.NODEJS_LATEST,
1417
1458
  handler: 'index.handler',
1418
1459
  code: Code.fromAsset(
@@ -1425,7 +1466,7 @@ export class TestApi<
1425
1466
  ),
1426
1467
  timeout: Duration.seconds(30),
1427
1468
  tracing: Tracing.ACTIVE,
1428
- },
1469
+ } as FunctionProps,
1429
1470
  buildDefaultIntegration: (op, props: FunctionProps) => {
1430
1471
  const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
1431
1472
  handler.addEnvironment(
@@ -1475,6 +1516,8 @@ export class TestApi<
1475
1516
  * as the only permitted CORS origins
1476
1517
  * in the API gateway. The CORS origins are not configured within the AWS Lambda
1477
1518
  * integrations since the associated header is controlled by API Gateway v2.
1519
+ * Any custom domain names (aliases) configured on a CloudFront distribution are
1520
+ * included automatically alongside its default \`*.cloudfront.net\` domain.
1478
1521
  *
1479
1522
  * @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
1480
1523
  */
@@ -1485,12 +1528,14 @@ export class TestApi<
1485
1528
  | { cloudFrontDistribution: Distribution }
1486
1529
  )[]
1487
1530
  ) {
1488
- const allowedOrigins = origins.map((origin) =>
1531
+ const allowedOrigins = origins.flatMap((origin) =>
1489
1532
  typeof origin === 'string'
1490
- ? origin
1491
- : 'cloudFrontDistribution' in origin
1492
- ? \`https://\${origin.cloudFrontDistribution.distributionDomainName}\`
1493
- : \`https://\${origin.distributionDomainName}\`,
1533
+ ? [origin]
1534
+ : findCloudFrontDomainNames(
1535
+ 'cloudFrontDistribution' in origin
1536
+ ? origin.cloudFrontDistribution
1537
+ : origin,
1538
+ ).map((domain) => \`https://\${domain}\`),
1494
1539
  );
1495
1540
 
1496
1541
  const cfnApi = this.api.node.defaultChild;
@@ -1751,6 +1796,8 @@ export type ApiIntegrations<TOperation extends string, TBaseIntegration> =
1751
1796
  * @template TDefaultIntegrationProps - Type for default integration properties
1752
1797
  * @template TDefaultIntegration - Type for default integration implementation
1753
1798
  * @template TPattern - The integration pattern ('shared' or 'isolated')
1799
+ * @template TOverridden - Union of operation names that have been overridden
1800
+ * @template TOperationOptioned - Union of operation names with per-operation options
1754
1801
  */
1755
1802
  export class IntegrationBuilder<
1756
1803
  TOperation extends string,
@@ -1759,6 +1806,8 @@ export class IntegrationBuilder<
1759
1806
  TDefaultIntegrationProps extends object,
1760
1807
  TDefaultIntegration extends TBaseIntegration,
1761
1808
  TPattern extends 'shared' | 'isolated',
1809
+ TOverridden extends string = never,
1810
+ TOperationOptioned extends string = never,
1762
1811
  > {
1763
1812
  /** Options for the integration builder */
1764
1813
  private options: IntegrationBuilderProps<
@@ -1771,6 +1820,11 @@ export class IntegrationBuilder<
1771
1820
  /** Map of operation names to their custom integrations */
1772
1821
  private integrations: Partial<TIntegrations> = {};
1773
1822
 
1823
+ /** Map of default integration keys to per-operation default option overrides */
1824
+ private perOperationOptions: Partial<
1825
+ Record<string, Partial<TDefaultIntegrationProps>>
1826
+ > = {};
1827
+
1774
1828
  /**
1775
1829
  * Create an Integration Builder for an HTTP API with a shared pattern
1776
1830
  */
@@ -1925,11 +1979,16 @@ export class IntegrationBuilder<
1925
1979
  /**
1926
1980
  * Overrides default integrations with custom implementations for specific operations.
1927
1981
  *
1982
+ * Operations which have per-operation options set via withOperationOptions cannot be
1983
+ * overridden, since these still use the default integration.
1984
+ *
1928
1985
  * @param overrides - Map of operation names to their custom integration implementations
1929
1986
  * @returns The builder instance with updated type information reflecting the overrides
1930
1987
  */
1931
1988
  public withOverrides<
1932
- TOverrideIntegrations extends Partial<Record<TOperation, TBaseIntegration>>,
1989
+ TOverrideIntegrations extends Partial<
1990
+ Record<Exclude<TOperation, TOperationOptioned>, TBaseIntegration>
1991
+ >,
1933
1992
  >(overrides: TOverrideIntegrations) {
1934
1993
  this.integrations = { ...this.integrations, ...overrides };
1935
1994
  // Re-type to include the overridden integration types.
@@ -1945,7 +2004,9 @@ export class IntegrationBuilder<
1945
2004
  MergedIntegrations,
1946
2005
  TDefaultIntegrationProps,
1947
2006
  TDefaultIntegration,
1948
- TPattern
2007
+ TPattern,
2008
+ TOverridden | Extract<keyof TOverrideIntegrations, string>,
2009
+ TOperationOptioned
1949
2010
  >;
1950
2011
  }
1951
2012
 
@@ -1964,6 +2025,43 @@ export class IntegrationBuilder<
1964
2025
  return this;
1965
2026
  }
1966
2027
 
2028
+ /**
2029
+ * Updates the default integration options for specific operations, without
2030
+ * affecting the others. The given options are merged with the defaults (and
2031
+ * any options set via withDefaultOptions) when building each default integration.
2032
+ *
2033
+ * Operations which have been replaced via withOverrides cannot be targeted, since
2034
+ * they no longer use the default integration.
2035
+ *
2036
+ * @param options - Map of operation names to partial default integration options
2037
+ * @returns The builder instance
2038
+ */
2039
+ public withOperationOptions<
2040
+ TOptions extends Partial<
2041
+ Record<
2042
+ Exclude<DefaultIntegrationKeys<TPattern, TOperation>, TOverridden>,
2043
+ Partial<TDefaultIntegrationProps>
2044
+ >
2045
+ >,
2046
+ >(options: TOptions) {
2047
+ Object.entries(options).forEach(([op, opOptions]) => {
2048
+ this.perOperationOptions[op] = {
2049
+ ...this.perOperationOptions[op],
2050
+ ...(opOptions as Partial<TDefaultIntegrationProps>),
2051
+ };
2052
+ });
2053
+ return this as unknown as IntegrationBuilder<
2054
+ TOperation,
2055
+ TBaseIntegration,
2056
+ TIntegrations,
2057
+ TDefaultIntegrationProps,
2058
+ TDefaultIntegration,
2059
+ TPattern,
2060
+ TOverridden,
2061
+ TOperationOptioned | Extract<keyof TOptions, string>
2062
+ >;
2063
+ }
2064
+
1967
2065
  /**
1968
2066
  * Builds and returns the complete set of integrations.
1969
2067
  *
@@ -1978,6 +2076,10 @@ export class IntegrationBuilder<
1978
2076
  */
1979
2077
  public build(): TIntegrations {
1980
2078
  const options = this.options;
2079
+ const buildOptionsFor = (op: string): TDefaultIntegrationProps => ({
2080
+ ...options.defaultIntegrationOptions,
2081
+ ...this.perOperationOptions[op],
2082
+ });
1981
2083
  return {
1982
2084
  ...Object.fromEntries(
1983
2085
  options.pattern === 'shared'
@@ -1986,7 +2088,7 @@ export class IntegrationBuilder<
1986
2088
  '$router',
1987
2089
  options.buildDefaultIntegration(
1988
2090
  '$router',
1989
- options.defaultIntegrationOptions,
2091
+ buildOptionsFor('$router'),
1990
2092
  ),
1991
2093
  ],
1992
2094
  ]
@@ -1997,10 +2099,7 @@ export class IntegrationBuilder<
1997
2099
  )
1998
2100
  .map((op) => [
1999
2101
  op,
2000
- options.buildDefaultIntegration(
2001
- op,
2002
- options.defaultIntegrationOptions,
2003
- ),
2102
+ options.buildDefaultIntegration(op, buildOptionsFor(op)),
2004
2103
  ]),
2005
2104
  ),
2006
2105
  ...this.integrations,
@@ -2013,21 +2112,27 @@ export class IntegrationBuilder<
2013
2112
  exports[`trpc backend generator > should set up shared constructs for rest > rest-api.ts 1`] = `
2014
2113
  "import { Construct, IConstruct } from 'constructs';
2015
2114
  import {
2115
+ AccessLogFormat,
2016
2116
  Cors,
2117
+ LogGroupLogDestination,
2017
2118
  Resource,
2018
2119
  RestApi as _RestApi,
2019
2120
  RestApiProps as _RestApiProps,
2020
2121
  IResource,
2021
2122
  Stage,
2123
+ ThrottleSettings,
2022
2124
  } from 'aws-cdk-lib/aws-apigateway';
2023
- import { IAspect, RemovalPolicy } from 'aws-cdk-lib';
2125
+ import { IAspect, RemovalPolicy, Stack } from 'aws-cdk-lib';
2024
2126
  import {
2025
2127
  CfnLoggingConfiguration,
2026
2128
  CfnWebACL,
2027
2129
  CfnWebACLAssociation,
2028
2130
  } from 'aws-cdk-lib/aws-wafv2';
2029
2131
  import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs';
2132
+ import { Key } from 'aws-cdk-lib/aws-kms';
2133
+ import { ServicePrincipal } from 'aws-cdk-lib/aws-iam';
2030
2134
  import { RuntimeConfig } from '../runtime-config.js';
2135
+ import { ApiGatewayAccount } from './api-gateway-account.js';
2031
2136
  import {
2032
2137
  ApiIntegrations,
2033
2138
  OperationDetails,
@@ -2065,6 +2170,12 @@ export interface RestApiProps<
2065
2170
  * @default true
2066
2171
  */
2067
2172
  readonly enableWaf?: boolean;
2173
+ /**
2174
+ * Default throttling limits applied to all methods on the API's default stage.
2175
+ *
2176
+ * @default { rateLimit: 10000, burstLimit: 5000 }
2177
+ */
2178
+ readonly throttle?: ThrottleSettings;
2068
2179
  }
2069
2180
 
2070
2181
  /**
@@ -2099,14 +2210,49 @@ export class RestApi<
2099
2210
  operations,
2100
2211
  integrations,
2101
2212
  enableWaf = true,
2213
+ throttle = { rateLimit: 10000, burstLimit: 5000 },
2102
2214
  ...props
2103
2215
  }: RestApiProps<TIntegrations, TOperation>,
2104
2216
  ) {
2105
2217
  super(scope, id);
2106
2218
  this.integrations = integrations;
2107
2219
 
2220
+ // Account-level CloudWatch role required for REST API access logging
2221
+ const account = ApiGatewayAccount.ensure(this);
2222
+
2223
+ // KMS key for encrypting logs at rest, usable by CloudWatch Logs
2224
+ const logsKey = new Key(this, 'LogsKey', {
2225
+ enableKeyRotation: true,
2226
+ });
2227
+ logsKey.grantEncryptDecrypt(
2228
+ new ServicePrincipal(\`logs.\${Stack.of(this).region}.amazonaws.com\`),
2229
+ );
2230
+
2231
+ const accessLogs = new LogGroup(this, 'AccessLogs', {
2232
+ retention: RetentionDays.ONE_YEAR,
2233
+ encryptionKey: logsKey,
2234
+ });
2235
+
2108
2236
  // Create the API Gateway REST API
2109
- this.api = new _RestApi(this, 'Api', props);
2237
+ this.api = new _RestApi(this, 'Api', {
2238
+ ...props,
2239
+ deployOptions: {
2240
+ accessLogDestination: new LogGroupLogDestination(accessLogs),
2241
+ accessLogFormat: AccessLogFormat.jsonWithStandardFields(),
2242
+ ...props.deployOptions,
2243
+ methodOptions: {
2244
+ ...props.deployOptions?.methodOptions,
2245
+ // Default throttling applied to all resource paths and methods
2246
+ '/*/*': {
2247
+ throttlingRateLimit: throttle.rateLimit,
2248
+ throttlingBurstLimit: throttle.burstLimit,
2249
+ ...props.deployOptions?.methodOptions?.['/*/*'],
2250
+ },
2251
+ },
2252
+ },
2253
+ });
2254
+ // Ensure the account-level role is configured before the stage is created
2255
+ this.api.deploymentStage.node.addDependency(account.resource);
2110
2256
 
2111
2257
  if (enableWaf) {
2112
2258
  this.webAcl = new CfnWebACL(this, 'WebAcl', {
@@ -2173,14 +2319,12 @@ export class RestApi<
2173
2319
  // \`aws-waf-logs-\` to satisfy the WAFv2 logging destination requirement.
2174
2320
  const wafLogGroup = new LogGroup(this, 'WebAclLogs', {
2175
2321
  logGroupName: \`aws-waf-logs-\${apiName}-\${this.node.addr.slice(-8)}\`,
2176
- retention: RetentionDays.ONE_MONTH,
2322
+ retention: RetentionDays.ONE_YEAR,
2323
+ encryptionKey: logsKey,
2324
+ // The log group name is deterministic, so retaining it on delete would
2325
+ // orphan it and block re-creation (e.g. after a rolled-back deploy).
2177
2326
  removalPolicy: RemovalPolicy.DESTROY,
2178
2327
  });
2179
- suppressRules(
2180
- wafLogGroup,
2181
- ['CKV_AWS_158'],
2182
- 'Using default CloudWatch log encryption for WAF logs',
2183
- );
2184
2328
 
2185
2329
  new CfnLoggingConfiguration(this, 'WebAclLoggingConfig', {
2186
2330
  resourceArn: this.webAcl.attrArn,
@@ -2194,12 +2338,6 @@ export class RestApi<
2194
2338
  'Caching not required for this use case',
2195
2339
  (c) => c instanceof Stage,
2196
2340
  );
2197
- suppressRules(
2198
- this.api,
2199
- ['CKV_AWS_76'],
2200
- 'API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement',
2201
- (c) => c instanceof Stage,
2202
- );
2203
2341
 
2204
2342
  // Resolve the integration for a given operation.
2205
2343
  // If the operation has a dedicated integration, use it; otherwise fall back to $router.
@@ -2311,9 +2449,10 @@ import {
2311
2449
  IntegrationBuilder,
2312
2450
  RestApiIntegration,
2313
2451
  } from '../../core/api/utils.js';
2452
+ import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
2314
2453
  import { AddCorsPreflightAspect, RestApi } from '../../core/api/rest-api.js';
2315
2454
  import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
2316
- import { AppRouter, appRouter } from ':proj/test-api';
2455
+ import { AppRouter, appRouter } from '@proj/test-api';
2317
2456
 
2318
2457
  // String union type for all API operation names
2319
2458
  type Operations = Procedures<AppRouter>;
@@ -2360,7 +2499,7 @@ export class TestApi<
2360
2499
  return IntegrationBuilder.rest({
2361
2500
  pattern: 'isolated',
2362
2501
  operations: routerToOperations(appRouter),
2363
- defaultIntegrationOptions: <FunctionProps>{
2502
+ defaultIntegrationOptions: {
2364
2503
  runtime: Runtime.NODEJS_LATEST,
2365
2504
  handler: 'index.handler',
2366
2505
  code: Code.fromAsset(
@@ -2373,7 +2512,7 @@ export class TestApi<
2373
2512
  ),
2374
2513
  timeout: Duration.seconds(30),
2375
2514
  tracing: Tracing.ACTIVE,
2376
- },
2515
+ } as FunctionProps,
2377
2516
  buildDefaultIntegration: (op, props: FunctionProps) => {
2378
2517
  const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
2379
2518
  handler.addEnvironment(
@@ -2426,7 +2565,9 @@ export class TestApi<
2426
2565
  *
2427
2566
  * Configures the provided CloudFront distribution domains or origin strings
2428
2567
  * as the only permitted CORS origins in API Gateway preflight responses and the
2429
- * AWS Lambda integrations.
2568
+ * AWS Lambda integrations. Any custom domain names (aliases) configured on a
2569
+ * CloudFront distribution are included automatically alongside its default
2570
+ * \`*.cloudfront.net\` domain.
2430
2571
  *
2431
2572
  * @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
2432
2573
  */
@@ -2437,12 +2578,14 @@ export class TestApi<
2437
2578
  | { cloudFrontDistribution: Distribution }
2438
2579
  )[]
2439
2580
  ) {
2440
- const allowedOrigins = origins.map((origin) =>
2581
+ const allowedOrigins = origins.flatMap((origin) =>
2441
2582
  typeof origin === 'string'
2442
- ? origin
2443
- : 'cloudFrontDistribution' in origin
2444
- ? \`https://\${origin.cloudFrontDistribution.distributionDomainName}\`
2445
- : \`https://\${origin.distributionDomainName}\`,
2583
+ ? [origin]
2584
+ : findCloudFrontDomainNames(
2585
+ 'cloudFrontDistribution' in origin
2586
+ ? origin.cloudFrontDistribution
2587
+ : origin,
2588
+ ).map((domain) => \`https://\${domain}\`),
2446
2589
  );
2447
2590
 
2448
2591
  this.allowedOrigins = allowedOrigins;
@@ -2708,6 +2851,8 @@ export type ApiIntegrations<TOperation extends string, TBaseIntegration> =
2708
2851
  * @template TDefaultIntegrationProps - Type for default integration properties
2709
2852
  * @template TDefaultIntegration - Type for default integration implementation
2710
2853
  * @template TPattern - The integration pattern ('shared' or 'isolated')
2854
+ * @template TOverridden - Union of operation names that have been overridden
2855
+ * @template TOperationOptioned - Union of operation names with per-operation options
2711
2856
  */
2712
2857
  export class IntegrationBuilder<
2713
2858
  TOperation extends string,
@@ -2716,6 +2861,8 @@ export class IntegrationBuilder<
2716
2861
  TDefaultIntegrationProps extends object,
2717
2862
  TDefaultIntegration extends TBaseIntegration,
2718
2863
  TPattern extends 'shared' | 'isolated',
2864
+ TOverridden extends string = never,
2865
+ TOperationOptioned extends string = never,
2719
2866
  > {
2720
2867
  /** Options for the integration builder */
2721
2868
  private options: IntegrationBuilderProps<
@@ -2728,6 +2875,11 @@ export class IntegrationBuilder<
2728
2875
  /** Map of operation names to their custom integrations */
2729
2876
  private integrations: Partial<TIntegrations> = {};
2730
2877
 
2878
+ /** Map of default integration keys to per-operation default option overrides */
2879
+ private perOperationOptions: Partial<
2880
+ Record<string, Partial<TDefaultIntegrationProps>>
2881
+ > = {};
2882
+
2731
2883
  /**
2732
2884
  * Create an Integration Builder for an HTTP API with a shared pattern
2733
2885
  */
@@ -2882,11 +3034,16 @@ export class IntegrationBuilder<
2882
3034
  /**
2883
3035
  * Overrides default integrations with custom implementations for specific operations.
2884
3036
  *
3037
+ * Operations which have per-operation options set via withOperationOptions cannot be
3038
+ * overridden, since these still use the default integration.
3039
+ *
2885
3040
  * @param overrides - Map of operation names to their custom integration implementations
2886
3041
  * @returns The builder instance with updated type information reflecting the overrides
2887
3042
  */
2888
3043
  public withOverrides<
2889
- TOverrideIntegrations extends Partial<Record<TOperation, TBaseIntegration>>,
3044
+ TOverrideIntegrations extends Partial<
3045
+ Record<Exclude<TOperation, TOperationOptioned>, TBaseIntegration>
3046
+ >,
2890
3047
  >(overrides: TOverrideIntegrations) {
2891
3048
  this.integrations = { ...this.integrations, ...overrides };
2892
3049
  // Re-type to include the overridden integration types.
@@ -2902,7 +3059,9 @@ export class IntegrationBuilder<
2902
3059
  MergedIntegrations,
2903
3060
  TDefaultIntegrationProps,
2904
3061
  TDefaultIntegration,
2905
- TPattern
3062
+ TPattern,
3063
+ TOverridden | Extract<keyof TOverrideIntegrations, string>,
3064
+ TOperationOptioned
2906
3065
  >;
2907
3066
  }
2908
3067
 
@@ -2921,6 +3080,43 @@ export class IntegrationBuilder<
2921
3080
  return this;
2922
3081
  }
2923
3082
 
3083
+ /**
3084
+ * Updates the default integration options for specific operations, without
3085
+ * affecting the others. The given options are merged with the defaults (and
3086
+ * any options set via withDefaultOptions) when building each default integration.
3087
+ *
3088
+ * Operations which have been replaced via withOverrides cannot be targeted, since
3089
+ * they no longer use the default integration.
3090
+ *
3091
+ * @param options - Map of operation names to partial default integration options
3092
+ * @returns The builder instance
3093
+ */
3094
+ public withOperationOptions<
3095
+ TOptions extends Partial<
3096
+ Record<
3097
+ Exclude<DefaultIntegrationKeys<TPattern, TOperation>, TOverridden>,
3098
+ Partial<TDefaultIntegrationProps>
3099
+ >
3100
+ >,
3101
+ >(options: TOptions) {
3102
+ Object.entries(options).forEach(([op, opOptions]) => {
3103
+ this.perOperationOptions[op] = {
3104
+ ...this.perOperationOptions[op],
3105
+ ...(opOptions as Partial<TDefaultIntegrationProps>),
3106
+ };
3107
+ });
3108
+ return this as unknown as IntegrationBuilder<
3109
+ TOperation,
3110
+ TBaseIntegration,
3111
+ TIntegrations,
3112
+ TDefaultIntegrationProps,
3113
+ TDefaultIntegration,
3114
+ TPattern,
3115
+ TOverridden,
3116
+ TOperationOptioned | Extract<keyof TOptions, string>
3117
+ >;
3118
+ }
3119
+
2924
3120
  /**
2925
3121
  * Builds and returns the complete set of integrations.
2926
3122
  *
@@ -2935,6 +3131,10 @@ export class IntegrationBuilder<
2935
3131
  */
2936
3132
  public build(): TIntegrations {
2937
3133
  const options = this.options;
3134
+ const buildOptionsFor = (op: string): TDefaultIntegrationProps => ({
3135
+ ...options.defaultIntegrationOptions,
3136
+ ...this.perOperationOptions[op],
3137
+ });
2938
3138
  return {
2939
3139
  ...Object.fromEntries(
2940
3140
  options.pattern === 'shared'
@@ -2943,7 +3143,7 @@ export class IntegrationBuilder<
2943
3143
  '$router',
2944
3144
  options.buildDefaultIntegration(
2945
3145
  '$router',
2946
- options.defaultIntegrationOptions,
3146
+ buildOptionsFor('$router'),
2947
3147
  ),
2948
3148
  ],
2949
3149
  ]
@@ -2954,10 +3154,7 @@ export class IntegrationBuilder<
2954
3154
  )
2955
3155
  .map((op) => [
2956
3156
  op,
2957
- options.buildDefaultIntegration(
2958
- op,
2959
- options.defaultIntegrationOptions,
2960
- ),
3157
+ options.buildDefaultIntegration(op, buildOptionsFor(op)),
2961
3158
  ]),
2962
3159
  ),
2963
3160
  ...this.integrations,
@@ -2978,7 +3175,7 @@ terraform {
2978
3175
  required_providers {
2979
3176
  aws = {
2980
3177
  source = "hashicorp/aws"
2981
- version = "~> 6.0"
3178
+ version = "6.58.0"
2982
3179
  }
2983
3180
  }
2984
3181
  }
@@ -3225,7 +3422,7 @@ output "api_log_group_arn" {
3225
3422
  required_providers {
3226
3423
  aws = {
3227
3424
  source = "hashicorp/aws"
3228
- version = "~> 6.0"
3425
+ version = "6.58.0"
3229
3426
  }
3230
3427
  }
3231
3428
  }
@@ -3257,11 +3454,47 @@ variable "additional_iam_policy_statements" {
3257
3454
  default = []
3258
3455
  }
3259
3456
 
3457
+ variable "appconfig_application_id" {
3458
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
3459
+ type = string
3460
+ default = null
3461
+ }
3462
+
3463
+ variable "appconfig_application_arn" {
3464
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
3465
+ type = string
3466
+ default = null
3467
+ }
3468
+
3260
3469
  variable "asset_bucket_name" {
3261
3470
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
3262
3471
  type = string
3263
3472
  }
3264
3473
 
3474
+ # VPC Configuration (optional)
3475
+ variable "enable_vpc" {
3476
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
3477
+ type = bool
3478
+ default = false
3479
+ }
3480
+
3481
+ variable "vpc_id" {
3482
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
3483
+ type = string
3484
+ default = null
3485
+
3486
+ validation {
3487
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
3488
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
3489
+ }
3490
+ }
3491
+
3492
+ variable "subnet_ids" {
3493
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
3494
+ type = list(string)
3495
+ default = null
3496
+ }
3497
+
3265
3498
  # CORS Configuration (passed to core module)
3266
3499
  variable "cors_allow_credentials" {
3267
3500
  description = "Whether to allow credentials in CORS requests"
@@ -3293,12 +3526,6 @@ variable "cors_expose_headers" {
3293
3526
  default = []
3294
3527
  }
3295
3528
 
3296
- variable "cors_max_age" {
3297
- description = "Maximum age for CORS preflight requests in seconds"
3298
- type = number
3299
- default = 0
3300
- }
3301
-
3302
3529
  # Tags
3303
3530
  variable "tags" {
3304
3531
  description = "Tags to apply to all resources"
@@ -3349,16 +3576,37 @@ module "http_api" {
3349
3576
  cors_allow_methods = var.cors_allow_methods
3350
3577
  cors_allow_origins = var.cors_allow_origins
3351
3578
  cors_expose_headers = var.cors_expose_headers
3352
- cors_max_age = var.cors_max_age
3353
3579
 
3354
3580
  # Tags
3355
3581
  tags = var.tags
3356
3582
  }
3357
3583
 
3584
+ # Security group for the API Lambda function, used when deployed into a VPC
3585
+ resource "aws_security_group" "api_lambda" {
3586
+ count = var.enable_vpc ? 1 : 0
3587
+
3588
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
3589
+ name_prefix = "test-api-lambda-"
3590
+ description = "Security group for the TestApi API Lambda function"
3591
+ vpc_id = var.vpc_id
3592
+ tags = var.tags
3593
+ }
3594
+
3595
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
3596
+ count = var.enable_vpc ? 1 : 0
3597
+
3598
+ security_group_id = aws_security_group.api_lambda[0].id
3599
+ cidr_ipv4 = "0.0.0.0/0"
3600
+ from_port = 443
3601
+ to_port = 443
3602
+ ip_protocol = "tcp"
3603
+ description = "Allow outbound HTTPS to AWS service endpoints"
3604
+ }
3605
+
3358
3606
  # Lambda function
3359
3607
  # This configures a single "router" lambda to serve all requests
3360
3608
  resource "aws_lambda_function" "api_lambda" {
3361
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
3609
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
3362
3610
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
3363
3611
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
3364
3612
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -3380,13 +3628,25 @@ resource "aws_lambda_function" "api_lambda" {
3380
3628
  mode = "Active"
3381
3629
  }
3382
3630
 
3631
+ dynamic "vpc_config" {
3632
+ for_each = var.enable_vpc ? [1] : []
3633
+ content {
3634
+ subnet_ids = var.subnet_ids
3635
+ security_group_ids = [aws_security_group.api_lambda[0].id]
3636
+ }
3637
+ }
3638
+
3383
3639
 
3384
3640
  environment {
3385
3641
  variables = merge({
3386
- }, var.env)
3642
+ }, var.appconfig_application_id != null ? {
3643
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
3644
+ } : {}, var.env)
3387
3645
  }
3388
3646
 
3389
3647
  tags = var.tags
3648
+
3649
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
3390
3650
  }
3391
3651
 
3392
3652
  # IAM role for Lambda execution
@@ -3421,18 +3681,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
3421
3681
  role = aws_iam_role.lambda_execution_role.name
3422
3682
  }
3423
3683
 
3684
+ # Attach VPC access policy to Lambda role when deployed into a VPC
3685
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
3686
+ count = var.enable_vpc ? 1 : 0
3687
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
3688
+ role = aws_iam_role.lambda_execution_role.name
3689
+ }
3690
+
3424
3691
  # Additional IAM policies for Lambda (if provided)
3425
3692
  resource "aws_iam_role_policy" "lambda_additional_policies" {
3426
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
3693
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
3427
3694
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
3428
3695
  role = aws_iam_role.lambda_execution_role.id
3429
3696
 
3430
3697
  policy = jsonencode({
3431
3698
  Version = "2012-10-17"
3432
- Statement = var.additional_iam_policy_statements
3699
+ Statement = local.lambda_policy_statements
3433
3700
  })
3434
3701
  }
3435
3702
 
3703
+ locals {
3704
+ # Grant read access to the runtime-config AppConfig application when wired
3705
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
3706
+ {
3707
+ Effect = "Allow"
3708
+ Action = [
3709
+ "appconfig:StartConfigurationSession",
3710
+ "appconfig:GetLatestConfiguration"
3711
+ ]
3712
+ Resource = ["\${var.appconfig_application_arn}/*"]
3713
+ }
3714
+ ] : [], var.additional_iam_policy_statements)
3715
+ }
3716
+
3436
3717
  # CloudWatch Log Group for Lambda
3437
3718
  resource "aws_cloudwatch_log_group" "lambda_logs" {
3438
3719
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -3591,6 +3872,11 @@ output "lambda_execution_role_name" {
3591
3872
  value = aws_iam_role.lambda_execution_role.name
3592
3873
  }
3593
3874
 
3875
+ output "security_group_id" {
3876
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
3877
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
3878
+ }
3879
+
3594
3880
  # Integration Outputs
3595
3881
  output "integration_id" {
3596
3882
  description = "ID of the Lambda integration"
@@ -3631,7 +3917,7 @@ terraform {
3631
3917
  required_providers {
3632
3918
  aws = {
3633
3919
  source = "hashicorp/aws"
3634
- version = "~> 6.0"
3920
+ version = "6.58.0"
3635
3921
  }
3636
3922
  }
3637
3923
  }
@@ -3878,7 +4164,7 @@ output "api_log_group_arn" {
3878
4164
  required_providers {
3879
4165
  aws = {
3880
4166
  source = "hashicorp/aws"
3881
- version = "~> 6.0"
4167
+ version = "6.58.0"
3882
4168
  }
3883
4169
  }
3884
4170
  }
@@ -3900,11 +4186,47 @@ variable "additional_iam_policy_statements" {
3900
4186
  default = []
3901
4187
  }
3902
4188
 
4189
+ variable "appconfig_application_id" {
4190
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
4191
+ type = string
4192
+ default = null
4193
+ }
4194
+
4195
+ variable "appconfig_application_arn" {
4196
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
4197
+ type = string
4198
+ default = null
4199
+ }
4200
+
3903
4201
  variable "asset_bucket_name" {
3904
4202
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
3905
4203
  type = string
3906
4204
  }
3907
4205
 
4206
+ # VPC Configuration (optional)
4207
+ variable "enable_vpc" {
4208
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
4209
+ type = bool
4210
+ default = false
4211
+ }
4212
+
4213
+ variable "vpc_id" {
4214
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
4215
+ type = string
4216
+ default = null
4217
+
4218
+ validation {
4219
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
4220
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
4221
+ }
4222
+ }
4223
+
4224
+ variable "subnet_ids" {
4225
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
4226
+ type = list(string)
4227
+ default = null
4228
+ }
4229
+
3908
4230
  # CORS Configuration (passed to core module)
3909
4231
  variable "cors_allow_credentials" {
3910
4232
  description = "Whether to allow credentials in CORS requests"
@@ -3936,12 +4258,6 @@ variable "cors_expose_headers" {
3936
4258
  default = []
3937
4259
  }
3938
4260
 
3939
- variable "cors_max_age" {
3940
- description = "Maximum age for CORS preflight requests in seconds"
3941
- type = number
3942
- default = 0
3943
- }
3944
-
3945
4261
  # Tags
3946
4262
  variable "tags" {
3947
4263
  description = "Tags to apply to all resources"
@@ -3992,16 +4308,37 @@ module "http_api" {
3992
4308
  cors_allow_methods = var.cors_allow_methods
3993
4309
  cors_allow_origins = var.cors_allow_origins
3994
4310
  cors_expose_headers = var.cors_expose_headers
3995
- cors_max_age = var.cors_max_age
3996
4311
 
3997
4312
  # Tags
3998
4313
  tags = var.tags
3999
4314
  }
4000
4315
 
4316
+ # Security group for the API Lambda function, used when deployed into a VPC
4317
+ resource "aws_security_group" "api_lambda" {
4318
+ count = var.enable_vpc ? 1 : 0
4319
+
4320
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
4321
+ name_prefix = "test-api-lambda-"
4322
+ description = "Security group for the TestApi API Lambda function"
4323
+ vpc_id = var.vpc_id
4324
+ tags = var.tags
4325
+ }
4326
+
4327
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
4328
+ count = var.enable_vpc ? 1 : 0
4329
+
4330
+ security_group_id = aws_security_group.api_lambda[0].id
4331
+ cidr_ipv4 = "0.0.0.0/0"
4332
+ from_port = 443
4333
+ to_port = 443
4334
+ ip_protocol = "tcp"
4335
+ description = "Allow outbound HTTPS to AWS service endpoints"
4336
+ }
4337
+
4001
4338
  # Lambda function
4002
4339
  # This configures a single "router" lambda to serve all requests
4003
4340
  resource "aws_lambda_function" "api_lambda" {
4004
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
4341
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
4005
4342
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
4006
4343
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
4007
4344
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -4023,13 +4360,25 @@ resource "aws_lambda_function" "api_lambda" {
4023
4360
  mode = "Active"
4024
4361
  }
4025
4362
 
4363
+ dynamic "vpc_config" {
4364
+ for_each = var.enable_vpc ? [1] : []
4365
+ content {
4366
+ subnet_ids = var.subnet_ids
4367
+ security_group_ids = [aws_security_group.api_lambda[0].id]
4368
+ }
4369
+ }
4370
+
4026
4371
 
4027
4372
  environment {
4028
4373
  variables = merge({
4029
- }, var.env)
4374
+ }, var.appconfig_application_id != null ? {
4375
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
4376
+ } : {}, var.env)
4030
4377
  }
4031
4378
 
4032
4379
  tags = var.tags
4380
+
4381
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
4033
4382
  }
4034
4383
 
4035
4384
  # IAM role for Lambda execution
@@ -4064,18 +4413,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
4064
4413
  role = aws_iam_role.lambda_execution_role.name
4065
4414
  }
4066
4415
 
4416
+ # Attach VPC access policy to Lambda role when deployed into a VPC
4417
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
4418
+ count = var.enable_vpc ? 1 : 0
4419
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
4420
+ role = aws_iam_role.lambda_execution_role.name
4421
+ }
4422
+
4067
4423
  # Additional IAM policies for Lambda (if provided)
4068
4424
  resource "aws_iam_role_policy" "lambda_additional_policies" {
4069
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
4425
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
4070
4426
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
4071
4427
  role = aws_iam_role.lambda_execution_role.id
4072
4428
 
4073
4429
  policy = jsonencode({
4074
4430
  Version = "2012-10-17"
4075
- Statement = var.additional_iam_policy_statements
4431
+ Statement = local.lambda_policy_statements
4076
4432
  })
4077
4433
  }
4078
4434
 
4435
+ locals {
4436
+ # Grant read access to the runtime-config AppConfig application when wired
4437
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
4438
+ {
4439
+ Effect = "Allow"
4440
+ Action = [
4441
+ "appconfig:StartConfigurationSession",
4442
+ "appconfig:GetLatestConfiguration"
4443
+ ]
4444
+ Resource = ["\${var.appconfig_application_arn}/*"]
4445
+ }
4446
+ ] : [], var.additional_iam_policy_statements)
4447
+ }
4448
+
4079
4449
  # CloudWatch Log Group for Lambda
4080
4450
  resource "aws_cloudwatch_log_group" "lambda_logs" {
4081
4451
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -4316,6 +4686,11 @@ output "lambda_execution_role_name" {
4316
4686
  value = aws_iam_role.lambda_execution_role.name
4317
4687
  }
4318
4688
 
4689
+ output "security_group_id" {
4690
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
4691
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
4692
+ }
4693
+
4319
4694
  # Integration Outputs
4320
4695
  output "integration_id" {
4321
4696
  description = "ID of the Lambda integration"
@@ -4356,7 +4731,7 @@ terraform {
4356
4731
  required_providers {
4357
4732
  aws = {
4358
4733
  source = "hashicorp/aws"
4359
- version = "~> 6.0"
4734
+ version = "6.58.0"
4360
4735
  }
4361
4736
  }
4362
4737
  }
@@ -4603,7 +4978,7 @@ output "api_log_group_arn" {
4603
4978
  required_providers {
4604
4979
  aws = {
4605
4980
  source = "hashicorp/aws"
4606
- version = "~> 6.0"
4981
+ version = "6.58.0"
4607
4982
  }
4608
4983
  }
4609
4984
  }
@@ -4625,11 +5000,47 @@ variable "additional_iam_policy_statements" {
4625
5000
  default = []
4626
5001
  }
4627
5002
 
5003
+ variable "appconfig_application_id" {
5004
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
5005
+ type = string
5006
+ default = null
5007
+ }
5008
+
5009
+ variable "appconfig_application_arn" {
5010
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
5011
+ type = string
5012
+ default = null
5013
+ }
5014
+
4628
5015
  variable "asset_bucket_name" {
4629
5016
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
4630
5017
  type = string
4631
5018
  }
4632
5019
 
5020
+ # VPC Configuration (optional)
5021
+ variable "enable_vpc" {
5022
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
5023
+ type = bool
5024
+ default = false
5025
+ }
5026
+
5027
+ variable "vpc_id" {
5028
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
5029
+ type = string
5030
+ default = null
5031
+
5032
+ validation {
5033
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
5034
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
5035
+ }
5036
+ }
5037
+
5038
+ variable "subnet_ids" {
5039
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
5040
+ type = list(string)
5041
+ default = null
5042
+ }
5043
+
4633
5044
  # CORS Configuration (passed to core module)
4634
5045
  variable "cors_allow_credentials" {
4635
5046
  description = "Whether to allow credentials in CORS requests"
@@ -4661,12 +5072,6 @@ variable "cors_expose_headers" {
4661
5072
  default = []
4662
5073
  }
4663
5074
 
4664
- variable "cors_max_age" {
4665
- description = "Maximum age for CORS preflight requests in seconds"
4666
- type = number
4667
- default = 0
4668
- }
4669
-
4670
5075
  # Tags
4671
5076
  variable "tags" {
4672
5077
  description = "Tags to apply to all resources"
@@ -4717,16 +5122,37 @@ module "http_api" {
4717
5122
  cors_allow_methods = var.cors_allow_methods
4718
5123
  cors_allow_origins = var.cors_allow_origins
4719
5124
  cors_expose_headers = var.cors_expose_headers
4720
- cors_max_age = var.cors_max_age
4721
5125
 
4722
5126
  # Tags
4723
5127
  tags = var.tags
4724
5128
  }
4725
5129
 
5130
+ # Security group for the API Lambda function, used when deployed into a VPC
5131
+ resource "aws_security_group" "api_lambda" {
5132
+ count = var.enable_vpc ? 1 : 0
5133
+
5134
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
5135
+ name_prefix = "test-api-lambda-"
5136
+ description = "Security group for the TestApi API Lambda function"
5137
+ vpc_id = var.vpc_id
5138
+ tags = var.tags
5139
+ }
5140
+
5141
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
5142
+ count = var.enable_vpc ? 1 : 0
5143
+
5144
+ security_group_id = aws_security_group.api_lambda[0].id
5145
+ cidr_ipv4 = "0.0.0.0/0"
5146
+ from_port = 443
5147
+ to_port = 443
5148
+ ip_protocol = "tcp"
5149
+ description = "Allow outbound HTTPS to AWS service endpoints"
5150
+ }
5151
+
4726
5152
  # Lambda function
4727
5153
  # This configures a single "router" lambda to serve all requests
4728
5154
  resource "aws_lambda_function" "api_lambda" {
4729
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
5155
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
4730
5156
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
4731
5157
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
4732
5158
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -4748,13 +5174,25 @@ resource "aws_lambda_function" "api_lambda" {
4748
5174
  mode = "Active"
4749
5175
  }
4750
5176
 
5177
+ dynamic "vpc_config" {
5178
+ for_each = var.enable_vpc ? [1] : []
5179
+ content {
5180
+ subnet_ids = var.subnet_ids
5181
+ security_group_ids = [aws_security_group.api_lambda[0].id]
5182
+ }
5183
+ }
5184
+
4751
5185
 
4752
5186
  environment {
4753
5187
  variables = merge({
4754
- }, var.env)
5188
+ }, var.appconfig_application_id != null ? {
5189
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
5190
+ } : {}, var.env)
4755
5191
  }
4756
5192
 
4757
5193
  tags = var.tags
5194
+
5195
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
4758
5196
  }
4759
5197
 
4760
5198
  # IAM role for Lambda execution
@@ -4789,18 +5227,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
4789
5227
  role = aws_iam_role.lambda_execution_role.name
4790
5228
  }
4791
5229
 
5230
+ # Attach VPC access policy to Lambda role when deployed into a VPC
5231
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
5232
+ count = var.enable_vpc ? 1 : 0
5233
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
5234
+ role = aws_iam_role.lambda_execution_role.name
5235
+ }
5236
+
4792
5237
  # Additional IAM policies for Lambda (if provided)
4793
5238
  resource "aws_iam_role_policy" "lambda_additional_policies" {
4794
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
5239
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
4795
5240
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
4796
5241
  role = aws_iam_role.lambda_execution_role.id
4797
5242
 
4798
5243
  policy = jsonencode({
4799
5244
  Version = "2012-10-17"
4800
- Statement = var.additional_iam_policy_statements
5245
+ Statement = local.lambda_policy_statements
4801
5246
  })
4802
5247
  }
4803
5248
 
5249
+ locals {
5250
+ # Grant read access to the runtime-config AppConfig application when wired
5251
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
5252
+ {
5253
+ Effect = "Allow"
5254
+ Action = [
5255
+ "appconfig:StartConfigurationSession",
5256
+ "appconfig:GetLatestConfiguration"
5257
+ ]
5258
+ Resource = ["\${var.appconfig_application_arn}/*"]
5259
+ }
5260
+ ] : [], var.additional_iam_policy_statements)
5261
+ }
5262
+
4804
5263
  # CloudWatch Log Group for Lambda
4805
5264
  resource "aws_cloudwatch_log_group" "lambda_logs" {
4806
5265
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -4946,6 +5405,11 @@ output "lambda_execution_role_name" {
4946
5405
  value = aws_iam_role.lambda_execution_role.name
4947
5406
  }
4948
5407
 
5408
+ output "security_group_id" {
5409
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
5410
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
5411
+ }
5412
+
4949
5413
  # Integration Outputs
4950
5414
  output "integration_id" {
4951
5415
  description = "ID of the Lambda integration"
@@ -4986,11 +5450,11 @@ terraform {
4986
5450
  required_providers {
4987
5451
  aws = {
4988
5452
  source = "hashicorp/aws"
4989
- version = "~> 6.33"
5453
+ version = "6.58.0"
4990
5454
  }
4991
5455
  random = {
4992
5456
  source = "hashicorp/random"
4993
- version = "~> 3.1"
5457
+ version = "3.9.0"
4994
5458
  }
4995
5459
  }
4996
5460
  }
@@ -5060,8 +5524,6 @@ data "aws_caller_identity" "current" {}
5060
5524
 
5061
5525
  # Resources
5062
5526
 
5063
- # Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
5064
-
5065
5527
  # REST API Gateway
5066
5528
  resource "aws_api_gateway_rest_api" "rest_api" {
5067
5529
  name = var.api_name
@@ -5078,10 +5540,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
5078
5540
  tags = var.tags
5079
5541
  }
5080
5542
 
5081
- # Note: Deployment and stage are created in the consuming module (e.g., foo-api.tf)
5082
- # after all methods and integrations are defined
5083
-
5084
- # Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
5543
+ # Note: Deployment, stage and access logging are created in the consuming module
5544
+ # (e.g., foo-api.tf) after all methods and integrations are defined
5085
5545
 
5086
5546
  # Gateway Response for CORS (4XX errors)
5087
5547
  resource "aws_api_gateway_gateway_response" "cors_4xx" {
@@ -5239,16 +5699,14 @@ output "waf_web_acl_arn" {
5239
5699
  value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
5240
5700
  }
5241
5701
 
5242
- # Note: Stage and deployment outputs are provided by the consuming module
5243
-
5244
- # Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
5702
+ # Note: Stage, deployment and access log outputs are provided by the consuming module",
5245
5703
  "test-api.tf": "terraform {
5246
5704
  required_version = ">= 1.0"
5247
5705
 
5248
5706
  required_providers {
5249
5707
  aws = {
5250
5708
  source = "hashicorp/aws"
5251
- version = "~> 6.33"
5709
+ version = "6.58.0"
5252
5710
  }
5253
5711
  }
5254
5712
  }
@@ -5280,11 +5738,47 @@ variable "additional_iam_policy_statements" {
5280
5738
  default = []
5281
5739
  }
5282
5740
 
5741
+ variable "appconfig_application_id" {
5742
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
5743
+ type = string
5744
+ default = null
5745
+ }
5746
+
5747
+ variable "appconfig_application_arn" {
5748
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
5749
+ type = string
5750
+ default = null
5751
+ }
5752
+
5283
5753
  variable "asset_bucket_name" {
5284
5754
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
5285
5755
  type = string
5286
5756
  }
5287
5757
 
5758
+ # VPC Configuration (optional)
5759
+ variable "enable_vpc" {
5760
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
5761
+ type = bool
5762
+ default = false
5763
+ }
5764
+
5765
+ variable "vpc_id" {
5766
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
5767
+ type = string
5768
+ default = null
5769
+
5770
+ validation {
5771
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
5772
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
5773
+ }
5774
+ }
5775
+
5776
+ variable "subnet_ids" {
5777
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
5778
+ type = list(string)
5779
+ default = null
5780
+ }
5781
+
5288
5782
  # CORS Configuration (passed to core module)
5289
5783
 
5290
5784
  variable "cors_allow_headers" {
@@ -5347,6 +5841,11 @@ resource "aws_s3_object" "lambda_zip" {
5347
5841
  }
5348
5842
 
5349
5843
  # Use the core REST API module
5844
+ # Account-level CloudWatch role required for REST API access logging
5845
+ module "account" {
5846
+ source = "../../../core/api/api-gateway-account"
5847
+ }
5848
+
5350
5849
  module "rest_api" {
5351
5850
  source = "../../../core/api/rest-api"
5352
5851
 
@@ -5376,9 +5875,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
5376
5875
  depends_on = [aws_api_gateway_stage.api_stage]
5377
5876
  }
5378
5877
 
5878
+ # Security group for the API Lambda function, used when deployed into a VPC
5879
+ resource "aws_security_group" "api_lambda" {
5880
+ count = var.enable_vpc ? 1 : 0
5881
+
5882
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
5883
+ name_prefix = "test-api-lambda-"
5884
+ description = "Security group for the TestApi API Lambda function"
5885
+ vpc_id = var.vpc_id
5886
+ tags = var.tags
5887
+ }
5888
+
5889
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
5890
+ count = var.enable_vpc ? 1 : 0
5891
+
5892
+ security_group_id = aws_security_group.api_lambda[0].id
5893
+ cidr_ipv4 = "0.0.0.0/0"
5894
+ from_port = 443
5895
+ to_port = 443
5896
+ ip_protocol = "tcp"
5897
+ description = "Allow outbound HTTPS to AWS service endpoints"
5898
+ }
5899
+
5379
5900
  # Lambda function
5380
5901
  resource "aws_lambda_function" "api_lambda" {
5381
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
5902
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
5382
5903
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
5383
5904
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
5384
5905
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -5400,13 +5921,25 @@ resource "aws_lambda_function" "api_lambda" {
5400
5921
  mode = "Active"
5401
5922
  }
5402
5923
 
5924
+ dynamic "vpc_config" {
5925
+ for_each = var.enable_vpc ? [1] : []
5926
+ content {
5927
+ subnet_ids = var.subnet_ids
5928
+ security_group_ids = [aws_security_group.api_lambda[0].id]
5929
+ }
5930
+ }
5931
+
5403
5932
 
5404
5933
  environment {
5405
5934
  variables = merge({
5406
- }, var.env)
5935
+ }, var.appconfig_application_id != null ? {
5936
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
5937
+ } : {}, var.env)
5407
5938
  }
5408
5939
 
5409
5940
  tags = var.tags
5941
+
5942
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
5410
5943
  }
5411
5944
 
5412
5945
  # IAM role for Lambda execution
@@ -5441,18 +5974,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
5441
5974
  role = aws_iam_role.lambda_execution_role.name
5442
5975
  }
5443
5976
 
5977
+ # Attach VPC access policy to Lambda role when deployed into a VPC
5978
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
5979
+ count = var.enable_vpc ? 1 : 0
5980
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
5981
+ role = aws_iam_role.lambda_execution_role.name
5982
+ }
5983
+
5444
5984
  # Additional IAM policies for Lambda (if provided)
5445
5985
  resource "aws_iam_role_policy" "lambda_additional_policies" {
5446
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
5986
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
5447
5987
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
5448
5988
  role = aws_iam_role.lambda_execution_role.id
5449
5989
 
5450
5990
  policy = jsonencode({
5451
5991
  Version = "2012-10-17"
5452
- Statement = var.additional_iam_policy_statements
5992
+ Statement = local.lambda_policy_statements
5453
5993
  })
5454
5994
  }
5455
5995
 
5996
+ locals {
5997
+ # Grant read access to the runtime-config AppConfig application when wired
5998
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
5999
+ {
6000
+ Effect = "Allow"
6001
+ Action = [
6002
+ "appconfig:StartConfigurationSession",
6003
+ "appconfig:GetLatestConfiguration"
6004
+ ]
6005
+ Resource = ["\${var.appconfig_application_arn}/*"]
6006
+ }
6007
+ ] : [], var.additional_iam_policy_statements)
6008
+ }
6009
+
5456
6010
  # CloudWatch Log Group for Lambda
5457
6011
  resource "aws_cloudwatch_log_group" "lambda_logs" {
5458
6012
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -5502,6 +6056,9 @@ resource "aws_api_gateway_method" "proxy_method" {
5502
6056
 
5503
6057
  authorization = "COGNITO_USER_POOLS"
5504
6058
  authorizer_id = aws_api_gateway_authorizer.cognito_authorizer.id
6059
+ # Accept access tokens from both sign-in flows: 'openid' (Cognito hosted UI)
6060
+ # and 'aws.cognito.signin.user.admin' (Cognito admin/SRP auth APIs).
6061
+ authorization_scopes = ["openid", "aws.cognito.signin.user.admin"]
5505
6062
 
5506
6063
  request_parameters = {
5507
6064
  "method.request.path.proxy" = true
@@ -5588,11 +6145,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
5588
6145
  ]
5589
6146
  }
5590
6147
 
6148
+ # KMS key for encrypting access logs at rest
6149
+ resource "aws_kms_key" "access_logs" {
6150
+ description = "TestApi API access log encryption"
6151
+ deletion_window_in_days = 7
6152
+ enable_key_rotation = true
6153
+
6154
+ policy = jsonencode({
6155
+ Version = "2012-10-17"
6156
+ Statement = [
6157
+ {
6158
+ Sid = "Enable IAM User Permissions"
6159
+ Effect = "Allow"
6160
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
6161
+ Action = "kms:*"
6162
+ Resource = "*"
6163
+ },
6164
+ {
6165
+ Sid = "Allow CloudWatch Logs"
6166
+ Effect = "Allow"
6167
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
6168
+ Action = [
6169
+ "kms:Encrypt",
6170
+ "kms:Decrypt",
6171
+ "kms:ReEncrypt*",
6172
+ "kms:GenerateDataKey*",
6173
+ "kms:DescribeKey"
6174
+ ]
6175
+ Resource = "*"
6176
+ Condition = {
6177
+ ArnEquals = {
6178
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:/aws/apigateway/test-api-\${random_string.suffix.result}/access"
6179
+ }
6180
+ }
6181
+ }
6182
+ ]
6183
+ })
6184
+
6185
+ tags = var.tags
6186
+ }
6187
+
6188
+ resource "aws_kms_alias" "access_logs" {
6189
+ name = "alias/test-api-\${random_string.suffix.result}-access-logs"
6190
+ target_key_id = aws_kms_key.access_logs.key_id
6191
+ }
6192
+
6193
+ # Access logs for the API Gateway stage
6194
+ resource "aws_cloudwatch_log_group" "access_logs" {
6195
+ name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
6196
+ retention_in_days = 365
6197
+ kms_key_id = aws_kms_key.access_logs.arn
6198
+ tags = var.tags
6199
+ }
6200
+
5591
6201
  # API Gateway stage
5592
6202
  resource "aws_api_gateway_stage" "api_stage" {
5593
6203
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
5594
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
5595
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
6204
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
5596
6205
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
5597
6206
  #checkov:skip=CKV2_AWS_77:WAFv2 Web ACL is attached via aws_wafv2_web_acl_association when var.enable_waf is true (default) and includes AWSManagedRulesKnownBadInputsRuleSet for Log4j protection; Checkov does not track the association across modules
5598
6207
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -5600,9 +6209,39 @@ resource "aws_api_gateway_stage" "api_stage" {
5600
6209
  stage_name = "prod"
5601
6210
  xray_tracing_enabled = true
5602
6211
 
6212
+ access_log_settings {
6213
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
6214
+ format = jsonencode({
6215
+ requestId = "$context.requestId"
6216
+ ip = "$context.identity.sourceIp"
6217
+ caller = "$context.identity.caller"
6218
+ user = "$context.identity.user"
6219
+ requestTime = "$context.requestTime"
6220
+ httpMethod = "$context.httpMethod"
6221
+ resourcePath = "$context.resourcePath"
6222
+ status = "$context.status"
6223
+ protocol = "$context.protocol"
6224
+ responseLength = "$context.responseLength"
6225
+ })
6226
+ }
6227
+
5603
6228
  tags = var.tags
5604
6229
 
5605
- depends_on = [aws_api_gateway_deployment.api_deployment]
6230
+ # Ensure the account-level role is configured before the stage is created
6231
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
6232
+ }
6233
+
6234
+ # Default throttling applied to all resource paths and methods
6235
+ resource "aws_api_gateway_method_settings" "throttling" {
6236
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
6237
+ rest_api_id = module.rest_api.api_id
6238
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
6239
+ method_path = "*/*"
6240
+
6241
+ settings {
6242
+ throttling_rate_limit = 10000
6243
+ throttling_burst_limit = 5000
6244
+ }
5606
6245
  }
5607
6246
 
5608
6247
  # API Gateway Resource Policy
@@ -5741,6 +6380,11 @@ output "lambda_execution_role_name" {
5741
6380
  value = aws_iam_role.lambda_execution_role.name
5742
6381
  }
5743
6382
 
6383
+ output "security_group_id" {
6384
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
6385
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
6386
+ }
6387
+
5744
6388
  # Integration Outputs
5745
6389
  output "integration_id" {
5746
6390
  description = "ID of the Lambda integration"
@@ -5782,11 +6426,11 @@ terraform {
5782
6426
  required_providers {
5783
6427
  aws = {
5784
6428
  source = "hashicorp/aws"
5785
- version = "~> 6.33"
6429
+ version = "6.58.0"
5786
6430
  }
5787
6431
  random = {
5788
6432
  source = "hashicorp/random"
5789
- version = "~> 3.1"
6433
+ version = "3.9.0"
5790
6434
  }
5791
6435
  }
5792
6436
  }
@@ -5856,8 +6500,6 @@ data "aws_caller_identity" "current" {}
5856
6500
 
5857
6501
  # Resources
5858
6502
 
5859
- # Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
5860
-
5861
6503
  # REST API Gateway
5862
6504
  resource "aws_api_gateway_rest_api" "rest_api" {
5863
6505
  name = var.api_name
@@ -5874,10 +6516,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
5874
6516
  tags = var.tags
5875
6517
  }
5876
6518
 
5877
- # Note: Deployment and stage are created in the consuming module (e.g., foo-api.tf)
5878
- # after all methods and integrations are defined
5879
-
5880
- # Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
6519
+ # Note: Deployment, stage and access logging are created in the consuming module
6520
+ # (e.g., foo-api.tf) after all methods and integrations are defined
5881
6521
 
5882
6522
  # Gateway Response for CORS (4XX errors)
5883
6523
  resource "aws_api_gateway_gateway_response" "cors_4xx" {
@@ -6035,16 +6675,14 @@ output "waf_web_acl_arn" {
6035
6675
  value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
6036
6676
  }
6037
6677
 
6038
- # Note: Stage and deployment outputs are provided by the consuming module
6039
-
6040
- # Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
6678
+ # Note: Stage, deployment and access log outputs are provided by the consuming module",
6041
6679
  "test-api.tf": "terraform {
6042
6680
  required_version = ">= 1.0"
6043
6681
 
6044
6682
  required_providers {
6045
6683
  aws = {
6046
6684
  source = "hashicorp/aws"
6047
- version = "~> 6.33"
6685
+ version = "6.58.0"
6048
6686
  }
6049
6687
  }
6050
6688
  }
@@ -6066,11 +6704,47 @@ variable "additional_iam_policy_statements" {
6066
6704
  default = []
6067
6705
  }
6068
6706
 
6707
+ variable "appconfig_application_id" {
6708
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
6709
+ type = string
6710
+ default = null
6711
+ }
6712
+
6713
+ variable "appconfig_application_arn" {
6714
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
6715
+ type = string
6716
+ default = null
6717
+ }
6718
+
6069
6719
  variable "asset_bucket_name" {
6070
6720
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
6071
6721
  type = string
6072
6722
  }
6073
6723
 
6724
+ # VPC Configuration (optional)
6725
+ variable "enable_vpc" {
6726
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
6727
+ type = bool
6728
+ default = false
6729
+ }
6730
+
6731
+ variable "vpc_id" {
6732
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
6733
+ type = string
6734
+ default = null
6735
+
6736
+ validation {
6737
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
6738
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
6739
+ }
6740
+ }
6741
+
6742
+ variable "subnet_ids" {
6743
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
6744
+ type = list(string)
6745
+ default = null
6746
+ }
6747
+
6074
6748
  # CORS Configuration (passed to core module)
6075
6749
 
6076
6750
  variable "cors_allow_headers" {
@@ -6133,6 +6807,11 @@ resource "aws_s3_object" "lambda_zip" {
6133
6807
  }
6134
6808
 
6135
6809
  # Use the core REST API module
6810
+ # Account-level CloudWatch role required for REST API access logging
6811
+ module "account" {
6812
+ source = "../../../core/api/api-gateway-account"
6813
+ }
6814
+
6136
6815
  module "rest_api" {
6137
6816
  source = "../../../core/api/rest-api"
6138
6817
 
@@ -6162,9 +6841,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
6162
6841
  depends_on = [aws_api_gateway_stage.api_stage]
6163
6842
  }
6164
6843
 
6844
+ # Security group for the API Lambda function, used when deployed into a VPC
6845
+ resource "aws_security_group" "api_lambda" {
6846
+ count = var.enable_vpc ? 1 : 0
6847
+
6848
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
6849
+ name_prefix = "test-api-lambda-"
6850
+ description = "Security group for the TestApi API Lambda function"
6851
+ vpc_id = var.vpc_id
6852
+ tags = var.tags
6853
+ }
6854
+
6855
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
6856
+ count = var.enable_vpc ? 1 : 0
6857
+
6858
+ security_group_id = aws_security_group.api_lambda[0].id
6859
+ cidr_ipv4 = "0.0.0.0/0"
6860
+ from_port = 443
6861
+ to_port = 443
6862
+ ip_protocol = "tcp"
6863
+ description = "Allow outbound HTTPS to AWS service endpoints"
6864
+ }
6865
+
6165
6866
  # Lambda function
6166
6867
  resource "aws_lambda_function" "api_lambda" {
6167
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
6868
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
6168
6869
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
6169
6870
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
6170
6871
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -6186,13 +6887,25 @@ resource "aws_lambda_function" "api_lambda" {
6186
6887
  mode = "Active"
6187
6888
  }
6188
6889
 
6890
+ dynamic "vpc_config" {
6891
+ for_each = var.enable_vpc ? [1] : []
6892
+ content {
6893
+ subnet_ids = var.subnet_ids
6894
+ security_group_ids = [aws_security_group.api_lambda[0].id]
6895
+ }
6896
+ }
6897
+
6189
6898
 
6190
6899
  environment {
6191
6900
  variables = merge({
6192
- }, var.env)
6901
+ }, var.appconfig_application_id != null ? {
6902
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
6903
+ } : {}, var.env)
6193
6904
  }
6194
6905
 
6195
6906
  tags = var.tags
6907
+
6908
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
6196
6909
  }
6197
6910
 
6198
6911
  # IAM role for Lambda execution
@@ -6227,18 +6940,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
6227
6940
  role = aws_iam_role.lambda_execution_role.name
6228
6941
  }
6229
6942
 
6943
+ # Attach VPC access policy to Lambda role when deployed into a VPC
6944
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
6945
+ count = var.enable_vpc ? 1 : 0
6946
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
6947
+ role = aws_iam_role.lambda_execution_role.name
6948
+ }
6949
+
6230
6950
  # Additional IAM policies for Lambda (if provided)
6231
6951
  resource "aws_iam_role_policy" "lambda_additional_policies" {
6232
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
6952
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
6233
6953
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
6234
6954
  role = aws_iam_role.lambda_execution_role.id
6235
6955
 
6236
6956
  policy = jsonencode({
6237
6957
  Version = "2012-10-17"
6238
- Statement = var.additional_iam_policy_statements
6958
+ Statement = local.lambda_policy_statements
6239
6959
  })
6240
6960
  }
6241
6961
 
6962
+ locals {
6963
+ # Grant read access to the runtime-config AppConfig application when wired
6964
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
6965
+ {
6966
+ Effect = "Allow"
6967
+ Action = [
6968
+ "appconfig:StartConfigurationSession",
6969
+ "appconfig:GetLatestConfiguration"
6970
+ ]
6971
+ Resource = ["\${var.appconfig_application_arn}/*"]
6972
+ }
6973
+ ] : [], var.additional_iam_policy_statements)
6974
+ }
6975
+
6242
6976
  # CloudWatch Log Group for Lambda
6243
6977
  resource "aws_cloudwatch_log_group" "lambda_logs" {
6244
6978
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -6365,11 +7099,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
6365
7099
  ]
6366
7100
  }
6367
7101
 
7102
+ # KMS key for encrypting access logs at rest
7103
+ resource "aws_kms_key" "access_logs" {
7104
+ description = "TestApi API access log encryption"
7105
+ deletion_window_in_days = 7
7106
+ enable_key_rotation = true
7107
+
7108
+ policy = jsonencode({
7109
+ Version = "2012-10-17"
7110
+ Statement = [
7111
+ {
7112
+ Sid = "Enable IAM User Permissions"
7113
+ Effect = "Allow"
7114
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
7115
+ Action = "kms:*"
7116
+ Resource = "*"
7117
+ },
7118
+ {
7119
+ Sid = "Allow CloudWatch Logs"
7120
+ Effect = "Allow"
7121
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
7122
+ Action = [
7123
+ "kms:Encrypt",
7124
+ "kms:Decrypt",
7125
+ "kms:ReEncrypt*",
7126
+ "kms:GenerateDataKey*",
7127
+ "kms:DescribeKey"
7128
+ ]
7129
+ Resource = "*"
7130
+ Condition = {
7131
+ ArnEquals = {
7132
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:/aws/apigateway/test-api-\${random_string.suffix.result}/access"
7133
+ }
7134
+ }
7135
+ }
7136
+ ]
7137
+ })
7138
+
7139
+ tags = var.tags
7140
+ }
7141
+
7142
+ resource "aws_kms_alias" "access_logs" {
7143
+ name = "alias/test-api-\${random_string.suffix.result}-access-logs"
7144
+ target_key_id = aws_kms_key.access_logs.key_id
7145
+ }
7146
+
7147
+ # Access logs for the API Gateway stage
7148
+ resource "aws_cloudwatch_log_group" "access_logs" {
7149
+ name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
7150
+ retention_in_days = 365
7151
+ kms_key_id = aws_kms_key.access_logs.arn
7152
+ tags = var.tags
7153
+ }
7154
+
6368
7155
  # API Gateway stage
6369
7156
  resource "aws_api_gateway_stage" "api_stage" {
6370
7157
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
6371
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
6372
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
7158
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
6373
7159
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
6374
7160
  #checkov:skip=CKV2_AWS_77:WAFv2 Web ACL is attached via aws_wafv2_web_acl_association when var.enable_waf is true (default) and includes AWSManagedRulesKnownBadInputsRuleSet for Log4j protection; Checkov does not track the association across modules
6375
7161
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -6377,9 +7163,39 @@ resource "aws_api_gateway_stage" "api_stage" {
6377
7163
  stage_name = "prod"
6378
7164
  xray_tracing_enabled = true
6379
7165
 
7166
+ access_log_settings {
7167
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
7168
+ format = jsonencode({
7169
+ requestId = "$context.requestId"
7170
+ ip = "$context.identity.sourceIp"
7171
+ caller = "$context.identity.caller"
7172
+ user = "$context.identity.user"
7173
+ requestTime = "$context.requestTime"
7174
+ httpMethod = "$context.httpMethod"
7175
+ resourcePath = "$context.resourcePath"
7176
+ status = "$context.status"
7177
+ protocol = "$context.protocol"
7178
+ responseLength = "$context.responseLength"
7179
+ })
7180
+ }
7181
+
6380
7182
  tags = var.tags
6381
7183
 
6382
- depends_on = [aws_api_gateway_deployment.api_deployment]
7184
+ # Ensure the account-level role is configured before the stage is created
7185
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
7186
+ }
7187
+
7188
+ # Default throttling applied to all resource paths and methods
7189
+ resource "aws_api_gateway_method_settings" "throttling" {
7190
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
7191
+ rest_api_id = module.rest_api.api_id
7192
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
7193
+ method_path = "*/*"
7194
+
7195
+ settings {
7196
+ throttling_rate_limit = 10000
7197
+ throttling_burst_limit = 5000
7198
+ }
6383
7199
  }
6384
7200
 
6385
7201
  # API Gateway Resource Policy
@@ -6529,6 +7345,11 @@ output "lambda_execution_role_name" {
6529
7345
  value = aws_iam_role.lambda_execution_role.name
6530
7346
  }
6531
7347
 
7348
+ output "security_group_id" {
7349
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
7350
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
7351
+ }
7352
+
6532
7353
  # Integration Outputs
6533
7354
  output "integration_id" {
6534
7355
  description = "ID of the Lambda integration"
@@ -6570,11 +7391,11 @@ terraform {
6570
7391
  required_providers {
6571
7392
  aws = {
6572
7393
  source = "hashicorp/aws"
6573
- version = "~> 6.33"
7394
+ version = "6.58.0"
6574
7395
  }
6575
7396
  random = {
6576
7397
  source = "hashicorp/random"
6577
- version = "~> 3.1"
7398
+ version = "3.9.0"
6578
7399
  }
6579
7400
  }
6580
7401
  }
@@ -6644,8 +7465,6 @@ data "aws_caller_identity" "current" {}
6644
7465
 
6645
7466
  # Resources
6646
7467
 
6647
- # Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
6648
-
6649
7468
  # REST API Gateway
6650
7469
  resource "aws_api_gateway_rest_api" "rest_api" {
6651
7470
  name = var.api_name
@@ -6662,10 +7481,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
6662
7481
  tags = var.tags
6663
7482
  }
6664
7483
 
6665
- # Note: Deployment and stage are created in the consuming module (e.g., foo-api.tf)
6666
- # after all methods and integrations are defined
6667
-
6668
- # Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
7484
+ # Note: Deployment, stage and access logging are created in the consuming module
7485
+ # (e.g., foo-api.tf) after all methods and integrations are defined
6669
7486
 
6670
7487
  # Gateway Response for CORS (4XX errors)
6671
7488
  resource "aws_api_gateway_gateway_response" "cors_4xx" {
@@ -6823,16 +7640,14 @@ output "waf_web_acl_arn" {
6823
7640
  value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
6824
7641
  }
6825
7642
 
6826
- # Note: Stage and deployment outputs are provided by the consuming module
6827
-
6828
- # Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
7643
+ # Note: Stage, deployment and access log outputs are provided by the consuming module",
6829
7644
  "test-api.tf": "terraform {
6830
7645
  required_version = ">= 1.0"
6831
7646
 
6832
7647
  required_providers {
6833
7648
  aws = {
6834
7649
  source = "hashicorp/aws"
6835
- version = "~> 6.33"
7650
+ version = "6.58.0"
6836
7651
  }
6837
7652
  }
6838
7653
  }
@@ -6854,11 +7669,47 @@ variable "additional_iam_policy_statements" {
6854
7669
  default = []
6855
7670
  }
6856
7671
 
7672
+ variable "appconfig_application_id" {
7673
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
7674
+ type = string
7675
+ default = null
7676
+ }
7677
+
7678
+ variable "appconfig_application_arn" {
7679
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
7680
+ type = string
7681
+ default = null
7682
+ }
7683
+
6857
7684
  variable "asset_bucket_name" {
6858
7685
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
6859
7686
  type = string
6860
7687
  }
6861
7688
 
7689
+ # VPC Configuration (optional)
7690
+ variable "enable_vpc" {
7691
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
7692
+ type = bool
7693
+ default = false
7694
+ }
7695
+
7696
+ variable "vpc_id" {
7697
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
7698
+ type = string
7699
+ default = null
7700
+
7701
+ validation {
7702
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
7703
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
7704
+ }
7705
+ }
7706
+
7707
+ variable "subnet_ids" {
7708
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
7709
+ type = list(string)
7710
+ default = null
7711
+ }
7712
+
6862
7713
  # CORS Configuration (passed to core module)
6863
7714
 
6864
7715
  variable "cors_allow_headers" {
@@ -6921,6 +7772,11 @@ resource "aws_s3_object" "lambda_zip" {
6921
7772
  }
6922
7773
 
6923
7774
  # Use the core REST API module
7775
+ # Account-level CloudWatch role required for REST API access logging
7776
+ module "account" {
7777
+ source = "../../../core/api/api-gateway-account"
7778
+ }
7779
+
6924
7780
  module "rest_api" {
6925
7781
  source = "../../../core/api/rest-api"
6926
7782
 
@@ -6950,9 +7806,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
6950
7806
  depends_on = [aws_api_gateway_stage.api_stage]
6951
7807
  }
6952
7808
 
7809
+ # Security group for the API Lambda function, used when deployed into a VPC
7810
+ resource "aws_security_group" "api_lambda" {
7811
+ count = var.enable_vpc ? 1 : 0
7812
+
7813
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
7814
+ name_prefix = "test-api-lambda-"
7815
+ description = "Security group for the TestApi API Lambda function"
7816
+ vpc_id = var.vpc_id
7817
+ tags = var.tags
7818
+ }
7819
+
7820
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
7821
+ count = var.enable_vpc ? 1 : 0
7822
+
7823
+ security_group_id = aws_security_group.api_lambda[0].id
7824
+ cidr_ipv4 = "0.0.0.0/0"
7825
+ from_port = 443
7826
+ to_port = 443
7827
+ ip_protocol = "tcp"
7828
+ description = "Allow outbound HTTPS to AWS service endpoints"
7829
+ }
7830
+
6953
7831
  # Lambda function
6954
7832
  resource "aws_lambda_function" "api_lambda" {
6955
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
7833
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
6956
7834
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
6957
7835
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
6958
7836
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -6974,13 +7852,25 @@ resource "aws_lambda_function" "api_lambda" {
6974
7852
  mode = "Active"
6975
7853
  }
6976
7854
 
7855
+ dynamic "vpc_config" {
7856
+ for_each = var.enable_vpc ? [1] : []
7857
+ content {
7858
+ subnet_ids = var.subnet_ids
7859
+ security_group_ids = [aws_security_group.api_lambda[0].id]
7860
+ }
7861
+ }
7862
+
6977
7863
 
6978
7864
  environment {
6979
7865
  variables = merge({
6980
- }, var.env)
7866
+ }, var.appconfig_application_id != null ? {
7867
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
7868
+ } : {}, var.env)
6981
7869
  }
6982
7870
 
6983
7871
  tags = var.tags
7872
+
7873
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
6984
7874
  }
6985
7875
 
6986
7876
  # IAM role for Lambda execution
@@ -7015,18 +7905,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
7015
7905
  role = aws_iam_role.lambda_execution_role.name
7016
7906
  }
7017
7907
 
7908
+ # Attach VPC access policy to Lambda role when deployed into a VPC
7909
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
7910
+ count = var.enable_vpc ? 1 : 0
7911
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
7912
+ role = aws_iam_role.lambda_execution_role.name
7913
+ }
7914
+
7018
7915
  # Additional IAM policies for Lambda (if provided)
7019
7916
  resource "aws_iam_role_policy" "lambda_additional_policies" {
7020
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
7917
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
7021
7918
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
7022
7919
  role = aws_iam_role.lambda_execution_role.id
7023
7920
 
7024
7921
  policy = jsonencode({
7025
7922
  Version = "2012-10-17"
7026
- Statement = var.additional_iam_policy_statements
7923
+ Statement = local.lambda_policy_statements
7027
7924
  })
7028
7925
  }
7029
7926
 
7927
+ locals {
7928
+ # Grant read access to the runtime-config AppConfig application when wired
7929
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
7930
+ {
7931
+ Effect = "Allow"
7932
+ Action = [
7933
+ "appconfig:StartConfigurationSession",
7934
+ "appconfig:GetLatestConfiguration"
7935
+ ]
7936
+ Resource = ["\${var.appconfig_application_arn}/*"]
7937
+ }
7938
+ ] : [], var.additional_iam_policy_statements)
7939
+ }
7940
+
7030
7941
  # CloudWatch Log Group for Lambda
7031
7942
  resource "aws_cloudwatch_log_group" "lambda_logs" {
7032
7943
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -7247,11 +8158,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
7247
8158
  ]
7248
8159
  }
7249
8160
 
8161
+ # KMS key for encrypting access logs at rest
8162
+ resource "aws_kms_key" "access_logs" {
8163
+ description = "TestApi API access log encryption"
8164
+ deletion_window_in_days = 7
8165
+ enable_key_rotation = true
8166
+
8167
+ policy = jsonencode({
8168
+ Version = "2012-10-17"
8169
+ Statement = [
8170
+ {
8171
+ Sid = "Enable IAM User Permissions"
8172
+ Effect = "Allow"
8173
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
8174
+ Action = "kms:*"
8175
+ Resource = "*"
8176
+ },
8177
+ {
8178
+ Sid = "Allow CloudWatch Logs"
8179
+ Effect = "Allow"
8180
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
8181
+ Action = [
8182
+ "kms:Encrypt",
8183
+ "kms:Decrypt",
8184
+ "kms:ReEncrypt*",
8185
+ "kms:GenerateDataKey*",
8186
+ "kms:DescribeKey"
8187
+ ]
8188
+ Resource = "*"
8189
+ Condition = {
8190
+ ArnEquals = {
8191
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:/aws/apigateway/test-api-\${random_string.suffix.result}/access"
8192
+ }
8193
+ }
8194
+ }
8195
+ ]
8196
+ })
8197
+
8198
+ tags = var.tags
8199
+ }
8200
+
8201
+ resource "aws_kms_alias" "access_logs" {
8202
+ name = "alias/test-api-\${random_string.suffix.result}-access-logs"
8203
+ target_key_id = aws_kms_key.access_logs.key_id
8204
+ }
8205
+
8206
+ # Access logs for the API Gateway stage
8207
+ resource "aws_cloudwatch_log_group" "access_logs" {
8208
+ name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
8209
+ retention_in_days = 365
8210
+ kms_key_id = aws_kms_key.access_logs.arn
8211
+ tags = var.tags
8212
+ }
8213
+
7250
8214
  # API Gateway stage
7251
8215
  resource "aws_api_gateway_stage" "api_stage" {
7252
8216
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
7253
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
7254
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
8217
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
7255
8218
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
7256
8219
  #checkov:skip=CKV2_AWS_77:WAFv2 Web ACL is attached via aws_wafv2_web_acl_association when var.enable_waf is true (default) and includes AWSManagedRulesKnownBadInputsRuleSet for Log4j protection; Checkov does not track the association across modules
7257
8220
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -7259,9 +8222,39 @@ resource "aws_api_gateway_stage" "api_stage" {
7259
8222
  stage_name = "prod"
7260
8223
  xray_tracing_enabled = true
7261
8224
 
8225
+ access_log_settings {
8226
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
8227
+ format = jsonencode({
8228
+ requestId = "$context.requestId"
8229
+ ip = "$context.identity.sourceIp"
8230
+ caller = "$context.identity.caller"
8231
+ user = "$context.identity.user"
8232
+ requestTime = "$context.requestTime"
8233
+ httpMethod = "$context.httpMethod"
8234
+ resourcePath = "$context.resourcePath"
8235
+ status = "$context.status"
8236
+ protocol = "$context.protocol"
8237
+ responseLength = "$context.responseLength"
8238
+ })
8239
+ }
8240
+
7262
8241
  tags = var.tags
7263
8242
 
7264
- depends_on = [aws_api_gateway_deployment.api_deployment]
8243
+ # Ensure the account-level role is configured before the stage is created
8244
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
8245
+ }
8246
+
8247
+ # Default throttling applied to all resource paths and methods
8248
+ resource "aws_api_gateway_method_settings" "throttling" {
8249
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
8250
+ rest_api_id = module.rest_api.api_id
8251
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
8252
+ method_path = "*/*"
8253
+
8254
+ settings {
8255
+ throttling_rate_limit = 10000
8256
+ throttling_burst_limit = 5000
8257
+ }
7265
8258
  }
7266
8259
 
7267
8260
  # API Gateway Resource Policy
@@ -7400,6 +8393,11 @@ output "lambda_execution_role_name" {
7400
8393
  value = aws_iam_role.lambda_execution_role.name
7401
8394
  }
7402
8395
 
8396
+ output "security_group_id" {
8397
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
8398
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
8399
+ }
8400
+
7403
8401
  # Integration Outputs
7404
8402
  output "integration_id" {
7405
8403
  description = "ID of the Lambda integration"