@aws/nx-plugin 1.0.0-rc.4 → 1.0.0-rc.40

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 (1135) hide show
  1. package/LICENSE-THIRD-PARTY +5449 -4980
  2. package/README.md +7 -7
  3. package/executors.json +9 -0
  4. package/generators.json +101 -2
  5. package/package.json +35 -17
  6. package/src/agentcore-gateway/attach-upstream.d.ts +33 -0
  7. package/src/agentcore-gateway/attach-upstream.js +38 -0
  8. package/src/agentcore-gateway/attach-upstream.js.map +1 -0
  9. package/src/agentcore-gateway/files/cedar/policies/README.md +52 -0
  10. package/src/agentcore-gateway/files/cedar/policies/permit-all.cedar +11 -0
  11. package/src/agentcore-gateway/files/project/local-dev.ts.template +134 -0
  12. package/src/agentcore-gateway/gateway-connection/generator.d.ts +21 -0
  13. package/src/agentcore-gateway/gateway-connection/generator.js +101 -0
  14. package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -0
  15. package/src/agentcore-gateway/gateway-connection/schema.d.js +6 -0
  16. package/src/agentcore-gateway/gateway-connection/schema.d.js.map +1 -0
  17. package/src/agentcore-gateway/gateway-connection/schema.d.ts +13 -0
  18. package/src/agentcore-gateway/gateway-connection/schema.json +31 -0
  19. package/src/agentcore-gateway/generator.d.ts +25 -0
  20. package/src/agentcore-gateway/generator.js +149 -0
  21. package/src/agentcore-gateway/generator.js.map +1 -0
  22. package/src/agentcore-gateway/mcp-connection/generator.d.ts +19 -0
  23. package/src/agentcore-gateway/mcp-connection/generator.js +59 -0
  24. package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -0
  25. package/src/agentcore-gateway/mcp-connection/schema.d.js +6 -0
  26. package/src/agentcore-gateway/mcp-connection/schema.d.js.map +1 -0
  27. package/src/agentcore-gateway/mcp-connection/schema.d.ts +13 -0
  28. package/src/agentcore-gateway/mcp-connection/schema.json +31 -0
  29. package/src/agentcore-gateway/schema.d.js +6 -0
  30. package/src/agentcore-gateway/schema.d.js.map +1 -0
  31. package/src/agentcore-gateway/schema.d.ts +17 -0
  32. package/src/agentcore-gateway/schema.json +70 -0
  33. package/src/bin/aws-nx-mcp.js +14 -0
  34. package/src/bin/aws-nx-mcp.js.map +1 -0
  35. package/src/connection/{agent-serve-local.d.ts → agent-local-dev.d.ts} +7 -7
  36. package/src/connection/agent-local-dev.js +42 -0
  37. package/src/connection/agent-local-dev.js.map +1 -0
  38. package/src/connection/agent-runtime-config.d.ts +1 -1
  39. package/src/connection/agent-runtime-config.js +9 -14
  40. package/src/connection/agent-runtime-config.js.map +1 -1
  41. package/src/connection/generator.d.ts +7 -14
  42. package/src/connection/generator.js +167 -194
  43. package/src/connection/generator.js.map +1 -1
  44. package/src/connection/local-dev.d.ts +15 -0
  45. package/src/connection/local-dev.js +37 -0
  46. package/src/connection/local-dev.js.map +1 -0
  47. package/src/connection/schema.d.js +6 -0
  48. package/src/connection/schema.d.js.map +1 -0
  49. package/src/connection/schema.d.ts +1 -0
  50. package/src/connection/schema.json +5 -0
  51. package/src/connection/supported-connections.d.ts +107 -0
  52. package/src/connection/supported-connections.js +151 -0
  53. package/src/connection/supported-connections.js.map +1 -0
  54. package/src/index.js +2 -5
  55. package/src/index.js.map +1 -1
  56. package/src/infra/app/__snapshots__/generator.spec.ts.snap +55 -85
  57. package/src/infra/app/files/app/src/main.ts.template +1 -1
  58. package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
  59. package/src/infra/app/generator.d.ts +3 -3
  60. package/src/infra/app/generator.js +142 -122
  61. package/src/infra/app/generator.js.map +1 -1
  62. package/src/infra/app/schema.d.js +6 -0
  63. package/src/infra/app/schema.d.js.map +1 -0
  64. package/src/infra/app/schema.d.ts +1 -1
  65. package/src/infra/app/schema.json +5 -0
  66. package/src/init/generator.d.ts +18 -0
  67. package/src/init/generator.js +35 -0
  68. package/src/init/generator.js.map +1 -0
  69. package/src/init/schema.d.js +6 -0
  70. package/src/init/schema.d.js.map +1 -0
  71. package/src/init/schema.d.ts +16 -0
  72. package/src/init/schema.json +35 -0
  73. package/src/license/__snapshots__/config.spec.ts.snap +23 -0
  74. package/src/license/config-types.d.ts +18 -1
  75. package/src/license/config-types.js +8 -2
  76. package/src/license/config-types.js.map +1 -1
  77. package/src/license/config.d.ts +65 -7
  78. package/src/license/config.js +442 -109
  79. package/src/license/config.js.map +1 -1
  80. package/src/license/dependency-check/check.d.ts +16 -0
  81. package/src/license/dependency-check/check.js +116 -0
  82. package/src/license/dependency-check/check.js.map +1 -0
  83. package/src/license/dependency-check/collectors/collector.d.ts +21 -0
  84. package/src/license/dependency-check/collectors/collector.js +46 -0
  85. package/src/license/dependency-check/collectors/collector.js.map +1 -0
  86. package/src/license/dependency-check/collectors/npm-collector.d.ts +10 -0
  87. package/src/license/dependency-check/collectors/npm-collector.js +68 -0
  88. package/src/license/dependency-check/collectors/npm-collector.js.map +1 -0
  89. package/src/license/dependency-check/collectors/python-collector.d.ts +23 -0
  90. package/src/license/dependency-check/collectors/python-collector.js +114 -0
  91. package/src/license/dependency-check/collectors/python-collector.js.map +1 -0
  92. package/src/license/dependency-check/evaluator.d.ts +9 -0
  93. package/src/license/dependency-check/evaluator.js +94 -0
  94. package/src/license/dependency-check/evaluator.js.map +1 -0
  95. package/src/license/dependency-check/executor-schema.json +6 -0
  96. package/src/license/dependency-check/executor.d.ts +9 -0
  97. package/src/license/dependency-check/executor.js +51 -0
  98. package/src/license/dependency-check/executor.js.map +1 -0
  99. package/src/license/dependency-check/pre-approved.d.ts +6 -0
  100. package/src/license/dependency-check/pre-approved.js +1893 -0
  101. package/src/license/dependency-check/pre-approved.js.map +1 -0
  102. package/src/license/dependency-check/types.d.ts +45 -0
  103. package/src/license/dependency-check/types.js +6 -0
  104. package/src/license/dependency-check/types.js.map +1 -0
  105. package/src/license/generator.d.ts +3 -3
  106. package/src/license/generator.js +126 -30
  107. package/src/license/generator.js.map +1 -1
  108. package/src/license/index.d.ts +8 -0
  109. package/src/license/index.js +7 -0
  110. package/src/license/index.js.map +1 -0
  111. package/src/license/known-exceptions.d.ts +7 -0
  112. package/src/license/known-exceptions.js +39 -0
  113. package/src/license/known-exceptions.js.map +1 -0
  114. package/src/license/schema.d.js +6 -0
  115. package/src/license/schema.d.js.map +1 -0
  116. package/src/license/schema.d.ts +7 -0
  117. package/src/license/schema.json +11 -0
  118. package/src/license/sync/generator.d.ts +2 -2
  119. package/src/license/sync/generator.js +100 -125
  120. package/src/license/sync/generator.js.map +1 -1
  121. package/src/license/sync/project-file-sync.d.ts +3 -3
  122. package/src/license/sync/project-file-sync.js +28 -35
  123. package/src/license/sync/project-file-sync.js.map +1 -1
  124. package/src/mcp-server/generator-info.d.ts +5 -1
  125. package/src/mcp-server/generator-info.js +149 -165
  126. package/src/mcp-server/generator-info.js.map +1 -1
  127. package/src/mcp-server/guide-pipeline.d.ts +1 -1
  128. package/src/mcp-server/guide-pipeline.js +199 -206
  129. package/src/mcp-server/guide-pipeline.js.map +1 -1
  130. package/src/mcp-server/guide-render.js +10 -25
  131. package/src/mcp-server/guide-render.js.map +1 -1
  132. package/src/mcp-server/index.js +6 -10
  133. package/src/mcp-server/index.js.map +1 -1
  134. package/src/mcp-server/mdx-ast.js +42 -56
  135. package/src/mcp-server/mdx-ast.js.map +1 -1
  136. package/src/mcp-server/option-filter.js +33 -47
  137. package/src/mcp-server/option-filter.js.map +1 -1
  138. package/src/mcp-server/schema-registry.d.ts +9 -3
  139. package/src/mcp-server/schema-registry.js +41 -38
  140. package/src/mcp-server/schema-registry.js.map +1 -1
  141. package/src/mcp-server/schema.js +9 -7
  142. package/src/mcp-server/schema.js.map +1 -1
  143. package/src/mcp-server/server.js +22 -24
  144. package/src/mcp-server/server.js.map +1 -1
  145. package/src/mcp-server/tools/add-to-existing-project.d.ts +12 -0
  146. package/src/mcp-server/tools/add-to-existing-project.js +36 -0
  147. package/src/mcp-server/tools/add-to-existing-project.js.map +1 -0
  148. package/src/mcp-server/tools/create-workspace-command.d.ts +1 -1
  149. package/src/mcp-server/tools/create-workspace-command.js +23 -24
  150. package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
  151. package/src/mcp-server/tools/general-guidance.d.ts +3 -3
  152. package/src/mcp-server/tools/general-guidance.js +47 -25
  153. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  154. package/src/mcp-server/tools/generator-guide.d.ts +2 -2
  155. package/src/mcp-server/tools/generator-guide.js +29 -37
  156. package/src/mcp-server/tools/generator-guide.js.map +1 -1
  157. package/src/mcp-server/tools/list-generators.d.ts +2 -2
  158. package/src/mcp-server/tools/list-generators.js +19 -25
  159. package/src/mcp-server/tools/list-generators.js.map +1 -1
  160. package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
  161. package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
  162. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +298 -74
  163. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +748 -103
  164. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +230 -37
  165. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +249 -52
  166. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5535 -0
  167. package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
  168. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +305 -71
  169. package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +298 -0
  170. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +353 -82
  171. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +176 -55
  172. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +101 -25
  173. package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
  174. package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
  175. package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
  176. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +200 -48
  177. package/src/open-api/ts-client/files/client.gen.ts.template +358 -24
  178. package/src/open-api/ts-client/files/types.gen.ts.template +6 -4
  179. package/src/open-api/ts-client/generator.d.ts +3 -3
  180. package/src/open-api/ts-client/generator.js +41 -26
  181. package/src/open-api/ts-client/generator.js.map +1 -1
  182. package/src/open-api/ts-client/schema.d.js +6 -0
  183. package/src/open-api/ts-client/schema.d.js.map +1 -0
  184. package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +7 -2
  185. package/src/open-api/ts-hooks/generator.d.ts +3 -3
  186. package/src/open-api/ts-hooks/generator.js +17 -21
  187. package/src/open-api/ts-hooks/generator.js.map +1 -1
  188. package/src/open-api/ts-hooks/generator.spec.tsx +84 -14
  189. package/src/open-api/ts-hooks/schema.d.js +6 -0
  190. package/src/open-api/ts-hooks/schema.d.js.map +1 -0
  191. package/src/open-api/ts-metadata/generator.d.ts +3 -3
  192. package/src/open-api/ts-metadata/generator.js +12 -20
  193. package/src/open-api/ts-metadata/generator.js.map +1 -1
  194. package/src/open-api/ts-metadata/schema.d.js +6 -0
  195. package/src/open-api/ts-metadata/schema.d.js.map +1 -0
  196. package/src/open-api/utils/codegen-data/languages.d.ts +3 -5
  197. package/src/open-api/utils/codegen-data/languages.js +59 -66
  198. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  199. package/src/open-api/utils/codegen-data/types.d.ts +255 -10
  200. package/src/open-api/utils/codegen-data/types.js +54 -30
  201. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  202. package/src/open-api/utils/codegen-data.d.ts +8 -4
  203. package/src/open-api/utils/codegen-data.js +494 -674
  204. package/src/open-api/utils/codegen-data.js.map +1 -1
  205. package/src/open-api/utils/normalise.d.ts +5 -1
  206. package/src/open-api/utils/normalise.js +437 -246
  207. package/src/open-api/utils/normalise.js.map +1 -1
  208. package/src/open-api/utils/parse.d.ts +2 -2
  209. package/src/open-api/utils/parse.js +11 -13
  210. package/src/open-api/utils/parse.js.map +1 -1
  211. package/src/open-api/utils/parser.d.ts +55 -0
  212. package/src/open-api/utils/parser.js +787 -0
  213. package/src/open-api/utils/parser.js.map +1 -0
  214. package/src/open-api/utils/refs.d.ts +1 -1
  215. package/src/open-api/utils/refs.js +12 -22
  216. package/src/open-api/utils/refs.js.map +1 -1
  217. package/src/open-api/utils/types.d.ts +18 -0
  218. package/src/open-api/utils/types.js +5 -2
  219. package/src/open-api/utils/types.js.map +1 -1
  220. package/src/preset/__snapshots__/generator.spec.ts.snap +106 -28
  221. package/src/preset/generator.d.ts +4 -4
  222. package/src/preset/generator.js +64 -147
  223. package/src/preset/generator.js.map +1 -1
  224. package/src/preset/schema.d.js +6 -0
  225. package/src/preset/schema.d.js.map +1 -0
  226. package/src/preset/schema.d.ts +5 -2
  227. package/src/preset/schema.json +11 -5
  228. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +320 -0
  229. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +734 -0
  230. package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +182 -314
  231. package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +189 -0
  232. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +30 -0
  233. package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +28 -0
  234. package/src/py/agent/a2a-connection/generator.d.ts +3 -3
  235. package/src/py/agent/a2a-connection/generator.js +113 -85
  236. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  237. package/src/py/agent/a2a-connection/schema.d.js +8 -0
  238. package/src/py/agent/a2a-connection/schema.d.js.map +1 -0
  239. package/src/py/agent/a2a-connection/schema.d.ts +1 -0
  240. package/src/py/agent/a2a-connection/schema.json +5 -0
  241. package/src/py/agent/files/a2a-langchain/main.py.template +89 -0
  242. package/src/py/agent/files/ag-ui-langchain/main.py.template +83 -0
  243. package/src/py/agent/files/common/agent.py.template +2 -0
  244. package/src/py/agent/files/common-langchain/agent.py.template +30 -0
  245. package/src/py/agent/files/deploy/Dockerfile.template +1 -1
  246. package/src/py/agent/files/http/init.py.template +7 -25
  247. package/src/py/agent/files/http/main.py.template +3 -4
  248. package/src/py/agent/files/http-langchain/main.py.template +84 -0
  249. package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
  250. package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
  251. package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
  252. package/src/py/agent/gateway-connection/generator.d.ts +10 -0
  253. package/src/py/agent/gateway-connection/generator.js +119 -0
  254. package/src/py/agent/gateway-connection/generator.js.map +1 -0
  255. package/src/py/agent/gateway-connection/schema.d.js +6 -0
  256. package/src/py/agent/gateway-connection/schema.d.js.map +1 -0
  257. package/src/py/agent/gateway-connection/schema.d.ts +13 -0
  258. package/src/py/agent/gateway-connection/schema.json +31 -0
  259. package/src/py/agent/generator.d.ts +3 -3
  260. package/src/py/agent/generator.js +290 -179
  261. package/src/py/agent/generator.js.map +1 -1
  262. package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +153 -89
  263. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +30 -0
  264. package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +30 -0
  265. package/src/py/agent/mcp-connection/generator.d.ts +3 -3
  266. package/src/py/agent/mcp-connection/generator.js +65 -126
  267. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  268. package/src/py/agent/mcp-connection/schema.d.js +8 -0
  269. package/src/py/agent/mcp-connection/schema.d.js.map +1 -0
  270. package/src/py/agent/mcp-connection/schema.d.ts +1 -0
  271. package/src/py/agent/mcp-connection/schema.json +5 -0
  272. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +11 -19
  273. package/src/py/agent/react-connection/generator.d.ts +4 -4
  274. package/src/py/agent/react-connection/generator.js +55 -59
  275. package/src/py/agent/react-connection/generator.js.map +1 -1
  276. package/src/py/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +6 -6
  277. package/src/py/agent/react-connection/local-dev.js +36 -0
  278. package/src/py/agent/react-connection/local-dev.js.map +1 -0
  279. package/src/py/agent/react-connection/schema.d.js +8 -0
  280. package/src/py/agent/react-connection/schema.d.js.map +1 -0
  281. package/src/py/agent/react-connection/schema.d.ts +1 -0
  282. package/src/py/agent/react-connection/schema.json +5 -0
  283. package/src/py/agent/schema.d.js +6 -0
  284. package/src/py/agent/schema.d.js.map +1 -0
  285. package/src/py/agent/schema.d.ts +2 -1
  286. package/src/py/agent/schema.json +6 -1
  287. package/src/py/api/generator.d.ts +3 -3
  288. package/src/py/api/generator.js +12 -11
  289. package/src/py/api/generator.js.map +1 -1
  290. package/src/py/api/schema.d.js +6 -0
  291. package/src/py/api/schema.d.js.map +1 -0
  292. package/src/py/api/schema.d.ts +1 -0
  293. package/src/py/api/schema.json +5 -0
  294. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1526 -0
  295. package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
  296. package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
  297. package/src/py/dynamodb/agent-connection/generator.js +39 -0
  298. package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
  299. package/src/py/dynamodb/agent-connection/schema.d.js +8 -0
  300. package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -0
  301. package/src/py/dynamodb/agent-connection/schema.d.ts +15 -0
  302. package/src/py/dynamodb/agent-connection/schema.json +27 -0
  303. package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +23 -0
  304. package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
  305. package/src/py/dynamodb/fast-api-connection/generator.js +37 -0
  306. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
  307. package/src/py/dynamodb/fast-api-connection/schema.d.js +8 -0
  308. package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -0
  309. package/src/py/dynamodb/fast-api-connection/schema.d.ts +13 -0
  310. package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
  311. package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
  312. package/src/py/dynamodb/files/__name__/client.py.template +39 -0
  313. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
  314. package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
  315. package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
  316. package/src/py/dynamodb/files/config.json.template +24 -0
  317. package/src/py/dynamodb/generator.d.ts +10 -0
  318. package/src/py/dynamodb/generator.js +110 -0
  319. package/src/py/dynamodb/generator.js.map +1 -0
  320. package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
  321. package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  322. package/src/py/dynamodb/mcp-server-connection/generator.js +39 -0
  323. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
  324. package/src/py/dynamodb/mcp-server-connection/schema.d.js +8 -0
  325. package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  326. package/src/py/dynamodb/mcp-server-connection/schema.d.ts +15 -0
  327. package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
  328. package/src/py/dynamodb/schema.d.js +6 -0
  329. package/src/py/dynamodb/schema.d.js.map +1 -0
  330. package/src/py/dynamodb/schema.d.ts +16 -0
  331. package/src/py/dynamodb/schema.json +75 -0
  332. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +212 -4678
  333. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +5409 -0
  334. package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
  335. package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
  336. package/src/py/fast-api/generator.d.ts +3 -3
  337. package/src/py/fast-api/generator.js +90 -87
  338. package/src/py/fast-api/generator.js.map +1 -1
  339. package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +4 -3
  340. package/src/py/fast-api/react/generator.d.ts +4 -4
  341. package/src/py/fast-api/react/generator.js +25 -25
  342. package/src/py/fast-api/react/generator.js.map +1 -1
  343. package/src/py/fast-api/react/open-api.d.ts +1 -1
  344. package/src/py/fast-api/react/open-api.js +31 -29
  345. package/src/py/fast-api/react/open-api.js.map +1 -1
  346. package/src/py/fast-api/react/schema.d.js +6 -0
  347. package/src/py/fast-api/react/schema.d.js.map +1 -0
  348. package/src/py/fast-api/react/schema.d.ts +1 -0
  349. package/src/py/fast-api/react/schema.json +5 -0
  350. package/src/py/fast-api/schema.d.js +6 -0
  351. package/src/py/fast-api/schema.d.js.map +1 -0
  352. package/src/py/fast-api/schema.d.ts +1 -0
  353. package/src/py/fast-api/schema.json +5 -0
  354. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  355. package/src/py/lambda-function/generator.d.ts +3 -3
  356. package/src/py/lambda-function/generator.js +60 -59
  357. package/src/py/lambda-function/generator.js.map +1 -1
  358. package/src/py/lambda-function/schema.d.js +6 -0
  359. package/src/py/lambda-function/schema.d.js.map +1 -0
  360. package/src/py/lambda-function/schema.d.ts +1 -0
  361. package/src/py/lambda-function/schema.json +5 -0
  362. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +208 -19
  363. package/src/py/mcp-server/files/deploy/Dockerfile.template +1 -1
  364. package/src/py/mcp-server/generator.d.ts +3 -3
  365. package/src/py/mcp-server/generator.js +162 -124
  366. package/src/py/mcp-server/generator.js.map +1 -1
  367. package/src/py/mcp-server/schema.d.js +6 -0
  368. package/src/py/mcp-server/schema.d.js.map +1 -0
  369. package/src/py/mcp-server/schema.d.ts +1 -0
  370. package/src/py/mcp-server/schema.json +5 -0
  371. package/src/py/project/generator.d.ts +17 -4
  372. package/src/py/project/generator.js +205 -127
  373. package/src/py/project/generator.js.map +1 -1
  374. package/src/py/project/schema.d.js +6 -0
  375. package/src/py/project/schema.d.js.map +1 -0
  376. package/src/py/project/schema.d.ts +1 -0
  377. package/src/py/project/schema.json +5 -0
  378. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2038 -0
  379. package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +104 -0
  380. package/src/py/rdb/agent-connection/generator.d.ts +10 -0
  381. package/src/py/rdb/agent-connection/generator.js +46 -0
  382. package/src/py/rdb/agent-connection/generator.js.map +1 -0
  383. package/src/py/rdb/agent-connection/schema.d.js +8 -0
  384. package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
  385. package/src/py/rdb/agent-connection/schema.d.ts +15 -0
  386. package/src/py/rdb/agent-connection/schema.json +27 -0
  387. package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +44 -0
  388. package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
  389. package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
  390. package/src/py/rdb/fast-api-connection/generator.js +54 -0
  391. package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
  392. package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
  393. package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
  394. package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
  395. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  396. package/src/py/rdb/files/Dockerfile.create-db-user.template +10 -0
  397. package/src/py/rdb/files/Dockerfile.migration.template +10 -0
  398. package/src/py/rdb/files/__name__/__init__.py.template +3 -0
  399. package/src/py/rdb/files/__name__/connection.py.template +55 -0
  400. package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
  401. package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
  402. package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
  403. package/src/py/rdb/files/__name__/models/example.py.template +8 -0
  404. package/src/py/rdb/files/__name__/utils.py.template +104 -0
  405. package/src/py/rdb/files/alembic.ini.template +38 -0
  406. package/src/py/rdb/files/config.json.template +14 -0
  407. package/src/py/rdb/files/migrations/env.py.template +80 -0
  408. package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
  409. package/src/py/rdb/generator.d.ts +6 -0
  410. package/src/py/rdb/generator.js +274 -0
  411. package/src/py/rdb/generator.js.map +1 -0
  412. package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +101 -0
  413. package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
  414. package/src/py/rdb/mcp-server-connection/generator.js +46 -0
  415. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
  416. package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
  417. package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
  418. package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
  419. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  420. package/src/py/rdb/schema.d.js +6 -0
  421. package/src/py/rdb/schema.d.js.map +1 -0
  422. package/src/py/rdb/schema.d.ts +16 -0
  423. package/src/py/rdb/schema.json +77 -0
  424. package/src/py/rdb/utils.d.ts +6 -0
  425. package/src/py/rdb/utils.js +16 -0
  426. package/src/py/rdb/utils.js.map +1 -0
  427. package/src/sdk/agentcore-gateway.d.ts +6 -0
  428. package/src/sdk/agentcore-gateway.js +7 -0
  429. package/src/sdk/agentcore-gateway.js.map +1 -0
  430. package/src/sdk/connection.d.ts +6 -0
  431. package/src/sdk/connection.js +6 -0
  432. package/src/sdk/connection.js.map +1 -0
  433. package/src/sdk/license.d.ts +8 -0
  434. package/src/sdk/license.js +7 -0
  435. package/src/sdk/license.js.map +1 -0
  436. package/src/sdk/open-api.d.ts +10 -0
  437. package/src/sdk/open-api.js +8 -0
  438. package/src/sdk/open-api.js.map +1 -0
  439. package/src/sdk/py.d.ts +16 -0
  440. package/src/sdk/py.js +11 -0
  441. package/src/sdk/py.js.map +1 -0
  442. package/src/sdk/terraform.d.ts +6 -0
  443. package/src/sdk/terraform.js +7 -0
  444. package/src/sdk/terraform.js.map +1 -0
  445. package/src/sdk/ts.d.ts +33 -0
  446. package/src/sdk/ts.js +35 -0
  447. package/src/sdk/ts.js.map +1 -0
  448. package/{sdk → src/sdk}/utils/ast.d.ts +1 -2
  449. package/src/sdk/utils/ast.js +6 -0
  450. package/src/sdk/utils/ast.js.map +1 -0
  451. package/{sdk → src/sdk}/utils/format.d.ts +1 -1
  452. package/src/sdk/utils/format.js +6 -0
  453. package/src/sdk/utils/format.js.map +1 -0
  454. package/{sdk → src/sdk}/utils/test.d.ts +1 -1
  455. package/src/sdk/utils/test.js +6 -0
  456. package/src/sdk/utils/test.js.map +1 -0
  457. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +19 -24
  458. package/src/smithy/project/files/build.Dockerfile.template +1 -4
  459. package/src/smithy/project/files/src/operations/echo.smithy.template +1 -0
  460. package/src/smithy/project/generator.d.ts +3 -3
  461. package/src/smithy/project/generator.js +64 -57
  462. package/src/smithy/project/generator.js.map +1 -1
  463. package/src/smithy/project/schema.d.js +6 -0
  464. package/src/smithy/project/schema.d.js.map +1 -0
  465. package/src/smithy/project/schema.d.ts +1 -0
  466. package/src/smithy/project/schema.json +5 -0
  467. package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
  468. package/src/smithy/react-connection/generator.d.ts +3 -3
  469. package/src/smithy/react-connection/generator.js +39 -47
  470. package/src/smithy/react-connection/generator.js.map +1 -1
  471. package/src/smithy/react-connection/schema.d.js +6 -0
  472. package/src/smithy/react-connection/schema.d.js.map +1 -0
  473. package/src/smithy/react-connection/schema.d.ts +1 -0
  474. package/src/smithy/react-connection/schema.json +5 -0
  475. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +809 -122
  476. package/src/smithy/ts/api/files/handler.ts.template +2 -2
  477. package/src/smithy/ts/api/files/local-server.ts.template +2 -2
  478. package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
  479. package/src/smithy/ts/api/files/service.ts.template +3 -3
  480. package/src/smithy/ts/api/generator.d.ts +3 -3
  481. package/src/smithy/ts/api/generator.js +128 -105
  482. package/src/smithy/ts/api/generator.js.map +1 -1
  483. package/src/smithy/ts/api/schema.d.js +6 -0
  484. package/src/smithy/ts/api/schema.d.js.map +1 -0
  485. package/src/smithy/ts/api/schema.d.ts +1 -0
  486. package/src/smithy/ts/api/schema.json +5 -0
  487. package/src/terraform/project/files/application/src/main.tf.template +6 -1
  488. package/src/terraform/project/files/application/src/providers.tf.template +1 -1
  489. package/src/terraform/project/generator.d.ts +3 -3
  490. package/src/terraform/project/generator.js +156 -104
  491. package/src/terraform/project/generator.js.map +1 -1
  492. package/src/terraform/project/schema.d.js +9 -0
  493. package/src/terraform/project/schema.d.js.map +1 -0
  494. package/src/terraform/project/schema.d.ts +1 -0
  495. package/src/terraform/project/schema.json +5 -0
  496. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +1099 -134
  497. package/src/trpc/backend/files/src/client/index.ts.template +1 -1
  498. package/src/trpc/backend/files/src/handler.ts.template +1 -1
  499. package/src/trpc/backend/files/src/index.ts.template +5 -5
  500. package/src/trpc/backend/files/src/init.ts.template +1 -1
  501. package/src/trpc/backend/files/src/local-server.ts.template +1 -1
  502. package/src/trpc/backend/files/src/middleware/index.ts.template +7 -7
  503. package/src/trpc/backend/files/src/procedures/echo.ts.template +3 -3
  504. package/src/trpc/backend/files/src/router.ts.template +2 -2
  505. package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
  506. package/src/trpc/backend/files/src/schema/index.ts.template +1 -1
  507. package/src/trpc/backend/generator.d.ts +4 -4
  508. package/src/trpc/backend/generator.js +98 -84
  509. package/src/trpc/backend/generator.js.map +1 -1
  510. package/src/trpc/backend/schema.d.js +6 -0
  511. package/src/trpc/backend/schema.d.js.map +1 -0
  512. package/src/trpc/backend/schema.d.ts +3 -2
  513. package/src/trpc/backend/schema.json +5 -0
  514. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +4 -4
  515. package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
  516. package/src/trpc/react/generator.d.ts +4 -4
  517. package/src/trpc/react/generator.js +63 -58
  518. package/src/trpc/react/generator.js.map +1 -1
  519. package/src/trpc/react/schema.d.js +6 -0
  520. package/src/trpc/react/schema.d.js.map +1 -0
  521. package/src/trpc/react/schema.d.ts +1 -0
  522. package/src/trpc/react/schema.json +5 -0
  523. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +781 -22
  524. package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +256 -0
  525. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
  526. package/src/ts/agent/a2a-connection/generator.d.ts +3 -3
  527. package/src/ts/agent/a2a-connection/generator.js +64 -55
  528. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  529. package/src/ts/agent/a2a-connection/schema.d.js +8 -0
  530. package/src/ts/agent/a2a-connection/schema.d.js.map +1 -0
  531. package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
  532. package/src/ts/agent/a2a-connection/schema.json +5 -0
  533. package/src/ts/agent/files/a2a/index.ts.template +1 -1
  534. package/src/ts/agent/files/ag-ui/index.ts.template +1 -1
  535. package/src/ts/agent/files/common/agent.ts.template +6 -2
  536. package/src/ts/agent/files/deploy/Dockerfile.template +4 -1
  537. package/src/ts/agent/files/http/client.ts.template +2 -2
  538. package/src/ts/agent/files/http/index.ts.template +2 -2
  539. package/src/ts/agent/files/http/router.ts.template +5 -5
  540. package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +220 -0
  541. package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
  542. package/src/ts/agent/gateway-connection/generator.d.ts +10 -0
  543. package/src/ts/agent/gateway-connection/generator.js +116 -0
  544. package/src/ts/agent/gateway-connection/generator.js.map +1 -0
  545. package/src/ts/agent/gateway-connection/schema.d.js +6 -0
  546. package/src/ts/agent/gateway-connection/schema.d.js.map +1 -0
  547. package/src/ts/agent/gateway-connection/schema.d.ts +13 -0
  548. package/src/ts/agent/gateway-connection/schema.json +31 -0
  549. package/src/ts/agent/generator.d.ts +3 -3
  550. package/src/ts/agent/generator.js +203 -144
  551. package/src/ts/agent/generator.js.map +1 -1
  552. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +192 -111
  553. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +22 -0
  554. package/src/ts/agent/mcp-connection/generator.d.ts +3 -3
  555. package/src/ts/agent/mcp-connection/generator.js +54 -59
  556. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  557. package/src/ts/agent/mcp-connection/schema.d.js +8 -0
  558. package/src/ts/agent/mcp-connection/schema.d.js.map +1 -0
  559. package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
  560. package/src/ts/agent/mcp-connection/schema.json +5 -0
  561. package/src/ts/agent/react-connection/generator.d.ts +4 -4
  562. package/src/ts/agent/react-connection/generator.js +86 -80
  563. package/src/ts/agent/react-connection/generator.js.map +1 -1
  564. package/src/ts/agent/react-connection/local-dev.d.ts +13 -0
  565. package/src/ts/agent/react-connection/local-dev.js +17 -0
  566. package/src/ts/agent/react-connection/local-dev.js.map +1 -0
  567. package/src/ts/agent/react-connection/schema.d.js +8 -0
  568. package/src/ts/agent/react-connection/schema.d.js.map +1 -0
  569. package/src/ts/agent/react-connection/schema.d.ts +1 -0
  570. package/src/ts/agent/react-connection/schema.json +5 -0
  571. package/src/ts/agent/schema.d.js +6 -0
  572. package/src/ts/agent/schema.d.js.map +1 -0
  573. package/src/ts/agent/schema.d.ts +1 -0
  574. package/src/ts/agent/schema.json +5 -0
  575. package/src/ts/api/generator.d.ts +3 -3
  576. package/src/ts/api/generator.js +16 -16
  577. package/src/ts/api/generator.js.map +1 -1
  578. package/src/ts/api/schema.d.js +6 -0
  579. package/src/ts/api/schema.d.js.map +1 -0
  580. package/src/ts/api/schema.d.ts +3 -1
  581. package/src/ts/api/schema.json +5 -0
  582. package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +15 -16
  583. package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +3 -2
  584. package/src/ts/astro-docs/generator.d.ts +3 -3
  585. package/src/ts/astro-docs/generator.js +71 -54
  586. package/src/ts/astro-docs/generator.js.map +1 -1
  587. package/src/ts/astro-docs/schema.d.js +6 -0
  588. package/src/ts/astro-docs/schema.d.js.map +1 -0
  589. package/src/ts/astro-docs/schema.d.ts +2 -2
  590. package/src/ts/astro-docs/schema.json +3 -3
  591. package/src/ts/docs/generator.d.ts +3 -3
  592. package/src/ts/docs/generator.js +10 -10
  593. package/src/ts/docs/generator.js.map +1 -1
  594. package/src/ts/docs/schema.d.js +6 -0
  595. package/src/ts/docs/schema.d.js.map +1 -0
  596. package/src/ts/docs/schema.d.ts +1 -4
  597. package/src/ts/docs/schema.json +3 -3
  598. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +400 -512
  599. package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +5 -5
  600. package/src/ts/dynamodb/agent-connection/generator.d.ts +3 -3
  601. package/src/ts/dynamodb/agent-connection/generator.js +21 -23
  602. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
  603. package/src/ts/dynamodb/agent-connection/schema.d.js +8 -0
  604. package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -0
  605. package/src/ts/dynamodb/agent-connection/schema.d.ts +1 -0
  606. package/src/ts/dynamodb/agent-connection/schema.json +5 -0
  607. package/src/ts/dynamodb/files/config.json.template +24 -0
  608. package/src/ts/dynamodb/files/src/client.ts.template +30 -11
  609. package/src/ts/dynamodb/files/src/entities/example.ts.template +1 -1
  610. package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -1
  611. package/src/ts/dynamodb/files/src/index.ts.template +2 -11
  612. package/src/ts/dynamodb/generator.d.ts +3 -3
  613. package/src/ts/dynamodb/generator.js +73 -63
  614. package/src/ts/dynamodb/generator.js.map +1 -1
  615. package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +5 -5
  616. package/src/ts/dynamodb/mcp-server-connection/generator.d.ts +3 -3
  617. package/src/ts/dynamodb/mcp-server-connection/generator.js +21 -23
  618. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
  619. package/src/ts/dynamodb/mcp-server-connection/schema.d.js +8 -0
  620. package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  621. package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +1 -0
  622. package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
  623. package/src/ts/dynamodb/schema.d.js +6 -0
  624. package/src/ts/dynamodb/schema.d.js.map +1 -0
  625. package/src/ts/dynamodb/schema.d.ts +2 -0
  626. package/src/ts/dynamodb/schema.json +25 -2
  627. package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +3 -3
  628. package/src/ts/dynamodb/smithy-connection/generator.d.ts +3 -3
  629. package/src/ts/dynamodb/smithy-connection/generator.js +20 -22
  630. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
  631. package/src/ts/dynamodb/smithy-connection/schema.d.js +8 -0
  632. package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -0
  633. package/src/ts/dynamodb/smithy-connection/schema.d.ts +1 -0
  634. package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
  635. package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +3 -3
  636. package/src/ts/dynamodb/trpc-connection/generator.d.ts +3 -3
  637. package/src/ts/dynamodb/trpc-connection/generator.js +20 -22
  638. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
  639. package/src/ts/dynamodb/trpc-connection/schema.d.js +8 -0
  640. package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -0
  641. package/src/ts/dynamodb/trpc-connection/schema.d.ts +1 -0
  642. package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
  643. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  644. package/src/ts/lambda-function/generator.d.ts +3 -3
  645. package/src/ts/lambda-function/generator.js +59 -56
  646. package/src/ts/lambda-function/generator.js.map +1 -1
  647. package/src/ts/lambda-function/io.js +83 -52
  648. package/src/ts/lambda-function/io.js.map +1 -1
  649. package/src/ts/lambda-function/schema.d.js +6 -0
  650. package/src/ts/lambda-function/schema.d.js.map +1 -0
  651. package/src/ts/lambda-function/schema.d.ts +1 -0
  652. package/src/ts/lambda-function/schema.json +5 -0
  653. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +53 -99
  654. package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +24 -0
  655. package/src/ts/lib/biome.d.ts +7 -0
  656. package/src/ts/lib/biome.js +58 -0
  657. package/src/ts/lib/biome.js.map +1 -0
  658. package/src/ts/lib/generator.d.ts +3 -3
  659. package/src/ts/lib/generator.js +107 -108
  660. package/src/ts/lib/generator.js.map +1 -1
  661. package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
  662. package/src/ts/lib/schema.d.js +6 -0
  663. package/src/ts/lib/schema.d.js.map +1 -0
  664. package/src/ts/lib/schema.d.ts +1 -1
  665. package/src/ts/lib/schema.json +5 -0
  666. package/src/ts/lib/ts-project-utils.d.ts +12 -2
  667. package/src/ts/lib/ts-project-utils.js +90 -67
  668. package/src/ts/lib/ts-project-utils.js.map +1 -1
  669. package/src/ts/lib/types.d.ts +6 -0
  670. package/src/ts/lib/types.js +5 -2
  671. package/src/ts/lib/types.js.map +1 -1
  672. package/src/ts/lib/vitest.d.ts +2 -2
  673. package/src/ts/lib/vitest.js +29 -26
  674. package/src/ts/lib/vitest.js.map +1 -1
  675. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +208 -42
  676. package/src/ts/mcp-server/files/Dockerfile.template +4 -1
  677. package/src/ts/mcp-server/generator.d.ts +3 -3
  678. package/src/ts/mcp-server/generator.js +181 -136
  679. package/src/ts/mcp-server/generator.js.map +1 -1
  680. package/src/ts/mcp-server/schema.d.js +6 -0
  681. package/src/ts/mcp-server/schema.d.js.map +1 -0
  682. package/src/ts/mcp-server/schema.d.ts +1 -0
  683. package/src/ts/mcp-server/schema.json +5 -0
  684. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +46 -26
  685. package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
  686. package/src/ts/nx-generator/files/common/schema.json.template +5 -0
  687. package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
  688. package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
  689. package/src/ts/nx-generator/generator.d.ts +2 -2
  690. package/src/ts/nx-generator/generator.js +113 -73
  691. package/src/ts/nx-generator/generator.js.map +1 -1
  692. package/src/ts/nx-generator/schema.d.js +6 -0
  693. package/src/ts/nx-generator/schema.d.js.map +1 -0
  694. package/src/ts/nx-generator/schema.d.ts +1 -0
  695. package/src/ts/nx-generator/schema.json +5 -0
  696. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +30 -18
  697. package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
  698. package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
  699. package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
  700. package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
  701. package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
  702. package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +3 -3
  703. package/src/ts/nx-plugin/generator.d.ts +3 -3
  704. package/src/ts/nx-plugin/generator.js +61 -50
  705. package/src/ts/nx-plugin/generator.js.map +1 -1
  706. package/src/ts/nx-plugin/schema.d.js +9 -0
  707. package/src/ts/nx-plugin/schema.d.js.map +1 -0
  708. package/src/ts/nx-plugin/schema.json +5 -0
  709. package/src/ts/nx-plugin/utils.d.ts +1 -1
  710. package/src/ts/nx-plugin/utils.js +36 -39
  711. package/src/ts/nx-plugin/utils.js.map +1 -1
  712. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +455 -646
  713. package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +6 -6
  714. package/src/ts/rdb/agent-connection/generator.d.ts +3 -3
  715. package/src/ts/rdb/agent-connection/generator.js +38 -39
  716. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  717. package/src/ts/rdb/agent-connection/schema.d.js +8 -0
  718. package/src/ts/rdb/agent-connection/schema.d.js.map +1 -0
  719. package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
  720. package/src/ts/rdb/agent-connection/schema.json +5 -0
  721. package/src/ts/rdb/files/Dockerfile.template +8 -1
  722. package/src/ts/rdb/files/config.json.template +14 -0
  723. package/src/ts/rdb/files/prisma.config.ts.template +6 -5
  724. package/src/ts/rdb/files/src/create-db-user-handler.ts.template +9 -11
  725. package/src/ts/rdb/files/src/index.ts.template +1 -2
  726. package/src/ts/rdb/files/src/migration-handler.ts.template +2 -29
  727. package/src/ts/rdb/files/src/prisma.ts.template +33 -25
  728. package/src/ts/rdb/files/src/utils.ts.template +3 -0
  729. package/src/ts/rdb/generator.d.ts +3 -7
  730. package/src/ts/rdb/generator.js +173 -131
  731. package/src/ts/rdb/generator.js.map +1 -1
  732. package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +6 -6
  733. package/src/ts/rdb/mcp-server-connection/generator.d.ts +3 -3
  734. package/src/ts/rdb/mcp-server-connection/generator.js +36 -37
  735. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  736. package/src/ts/rdb/mcp-server-connection/schema.d.js +8 -0
  737. package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -0
  738. package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
  739. package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
  740. package/src/ts/rdb/schema.d.js +6 -0
  741. package/src/ts/rdb/schema.d.js.map +1 -0
  742. package/src/ts/rdb/schema.d.ts +1 -0
  743. package/src/ts/rdb/schema.json +6 -1
  744. package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +3 -3
  745. package/src/ts/rdb/smithy-connection/generator.d.ts +3 -3
  746. package/src/ts/rdb/smithy-connection/generator.js +46 -43
  747. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  748. package/src/ts/rdb/smithy-connection/schema.d.js +8 -0
  749. package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -0
  750. package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
  751. package/src/ts/rdb/smithy-connection/schema.json +5 -0
  752. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +3 -3
  753. package/src/ts/rdb/trpc-connection/generator.d.ts +3 -3
  754. package/src/ts/rdb/trpc-connection/generator.js +36 -31
  755. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  756. package/src/ts/rdb/trpc-connection/schema.d.js +8 -0
  757. package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -0
  758. package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
  759. package/src/ts/rdb/trpc-connection/schema.json +5 -0
  760. package/src/ts/rdb/utils.d.ts +1 -1
  761. package/src/ts/rdb/utils.js +9 -11
  762. package/src/ts/rdb/utils.js.map +1 -1
  763. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +1 -16
  764. package/src/ts/react-website/agui/generator.d.ts +1 -1
  765. package/src/ts/react-website/agui/generator.js +69 -62
  766. package/src/ts/react-website/agui/generator.js.map +1 -1
  767. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +628 -614
  768. package/src/ts/react-website/app/generator.d.ts +4 -4
  769. package/src/ts/react-website/app/generator.js +217 -192
  770. package/src/ts/react-website/app/generator.js.map +1 -1
  771. package/src/ts/react-website/app/schema.d.js +6 -0
  772. package/src/ts/react-website/app/schema.d.js.map +1 -0
  773. package/src/ts/react-website/app/schema.d.ts +1 -1
  774. package/src/ts/react-website/app/schema.json +11 -6
  775. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +129 -18
  776. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +36 -10
  777. package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
  778. package/src/ts/react-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +2 -2
  779. package/src/ts/react-website/cognito-auth/generator.d.ts +4 -4
  780. package/src/ts/react-website/cognito-auth/generator.js +64 -63
  781. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  782. package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +8 -6
  783. package/src/ts/react-website/cognito-auth/grit/cognito-auth-wrapper.grit +1 -1
  784. package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
  785. package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
  786. package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
  787. package/src/ts/react-website/cognito-auth/schema.d.js +6 -0
  788. package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -0
  789. package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
  790. package/src/ts/react-website/cognito-auth/schema.json +5 -0
  791. package/src/ts/react-website/cognito-auth/utils.d.ts +1 -1
  792. package/src/ts/react-website/cognito-auth/utils.js +34 -32
  793. package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
  794. package/src/ts/react-website/runtime-config/__snapshots__/generator.spec.ts.snap +2 -2
  795. package/src/ts/react-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +2 -2
  796. package/src/ts/react-website/runtime-config/generator.d.ts +3 -3
  797. package/src/ts/react-website/runtime-config/generator.js +29 -31
  798. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  799. package/src/ts/react-website/runtime-config/schema.d.js +6 -0
  800. package/src/ts/react-website/runtime-config/schema.d.js.map +1 -0
  801. package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
  802. package/src/ts/react-website/runtime-config/schema.json +5 -0
  803. package/src/ts/sync/generator.d.ts +3 -3
  804. package/src/ts/sync/generator.js +60 -59
  805. package/src/ts/sync/generator.js.map +1 -1
  806. package/src/ts/website/app/generator.d.ts +3 -3
  807. package/src/ts/website/app/generator.js +10 -10
  808. package/src/ts/website/app/generator.js.map +1 -1
  809. package/src/ts/website/app/schema.d.js +6 -0
  810. package/src/ts/website/app/schema.d.js.map +1 -0
  811. package/src/ts/website/app/schema.d.ts +1 -1
  812. package/src/ts/website/app/schema.json +11 -6
  813. package/src/ts/website/auth/generator.d.ts +4 -4
  814. package/src/ts/website/auth/generator.js +11 -10
  815. package/src/ts/website/auth/generator.js.map +1 -1
  816. package/src/ts/website/auth/schema.d.js +6 -0
  817. package/src/ts/website/auth/schema.d.js.map +1 -0
  818. package/src/ts/website/auth/schema.d.ts +1 -0
  819. package/src/ts/website/auth/schema.json +5 -0
  820. package/src/utils/agent-chat/agent-chat.d.ts +31 -0
  821. package/src/utils/agent-chat/agent-chat.js +31 -0
  822. package/src/utils/agent-chat/agent-chat.js.map +1 -0
  823. package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
  824. package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
  825. package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
  826. package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
  827. package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
  828. package/src/utils/agent-connection/agent-connection.d.ts +117 -25
  829. package/src/utils/agent-connection/agent-connection.js +414 -103
  830. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  831. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
  832. package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
  833. package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
  834. package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
  835. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
  836. package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +22 -32
  837. package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
  838. package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
  839. package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +36 -0
  840. 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
  841. package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
  842. package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
  843. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
  844. package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
  845. package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
  846. package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
  847. package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +99 -0
  848. package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
  849. package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
  850. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
  851. package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +5 -18
  852. package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
  853. package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
  854. package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
  855. package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
  856. package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
  857. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +11 -3
  858. package/src/utils/agent-core-constructs/agent-core-constructs.js +93 -38
  859. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  860. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +31 -4
  861. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +50 -0
  862. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +487 -0
  863. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
  864. package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +32 -0
  865. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +449 -0
  866. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
  867. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +151 -13
  868. package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
  869. package/src/utils/api-constructs/api-constructs.d.ts +2 -2
  870. package/src/utils/api-constructs/api-constructs.js +36 -31
  871. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  872. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +8 -8
  873. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +11 -8
  874. package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +26 -9
  875. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +70 -0
  876. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +82 -0
  877. package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +54 -18
  878. package/src/utils/api-constructs/files/cdk/core/api/trpc/trpc-utils.ts.template +1 -1
  879. package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
  880. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +101 -12
  881. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +194 -8
  882. package/src/utils/api-constructs/files/terraform/core/api/http/http-api/http-api.tf.template +1 -1
  883. package/src/utils/api-constructs/files/terraform/core/api/rest/api-gateway-account/api-gateway-account.tf.template +83 -0
  884. package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +5 -11
  885. package/src/utils/api-constructs/open-api-metadata.d.ts +2 -2
  886. package/src/utils/api-constructs/open-api-metadata.js +22 -22
  887. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  888. package/src/utils/ast/website.d.ts +5 -1
  889. package/src/utils/ast/website.js +18 -20
  890. package/src/utils/ast/website.js.map +1 -1
  891. package/src/utils/ast.d.ts +33 -1
  892. package/src/utils/ast.js +146 -70
  893. package/src/utils/ast.js.map +1 -1
  894. package/src/utils/base-tsconfig.d.ts +30 -0
  895. package/src/utils/base-tsconfig.js +32 -0
  896. package/src/utils/base-tsconfig.js.map +1 -0
  897. package/src/utils/bundle/bundle.d.ts +1 -1
  898. package/src/utils/bundle/bundle.js +50 -47
  899. package/src/utils/bundle/bundle.js.map +1 -1
  900. package/src/utils/commands.d.ts +10 -3
  901. package/src/utils/commands.js +60 -26
  902. package/src/utils/commands.js.map +1 -1
  903. package/src/utils/config/index.d.ts +5 -5
  904. package/src/utils/config/index.js +5 -4
  905. package/src/utils/config/index.js.map +1 -1
  906. package/src/utils/config/utils.d.ts +13 -3
  907. package/src/utils/config/utils.js +65 -43
  908. package/src/utils/config/utils.js.map +1 -1
  909. package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +1 -1
  910. package/src/utils/connection/open-api/react.d.ts +6 -6
  911. package/src/utils/connection/open-api/react.js +81 -77
  912. package/src/utils/connection/open-api/react.js.map +1 -1
  913. package/src/utils/containers.d.ts +1 -1
  914. package/src/utils/containers.js +22 -23
  915. package/src/utils/containers.js.map +1 -1
  916. package/src/utils/docker.d.ts +44 -0
  917. package/src/utils/docker.js +81 -0
  918. package/src/utils/docker.js.map +1 -0
  919. package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +3 -3
  920. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +39 -41
  921. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
  922. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +18 -5
  923. package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +1 -1
  924. package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +24 -17
  925. package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +1 -1
  926. package/src/utils/files/common/constructs/src/core/index.ts.template +4 -4
  927. package/src/utils/files/common/constructs/src/index.ts.template +2 -2
  928. package/src/utils/files/common/infra-config/src/index.ts.template +3 -3
  929. package/src/utils/files/common/infra-config/src/resolve-stage.ts.template +2 -2
  930. package/src/utils/files/common/infra-config/src/stages.config.ts.template +1 -1
  931. package/src/{ts/dynamodb/files/scripts → utils/files/common/scripts/src/dynamodb}/create-local-table.ts.template +65 -31
  932. package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
  933. package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +106 -0
  934. package/src/utils/files/common/scripts/src/infra/infra-deploy.ts.template +2 -0
  935. package/src/utils/files/common/scripts/src/infra/infra-destroy.ts.template +2 -0
  936. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +6 -3
  937. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +3 -3
  938. package/src/utils/files/common/scripts/src/rdb/mysql/wait-for-mysql-db.ts.template +32 -0
  939. package/src/utils/files/common/scripts/src/rdb/postgres/wait-for-postgres-db.ts.template +32 -0
  940. package/src/utils/files/common/scripts/src/rdb/shared/pull-image.ts.template +16 -0
  941. package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +117 -0
  942. package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
  943. package/src/utils/files/terraform/src/core/asset-bucket/asset-bucket.tf.template +2 -2
  944. package/src/utils/files/terraform/src/core/runtime-config/appconfig/appconfig.tf.template +1 -1
  945. package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +12 -6
  946. package/src/utils/files/terraform/src/core/runtime-config/entry/entry.tf.template +1 -1
  947. package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +9 -4
  948. package/src/utils/files/website/hooks/sigv4/useSigV4.tsx.template +1 -1
  949. package/src/utils/format.d.ts +45 -2
  950. package/src/utils/format.js +323 -81
  951. package/src/utils/format.js.map +1 -1
  952. package/src/utils/fs.d.ts +1 -1
  953. package/src/utils/fs.js +14 -13
  954. package/src/utils/fs.js.map +1 -1
  955. package/src/utils/function-constructs/files/cdk/app/lambda-functions/__nameKebabCase__.ts.template +1 -1
  956. package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
  957. package/src/utils/function-constructs/function-constructs.d.ts +2 -2
  958. package/src/utils/function-constructs/function-constructs.js +22 -25
  959. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  960. package/src/utils/generators.d.ts +4 -0
  961. package/src/utils/generators.js +18 -20
  962. package/src/utils/generators.js.map +1 -1
  963. package/src/utils/git.d.ts +1 -1
  964. package/src/utils/git.js +19 -34
  965. package/src/utils/git.js.map +1 -1
  966. package/src/utils/iac-providers.js +5 -5
  967. package/src/utils/iac-providers.js.map +1 -1
  968. package/src/utils/iac.d.ts +1 -1
  969. package/src/utils/iac.js +12 -14
  970. package/src/utils/iac.js.map +1 -1
  971. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +125 -16
  972. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +28 -9
  973. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +106 -6
  974. package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
  975. package/src/utils/identity-constructs/identity-constructs.d.ts +2 -2
  976. package/src/utils/identity-constructs/identity-constructs.js +28 -28
  977. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  978. package/src/utils/init.d.ts +53 -0
  979. package/src/utils/init.js +252 -0
  980. package/src/utils/init.js.map +1 -0
  981. package/src/utils/install.d.ts +32 -0
  982. package/src/utils/install.js +56 -0
  983. package/src/utils/install.js.map +1 -0
  984. package/src/utils/js.d.ts +4 -0
  985. package/src/utils/js.js +27 -20
  986. package/src/utils/js.js.map +1 -1
  987. package/src/utils/mcp.d.ts +1 -1
  988. package/src/utils/mcp.js +34 -41
  989. package/src/utils/mcp.js.map +1 -1
  990. package/src/utils/metrics.d.ts +9 -3
  991. package/src/utils/metrics.js +61 -46
  992. package/src/utils/metrics.js.map +1 -1
  993. package/src/utils/mock-project-graph.js +8 -12
  994. package/src/utils/mock-project-graph.js.map +1 -1
  995. package/src/utils/module-format.d.ts +28 -0
  996. package/src/utils/module-format.js +28 -0
  997. package/src/utils/module-format.js.map +1 -0
  998. package/src/utils/names.d.ts +22 -0
  999. package/src/utils/names.js +44 -48
  1000. package/src/utils/names.js.map +1 -1
  1001. package/src/utils/npm-scope.d.ts +1 -1
  1002. package/src/utils/npm-scope.js +9 -17
  1003. package/src/utils/npm-scope.js.map +1 -1
  1004. package/src/utils/nx.d.ts +39 -4
  1005. package/src/utils/nx.js +169 -75
  1006. package/src/utils/nx.js.map +1 -1
  1007. package/src/utils/nxlv-python.d.ts +1 -1
  1008. package/src/utils/nxlv-python.js +27 -15
  1009. package/src/utils/nxlv-python.js.map +1 -1
  1010. package/src/utils/object.js +5 -11
  1011. package/src/utils/object.js.map +1 -1
  1012. package/src/utils/paths.d.ts +1 -1
  1013. package/src/utils/paths.js +11 -15
  1014. package/src/utils/paths.js.map +1 -1
  1015. package/src/utils/pkg-manager.js +4 -9
  1016. package/src/utils/pkg-manager.js.map +1 -1
  1017. package/src/utils/pnpm-workspace.d.ts +1 -1
  1018. package/src/utils/pnpm-workspace.js +22 -22
  1019. package/src/utils/pnpm-workspace.js.map +1 -1
  1020. package/src/utils/port.d.ts +29 -7
  1021. package/src/utils/port.js +67 -28
  1022. package/src/utils/port.js.map +1 -1
  1023. package/src/utils/py.d.ts +16 -3
  1024. package/src/utils/py.js +72 -47
  1025. package/src/utils/py.js.map +1 -1
  1026. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +72 -18
  1027. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +97 -88
  1028. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +127 -53
  1029. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +36 -48
  1030. package/src/utils/rdb-constructs/rdb-constructs.d.ts +16 -5
  1031. package/src/utils/rdb-constructs/rdb-constructs.js +38 -41
  1032. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  1033. package/src/utils/shared-constructs-constants.d.ts +1 -0
  1034. package/src/utils/shared-constructs-constants.js +16 -15
  1035. package/src/utils/shared-constructs-constants.js.map +1 -1
  1036. package/src/utils/shared-constructs.d.ts +2 -2
  1037. package/src/utils/shared-constructs.js +60 -67
  1038. package/src/utils/shared-constructs.js.map +1 -1
  1039. package/src/utils/shared-dynamodb-scripts.d.ts +11 -0
  1040. package/src/utils/shared-dynamodb-scripts.js +25 -0
  1041. package/src/utils/shared-dynamodb-scripts.js.map +1 -0
  1042. package/src/utils/shared-infra-config.d.ts +1 -1
  1043. package/src/utils/shared-infra-config.js +31 -30
  1044. package/src/utils/shared-infra-config.js.map +1 -1
  1045. package/src/utils/shared-infra-scripts.d.ts +11 -0
  1046. package/src/utils/shared-infra-scripts.js +42 -0
  1047. package/src/utils/shared-infra-scripts.js.map +1 -0
  1048. package/src/utils/shared-rdb-scripts.d.ts +16 -0
  1049. package/src/utils/shared-rdb-scripts.js +32 -0
  1050. package/src/utils/shared-rdb-scripts.js.map +1 -0
  1051. package/src/utils/shared-scripts.d.ts +2 -5
  1052. package/src/utils/shared-scripts.js +12 -38
  1053. package/src/utils/shared-scripts.js.map +1 -1
  1054. package/src/utils/shared-shadcn.d.ts +1 -1
  1055. package/src/utils/shared-shadcn.js +65 -71
  1056. package/src/utils/shared-shadcn.js.map +1 -1
  1057. package/src/utils/test.d.ts +15 -1
  1058. package/src/utils/test.js +41 -23
  1059. package/src/utils/test.js.map +1 -1
  1060. package/src/utils/toml.d.ts +1 -1
  1061. package/src/utils/toml.js +10 -14
  1062. package/src/utils/toml.js.map +1 -1
  1063. package/src/utils/versions.d.ts +150 -97
  1064. package/src/utils/versions.js +157 -115
  1065. package/src/utils/versions.js.map +1 -1
  1066. package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +2 -2
  1067. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +75 -7
  1068. package/src/utils/website-constructs/files/terraform/app/static-websites/__websiteNameKebabCase__/__websiteNameKebabCase__.tf.template +1 -1
  1069. package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +68 -19
  1070. package/src/utils/website-constructs/website-constructs.d.ts +2 -2
  1071. package/src/utils/website-constructs/website-constructs.js +38 -30
  1072. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  1073. package/bin/aws-nx-mcp.js +0 -17
  1074. package/bin/aws-nx-mcp.js.map +0 -1
  1075. package/sdk/connection.d.ts +0 -6
  1076. package/sdk/connection.js +0 -10
  1077. package/sdk/connection.js.map +0 -1
  1078. package/sdk/open-api.d.ts +0 -10
  1079. package/sdk/open-api.js +0 -15
  1080. package/sdk/open-api.js.map +0 -1
  1081. package/sdk/py.d.ts +0 -14
  1082. package/sdk/py.js +0 -18
  1083. package/sdk/py.js.map +0 -1
  1084. package/sdk/terraform.d.ts +0 -6
  1085. package/sdk/terraform.js +0 -11
  1086. package/sdk/terraform.js.map +0 -1
  1087. package/sdk/ts.d.ts +0 -29
  1088. package/sdk/ts.js +0 -47
  1089. package/sdk/ts.js.map +0 -1
  1090. package/sdk/utils/ast.js +0 -12
  1091. package/sdk/utils/ast.js.map +0 -1
  1092. package/sdk/utils/format.js +0 -10
  1093. package/sdk/utils/format.js.map +0 -1
  1094. package/sdk/utils/test.js +0 -10
  1095. package/sdk/utils/test.js.map +0 -1
  1096. package/src/connection/agent-serve-local.js +0 -48
  1097. package/src/connection/agent-serve-local.js.map +0 -1
  1098. package/src/connection/serve-local.d.ts +0 -15
  1099. package/src/connection/serve-local.js +0 -41
  1100. package/src/connection/serve-local.js.map +0 -1
  1101. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
  1102. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
  1103. package/src/py/agent/react-connection/serve-local.js +0 -30
  1104. package/src/py/agent/react-connection/serve-local.js.map +0 -1
  1105. package/src/py/agent/scripts/http/chat.ts.template +0 -38
  1106. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
  1107. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
  1108. package/src/ts/agent/react-connection/serve-local.d.ts +0 -13
  1109. package/src/ts/agent/react-connection/serve-local.js +0 -19
  1110. package/src/ts/agent/react-connection/serve-local.js.map +0 -1
  1111. package/src/ts/agent/scripts/http/chat.ts.template +0 -35
  1112. package/src/ts/dynamodb/files/scripts/pull-image.ts.template +0 -15
  1113. package/src/ts/dynamodb/files/scripts/start-container.ts.template +0 -81
  1114. package/src/ts/dynamodb/files/src/constants.ts.template +0 -9
  1115. package/src/ts/dynamodb/files/src/gsi.ts.template +0 -14
  1116. package/src/ts/lib/eslint.d.ts +0 -14
  1117. package/src/ts/lib/eslint.js +0 -90
  1118. package/src/ts/lib/eslint.js.map +0 -1
  1119. package/src/ts/lib/grit/eslint-dependency-checks-warn.grit +0 -1
  1120. package/src/ts/rdb/files/scripts/docker-pull.ts.template +0 -15
  1121. package/src/ts/rdb/files/scripts/docker-start.ts.template +0 -84
  1122. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
  1123. package/src/ts/rdb/files/src/constants.ts.template +0 -8
  1124. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
  1125. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
  1126. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
  1127. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
  1128. package/src/utils/files/common/scripts/src/infra-deploy.ts.template +0 -2
  1129. package/src/utils/files/common/scripts/src/infra-destroy.ts.template +0 -2
  1130. package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
  1131. /package/{bin → src/bin}/aws-nx-mcp.d.ts +0 -0
  1132. /package/src/utils/agent-connection/files/{py-core-runtime-config/with_session_id.py.template → py-core-strands/base/with_session_id_strands.py.template} +0 -0
  1133. /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
  1134. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
  1135. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
