@aws/nx-plugin 1.0.0-rc.3 → 1.0.0-rc.31

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 (1017) hide show
  1. package/LICENSE-THIRD-PARTY +6746 -6133
  2. package/README.md +7 -7
  3. package/executors.json +9 -0
  4. package/generators.json +100 -1
  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 +158 -177
  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 +98 -0
  52. package/src/connection/supported-connections.js +138 -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 +51 -81
  57. package/src/infra/app/generator.d.ts +3 -3
  58. package/src/infra/app/generator.js +141 -123
  59. package/src/infra/app/generator.js.map +1 -1
  60. package/src/infra/app/schema.d.js +6 -0
  61. package/src/infra/app/schema.d.js.map +1 -0
  62. package/src/infra/app/schema.d.ts +1 -1
  63. package/src/infra/app/schema.json +5 -0
  64. package/src/license/__snapshots__/config.spec.ts.snap +23 -0
  65. package/src/license/config-types.d.ts +18 -1
  66. package/src/license/config-types.js +8 -2
  67. package/src/license/config-types.js.map +1 -1
  68. package/src/license/config.d.ts +65 -7
  69. package/src/license/config.js +442 -109
  70. package/src/license/config.js.map +1 -1
  71. package/src/license/dependency-check/check.d.ts +16 -0
  72. package/src/license/dependency-check/check.js +116 -0
  73. package/src/license/dependency-check/check.js.map +1 -0
  74. package/src/license/dependency-check/collectors/collector.d.ts +21 -0
  75. package/src/license/dependency-check/collectors/collector.js +46 -0
  76. package/src/license/dependency-check/collectors/collector.js.map +1 -0
  77. package/src/license/dependency-check/collectors/npm-collector.d.ts +10 -0
  78. package/src/license/dependency-check/collectors/npm-collector.js +68 -0
  79. package/src/license/dependency-check/collectors/npm-collector.js.map +1 -0
  80. package/src/license/dependency-check/collectors/python-collector.d.ts +23 -0
  81. package/src/license/dependency-check/collectors/python-collector.js +114 -0
  82. package/src/license/dependency-check/collectors/python-collector.js.map +1 -0
  83. package/src/license/dependency-check/evaluator.d.ts +9 -0
  84. package/src/license/dependency-check/evaluator.js +94 -0
  85. package/src/license/dependency-check/evaluator.js.map +1 -0
  86. package/src/license/dependency-check/executor-schema.json +6 -0
  87. package/src/license/dependency-check/executor.d.ts +9 -0
  88. package/src/license/dependency-check/executor.js +51 -0
  89. package/src/license/dependency-check/executor.js.map +1 -0
  90. package/src/license/dependency-check/pre-approved.d.ts +6 -0
  91. package/src/license/dependency-check/pre-approved.js +1893 -0
  92. package/src/license/dependency-check/pre-approved.js.map +1 -0
  93. package/src/license/dependency-check/types.d.ts +45 -0
  94. package/src/license/dependency-check/types.js +6 -0
  95. package/src/license/dependency-check/types.js.map +1 -0
  96. package/src/license/generator.d.ts +3 -3
  97. package/src/license/generator.js +127 -30
  98. package/src/license/generator.js.map +1 -1
  99. package/src/license/index.d.ts +8 -0
  100. package/src/license/index.js +7 -0
  101. package/src/license/index.js.map +1 -0
  102. package/src/license/known-exceptions.d.ts +7 -0
  103. package/src/license/known-exceptions.js +39 -0
  104. package/src/license/known-exceptions.js.map +1 -0
  105. package/src/license/schema.d.js +6 -0
  106. package/src/license/schema.d.js.map +1 -0
  107. package/src/license/schema.d.ts +7 -0
  108. package/src/license/schema.json +11 -0
  109. package/src/license/sync/generator.d.ts +2 -2
  110. package/src/license/sync/generator.js +100 -125
  111. package/src/license/sync/generator.js.map +1 -1
  112. package/src/license/sync/project-file-sync.d.ts +3 -3
  113. package/src/license/sync/project-file-sync.js +28 -35
  114. package/src/license/sync/project-file-sync.js.map +1 -1
  115. package/src/mcp-server/generator-info.d.ts +5 -1
  116. package/src/mcp-server/generator-info.js +130 -160
  117. package/src/mcp-server/generator-info.js.map +1 -1
  118. package/src/mcp-server/guide-pipeline.d.ts +1 -1
  119. package/src/mcp-server/guide-pipeline.js +184 -206
  120. package/src/mcp-server/guide-pipeline.js.map +1 -1
  121. package/src/mcp-server/guide-render.js +10 -25
  122. package/src/mcp-server/guide-render.js.map +1 -1
  123. package/src/mcp-server/index.js +6 -10
  124. package/src/mcp-server/index.js.map +1 -1
  125. package/src/mcp-server/mdx-ast.js +42 -56
  126. package/src/mcp-server/mdx-ast.js.map +1 -1
  127. package/src/mcp-server/option-filter.js +33 -47
  128. package/src/mcp-server/option-filter.js.map +1 -1
  129. package/src/mcp-server/schema-registry.d.ts +9 -3
  130. package/src/mcp-server/schema-registry.js +41 -38
  131. package/src/mcp-server/schema-registry.js.map +1 -1
  132. package/src/mcp-server/schema.js +9 -7
  133. package/src/mcp-server/schema.js.map +1 -1
  134. package/src/mcp-server/server.js +20 -24
  135. package/src/mcp-server/server.js.map +1 -1
  136. package/src/mcp-server/tools/create-workspace-command.d.ts +1 -1
  137. package/src/mcp-server/tools/create-workspace-command.js +23 -24
  138. package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
  139. package/src/mcp-server/tools/general-guidance.d.ts +2 -2
  140. package/src/mcp-server/tools/general-guidance.js +46 -25
  141. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  142. package/src/mcp-server/tools/generator-guide.d.ts +2 -2
  143. package/src/mcp-server/tools/generator-guide.js +29 -37
  144. package/src/mcp-server/tools/generator-guide.js.map +1 -1
  145. package/src/mcp-server/tools/list-generators.d.ts +2 -2
  146. package/src/mcp-server/tools/list-generators.js +19 -25
  147. package/src/mcp-server/tools/list-generators.js.map +1 -1
  148. package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
  149. package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
  150. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +286 -62
  151. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +674 -93
  152. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +147 -33
  153. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +196 -44
  154. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5507 -0
  155. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +219 -60
  156. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +351 -80
  157. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +170 -49
  158. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +99 -23
  159. package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
  160. package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
  161. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +196 -44
  162. package/src/open-api/ts-client/files/client.gen.ts.template +130 -18
  163. package/src/open-api/ts-client/files/types.gen.ts.template +4 -4
  164. package/src/open-api/ts-client/generator.d.ts +3 -3
  165. package/src/open-api/ts-client/generator.js +16 -26
  166. package/src/open-api/ts-client/generator.js.map +1 -1
  167. package/src/open-api/ts-client/schema.d.js +6 -0
  168. package/src/open-api/ts-client/schema.d.js.map +1 -0
  169. package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +5 -0
  170. package/src/open-api/ts-hooks/generator.d.ts +3 -3
  171. package/src/open-api/ts-hooks/generator.js +13 -21
  172. package/src/open-api/ts-hooks/generator.js.map +1 -1
  173. package/src/open-api/ts-hooks/generator.spec.tsx +84 -14
  174. package/src/open-api/ts-hooks/schema.d.js +6 -0
  175. package/src/open-api/ts-hooks/schema.d.js.map +1 -0
  176. package/src/open-api/ts-metadata/generator.d.ts +3 -3
  177. package/src/open-api/ts-metadata/generator.js +12 -20
  178. package/src/open-api/ts-metadata/generator.js.map +1 -1
  179. package/src/open-api/ts-metadata/schema.d.js +6 -0
  180. package/src/open-api/ts-metadata/schema.d.js.map +1 -0
  181. package/src/open-api/utils/codegen-data/languages.d.ts +3 -5
  182. package/src/open-api/utils/codegen-data/languages.js +53 -66
  183. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  184. package/src/open-api/utils/codegen-data/types.d.ts +240 -10
  185. package/src/open-api/utils/codegen-data/types.js +54 -30
  186. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  187. package/src/open-api/utils/codegen-data.d.ts +8 -4
  188. package/src/open-api/utils/codegen-data.js +398 -674
  189. package/src/open-api/utils/codegen-data.js.map +1 -1
  190. package/src/open-api/utils/normalise.d.ts +5 -1
  191. package/src/open-api/utils/normalise.js +386 -247
  192. package/src/open-api/utils/normalise.js.map +1 -1
  193. package/src/open-api/utils/parse.d.ts +2 -2
  194. package/src/open-api/utils/parse.js +11 -13
  195. package/src/open-api/utils/parse.js.map +1 -1
  196. package/src/open-api/utils/parser.d.ts +55 -0
  197. package/src/open-api/utils/parser.js +743 -0
  198. package/src/open-api/utils/parser.js.map +1 -0
  199. package/src/open-api/utils/refs.d.ts +1 -1
  200. package/src/open-api/utils/refs.js +12 -22
  201. package/src/open-api/utils/refs.js.map +1 -1
  202. package/src/open-api/utils/types.d.ts +15 -0
  203. package/src/open-api/utils/types.js +5 -2
  204. package/src/open-api/utils/types.js.map +1 -1
  205. package/src/preset/__snapshots__/generator.spec.ts.snap +160 -17
  206. package/src/preset/generator.d.ts +4 -4
  207. package/src/preset/generator.js +140 -112
  208. package/src/preset/generator.js.map +1 -1
  209. package/src/preset/schema.d.js +6 -0
  210. package/src/preset/schema.d.js.map +1 -0
  211. package/src/preset/schema.d.ts +4 -2
  212. package/src/preset/schema.json +10 -5
  213. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +304 -0
  214. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +734 -0
  215. package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +80 -314
  216. package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +189 -0
  217. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +30 -0
  218. package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +28 -0
  219. package/src/py/agent/a2a-connection/generator.d.ts +3 -3
  220. package/src/py/agent/a2a-connection/generator.js +113 -85
  221. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  222. package/src/py/agent/a2a-connection/schema.d.js +8 -0
  223. package/src/py/agent/a2a-connection/schema.d.js.map +1 -0
  224. package/src/py/agent/a2a-connection/schema.d.ts +1 -0
  225. package/src/py/agent/a2a-connection/schema.json +5 -0
  226. package/src/py/agent/files/a2a-langchain/main.py.template +89 -0
  227. package/src/py/agent/files/ag-ui-langchain/main.py.template +83 -0
  228. package/src/py/agent/files/common/agent.py.template +2 -0
  229. package/src/py/agent/files/common-langchain/agent.py.template +30 -0
  230. package/src/py/agent/files/http/init.py.template +7 -25
  231. package/src/py/agent/files/http/main.py.template +2 -3
  232. package/src/py/agent/files/http-langchain/main.py.template +84 -0
  233. package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
  234. package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
  235. package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
  236. package/src/py/agent/gateway-connection/generator.d.ts +10 -0
  237. package/src/py/agent/gateway-connection/generator.js +119 -0
  238. package/src/py/agent/gateway-connection/generator.js.map +1 -0
  239. package/src/py/agent/gateway-connection/schema.d.js +6 -0
  240. package/src/py/agent/gateway-connection/schema.d.js.map +1 -0
  241. package/src/py/agent/gateway-connection/schema.d.ts +13 -0
  242. package/src/py/agent/gateway-connection/schema.json +31 -0
  243. package/src/py/agent/generator.d.ts +3 -3
  244. package/src/py/agent/generator.js +280 -180
  245. package/src/py/agent/generator.js.map +1 -1
  246. package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +153 -89
  247. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +30 -0
  248. package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +30 -0
  249. package/src/py/agent/mcp-connection/generator.d.ts +3 -3
  250. package/src/py/agent/mcp-connection/generator.js +65 -126
  251. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  252. package/src/py/agent/mcp-connection/schema.d.js +8 -0
  253. package/src/py/agent/mcp-connection/schema.d.js.map +1 -0
  254. package/src/py/agent/mcp-connection/schema.d.ts +1 -0
  255. package/src/py/agent/mcp-connection/schema.json +5 -0
  256. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +11 -19
  257. package/src/py/agent/react-connection/generator.d.ts +4 -4
  258. package/src/py/agent/react-connection/generator.js +55 -59
  259. package/src/py/agent/react-connection/generator.js.map +1 -1
  260. package/src/py/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +6 -6
  261. package/src/py/agent/react-connection/local-dev.js +36 -0
  262. package/src/py/agent/react-connection/local-dev.js.map +1 -0
  263. package/src/py/agent/react-connection/schema.d.js +8 -0
  264. package/src/py/agent/react-connection/schema.d.js.map +1 -0
  265. package/src/py/agent/react-connection/schema.d.ts +1 -0
  266. package/src/py/agent/react-connection/schema.json +5 -0
  267. package/src/py/agent/schema.d.js +6 -0
  268. package/src/py/agent/schema.d.js.map +1 -0
  269. package/src/py/agent/schema.d.ts +2 -1
  270. package/src/py/agent/schema.json +6 -1
  271. package/src/py/api/generator.d.ts +3 -3
  272. package/src/py/api/generator.js +12 -11
  273. package/src/py/api/generator.js.map +1 -1
  274. package/src/py/api/schema.d.js +6 -0
  275. package/src/py/api/schema.d.js.map +1 -0
  276. package/src/py/api/schema.d.ts +1 -0
  277. package/src/py/api/schema.json +5 -0
  278. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1526 -0
  279. package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
  280. package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
  281. package/src/py/dynamodb/agent-connection/generator.js +39 -0
  282. package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
  283. package/src/py/dynamodb/agent-connection/schema.d.js +8 -0
  284. package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -0
  285. package/src/py/dynamodb/agent-connection/schema.d.ts +15 -0
  286. package/src/py/dynamodb/agent-connection/schema.json +27 -0
  287. package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +23 -0
  288. package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
  289. package/src/py/dynamodb/fast-api-connection/generator.js +37 -0
  290. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
  291. package/src/py/dynamodb/fast-api-connection/schema.d.js +8 -0
  292. package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -0
  293. package/src/py/dynamodb/fast-api-connection/schema.d.ts +13 -0
  294. package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
  295. package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
  296. package/src/py/dynamodb/files/__name__/client.py.template +39 -0
  297. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
  298. package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
  299. package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
  300. package/src/py/dynamodb/files/config.json.template +24 -0
  301. package/src/py/dynamodb/generator.d.ts +10 -0
  302. package/src/py/dynamodb/generator.js +110 -0
  303. package/src/py/dynamodb/generator.js.map +1 -0
  304. package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
  305. package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  306. package/src/py/dynamodb/mcp-server-connection/generator.js +39 -0
  307. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
  308. package/src/py/dynamodb/mcp-server-connection/schema.d.js +8 -0
  309. package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  310. package/src/py/dynamodb/mcp-server-connection/schema.d.ts +15 -0
  311. package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
  312. package/src/py/dynamodb/schema.d.js +6 -0
  313. package/src/py/dynamodb/schema.d.js.map +1 -0
  314. package/src/py/dynamodb/schema.d.ts +16 -0
  315. package/src/py/dynamodb/schema.json +75 -0
  316. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +212 -4678
  317. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +4833 -0
  318. package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
  319. package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
  320. package/src/py/fast-api/generator.d.ts +3 -3
  321. package/src/py/fast-api/generator.js +90 -87
  322. package/src/py/fast-api/generator.js.map +1 -1
  323. package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +4 -3
  324. package/src/py/fast-api/react/generator.d.ts +4 -4
  325. package/src/py/fast-api/react/generator.js +25 -25
  326. package/src/py/fast-api/react/generator.js.map +1 -1
  327. package/src/py/fast-api/react/open-api.d.ts +1 -1
  328. package/src/py/fast-api/react/open-api.js +31 -29
  329. package/src/py/fast-api/react/open-api.js.map +1 -1
  330. package/src/py/fast-api/react/schema.d.js +6 -0
  331. package/src/py/fast-api/react/schema.d.js.map +1 -0
  332. package/src/py/fast-api/react/schema.d.ts +1 -0
  333. package/src/py/fast-api/react/schema.json +5 -0
  334. package/src/py/fast-api/schema.d.js +6 -0
  335. package/src/py/fast-api/schema.d.js.map +1 -0
  336. package/src/py/fast-api/schema.d.ts +1 -0
  337. package/src/py/fast-api/schema.json +5 -0
  338. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  339. package/src/py/lambda-function/generator.d.ts +3 -3
  340. package/src/py/lambda-function/generator.js +60 -59
  341. package/src/py/lambda-function/generator.js.map +1 -1
  342. package/src/py/lambda-function/schema.d.js +6 -0
  343. package/src/py/lambda-function/schema.d.js.map +1 -0
  344. package/src/py/lambda-function/schema.d.ts +1 -0
  345. package/src/py/lambda-function/schema.json +5 -0
  346. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +87 -17
  347. package/src/py/mcp-server/generator.d.ts +3 -3
  348. package/src/py/mcp-server/generator.js +152 -125
  349. package/src/py/mcp-server/generator.js.map +1 -1
  350. package/src/py/mcp-server/schema.d.js +6 -0
  351. package/src/py/mcp-server/schema.d.js.map +1 -0
  352. package/src/py/mcp-server/schema.d.ts +1 -0
  353. package/src/py/mcp-server/schema.json +5 -0
  354. package/src/py/project/generator.d.ts +17 -4
  355. package/src/py/project/generator.js +205 -127
  356. package/src/py/project/generator.js.map +1 -1
  357. package/src/py/project/schema.d.js +6 -0
  358. package/src/py/project/schema.d.js.map +1 -0
  359. package/src/py/project/schema.d.ts +1 -0
  360. package/src/py/project/schema.json +5 -0
  361. package/src/sdk/agentcore-gateway.d.ts +6 -0
  362. package/src/sdk/agentcore-gateway.js +7 -0
  363. package/src/sdk/agentcore-gateway.js.map +1 -0
  364. package/src/sdk/connection.d.ts +6 -0
  365. package/src/sdk/connection.js +6 -0
  366. package/src/sdk/connection.js.map +1 -0
  367. package/src/sdk/license.d.ts +8 -0
  368. package/src/sdk/license.js +7 -0
  369. package/src/sdk/license.js.map +1 -0
  370. package/src/sdk/open-api.d.ts +10 -0
  371. package/src/sdk/open-api.js +8 -0
  372. package/src/sdk/open-api.js.map +1 -0
  373. package/src/sdk/py.d.ts +14 -0
  374. package/src/sdk/py.js +10 -0
  375. package/src/sdk/py.js.map +1 -0
  376. package/src/sdk/terraform.d.ts +6 -0
  377. package/src/sdk/terraform.js +7 -0
  378. package/src/sdk/terraform.js.map +1 -0
  379. package/src/sdk/ts.d.ts +33 -0
  380. package/src/sdk/ts.js +35 -0
  381. package/src/sdk/ts.js.map +1 -0
  382. package/{sdk → src/sdk}/utils/ast.d.ts +1 -2
  383. package/src/sdk/utils/ast.js +6 -0
  384. package/src/sdk/utils/ast.js.map +1 -0
  385. package/{sdk → src/sdk}/utils/format.d.ts +1 -1
  386. package/src/sdk/utils/format.js +6 -0
  387. package/src/sdk/utils/format.js.map +1 -0
  388. package/{sdk → src/sdk}/utils/test.d.ts +1 -1
  389. package/src/sdk/utils/test.js +6 -0
  390. package/src/sdk/utils/test.js.map +1 -0
  391. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +19 -24
  392. package/src/smithy/project/files/build.Dockerfile.template +1 -4
  393. package/src/smithy/project/files/src/operations/echo.smithy.template +1 -0
  394. package/src/smithy/project/generator.d.ts +3 -3
  395. package/src/smithy/project/generator.js +64 -57
  396. package/src/smithy/project/generator.js.map +1 -1
  397. package/src/smithy/project/schema.d.js +6 -0
  398. package/src/smithy/project/schema.d.js.map +1 -0
  399. package/src/smithy/project/schema.d.ts +1 -0
  400. package/src/smithy/project/schema.json +5 -0
  401. package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
  402. package/src/smithy/react-connection/generator.d.ts +3 -3
  403. package/src/smithy/react-connection/generator.js +39 -47
  404. package/src/smithy/react-connection/generator.js.map +1 -1
  405. package/src/smithy/react-connection/schema.d.js +6 -0
  406. package/src/smithy/react-connection/schema.d.js.map +1 -0
  407. package/src/smithy/react-connection/schema.d.ts +1 -0
  408. package/src/smithy/react-connection/schema.json +5 -0
  409. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +409 -106
  410. package/src/smithy/ts/api/generator.d.ts +3 -3
  411. package/src/smithy/ts/api/generator.js +127 -106
  412. package/src/smithy/ts/api/generator.js.map +1 -1
  413. package/src/smithy/ts/api/schema.d.js +6 -0
  414. package/src/smithy/ts/api/schema.d.js.map +1 -0
  415. package/src/smithy/ts/api/schema.d.ts +1 -0
  416. package/src/smithy/ts/api/schema.json +5 -0
  417. package/src/terraform/project/files/application/src/main.tf.template +6 -1
  418. package/src/terraform/project/files/application/src/providers.tf.template +1 -1
  419. package/src/terraform/project/generator.d.ts +3 -3
  420. package/src/terraform/project/generator.js +156 -104
  421. package/src/terraform/project/generator.js.map +1 -1
  422. package/src/terraform/project/schema.d.js +9 -0
  423. package/src/terraform/project/schema.d.js.map +1 -0
  424. package/src/terraform/project/schema.d.ts +1 -0
  425. package/src/terraform/project/schema.json +5 -0
  426. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +499 -110
  427. package/src/trpc/backend/files/src/procedures/echo.ts.template +1 -1
  428. package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
  429. package/src/trpc/backend/generator.d.ts +4 -4
  430. package/src/trpc/backend/generator.js +97 -85
  431. package/src/trpc/backend/generator.js.map +1 -1
  432. package/src/trpc/backend/schema.d.js +6 -0
  433. package/src/trpc/backend/schema.d.js.map +1 -0
  434. package/src/trpc/backend/schema.d.ts +3 -2
  435. package/src/trpc/backend/schema.json +5 -0
  436. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +4 -4
  437. package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
  438. package/src/trpc/react/generator.d.ts +4 -4
  439. package/src/trpc/react/generator.js +63 -58
  440. package/src/trpc/react/generator.js.map +1 -1
  441. package/src/trpc/react/schema.d.js +6 -0
  442. package/src/trpc/react/schema.d.js.map +1 -0
  443. package/src/trpc/react/schema.d.ts +1 -0
  444. package/src/trpc/react/schema.json +5 -0
  445. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +656 -18
  446. package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +256 -0
  447. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
  448. package/src/ts/agent/a2a-connection/generator.d.ts +3 -3
  449. package/src/ts/agent/a2a-connection/generator.js +63 -56
  450. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  451. package/src/ts/agent/a2a-connection/schema.d.js +8 -0
  452. package/src/ts/agent/a2a-connection/schema.d.js.map +1 -0
  453. package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
  454. package/src/ts/agent/a2a-connection/schema.json +5 -0
  455. package/src/ts/agent/files/common/agent.ts.template +6 -2
  456. package/src/ts/agent/files/http/router.ts.template +1 -1
  457. package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +220 -0
  458. package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
  459. package/src/ts/agent/gateway-connection/generator.d.ts +10 -0
  460. package/src/ts/agent/gateway-connection/generator.js +114 -0
  461. package/src/ts/agent/gateway-connection/generator.js.map +1 -0
  462. package/src/ts/agent/gateway-connection/schema.d.js +6 -0
  463. package/src/ts/agent/gateway-connection/schema.d.js.map +1 -0
  464. package/src/ts/agent/gateway-connection/schema.d.ts +13 -0
  465. package/src/ts/agent/gateway-connection/schema.json +31 -0
  466. package/src/ts/agent/generator.d.ts +3 -3
  467. package/src/ts/agent/generator.js +188 -144
  468. package/src/ts/agent/generator.js.map +1 -1
  469. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +192 -111
  470. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +22 -0
  471. package/src/ts/agent/mcp-connection/generator.d.ts +3 -3
  472. package/src/ts/agent/mcp-connection/generator.js +53 -60
  473. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  474. package/src/ts/agent/mcp-connection/schema.d.js +8 -0
  475. package/src/ts/agent/mcp-connection/schema.d.js.map +1 -0
  476. package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
  477. package/src/ts/agent/mcp-connection/schema.json +5 -0
  478. package/src/ts/agent/react-connection/generator.d.ts +4 -4
  479. package/src/ts/agent/react-connection/generator.js +86 -80
  480. package/src/ts/agent/react-connection/generator.js.map +1 -1
  481. package/src/ts/agent/react-connection/local-dev.d.ts +13 -0
  482. package/src/ts/agent/react-connection/local-dev.js +17 -0
  483. package/src/ts/agent/react-connection/local-dev.js.map +1 -0
  484. package/src/ts/agent/react-connection/schema.d.js +8 -0
  485. package/src/ts/agent/react-connection/schema.d.js.map +1 -0
  486. package/src/ts/agent/react-connection/schema.d.ts +1 -0
  487. package/src/ts/agent/react-connection/schema.json +5 -0
  488. package/src/ts/agent/schema.d.js +6 -0
  489. package/src/ts/agent/schema.d.js.map +1 -0
  490. package/src/ts/agent/schema.d.ts +1 -0
  491. package/src/ts/agent/schema.json +5 -0
  492. package/src/ts/api/generator.d.ts +3 -3
  493. package/src/ts/api/generator.js +16 -16
  494. package/src/ts/api/generator.js.map +1 -1
  495. package/src/ts/api/schema.d.js +6 -0
  496. package/src/ts/api/schema.d.js.map +1 -0
  497. package/src/ts/api/schema.d.ts +3 -1
  498. package/src/ts/api/schema.json +5 -0
  499. package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +15 -16
  500. package/src/ts/astro-docs/generator.d.ts +3 -3
  501. package/src/ts/astro-docs/generator.js +69 -54
  502. package/src/ts/astro-docs/generator.js.map +1 -1
  503. package/src/ts/astro-docs/schema.d.js +6 -0
  504. package/src/ts/astro-docs/schema.d.js.map +1 -0
  505. package/src/ts/astro-docs/schema.d.ts +2 -2
  506. package/src/ts/astro-docs/schema.json +3 -3
  507. package/src/ts/docs/generator.d.ts +3 -3
  508. package/src/ts/docs/generator.js +10 -10
  509. package/src/ts/docs/generator.js.map +1 -1
  510. package/src/ts/docs/schema.d.js +6 -0
  511. package/src/ts/docs/schema.d.js.map +1 -0
  512. package/src/ts/docs/schema.d.ts +1 -4
  513. package/src/ts/docs/schema.json +3 -3
  514. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +1390 -0
  515. package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
  516. package/src/ts/dynamodb/agent-connection/generator.d.ts +10 -0
  517. package/src/ts/dynamodb/agent-connection/generator.js +30 -0
  518. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -0
  519. package/src/ts/dynamodb/agent-connection/schema.d.js +8 -0
  520. package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -0
  521. package/src/ts/dynamodb/agent-connection/schema.d.ts +15 -0
  522. package/src/ts/dynamodb/agent-connection/schema.json +27 -0
  523. package/src/ts/dynamodb/files/config.json.template +24 -0
  524. package/src/ts/dynamodb/files/src/client.ts.template +61 -0
  525. package/src/ts/dynamodb/files/src/entities/example.ts.template +47 -0
  526. package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -0
  527. package/src/ts/dynamodb/files/src/index.ts.template +2 -0
  528. package/src/ts/dynamodb/generator.d.ts +10 -0
  529. package/src/ts/dynamodb/generator.js +116 -0
  530. package/src/ts/dynamodb/generator.js.map +1 -0
  531. package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
  532. package/src/ts/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  533. package/src/ts/dynamodb/mcp-server-connection/generator.js +30 -0
  534. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -0
  535. package/src/ts/dynamodb/mcp-server-connection/schema.d.js +8 -0
  536. package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  537. package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +15 -0
  538. package/src/ts/dynamodb/mcp-server-connection/schema.json +27 -0
  539. package/src/ts/dynamodb/schema.d.js +6 -0
  540. package/src/ts/dynamodb/schema.d.js.map +1 -0
  541. package/src/ts/dynamodb/schema.d.ts +16 -0
  542. package/src/ts/dynamodb/schema.json +75 -0
  543. package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +23 -0
  544. package/src/ts/dynamodb/smithy-connection/generator.d.ts +10 -0
  545. package/src/ts/dynamodb/smithy-connection/generator.js +28 -0
  546. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -0
  547. package/src/ts/dynamodb/smithy-connection/schema.d.js +8 -0
  548. package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -0
  549. package/src/ts/dynamodb/smithy-connection/schema.d.ts +13 -0
  550. package/src/ts/dynamodb/smithy-connection/schema.json +23 -0
  551. package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +23 -0
  552. package/src/ts/dynamodb/trpc-connection/generator.d.ts +10 -0
  553. package/src/ts/dynamodb/trpc-connection/generator.js +28 -0
  554. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -0
  555. package/src/ts/dynamodb/trpc-connection/schema.d.js +8 -0
  556. package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -0
  557. package/src/ts/dynamodb/trpc-connection/schema.d.ts +13 -0
  558. package/src/ts/dynamodb/trpc-connection/schema.json +23 -0
  559. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  560. package/src/ts/lambda-function/generator.d.ts +3 -3
  561. package/src/ts/lambda-function/generator.js +59 -56
  562. package/src/ts/lambda-function/generator.js.map +1 -1
  563. package/src/ts/lambda-function/io.js +83 -52
  564. package/src/ts/lambda-function/io.js.map +1 -1
  565. package/src/ts/lambda-function/schema.d.js +6 -0
  566. package/src/ts/lambda-function/schema.d.js.map +1 -0
  567. package/src/ts/lambda-function/schema.d.ts +1 -0
  568. package/src/ts/lambda-function/schema.json +5 -0
  569. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +53 -99
  570. package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +24 -0
  571. package/src/ts/lib/biome.d.ts +7 -0
  572. package/src/ts/lib/biome.js +58 -0
  573. package/src/ts/lib/biome.js.map +1 -0
  574. package/src/ts/lib/generator.d.ts +3 -3
  575. package/src/ts/lib/generator.js +96 -96
  576. package/src/ts/lib/generator.js.map +1 -1
  577. package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
  578. package/src/ts/lib/schema.d.js +6 -0
  579. package/src/ts/lib/schema.d.js.map +1 -0
  580. package/src/ts/lib/schema.d.ts +1 -1
  581. package/src/ts/lib/schema.json +5 -0
  582. package/src/ts/lib/ts-project-utils.d.ts +12 -2
  583. package/src/ts/lib/ts-project-utils.js +80 -65
  584. package/src/ts/lib/ts-project-utils.js.map +1 -1
  585. package/src/ts/lib/types.js +5 -2
  586. package/src/ts/lib/types.js.map +1 -1
  587. package/src/ts/lib/vitest.d.ts +2 -2
  588. package/src/ts/lib/vitest.js +29 -26
  589. package/src/ts/lib/vitest.js.map +1 -1
  590. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +83 -13
  591. package/src/ts/mcp-server/generator.d.ts +3 -3
  592. package/src/ts/mcp-server/generator.js +164 -120
  593. package/src/ts/mcp-server/generator.js.map +1 -1
  594. package/src/ts/mcp-server/schema.d.js +6 -0
  595. package/src/ts/mcp-server/schema.d.js.map +1 -0
  596. package/src/ts/mcp-server/schema.d.ts +1 -0
  597. package/src/ts/mcp-server/schema.json +5 -0
  598. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +46 -26
  599. package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
  600. package/src/ts/nx-generator/files/common/schema.json.template +5 -0
  601. package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
  602. package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
  603. package/src/ts/nx-generator/generator.d.ts +2 -2
  604. package/src/ts/nx-generator/generator.js +111 -74
  605. package/src/ts/nx-generator/generator.js.map +1 -1
  606. package/src/ts/nx-generator/schema.d.js +6 -0
  607. package/src/ts/nx-generator/schema.d.js.map +1 -0
  608. package/src/ts/nx-generator/schema.d.ts +1 -0
  609. package/src/ts/nx-generator/schema.json +5 -0
  610. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +30 -18
  611. package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
  612. package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
  613. package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
  614. package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
  615. package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
  616. package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +3 -3
  617. package/src/ts/nx-plugin/generator.d.ts +3 -3
  618. package/src/ts/nx-plugin/generator.js +60 -51
  619. package/src/ts/nx-plugin/generator.js.map +1 -1
  620. package/src/ts/nx-plugin/schema.d.js +9 -0
  621. package/src/ts/nx-plugin/schema.d.js.map +1 -0
  622. package/src/ts/nx-plugin/schema.json +5 -0
  623. package/src/ts/nx-plugin/utils.d.ts +1 -1
  624. package/src/ts/nx-plugin/utils.js +32 -38
  625. package/src/ts/nx-plugin/utils.js.map +1 -1
  626. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +312 -482
  627. package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +6 -6
  628. package/src/ts/rdb/agent-connection/generator.d.ts +3 -3
  629. package/src/ts/rdb/agent-connection/generator.js +38 -39
  630. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  631. package/src/ts/rdb/agent-connection/schema.d.js +8 -0
  632. package/src/ts/rdb/agent-connection/schema.d.js.map +1 -0
  633. package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
  634. package/src/ts/rdb/agent-connection/schema.json +5 -0
  635. package/src/ts/rdb/files/config.json.template +14 -0
  636. package/src/ts/rdb/files/prisma.config.ts.template +6 -5
  637. package/src/ts/rdb/files/src/create-db-user-handler.ts.template +7 -9
  638. package/src/ts/rdb/files/src/index.ts.template +0 -1
  639. package/src/ts/rdb/files/src/migration-handler.ts.template +1 -28
  640. package/src/ts/rdb/files/src/prisma.ts.template +28 -23
  641. package/src/ts/rdb/files/src/utils.ts.template +3 -0
  642. package/src/ts/rdb/generator.d.ts +3 -7
  643. package/src/ts/rdb/generator.js +158 -130
  644. package/src/ts/rdb/generator.js.map +1 -1
  645. package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +6 -6
  646. package/src/ts/rdb/mcp-server-connection/generator.d.ts +3 -3
  647. package/src/ts/rdb/mcp-server-connection/generator.js +36 -37
  648. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  649. package/src/ts/rdb/mcp-server-connection/schema.d.js +8 -0
  650. package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -0
  651. package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
  652. package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
  653. package/src/ts/rdb/schema.d.js +6 -0
  654. package/src/ts/rdb/schema.d.js.map +1 -0
  655. package/src/ts/rdb/schema.d.ts +1 -0
  656. package/src/ts/rdb/schema.json +5 -0
  657. package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +3 -3
  658. package/src/ts/rdb/smithy-connection/generator.d.ts +3 -3
  659. package/src/ts/rdb/smithy-connection/generator.js +46 -43
  660. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  661. package/src/ts/rdb/smithy-connection/schema.d.js +8 -0
  662. package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -0
  663. package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
  664. package/src/ts/rdb/smithy-connection/schema.json +5 -0
  665. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +3 -3
  666. package/src/ts/rdb/trpc-connection/generator.d.ts +3 -3
  667. package/src/ts/rdb/trpc-connection/generator.js +36 -31
  668. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  669. package/src/ts/rdb/trpc-connection/schema.d.js +8 -0
  670. package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -0
  671. package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
  672. package/src/ts/rdb/trpc-connection/schema.json +5 -0
  673. package/src/ts/rdb/utils.d.ts +1 -1
  674. package/src/ts/rdb/utils.js +9 -11
  675. package/src/ts/rdb/utils.js.map +1 -1
  676. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +1 -16
  677. package/src/ts/react-website/agui/generator.d.ts +1 -1
  678. package/src/ts/react-website/agui/generator.js +69 -62
  679. package/src/ts/react-website/agui/generator.js.map +1 -1
  680. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +626 -612
  681. package/src/ts/react-website/app/generator.d.ts +4 -4
  682. package/src/ts/react-website/app/generator.js +217 -192
  683. package/src/ts/react-website/app/generator.js.map +1 -1
  684. package/src/ts/react-website/app/schema.d.js +6 -0
  685. package/src/ts/react-website/app/schema.d.js.map +1 -0
  686. package/src/ts/react-website/app/schema.d.ts +1 -1
  687. package/src/ts/react-website/app/schema.json +11 -6
  688. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +129 -18
  689. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +36 -10
  690. package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
  691. package/src/ts/react-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +2 -2
  692. package/src/ts/react-website/cognito-auth/generator.d.ts +4 -4
  693. package/src/ts/react-website/cognito-auth/generator.js +64 -63
  694. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  695. package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +8 -6
  696. package/src/ts/react-website/cognito-auth/grit/cognito-auth-wrapper.grit +1 -1
  697. package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
  698. package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
  699. package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
  700. package/src/ts/react-website/cognito-auth/schema.d.js +6 -0
  701. package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -0
  702. package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
  703. package/src/ts/react-website/cognito-auth/schema.json +5 -0
  704. package/src/ts/react-website/cognito-auth/utils.d.ts +1 -1
  705. package/src/ts/react-website/cognito-auth/utils.js +34 -32
  706. package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
  707. package/src/ts/react-website/runtime-config/__snapshots__/generator.spec.ts.snap +2 -2
  708. package/src/ts/react-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +2 -2
  709. package/src/ts/react-website/runtime-config/generator.d.ts +3 -3
  710. package/src/ts/react-website/runtime-config/generator.js +29 -31
  711. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  712. package/src/ts/react-website/runtime-config/schema.d.js +6 -0
  713. package/src/ts/react-website/runtime-config/schema.d.js.map +1 -0
  714. package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
  715. package/src/ts/react-website/runtime-config/schema.json +5 -0
  716. package/src/ts/sync/generator.d.ts +3 -3
  717. package/src/ts/sync/generator.js +60 -59
  718. package/src/ts/sync/generator.js.map +1 -1
  719. package/src/ts/website/app/generator.d.ts +3 -3
  720. package/src/ts/website/app/generator.js +10 -10
  721. package/src/ts/website/app/generator.js.map +1 -1
  722. package/src/ts/website/app/schema.d.js +6 -0
  723. package/src/ts/website/app/schema.d.js.map +1 -0
  724. package/src/ts/website/app/schema.d.ts +1 -1
  725. package/src/ts/website/app/schema.json +11 -6
  726. package/src/ts/website/auth/generator.d.ts +4 -4
  727. package/src/ts/website/auth/generator.js +11 -10
  728. package/src/ts/website/auth/generator.js.map +1 -1
  729. package/src/ts/website/auth/schema.d.js +6 -0
  730. package/src/ts/website/auth/schema.d.js.map +1 -0
  731. package/src/ts/website/auth/schema.d.ts +1 -0
  732. package/src/ts/website/auth/schema.json +5 -0
  733. package/src/utils/agent-chat/agent-chat.d.ts +31 -0
  734. package/src/utils/agent-chat/agent-chat.js +29 -0
  735. package/src/utils/agent-chat/agent-chat.js.map +1 -0
  736. package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
  737. package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
  738. package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
  739. package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
  740. package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
  741. package/src/utils/agent-connection/agent-connection.d.ts +117 -25
  742. package/src/utils/agent-connection/agent-connection.js +411 -103
  743. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  744. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
  745. package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
  746. package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
  747. package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
  748. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
  749. package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +22 -32
  750. package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
  751. package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
  752. package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +36 -0
  753. package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
  754. package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
  755. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
  756. package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
  757. package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
  758. package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
  759. package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +99 -0
  760. package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
  761. package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
  762. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
  763. package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +5 -18
  764. package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
  765. package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
  766. package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
  767. package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
  768. package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
  769. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +11 -3
  770. package/src/utils/agent-core-constructs/agent-core-constructs.js +86 -38
  771. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  772. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +4 -0
  773. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +50 -0
  774. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +487 -0
  775. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
  776. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +449 -0
  777. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
  778. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +80 -12
  779. package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
  780. package/src/utils/api-constructs/api-constructs.d.ts +2 -2
  781. package/src/utils/api-constructs/api-constructs.js +30 -31
  782. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  783. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +3 -0
  784. package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +23 -6
  785. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +58 -0
  786. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +82 -0
  787. package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +51 -15
  788. package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
  789. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +1 -8
  790. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +94 -4
  791. package/src/utils/api-constructs/files/terraform/core/api/http/http-api/http-api.tf.template +1 -1
  792. package/src/utils/api-constructs/files/terraform/core/api/rest/api-gateway-account/api-gateway-account.tf.template +83 -0
  793. package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +5 -11
  794. package/src/utils/api-constructs/open-api-metadata.d.ts +2 -2
  795. package/src/utils/api-constructs/open-api-metadata.js +22 -22
  796. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  797. package/src/utils/ast/website.d.ts +5 -1
  798. package/src/utils/ast/website.js +18 -20
  799. package/src/utils/ast/website.js.map +1 -1
  800. package/src/utils/ast.d.ts +33 -1
  801. package/src/utils/ast.js +130 -70
  802. package/src/utils/ast.js.map +1 -1
  803. package/src/utils/bundle/bundle.d.ts +1 -1
  804. package/src/utils/bundle/bundle.js +50 -47
  805. package/src/utils/bundle/bundle.js.map +1 -1
  806. package/src/utils/commands.js +47 -26
  807. package/src/utils/commands.js.map +1 -1
  808. package/src/utils/config/index.d.ts +5 -5
  809. package/src/utils/config/index.js +5 -4
  810. package/src/utils/config/index.js.map +1 -1
  811. package/src/utils/config/utils.d.ts +13 -3
  812. package/src/utils/config/utils.js +65 -43
  813. package/src/utils/config/utils.js.map +1 -1
  814. package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +1 -1
  815. package/src/utils/connection/open-api/react.d.ts +6 -6
  816. package/src/utils/connection/open-api/react.js +81 -77
  817. package/src/utils/connection/open-api/react.js.map +1 -1
  818. package/src/utils/containers.d.ts +1 -1
  819. package/src/utils/containers.js +22 -23
  820. package/src/utils/containers.js.map +1 -1
  821. package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +18 -0
  822. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +48 -0
  823. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -0
  824. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +43 -0
  825. package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +105 -0
  826. package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +72 -0
  827. package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +155 -0
  828. package/src/utils/files/common/scripts/src/dynamodb/create-local-table.ts.template +195 -0
  829. package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
  830. package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +106 -0
  831. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +6 -3
  832. package/src/utils/files/common/scripts/src/rdb/mysql/wait-for-mysql-db.ts.template +32 -0
  833. package/src/utils/files/common/scripts/src/rdb/postgres/wait-for-postgres-db.ts.template +32 -0
  834. package/src/utils/files/common/scripts/src/rdb/shared/pull-image.ts.template +16 -0
  835. package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +117 -0
  836. package/src/utils/files/terraform/src/core/asset-bucket/asset-bucket.tf.template +2 -2
  837. package/src/utils/files/terraform/src/core/runtime-config/appconfig/appconfig.tf.template +1 -1
  838. package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +12 -6
  839. package/src/utils/files/terraform/src/core/runtime-config/entry/entry.tf.template +1 -1
  840. package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +9 -4
  841. package/src/utils/files/website/hooks/sigv4/useSigV4.tsx.template +1 -1
  842. package/src/utils/format.d.ts +45 -2
  843. package/src/utils/format.js +323 -81
  844. package/src/utils/format.js.map +1 -1
  845. package/src/utils/fs.d.ts +1 -1
  846. package/src/utils/fs.js +14 -13
  847. package/src/utils/fs.js.map +1 -1
  848. package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
  849. package/src/utils/function-constructs/function-constructs.d.ts +2 -2
  850. package/src/utils/function-constructs/function-constructs.js +21 -26
  851. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  852. package/src/utils/generators.d.ts +4 -0
  853. package/src/utils/generators.js +18 -20
  854. package/src/utils/generators.js.map +1 -1
  855. package/src/utils/git.d.ts +1 -1
  856. package/src/utils/git.js +19 -34
  857. package/src/utils/git.js.map +1 -1
  858. package/src/utils/iac-providers.js +5 -5
  859. package/src/utils/iac-providers.js.map +1 -1
  860. package/src/utils/iac.d.ts +1 -1
  861. package/src/utils/iac.js +12 -14
  862. package/src/utils/iac.js.map +1 -1
  863. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +123 -14
  864. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +28 -9
  865. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +106 -6
  866. package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
  867. package/src/utils/identity-constructs/identity-constructs.d.ts +2 -2
  868. package/src/utils/identity-constructs/identity-constructs.js +24 -28
  869. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  870. package/src/utils/install.d.ts +32 -0
  871. package/src/utils/install.js +56 -0
  872. package/src/utils/install.js.map +1 -0
  873. package/src/utils/js.d.ts +4 -0
  874. package/src/utils/js.js +27 -20
  875. package/src/utils/js.js.map +1 -1
  876. package/src/utils/mcp.d.ts +25 -0
  877. package/src/utils/mcp.js +74 -0
  878. package/src/utils/mcp.js.map +1 -0
  879. package/src/utils/metrics.d.ts +9 -3
  880. package/src/utils/metrics.js +61 -46
  881. package/src/utils/metrics.js.map +1 -1
  882. package/src/utils/mock-project-graph.js +8 -12
  883. package/src/utils/mock-project-graph.js.map +1 -1
  884. package/src/utils/names.d.ts +22 -0
  885. package/src/utils/names.js +44 -48
  886. package/src/utils/names.js.map +1 -1
  887. package/src/utils/npm-scope.d.ts +1 -1
  888. package/src/utils/npm-scope.js +9 -17
  889. package/src/utils/npm-scope.js.map +1 -1
  890. package/src/utils/nx.d.ts +25 -4
  891. package/src/utils/nx.js +144 -75
  892. package/src/utils/nx.js.map +1 -1
  893. package/src/utils/nxlv-python.d.ts +1 -1
  894. package/src/utils/nxlv-python.js +27 -15
  895. package/src/utils/nxlv-python.js.map +1 -1
  896. package/src/utils/object.js +5 -11
  897. package/src/utils/object.js.map +1 -1
  898. package/src/utils/paths.d.ts +1 -1
  899. package/src/utils/paths.js +11 -15
  900. package/src/utils/paths.js.map +1 -1
  901. package/src/utils/pkg-manager.js +4 -9
  902. package/src/utils/pkg-manager.js.map +1 -1
  903. package/src/utils/pnpm-workspace.d.ts +1 -1
  904. package/src/utils/pnpm-workspace.js +22 -22
  905. package/src/utils/pnpm-workspace.js.map +1 -1
  906. package/src/utils/port.d.ts +31 -3
  907. package/src/utils/port.js +72 -12
  908. package/src/utils/port.js.map +1 -1
  909. package/src/utils/py.d.ts +16 -3
  910. package/src/utils/py.js +72 -47
  911. package/src/utils/py.js.map +1 -1
  912. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +12 -2
  913. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +35 -16
  914. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +42 -48
  915. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +31 -16
  916. package/src/utils/rdb-constructs/rdb-constructs.d.ts +5 -4
  917. package/src/utils/rdb-constructs/rdb-constructs.js +31 -41
  918. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  919. package/src/utils/shared-constructs-constants.d.ts +1 -0
  920. package/src/utils/shared-constructs-constants.js +16 -15
  921. package/src/utils/shared-constructs-constants.js.map +1 -1
  922. package/src/utils/shared-constructs.d.ts +2 -2
  923. package/src/utils/shared-constructs.js +57 -54
  924. package/src/utils/shared-constructs.js.map +1 -1
  925. package/src/utils/shared-dynamodb-scripts.d.ts +11 -0
  926. package/src/utils/shared-dynamodb-scripts.js +25 -0
  927. package/src/utils/shared-dynamodb-scripts.js.map +1 -0
  928. package/src/utils/shared-infra-config.d.ts +1 -1
  929. package/src/utils/shared-infra-config.js +30 -31
  930. package/src/utils/shared-infra-config.js.map +1 -1
  931. package/src/utils/shared-infra-scripts.d.ts +11 -0
  932. package/src/utils/shared-infra-scripts.js +40 -0
  933. package/src/utils/shared-infra-scripts.js.map +1 -0
  934. package/src/utils/shared-rdb-scripts.d.ts +16 -0
  935. package/src/utils/shared-rdb-scripts.js +28 -0
  936. package/src/utils/shared-rdb-scripts.js.map +1 -0
  937. package/src/utils/shared-scripts.d.ts +2 -5
  938. package/src/utils/shared-scripts.js +12 -38
  939. package/src/utils/shared-scripts.js.map +1 -1
  940. package/src/utils/shared-shadcn.d.ts +1 -1
  941. package/src/utils/shared-shadcn.js +64 -72
  942. package/src/utils/shared-shadcn.js.map +1 -1
  943. package/src/utils/test.d.ts +13 -1
  944. package/src/utils/test.js +35 -23
  945. package/src/utils/test.js.map +1 -1
  946. package/src/utils/toml.d.ts +1 -1
  947. package/src/utils/toml.js +10 -14
  948. package/src/utils/toml.js.map +1 -1
  949. package/src/utils/versions.d.ts +116 -84
  950. package/src/utils/versions.js +124 -102
  951. package/src/utils/versions.js.map +1 -1
  952. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +73 -5
  953. package/src/utils/website-constructs/files/terraform/app/static-websites/__websiteNameKebabCase__/__websiteNameKebabCase__.tf.template +1 -1
  954. package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +68 -19
  955. package/src/utils/website-constructs/website-constructs.d.ts +2 -2
  956. package/src/utils/website-constructs/website-constructs.js +31 -30
  957. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  958. package/bin/aws-nx-mcp.js +0 -17
  959. package/bin/aws-nx-mcp.js.map +0 -1
  960. package/sdk/connection.d.ts +0 -6
  961. package/sdk/connection.js +0 -10
  962. package/sdk/connection.js.map +0 -1
  963. package/sdk/open-api.d.ts +0 -10
  964. package/sdk/open-api.js +0 -15
  965. package/sdk/open-api.js.map +0 -1
  966. package/sdk/py.d.ts +0 -14
  967. package/sdk/py.js +0 -18
  968. package/sdk/py.js.map +0 -1
  969. package/sdk/terraform.d.ts +0 -6
  970. package/sdk/terraform.js +0 -11
  971. package/sdk/terraform.js.map +0 -1
  972. package/sdk/ts.d.ts +0 -29
  973. package/sdk/ts.js +0 -47
  974. package/sdk/ts.js.map +0 -1
  975. package/sdk/utils/ast.js +0 -12
  976. package/sdk/utils/ast.js.map +0 -1
  977. package/sdk/utils/format.js +0 -10
  978. package/sdk/utils/format.js.map +0 -1
  979. package/sdk/utils/test.js +0 -10
  980. package/sdk/utils/test.js.map +0 -1
  981. package/src/connection/agent-serve-local.js +0 -48
  982. package/src/connection/agent-serve-local.js.map +0 -1
  983. package/src/connection/serve-local.d.ts +0 -15
  984. package/src/connection/serve-local.js +0 -41
  985. package/src/connection/serve-local.js.map +0 -1
  986. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
  987. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
  988. package/src/py/agent/react-connection/serve-local.js +0 -30
  989. package/src/py/agent/react-connection/serve-local.js.map +0 -1
  990. package/src/py/agent/scripts/http/chat.ts.template +0 -38
  991. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
  992. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
  993. package/src/ts/agent/react-connection/serve-local.d.ts +0 -13
  994. package/src/ts/agent/react-connection/serve-local.js +0 -19
  995. package/src/ts/agent/react-connection/serve-local.js.map +0 -1
  996. package/src/ts/agent/scripts/http/chat.ts.template +0 -35
  997. package/src/ts/lib/eslint.d.ts +0 -14
  998. package/src/ts/lib/eslint.js +0 -90
  999. package/src/ts/lib/eslint.js.map +0 -1
  1000. package/src/ts/lib/grit/eslint-dependency-checks-warn.grit +0 -1
  1001. package/src/ts/rdb/files/scripts/docker-pull.ts.template +0 -15
  1002. package/src/ts/rdb/files/scripts/docker-start.ts.template +0 -84
  1003. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
  1004. package/src/ts/rdb/files/src/constants.ts.template +0 -8
  1005. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
  1006. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
  1007. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
  1008. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
  1009. /package/{bin → src/bin}/aws-nx-mcp.d.ts +0 -0
  1010. /package/src/utils/agent-connection/files/{core-runtime-config/with-session-id.ts.template → core-strands/base/with-session-id-strands.ts.template} +0 -0
  1011. /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
  1012. /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
  1013. /package/src/utils/files/common/scripts/src/{infra-deploy.ts.template → infra/infra-deploy.ts.template} +0 -0
  1014. /package/src/utils/files/common/scripts/src/{infra-destroy.ts.template → infra/infra-destroy.ts.template} +0 -0
  1015. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
  1016. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +0 -0
  1017. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