@@ -1,35 +1,6 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`tsSmithyApiGenerator > should configure git and eslint ignores for generated code > eslint.config.mjs 1`] = `
4
- "import baseConfig from '../../eslint.config.mjs';
5
-
6
- export default [
7
- ...baseConfig,
8
- {
9
- files: ['**/*.json'],
10
- rules: {
11
- '@nx/dependency-checks': [
12
- 'warn',
13
- {
14
- ignoredFiles: [
15
- '{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}',
16
- '{projectRoot}/vitest.config.{js,ts,mjs,mts}',
17
- ],
18
- },
19
- ],
20
- },
21
- languageOptions: {
22
- parser: await import('jsonc-eslint-parser'),
23
- },
24
- },
25
- {
26
- ignores: ['**/out-tsc', '**/generated'],
27
- },
28
- ];
29
- "
30
- `;
31
-
32
- exports[`tsSmithyApiGenerator > should configure git and eslint ignores for generated code > gitignore 1`] = `"src/generated"`;
3
+ exports[`tsSmithyApiGenerator > should configure git ignores for generated code > gitignore 1`] = `"src/generated"`;
33
4
 
34
5
  exports[`tsSmithyApiGenerator > should generate smithy ts api with Cognito auth > cognito-auth-infra.ts 1`] = `
35
6
  "import { Construct } from 'constructs';
@@ -156,6 +127,9 @@ export class TestApi<
156
127
  authorizer: new CognitoUserPoolsAuthorizer(scope, 'TestApiAuthorizer', {
157
128
  cognitoUserPools: [props.identity.userPool],
158
129
  }),
130
+ // Accept access tokens from both sign-in flows: 'openid' (Cognito hosted UI)
131
+ // and 'aws.cognito.signin.user.admin' (Cognito admin/SRP auth APIs).
132
+ authorizationScopes: ['openid', 'aws.cognito.signin.user.admin'],
159
133
  },
160
134
  deployOptions: {
161
135
  tracingEnabled: true,
@@ -429,11 +403,11 @@ terraform {
429
403
  required_providers {
430
404
  aws = {
431
405
  source = "hashicorp/aws"
432
- version = "~> 6.33"
406
+ version = "6.54.0"
433
407
  }
434
408
  random = {
435
409
  source = "hashicorp/random"
436
- version = "~> 3.1"
410
+ version = "3.9.0"
437
411
  }
438
412
  }
439
413
  }
@@ -503,8 +477,6 @@ data "aws_caller_identity" "current" {}
503
477
 
504
478
  # Resources
505
479
 
506
- # Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
507
-
508
480
  # REST API Gateway
509
481
  resource "aws_api_gateway_rest_api" "rest_api" {
510
482
  name = var.api_name
@@ -521,10 +493,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
521
493
  tags = var.tags
522
494
  }
523
495
 
524
- # Note: Deployment and stage are created in the consuming module (e.g., foo-api.tf)
525
- # after all methods and integrations are defined
526
-
527
- # Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
496
+ # Note: Deployment, stage and access logging are created in the consuming module
497
+ # (e.g., foo-api.tf) after all methods and integrations are defined
528
498
 
529
499
  # Gateway Response for CORS (4XX errors)
530
500
  resource "aws_api_gateway_gateway_response" "cors_4xx" {
@@ -682,9 +652,7 @@ output "waf_web_acl_arn" {
682
652
  value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
683
653
  }
684
654
 
685
- # Note: Stage and deployment outputs are provided by the consuming module
686
-
687
- # Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement"
655
+ # Note: Stage, deployment and access log outputs are provided by the consuming module"
688
656
  `;
689
657
 
690
658
  exports[`tsSmithyApiGenerator > should generate smithy ts api with Terraform provider and None auth > none-auth-terraform.tf 1`] = `
@@ -694,7 +662,7 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with Terraform pro
694
662
  required_providers {
695
663
  aws = {
696
664
  source = "hashicorp/aws"
697
- version = "~> 6.33"
665
+ version = "6.54.0"
698
666
  }
699
667
  }
700
668
  }
@@ -716,11 +684,47 @@ variable "additional_iam_policy_statements" {
716
684
  default = []
717
685
  }
718
686
 
687
+ variable "appconfig_application_id" {
688
+ 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."
689
+ type = string
690
+ default = null
691
+ }
692
+
693
+ variable "appconfig_application_arn" {
694
+ 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."
695
+ type = string
696
+ default = null
697
+ }
698
+
719
699
  variable "asset_bucket_name" {
720
700
  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."
721
701
  type = string
722
702
  }
723
703
 
704
+ # VPC Configuration (optional)
705
+ variable "enable_vpc" {
706
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
707
+ type = bool
708
+ default = false
709
+ }
710
+
711
+ variable "vpc_id" {
712
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
713
+ type = string
714
+ default = null
715
+
716
+ validation {
717
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
718
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
719
+ }
720
+ }
721
+
722
+ variable "subnet_ids" {
723
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
724
+ type = list(string)
725
+ default = null
726
+ }
727
+
724
728
  # CORS Configuration (passed to core module)
725
729
 
726
730
  variable "cors_allow_headers" {
@@ -783,6 +787,11 @@ resource "aws_s3_object" "lambda_zip" {
783
787
  }
784
788
 
785
789
  # Use the core REST API module
790
+ # Account-level CloudWatch role required for REST API access logging
791
+ module "account" {
792
+ source = "../../../core/api/api-gateway-account"
793
+ }
794
+
786
795
  module "rest_api" {
787
796
  source = "../../../core/api/rest-api"
788
797
 
@@ -812,9 +821,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
812
821
  depends_on = [aws_api_gateway_stage.api_stage]
813
822
  }
814
823
 
824
+ # Security group for the API Lambda function, used when deployed into a VPC
825
+ resource "aws_security_group" "api_lambda" {
826
+ count = var.enable_vpc ? 1 : 0
827
+
828
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
829
+ name_prefix = "test-api-lambda-"
830
+ description = "Security group for the TestApi API Lambda function"
831
+ vpc_id = var.vpc_id
832
+ tags = var.tags
833
+ }
834
+
835
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
836
+ count = var.enable_vpc ? 1 : 0
837
+
838
+ security_group_id = aws_security_group.api_lambda[0].id
839
+ cidr_ipv4 = "0.0.0.0/0"
840
+ from_port = 443
841
+ to_port = 443
842
+ ip_protocol = "tcp"
843
+ description = "Allow outbound HTTPS to AWS service endpoints"
844
+ }
845
+
815
846
  # Lambda function
816
847
  resource "aws_lambda_function" "api_lambda" {
817
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
848
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
818
849
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
819
850
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
820
851
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -836,13 +867,25 @@ resource "aws_lambda_function" "api_lambda" {
836
867
  mode = "Active"
837
868
  }
838
869
 
870
+ dynamic "vpc_config" {
871
+ for_each = var.enable_vpc ? [1] : []
872
+ content {
873
+ subnet_ids = var.subnet_ids
874
+ security_group_ids = [aws_security_group.api_lambda[0].id]
875
+ }
876
+ }
877
+
839
878
 
840
879
  environment {
841
880
  variables = merge({
842
- }, var.env)
881
+ }, var.appconfig_application_id != null ? {
882
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
883
+ } : {}, var.env)
843
884
  }
844
885
 
845
886
  tags = var.tags
887
+
888
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
846
889
  }
847
890
 
848
891
  # IAM role for Lambda execution
@@ -877,18 +920,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
877
920
  role = aws_iam_role.lambda_execution_role.name
878
921
  }
879
922
 
923
+ # Attach VPC access policy to Lambda role when deployed into a VPC
924
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
925
+ count = var.enable_vpc ? 1 : 0
926
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
927
+ role = aws_iam_role.lambda_execution_role.name
928
+ }
929
+
880
930
  # Additional IAM policies for Lambda (if provided)
881
931
  resource "aws_iam_role_policy" "lambda_additional_policies" {
882
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
932
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
883
933
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
884
934
  role = aws_iam_role.lambda_execution_role.id
885
935
 
886
936
  policy = jsonencode({
887
937
  Version = "2012-10-17"
888
- Statement = var.additional_iam_policy_statements
938
+ Statement = local.lambda_policy_statements
889
939
  })
890
940
  }
891
941
 
942
+ locals {
943
+ # Grant read access to the runtime-config AppConfig application when wired
944
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
945
+ {
946
+ Effect = "Allow"
947
+ Action = [
948
+ "appconfig:StartConfigurationSession",
949
+ "appconfig:GetLatestConfiguration"
950
+ ]
951
+ Resource = ["\${var.appconfig_application_arn}/*"]
952
+ }
953
+ ] : [], var.additional_iam_policy_statements)
954
+ }
955
+
892
956
  # CloudWatch Log Group for Lambda
893
957
  resource "aws_cloudwatch_log_group" "lambda_logs" {
894
958
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -1108,11 +1172,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
1108
1172
  ]
1109
1173
  }
1110
1174
 
1175
+ # KMS key for encrypting access logs at rest
1176
+ resource "aws_kms_key" "access_logs" {
1177
+ description = "TestApi API access log encryption"
1178
+ deletion_window_in_days = 7
1179
+ enable_key_rotation = true
1180
+
1181
+ policy = jsonencode({
1182
+ Version = "2012-10-17"
1183
+ Statement = [
1184
+ {
1185
+ Sid = "Enable IAM User Permissions"
1186
+ Effect = "Allow"
1187
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
1188
+ Action = "kms:*"
1189
+ Resource = "*"
1190
+ },
1191
+ {
1192
+ Sid = "Allow CloudWatch Logs"
1193
+ Effect = "Allow"
1194
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
1195
+ Action = [
1196
+ "kms:Encrypt",
1197
+ "kms:Decrypt",
1198
+ "kms:ReEncrypt*",
1199
+ "kms:GenerateDataKey*",
1200
+ "kms:DescribeKey"
1201
+ ]
1202
+ Resource = "*"
1203
+ Condition = {
1204
+ ArnEquals = {
1205
+ "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"
1206
+ }
1207
+ }
1208
+ }
1209
+ ]
1210
+ })
1211
+
1212
+ tags = var.tags
1213
+ }
1214
+
1215
+ resource "aws_kms_alias" "access_logs" {
1216
+ name = "alias/test-api-\${random_string.suffix.result}-access-logs"
1217
+ target_key_id = aws_kms_key.access_logs.key_id
1218
+ }
1219
+
1220
+ # Access logs for the API Gateway stage
1221
+ resource "aws_cloudwatch_log_group" "access_logs" {
1222
+ name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
1223
+ retention_in_days = 365
1224
+ kms_key_id = aws_kms_key.access_logs.arn
1225
+ tags = var.tags
1226
+ }
1227
+
1111
1228
  # API Gateway stage
1112
1229
  resource "aws_api_gateway_stage" "api_stage" {
1113
1230
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
1114
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
1115
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
1231
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
1116
1232
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
1117
1233
  #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
1118
1234
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -1120,9 +1236,39 @@ resource "aws_api_gateway_stage" "api_stage" {
1120
1236
  stage_name = "prod"
1121
1237
  xray_tracing_enabled = true
1122
1238
 
1239
+ access_log_settings {
1240
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
1241
+ format = jsonencode({
1242
+ requestId = "$context.requestId"
1243
+ ip = "$context.identity.sourceIp"
1244
+ caller = "$context.identity.caller"
1245
+ user = "$context.identity.user"
1246
+ requestTime = "$context.requestTime"
1247
+ httpMethod = "$context.httpMethod"
1248
+ resourcePath = "$context.resourcePath"
1249
+ status = "$context.status"
1250
+ protocol = "$context.protocol"
1251
+ responseLength = "$context.responseLength"
1252
+ })
1253
+ }
1254
+
1123
1255
  tags = var.tags
1124
1256
 
1125
- depends_on = [aws_api_gateway_deployment.api_deployment]
1257
+ # Ensure the account-level role is configured before the stage is created
1258
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
1259
+ }
1260
+
1261
+ # Default throttling applied to all resource paths and methods
1262
+ resource "aws_api_gateway_method_settings" "throttling" {
1263
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
1264
+ rest_api_id = module.rest_api.api_id
1265
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
1266
+ method_path = "*/*"
1267
+
1268
+ settings {
1269
+ throttling_rate_limit = 10000
1270
+ throttling_burst_limit = 5000
1271
+ }
1126
1272
  }
1127
1273
 
1128
1274
  # API Gateway Resource Policy
@@ -1261,6 +1407,11 @@ output "lambda_execution_role_name" {
1261
1407
  value = aws_iam_role.lambda_execution_role.name
1262
1408
  }
1263
1409
 
1410
+ output "security_group_id" {
1411
+ 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."
1412
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
1413
+ }
1414
+
1264
1415
  # Integration Outputs
1265
1416
  output "integration_id" {
1266
1417
  description = "ID of the Lambda integration"
@@ -1333,42 +1484,38 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with default optio
1333
1484
  },
1334
1485
  "compile": {
1335
1486
  "executor": "nx:run-commands",
1487
+ "dependsOn": ["copy-ssdk"],
1336
1488
  "outputs": ["{workspaceRoot}/dist/{projectRoot}/tsc"],
1337
1489
  "options": {
1338
1490
  "command": "tsc --build tsconfig.lib.json",
1339
1491
  "cwd": "{projectRoot}"
1340
- },
1341
- "dependsOn": ["copy-ssdk"]
1492
+ }
1342
1493
  },
1343
1494
  "lint": {
1344
- "executor": "@nx/eslint:lint",
1495
+ "executor": "nx:run-commands",
1345
1496
  "cache": true,
1346
- "inputs": ["eslint"],
1497
+ "inputs": ["biome"],
1498
+ "options": {
1499
+ "command": "biome lint {projectRoot}"
1500
+ },
1347
1501
  "configurations": {
1348
1502
  "fix": {
1349
- "fix": true
1503
+ "command": "biome check --write {projectRoot}"
1350
1504
  },
1351
1505
  "skip-lint": {
1352
- "force": true
1506
+ "command": "node -e \\"\\""
1353
1507
  }
1354
1508
  }
1355
1509
  },
1356
- "test": {
1357
- "executor": "@nx/vitest:test",
1358
- "outputs": ["{options.reportsDirectory}"],
1359
- "options": {
1360
- "reportsDirectory": "{workspaceRoot}/coverage/{projectRoot}"
1361
- }
1362
- },
1363
1510
  "bundle": {
1511
+ "executor": "nx:run-commands",
1512
+ "dependsOn": ["compile"],
1364
1513
  "cache": true,
1365
1514
  "outputs": ["{workspaceRoot}/dist/{projectRoot}/bundle"],
1366
- "executor": "nx:run-commands",
1367
1515
  "options": {
1368
1516
  "command": "rolldown -c rolldown.config.ts",
1369
1517
  "cwd": "{projectRoot}"
1370
- },
1371
- "dependsOn": ["compile"]
1518
+ }
1372
1519
  },
1373
1520
  "copy-ssdk": {
1374
1521
  "cache": true,
@@ -1391,31 +1538,31 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with default optio
1391
1538
  },
1392
1539
  "watch-copy-ssdk": {
1393
1540
  "executor": "nx:run-commands",
1541
+ "continuous": true,
1394
1542
  "options": {
1395
- "command": "nx watch --projects=@proj/test-api-model --includeDependentProjects -- nx run @proj/test-api:copy-ssdk"
1396
- },
1397
- "continuous": true
1543
+ "command": "nx watch --projects=@proj/test-api-model --includeDependencies -- nx run @proj/test-api:copy-ssdk"
1544
+ }
1398
1545
  },
1399
1546
  "serve": {
1400
1547
  "executor": "nx:run-commands",
1548
+ "dependsOn": ["copy-ssdk", "watch-copy-ssdk"],
1549
+ "continuous": true,
1401
1550
  "options": {
1402
1551
  "command": "tsx --watch src/local-server.ts",
1403
1552
  "cwd": "{projectRoot}"
1404
- },
1405
- "continuous": true,
1406
- "dependsOn": ["copy-ssdk", "watch-copy-ssdk"]
1553
+ }
1407
1554
  },
1408
- "serve-local": {
1555
+ "dev": {
1409
1556
  "executor": "nx:run-commands",
1557
+ "dependsOn": ["copy-ssdk", "watch-copy-ssdk"],
1558
+ "continuous": true,
1410
1559
  "options": {
1411
1560
  "command": "tsx --watch src/local-server.ts",
1412
1561
  "cwd": "{projectRoot}",
1413
1562
  "env": {
1414
- "SERVE_LOCAL": "true"
1563
+ "LOCAL_DEV": "true"
1415
1564
  }
1416
- },
1417
- "continuous": true,
1418
- "dependsOn": ["copy-ssdk", "watch-copy-ssdk"]
1565
+ }
1419
1566
  }
1420
1567
  }
1421
1568
  }
@@ -1708,11 +1855,11 @@ terraform {
1708
1855
  required_providers {
1709
1856
  aws = {
1710
1857
  source = "hashicorp/aws"
1711
- version = "~> 6.33"
1858
+ version = "6.54.0"
1712
1859
  }
1713
1860
  random = {
1714
1861
  source = "hashicorp/random"
1715
- version = "~> 3.1"
1862
+ version = "3.9.0"
1716
1863
  }
1717
1864
  }
1718
1865
  }
@@ -1782,8 +1929,6 @@ data "aws_caller_identity" "current" {}
1782
1929
 
1783
1930
  # Resources
1784
1931
 
1785
- # Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
1786
-
1787
1932
  # REST API Gateway
1788
1933
  resource "aws_api_gateway_rest_api" "rest_api" {
1789
1934
  name = var.api_name
@@ -1800,10 +1945,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
1800
1945
  tags = var.tags
1801
1946
  }
1802
1947
 
1803
- # Note: Deployment and stage are created in the consuming module (e.g., foo-api.tf)
1804
- # after all methods and integrations are defined
1805
-
1806
- # Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
1948
+ # Note: Deployment, stage and access logging are created in the consuming module
1949
+ # (e.g., foo-api.tf) after all methods and integrations are defined
1807
1950
 
1808
1951
  # Gateway Response for CORS (4XX errors)
1809
1952
  resource "aws_api_gateway_gateway_response" "cors_4xx" {
@@ -1961,16 +2104,14 @@ output "waf_web_acl_arn" {
1961
2104
  value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
1962
2105
  }
1963
2106
 
1964
- # Note: Stage and deployment outputs are provided by the consuming module
1965
-
1966
- # Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
2107
+ # Note: Stage, deployment and access log outputs are provided by the consuming module",
1967
2108
  "test-api.tf": "terraform {
1968
2109
  required_version = ">= 1.0"
1969
2110
 
1970
2111
  required_providers {
1971
2112
  aws = {
1972
2113
  source = "hashicorp/aws"
1973
- version = "~> 6.33"
2114
+ version = "6.54.0"
1974
2115
  }
1975
2116
  }
1976
2117
  }
@@ -2002,11 +2143,47 @@ variable "additional_iam_policy_statements" {
2002
2143
  default = []
2003
2144
  }
2004
2145
 
2146
+ variable "appconfig_application_id" {
2147
+ 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."
2148
+ type = string
2149
+ default = null
2150
+ }
2151
+
2152
+ variable "appconfig_application_arn" {
2153
+ 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."
2154
+ type = string
2155
+ default = null
2156
+ }
2157
+
2005
2158
  variable "asset_bucket_name" {
2006
2159
  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."
2007
2160
  type = string
2008
2161
  }
2009
2162
 
2163
+ # VPC Configuration (optional)
2164
+ variable "enable_vpc" {
2165
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
2166
+ type = bool
2167
+ default = false
2168
+ }
2169
+
2170
+ variable "vpc_id" {
2171
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
2172
+ type = string
2173
+ default = null
2174
+
2175
+ validation {
2176
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
2177
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
2178
+ }
2179
+ }
2180
+
2181
+ variable "subnet_ids" {
2182
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
2183
+ type = list(string)
2184
+ default = null
2185
+ }
2186
+
2010
2187
  # CORS Configuration (passed to core module)
2011
2188
 
2012
2189
  variable "cors_allow_headers" {
@@ -2069,6 +2246,11 @@ resource "aws_s3_object" "lambda_zip" {
2069
2246
  }
2070
2247
 
2071
2248
  # Use the core REST API module
2249
+ # Account-level CloudWatch role required for REST API access logging
2250
+ module "account" {
2251
+ source = "../../../core/api/api-gateway-account"
2252
+ }
2253
+
2072
2254
  module "rest_api" {
2073
2255
  source = "../../../core/api/rest-api"
2074
2256
 
@@ -2098,9 +2280,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
2098
2280
  depends_on = [aws_api_gateway_stage.api_stage]
2099
2281
  }
2100
2282
 
2283
+ # Security group for the API Lambda function, used when deployed into a VPC
2284
+ resource "aws_security_group" "api_lambda" {
2285
+ count = var.enable_vpc ? 1 : 0
2286
+
2287
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
2288
+ name_prefix = "test-api-lambda-"
2289
+ description = "Security group for the TestApi API Lambda function"
2290
+ vpc_id = var.vpc_id
2291
+ tags = var.tags
2292
+ }
2293
+
2294
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
2295
+ count = var.enable_vpc ? 1 : 0
2296
+
2297
+ security_group_id = aws_security_group.api_lambda[0].id
2298
+ cidr_ipv4 = "0.0.0.0/0"
2299
+ from_port = 443
2300
+ to_port = 443
2301
+ ip_protocol = "tcp"
2302
+ description = "Allow outbound HTTPS to AWS service endpoints"
2303
+ }
2304
+
2101
2305
  # Lambda function
2102
2306
  resource "aws_lambda_function" "api_lambda" {
2103
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
2307
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
2104
2308
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
2105
2309
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
2106
2310
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -2122,13 +2326,25 @@ resource "aws_lambda_function" "api_lambda" {
2122
2326
  mode = "Active"
2123
2327
  }
2124
2328
 
2329
+ dynamic "vpc_config" {
2330
+ for_each = var.enable_vpc ? [1] : []
2331
+ content {
2332
+ subnet_ids = var.subnet_ids
2333
+ security_group_ids = [aws_security_group.api_lambda[0].id]
2334
+ }
2335
+ }
2336
+
2125
2337
 
2126
2338
  environment {
2127
2339
  variables = merge({
2128
- }, var.env)
2340
+ }, var.appconfig_application_id != null ? {
2341
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
2342
+ } : {}, var.env)
2129
2343
  }
2130
2344
 
2131
2345
  tags = var.tags
2346
+
2347
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
2132
2348
  }
2133
2349
 
2134
2350
  # IAM role for Lambda execution
@@ -2163,18 +2379,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
2163
2379
  role = aws_iam_role.lambda_execution_role.name
2164
2380
  }
2165
2381
 
2382
+ # Attach VPC access policy to Lambda role when deployed into a VPC
2383
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
2384
+ count = var.enable_vpc ? 1 : 0
2385
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
2386
+ role = aws_iam_role.lambda_execution_role.name
2387
+ }
2388
+
2166
2389
  # Additional IAM policies for Lambda (if provided)
2167
2390
  resource "aws_iam_role_policy" "lambda_additional_policies" {
2168
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
2391
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
2169
2392
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
2170
2393
  role = aws_iam_role.lambda_execution_role.id
2171
2394
 
2172
2395
  policy = jsonencode({
2173
2396
  Version = "2012-10-17"
2174
- Statement = var.additional_iam_policy_statements
2397
+ Statement = local.lambda_policy_statements
2175
2398
  })
2176
2399
  }
2177
2400
 
2401
+ locals {
2402
+ # Grant read access to the runtime-config AppConfig application when wired
2403
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
2404
+ {
2405
+ Effect = "Allow"
2406
+ Action = [
2407
+ "appconfig:StartConfigurationSession",
2408
+ "appconfig:GetLatestConfiguration"
2409
+ ]
2410
+ Resource = ["\${var.appconfig_application_arn}/*"]
2411
+ }
2412
+ ] : [], var.additional_iam_policy_statements)
2413
+ }
2414
+
2178
2415
  # CloudWatch Log Group for Lambda
2179
2416
  resource "aws_cloudwatch_log_group" "lambda_logs" {
2180
2417
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -2223,6 +2460,9 @@ resource "aws_api_gateway_method" "proxy_method" {
2223
2460
 
2224
2461
  authorization = "COGNITO_USER_POOLS"
2225
2462
  authorizer_id = aws_api_gateway_authorizer.cognito_authorizer.id
2463
+ # Accept access tokens from both sign-in flows: 'openid' (Cognito hosted UI)
2464
+ # and 'aws.cognito.signin.user.admin' (Cognito admin/SRP auth APIs).
2465
+ authorization_scopes = ["openid", "aws.cognito.signin.user.admin"]
2226
2466
 
2227
2467
  request_parameters = {
2228
2468
  "method.request.path.proxy" = true
@@ -2309,11 +2549,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
2309
2549
  ]
2310
2550
  }
2311
2551
 
2552
+ # KMS key for encrypting access logs at rest
2553
+ resource "aws_kms_key" "access_logs" {
2554
+ description = "TestApi API access log encryption"
2555
+ deletion_window_in_days = 7
2556
+ enable_key_rotation = true
2557
+
2558
+ policy = jsonencode({
2559
+ Version = "2012-10-17"
2560
+ Statement = [
2561
+ {
2562
+ Sid = "Enable IAM User Permissions"
2563
+ Effect = "Allow"
2564
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
2565
+ Action = "kms:*"
2566
+ Resource = "*"
2567
+ },
2568
+ {
2569
+ Sid = "Allow CloudWatch Logs"
2570
+ Effect = "Allow"
2571
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
2572
+ Action = [
2573
+ "kms:Encrypt",
2574
+ "kms:Decrypt",
2575
+ "kms:ReEncrypt*",
2576
+ "kms:GenerateDataKey*",
2577
+ "kms:DescribeKey"
2578
+ ]
2579
+ Resource = "*"
2580
+ Condition = {
2581
+ ArnEquals = {
2582
+ "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"
2583
+ }
2584
+ }
2585
+ }
2586
+ ]
2587
+ })
2588
+
2589
+ tags = var.tags
2590
+ }
2591
+
2592
+ resource "aws_kms_alias" "access_logs" {
2593
+ name = "alias/test-api-\${random_string.suffix.result}-access-logs"
2594
+ target_key_id = aws_kms_key.access_logs.key_id
2595
+ }
2596
+
2597
+ # Access logs for the API Gateway stage
2598
+ resource "aws_cloudwatch_log_group" "access_logs" {
2599
+ name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
2600
+ retention_in_days = 365
2601
+ kms_key_id = aws_kms_key.access_logs.arn
2602
+ tags = var.tags
2603
+ }
2604
+
2312
2605
  # API Gateway stage
2313
2606
  resource "aws_api_gateway_stage" "api_stage" {
2314
2607
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
2315
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
2316
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
2608
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
2317
2609
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
2318
2610
  #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
2319
2611
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -2321,9 +2613,39 @@ resource "aws_api_gateway_stage" "api_stage" {
2321
2613
  stage_name = "prod"
2322
2614
  xray_tracing_enabled = true
2323
2615
 
2616
+ access_log_settings {
2617
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
2618
+ format = jsonencode({
2619
+ requestId = "$context.requestId"
2620
+ ip = "$context.identity.sourceIp"
2621
+ caller = "$context.identity.caller"
2622
+ user = "$context.identity.user"
2623
+ requestTime = "$context.requestTime"
2624
+ httpMethod = "$context.httpMethod"
2625
+ resourcePath = "$context.resourcePath"
2626
+ status = "$context.status"
2627
+ protocol = "$context.protocol"
2628
+ responseLength = "$context.responseLength"
2629
+ })
2630
+ }
2631
+
2324
2632
  tags = var.tags
2325
2633
 
2326
- depends_on = [aws_api_gateway_deployment.api_deployment]
2634
+ # Ensure the account-level role is configured before the stage is created
2635
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
2636
+ }
2637
+
2638
+ # Default throttling applied to all resource paths and methods
2639
+ resource "aws_api_gateway_method_settings" "throttling" {
2640
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
2641
+ rest_api_id = module.rest_api.api_id
2642
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
2643
+ method_path = "*/*"
2644
+
2645
+ settings {
2646
+ throttling_rate_limit = 10000
2647
+ throttling_burst_limit = 5000
2648
+ }
2327
2649
  }
2328
2650
 
2329
2651
  # API Gateway Resource Policy
@@ -2462,6 +2784,11 @@ output "lambda_execution_role_name" {
2462
2784
  value = aws_iam_role.lambda_execution_role.name
2463
2785
  }
2464
2786
 
2787
+ output "security_group_id" {
2788
+ 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."
2789
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
2790
+ }
2791
+
2465
2792
  # Integration Outputs
2466
2793
  output "integration_id" {
2467
2794
  description = "ID of the Lambda integration"
@@ -2503,11 +2830,11 @@ terraform {
2503
2830
  required_providers {
2504
2831
  aws = {
2505
2832
  source = "hashicorp/aws"
2506
- version = "~> 6.33"
2833
+ version = "6.54.0"
2507
2834
  }
2508
2835
  random = {
2509
2836
  source = "hashicorp/random"
2510
- version = "~> 3.1"
2837
+ version = "3.9.0"
2511
2838
  }
2512
2839
  }
2513
2840
  }
@@ -2577,8 +2904,6 @@ data "aws_caller_identity" "current" {}
2577
2904
 
2578
2905
  # Resources
2579
2906
 
2580
- # Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
2581
-
2582
2907
  # REST API Gateway
2583
2908
  resource "aws_api_gateway_rest_api" "rest_api" {
2584
2909
  name = var.api_name
@@ -2595,10 +2920,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
2595
2920
  tags = var.tags
2596
2921
  }
2597
2922
 
2598
- # Note: Deployment and stage are created in the consuming module (e.g., foo-api.tf)
2599
- # after all methods and integrations are defined
2600
-
2601
- # Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
2923
+ # Note: Deployment, stage and access logging are created in the consuming module
2924
+ # (e.g., foo-api.tf) after all methods and integrations are defined
2602
2925
 
2603
2926
  # Gateway Response for CORS (4XX errors)
2604
2927
  resource "aws_api_gateway_gateway_response" "cors_4xx" {
@@ -2756,16 +3079,14 @@ output "waf_web_acl_arn" {
2756
3079
  value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
2757
3080
  }
2758
3081
 
2759
- # Note: Stage and deployment outputs are provided by the consuming module
2760
-
2761
- # Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
3082
+ # Note: Stage, deployment and access log outputs are provided by the consuming module",
2762
3083
  "test-api.tf": "terraform {
2763
3084
  required_version = ">= 1.0"
2764
3085
 
2765
3086
  required_providers {
2766
3087
  aws = {
2767
3088
  source = "hashicorp/aws"
2768
- version = "~> 6.33"
3089
+ version = "6.54.0"
2769
3090
  }
2770
3091
  }
2771
3092
  }
@@ -2787,11 +3108,47 @@ variable "additional_iam_policy_statements" {
2787
3108
  default = []
2788
3109
  }
2789
3110
 
3111
+ variable "appconfig_application_id" {
3112
+ 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."
3113
+ type = string
3114
+ default = null
3115
+ }
3116
+
3117
+ variable "appconfig_application_arn" {
3118
+ 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."
3119
+ type = string
3120
+ default = null
3121
+ }
3122
+
2790
3123
  variable "asset_bucket_name" {
2791
3124
  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."
2792
3125
  type = string
2793
3126
  }
2794
3127
 
3128
+ # VPC Configuration (optional)
3129
+ variable "enable_vpc" {
3130
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
3131
+ type = bool
3132
+ default = false
3133
+ }
3134
+
3135
+ variable "vpc_id" {
3136
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
3137
+ type = string
3138
+ default = null
3139
+
3140
+ validation {
3141
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
3142
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
3143
+ }
3144
+ }
3145
+
3146
+ variable "subnet_ids" {
3147
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
3148
+ type = list(string)
3149
+ default = null
3150
+ }
3151
+
2795
3152
  # CORS Configuration (passed to core module)
2796
3153
 
2797
3154
  variable "cors_allow_headers" {
@@ -2854,6 +3211,11 @@ resource "aws_s3_object" "lambda_zip" {
2854
3211
  }
2855
3212
 
2856
3213
  # Use the core REST API module
3214
+ # Account-level CloudWatch role required for REST API access logging
3215
+ module "account" {
3216
+ source = "../../../core/api/api-gateway-account"
3217
+ }
3218
+
2857
3219
  module "rest_api" {
2858
3220
  source = "../../../core/api/rest-api"
2859
3221
 
@@ -2883,9 +3245,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
2883
3245
  depends_on = [aws_api_gateway_stage.api_stage]
2884
3246
  }
2885
3247
 
3248
+ # Security group for the API Lambda function, used when deployed into a VPC
3249
+ resource "aws_security_group" "api_lambda" {
3250
+ count = var.enable_vpc ? 1 : 0
3251
+
3252
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
3253
+ name_prefix = "test-api-lambda-"
3254
+ description = "Security group for the TestApi API Lambda function"
3255
+ vpc_id = var.vpc_id
3256
+ tags = var.tags
3257
+ }
3258
+
3259
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
3260
+ count = var.enable_vpc ? 1 : 0
3261
+
3262
+ security_group_id = aws_security_group.api_lambda[0].id
3263
+ cidr_ipv4 = "0.0.0.0/0"
3264
+ from_port = 443
3265
+ to_port = 443
3266
+ ip_protocol = "tcp"
3267
+ description = "Allow outbound HTTPS to AWS service endpoints"
3268
+ }
3269
+
2886
3270
  # Lambda function
2887
3271
  resource "aws_lambda_function" "api_lambda" {
2888
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
3272
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
2889
3273
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
2890
3274
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
2891
3275
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -2907,13 +3291,25 @@ resource "aws_lambda_function" "api_lambda" {
2907
3291
  mode = "Active"
2908
3292
  }
2909
3293
 
3294
+ dynamic "vpc_config" {
3295
+ for_each = var.enable_vpc ? [1] : []
3296
+ content {
3297
+ subnet_ids = var.subnet_ids
3298
+ security_group_ids = [aws_security_group.api_lambda[0].id]
3299
+ }
3300
+ }
3301
+
2910
3302
 
2911
3303
  environment {
2912
3304
  variables = merge({
2913
- }, var.env)
3305
+ }, var.appconfig_application_id != null ? {
3306
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
3307
+ } : {}, var.env)
2914
3308
  }
2915
3309
 
2916
3310
  tags = var.tags
3311
+
3312
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
2917
3313
  }
2918
3314
 
2919
3315
  # IAM role for Lambda execution
@@ -2948,18 +3344,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
2948
3344
  role = aws_iam_role.lambda_execution_role.name
2949
3345
  }
2950
3346
 
3347
+ # Attach VPC access policy to Lambda role when deployed into a VPC
3348
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
3349
+ count = var.enable_vpc ? 1 : 0
3350
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
3351
+ role = aws_iam_role.lambda_execution_role.name
3352
+ }
3353
+
2951
3354
  # Additional IAM policies for Lambda (if provided)
2952
3355
  resource "aws_iam_role_policy" "lambda_additional_policies" {
2953
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
3356
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
2954
3357
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
2955
3358
  role = aws_iam_role.lambda_execution_role.id
2956
3359
 
2957
3360
  policy = jsonencode({
2958
3361
  Version = "2012-10-17"
2959
- Statement = var.additional_iam_policy_statements
3362
+ Statement = local.lambda_policy_statements
2960
3363
  })
2961
3364
  }
2962
3365
 
3366
+ locals {
3367
+ # Grant read access to the runtime-config AppConfig application when wired
3368
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
3369
+ {
3370
+ Effect = "Allow"
3371
+ Action = [
3372
+ "appconfig:StartConfigurationSession",
3373
+ "appconfig:GetLatestConfiguration"
3374
+ ]
3375
+ Resource = ["\${var.appconfig_application_arn}/*"]
3376
+ }
3377
+ ] : [], var.additional_iam_policy_statements)
3378
+ }
3379
+
2963
3380
  # CloudWatch Log Group for Lambda
2964
3381
  resource "aws_cloudwatch_log_group" "lambda_logs" {
2965
3382
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -3085,11 +3502,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
3085
3502
  ]
3086
3503
  }
3087
3504
 
3505
+ # KMS key for encrypting access logs at rest
3506
+ resource "aws_kms_key" "access_logs" {
3507
+ description = "TestApi API access log encryption"
3508
+ deletion_window_in_days = 7
3509
+ enable_key_rotation = true
3510
+
3511
+ policy = jsonencode({
3512
+ Version = "2012-10-17"
3513
+ Statement = [
3514
+ {
3515
+ Sid = "Enable IAM User Permissions"
3516
+ Effect = "Allow"
3517
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
3518
+ Action = "kms:*"
3519
+ Resource = "*"
3520
+ },
3521
+ {
3522
+ Sid = "Allow CloudWatch Logs"
3523
+ Effect = "Allow"
3524
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
3525
+ Action = [
3526
+ "kms:Encrypt",
3527
+ "kms:Decrypt",
3528
+ "kms:ReEncrypt*",
3529
+ "kms:GenerateDataKey*",
3530
+ "kms:DescribeKey"
3531
+ ]
3532
+ Resource = "*"
3533
+ Condition = {
3534
+ ArnEquals = {
3535
+ "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"
3536
+ }
3537
+ }
3538
+ }
3539
+ ]
3540
+ })
3541
+
3542
+ tags = var.tags
3543
+ }
3544
+
3545
+ resource "aws_kms_alias" "access_logs" {
3546
+ name = "alias/test-api-\${random_string.suffix.result}-access-logs"
3547
+ target_key_id = aws_kms_key.access_logs.key_id
3548
+ }
3549
+
3550
+ # Access logs for the API Gateway stage
3551
+ resource "aws_cloudwatch_log_group" "access_logs" {
3552
+ name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
3553
+ retention_in_days = 365
3554
+ kms_key_id = aws_kms_key.access_logs.arn
3555
+ tags = var.tags
3556
+ }
3557
+
3088
3558
  # API Gateway stage
3089
3559
  resource "aws_api_gateway_stage" "api_stage" {
3090
3560
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
3091
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
3092
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
3561
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
3093
3562
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
3094
3563
  #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
3095
3564
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -3097,9 +3566,39 @@ resource "aws_api_gateway_stage" "api_stage" {
3097
3566
  stage_name = "prod"
3098
3567
  xray_tracing_enabled = true
3099
3568
 
3569
+ access_log_settings {
3570
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
3571
+ format = jsonencode({
3572
+ requestId = "$context.requestId"
3573
+ ip = "$context.identity.sourceIp"
3574
+ caller = "$context.identity.caller"
3575
+ user = "$context.identity.user"
3576
+ requestTime = "$context.requestTime"
3577
+ httpMethod = "$context.httpMethod"
3578
+ resourcePath = "$context.resourcePath"
3579
+ status = "$context.status"
3580
+ protocol = "$context.protocol"
3581
+ responseLength = "$context.responseLength"
3582
+ })
3583
+ }
3584
+
3100
3585
  tags = var.tags
3101
3586
 
3102
- depends_on = [aws_api_gateway_deployment.api_deployment]
3587
+ # Ensure the account-level role is configured before the stage is created
3588
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
3589
+ }
3590
+
3591
+ # Default throttling applied to all resource paths and methods
3592
+ resource "aws_api_gateway_method_settings" "throttling" {
3593
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
3594
+ rest_api_id = module.rest_api.api_id
3595
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
3596
+ method_path = "*/*"
3597
+
3598
+ settings {
3599
+ throttling_rate_limit = 10000
3600
+ throttling_burst_limit = 5000
3601
+ }
3103
3602
  }
3104
3603
 
3105
3604
  # API Gateway Resource Policy
@@ -3249,6 +3748,11 @@ output "lambda_execution_role_name" {
3249
3748
  value = aws_iam_role.lambda_execution_role.name
3250
3749
  }
3251
3750
 
3751
+ output "security_group_id" {
3752
+ 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."
3753
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
3754
+ }
3755
+
3252
3756
  # Integration Outputs
3253
3757
  output "integration_id" {
3254
3758
  description = "ID of the Lambda integration"
@@ -3286,7 +3790,7 @@ exports[`tsSmithyApiGenerator > terraform iac > should generate terraform with c
3286
3790
  required_providers {
3287
3791
  aws = {
3288
3792
  source = "hashicorp/aws"
3289
- version = "~> 6.33"
3793
+ version = "6.54.0"
3290
3794
  }
3291
3795
  }