@@ -0,0 +1,1526 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`py#dynamodb generator > should generate scripts for finch engine 1`] = `
4
+ "{
5
+ "runtimeConfigKey": "MyTable",
6
+ "localDev": {
7
+ "port": 8000,
8
+ "tableName": "proj-my-table",
9
+ "image": "public.ecr.aws/aws-dynamodb-local/aws-dynamodb-local:latest",
10
+ "containerName": "proj-dynamodb",
11
+ "containerEngine": "finch"
12
+ },
13
+ "tableConfig": {
14
+ "globalSecondaryIndexes": [
15
+ {
16
+ "indexName": "gsi1pk-gsi1sk-index",
17
+ "partitionKey": "gsi1pk",
18
+ "sortKey": "gsi1sk"
19
+ },
20
+ {
21
+ "indexName": "gsi2pk-gsi2sk-index",
22
+ "partitionKey": "gsi2pk",
23
+ "sortKey": "gsi2sk"
24
+ }
25
+ ]
26
+ }
27
+ }
28
+ "
29
+ `;
30
+
31
+ exports[`py#dynamodb generator > should generate terraform modules when iac is terraform 1`] = `
32
+ "terraform {
33
+ required_version = ">= 1.0"
34
+
35
+ required_providers {
36
+ aws = {
37
+ source = "hashicorp/aws"
38
+ version = "6.52.0"
39
+ }
40
+ }
41
+ }
42
+
43
+ variable "name" {
44
+ description = "Name for the DynamoDB table."
45
+ type = string
46
+ }
47
+
48
+ variable "billing_mode" {
49
+ description = "Controls how you are charged for read and write throughput."
50
+ type = string
51
+ default = "PAY_PER_REQUEST"
52
+ }
53
+
54
+ variable "point_in_time_recovery_enabled" {
55
+ description = "Whether to enable point-in-time recovery for the table."
56
+ type = bool
57
+ default = true
58
+ }
59
+
60
+ variable "deletion_protection_enabled" {
61
+ description = "Whether to enable deletion protection on the table."
62
+ type = bool
63
+ default = true
64
+ }
65
+
66
+ variable "enable_key_rotation" {
67
+ description = "Whether to enable automatic key rotation on the KMS key used to encrypt the table."
68
+ type = bool
69
+ default = true
70
+ }
71
+
72
+ variable "global_secondary_indexes" {
73
+ description = "Global secondary indexes to create on the table. All key attributes must be of type string."
74
+ type = list(object({
75
+ name = string
76
+ hash_key = string
77
+ range_key = string
78
+ projection_type = string
79
+ }))
80
+ default = []
81
+ }
82
+
83
+ locals {
84
+ gsi_attribute_names = distinct(flatten([
85
+ for gsi in var.global_secondary_indexes : [gsi.hash_key, gsi.range_key]
86
+ ]))
87
+ }
88
+
89
+ data "aws_caller_identity" "current" {}
90
+ data "aws_partition" "current" {}
91
+
92
+ resource "aws_kms_key" "table" {
93
+ description = "KMS key for DynamoDB table \${var.name}"
94
+ enable_key_rotation = var.enable_key_rotation
95
+
96
+ policy = jsonencode({
97
+ Version = "2012-10-17"
98
+ Statement = [
99
+ {
100
+ Sid = "EnableRootAccess"
101
+ Effect = "Allow"
102
+ Principal = {
103
+ AWS = "arn:\${data.aws_partition.current.partition}:iam::\${data.aws_caller_identity.current.account_id}:root"
104
+ }
105
+ Action = "kms:*"
106
+ Resource = "*"
107
+ },
108
+ {
109
+ Sid = "AllowDynamoDBService"
110
+ Effect = "Allow"
111
+ Principal = {
112
+ Service = "dynamodb.amazonaws.com"
113
+ }
114
+ Action = [
115
+ "kms:Encrypt",
116
+ "kms:Decrypt",
117
+ "kms:ReEncrypt*",
118
+ "kms:GenerateDataKey*",
119
+ "kms:DescribeKey",
120
+ "kms:CreateGrant"
121
+ ]
122
+ Resource = "*"
123
+ }
124
+ ]
125
+ })
126
+ }
127
+
128
+ resource "aws_dynamodb_table" "table" {
129
+ name = var.name
130
+ billing_mode = var.billing_mode
131
+ hash_key = "pk"
132
+ range_key = "sk"
133
+ deletion_protection_enabled = var.deletion_protection_enabled
134
+
135
+ attribute {
136
+ name = "pk"
137
+ type = "S"
138
+ }
139
+
140
+ attribute {
141
+ name = "sk"
142
+ type = "S"
143
+ }
144
+
145
+ dynamic "attribute" {
146
+ for_each = toset(local.gsi_attribute_names)
147
+ content {
148
+ name = attribute.value
149
+ type = "S"
150
+ }
151
+ }
152
+
153
+ dynamic "global_secondary_index" {
154
+ for_each = var.global_secondary_indexes
155
+ content {
156
+ name = global_secondary_index.value.name
157
+ hash_key = global_secondary_index.value.hash_key
158
+ range_key = global_secondary_index.value.range_key
159
+ projection_type = global_secondary_index.value.projection_type
160
+ }
161
+ }
162
+
163
+ point_in_time_recovery {
164
+ enabled = var.point_in_time_recovery_enabled
165
+ }
166
+
167
+ server_side_encryption {
168
+ enabled = true
169
+ kms_key_arn = aws_kms_key.table.arn
170
+ }
171
+ }
172
+
173
+ output "table_name" {
174
+ description = "Name of the DynamoDB table."
175
+ value = aws_dynamodb_table.table.name
176
+ }
177
+
178
+ output "table_arn" {
179
+ description = "ARN of the DynamoDB table."
180
+ value = aws_dynamodb_table.table.arn
181
+ }
182
+
183
+ output "kms_key_arn" {
184
+ description = "ARN of the KMS key used to encrypt the DynamoDB table."
185
+ value = aws_kms_key.table.arn
186
+ }
187
+ "
188
+ `;
189
+
190
+ exports[`py#dynamodb generator > should generate terraform modules when iac is terraform 2`] = `
191
+ "terraform {
192
+ required_providers {
193
+ aws = {
194
+ source = "hashicorp/aws"
195
+ version = "6.52.0"
196
+ }
197
+ random = {
198
+ source = "hashicorp/random"
199
+ version = "3.9.0"
200
+ }
201
+ }
202
+ }
203
+
204
+ variable "billing_mode" {
205
+ description = "Controls how you are charged for read and write throughput."
206
+ type = string
207
+ default = "PAY_PER_REQUEST"
208
+ }
209
+
210
+ variable "point_in_time_recovery_enabled" {
211
+ description = "Whether to enable point-in-time recovery for the table."
212
+ type = bool
213
+ default = true
214
+ }
215
+
216
+ variable "deletion_protection_enabled" {
217
+ description = "Whether to enable deletion protection on the table."
218
+ type = bool
219
+ default = true
220
+ }
221
+
222
+ variable "enable_key_rotation" {
223
+ description = "Whether to enable automatic key rotation on the KMS key used to encrypt the table."
224
+ type = bool
225
+ default = true
226
+ }
227
+
228
+ resource "random_string" "suffix" {
229
+ length = 8
230
+ special = false
231
+ upper = false
232
+ }
233
+
234
+ locals {
235
+ dynamodb_config = jsondecode(file("\${path.module}/../../../../../../../packages/my_table/config.json"))
236
+ global_secondary_indexes = [for gsi in local.dynamodb_config.tableConfig.globalSecondaryIndexes : {
237
+ name = gsi.indexName
238
+ hash_key = gsi.partitionKey
239
+ range_key = try(gsi.sortKey, null)
240
+ projection_type = "ALL"
241
+ }]
242
+ }
243
+
244
+ module "dynamodb_table" {
245
+ source = "../../../core/dynamodb"
246
+ name = "proj-my-table-\${random_string.suffix.result}"
247
+ billing_mode = var.billing_mode
248
+ point_in_time_recovery_enabled = var.point_in_time_recovery_enabled
249
+ deletion_protection_enabled = var.deletion_protection_enabled
250
+ enable_key_rotation = var.enable_key_rotation
251
+ global_secondary_indexes = local.global_secondary_indexes
252
+ }
253
+
254
+ module "add_to_runtime_config" {
255
+ source = "../../../core/runtime-config/entry"
256
+
257
+ namespace = "dynamodb"
258
+ key = local.dynamodb_config.runtimeConfigKey
259
+ value = {
260
+ tableName = module.dynamodb_table.table_name
261
+ }
262
+ }
263
+ "
264
+ `;
265
+
266
+ exports[`py#dynamodb generator > should generate the dynamodb project > packages/common/scripts/src/dynamodb/create-local-table.ts 1`] = `
267
+ "import {
268
+ BillingMode,
269
+ CreateTableCommand,
270
+ DescribeTableCommand,
271
+ DynamoDBClient,
272
+ GlobalSecondaryIndexDescription,
273
+ IndexStatus,
274
+ KeyType,
275
+ ProjectionType,
276
+ ResourceInUseException,
277
+ ScalarAttributeType,
278
+ TableStatus,
279
+ UpdateTableCommand,
280
+ } from '@aws-sdk/client-dynamodb';
281
+ import { readFileSync } from 'fs';
282
+
283
+ const {
284
+ localDev: { port, tableName },
285
+ tableConfig: { globalSecondaryIndexes },
286
+ } = JSON.parse(readFileSync('config.json', 'utf-8')) as {
287
+ localDev: { port: number; tableName: string };
288
+ tableConfig: {
289
+ globalSecondaryIndexes: {
290
+ indexName: string;
291
+ partitionKey: string;
292
+ sortKey?: string;
293
+ }[];
294
+ };
295
+ };
296
+
297
+ const timeoutSignal = () => AbortSignal.timeout(10000);
298
+
299
+ const client = new DynamoDBClient({
300
+ endpoint: \`http://localhost:\${port}\`,
301
+ region: 'us-east-1',
302
+ credentials: { accessKeyId: 'UNUSED', secretAccessKey: 'UNUSED' },
303
+ });
304
+
305
+ const waitForTableActive = async (
306
+ waitClient: DynamoDBClient,
307
+ waitTableName: string,
308
+ ): Promise<void> => {
309
+ for (;;) {
310
+ const { Table } = await waitClient.send(
311
+ new DescribeTableCommand({ TableName: waitTableName }),
312
+ { abortSignal: timeoutSignal() },
313
+ );
314
+ const allActive =
315
+ Table?.TableStatus === TableStatus.ACTIVE &&
316
+ (Table?.GlobalSecondaryIndexes ?? []).every(
317
+ (g: GlobalSecondaryIndexDescription) =>
318
+ g.IndexStatus === IndexStatus.ACTIVE,
319
+ );
320
+ if (allActive) return;
321
+ await new Promise((resolve) => setTimeout(resolve, 500));
322
+ }
323
+ };
324
+
325
+ const ensureTable = async (
326
+ tblClient: DynamoDBClient,
327
+ tblName: string,
328
+ gsIs: { indexName: string; partitionKey: string; sortKey?: string }[],
329
+ ): Promise<void> => {
330
+ const gsiAttributeDefinitions = gsIs.flatMap((gsi) => [
331
+ { AttributeName: gsi.partitionKey, AttributeType: ScalarAttributeType.S },
332
+ ...(gsi.sortKey
333
+ ? [{ AttributeName: gsi.sortKey, AttributeType: ScalarAttributeType.S }]
334
+ : []),
335
+ ]);
336
+ const attributeDefinitions = [
337
+ { AttributeName: 'pk', AttributeType: ScalarAttributeType.S },
338
+ { AttributeName: 'sk', AttributeType: ScalarAttributeType.S },
339
+ ...gsiAttributeDefinitions.filter(
340
+ (a, i, arr) =>
341
+ arr.findIndex((b) => b.AttributeName === a.AttributeName) === i,
342
+ ),
343
+ ];
344
+ const globalSecondaryIndexes = gsIs.map((gsi) => ({
345
+ IndexName: gsi.indexName,
346
+ KeySchema: [
347
+ { AttributeName: gsi.partitionKey, KeyType: KeyType.HASH },
348
+ ...(gsi.sortKey
349
+ ? [{ AttributeName: gsi.sortKey, KeyType: KeyType.RANGE }]
350
+ : []),
351
+ ],
352
+ Projection: { ProjectionType: ProjectionType.ALL },
353
+ }));
354
+
355
+ for (let attempt = 0; attempt < 30; attempt++) {
356
+ try {
357
+ // New table: create with all GSIs in one shot.
358
+ await tblClient.send(
359
+ new CreateTableCommand({
360
+ TableName: tblName,
361
+ AttributeDefinitions: attributeDefinitions,
362
+ KeySchema: [
363
+ { AttributeName: 'pk', KeyType: KeyType.HASH },
364
+ { AttributeName: 'sk', KeyType: KeyType.RANGE },
365
+ ],
366
+ BillingMode: BillingMode.PAY_PER_REQUEST,
367
+ ...(globalSecondaryIndexes.length > 0 && {
368
+ GlobalSecondaryIndexes: globalSecondaryIndexes,
369
+ }),
370
+ }),
371
+ { abortSignal: timeoutSignal() },
372
+ );
373
+ console.log(\`Created table: \${tblName}\`);
374
+ for (const gsi of globalSecondaryIndexes) {
375
+ console.log(\`Created GSI: \${gsi.IndexName}\`);
376
+ }
377
+ return;
378
+ } catch (e) {
379
+ // Table already exists: sync GSIs to match desired state.
380
+ if (e instanceof ResourceInUseException) {
381
+ const { Table } = await tblClient.send(
382
+ new DescribeTableCommand({ TableName: tblName }),
383
+ { abortSignal: timeoutSignal() },
384
+ );
385
+ const existingGSIs = Table?.GlobalSecondaryIndexes ?? [];
386
+ const existingNames = new Set(
387
+ existingGSIs.map(
388
+ (g: GlobalSecondaryIndexDescription) => g.IndexName ?? '',
389
+ ),
390
+ );
391
+ const desiredNames = new Set(gsIs.map((g) => g.indexName));
392
+
393
+ // DynamoDB Local only allows one GSI to be created or deleted at a time.
394
+ for (const existing of existingGSIs) {
395
+ if (!existing.IndexName || desiredNames.has(existing.IndexName))
396
+ continue;
397
+ await tblClient.send(
398
+ new UpdateTableCommand({
399
+ TableName: tblName,
400
+ GlobalSecondaryIndexUpdates: [
401
+ { Delete: { IndexName: existing.IndexName } },
402
+ ],
403
+ }),
404
+ { abortSignal: timeoutSignal() },
405
+ );
406
+ console.log(\`Deleted GSI: \${existing.IndexName}\`);
407
+ await waitForTableActive(tblClient, tblName);
408
+ }
409
+
410
+ for (const gsi of gsIs) {
411
+ if (existingNames.has(gsi.indexName)) continue;
412
+ await tblClient.send(
413
+ new UpdateTableCommand({
414
+ TableName: tblName,
415
+ AttributeDefinitions: [
416
+ {
417
+ AttributeName: gsi.partitionKey,
418
+ AttributeType: ScalarAttributeType.S,
419
+ },
420
+ ...(gsi.sortKey
421
+ ? [
422
+ {
423
+ AttributeName: gsi.sortKey,
424
+ AttributeType: ScalarAttributeType.S,
425
+ },
426
+ ]
427
+ : []),
428
+ ],
429
+ GlobalSecondaryIndexUpdates: [
430
+ {
431
+ Create: {
432
+ IndexName: gsi.indexName,
433
+ KeySchema: [
434
+ {
435
+ AttributeName: gsi.partitionKey,
436
+ KeyType: KeyType.HASH,
437
+ },
438
+ ...(gsi.sortKey
439
+ ? [
440
+ {
441
+ AttributeName: gsi.sortKey,
442
+ KeyType: KeyType.RANGE,
443
+ },
444
+ ]
445
+ : []),
446
+ ],
447
+ Projection: { ProjectionType: ProjectionType.ALL },
448
+ },
449
+ },
450
+ ],
451
+ }),
452
+ { abortSignal: timeoutSignal() },
453
+ );
454
+ console.log(\`Created GSI: \${gsi.indexName}\`);
455
+ await waitForTableActive(tblClient, tblName);
456
+ }
457
+ return;
458
+ }
459
+ if (attempt === 29) throw e;
460
+ await new Promise((resolve) => setTimeout(resolve, 1000));
461
+ }
462
+ }
463
+ };
464
+
465
+ await ensureTable(client, tableName, globalSecondaryIndexes);
466
+ "
467
+ `;
468
+
469
+ exports[`py#dynamodb generator > should generate the dynamodb project > packages/common/scripts/src/dynamodb/pull-image.ts 1`] = `
470
+ "import { spawnSync } from 'child_process';
471
+ import { readFileSync } from 'fs';
472
+
473
+ const { containerEngine, image } = JSON.parse(
474
+ readFileSync('config.json', 'utf-8'),
475
+ ).localDev;
476
+
477
+ const inspect = spawnSync(containerEngine, ['image', 'inspect', image], {
478
+ stdio: 'ignore',
479
+ });
480
+ if (inspect.status !== 0) {
481
+ const pull = spawnSync(containerEngine, ['pull', image], {
482
+ stdio: 'inherit',
483
+ });
484
+ if (pull.status !== 0) {
485
+ process.exit(pull.status ?? 1);
486
+ }
487
+ }
488
+ "
489
+ `;
490
+
491
+ exports[`py#dynamodb generator > should generate the dynamodb project > packages/common/scripts/src/dynamodb/start-container.ts 1`] = `
492
+ "import { spawn, spawnSync } from 'child_process';
493
+ import { readFileSync } from 'fs';
494
+
495
+ const { containerEngine, containerName, image, port } = JSON.parse(
496
+ readFileSync('config.json', 'utf-8'),
497
+ ).localDev;
498
+
499
+ const containerExists = (): boolean =>
500
+ spawnSync(containerEngine, ['container', 'inspect', containerName], {
501
+ stdio: 'ignore',
502
+ }).status === 0;
503
+
504
+ const isRunning = (): boolean => {
505
+ const result = spawnSync(
506
+ containerEngine,
507
+ ['container', 'inspect', '-f', '{{.State.Running}}', containerName],
508
+ { encoding: 'utf-8' },
509
+ );
510
+ return result.status === 0 && result.stdout.trim() === 'true';
511
+ };
512
+
513
+ // Ensure the image is available locally before starting the container.
514
+ const ensureImage = (): void => {
515
+ const inspect = spawnSync(containerEngine, ['image', 'inspect', image], {
516
+ stdio: 'ignore',
517
+ });
518
+ if (inspect.status !== 0) {
519
+ const pull = spawnSync(containerEngine, ['pull', image], {
520
+ stdio: 'inherit',
521
+ });
522
+ if (pull.status !== 0) process.exit(pull.status ?? 1);
523
+ }
524
+ };
525
+
526
+ // Multiple dynamo table packages run dev in parallel sharing the same
527
+ // container. All processes stream logs, but only the one that created the
528
+ // container stops it on exit — others just detach.
529
+ let created = false;
530
+ let runRetries = 0;
531
+
532
+ ensureImage();
533
+
534
+ for (;;) {
535
+ if (containerExists()) {
536
+ if (!isRunning()) {
537
+ // Another process may have started it between our inspect and start — container engine start
538
+ // exits 0 even if the container is already running, so no special-casing needed.
539
+ const start = spawnSync(containerEngine, ['start', containerName], {
540
+ stdio: 'inherit',
541
+ });
542
+ if (start.status !== 0) process.exit(start.status ?? 1);
543
+ }
544
+ break;
545
+ }
546
+ const runArgs = [
547
+ 'run',
548
+ ...(containerEngine === 'docker' ? ['--rm'] : []),
549
+ '--name',
550
+ containerName,
551
+ '-u',
552
+ 'root',
553
+ '-w',
554
+ '/home/dynamodblocal',
555
+ \`-p\`,
556
+ \`\${port}:\${port}\`,
557
+ '-v',
558
+ \`\${containerName}-data:/home/dynamodblocal/data\`,
559
+ '-d',
560
+ image,
561
+ '-jar',
562
+ 'DynamoDBLocal.jar',
563
+ '-sharedDb',
564
+ '-dbPath',
565
+ './data',
566
+ '-port',
567
+ \`\${port}\`,
568
+ '-optimizeDbBeforeStartup',
569
+ ];
570
+ const create = spawnSync(containerEngine, runArgs, { stdio: 'pipe' });
571
+ if (create.status === 0) {
572
+ created = true;
573
+ break;
574
+ }
575
+ if (!containerExists() && ++runRetries > 3) {
576
+ process.stderr.write(create.stderr);
577
+ process.exit(create.status ?? 1);
578
+ }
579
+ }
580
+
581
+ const logs = spawn(containerEngine, ['logs', '-f', containerName], {
582
+ stdio: ['ignore', 'inherit', 'inherit'],
583
+ });
584
+
585
+ let exiting = false;
586
+
587
+ const cleanup = () => {
588
+ if (exiting) return;
589
+ exiting = true;
590
+ if (created) {
591
+ if (containerEngine === 'docker') {
592
+ spawnSync(containerEngine, ['stop', containerName], { stdio: 'ignore' });
593
+ } else {
594
+ spawnSync(containerEngine, ['rm', '-f', containerName], {
595
+ stdio: 'ignore',
596
+ });
597
+ }
598
+ }
599
+ logs.kill();
600
+ process.exit(0);
601
+ };
602
+
603
+ process.on('SIGTERM', cleanup);
604
+ process.on('SIGINT', cleanup);
605
+ process.on('SIGHUP', cleanup);
606
+
607
+ logs.on('exit', (code) => {
608
+ if (!exiting) process.exit(code ?? 0);
609
+ });
610
+ "
611
+ `;
612
+
613
+ exports[`py#dynamodb generator > should generate the dynamodb project > packages/my_table/proj_my_table/__init__.py 1`] = `
614
+ "from .entities import BaseModel, ExampleModel
615
+
616
+ __all__ = [
617
+ "BaseModel",
618
+ "ExampleModel",
619
+ ]
620
+ "
621
+ `;
622
+
623
+ exports[`py#dynamodb generator > should generate the dynamodb project > packages/my_table/proj_my_table/client.py 1`] = `
624
+ "import json
625
+ import os
626
+ from typing import Any, cast
627
+
628
+ # Generated: must match runtimeConfigKey in config.json
629
+ runtime_config_key = "MyTable"
630
+
631
+
632
+ # config.json is only present in local dev (not in the deployed bundle),
633
+ # so calls to _local_dev must be guarded by is_local().
634
+ def _local_dev() -> dict:
635
+ config_path = os.path.join(os.path.dirname(__file__), "..", "config.json")
636
+ with open(config_path) as f:
637
+ return json.load(f)["localDev"]
638
+
639
+
640
+ def is_local() -> bool:
641
+ return os.environ.get("LOCAL_DEV") == "true"
642
+
643
+
644
+ _table_name: str | None = None
645
+
646
+
647
+ def get_table_name() -> str:
648
+ global _table_name
649
+ if is_local():
650
+ return _local_dev()["tableName"]
651
+ if _table_name is None:
652
+ from aws_lambda_powertools.utilities.parameters import AppConfigProvider
653
+
654
+ app_id = os.environ.get("RUNTIME_CONFIG_APP_ID")
655
+ if not app_id:
656
+ raise ValueError("RUNTIME_CONFIG_APP_ID environment variable is not set")
657
+ provider = AppConfigProvider(application=app_id, environment="default")
658
+ config = cast(dict[str, Any], provider.get("dynamodb", transform="json") or {})
659
+ table_name = (config.get(runtime_config_key) or {}).get("tableName")
660
+ if not table_name:
661
+ raise ValueError("Could not resolve table name from runtime config")
662
+ _table_name = table_name
663
+ return _table_name
664
+ "
665
+ `;
666
+
667
+ exports[`py#dynamodb generator > should generate the dynamodb project > packages/my_table/proj_my_table/entities/__init__.py 1`] = `
668
+ "from .base import BaseModel
669
+ from .example import ExampleModel
670
+
671
+ __all__ = ["BaseModel", "ExampleModel"]
672
+ "
673
+ `;
674
+
675
+ exports[`py#dynamodb generator > should generate the dynamodb project > packages/my_table/proj_my_table/entities/base.py 1`] = `
676
+ "import os
677
+
678
+ from pynamodb.attributes import DiscriminatorAttribute, UnicodeAttribute
679
+ from pynamodb.indexes import AllProjection, GlobalSecondaryIndex
680
+ from pynamodb.models import Model
681
+
682
+ from ..client import _local_dev, get_table_name, is_local
683
+
684
+
685
+ class Gsi1Index(GlobalSecondaryIndex):
686
+ class Meta:
687
+ index_name = "gsi1pk-gsi1sk-index"
688
+ projection = AllProjection()
689
+
690
+ gsi1pk = UnicodeAttribute(hash_key=True)
691
+ gsi1sk = UnicodeAttribute(range_key=True)
692
+
693
+
694
+ class Gsi2Index(GlobalSecondaryIndex):
695
+ class Meta:
696
+ index_name = "gsi2pk-gsi2sk-index"
697
+ projection = AllProjection()
698
+
699
+ gsi2pk = UnicodeAttribute(hash_key=True)
700
+ gsi2sk = UnicodeAttribute(range_key=True)
701
+
702
+
703
+ class BaseModel(Model):
704
+ """Base model for all DynamoDB entities in this table.
705
+
706
+ All entity models MUST extend this class. It wires up the correct DynamoDB
707
+ table name at runtime — resolving from AWS AppConfig when deployed, or from
708
+ config.json when running locally via DynamoDB Local — by overriding
709
+ _get_connection(). Without this, PynamoDB will not know which table to use.
710
+
711
+ Also uses PynamoDB polymorphism to support multiple entity types in a single
712
+ table via DiscriminatorAttribute.
713
+ See https://pynamodb.readthedocs.io/en/stable/polymorphism.html
714
+ """
715
+
716
+ class Meta:
717
+ table_name: str
718
+ region = os.environ.get("AWS_REGION", "us-east-1")
719
+ host = f"http://localhost:{_local_dev()['port']}" if is_local() else None
720
+ aws_access_key_id = "UNUSED" if is_local() else None
721
+ aws_secret_access_key = "UNUSED" if is_local() else None
722
+
723
+ entity_type = DiscriminatorAttribute()
724
+
725
+ pk = UnicodeAttribute(hash_key=True)
726
+ sk = UnicodeAttribute(range_key=True)
727
+ gsi1pk = UnicodeAttribute(null=True)
728
+ gsi1sk = UnicodeAttribute(null=True)
729
+ gsi2pk = UnicodeAttribute(null=True)
730
+ gsi2sk = UnicodeAttribute(null=True)
731
+
732
+ gsi1_index = Gsi1Index()
733
+ gsi2_index = Gsi2Index()
734
+
735
+ @classmethod
736
+ def _get_connection(cls):
737
+ cls.Meta.table_name = get_table_name()
738
+ return super()._get_connection()
739
+ "
740
+ `;
741
+
742
+ exports[`py#dynamodb generator > should generate the dynamodb project > packages/my_table/proj_my_table/entities/example.py 1`] = `
743
+ "from collections.abc import Iterator
744
+ from datetime import UTC, datetime
745
+
746
+ from pynamodb.attributes import UnicodeAttribute
747
+
748
+ from .base import BaseModel
749
+
750
+
751
+ # Example entity using PynamoDB - replace with your own entities
752
+ # See https://pynamodb.readthedocs.io/en/stable/tutorial.html for documentation
753
+ class ExampleModel(BaseModel, discriminator="ExampleModel"):
754
+ """Example entity demonstrating single-table design with GSI access patterns.
755
+
756
+ Key design:
757
+ pk=EXAMPLE#{id}, sk=EXAMPLE#{id}
758
+ gsi1pk=CATEGORY#{category}, gsi1sk=EXAMPLE#{id}
759
+ gsi2pk=EXAMPLE, gsi2sk={created_at ISO-8601}
760
+ """
761
+
762
+ name = UnicodeAttribute()
763
+ category = UnicodeAttribute()
764
+ created_at = UnicodeAttribute()
765
+ updated_at = UnicodeAttribute()
766
+
767
+ @classmethod
768
+ def make_pk(cls, id: str) -> str:
769
+ return f"EXAMPLE#{id}"
770
+
771
+ # ── Writes ────────────────────────────────────────────────────────────────
772
+ @classmethod
773
+ def create(cls, id: str, name: str, category: str) -> ExampleModel:
774
+ now = datetime.now(UTC).isoformat()
775
+ item = cls(
776
+ pk=cls.make_pk(id),
777
+ sk=cls.make_pk(id),
778
+ gsi1pk=f"CATEGORY#{category}",
779
+ gsi1sk=cls.make_pk(id),
780
+ gsi2pk="EXAMPLE",
781
+ gsi2sk=now,
782
+ name=name,
783
+ category=category,
784
+ created_at=now,
785
+ updated_at=now,
786
+ )
787
+ item.save()
788
+ return item
789
+
790
+ # ── Primary index ─────────────────────────────────────────────────────────
791
+ @classmethod
792
+ def get_by_id(cls, id: str) -> ExampleModel:
793
+ """Exact lookup by pk + sk."""
794
+ return cls.get(cls.make_pk(id), cls.make_pk(id))
795
+
796
+ # ── gsi1_index: partition=category, sort=id ───────────────────────────────
797
+ @classmethod
798
+ def list_by_category(cls, category: str) -> Iterator[ExampleModel]:
799
+ """All items in a category."""
800
+ return cls.gsi1_index.query(f"CATEGORY#{category}")
801
+
802
+ # ── gsi2_index: partition=type, sort=created_at ───────────────────────────
803
+ @classmethod
804
+ def list_by_date(cls, limit: int | None = None) -> Iterator[ExampleModel]:
805
+ """All examples, newest first."""
806
+ return cls.gsi2_index.query("EXAMPLE", limit=limit, scan_index_forward=False)
807
+ "
808
+ `;
809
+
810
+ exports[`py#dynamodb generator > should generate the dynamodb project 1`] = `
811
+ "import { Construct } from 'constructs';
812
+ import {
813
+ AttributeType,
814
+ BillingMode,
815
+ Table,
816
+ TableEncryption,
817
+ TableProps,
818
+ } from 'aws-cdk-lib/aws-dynamodb';
819
+ import { RemovalPolicy } from 'aws-cdk-lib';
820
+ import { Grant, IGrantable } from 'aws-cdk-lib/aws-iam';
821
+ import { Key } from 'aws-cdk-lib/aws-kms';
822
+ import { RuntimeConfig } from './runtime-config.js';
823
+
824
+ type _DynamoDBTableProps = Omit<
825
+ TableProps,
826
+ 'tableName' | 'partitionKey' | 'sortKey' | 'encryption' | 'encryptionKey'
827
+ >;
828
+
829
+ export interface DynamoDBTableProps extends _DynamoDBTableProps {
830
+ /**
831
+ * The DynamoDB table name. If omitted, CDK auto-generates a unique name
832
+ * from the stack name and construct path.
833
+ */
834
+ readonly tableName?: string;
835
+
836
+ /**
837
+ * RuntimeConfig key used under the \`dynamodb\` namespace.
838
+ */
839
+ readonly runtimeConfigKey: string;
840
+
841
+ /**
842
+ * Whether to enable automatic key rotation on the KMS key used to encrypt the table.
843
+ *
844
+ * @default true
845
+ */
846
+ readonly enableKeyRotation?: boolean;
847
+ }
848
+
849
+ export abstract class DynamoDBTable extends Construct {
850
+ public readonly table: Table;
851
+
852
+ constructor(
853
+ scope: Construct,
854
+ id: string,
855
+ {
856
+ tableName,
857
+ runtimeConfigKey,
858
+ billingMode = BillingMode.PAY_PER_REQUEST,
859
+ pointInTimeRecoverySpecification = { pointInTimeRecoveryEnabled: true },
860
+ deletionProtection = true,
861
+ removalPolicy = RemovalPolicy.RETAIN,
862
+ enableKeyRotation = true,
863
+ ...rest
864
+ }: DynamoDBTableProps,
865
+ ) {
866
+ super(scope, id);
867
+
868
+ const key = new Key(this, 'EncryptionKey', { enableKeyRotation });
869
+
870
+ this.table = new Table(this, runtimeConfigKey, {
871
+ ...rest,
872
+ ...(tableName !== undefined && { tableName }),
873
+ partitionKey: { name: 'pk', type: AttributeType.STRING },
874
+ sortKey: { name: 'sk', type: AttributeType.STRING },
875
+ billingMode,
876
+ pointInTimeRecoverySpecification,
877
+ deletionProtection,
878
+ encryptionKey: key,
879
+ encryption: TableEncryption.CUSTOMER_MANAGED,
880
+ removalPolicy,
881
+ });
882
+
883
+ const rc = RuntimeConfig.ensure(this);
884
+ rc.set('dynamodb', runtimeConfigKey, { tableName: this.table.tableName });
885
+ }
886
+
887
+ public grantReadData(grantee: IGrantable): Grant {
888
+ return this.table.grantReadData(grantee);
889
+ }
890
+
891
+ public grantWriteData(grantee: IGrantable): Grant {
892
+ return this.table.grantWriteData(grantee);
893
+ }
894
+
895
+ public grantReadWriteData(grantee: IGrantable): Grant {
896
+ return this.table.grantReadWriteData(grantee);
897
+ }
898
+
899
+ public grantFullAccess(grantee: IGrantable): Grant {
900
+ return this.table.grantFullAccess(grantee);
901
+ }
902
+
903
+ public grantStreamRead(grantee: IGrantable): Grant {
904
+ return this.table.grantStreamRead(grantee);
905
+ }
906
+
907
+ public grantTableListStreams(grantee: IGrantable): Grant {
908
+ return this.table.grantTableListStreams(grantee);
909
+ }
910
+
911
+ public grant(grantee: IGrantable, ...actions: string[]): Grant {
912
+ return this.table.grant(grantee, ...actions);
913
+ }
914
+
915
+ public grantStream(grantee: IGrantable, ...actions: string[]): Grant {
916
+ return this.table.grantStream(grantee, ...actions);
917
+ }
918
+ }
919
+ "
920
+ `;
921
+
922
+ exports[`py#dynamodb generator > should generate the dynamodb project 2`] = `
923
+ "import { Construct } from 'constructs';
924
+ import { AttributeType, ProjectionType } from 'aws-cdk-lib/aws-dynamodb';
925
+ import { DynamoDBTable, DynamoDBTableProps } from '../../core/dynamodb.js';
926
+ import { findWorkspaceRoot } from '../../core/workspace.js';
927
+ import { readFileSync } from 'fs';
928
+ import { join } from 'path';
929
+ import { fileURLToPath } from 'url';
930
+
931
+ const { runtimeConfigKey, tableConfig } = JSON.parse(
932
+ readFileSync(
933
+ join(
934
+ findWorkspaceRoot(fileURLToPath(new URL(import.meta.url))),
935
+ 'packages/my_table/config.json',
936
+ ),
937
+ 'utf-8',
938
+ ),
939
+ ) as {
940
+ runtimeConfigKey: string;
941
+ tableConfig: {
942
+ globalSecondaryIndexes: {
943
+ indexName: string;
944
+ partitionKey: string;
945
+ sortKey?: string;
946
+ }[];
947
+ };
948
+ };
949
+
950
+ export type MyTableProps = Omit<DynamoDBTableProps, 'runtimeConfigKey'>;
951
+
952
+ export class MyTable extends DynamoDBTable {
953
+ constructor(scope: Construct, id: string, props?: MyTableProps) {
954
+ super(scope, id, {
955
+ ...props,
956
+ runtimeConfigKey,
957
+ });
958
+
959
+ for (const gsi of tableConfig.globalSecondaryIndexes) {
960
+ this.table.addGlobalSecondaryIndex({
961
+ indexName: gsi.indexName,
962
+ partitionKey: { name: gsi.partitionKey, type: AttributeType.STRING },
963
+ ...(gsi.sortKey && {
964
+ sortKey: { name: gsi.sortKey, type: AttributeType.STRING },
965
+ }),
966
+ projectionType: ProjectionType.ALL,
967
+ });
968
+ }
969
+ }
970
+ }
971
+ "
972
+ `;
973
+
974
+ exports[`py#dynamodb generator > should generate the dynamodb project 3`] = `
975
+ "export * from './my-table.js';
976
+ "
977
+ `;
978
+
979
+ exports[`py#dynamodb generator > should generate the dynamodb project 4`] = `
980
+ "export * from './dynamodb/index.js';
981
+ "
982
+ `;
983
+
984
+ exports[`py#dynamodb generator > should generate with infra=none then upgrade to infra=dynamodb > packages/common/scripts/src/dynamodb/create-local-table.ts 1`] = `
985
+ "import {
986
+ BillingMode,
987
+ CreateTableCommand,
988
+ DescribeTableCommand,
989
+ DynamoDBClient,
990
+ GlobalSecondaryIndexDescription,
991
+ IndexStatus,
992
+ KeyType,
993
+ ProjectionType,
994
+ ResourceInUseException,
995
+ ScalarAttributeType,
996
+ TableStatus,
997
+ UpdateTableCommand,
998
+ } from '@aws-sdk/client-dynamodb';
999
+ import { readFileSync } from 'fs';
1000
+
1001
+ const {
1002
+ localDev: { port, tableName },
1003
+ tableConfig: { globalSecondaryIndexes },
1004
+ } = JSON.parse(readFileSync('config.json', 'utf-8')) as {
1005
+ localDev: { port: number; tableName: string };
1006
+ tableConfig: {
1007
+ globalSecondaryIndexes: {
1008
+ indexName: string;
1009
+ partitionKey: string;
1010
+ sortKey?: string;
1011
+ }[];
1012
+ };
1013
+ };
1014
+
1015
+ const timeoutSignal = () => AbortSignal.timeout(10000);
1016
+
1017
+ const client = new DynamoDBClient({
1018
+ endpoint: \`http://localhost:\${port}\`,
1019
+ region: 'us-east-1',
1020
+ credentials: { accessKeyId: 'UNUSED', secretAccessKey: 'UNUSED' },
1021
+ });
1022
+
1023
+ const waitForTableActive = async (
1024
+ waitClient: DynamoDBClient,
1025
+ waitTableName: string,
1026
+ ): Promise<void> => {
1027
+ for (;;) {
1028
+ const { Table } = await waitClient.send(
1029
+ new DescribeTableCommand({ TableName: waitTableName }),
1030
+ { abortSignal: timeoutSignal() },
1031
+ );
1032
+ const allActive =
1033
+ Table?.TableStatus === TableStatus.ACTIVE &&
1034
+ (Table?.GlobalSecondaryIndexes ?? []).every(
1035
+ (g: GlobalSecondaryIndexDescription) =>
1036
+ g.IndexStatus === IndexStatus.ACTIVE,
1037
+ );
1038
+ if (allActive) return;
1039
+ await new Promise((resolve) => setTimeout(resolve, 500));
1040
+ }
1041
+ };
1042
+
1043
+ const ensureTable = async (
1044
+ tblClient: DynamoDBClient,
1045
+ tblName: string,
1046
+ gsIs: { indexName: string; partitionKey: string; sortKey?: string }[],
1047
+ ): Promise<void> => {
1048
+ const gsiAttributeDefinitions = gsIs.flatMap((gsi) => [
1049
+ { AttributeName: gsi.partitionKey, AttributeType: ScalarAttributeType.S },
1050
+ ...(gsi.sortKey
1051
+ ? [{ AttributeName: gsi.sortKey, AttributeType: ScalarAttributeType.S }]
1052
+ : []),
1053
+ ]);
1054
+ const attributeDefinitions = [
1055
+ { AttributeName: 'pk', AttributeType: ScalarAttributeType.S },
1056
+ { AttributeName: 'sk', AttributeType: ScalarAttributeType.S },
1057
+ ...gsiAttributeDefinitions.filter(
1058
+ (a, i, arr) =>
1059
+ arr.findIndex((b) => b.AttributeName === a.AttributeName) === i,
1060
+ ),
1061
+ ];
1062
+ const globalSecondaryIndexes = gsIs.map((gsi) => ({
1063
+ IndexName: gsi.indexName,
1064
+ KeySchema: [
1065
+ { AttributeName: gsi.partitionKey, KeyType: KeyType.HASH },
1066
+ ...(gsi.sortKey
1067
+ ? [{ AttributeName: gsi.sortKey, KeyType: KeyType.RANGE }]
1068
+ : []),
1069
+ ],
1070
+ Projection: { ProjectionType: ProjectionType.ALL },
1071
+ }));
1072
+
1073
+ for (let attempt = 0; attempt < 30; attempt++) {
1074
+ try {
1075
+ // New table: create with all GSIs in one shot.
1076
+ await tblClient.send(
1077
+ new CreateTableCommand({
1078
+ TableName: tblName,
1079
+ AttributeDefinitions: attributeDefinitions,
1080
+ KeySchema: [
1081
+ { AttributeName: 'pk', KeyType: KeyType.HASH },
1082
+ { AttributeName: 'sk', KeyType: KeyType.RANGE },
1083
+ ],
1084
+ BillingMode: BillingMode.PAY_PER_REQUEST,
1085
+ ...(globalSecondaryIndexes.length > 0 && {
1086
+ GlobalSecondaryIndexes: globalSecondaryIndexes,
1087
+ }),
1088
+ }),
1089
+ { abortSignal: timeoutSignal() },
1090
+ );
1091
+ console.log(\`Created table: \${tblName}\`);
1092
+ for (const gsi of globalSecondaryIndexes) {
1093
+ console.log(\`Created GSI: \${gsi.IndexName}\`);
1094
+ }
1095
+ return;
1096
+ } catch (e) {
1097
+ // Table already exists: sync GSIs to match desired state.
1098
+ if (e instanceof ResourceInUseException) {
1099
+ const { Table } = await tblClient.send(
1100
+ new DescribeTableCommand({ TableName: tblName }),
1101
+ { abortSignal: timeoutSignal() },
1102
+ );
1103
+ const existingGSIs = Table?.GlobalSecondaryIndexes ?? [];
1104
+ const existingNames = new Set(
1105
+ existingGSIs.map(
1106
+ (g: GlobalSecondaryIndexDescription) => g.IndexName ?? '',
1107
+ ),
1108
+ );
1109
+ const desiredNames = new Set(gsIs.map((g) => g.indexName));
1110
+
1111
+ // DynamoDB Local only allows one GSI to be created or deleted at a time.
1112
+ for (const existing of existingGSIs) {
1113
+ if (!existing.IndexName || desiredNames.has(existing.IndexName))
1114
+ continue;
1115
+ await tblClient.send(
1116
+ new UpdateTableCommand({
1117
+ TableName: tblName,
1118
+ GlobalSecondaryIndexUpdates: [
1119
+ { Delete: { IndexName: existing.IndexName } },
1120
+ ],
1121
+ }),
1122
+ { abortSignal: timeoutSignal() },
1123
+ );
1124
+ console.log(\`Deleted GSI: \${existing.IndexName}\`);
1125
+ await waitForTableActive(tblClient, tblName);
1126
+ }
1127
+
1128
+ for (const gsi of gsIs) {
1129
+ if (existingNames.has(gsi.indexName)) continue;
1130
+ await tblClient.send(
1131
+ new UpdateTableCommand({
1132
+ TableName: tblName,
1133
+ AttributeDefinitions: [
1134
+ {
1135
+ AttributeName: gsi.partitionKey,
1136
+ AttributeType: ScalarAttributeType.S,
1137
+ },
1138
+ ...(gsi.sortKey
1139
+ ? [
1140
+ {
1141
+ AttributeName: gsi.sortKey,
1142
+ AttributeType: ScalarAttributeType.S,
1143
+ },
1144
+ ]
1145
+ : []),
1146
+ ],
1147
+ GlobalSecondaryIndexUpdates: [
1148
+ {
1149
+ Create: {
1150
+ IndexName: gsi.indexName,
1151
+ KeySchema: [
1152
+ {
1153
+ AttributeName: gsi.partitionKey,
1154
+ KeyType: KeyType.HASH,
1155
+ },
1156
+ ...(gsi.sortKey
1157
+ ? [
1158
+ {
1159
+ AttributeName: gsi.sortKey,
1160
+ KeyType: KeyType.RANGE,
1161
+ },
1162
+ ]
1163
+ : []),
1164
+ ],
1165
+ Projection: { ProjectionType: ProjectionType.ALL },
1166
+ },
1167
+ },
1168
+ ],
1169
+ }),
1170
+ { abortSignal: timeoutSignal() },
1171
+ );
1172
+ console.log(\`Created GSI: \${gsi.indexName}\`);
1173
+ await waitForTableActive(tblClient, tblName);
1174
+ }
1175
+ return;
1176
+ }
1177
+ if (attempt === 29) throw e;
1178
+ await new Promise((resolve) => setTimeout(resolve, 1000));
1179
+ }
1180
+ }
1181
+ };
1182
+
1183
+ await ensureTable(client, tableName, globalSecondaryIndexes);
1184
+ "
1185
+ `;
1186
+
1187
+ exports[`py#dynamodb generator > should generate with infra=none then upgrade to infra=dynamodb > packages/common/scripts/src/dynamodb/pull-image.ts 1`] = `
1188
+ "import { spawnSync } from 'child_process';
1189
+ import { readFileSync } from 'fs';
1190
+
1191
+ const { containerEngine, image } = JSON.parse(
1192
+ readFileSync('config.json', 'utf-8'),
1193
+ ).localDev;
1194
+
1195
+ const inspect = spawnSync(containerEngine, ['image', 'inspect', image], {
1196
+ stdio: 'ignore',
1197
+ });
1198
+ if (inspect.status !== 0) {
1199
+ const pull = spawnSync(containerEngine, ['pull', image], {
1200
+ stdio: 'inherit',
1201
+ });
1202
+ if (pull.status !== 0) {
1203
+ process.exit(pull.status ?? 1);
1204
+ }
1205
+ }
1206
+ "
1207
+ `;
1208
+
1209
+ exports[`py#dynamodb generator > should generate with infra=none then upgrade to infra=dynamodb > packages/common/scripts/src/dynamodb/start-container.ts 1`] = `
1210
+ "import { spawn, spawnSync } from 'child_process';
1211
+ import { readFileSync } from 'fs';
1212
+
1213
+ const { containerEngine, containerName, image, port } = JSON.parse(
1214
+ readFileSync('config.json', 'utf-8'),
1215
+ ).localDev;
1216
+
1217
+ const containerExists = (): boolean =>
1218
+ spawnSync(containerEngine, ['container', 'inspect', containerName], {
1219
+ stdio: 'ignore',
1220
+ }).status === 0;
1221
+
1222
+ const isRunning = (): boolean => {
1223
+ const result = spawnSync(
1224
+ containerEngine,
1225
+ ['container', 'inspect', '-f', '{{.State.Running}}', containerName],
1226
+ { encoding: 'utf-8' },
1227
+ );
1228
+ return result.status === 0 && result.stdout.trim() === 'true';
1229
+ };
1230
+
1231
+ // Ensure the image is available locally before starting the container.
1232
+ const ensureImage = (): void => {
1233
+ const inspect = spawnSync(containerEngine, ['image', 'inspect', image], {
1234
+ stdio: 'ignore',
1235
+ });
1236
+ if (inspect.status !== 0) {
1237
+ const pull = spawnSync(containerEngine, ['pull', image], {
1238
+ stdio: 'inherit',
1239
+ });
1240
+ if (pull.status !== 0) process.exit(pull.status ?? 1);
1241
+ }
1242
+ };
1243
+
1244
+ // Multiple dynamo table packages run dev in parallel sharing the same
1245
+ // container. All processes stream logs, but only the one that created the
1246
+ // container stops it on exit — others just detach.
1247
+ let created = false;
1248
+ let runRetries = 0;
1249
+
1250
+ ensureImage();
1251
+
1252
+ for (;;) {
1253
+ if (containerExists()) {
1254
+ if (!isRunning()) {
1255
+ // Another process may have started it between our inspect and start — container engine start
1256
+ // exits 0 even if the container is already running, so no special-casing needed.
1257
+ const start = spawnSync(containerEngine, ['start', containerName], {
1258
+ stdio: 'inherit',
1259
+ });
1260
+ if (start.status !== 0) process.exit(start.status ?? 1);
1261
+ }
1262
+ break;
1263
+ }
1264
+ const runArgs = [
1265
+ 'run',
1266
+ ...(containerEngine === 'docker' ? ['--rm'] : []),
1267
+ '--name',
1268
+ containerName,
1269
+ '-u',
1270
+ 'root',
1271
+ '-w',
1272
+ '/home/dynamodblocal',
1273
+ \`-p\`,
1274
+ \`\${port}:\${port}\`,
1275
+ '-v',
1276
+ \`\${containerName}-data:/home/dynamodblocal/data\`,
1277
+ '-d',
1278
+ image,
1279
+ '-jar',
1280
+ 'DynamoDBLocal.jar',
1281
+ '-sharedDb',
1282
+ '-dbPath',
1283
+ './data',
1284
+ '-port',
1285
+ \`\${port}\`,
1286
+ '-optimizeDbBeforeStartup',
1287
+ ];
1288
+ const create = spawnSync(containerEngine, runArgs, { stdio: 'pipe' });
1289
+ if (create.status === 0) {
1290
+ created = true;
1291
+ break;
1292
+ }
1293
+ if (!containerExists() && ++runRetries > 3) {
1294
+ process.stderr.write(create.stderr);
1295
+ process.exit(create.status ?? 1);
1296
+ }
1297
+ }
1298
+
1299
+ const logs = spawn(containerEngine, ['logs', '-f', containerName], {
1300
+ stdio: ['ignore', 'inherit', 'inherit'],
1301
+ });
1302
+
1303
+ let exiting = false;
1304
+
1305
+ const cleanup = () => {
1306
+ if (exiting) return;
1307
+ exiting = true;
1308
+ if (created) {
1309
+ if (containerEngine === 'docker') {
1310
+ spawnSync(containerEngine, ['stop', containerName], { stdio: 'ignore' });
1311
+ } else {
1312
+ spawnSync(containerEngine, ['rm', '-f', containerName], {
1313
+ stdio: 'ignore',
1314
+ });
1315
+ }
1316
+ }
1317
+ logs.kill();
1318
+ process.exit(0);
1319
+ };
1320
+
1321
+ process.on('SIGTERM', cleanup);
1322
+ process.on('SIGINT', cleanup);
1323
+ process.on('SIGHUP', cleanup);
1324
+
1325
+ logs.on('exit', (code) => {
1326
+ if (!exiting) process.exit(code ?? 0);
1327
+ });
1328
+ "
1329
+ `;
1330
+
1331
+ exports[`py#dynamodb generator > should generate with infra=none then upgrade to infra=dynamodb > packages/my_table/proj_my_table/__init__.py 1`] = `
1332
+ "from .entities import BaseModel, ExampleModel
1333
+
1334
+ __all__ = [
1335
+ "BaseModel",
1336
+ "ExampleModel",
1337
+ ]
1338
+ "
1339
+ `;
1340
+
1341
+ exports[`py#dynamodb generator > should generate with infra=none then upgrade to infra=dynamodb > packages/my_table/proj_my_table/client.py 1`] = `
1342
+ "import json
1343
+ import os
1344
+ from typing import Any, cast
1345
+
1346
+ # Generated: must match runtimeConfigKey in config.json
1347
+ runtime_config_key = "MyTable"
1348
+
1349
+
1350
+ # config.json is only present in local dev (not in the deployed bundle),
1351
+ # so calls to _local_dev must be guarded by is_local().
1352
+ def _local_dev() -> dict:
1353
+ config_path = os.path.join(os.path.dirname(__file__), "..", "config.json")
1354
+ with open(config_path) as f:
1355
+ return json.load(f)["localDev"]
1356
+
1357
+
1358
+ def is_local() -> bool:
1359
+ return os.environ.get("LOCAL_DEV") == "true"
1360
+
1361
+
1362
+ _table_name: str | None = None
1363
+
1364
+
1365
+ def get_table_name() -> str:
1366
+ global _table_name
1367
+ if is_local():
1368
+ return _local_dev()["tableName"]
1369
+ if _table_name is None:
1370
+ from aws_lambda_powertools.utilities.parameters import AppConfigProvider
1371
+
1372
+ app_id = os.environ.get("RUNTIME_CONFIG_APP_ID")
1373
+ if not app_id:
1374
+ raise ValueError("RUNTIME_CONFIG_APP_ID environment variable is not set")
1375
+ provider = AppConfigProvider(application=app_id, environment="default")
1376
+ config = cast(dict[str, Any], provider.get("dynamodb", transform="json") or {})
1377
+ table_name = (config.get(runtime_config_key) or {}).get("tableName")
1378
+ if not table_name:
1379
+ raise ValueError("Could not resolve table name from runtime config")
1380
+ _table_name = table_name
1381
+ return _table_name
1382
+ "
1383
+ `;
1384
+
1385
+ exports[`py#dynamodb generator > should generate with infra=none then upgrade to infra=dynamodb > packages/my_table/proj_my_table/entities/__init__.py 1`] = `
1386
+ "from .base import BaseModel
1387
+ from .example import ExampleModel
1388
+
1389
+ __all__ = ["BaseModel", "ExampleModel"]
1390
+ "
1391
+ `;
1392
+
1393
+ exports[`py#dynamodb generator > should generate with infra=none then upgrade to infra=dynamodb > packages/my_table/proj_my_table/entities/base.py 1`] = `
1394
+ "import os
1395
+
1396
+ from pynamodb.attributes import DiscriminatorAttribute, UnicodeAttribute
1397
+ from pynamodb.indexes import AllProjection, GlobalSecondaryIndex
1398
+ from pynamodb.models import Model
1399
+
1400
+ from ..client import _local_dev, get_table_name, is_local
1401
+
1402
+
1403
+ class Gsi1Index(GlobalSecondaryIndex):
1404
+ class Meta:
1405
+ index_name = "gsi1pk-gsi1sk-index"
1406
+ projection = AllProjection()
1407
+
1408
+ gsi1pk = UnicodeAttribute(hash_key=True)
1409
+ gsi1sk = UnicodeAttribute(range_key=True)
1410
+
1411
+
1412
+ class Gsi2Index(GlobalSecondaryIndex):
1413
+ class Meta:
1414
+ index_name = "gsi2pk-gsi2sk-index"
1415
+ projection = AllProjection()
1416
+
1417
+ gsi2pk = UnicodeAttribute(hash_key=True)
1418
+ gsi2sk = UnicodeAttribute(range_key=True)
1419
+
1420
+
1421
+ class BaseModel(Model):
1422
+ """Base model for all DynamoDB entities in this table.
1423
+
1424
+ All entity models MUST extend this class. It wires up the correct DynamoDB
1425
+ table name at runtime — resolving from AWS AppConfig when deployed, or from
1426
+ config.json when running locally via DynamoDB Local — by overriding
1427
+ _get_connection(). Without this, PynamoDB will not know which table to use.
1428
+
1429
+ Also uses PynamoDB polymorphism to support multiple entity types in a single
1430
+ table via DiscriminatorAttribute.
1431
+ See https://pynamodb.readthedocs.io/en/stable/polymorphism.html
1432
+ """
1433
+
1434
+ class Meta:
1435
+ table_name: str
1436
+ region = os.environ.get("AWS_REGION", "us-east-1")
1437
+ host = f"http://localhost:{_local_dev()['port']}" if is_local() else None
1438
+ aws_access_key_id = "UNUSED" if is_local() else None
1439
+ aws_secret_access_key = "UNUSED" if is_local() else None
1440
+
1441
+ entity_type = DiscriminatorAttribute()
1442
+
1443
+ pk = UnicodeAttribute(hash_key=True)
1444
+ sk = UnicodeAttribute(range_key=True)
1445
+ gsi1pk = UnicodeAttribute(null=True)
1446
+ gsi1sk = UnicodeAttribute(null=True)
1447
+ gsi2pk = UnicodeAttribute(null=True)
1448
+ gsi2sk = UnicodeAttribute(null=True)
1449
+
1450
+ gsi1_index = Gsi1Index()
1451
+ gsi2_index = Gsi2Index()
1452
+
1453
+ @classmethod
1454
+ def _get_connection(cls):
1455
+ cls.Meta.table_name = get_table_name()
1456
+ return super()._get_connection()
1457
+ "
1458
+ `;
1459
+
1460
+ exports[`py#dynamodb generator > should generate with infra=none then upgrade to infra=dynamodb > packages/my_table/proj_my_table/entities/example.py 1`] = `
1461
+ "from collections.abc import Iterator
1462
+ from datetime import UTC, datetime
1463
+
1464
+ from pynamodb.attributes import UnicodeAttribute
1465
+
1466
+ from .base import BaseModel
1467
+
1468
+
1469
+ # Example entity using PynamoDB - replace with your own entities
1470
+ # See https://pynamodb.readthedocs.io/en/stable/tutorial.html for documentation
1471
+ class ExampleModel(BaseModel, discriminator="ExampleModel"):
1472
+ """Example entity demonstrating single-table design with GSI access patterns.
1473
+
1474
+ Key design:
1475
+ pk=EXAMPLE#{id}, sk=EXAMPLE#{id}
1476
+ gsi1pk=CATEGORY#{category}, gsi1sk=EXAMPLE#{id}
1477
+ gsi2pk=EXAMPLE, gsi2sk={created_at ISO-8601}
1478
+ """
1479
+
1480
+ name = UnicodeAttribute()
1481
+ category = UnicodeAttribute()
1482
+ created_at = UnicodeAttribute()
1483
+ updated_at = UnicodeAttribute()
1484
+
1485
+ @classmethod
1486
+ def make_pk(cls, id: str) -> str:
1487
+ return f"EXAMPLE#{id}"
1488
+
1489
+ # ── Writes ────────────────────────────────────────────────────────────────
1490
+ @classmethod
1491
+ def create(cls, id: str, name: str, category: str) -> ExampleModel:
1492
+ now = datetime.now(UTC).isoformat()
1493
+ item = cls(
1494
+ pk=cls.make_pk(id),
1495
+ sk=cls.make_pk(id),
1496
+ gsi1pk=f"CATEGORY#{category}",
1497
+ gsi1sk=cls.make_pk(id),
1498
+ gsi2pk="EXAMPLE",
1499
+ gsi2sk=now,
1500
+ name=name,
1501
+ category=category,
1502
+ created_at=now,
1503
+ updated_at=now,
1504
+ )
1505
+ item.save()
1506
+ return item
1507
+
1508
+ # ── Primary index ─────────────────────────────────────────────────────────
1509
+ @classmethod
1510
+ def get_by_id(cls, id: str) -> ExampleModel:
1511
+ """Exact lookup by pk + sk."""
1512
+ return cls.get(cls.make_pk(id), cls.make_pk(id))
1513
+
1514
+ # ── gsi1_index: partition=category, sort=id ───────────────────────────────
1515
+ @classmethod
1516
+ def list_by_category(cls, category: str) -> Iterator[ExampleModel]:
1517
+ """All items in a category."""
1518
+ return cls.gsi1_index.query(f"CATEGORY#{category}")
1519
+
1520
+ # ── gsi2_index: partition=type, sort=created_at ───────────────────────────
1521
+ @classmethod
1522
+ def list_by_date(cls, limit: int | None = None) -> Iterator[ExampleModel]:
1523
+ """All examples, newest first."""
1524
+ return cls.gsi2_index.query("EXAMPLE", limit=limit, scan_index_forward=False)
1525
+ "
1526
+ `;