3292
3796
  }
@@ -3308,11 +3812,47 @@ variable "additional_iam_policy_statements" {
3308
3812
  default = []
3309
3813
  }
3310
3814
 
3815
+ variable "appconfig_application_id" {
3816
+ 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."
3817
+ type = string
3818
+ default = null
3819
+ }
3820
+
3821
+ variable "appconfig_application_arn" {
3822
+ 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."
3823
+ type = string
3824
+ default = null
3825
+ }
3826
+
3311
3827
  variable "asset_bucket_name" {
3312
3828
  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."
3313
3829
  type = string
3314
3830
  }
3315
3831
 
3832
+ # VPC Configuration (optional)
3833
+ variable "enable_vpc" {
3834
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
3835
+ type = bool
3836
+ default = false
3837
+ }
3838
+
3839
+ variable "vpc_id" {
3840
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
3841
+ type = string
3842
+ default = null
3843
+
3844
+ validation {
3845
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
3846
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
3847
+ }
3848
+ }
3849
+
3850
+ variable "subnet_ids" {
3851
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
3852
+ type = list(string)
3853
+ default = null
3854
+ }
3855
+
3316
3856
  # CORS Configuration (passed to core module)
3317
3857
 
3318
3858
  variable "cors_allow_headers" {
@@ -3375,6 +3915,11 @@ resource "aws_s3_object" "lambda_zip" {
3375
3915
  }
3376
3916
 
3377
3917
  # Use the core REST API module
3918
+ # Account-level CloudWatch role required for REST API access logging
3919
+ module "account" {
3920
+ source = "../../../core/api/api-gateway-account"
3921
+ }
3922
+
3378
3923
  module "rest_api" {
3379
3924
  source = "../../../core/api/rest-api"
3380
3925
 
@@ -3404,9 +3949,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
3404
3949
  depends_on = [aws_api_gateway_stage.api_stage]
3405
3950
  }
3406
3951
 
3952
+ # Security group for the API Lambda function, used when deployed into a VPC
3953
+ resource "aws_security_group" "api_lambda" {
3954
+ count = var.enable_vpc ? 1 : 0
3955
+
3956
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
3957
+ name_prefix = "custom-api-lambda-"
3958
+ description = "Security group for the CustomApi API Lambda function"
3959
+ vpc_id = var.vpc_id
3960
+ tags = var.tags
3961
+ }
3962
+
3963
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
3964
+ count = var.enable_vpc ? 1 : 0
3965
+
3966
+ security_group_id = aws_security_group.api_lambda[0].id
3967
+ cidr_ipv4 = "0.0.0.0/0"
3968
+ from_port = 443
3969
+ to_port = 443
3970
+ ip_protocol = "tcp"
3971
+ description = "Allow outbound HTTPS to AWS service endpoints"
3972
+ }
3973
+
3407
3974
  # Lambda function
3408
3975
  resource "aws_lambda_function" "api_lambda" {
3409
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
3976
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
3410
3977
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
3411
3978
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
3412
3979
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -3428,13 +3995,25 @@ resource "aws_lambda_function" "api_lambda" {
3428
3995
  mode = "Active"
3429
3996
  }
3430
3997
 
3998
+ dynamic "vpc_config" {
3999
+ for_each = var.enable_vpc ? [1] : []
4000
+ content {
4001
+ subnet_ids = var.subnet_ids
4002
+ security_group_ids = [aws_security_group.api_lambda[0].id]
4003
+ }
4004
+ }
4005
+
3431
4006
 
3432
4007
  environment {
3433
4008
  variables = merge({
3434
- }, var.env)
4009
+ }, var.appconfig_application_id != null ? {
4010
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
4011
+ } : {}, var.env)
3435
4012
  }
3436
4013
 
3437
4014
  tags = var.tags
4015
+
4016
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
3438
4017
  }
3439
4018
 
3440
4019
  # IAM role for Lambda execution
@@ -3469,18 +4048,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
3469
4048
  role = aws_iam_role.lambda_execution_role.name
3470
4049
  }
3471
4050
 
4051
+ # Attach VPC access policy to Lambda role when deployed into a VPC
4052
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
4053
+ count = var.enable_vpc ? 1 : 0
4054
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
4055
+ role = aws_iam_role.lambda_execution_role.name
4056
+ }
4057
+
3472
4058
  # Additional IAM policies for Lambda (if provided)
3473
4059
  resource "aws_iam_role_policy" "lambda_additional_policies" {
3474
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
4060
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
3475
4061
  name = "CustomApiHandler-additional-policies-\${random_string.suffix.result}"
3476
4062
  role = aws_iam_role.lambda_execution_role.id
3477
4063
 
3478
4064
  policy = jsonencode({
3479
4065
  Version = "2012-10-17"
3480
- Statement = var.additional_iam_policy_statements
4066
+ Statement = local.lambda_policy_statements
3481
4067
  })
3482
4068
  }
3483
4069
 
4070
+ locals {
4071
+ # Grant read access to the runtime-config AppConfig application when wired
4072
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
4073
+ {
4074
+ Effect = "Allow"
4075
+ Action = [
4076
+ "appconfig:StartConfigurationSession",
4077
+ "appconfig:GetLatestConfiguration"
4078
+ ]
4079
+ Resource = ["\${var.appconfig_application_arn}/*"]
4080
+ }
4081
+ ] : [], var.additional_iam_policy_statements)
4082
+ }
4083
+
3484
4084
  # CloudWatch Log Group for Lambda
3485
4085
  resource "aws_cloudwatch_log_group" "lambda_logs" {
3486
4086
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -3700,11 +4300,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
3700
4300
  ]
3701
4301
  }
3702
4302
 
4303
+ # KMS key for encrypting access logs at rest
4304
+ resource "aws_kms_key" "access_logs" {
4305
+ description = "CustomApi API access log encryption"
4306
+ deletion_window_in_days = 7
4307
+ enable_key_rotation = true
4308
+
4309
+ policy = jsonencode({
4310
+ Version = "2012-10-17"
4311
+ Statement = [
4312
+ {
4313
+ Sid = "Enable IAM User Permissions"
4314
+ Effect = "Allow"
4315
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
4316
+ Action = "kms:*"
4317
+ Resource = "*"
4318
+ },
4319
+ {
4320
+ Sid = "Allow CloudWatch Logs"
4321
+ Effect = "Allow"
4322
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
4323
+ Action = [
4324
+ "kms:Encrypt",
4325
+ "kms:Decrypt",
4326
+ "kms:ReEncrypt*",
4327
+ "kms:GenerateDataKey*",
4328
+ "kms:DescribeKey"
4329
+ ]
4330
+ Resource = "*"
4331
+ Condition = {
4332
+ ArnEquals = {
4333
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:/aws/apigateway/custom-api-\${random_string.suffix.result}/access"
4334
+ }
4335
+ }
4336
+ }
4337
+ ]
4338
+ })
4339
+
4340
+ tags = var.tags
4341
+ }
4342
+
4343
+ resource "aws_kms_alias" "access_logs" {
4344
+ name = "alias/custom-api-\${random_string.suffix.result}-access-logs"
4345
+ target_key_id = aws_kms_key.access_logs.key_id
4346
+ }
4347
+
4348
+ # Access logs for the API Gateway stage
4349
+ resource "aws_cloudwatch_log_group" "access_logs" {
4350
+ name = "/aws/apigateway/custom-api-\${random_string.suffix.result}/access"
4351
+ retention_in_days = 365
4352
+ kms_key_id = aws_kms_key.access_logs.arn
4353
+ tags = var.tags
4354
+ }
4355
+
3703
4356
  # API Gateway stage
3704
4357
  resource "aws_api_gateway_stage" "api_stage" {
3705
4358
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
3706
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
3707
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
4359
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
3708
4360
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
3709
4361
  #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
3710
4362
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -3712,9 +4364,39 @@ resource "aws_api_gateway_stage" "api_stage" {
3712
4364
  stage_name = "prod"
3713
4365
  xray_tracing_enabled = true
3714
4366
 
4367
+ access_log_settings {
4368
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
4369
+ format = jsonencode({
4370
+ requestId = "$context.requestId"
4371
+ ip = "$context.identity.sourceIp"
4372
+ caller = "$context.identity.caller"
4373
+ user = "$context.identity.user"
4374
+ requestTime = "$context.requestTime"
4375
+ httpMethod = "$context.httpMethod"
4376
+ resourcePath = "$context.resourcePath"
4377
+ status = "$context.status"
4378
+ protocol = "$context.protocol"
4379
+ responseLength = "$context.responseLength"
4380
+ })
4381
+ }
4382
+
3715
4383
  tags = var.tags
3716
4384
 
3717
- depends_on = [aws_api_gateway_deployment.api_deployment]
4385
+ # Ensure the account-level role is configured before the stage is created
4386
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
4387
+ }
4388
+
4389
+ # Default throttling applied to all resource paths and methods
4390
+ resource "aws_api_gateway_method_settings" "throttling" {
4391
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
4392
+ rest_api_id = module.rest_api.api_id
4393
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
4394
+ method_path = "*/*"
4395
+
4396
+ settings {
4397
+ throttling_rate_limit = 10000
4398
+ throttling_burst_limit = 5000
4399
+ }
3718
4400
  }
3719
4401
 
3720
4402
  # API Gateway Resource Policy
@@ -3853,6 +4535,11 @@ output "lambda_execution_role_name" {
3853
4535
  value = aws_iam_role.lambda_execution_role.name
3854
4536
  }
3855
4537
 
4538
+ output "security_group_id" {
4539
+ 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."
4540
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
4541
+ }
4542
+
3856
4543
  # Integration Outputs
3857
4544
  output "integration_id" {
3858
4545
  description = "ID of the Lambda integration"