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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1358) hide show
  1. package/LICENSE-THIRD-PARTY +7044 -6135
  2. package/README.md +9 -7
  3. package/generators.json +152 -10
  4. package/migrations.json +161 -0
  5. package/package.json +41 -22
  6. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +295 -0
  7. package/src/agentcore-gateway/agent-connection/generator.d.ts +19 -0
  8. package/src/agentcore-gateway/agent-connection/generator.js +95 -0
  9. package/src/agentcore-gateway/agent-connection/generator.js.map +1 -0
  10. package/src/agentcore-gateway/agent-connection/schema.d.js +6 -0
  11. package/src/agentcore-gateway/agent-connection/schema.d.js.map +1 -0
  12. package/src/agentcore-gateway/agent-connection/schema.d.ts +13 -0
  13. package/src/agentcore-gateway/agent-connection/schema.json +31 -0
  14. package/src/agentcore-gateway/attach-upstream.d.ts +49 -0
  15. package/src/agentcore-gateway/attach-upstream.js +59 -0
  16. package/src/agentcore-gateway/attach-upstream.js.map +1 -0
  17. package/src/agentcore-gateway/files/cedar/policies/README.md +61 -0
  18. package/src/agentcore-gateway/files/cedar/policies/permit-all.cedar +26 -0
  19. package/src/agentcore-gateway/files/project/http/local-dev.ts.template +77 -0
  20. package/src/agentcore-gateway/files/project/mcp/local-dev.ts.template +134 -0
  21. package/src/agentcore-gateway/gateway-connection/generator.d.ts +21 -0
  22. package/src/agentcore-gateway/gateway-connection/generator.js +103 -0
  23. package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -0
  24. package/src/agentcore-gateway/gateway-connection/schema.d.js +6 -0
  25. package/src/agentcore-gateway/gateway-connection/schema.d.js.map +1 -0
  26. package/src/agentcore-gateway/gateway-connection/schema.d.ts +13 -0
  27. package/src/agentcore-gateway/gateway-connection/schema.json +31 -0
  28. package/src/agentcore-gateway/generator.d.ts +89 -0
  29. package/src/agentcore-gateway/generator.js +212 -0
  30. package/src/agentcore-gateway/generator.js.map +1 -0
  31. package/src/agentcore-gateway/mcp-connection/generator.d.ts +19 -0
  32. package/src/agentcore-gateway/mcp-connection/generator.js +61 -0
  33. package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -0
  34. package/src/agentcore-gateway/mcp-connection/schema.d.js +6 -0
  35. package/src/agentcore-gateway/mcp-connection/schema.d.js.map +1 -0
  36. package/src/agentcore-gateway/mcp-connection/schema.d.ts +13 -0
  37. package/src/agentcore-gateway/mcp-connection/schema.json +31 -0
  38. package/src/agentcore-gateway/react-connection/__snapshots__/generator.spec.ts.snap +68 -0
  39. package/src/agentcore-gateway/react-connection/generator.d.ts +19 -0
  40. package/src/agentcore-gateway/react-connection/generator.js +119 -0
  41. package/src/agentcore-gateway/react-connection/generator.js.map +1 -0
  42. package/src/agentcore-gateway/react-connection/schema.d.js +6 -0
  43. package/src/agentcore-gateway/react-connection/schema.d.js.map +1 -0
  44. package/src/agentcore-gateway/react-connection/schema.d.ts +13 -0
  45. package/src/agentcore-gateway/react-connection/schema.json +31 -0
  46. package/src/agentcore-gateway/schema.d.js +6 -0
  47. package/src/agentcore-gateway/schema.d.js.map +1 -0
  48. package/src/agentcore-gateway/schema.d.ts +17 -0
  49. package/src/agentcore-gateway/schema.json +72 -0
  50. package/src/agentcore-harness/__snapshots__/generator.spec.ts.snap +238 -0
  51. package/src/agentcore-harness/files/project/README.md.template +83 -0
  52. package/src/agentcore-harness/files/project/scripts/chat.ts.template +99 -0
  53. package/src/agentcore-harness/files/project/src/PROMPT.md.template +16 -0
  54. package/src/agentcore-harness/generator.d.ts +62 -0
  55. package/src/agentcore-harness/generator.js +158 -0
  56. package/src/agentcore-harness/generator.js.map +1 -0
  57. package/src/agentcore-harness/schema.d.js +8 -0
  58. package/src/agentcore-harness/schema.d.js.map +1 -0
  59. package/src/agentcore-harness/schema.d.ts +17 -0
  60. package/src/agentcore-harness/schema.json +53 -0
  61. package/src/connection/agent-local-dev.d.ts +49 -0
  62. package/src/connection/agent-local-dev.js +84 -0
  63. package/src/connection/agent-local-dev.js.map +1 -0
  64. package/src/connection/agent-runtime-config.js +9 -14
  65. package/src/connection/agent-runtime-config.js.map +1 -1
  66. package/src/connection/gateway-runtime-config.d.ts +19 -0
  67. package/src/connection/gateway-runtime-config.js +47 -0
  68. package/src/connection/gateway-runtime-config.js.map +1 -0
  69. package/src/connection/generator.d.ts +3 -10
  70. package/src/connection/generator.js +172 -194
  71. package/src/connection/generator.js.map +1 -1
  72. package/src/connection/{serve-local.d.ts → local-dev.d.ts} +3 -3
  73. package/src/connection/local-dev.js +37 -0
  74. package/src/connection/local-dev.js.map +1 -0
  75. package/src/connection/scaffold-catalog.d.ts +267 -0
  76. package/src/connection/scaffold-catalog.js +347 -0
  77. package/src/connection/scaffold-catalog.js.map +1 -0
  78. package/src/connection/schema-resolver.d.ts +5 -0
  79. package/src/connection/schema-resolver.js +27 -0
  80. package/src/connection/schema-resolver.js.map +1 -0
  81. package/src/connection/schema.d.js +6 -0
  82. package/src/connection/schema.d.js.map +1 -0
  83. package/src/connection/schema.d.ts +1 -0
  84. package/src/connection/schema.json +5 -0
  85. package/src/connection/supported-connections.d.ts +116 -0
  86. package/src/connection/supported-connections.js +163 -0
  87. package/src/connection/supported-connections.js.map +1 -0
  88. package/src/index.js +2 -5
  89. package/src/index.js.map +1 -1
  90. package/src/infra/app/__snapshots__/generator.spec.ts.snap +119 -72
  91. package/src/infra/app/files/app/README.md.template +8 -4
  92. package/src/infra/app/files/app/src/main.ts.template +5 -1
  93. package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
  94. package/src/infra/app/generator.d.ts +43 -0
  95. package/src/infra/app/generator.js +195 -127
  96. package/src/infra/app/generator.js.map +1 -1
  97. package/src/infra/app/schema.d.js +6 -0
  98. package/src/infra/app/schema.d.js.map +1 -0
  99. package/src/infra/app/schema.d.ts +1 -1
  100. package/src/infra/app/schema.json +5 -0
  101. package/src/init/generator.d.ts +31 -0
  102. package/src/init/generator.js +46 -0
  103. package/src/init/generator.js.map +1 -0
  104. package/src/init/schema.d.js +6 -0
  105. package/src/init/schema.d.js.map +1 -0
  106. package/src/init/schema.d.ts +16 -0
  107. package/src/init/schema.json +35 -0
  108. package/src/internal/test-matrix/generator.d.ts +29 -0
  109. package/src/internal/test-matrix/generator.js +698 -0
  110. package/src/internal/test-matrix/generator.js.map +1 -0
  111. package/src/internal/test-matrix/schema.d.js +6 -0
  112. package/src/internal/test-matrix/schema.d.js.map +1 -0
  113. package/src/internal/test-matrix/schema.d.ts +12 -0
  114. package/src/internal/test-matrix/schema.json +21 -0
  115. package/src/license/config-types.js +5 -3
  116. package/src/license/config-types.js.map +1 -1
  117. package/src/license/config.d.ts +1 -1
  118. package/src/license/config.js +267 -242
  119. package/src/license/config.js.map +1 -1
  120. package/src/license/dependency-check/check.js +51 -46
  121. package/src/license/dependency-check/check.js.map +1 -1
  122. package/src/license/dependency-check/collectors/collector.js +41 -71
  123. package/src/license/dependency-check/collectors/collector.js.map +1 -1
  124. package/src/license/dependency-check/collectors/npm-collector.js +34 -41
  125. package/src/license/dependency-check/collectors/npm-collector.js.map +1 -1
  126. package/src/license/dependency-check/collectors/python-collector.js +55 -62
  127. package/src/license/dependency-check/collectors/python-collector.js.map +1 -1
  128. package/src/license/dependency-check/evaluator.js +40 -68
  129. package/src/license/dependency-check/evaluator.js.map +1 -1
  130. package/src/license/dependency-check/executor.js +30 -22
  131. package/src/license/dependency-check/executor.js.map +1 -1
  132. package/src/license/dependency-check/pre-approved.js +949 -336
  133. package/src/license/dependency-check/pre-approved.js.map +1 -1
  134. package/src/license/dependency-check/types.js +2 -3
  135. package/src/license/dependency-check/types.js.map +1 -1
  136. package/src/license/generator.js +65 -68
  137. package/src/license/generator.js.map +1 -1
  138. package/src/license/index.js +3 -9
  139. package/src/license/index.js.map +1 -1
  140. package/src/license/known-exceptions.d.ts +1 -1
  141. package/src/license/known-exceptions.js +19 -13
  142. package/src/license/known-exceptions.js.map +1 -1
  143. package/src/license/schema.d.js +6 -0
  144. package/src/license/schema.d.js.map +1 -0
  145. package/src/license/schema.d.ts +2 -0
  146. package/src/license/schema.json +5 -0
  147. package/src/license/sync/generator.js +94 -119
  148. package/src/license/sync/generator.js.map +1 -1
  149. package/src/license/sync/project-file-sync.js +28 -35
  150. package/src/license/sync/project-file-sync.js.map +1 -1
  151. package/src/mcp-server/dev-server.d.ts +1 -0
  152. package/src/mcp-server/dev-server.js +18 -0
  153. package/src/mcp-server/dev-server.js.map +1 -0
  154. package/src/mcp-server/generator-info.js +149 -165
  155. package/src/mcp-server/generator-info.js.map +1 -1
  156. package/src/mcp-server/guide-pipeline.js +199 -206
  157. package/src/mcp-server/guide-pipeline.js.map +1 -1
  158. package/src/mcp-server/guide-render.js +10 -25
  159. package/src/mcp-server/guide-render.js.map +1 -1
  160. package/src/mcp-server/index.js +6 -10
  161. package/src/mcp-server/index.js.map +1 -1
  162. package/src/mcp-server/mdx-ast.js +39 -57
  163. package/src/mcp-server/mdx-ast.js.map +1 -1
  164. package/src/mcp-server/option-filter.js +33 -47
  165. package/src/mcp-server/option-filter.js.map +1 -1
  166. package/src/mcp-server/schema-registry.d.ts +9 -3
  167. package/src/mcp-server/schema-registry.js +41 -38
  168. package/src/mcp-server/schema-registry.js.map +1 -1
  169. package/src/mcp-server/schema.d.ts +1 -1
  170. package/src/mcp-server/schema.js +9 -7
  171. package/src/mcp-server/schema.js.map +1 -1
  172. package/src/mcp-server/server.js +24 -24
  173. package/src/mcp-server/server.js.map +1 -1
  174. package/src/mcp-server/tools/add-to-existing-project.d.ts +12 -0
  175. package/src/mcp-server/tools/add-to-existing-project.js +36 -0
  176. package/src/mcp-server/tools/add-to-existing-project.js.map +1 -0
  177. package/src/mcp-server/tools/create-workspace-command.js +23 -24
  178. package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
  179. package/src/mcp-server/tools/general-guidance.d.ts +1 -1
  180. package/src/mcp-server/tools/general-guidance.js +55 -32
  181. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  182. package/src/mcp-server/tools/generator-guide.js +29 -37
  183. package/src/mcp-server/tools/generator-guide.js.map +1 -1
  184. package/src/mcp-server/tools/list-generators.js +19 -25
  185. package/src/mcp-server/tools/list-generators.js.map +1 -1
  186. package/src/mcp-server/tools/upgrade-workspace.d.ts +11 -0
  187. package/src/mcp-server/tools/upgrade-workspace.js +32 -0
  188. package/src/mcp-server/tools/upgrade-workspace.js.map +1 -0
  189. package/src/migrations/latest/py-agent-a2a-httpx-client-per-call/metadata.json +3 -0
  190. package/src/migrations/latest/py-agent-a2a-httpx-client-per-call/migration.d.ts +6 -0
  191. package/src/migrations/latest/py-agent-a2a-httpx-client-per-call/migration.js +329 -0
  192. package/src/migrations/latest/py-agent-a2a-httpx-client-per-call/migration.js.map +1 -0
  193. package/src/migrations/latest/py-agent-a2a-lifespan-construction/metadata.json +3 -0
  194. package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.d.ts +6 -0
  195. package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.js +234 -0
  196. package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.js.map +1 -0
  197. package/src/migrations/latest/smithy-server-package-rename/metadata.json +3 -0
  198. package/src/migrations/latest/smithy-server-package-rename/migration.d.ts +6 -0
  199. package/src/migrations/latest/smithy-server-package-rename/migration.js +123 -0
  200. package/src/migrations/latest/smithy-server-package-rename/migration.js.map +1 -0
  201. package/src/migrations/latest/translate-script-whole-file-writes/files/build-system-prompt.ts.fixture +23 -0
  202. package/src/migrations/latest/translate-script-whole-file-writes/files/build-user-prompt.ts.fixture +96 -0
  203. package/src/migrations/latest/translate-script-whole-file-writes/files/config-path.ts.fixture +1 -0
  204. package/src/migrations/latest/translate-script-whole-file-writes/files/file-to-translate.ts.fixture +10 -0
  205. package/src/migrations/latest/translate-script-whole-file-writes/files/get-files-to-translate.ts.fixture +96 -0
  206. package/src/migrations/latest/translate-script-whole-file-writes/files/header.ts.fixture +15 -0
  207. package/src/migrations/latest/translate-script-whole-file-writes/files/log.ts.fixture +18 -0
  208. package/src/migrations/latest/translate-script-whole-file-writes/files/main-call.ts.fixture +6 -0
  209. package/src/migrations/latest/translate-script-whole-file-writes/files/main.ts.fixture +79 -0
  210. package/src/migrations/latest/translate-script-whole-file-writes/files/project-root.ts.fixture +1 -0
  211. package/src/migrations/latest/translate-script-whole-file-writes/files/run-with-concurrency.ts.fixture +57 -0
  212. package/src/migrations/latest/translate-script-whole-file-writes/files/scripts-dir.ts.fixture +1 -0
  213. package/src/migrations/latest/translate-script-whole-file-writes/files/translate-file-for-language.ts.fixture +61 -0
  214. package/src/migrations/latest/translate-script-whole-file-writes/grit/already-migrated.grit +1 -0
  215. package/src/migrations/latest/translate-script-whole-file-writes/grit/build-system-prompt.grit +6 -0
  216. package/src/migrations/latest/translate-script-whole-file-writes/grit/build-user-prompt.grit +6 -0
  217. package/src/migrations/latest/translate-script-whole-file-writes/grit/config-path.grit +1 -0
  218. package/src/migrations/latest/translate-script-whole-file-writes/grit/file-to-translate.grit +11 -0
  219. package/src/migrations/latest/translate-script-whole-file-writes/grit/get-files-to-translate.grit +7 -0
  220. package/src/migrations/latest/translate-script-whole-file-writes/grit/log.grit +3 -0
  221. package/src/migrations/latest/translate-script-whole-file-writes/grit/main-call.grit +1 -0
  222. package/src/migrations/latest/translate-script-whole-file-writes/grit/main.grit +8 -0
  223. package/src/migrations/latest/translate-script-whole-file-writes/grit/project-root.grit +1 -0
  224. package/src/migrations/latest/translate-script-whole-file-writes/grit/run-with-concurrency.grit +6 -0
  225. package/src/migrations/latest/translate-script-whole-file-writes/grit/translate-file-for-language.grit +6 -0
  226. package/src/migrations/latest/translate-script-whole-file-writes/metadata.json +3 -0
  227. package/src/migrations/latest/translate-script-whole-file-writes/migration.d.ts +2 -0
  228. package/src/migrations/latest/translate-script-whole-file-writes/migration.js +103 -0
  229. package/src/migrations/latest/translate-script-whole-file-writes/migration.js.map +1 -0
  230. package/src/migrations/latest/translate-script-whole-file-writes/test-fixtures/released-script-first.ts.fixture +430 -0
  231. package/src/migrations/latest/translate-script-whole-file-writes/test-fixtures/released-script.ts.fixture +431 -0
  232. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/metadata.json +3 -0
  233. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.d.ts +6 -0
  234. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.js +65 -0
  235. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.js.map +1 -0
  236. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/metadata.json +3 -0
  237. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.d.ts +6 -0
  238. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.js +108 -0
  239. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.js.map +1 -0
  240. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/metadata.json +3 -0
  241. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.d.ts +6 -0
  242. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.js +128 -0
  243. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.js.map +1 -0
  244. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/metadata.json +3 -0
  245. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.d.ts +6 -0
  246. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.js +215 -0
  247. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.js.map +1 -0
  248. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/metadata.json +3 -0
  249. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.d.ts +6 -0
  250. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.js +93 -0
  251. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
  252. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/metadata.json +3 -0
  253. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.d.ts +96 -0
  254. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.js +670 -0
  255. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.js.map +1 -0
  256. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/metadata.json +3 -0
  257. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.d.ts +6 -0
  258. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.js +89 -0
  259. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.js.map +1 -0
  260. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/metadata.json +3 -0
  261. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.d.ts +6 -0
  262. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.js +449 -0
  263. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.js.map +1 -0
  264. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/metadata.json +3 -0
  265. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.d.ts +6 -0
  266. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.js +78 -0
  267. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.js.map +1 -0
  268. package/src/{smithy/project/files/build.Dockerfile.template → migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/rc57-service.Dockerfile.fixture} +1 -4
  269. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/__snapshots__/migration.spec.ts.snap +223 -0
  270. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/metadata.json +3 -0
  271. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.d.ts +6 -0
  272. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.js +217 -0
  273. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.js.map +1 -0
  274. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/__snapshots__/migration.spec.ts.snap +149 -0
  275. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/metadata.json +3 -0
  276. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.d.ts +6 -0
  277. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.js +195 -0
  278. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.js.map +1 -0
  279. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/__snapshots__/migration.spec.ts.snap +57 -0
  280. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/metadata.json +3 -0
  281. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.d.ts +6 -0
  282. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.js +77 -0
  283. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.js.map +1 -0
  284. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/__snapshots__/migration.spec.ts.snap +48 -0
  285. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/metadata.json +3 -0
  286. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.d.ts +6 -0
  287. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.js +91 -0
  288. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.js.map +1 -0
  289. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/metadata.json +3 -0
  290. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.d.ts +6 -0
  291. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.js +412 -0
  292. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.js.map +1 -0
  293. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/metadata.json +3 -0
  294. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.d.ts +6 -0
  295. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.js +33 -0
  296. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.js.map +1 -0
  297. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/metadata.json +3 -0
  298. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.d.ts +6 -0
  299. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.js +83 -0
  300. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.js.map +1 -0
  301. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/legacy-service.Dockerfile.fixture +95 -0
  302. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/metadata.json +3 -0
  303. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.d.ts +6 -0
  304. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.js +154 -0
  305. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.js.map +1 -0
  306. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/metadata.json +3 -0
  307. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.d.ts +6 -0
  308. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.js +71 -0
  309. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.js.map +1 -0
  310. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/metadata.json +3 -0
  311. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.d.ts +6 -0
  312. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.js +57 -0
  313. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.js.map +1 -0
  314. package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
  315. package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
  316. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +298 -74
  317. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +748 -103
  318. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +230 -37
  319. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +249 -52
  320. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5535 -0
  321. package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
  322. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +305 -71
  323. package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +298 -0
  324. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +353 -82
  325. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +176 -55
  326. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +100 -24
  327. package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
  328. package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
  329. package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
  330. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +200 -48
  331. package/src/open-api/ts-client/files/client.gen.ts.template +358 -24
  332. package/src/open-api/ts-client/files/types.gen.ts.template +6 -4
  333. package/src/open-api/ts-client/generator.js +41 -26
  334. package/src/open-api/ts-client/generator.js.map +1 -1
  335. package/src/open-api/ts-client/schema.d.js +6 -0
  336. package/src/open-api/ts-client/schema.d.js.map +1 -0
  337. package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +7 -2
  338. package/src/open-api/ts-hooks/generator.js +17 -21
  339. package/src/open-api/ts-hooks/generator.js.map +1 -1
  340. package/src/open-api/ts-hooks/generator.spec.tsx +70 -0
  341. package/src/open-api/ts-hooks/schema.d.js +6 -0
  342. package/src/open-api/ts-hooks/schema.d.js.map +1 -0
  343. package/src/open-api/ts-metadata/generator.js +12 -20
  344. package/src/open-api/ts-metadata/generator.js.map +1 -1
  345. package/src/open-api/ts-metadata/schema.d.js +6 -0
  346. package/src/open-api/ts-metadata/schema.d.js.map +1 -0
  347. package/src/open-api/utils/codegen-data/languages.d.ts +0 -6
  348. package/src/open-api/utils/codegen-data/languages.js +59 -66
  349. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  350. package/src/open-api/utils/codegen-data/types.d.ts +255 -10
  351. package/src/open-api/utils/codegen-data/types.js +54 -30
  352. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  353. package/src/open-api/utils/codegen-data.d.ts +2 -2
  354. package/src/open-api/utils/codegen-data.js +494 -674
  355. package/src/open-api/utils/codegen-data.js.map +1 -1
  356. package/src/open-api/utils/normalise.js +437 -246
  357. package/src/open-api/utils/normalise.js.map +1 -1
  358. package/src/open-api/utils/parse.js +8 -14
  359. package/src/open-api/utils/parse.js.map +1 -1
  360. package/src/open-api/utils/parser.d.ts +55 -0
  361. package/src/open-api/utils/parser.js +787 -0
  362. package/src/open-api/utils/parser.js.map +1 -0
  363. package/src/open-api/utils/refs.js +12 -22
  364. package/src/open-api/utils/refs.js.map +1 -1
  365. package/src/open-api/utils/types.d.ts +18 -0
  366. package/src/open-api/utils/types.js +5 -2
  367. package/src/open-api/utils/types.js.map +1 -1
  368. package/src/preset/__snapshots__/generator.spec.ts.snap +101 -20
  369. package/src/preset/generator.d.ts +14 -1
  370. package/src/preset/generator.js +76 -151
  371. package/src/preset/generator.js.map +1 -1
  372. package/src/preset/schema.d.js +6 -0
  373. package/src/preset/schema.d.js.map +1 -0
  374. package/src/preset/schema.d.ts +4 -1
  375. package/src/preset/schema.json +16 -5
  376. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +326 -0
  377. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +738 -0
  378. package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +191 -315
  379. package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +231 -0
  380. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +29 -0
  381. package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +29 -0
  382. package/src/py/agent/a2a-connection/generator.d.ts +24 -0
  383. package/src/py/agent/a2a-connection/generator.js +145 -88
  384. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  385. package/src/py/agent/a2a-connection/schema.d.js +8 -0
  386. package/src/py/agent/a2a-connection/schema.d.js.map +1 -0
  387. package/src/py/agent/a2a-connection/schema.d.ts +1 -0
  388. package/src/py/agent/a2a-connection/schema.json +5 -0
  389. package/src/py/agent/files/deploy/Dockerfile.template +8 -1
  390. package/src/py/agent/files/langchain/a2a/main.py.template +94 -0
  391. package/src/py/agent/files/langchain/ag-ui/main.py.template +87 -0
  392. package/src/py/agent/files/langchain/common/agent.py.template +30 -0
  393. package/src/py/agent/files/{http → langchain/http}/init.py.template +17 -25
  394. package/src/py/agent/files/langchain/http/main.py.template +81 -0
  395. package/src/py/agent/files/{a2a → strands/a2a}/main.py.template +33 -15
  396. package/src/py/agent/files/strands/ag-ui/main.py.template +89 -0
  397. package/src/py/agent/files/{common → strands/common}/agent.py.template +2 -0
  398. package/src/py/agent/files/strands/http/init.py.template +97 -0
  399. package/src/py/agent/files/{http → strands/http}/main.py.template +4 -13
  400. package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
  401. package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
  402. package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
  403. package/src/py/agent/gateway-connection/generator.d.ts +33 -0
  404. package/src/py/agent/gateway-connection/generator.js +153 -0
  405. package/src/py/agent/gateway-connection/generator.js.map +1 -0
  406. package/src/py/agent/gateway-connection/schema.d.js +6 -0
  407. package/src/py/agent/gateway-connection/schema.d.js.map +1 -0
  408. package/src/py/agent/gateway-connection/schema.d.ts +13 -0
  409. package/src/py/agent/gateway-connection/schema.json +31 -0
  410. package/src/py/agent/generator.d.ts +154 -1
  411. package/src/py/agent/generator.js +396 -197
  412. package/src/py/agent/generator.js.map +1 -1
  413. package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +154 -89
  414. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +31 -0
  415. package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +31 -0
  416. package/src/py/agent/mcp-connection/generator.d.ts +23 -0
  417. package/src/py/agent/mcp-connection/generator.js +103 -130
  418. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  419. package/src/py/agent/mcp-connection/schema.d.js +8 -0
  420. package/src/py/agent/mcp-connection/schema.d.js.map +1 -0
  421. package/src/py/agent/mcp-connection/schema.d.ts +1 -0
  422. package/src/py/agent/mcp-connection/schema.json +5 -0
  423. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +17 -19
  424. package/src/py/agent/react-connection/generator.d.ts +150 -1
  425. package/src/py/agent/react-connection/generator.js +105 -65
  426. package/src/py/agent/react-connection/generator.js.map +1 -1
  427. package/src/py/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +4 -4
  428. package/src/py/agent/react-connection/local-dev.js +36 -0
  429. package/src/py/agent/react-connection/local-dev.js.map +1 -0
  430. package/src/py/agent/react-connection/schema.d.js +8 -0
  431. package/src/py/agent/react-connection/schema.d.js.map +1 -0
  432. package/src/py/agent/react-connection/schema.d.ts +1 -0
  433. package/src/py/agent/react-connection/schema.json +5 -0
  434. package/src/py/agent/schema.d.js +6 -0
  435. package/src/py/agent/schema.d.js.map +1 -0
  436. package/src/py/agent/schema.d.ts +5 -1
  437. package/src/py/agent/schema.json +15 -1
  438. package/src/py/api/generator.js +12 -11
  439. package/src/py/api/generator.js.map +1 -1
  440. package/src/py/api/schema.d.js +6 -0
  441. package/src/py/api/schema.d.js.map +1 -0
  442. package/src/py/api/schema.d.ts +1 -0
  443. package/src/py/api/schema.json +5 -0
  444. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1520 -0
  445. package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +63 -0
  446. package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
  447. package/src/py/dynamodb/agent-connection/generator.js +45 -0
  448. package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
  449. package/src/py/dynamodb/agent-connection/schema.d.js +8 -0
  450. package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -0
  451. package/src/py/dynamodb/agent-connection/schema.d.ts +15 -0
  452. package/src/py/dynamodb/agent-connection/schema.json +27 -0
  453. package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +32 -0
  454. package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
  455. package/src/py/dynamodb/fast-api-connection/generator.js +39 -0
  456. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
  457. package/src/py/dynamodb/fast-api-connection/schema.d.js +8 -0
  458. package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -0
  459. package/src/py/dynamodb/fast-api-connection/schema.d.ts +13 -0
  460. package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
  461. package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
  462. package/src/py/dynamodb/files/__name__/client.py.template +39 -0
  463. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
  464. package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
  465. package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
  466. package/src/py/dynamodb/files/config.json.template +24 -0
  467. package/src/py/dynamodb/generator.d.ts +39 -0
  468. package/src/py/dynamodb/generator.js +130 -0
  469. package/src/py/dynamodb/generator.js.map +1 -0
  470. package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +63 -0
  471. package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  472. package/src/py/dynamodb/mcp-server-connection/generator.js +45 -0
  473. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
  474. package/src/py/dynamodb/mcp-server-connection/schema.d.js +8 -0
  475. package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  476. package/src/py/dynamodb/mcp-server-connection/schema.d.ts +15 -0
  477. package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
  478. package/src/py/dynamodb/schema.d.js +6 -0
  479. package/src/py/dynamodb/schema.d.js.map +1 -0
  480. package/src/py/dynamodb/schema.d.ts +16 -0
  481. package/src/py/dynamodb/schema.json +76 -0
  482. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +240 -4693
  483. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +5409 -0
  484. package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
  485. package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
  486. package/src/py/fast-api/generator.d.ts +72 -0
  487. package/src/py/fast-api/generator.js +134 -95
  488. package/src/py/fast-api/generator.js.map +1 -1
  489. package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +4 -3
  490. package/src/py/fast-api/react/generator.d.ts +16 -1
  491. package/src/py/fast-api/react/generator.js +38 -26
  492. package/src/py/fast-api/react/generator.js.map +1 -1
  493. package/src/py/fast-api/react/open-api.js +31 -29
  494. package/src/py/fast-api/react/open-api.js.map +1 -1
  495. package/src/py/fast-api/react/schema.d.js +6 -0
  496. package/src/py/fast-api/react/schema.d.js.map +1 -0
  497. package/src/py/fast-api/react/schema.d.ts +1 -0
  498. package/src/py/fast-api/react/schema.json +5 -0
  499. package/src/py/fast-api/schema.d.js +6 -0
  500. package/src/py/fast-api/schema.d.js.map +1 -0
  501. package/src/py/fast-api/schema.d.ts +1 -0
  502. package/src/py/fast-api/schema.json +6 -0
  503. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  504. package/src/py/lambda-function/generator.d.ts +21 -0
  505. package/src/py/lambda-function/generator.js +82 -62
  506. package/src/py/lambda-function/generator.js.map +1 -1
  507. package/src/py/lambda-function/schema.d.js +6 -0
  508. package/src/py/lambda-function/schema.d.js.map +1 -0
  509. package/src/py/lambda-function/schema.d.ts +1 -0
  510. package/src/py/lambda-function/schema.json +5 -0
  511. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +221 -21
  512. package/src/py/mcp-server/files/deploy/Dockerfile.template +8 -1
  513. package/src/py/mcp-server/generator.d.ts +68 -0
  514. package/src/py/mcp-server/generator.js +204 -131
  515. package/src/py/mcp-server/generator.js.map +1 -1
  516. package/src/py/mcp-server/schema.d.js +6 -0
  517. package/src/py/mcp-server/schema.d.js.map +1 -0
  518. package/src/py/mcp-server/schema.d.ts +1 -0
  519. package/src/py/mcp-server/schema.json +6 -0
  520. package/src/py/project/generator.d.ts +27 -1
  521. package/src/py/project/generator.js +248 -130
  522. package/src/py/project/generator.js.map +1 -1
  523. package/src/py/project/schema.d.js +6 -0
  524. package/src/py/project/schema.d.js.map +1 -0
  525. package/src/py/project/schema.d.ts +1 -0
  526. package/src/py/project/schema.json +5 -0
  527. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2070 -0
  528. package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +123 -0
  529. package/src/py/rdb/agent-connection/generator.d.ts +10 -0
  530. package/src/py/rdb/agent-connection/generator.js +52 -0
  531. package/src/py/rdb/agent-connection/generator.js.map +1 -0
  532. package/src/py/rdb/agent-connection/schema.d.js +8 -0
  533. package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
  534. package/src/py/rdb/agent-connection/schema.d.ts +15 -0
  535. package/src/py/rdb/agent-connection/schema.json +27 -0
  536. package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +51 -0
  537. package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
  538. package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
  539. package/src/py/rdb/fast-api-connection/generator.js +56 -0
  540. package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
  541. package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
  542. package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
  543. package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
  544. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  545. package/src/py/rdb/files/Dockerfile.create-db-user.template +14 -0
  546. package/src/py/rdb/files/Dockerfile.migration.template +14 -0
  547. package/src/py/rdb/files/__name__/__init__.py.template +3 -0
  548. package/src/py/rdb/files/__name__/connection.py.template +55 -0
  549. package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
  550. package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
  551. package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
  552. package/src/py/rdb/files/__name__/models/example.py.template +8 -0
  553. package/src/py/rdb/files/__name__/utils.py.template +104 -0
  554. package/src/py/rdb/files/alembic.ini.template +38 -0
  555. package/src/py/rdb/files/config.json.template +14 -0
  556. package/src/py/rdb/files/migrations/env.py.template +80 -0
  557. package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
  558. package/src/py/rdb/generator.d.ts +103 -0
  559. package/src/py/rdb/generator.js +328 -0
  560. package/src/py/rdb/generator.js.map +1 -0
  561. package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +119 -0
  562. package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
  563. package/src/py/rdb/mcp-server-connection/generator.js +52 -0
  564. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
  565. package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
  566. package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
  567. package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
  568. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  569. package/src/py/rdb/schema.d.js +6 -0
  570. package/src/py/rdb/schema.d.js.map +1 -0
  571. package/src/py/rdb/schema.d.ts +16 -0
  572. package/src/py/rdb/schema.json +78 -0
  573. package/src/py/rdb/utils.d.ts +6 -0
  574. package/src/py/rdb/utils.js +16 -0
  575. package/src/py/rdb/utils.js.map +1 -0
  576. package/src/sdk/agentcore-gateway.d.ts +6 -0
  577. package/src/sdk/agentcore-gateway.js +7 -0
  578. package/src/sdk/agentcore-gateway.js.map +1 -0
  579. package/src/sdk/connection.d.ts +6 -0
  580. package/src/sdk/connection.js +6 -0
  581. package/src/sdk/connection.js.map +1 -0
  582. package/src/sdk/license.d.ts +8 -0
  583. package/src/sdk/license.js +7 -0
  584. package/src/sdk/license.js.map +1 -0
  585. package/src/sdk/open-api.d.ts +10 -0
  586. package/src/sdk/open-api.js +8 -0
  587. package/src/sdk/open-api.js.map +1 -0
  588. package/src/sdk/py.d.ts +18 -0
  589. package/src/sdk/py.js +12 -0
  590. package/src/sdk/py.js.map +1 -0
  591. package/src/sdk/terraform.d.ts +6 -0
  592. package/src/sdk/terraform.js +7 -0
  593. package/src/sdk/terraform.js.map +1 -0
  594. package/src/sdk/ts.d.ts +39 -0
  595. package/src/sdk/ts.js +41 -0
  596. package/src/sdk/ts.js.map +1 -0
  597. package/{sdk/utils/format.d.ts → src/sdk/utils/ast.d.ts} +1 -1
  598. package/src/sdk/utils/ast.js +6 -0
  599. package/src/sdk/utils/ast.js.map +1 -0
  600. package/{sdk/utils/ast.d.ts → src/sdk/utils/format.d.ts} +1 -2
  601. package/src/sdk/utils/format.js +6 -0
  602. package/src/sdk/utils/format.js.map +1 -0
  603. package/{sdk → src/sdk}/utils/test.d.ts +1 -1
  604. package/src/sdk/utils/test.js +6 -0
  605. package/src/sdk/utils/test.js.map +1 -0
  606. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +245 -242
  607. package/src/smithy/project/files/{smithy-build.json.template → service/smithy-build.json.template} +5 -5
  608. package/src/smithy/project/files/{src → service/src}/operations/echo.smithy.template +1 -0
  609. package/src/smithy/project/files/shapes/smithy-build.json.template +7 -0
  610. package/src/smithy/project/files/shapes/src/main.smithy.template +11 -0
  611. package/src/smithy/project/files/ssdk-bundle/ssdk.rolldown.config.mjs.template +52 -0
  612. package/src/smithy/project/generator.d.ts +90 -0
  613. package/src/smithy/project/generator.js +223 -56
  614. package/src/smithy/project/generator.js.map +1 -1
  615. package/src/smithy/project/schema.d.js +6 -0
  616. package/src/smithy/project/schema.d.js.map +1 -0
  617. package/src/smithy/project/schema.d.ts +2 -0
  618. package/src/smithy/project/schema.json +28 -1
  619. package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
  620. package/src/smithy/react-connection/generator.d.ts +15 -0
  621. package/src/smithy/react-connection/generator.js +54 -48
  622. package/src/smithy/react-connection/generator.js.map +1 -1
  623. package/src/smithy/react-connection/schema.d.js +6 -0
  624. package/src/smithy/react-connection/schema.d.js.map +1 -0
  625. package/src/smithy/react-connection/schema.d.ts +1 -0
  626. package/src/smithy/react-connection/schema.json +5 -0
  627. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +871 -109
  628. package/src/smithy/ts/api/files/handler.ts.template +3 -3
  629. package/src/smithy/ts/api/files/local-server.ts.template +3 -3
  630. package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
  631. package/src/smithy/ts/api/files/service.ts.template +3 -3
  632. package/src/smithy/ts/api/generator.d.ts +88 -0
  633. package/src/smithy/ts/api/generator.js +187 -114
  634. package/src/smithy/ts/api/generator.js.map +1 -1
  635. package/src/smithy/ts/api/schema.d.js +6 -0
  636. package/src/smithy/ts/api/schema.d.js.map +1 -0
  637. package/src/smithy/ts/api/schema.d.ts +1 -0
  638. package/src/smithy/ts/api/schema.json +6 -0
  639. package/src/terraform/project/files/application/scripts/bootstrap.ts.template +40 -1
  640. package/src/terraform/project/files/application/src/main.tf.template +6 -1
  641. package/src/terraform/project/files/application/src/providers.tf.template +1 -1
  642. package/src/terraform/project/generator.d.ts +50 -0
  643. package/src/terraform/project/generator.js +212 -111
  644. package/src/terraform/project/generator.js.map +1 -1
  645. package/src/terraform/project/schema.d.js +9 -0
  646. package/src/terraform/project/schema.d.js.map +1 -0
  647. package/src/terraform/project/schema.d.ts +1 -0
  648. package/src/terraform/project/schema.json +5 -0
  649. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +1182 -184
  650. package/src/trpc/backend/files/src/client/index.ts.template +1 -1
  651. package/src/trpc/backend/files/src/handler.ts.template +1 -1
  652. package/src/trpc/backend/files/src/index.ts.template +5 -5
  653. package/src/trpc/backend/files/src/init.ts.template +1 -1
  654. package/src/trpc/backend/files/src/local-server.ts.template +1 -1
  655. package/src/trpc/backend/files/src/middleware/index.ts.template +7 -7
  656. package/src/trpc/backend/files/src/procedures/echo.ts.template +3 -3
  657. package/src/trpc/backend/files/src/router.ts.template +2 -2
  658. package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
  659. package/src/trpc/backend/files/src/schema/index.ts.template +1 -1
  660. package/src/trpc/backend/generator.d.ts +90 -1
  661. package/src/trpc/backend/generator.js +177 -100
  662. package/src/trpc/backend/generator.js.map +1 -1
  663. package/src/trpc/backend/schema.d.js +6 -0
  664. package/src/trpc/backend/schema.d.js.map +1 -0
  665. package/src/trpc/backend/schema.d.ts +1 -0
  666. package/src/trpc/backend/schema.json +6 -0
  667. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +4 -4
  668. package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
  669. package/src/trpc/react/generator.d.ts +38 -1
  670. package/src/trpc/react/generator.js +105 -63
  671. package/src/trpc/react/generator.js.map +1 -1
  672. package/src/trpc/react/schema.d.js +6 -0
  673. package/src/trpc/react/schema.d.js.map +1 -0
  674. package/src/trpc/react/schema.d.ts +1 -0
  675. package/src/trpc/react/schema.json +5 -0
  676. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +1452 -25
  677. package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +258 -0
  678. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
  679. package/src/ts/agent/a2a-connection/generator.d.ts +46 -0
  680. package/src/ts/agent/a2a-connection/generator.js +110 -63
  681. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  682. package/src/ts/agent/a2a-connection/schema.d.js +8 -0
  683. package/src/ts/agent/a2a-connection/schema.d.js.map +1 -0
  684. package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
  685. package/src/ts/agent/a2a-connection/schema.json +5 -0
  686. package/src/ts/agent/files/a2a/index.ts.template +1 -1
  687. package/src/ts/agent/files/ag-ui/index.ts.template +36 -11
  688. package/src/ts/agent/files/common/agent.ts.template +15 -2
  689. package/src/ts/agent/files/common/session.ts.template +43 -0
  690. package/src/ts/agent/files/deploy/Dockerfile.template +13 -2
  691. package/src/ts/agent/files/http/client.ts.template +2 -2
  692. package/src/ts/agent/files/http/index.ts.template +2 -2
  693. package/src/ts/agent/files/http/router.ts.template +5 -5
  694. package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +222 -0
  695. package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
  696. package/src/ts/agent/gateway-connection/generator.d.ts +47 -0
  697. package/src/ts/agent/gateway-connection/generator.js +144 -0
  698. package/src/ts/agent/gateway-connection/generator.js.map +1 -0
  699. package/src/ts/agent/gateway-connection/schema.d.js +6 -0
  700. package/src/ts/agent/gateway-connection/schema.d.js.map +1 -0
  701. package/src/ts/agent/gateway-connection/schema.d.ts +13 -0
  702. package/src/ts/agent/gateway-connection/schema.json +31 -0
  703. package/src/ts/agent/generator.d.ts +205 -0
  704. package/src/ts/agent/generator.js +339 -156
  705. package/src/ts/agent/generator.js.map +1 -1
  706. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +194 -113
  707. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +23 -0
  708. package/src/ts/agent/mcp-connection/generator.d.ts +37 -0
  709. package/src/ts/agent/mcp-connection/generator.js +88 -65
  710. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  711. package/src/ts/agent/mcp-connection/schema.d.js +8 -0
  712. package/src/ts/agent/mcp-connection/schema.d.js.map +1 -0
  713. package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
  714. package/src/ts/agent/mcp-connection/schema.json +5 -0
  715. package/src/ts/agent/react-connection/__snapshots__/generator.spec.ts.snap +8 -4
  716. package/src/ts/agent/react-connection/files/src/components/__agentNameClassName__AgentClientProvider.tsx.template +2 -1
  717. package/src/ts/agent/react-connection/generator.d.ts +202 -1
  718. package/src/ts/agent/react-connection/generator.js +158 -99
  719. package/src/ts/agent/react-connection/generator.js.map +1 -1
  720. package/src/ts/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +2 -2
  721. package/src/ts/agent/react-connection/local-dev.js +17 -0
  722. package/src/ts/agent/react-connection/local-dev.js.map +1 -0
  723. package/src/ts/agent/react-connection/schema.d.js +8 -0
  724. package/src/ts/agent/react-connection/schema.d.js.map +1 -0
  725. package/src/ts/agent/react-connection/schema.d.ts +1 -0
  726. package/src/ts/agent/react-connection/schema.json +5 -0
  727. package/src/ts/agent/schema.d.js +6 -0
  728. package/src/ts/agent/schema.d.js.map +1 -0
  729. package/src/ts/agent/schema.d.ts +4 -0
  730. package/src/ts/agent/schema.json +14 -0
  731. package/src/ts/api/generator.js +16 -16
  732. package/src/ts/api/generator.js.map +1 -1
  733. package/src/ts/api/schema.d.js +6 -0
  734. package/src/ts/api/schema.d.js.map +1 -0
  735. package/src/ts/api/schema.d.ts +1 -0
  736. package/src/ts/api/schema.json +5 -0
  737. package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +28 -14
  738. package/src/ts/astro-docs/files/base/src/content/docs/en/index.mdx.template +2 -2
  739. package/src/ts/astro-docs/files/base/src/content.config.ts.template +4 -4
  740. package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +272 -150
  741. package/src/ts/astro-docs/generator.d.ts +38 -0
  742. package/src/ts/astro-docs/generator.js +126 -61
  743. package/src/ts/astro-docs/generator.js.map +1 -1
  744. package/src/ts/astro-docs/schema.d.js +6 -0
  745. package/src/ts/astro-docs/schema.d.js.map +1 -0
  746. package/src/ts/astro-docs/schema.d.ts +2 -2
  747. package/src/ts/astro-docs/schema.json +3 -3
  748. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +982 -0
  749. package/src/ts/dcr-proxy/generator.d.ts +34 -0
  750. package/src/ts/dcr-proxy/generator.js +115 -0
  751. package/src/ts/dcr-proxy/generator.js.map +1 -0
  752. package/src/ts/dcr-proxy/schema.d.js +6 -0
  753. package/src/ts/dcr-proxy/schema.d.js.map +1 -0
  754. package/src/ts/dcr-proxy/schema.d.ts +13 -0
  755. package/src/ts/dcr-proxy/schema.json +44 -0
  756. package/src/ts/docs/generator.js +10 -10
  757. package/src/ts/docs/generator.js.map +1 -1
  758. package/src/ts/docs/schema.d.js +6 -0
  759. package/src/ts/docs/schema.d.js.map +1 -0
  760. package/src/ts/docs/schema.d.ts +1 -4
  761. package/src/ts/docs/schema.json +3 -3
  762. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +400 -518
  763. package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +23 -5
  764. package/src/ts/dynamodb/agent-connection/generator.js +27 -23
  765. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
  766. package/src/ts/dynamodb/agent-connection/schema.d.js +8 -0
  767. package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -0
  768. package/src/ts/dynamodb/agent-connection/schema.d.ts +1 -0
  769. package/src/ts/dynamodb/agent-connection/schema.json +5 -0
  770. package/src/ts/dynamodb/files/config.json.template +24 -0
  771. package/src/ts/dynamodb/files/src/client.ts.template +30 -11
  772. package/src/ts/dynamodb/files/src/entities/example.ts.template +1 -1
  773. package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -1
  774. package/src/ts/dynamodb/files/src/index.ts.template +2 -11
  775. package/src/ts/dynamodb/generator.d.ts +41 -0
  776. package/src/ts/dynamodb/generator.js +106 -64
  777. package/src/ts/dynamodb/generator.js.map +1 -1
  778. package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +23 -5
  779. package/src/ts/dynamodb/mcp-server-connection/generator.js +27 -23
  780. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
  781. package/src/ts/dynamodb/mcp-server-connection/schema.d.js +8 -0
  782. package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  783. package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +1 -0
  784. package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
  785. package/src/ts/dynamodb/schema.d.js +6 -0
  786. package/src/ts/dynamodb/schema.d.js.map +1 -0
  787. package/src/ts/dynamodb/schema.d.ts +2 -0
  788. package/src/ts/dynamodb/schema.json +26 -2
  789. package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +12 -3
  790. package/src/ts/dynamodb/smithy-connection/generator.js +22 -22
  791. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
  792. package/src/ts/dynamodb/smithy-connection/schema.d.js +8 -0
  793. package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -0
  794. package/src/ts/dynamodb/smithy-connection/schema.d.ts +1 -0
  795. package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
  796. package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +12 -3
  797. package/src/ts/dynamodb/trpc-connection/generator.js +22 -22
  798. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
  799. package/src/ts/dynamodb/trpc-connection/schema.d.js +8 -0
  800. package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -0
  801. package/src/ts/dynamodb/trpc-connection/schema.d.ts +1 -0
  802. package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
  803. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +8 -6
  804. package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
  805. package/src/ts/lambda-function/generator.d.ts +38 -0
  806. package/src/ts/lambda-function/generator.js +98 -65
  807. package/src/ts/lambda-function/generator.js.map +1 -1
  808. package/src/ts/lambda-function/io.js +83 -52
  809. package/src/ts/lambda-function/io.js.map +1 -1
  810. package/src/ts/lambda-function/schema.d.js +6 -0
  811. package/src/ts/lambda-function/schema.d.js.map +1 -0
  812. package/src/ts/lambda-function/schema.d.ts +1 -0
  813. package/src/ts/lambda-function/schema.json +5 -0
  814. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +83 -45
  815. package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +1 -1
  816. package/src/ts/lib/biome.js +71 -35
  817. package/src/ts/lib/biome.js.map +1 -1
  818. package/src/ts/lib/generator.d.ts +7 -0
  819. package/src/ts/lib/generator.js +115 -103
  820. package/src/ts/lib/generator.js.map +1 -1
  821. package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
  822. package/src/ts/lib/schema.d.js +6 -0
  823. package/src/ts/lib/schema.d.js.map +1 -0
  824. package/src/ts/lib/schema.d.ts +1 -1
  825. package/src/ts/lib/schema.json +5 -0
  826. package/src/ts/lib/ts-project-utils.d.ts +13 -1
  827. package/src/ts/lib/ts-project-utils.js +96 -71
  828. package/src/ts/lib/ts-project-utils.js.map +1 -1
  829. package/src/ts/lib/types.d.ts +6 -0
  830. package/src/ts/lib/types.js +5 -2
  831. package/src/ts/lib/types.js.map +1 -1
  832. package/src/ts/lib/vitest.d.ts +10 -1
  833. package/src/ts/lib/vitest.js +54 -26
  834. package/src/ts/lib/vitest.js.map +1 -1
  835. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +221 -44
  836. package/src/ts/mcp-server/files/Dockerfile.template +13 -2
  837. package/src/ts/mcp-server/generator.d.ts +110 -0
  838. package/src/ts/mcp-server/generator.js +231 -148
  839. package/src/ts/mcp-server/generator.js.map +1 -1
  840. package/src/ts/mcp-server/schema.d.js +6 -0
  841. package/src/ts/mcp-server/schema.d.js.map +1 -0
  842. package/src/ts/mcp-server/schema.d.ts +1 -0
  843. package/src/ts/mcp-server/schema.json +6 -0
  844. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +28 -13
  845. package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
  846. package/src/ts/nx-generator/files/common/schema.json.template +5 -0
  847. package/src/ts/nx-generator/files/local/generator.spec.ts.template +1 -1
  848. package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
  849. package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
  850. package/src/ts/nx-generator/generator.d.ts +3 -0
  851. package/src/ts/nx-generator/generator.js +124 -73
  852. package/src/ts/nx-generator/generator.js.map +1 -1
  853. package/src/ts/nx-generator/schema.d.js +6 -0
  854. package/src/ts/nx-generator/schema.d.js.map +1 -0
  855. package/src/ts/nx-generator/schema.d.ts +1 -0
  856. package/src/ts/nx-generator/schema.json +5 -0
  857. package/src/ts/nx-migration/files/migration.spec.ts.template +26 -0
  858. package/src/ts/nx-migration/files/migration.ts.template +65 -0
  859. package/src/ts/nx-migration/files/prompt.md.template +46 -0
  860. package/src/ts/nx-migration/generator.d.ts +27 -0
  861. package/src/ts/nx-migration/generator.js +147 -0
  862. package/src/ts/nx-migration/generator.js.map +1 -0
  863. package/src/ts/nx-migration/schema.d.js +6 -0
  864. package/src/ts/nx-migration/schema.d.js.map +1 -0
  865. package/src/ts/nx-migration/schema.d.ts +13 -0
  866. package/src/ts/nx-migration/schema.json +63 -0
  867. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +36 -25
  868. package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
  869. package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
  870. package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
  871. package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
  872. package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
  873. package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
  874. package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +4 -4
  875. package/src/ts/nx-plugin/generator.d.ts +3 -0
  876. package/src/ts/nx-plugin/generator.js +67 -50
  877. package/src/ts/nx-plugin/generator.js.map +1 -1
  878. package/src/ts/nx-plugin/schema.d.js +9 -0
  879. package/src/ts/nx-plugin/schema.d.js.map +1 -0
  880. package/src/ts/nx-plugin/schema.json +5 -0
  881. package/src/ts/nx-plugin/utils.d.ts +27 -2
  882. package/src/ts/nx-plugin/utils.js +66 -51
  883. package/src/ts/nx-plugin/utils.js.map +1 -1
  884. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +553 -644
  885. package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +16 -6
  886. package/src/ts/rdb/agent-connection/generator.js +44 -39
  887. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  888. package/src/ts/rdb/agent-connection/schema.d.js +8 -0
  889. package/src/ts/rdb/agent-connection/schema.d.js.map +1 -0
  890. package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
  891. package/src/ts/rdb/agent-connection/schema.json +5 -0
  892. package/src/ts/rdb/files/Dockerfile.template +19 -1
  893. package/src/ts/rdb/files/config.json.template +14 -0
  894. package/src/ts/rdb/files/prisma.config.ts.template +6 -5
  895. package/src/ts/rdb/files/src/create-db-user-handler.ts.template +9 -11
  896. package/src/ts/rdb/files/src/index.ts.template +1 -2
  897. package/src/ts/rdb/files/src/migration-handler.ts.template +5 -30
  898. package/src/ts/rdb/files/src/prisma.ts.template +33 -25
  899. package/src/ts/rdb/files/src/utils.ts.template +3 -0
  900. package/src/ts/rdb/generator.d.ts +117 -4
  901. package/src/ts/rdb/generator.js +257 -138
  902. package/src/ts/rdb/generator.js.map +1 -1
  903. package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +16 -6
  904. package/src/ts/rdb/mcp-server-connection/generator.js +42 -37
  905. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  906. package/src/ts/rdb/mcp-server-connection/schema.d.js +8 -0
  907. package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -0
  908. package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
  909. package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
  910. package/src/ts/rdb/schema.d.js +6 -0
  911. package/src/ts/rdb/schema.d.js.map +1 -0
  912. package/src/ts/rdb/schema.d.ts +1 -0
  913. package/src/ts/rdb/schema.json +7 -1
  914. package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +18 -9
  915. package/src/ts/rdb/smithy-connection/generator.js +48 -43
  916. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  917. package/src/ts/rdb/smithy-connection/schema.d.js +8 -0
  918. package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -0
  919. package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
  920. package/src/ts/rdb/smithy-connection/schema.json +5 -0
  921. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +12 -3
  922. package/src/ts/rdb/trpc-connection/generator.js +37 -31
  923. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  924. package/src/ts/rdb/trpc-connection/schema.d.js +8 -0
  925. package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -0
  926. package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
  927. package/src/ts/rdb/trpc-connection/schema.json +5 -0
  928. package/src/ts/rdb/utils.js +9 -11
  929. package/src/ts/rdb/utils.js.map +1 -1
  930. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +17 -16
  931. package/src/ts/react-website/agui/generator.d.ts +97 -0
  932. package/src/ts/react-website/agui/generator.js +114 -67
  933. package/src/ts/react-website/agui/generator.js.map +1 -1
  934. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +1391 -644
  935. package/src/ts/react-website/app/files/app/common/README.md.template +1 -1
  936. package/src/ts/react-website/app/generator.d.ts +142 -2
  937. package/src/ts/react-website/app/generator.js +333 -209
  938. package/src/ts/react-website/app/generator.js.map +1 -1
  939. package/src/ts/react-website/app/schema.d.js +6 -0
  940. package/src/ts/react-website/app/schema.d.js.map +1 -0
  941. package/src/ts/react-website/app/schema.d.ts +1 -1
  942. package/src/ts/react-website/app/schema.json +12 -6
  943. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +161 -26
  944. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +48 -12
  945. package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
  946. package/src/ts/react-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +2 -2
  947. package/src/ts/react-website/cognito-auth/generator.d.ts +25 -1
  948. package/src/ts/react-website/cognito-auth/generator.js +79 -64
  949. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  950. package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +3 -1
  951. package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
  952. package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
  953. package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
  954. package/src/ts/react-website/cognito-auth/schema.d.js +6 -0
  955. package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -0
  956. package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
  957. package/src/ts/react-website/cognito-auth/schema.json +5 -0
  958. package/src/ts/react-website/cognito-auth/utils.js +34 -32
  959. package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
  960. package/src/ts/react-website/runtime-config/__snapshots__/generator.spec.ts.snap +2 -2
  961. package/src/ts/react-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +2 -2
  962. package/src/ts/react-website/runtime-config/generator.js +29 -31
  963. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  964. package/src/ts/react-website/runtime-config/schema.d.js +6 -0
  965. package/src/ts/react-website/runtime-config/schema.d.js.map +1 -0
  966. package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
  967. package/src/ts/react-website/runtime-config/schema.json +5 -0
  968. package/src/ts/sync/generator.js +137 -60
  969. package/src/ts/sync/generator.js.map +1 -1
  970. package/src/ts/website/app/generator.js +10 -10
  971. package/src/ts/website/app/generator.js.map +1 -1
  972. package/src/ts/website/app/schema.d.js +6 -0
  973. package/src/ts/website/app/schema.d.js.map +1 -0
  974. package/src/ts/website/app/schema.d.ts +1 -1
  975. package/src/ts/website/app/schema.json +11 -6
  976. package/src/ts/website/auth/generator.d.ts +1 -1
  977. package/src/ts/website/auth/generator.js +11 -10
  978. package/src/ts/website/auth/generator.js.map +1 -1
  979. package/src/ts/website/auth/schema.d.js +6 -0
  980. package/src/ts/website/auth/schema.d.js.map +1 -0
  981. package/src/ts/website/auth/schema.d.ts +1 -0
  982. package/src/ts/website/auth/schema.json +5 -0
  983. package/src/utils/__snapshots__/shared-constructs.spec.ts.snap +21 -0
  984. package/src/utils/add-dependencies.d.ts +38 -0
  985. package/src/utils/add-dependencies.js +83 -0
  986. package/src/utils/add-dependencies.js.map +1 -0
  987. package/src/utils/agent-chat/agent-chat.d.ts +31 -0
  988. package/src/utils/agent-chat/agent-chat.js +31 -0
  989. package/src/utils/agent-chat/agent-chat.js.map +1 -0
  990. package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
  991. package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
  992. package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
  993. package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
  994. package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
  995. package/src/utils/agent-connection/agent-connection.d.ts +139 -26
  996. package/src/utils/agent-connection/agent-connection.js +500 -103
  997. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  998. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
  999. package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
  1000. package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
  1001. package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
  1002. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
  1003. package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +33 -33
  1004. package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
  1005. package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
  1006. package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +47 -0
  1007. package/src/utils/agent-connection/files/core-strands/base/tool-errors-strands.ts.template +29 -0
  1008. package/src/utils/agent-connection/files/{core-runtime-config/with-session-id.ts.template → core-strands/base/with-session-id-strands.ts.template} +1 -1
  1009. package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
  1010. package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
  1011. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
  1012. package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
  1013. package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
  1014. package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
  1015. package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +105 -0
  1016. package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
  1017. package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
  1018. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
  1019. package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +6 -18
  1020. package/src/utils/agent-connection/files/py-core-runtime-config/session_context.py.template +2 -2
  1021. package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
  1022. package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +111 -0
  1023. package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
  1024. package/src/utils/agent-connection/files/{py-core-runtime-config/with_session_id.py.template → py-core-strands/base/with_session_id_strands.py.template} +2 -2
  1025. package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
  1026. package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
  1027. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +79 -0
  1028. package/src/utils/agent-core-constructs/agent-core-constructs.js +212 -38
  1029. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  1030. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +170 -6
  1031. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +87 -0
  1032. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.ts.template +366 -0
  1033. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +624 -0
  1034. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
  1035. package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +212 -1
  1036. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +521 -0
  1037. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
  1038. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.tf.template +282 -0
  1039. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +159 -13
  1040. package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
  1041. package/src/utils/api-constructs/api-constructs.d.ts +30 -2
  1042. package/src/utils/api-constructs/api-constructs.js +82 -32
  1043. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  1044. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +20 -15
  1045. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +24 -16
  1046. package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +26 -9
  1047. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +70 -0
  1048. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +82 -0
  1049. package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +56 -17
  1050. package/src/utils/api-constructs/files/cdk/core/api/trpc/trpc-utils.ts.template +1 -1
  1051. package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
  1052. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +101 -12
  1053. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +194 -8
  1054. package/src/utils/api-constructs/files/terraform/core/api/http/http-api/http-api.tf.template +1 -1
  1055. package/src/utils/api-constructs/files/terraform/core/api/rest/api-gateway-account/api-gateway-account.tf.template +83 -0
  1056. package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +5 -11
  1057. package/src/utils/api-constructs/open-api-metadata.js +22 -22
  1058. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  1059. package/src/utils/ast/website.js +18 -20
  1060. package/src/utils/ast/website.js.map +1 -1
  1061. package/src/utils/ast.d.ts +9 -0
  1062. package/src/utils/ast.js +125 -86
  1063. package/src/utils/ast.js.map +1 -1
  1064. package/src/utils/base-tsconfig.d.ts +30 -0
  1065. package/src/utils/base-tsconfig.js +32 -0
  1066. package/src/utils/base-tsconfig.js.map +1 -0
  1067. package/src/utils/bundle/bundle.d.ts +6 -1
  1068. package/src/utils/bundle/bundle.js +58 -48
  1069. package/src/utils/bundle/bundle.js.map +1 -1
  1070. package/src/utils/commands.d.ts +14 -3
  1071. package/src/utils/commands.js +83 -28
  1072. package/src/utils/commands.js.map +1 -1
  1073. package/src/utils/config/index.d.ts +18 -2
  1074. package/src/utils/config/index.js +5 -4
  1075. package/src/utils/config/index.js.map +1 -1
  1076. package/src/utils/config/utils.d.ts +8 -2
  1077. package/src/utils/config/utils.js +56 -59
  1078. package/src/utils/config/utils.js.map +1 -1
  1079. package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +16 -3
  1080. package/src/utils/connection/open-api/react.d.ts +31 -5
  1081. package/src/utils/connection/open-api/react.js +106 -76
  1082. package/src/utils/connection/open-api/react.js.map +1 -1
  1083. package/src/utils/containers.js +22 -23
  1084. package/src/utils/containers.js.map +1 -1
  1085. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.d.ts +38 -0
  1086. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js +93 -0
  1087. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js.map +1 -0
  1088. package/src/utils/dcr-proxy-constructs/files/cdk/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.ts.template +227 -0
  1089. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorization-server-metadata.ts.template +39 -0
  1090. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorize.ts.template +26 -0
  1091. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/mcp-proxy.ts.template +89 -0
  1092. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/protected-resource-metadata.ts.template +13 -0
  1093. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/register.ts.template +70 -0
  1094. package/src/utils/dcr-proxy-constructs/files/project/src/handlers/token.ts.template +75 -0
  1095. package/src/utils/dcr-proxy-constructs/files/terraform/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.tf.template +410 -0
  1096. package/src/utils/declared-dependencies.d.ts +140 -0
  1097. package/src/utils/declared-dependencies.js +64 -0
  1098. package/src/utils/declared-dependencies.js.map +1 -0
  1099. package/src/utils/dependencies.d.ts +18 -0
  1100. package/src/utils/dependencies.js +206 -0
  1101. package/src/utils/dependencies.js.map +1 -0
  1102. package/src/utils/docker.d.ts +89 -0
  1103. package/src/utils/docker.js +125 -0
  1104. package/src/utils/docker.js.map +1 -0
  1105. package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +1 -1
  1106. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +39 -41
  1107. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
  1108. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +18 -5
  1109. package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +1 -1
  1110. package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +24 -17
  1111. package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +1 -1
  1112. package/src/utils/files/common/constructs/src/core/cloudfront.ts.template +14 -0
  1113. package/src/utils/files/common/constructs/src/core/index.ts.template +5 -4
  1114. package/src/utils/files/common/constructs/src/index.ts.template +2 -2
  1115. package/src/utils/files/common/infra-config/src/index.ts.template +3 -3
  1116. package/src/utils/files/common/infra-config/src/resolve-stage.ts.template +2 -2
  1117. package/src/utils/files/common/infra-config/src/stages.config.ts.template +1 -1
  1118. package/src/{ts/dynamodb/files/scripts → utils/files/common/scripts/src/dynamodb}/create-local-table.ts.template +65 -31
  1119. package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
  1120. package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +103 -0
  1121. package/src/utils/files/common/scripts/src/infra/infra-deploy.ts.template +2 -0
  1122. package/src/utils/files/common/scripts/src/infra/infra-destroy.ts.template +2 -0
  1123. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +6 -3
  1124. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +3 -3
  1125. package/src/utils/files/common/scripts/src/rdb/mysql/wait-for-mysql-db.ts.template +32 -0
  1126. package/src/utils/files/common/scripts/src/rdb/postgres/wait-for-postgres-db.ts.template +32 -0
  1127. package/src/utils/files/common/scripts/src/rdb/shared/pull-image.ts.template +16 -0
  1128. package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +115 -0
  1129. package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
  1130. package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
  1131. package/src/utils/files/shadcn/components.json.template +1 -1
  1132. package/src/utils/files/terraform/src/core/asset-bucket/asset-bucket.tf.template +63 -72
  1133. package/src/utils/files/terraform/src/core/runtime-config/appconfig/appconfig.tf.template +1 -1
  1134. package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +12 -6
  1135. package/src/utils/files/terraform/src/core/runtime-config/entry/entry.tf.template +1 -1
  1136. package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +9 -4
  1137. package/src/utils/files/website/hooks/sigv4/useSigV4.tsx.template +1 -1
  1138. package/src/utils/format.d.ts +39 -4
  1139. package/src/utils/format.js +318 -198
  1140. package/src/utils/format.js.map +1 -1
  1141. package/src/utils/fs.d.ts +24 -5
  1142. package/src/utils/fs.js +40 -15
  1143. package/src/utils/fs.js.map +1 -1
  1144. package/src/utils/function-constructs/files/cdk/app/lambda-functions/__nameKebabCase__.ts.template +1 -1
  1145. package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
  1146. package/src/utils/function-constructs/function-constructs.js +22 -25
  1147. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  1148. package/src/utils/generators.js +18 -20
  1149. package/src/utils/generators.js.map +1 -1
  1150. package/src/utils/git.js +19 -34
  1151. package/src/utils/git.js.map +1 -1
  1152. package/src/utils/iac-providers.js +5 -5
  1153. package/src/utils/iac-providers.js.map +1 -1
  1154. package/src/utils/iac.js +12 -14
  1155. package/src/utils/iac.js.map +1 -1
  1156. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +153 -24
  1157. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +28 -9
  1158. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +129 -12
  1159. package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
  1160. package/src/utils/identity-constructs/identity-constructs.d.ts +10 -0
  1161. package/src/utils/identity-constructs/identity-constructs.js +52 -31
  1162. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  1163. package/src/utils/init.d.ts +72 -0
  1164. package/src/utils/init.js +300 -0
  1165. package/src/utils/init.js.map +1 -0
  1166. package/src/utils/install.d.ts +32 -0
  1167. package/src/utils/install.js +58 -0
  1168. package/src/utils/install.js.map +1 -0
  1169. package/src/utils/js.js +27 -20
  1170. package/src/utils/js.js.map +1 -1
  1171. package/src/utils/mcp.d.ts +9 -0
  1172. package/src/utils/mcp.js +42 -41
  1173. package/src/utils/mcp.js.map +1 -1
  1174. package/src/utils/metrics.d.ts +7 -1
  1175. package/src/utils/metrics.js +61 -46
  1176. package/src/utils/metrics.js.map +1 -1
  1177. package/src/utils/migration-manifest.d.ts +58 -0
  1178. package/src/utils/migration-manifest.js +76 -0
  1179. package/src/utils/migration-manifest.js.map +1 -0
  1180. package/src/utils/migration-versions.d.ts +145 -0
  1181. package/src/utils/migration-versions.js +250 -0
  1182. package/src/utils/migration-versions.js.map +1 -0
  1183. package/src/utils/mock-project-graph.js +8 -12
  1184. package/src/utils/mock-project-graph.js.map +1 -1
  1185. package/src/utils/module-format.d.ts +25 -0
  1186. package/src/utils/module-format.js +45 -0
  1187. package/src/utils/module-format.js.map +1 -0
  1188. package/src/utils/names.d.ts +22 -0
  1189. package/src/utils/names.js +44 -48
  1190. package/src/utils/names.js.map +1 -1
  1191. package/src/utils/npm-scope.d.ts +0 -4
  1192. package/src/utils/npm-scope.js +7 -20
  1193. package/src/utils/npm-scope.js.map +1 -1
  1194. package/src/utils/nx.d.ts +74 -3
  1195. package/src/utils/nx.js +196 -75
  1196. package/src/utils/nx.js.map +1 -1
  1197. package/src/utils/nxlv-python.js +27 -15
  1198. package/src/utils/nxlv-python.js.map +1 -1
  1199. package/src/utils/object.js +5 -11
  1200. package/src/utils/object.js.map +1 -1
  1201. package/src/utils/paths.js +11 -15
  1202. package/src/utils/paths.js.map +1 -1
  1203. package/src/utils/pkg-manager.js +4 -9
  1204. package/src/utils/pkg-manager.js.map +1 -1
  1205. package/src/utils/pnpm-workspace.d.ts +1 -12
  1206. package/src/utils/pnpm-workspace.js +16 -43
  1207. package/src/utils/pnpm-workspace.js.map +1 -1
  1208. package/src/utils/port.d.ts +28 -6
  1209. package/src/utils/port.js +67 -28
  1210. package/src/utils/port.js.map +1 -1
  1211. package/src/utils/project-package-json.d.ts +39 -0
  1212. package/src/utils/project-package-json.js +119 -0
  1213. package/src/utils/project-package-json.js.map +1 -0
  1214. package/src/utils/py.d.ts +17 -3
  1215. package/src/utils/py.js +73 -48
  1216. package/src/utils/py.js.map +1 -1
  1217. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +72 -18
  1218. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +112 -88
  1219. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +127 -53
  1220. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +60 -53
  1221. package/src/utils/rdb-constructs/rdb-constructs.d.ts +12 -1
  1222. package/src/utils/rdb-constructs/rdb-constructs.js +38 -41
  1223. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  1224. package/src/utils/ruff.d.ts +59 -0
  1225. package/src/utils/ruff.js +140 -0
  1226. package/src/utils/ruff.js.map +1 -0
  1227. package/src/utils/shared-constructs-constants.d.ts +46 -4
  1228. package/src/utils/shared-constructs-constants.js +50 -15
  1229. package/src/utils/shared-constructs-constants.js.map +1 -1
  1230. package/src/utils/shared-constructs.d.ts +4 -1
  1231. package/src/utils/shared-constructs.js +62 -67
  1232. package/src/utils/shared-constructs.js.map +1 -1
  1233. package/src/utils/shared-dynamodb-scripts.d.ts +18 -0
  1234. package/src/utils/shared-dynamodb-scripts.js +35 -0
  1235. package/src/utils/shared-dynamodb-scripts.js.map +1 -0
  1236. package/src/utils/shared-infra-config.js +31 -30
  1237. package/src/utils/shared-infra-config.js.map +1 -1
  1238. package/src/utils/shared-infra-scripts.d.ts +26 -0
  1239. package/src/utils/shared-infra-scripts.js +58 -0
  1240. package/src/utils/shared-infra-scripts.js.map +1 -0
  1241. package/src/utils/shared-rdb-scripts.d.ts +27 -0
  1242. package/src/utils/shared-rdb-scripts.js +59 -0
  1243. package/src/utils/shared-rdb-scripts.js.map +1 -0
  1244. package/src/utils/shared-scripts.d.ts +1 -4
  1245. package/src/utils/shared-scripts.js +12 -38
  1246. package/src/utils/shared-scripts.js.map +1 -1
  1247. package/src/utils/shared-shadcn.d.ts +26 -1
  1248. package/src/utils/shared-shadcn.js +93 -67
  1249. package/src/utils/shared-shadcn.js.map +1 -1
  1250. package/src/utils/smithy.d.ts +59 -0
  1251. package/src/utils/smithy.js +73 -0
  1252. package/src/utils/smithy.js.map +1 -0
  1253. package/src/utils/test-git.d.ts +39 -0
  1254. package/src/utils/test-git.js +117 -0
  1255. package/src/utils/test-git.js.map +1 -0
  1256. package/src/utils/test.d.ts +10 -0
  1257. package/src/utils/test.js +44 -25
  1258. package/src/utils/test.js.map +1 -1
  1259. package/src/utils/toml.d.ts +5 -0
  1260. package/src/utils/toml.js +17 -15
  1261. package/src/utils/toml.js.map +1 -1
  1262. package/src/utils/version-upgrade-migration/migration.d.ts +14 -0
  1263. package/src/utils/version-upgrade-migration/migration.js +16 -0
  1264. package/src/utils/version-upgrade-migration/migration.js.map +1 -0
  1265. package/src/utils/version-upgrade-migration/nx-package-updates.d.ts +45 -0
  1266. package/src/utils/version-upgrade-migration/nx-package-updates.js +50 -0
  1267. package/src/utils/version-upgrade-migration/nx-package-updates.js.map +1 -0
  1268. package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +76 -0
  1269. package/src/utils/version-upgrade-migration/owned-dependencies.js +146 -0
  1270. package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -0
  1271. package/src/utils/version-upgrade-migration/register.d.ts +29 -0
  1272. package/src/utils/version-upgrade-migration/register.js +42 -0
  1273. package/src/utils/version-upgrade-migration/register.js.map +1 -0
  1274. package/src/utils/version-upgrade-migration/sync-embedded-versions.d.ts +26 -0
  1275. package/src/utils/version-upgrade-migration/sync-embedded-versions.js +352 -0
  1276. package/src/utils/version-upgrade-migration/sync-embedded-versions.js.map +1 -0
  1277. package/src/utils/version-upgrade-migration/sync-metrics-version.d.ts +13 -0
  1278. package/src/utils/version-upgrade-migration/sync-metrics-version.js +33 -0
  1279. package/src/utils/version-upgrade-migration/sync-metrics-version.js.map +1 -0
  1280. package/src/utils/version-upgrade-migration/sync-vended-versions.d.ts +10 -0
  1281. package/src/utils/version-upgrade-migration/sync-vended-versions.js +518 -0
  1282. package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -0
  1283. package/src/utils/version-upgrade-migration/vended-upgrade.d.ts +14 -0
  1284. package/src/utils/version-upgrade-migration/vended-upgrade.js +40 -0
  1285. package/src/utils/version-upgrade-migration/vended-upgrade.js.map +1 -0
  1286. package/src/utils/versions.d.ts +240 -108
  1287. package/src/utils/versions.js +265 -121
  1288. package/src/utils/versions.js.map +1 -1
  1289. package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +2 -2
  1290. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +207 -41
  1291. package/src/utils/website-constructs/files/terraform/app/static-websites/__websiteNameKebabCase__/__websiteNameKebabCase__.tf.template +1 -1
  1292. package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +145 -93
  1293. package/src/utils/website-constructs/website-constructs.d.ts +11 -0
  1294. package/src/utils/website-constructs/website-constructs.js +49 -30
  1295. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  1296. package/bin/aws-nx-mcp.d.ts +0 -2
  1297. package/bin/aws-nx-mcp.js +0 -17
  1298. package/bin/aws-nx-mcp.js.map +0 -1
  1299. package/sdk/connection.d.ts +0 -6
  1300. package/sdk/connection.js +0 -10
  1301. package/sdk/connection.js.map +0 -1
  1302. package/sdk/license.d.ts +0 -8
  1303. package/sdk/license.js +0 -13
  1304. package/sdk/license.js.map +0 -1
  1305. package/sdk/open-api.d.ts +0 -10
  1306. package/sdk/open-api.js +0 -15
  1307. package/sdk/open-api.js.map +0 -1
  1308. package/sdk/py.d.ts +0 -14
  1309. package/sdk/py.js +0 -18
  1310. package/sdk/py.js.map +0 -1
  1311. package/sdk/terraform.d.ts +0 -6
  1312. package/sdk/terraform.js +0 -11
  1313. package/sdk/terraform.js.map +0 -1
  1314. package/sdk/ts.d.ts +0 -29
  1315. package/sdk/ts.js +0 -47
  1316. package/sdk/ts.js.map +0 -1
  1317. package/sdk/utils/ast.js +0 -12
  1318. package/sdk/utils/ast.js.map +0 -1
  1319. package/sdk/utils/format.js +0 -10
  1320. package/sdk/utils/format.js.map +0 -1
  1321. package/sdk/utils/test.js +0 -10
  1322. package/sdk/utils/test.js.map +0 -1
  1323. package/src/connection/agent-serve-local.d.ts +0 -33
  1324. package/src/connection/agent-serve-local.js +0 -48
  1325. package/src/connection/agent-serve-local.js.map +0 -1
  1326. package/src/connection/serve-local.js +0 -41
  1327. package/src/connection/serve-local.js.map +0 -1
  1328. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
  1329. package/src/py/agent/files/ag-ui/main.py.template +0 -37
  1330. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
  1331. package/src/py/agent/react-connection/serve-local.js +0 -30
  1332. package/src/py/agent/react-connection/serve-local.js.map +0 -1
  1333. package/src/py/agent/scripts/http/chat.ts.template +0 -38
  1334. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
  1335. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
  1336. package/src/ts/agent/react-connection/serve-local.js +0 -19
  1337. package/src/ts/agent/react-connection/serve-local.js.map +0 -1
  1338. package/src/ts/agent/scripts/http/chat.ts.template +0 -35
  1339. package/src/ts/dynamodb/files/scripts/pull-image.ts.template +0 -15
  1340. package/src/ts/dynamodb/files/scripts/start-container.ts.template +0 -81
  1341. package/src/ts/dynamodb/files/src/constants.ts.template +0 -9
  1342. package/src/ts/dynamodb/files/src/gsi.ts.template +0 -14
  1343. package/src/ts/rdb/files/scripts/pull-image.ts.template +0 -15
  1344. package/src/ts/rdb/files/scripts/start-container.ts.template +0 -84
  1345. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
  1346. package/src/ts/rdb/files/src/constants.ts.template +0 -8
  1347. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
  1348. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
  1349. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
  1350. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
  1351. package/src/utils/files/common/scripts/src/infra-deploy.ts.template +0 -2
  1352. package/src/utils/files/common/scripts/src/infra-destroy.ts.template +0 -2
  1353. package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
  1354. /package/src/py/agent/files/{common → strands/common}/__init__.py.template +0 -0
  1355. /package/src/smithy/project/files/{src → service/src}/main.smithy.template +0 -0
  1356. /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
  1357. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
  1358. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
@@ -21,8 +21,8 @@ export default defineConfig(() => ({
21
21
  },
22
22
  plugins: [
23
23
  tanstackRouter({
24
- routesDirectory: resolve(__dirname, 'src/routes'),
25
- generatedRouteTree: resolve(__dirname, 'src/routeTree.gen.ts'),
24
+ routesDirectory: resolve(import.meta.dirname, 'src/routes'),
25
+ generatedRouteTree: resolve(import.meta.dirname, 'src/routeTree.gen.ts'),
26
26
  }),
27
27
  react(),
28
28
  tailwindcss(),
@@ -32,7 +32,7 @@ export default defineConfig(() => ({
32
32
  // plugins: [],
33
33
  // },
34
34
  build: {
35
- outDir: '../dist/test-app',
35
+ outDir: '../dist/test-app/bundle',
36
36
  emptyOutDir: true,
37
37
  reportCompressedSize: true,
38
38
  commonjsOptions: {
@@ -52,7 +52,7 @@ export default defineConfig(() => ({
52
52
  provider: 'v8' as const,
53
53
  },
54
54
  },
55
- resolve: { tsconfigPaths: true },
55
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
56
56
  define: { global: {} },
57
57
  }));
58
58
  "
@@ -78,8 +78,8 @@ export default defineConfig(() => ({
78
78
  },
79
79
  plugins: [
80
80
  tanstackRouter({
81
- routesDirectory: resolve(__dirname, 'src/routes'),
82
- generatedRouteTree: resolve(__dirname, 'src/routeTree.gen.ts'),
81
+ routesDirectory: resolve(import.meta.dirname, 'src/routes'),
82
+ generatedRouteTree: resolve(import.meta.dirname, 'src/routeTree.gen.ts'),
83
83
  }),
84
84
  react(),
85
85
  ],
@@ -88,7 +88,7 @@ export default defineConfig(() => ({
88
88
  // plugins: [],
89
89
  // },
90
90
  build: {
91
- outDir: '../dist/test-app',
91
+ outDir: '../dist/test-app/bundle',
92
92
  emptyOutDir: true,
93
93
  reportCompressedSize: true,
94
94
  commonjsOptions: {
@@ -108,7 +108,7 @@ export default defineConfig(() => ({
108
108
  provider: 'v8' as const,
109
109
  },
110
110
  },
111
- resolve: { tsconfigPaths: true },
111
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
112
112
  define: { global: {} },
113
113
  }));
114
114
  "
@@ -131,12 +131,12 @@ exports[`react-website generator > TailwindCSS integration > terraform iac > sho
131
131
  required_providers {
132
132
  aws = {
133
133
  source = "hashicorp/aws"
134
- version = "~> 6.0"
134
+ version = "6.60.0"
135
135
  configuration_aliases = [aws.us_east_1]
136
136
  }
137
137
  random = {
138
138
  source = "hashicorp/random"
139
- version = "~> 3.1"
139
+ version = "3.9.0"
140
140
  }
141
141
  }
142
142
  }
@@ -152,6 +152,31 @@ variable "website_file_path" {
152
152
  type = string
153
153
  }
154
154
 
155
+ variable "custom_domain_names" {
156
+ description = "Custom domain names (aliases) for the CloudFront distribution. Requires acm_certificate_arn."
157
+ type = list(string)
158
+ default = []
159
+ }
160
+
161
+ variable "acm_certificate_arn" {
162
+ description = "ARN of an ACM certificate (in us-east-1) for the custom domain names. When set, viewers are required to use TLS 1.2 or later."
163
+ type = string
164
+ default = null
165
+ }
166
+
167
+ # Content-Security-Policy enforced on all responses. Restricts scripts and
168
+ # framing to mitigate XSS and clickjacking, while permitting HTTPS/WSS calls
169
+ # (connect-src) to AWS service endpoints such as API Gateway, Cognito and
170
+ # Bedrock AgentCore which are only known at deploy time. Edit this to tighten
171
+ # connect-src to your specific origins once they are known.
172
+ locals {
173
+ content_security_policy = "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self' https: wss:; object-src 'none'; base-uri 'self'; frame-ancestors 'none'"
174
+
175
+ # Delivery source/destination names have a 60 character maximum. Truncate the
176
+ # website name so the longest delivery name stays within the limit.
177
+ access_logs_name_prefix = substr(lower(var.website_name), 0, 16)
178
+ }
179
+
155
180
 
156
181
  # Data sources
157
182
  data "aws_caller_identity" "current" {}
@@ -188,6 +213,26 @@ resource "aws_kms_key" "website_key" {
188
213
  ]
189
214
  Resource = "*"
190
215
  },
216
+ {
217
+ Sid = "AllowCloudWatchLogs"
218
+ Effect = "Allow"
219
+ Principal = {
220
+ Service = "logs.\${data.aws_region.current.region}.amazonaws.com"
221
+ }
222
+ Action = [
223
+ "kms:Encrypt",
224
+ "kms:Decrypt",
225
+ "kms:ReEncrypt*",
226
+ "kms:GenerateDataKey*",
227
+ "kms:DescribeKey"
228
+ ]
229
+ Resource = "*"
230
+ Condition = {
231
+ ArnLike = {
232
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:*"
233
+ }
234
+ }
235
+ },
191
236
  {
192
237
  Sid = "AllowCloudFrontServicePrincipalSSE-KMS"
193
238
  Effect = "Allow"
@@ -219,18 +264,12 @@ resource "aws_kms_alias" "website_key_alias" {
219
264
  target_key_id = aws_kms_key.website_key.key_id
220
265
  }
221
266
 
222
- # Access Logs Bucket
223
- resource "aws_s3_bucket" "access_logs" {
224
- #checkov:skip=CKV2_AWS_61:Lifecycle configuration not required for access logs bucket
225
- #checkov:skip=CKV_AWS_144:Cross-region replication not required for access logs
226
- #checkov:skip=CKV2_AWS_62:Event notifications not required for access logs bucket
227
- #checkov:skip=CKV_AWS_21:Versioning disabled for access logs to reduce storage costs
228
- bucket = "\${lower(var.website_name)}-access-logs-\${random_id.bucket_suffix.hex}"
229
- force_destroy = true
230
-
231
- tags = {
232
- Name = "\${lower(var.website_name)}-access-logs"
233
- }
267
+ # CloudWatch log group receiving S3 server access logs for the website and
268
+ # distribution log buckets.
269
+ resource "aws_cloudwatch_log_group" "access_logs" {
270
+ name = "/aws/s3/\${lower(var.website_name)}-access-logs-\${random_id.bucket_suffix.hex}"
271
+ retention_in_days = 365
272
+ kms_key_id = aws_kms_key.website_key.arn
234
273
  }
235
274
 
236
275
  resource "random_id" "unique_suffix" {
@@ -241,63 +280,12 @@ resource "random_id" "bucket_suffix" {
241
280
  byte_length = 8
242
281
  }
243
282
 
244
- resource "aws_s3_bucket_versioning" "access_logs_versioning" {
245
- bucket = aws_s3_bucket.access_logs.id
246
- versioning_configuration {
247
- status = "Disabled"
248
- }
249
- }
250
-
251
- resource "aws_s3_bucket_server_side_encryption_configuration" "access_logs_encryption" {
252
- bucket = aws_s3_bucket.access_logs.id
253
-
254
- rule {
255
- apply_server_side_encryption_by_default {
256
- kms_master_key_id = aws_kms_key.website_key.arn
257
- sse_algorithm = "aws:kms"
258
- }
259
- }
260
- }
261
-
262
- resource "aws_s3_bucket_public_access_block" "access_logs_pab" {
263
- bucket = aws_s3_bucket.access_logs.id
264
-
265
- block_public_acls = true
266
- block_public_policy = true
267
- ignore_public_acls = true
268
- restrict_public_buckets = true
269
- }
270
-
271
- resource "aws_s3_bucket_policy" "access_logs_ssl_policy" {
272
- bucket = aws_s3_bucket.access_logs.id
273
-
274
- policy = jsonencode({
275
- Version = "2012-10-17"
276
- Statement = [
277
- {
278
- Sid = "DenyInsecureConnections"
279
- Effect = "Deny"
280
- Principal = "*"
281
- Action = "s3:*"
282
- Resource = [
283
- aws_s3_bucket.access_logs.arn,
284
- "\${aws_s3_bucket.access_logs.arn}/*"
285
- ]
286
- Condition = {
287
- Bool = {
288
- "aws:SecureTransport" = "false"
289
- }
290
- }
291
- }
292
- ]
293
- })
294
- }
295
-
296
283
  # Website Bucket
297
284
  resource "aws_s3_bucket" "website" {
298
285
  #checkov:skip=CKV2_AWS_61:Lifecycle configuration not required for static website content
299
286
  #checkov:skip=CKV_AWS_144:Cross-region replication not required for static website
300
287
  #checkov:skip=CKV2_AWS_62:Event notifications not required for static website bucket
288
+ #checkov:skip=CKV_AWS_18:Server access logs are delivered to CloudWatch Logs (see aws_cloudwatch_log_delivery.website)
301
289
  bucket = "\${lower(var.website_name)}-website-\${random_id.bucket_suffix.hex}"
302
290
  force_destroy = true
303
291
 
@@ -341,20 +329,35 @@ resource "aws_s3_bucket_ownership_controls" "website_ownership" {
341
329
  }
342
330
  }
343
331
 
344
- resource "aws_s3_bucket_logging" "website_logging" {
345
- bucket = aws_s3_bucket.website.id
332
+ # Deliver the website bucket's server access logs to CloudWatch Logs.
333
+ resource "aws_cloudwatch_log_delivery_source" "website" {
334
+ name = "\${local.access_logs_name_prefix}-website-logs-\${random_id.bucket_suffix.hex}"
335
+ log_type = "S3_SERVER_ACCESS_LOGS"
336
+ resource_arn = aws_s3_bucket.website.arn
337
+ }
346
338
 
347
- target_bucket = aws_s3_bucket.access_logs.id
348
- target_prefix = "website-access-logs/"
339
+ resource "aws_cloudwatch_log_delivery_destination" "access_logs" {
340
+ name = "\${local.access_logs_name_prefix}-access-logs-\${random_id.bucket_suffix.hex}"
341
+
342
+ delivery_destination_configuration {
343
+ destination_resource_arn = aws_cloudwatch_log_group.access_logs.arn
344
+ }
345
+ }
346
+
347
+ resource "aws_cloudwatch_log_delivery" "website" {
348
+ delivery_source_name = aws_cloudwatch_log_delivery_source.website.name
349
+ delivery_destination_arn = aws_cloudwatch_log_delivery_destination.access_logs.arn
349
350
  }
350
351
 
351
352
 
352
- # Distribution Log Bucket
353
+ # Distribution Log Bucket — holds CloudFront standard access logs (CloudFront
354
+ # delivers only to S3). Its own S3 server access logs go to CloudWatch Logs.
353
355
  resource "aws_s3_bucket" "distribution_logs" {
354
356
  #checkov:skip=CKV2_AWS_61:Lifecycle configuration not required for CloudFront logs
355
357
  #checkov:skip=CKV_AWS_144:Cross-region replication not required for CloudFront logs
356
358
  #checkov:skip=CKV2_AWS_62:Event notifications not required for CloudFront logs bucket
357
359
  #checkov:skip=CKV_AWS_21:Versioning not required for CloudFront access logs
360
+ #checkov:skip=CKV_AWS_18:Server access logs are delivered to CloudWatch Logs (see aws_cloudwatch_log_delivery.distribution_logs)
358
361
  bucket = "\${lower(var.website_name)}-distribution-logs-\${random_id.bucket_suffix.hex}"
359
362
  force_destroy = true
360
363
 
@@ -400,11 +403,16 @@ resource "aws_s3_bucket_acl" "distribution_logs_acl" {
400
403
  depends_on = [aws_s3_bucket_ownership_controls.distribution_logs_ownership]
401
404
  }
402
405
 
403
- resource "aws_s3_bucket_logging" "distribution_logs_logging" {
404
- bucket = aws_s3_bucket.distribution_logs.id
406
+ # Deliver the distribution log bucket's server access logs to CloudWatch Logs.
407
+ resource "aws_cloudwatch_log_delivery_source" "distribution_logs" {
408
+ name = "\${local.access_logs_name_prefix}-distribution-logs-\${random_id.bucket_suffix.hex}"
409
+ log_type = "S3_SERVER_ACCESS_LOGS"
410
+ resource_arn = aws_s3_bucket.distribution_logs.arn
411
+ }
405
412
 
406
- target_bucket = aws_s3_bucket.access_logs.id
407
- target_prefix = "distribution-access-logs/"
413
+ resource "aws_cloudwatch_log_delivery" "distribution_logs" {
414
+ delivery_source_name = aws_cloudwatch_log_delivery_source.distribution_logs.name
415
+ delivery_destination_arn = aws_cloudwatch_log_delivery_destination.access_logs.arn
408
416
  }
409
417
 
410
418
  resource "aws_s3_bucket_policy" "distribution_logs_ssl_policy" {
@@ -512,13 +520,42 @@ resource "aws_cloudfront_origin_access_control" "website_oac" {
512
520
  signing_protocol = "sigv4"
513
521
  }
514
522
 
523
+ # Security headers applied to all responses.
524
+ resource "aws_cloudfront_response_headers_policy" "website" {
525
+ name = "\${aws_s3_bucket.website.bucket}-security-headers"
526
+
527
+ security_headers_config {
528
+ strict_transport_security {
529
+ access_control_max_age_sec = 63072000
530
+ include_subdomains = true
531
+ preload = true
532
+ override = true
533
+ }
534
+ content_type_options {
535
+ override = true
536
+ }
537
+ frame_options {
538
+ frame_option = "DENY"
539
+ override = true
540
+ }
541
+ referrer_policy {
542
+ referrer_policy = "strict-origin-when-cross-origin"
543
+ override = true
544
+ }
545
+ content_security_policy {
546
+ content_security_policy = local.content_security_policy
547
+ override = true
548
+ }
549
+ }
550
+ }
551
+
515
552
  # CloudFront Distribution
516
553
  resource "aws_cloudfront_distribution" "website" {
554
+ # See https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistValuesGeneral.html
517
555
  #checkov:skip=CKV_AWS_174:Using CloudFront default certificate which does not support TLS v1.2
518
556
  #checkov:skip=CKV_AWS_310:Origin failover not required for single S3 origin static website
519
557
  #checkov:skip=CKV_AWS_374:Geo restrictions not required for global web application
520
558
  #checkov:skip=CKV2_AWS_42:Custom SSL certificate not required for development - using CloudFront default
521
- #checkov:skip=CKV2_AWS_32:Response headers policy not required for basic static website
522
559
  #checkov:skip=CKV2_AWS_47:WAF includes AWSManagedRulesKnownBadInputsRuleSet which provides Log4j protection
523
560
  origin {
524
561
  domain_name = aws_s3_bucket.website.bucket_regional_domain_name
@@ -530,6 +567,7 @@ resource "aws_cloudfront_distribution" "website" {
530
567
  is_ipv6_enabled = true
531
568
  default_root_object = "index.html"
532
569
  web_acl_id = aws_wafv2_web_acl.cloudfront_waf.arn
570
+ aliases = var.custom_domain_names
533
571
 
534
572
  logging_config {
535
573
  include_cookies = false
@@ -548,11 +586,12 @@ resource "aws_cloudfront_distribution" "website" {
548
586
  }
549
587
  }
550
588
 
551
- viewer_protocol_policy = "redirect-to-https"
552
- min_ttl = 0
553
- default_ttl = 3600
554
- max_ttl = 86400
555
- compress = true
589
+ viewer_protocol_policy = "redirect-to-https"
590
+ response_headers_policy_id = aws_cloudfront_response_headers_policy.website.id
591
+ min_ttl = 0
592
+ default_ttl = 3600
593
+ max_ttl = 86400
594
+ compress = true
556
595
  }
557
596
 
558
597
  # Custom error responses for SPA routing
@@ -575,7 +614,10 @@ resource "aws_cloudfront_distribution" "website" {
575
614
  }
576
615
 
577
616
  viewer_certificate {
578
- cloudfront_default_certificate = true
617
+ cloudfront_default_certificate = var.acm_certificate_arn == null
618
+ acm_certificate_arn = var.acm_certificate_arn
619
+ ssl_support_method = var.acm_certificate_arn == null ? null : "sni-only"
620
+ minimum_protocol_version = var.acm_certificate_arn == null ? "TLSv1" : "TLSv1.2_2021"
579
621
  }
580
622
 
581
623
  tags = {
@@ -656,8 +698,8 @@ resource "null_resource" "upload_website_files" {
656
698
 
657
699
  provisioner "local-exec" {
658
700
  command = <<-EOT
659
- cd "\${path.root}"
660
- uv run --with boto3 python3 -c "
701
+ cd "$ROOT_PATH"
702
+ uv run --with boto3==1.43.67 python3 -c "
661
703
  import os
662
704
  import sys
663
705
  import boto3
@@ -745,9 +787,14 @@ def sync_to_s3(local_path, bucket_name):
745
787
  sys.exit(1)
746
788
 
747
789
  # Execute sync
748
- sync_to_s3('\${var.website_file_path}', '\${aws_s3_bucket.website.bucket}')
790
+ sync_to_s3(os.environ['WEBSITE_FILE_PATH'], os.environ['BUCKET_NAME'])
749
791
  "
750
792
  EOT
793
+ environment = {
794
+ ROOT_PATH = path.root
795
+ WEBSITE_FILE_PATH = var.website_file_path
796
+ BUCKET_NAME = aws_s3_bucket.website.bucket
797
+ }
751
798
  }
752
799
 
753
800
  depends_on = [aws_s3_bucket_policy.website_cloudfront_policy]
@@ -755,11 +802,12 @@ sync_to_s3('\${var.website_file_path}', '\${aws_s3_bucket.website.bucket}')
755
802
 
756
803
  # Upload runtime config file
757
804
  resource "aws_s3_object" "runtime_config" {
758
- bucket = aws_s3_bucket.website.id
759
- key = "runtime-config.json"
760
- content = module.runtime_config_reader.config_json
761
- content_type = "application/json"
762
- etag = md5(module.runtime_config_reader.config_json)
805
+ bucket = aws_s3_bucket.website.id
806
+ key = "runtime-config.json"
807
+ content = module.runtime_config_reader.config_json
808
+ content_type = "application/json"
809
+ cache_control = "no-cache"
810
+ etag = md5(module.runtime_config_reader.config_json)
763
811
 
764
812
  depends_on = [null_resource.upload_website_files]
765
813
  }
@@ -774,8 +822,9 @@ resource "null_resource" "cloudfront_invalidation" {
774
822
 
775
823
  provisioner "local-exec" {
776
824
  command = <<-EOT
777
- uv run --with boto3 python3 -c "
825
+ uv run --with boto3==1.43.67 python3 -c "
778
826
  import boto3
827
+ import os
779
828
  import sys
780
829
  from botocore.exceptions import ClientError, NoCredentialsError
781
830
 
@@ -797,7 +846,7 @@ def create_invalidation(distribution_id):
797
846
 
798
847
  invalidation_id = response['Invalidation']['Id']
799
848
  print(f'CloudFront cache invalidation created: {invalidation_id}')
800
- print(f'Distribution: \${aws_cloudfront_distribution.website.id}')
849
+ print(f'Distribution: {distribution_id}')
801
850
  print(f'Status: {response[\\"Invalidation\\"][\\"Status\\"]}')
802
851
 
803
852
  except NoCredentialsError:
@@ -811,9 +860,12 @@ def create_invalidation(distribution_id):
811
860
  sys.exit(1)
812
861
 
813
862
  # Execute invalidation
814
- create_invalidation('\${aws_cloudfront_distribution.website.id}')
863
+ create_invalidation(os.environ['DISTRIBUTION_ID'])
815
864
  "
816
865
  EOT
866
+ environment = {
867
+ DISTRIBUTION_ID = aws_cloudfront_distribution.website.id
868
+ }
817
869
  }
818
870
 
819
871
  depends_on = [
@@ -856,7 +908,7 @@ output "waf_web_acl_arn" {
856
908
  required_providers {
857
909
  aws = {
858
910
  source = "hashicorp/aws"
859
- version = "~> 6.0"
911
+ version = "6.60.0"
860
912
  configuration_aliases = [aws.us_east_1]
861
913
  }
862
914
  }
@@ -909,7 +961,7 @@ exports[`react-website generator > Tanstack router integration > should generate
909
961
 
910
962
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > biome.json 1`] = `
911
963
  "{
912
- "$schema": "https://biomejs.dev/schemas/2.4.16/schema.json",
964
+ "$schema": "https://biomejs.dev/schemas/2.5.7/schema.json",
913
965
  "root": true,
914
966
  "formatter": {
915
967
  "enabled": true,
@@ -921,6 +973,9 @@ exports[`react-website generator > Tanstack router integration > should generate
921
973
  "formatter": {
922
974
  "quoteStyle": "single",
923
975
  "trailingCommas": "all"
976
+ },
977
+ "resolver": {
978
+ "experimentalPnpmCatalogs": true
924
979
  }
925
980
  },
926
981
  "css": {
@@ -934,9 +989,9 @@ exports[`react-website generator > Tanstack router integration > should generate
934
989
  "linter": {
935
990
  "enabled": true,
936
991
  "rules": {
937
- "recommended": false,
992
+ "preset": "none",
938
993
  "correctness": {
939
- "noUndeclaredDependencies": "warn"
994
+ "noUndeclaredDependencies": "error"
940
995
  }
941
996
  }
942
997
  },
@@ -955,9 +1010,29 @@ exports[`react-website generator > Tanstack router integration > should generate
955
1010
  "!**/node_modules",
956
1011
  "!**/.nx",
957
1012
  "!**/.venv",
958
- "!**/*.css"
1013
+ "!**/.grit",
1014
+ "!**/*.css",
1015
+ "!**/*.gen.*",
1016
+ "!**/generated/**",
1017
+ "!**/tsconfig*.json"
959
1018
  ]
960
- }
1019
+ },
1020
+ "overrides": [
1021
+ {
1022
+ "includes": [
1023
+ "**/*.config.{ts,mts,cts,js,mjs,cjs}",
1024
+ "**/*.{spec,test}.{ts,tsx,mts,cts,js,jsx,mjs,cjs}",
1025
+ "**/*.stories.{ts,tsx}"
1026
+ ],
1027
+ "linter": {
1028
+ "rules": {
1029
+ "correctness": {
1030
+ "noUndeclaredDependencies": "off"
1031
+ }
1032
+ }
1033
+ }
1034
+ }
1035
+ ]
961
1036
  }
962
1037
  "
963
1038
  `;
@@ -970,35 +1045,66 @@ exports[`react-website generator > Tanstack router integration > should generate
970
1045
  "targetDefaults": {
971
1046
  "build": {
972
1047
  "cache": true,
973
- "dependsOn": ["^build"],
974
1048
  "inputs": ["default"]
975
1049
  },
976
1050
  "lint": {
977
1051
  "cache": true
978
1052
  },
979
- "@nx/vite:build": {
980
- "cache": true,
1053
+ "test": {
981
1054
  "dependsOn": ["^build"],
982
- "inputs": ["default", "^default"]
1055
+ "inputs": ["default"]
983
1056
  },
984
1057
  "@nx/vitest:test": {
985
1058
  "cache": true,
986
- "inputs": ["default", "^default"],
1059
+ "inputs": ["default", "^production"],
987
1060
  "configurations": {
988
1061
  "update-snapshot": {
989
1062
  "args": "--update"
990
1063
  }
991
1064
  }
992
1065
  },
993
- "test": {
994
- "dependsOn": ["^build"],
995
- "inputs": ["default"]
996
- },
997
1066
  "compile": {
998
1067
  "cache": true,
999
1068
  "inputs": ["default"]
1000
1069
  }
1001
1070
  },
1071
+ "plugins": [
1072
+ {
1073
+ "plugin": "@nx/js/typescript",
1074
+ "options": {
1075
+ "typecheck": {
1076
+ "targetName": "typecheck"
1077
+ },
1078
+ "build": {
1079
+ "targetName": "compile",
1080
+ "configName": "tsconfig.lib.json",
1081
+ "buildDepsName": "build-deps",
1082
+ "watchDepsName": "watch-deps"
1083
+ }
1084
+ }
1085
+ },
1086
+ {
1087
+ "plugin": "@nx/vite/plugin",
1088
+ "options": {
1089
+ "buildTargetName": "bundle",
1090
+ "serveTargetName": "serve",
1091
+ "devTargetName": "serve",
1092
+ "previewTargetName": "preview",
1093
+ "serveStaticTargetName": "serve-static",
1094
+ "typecheckTargetName": "vite:typecheck",
1095
+ "buildDepsTargetName": "build-deps",
1096
+ "watchDepsTargetName": "watch-deps"
1097
+ }
1098
+ },
1099
+ {
1100
+ "plugin": "@nx/vitest",
1101
+ "options": {
1102
+ "testTargetName": "test",
1103
+ "ciTargetName": "test-ci",
1104
+ "testMode": "watch"
1105
+ }
1106
+ }
1107
+ ],
1002
1108
  "generators": {
1003
1109
  "@nx/react": {
1004
1110
  "application": {
@@ -1024,23 +1130,7 @@ exports[`react-website generator > Tanstack router integration > should generate
1024
1130
  "transitive": true
1025
1131
  }
1026
1132
  ]
1027
- },
1028
- "plugins": [
1029
- {
1030
- "plugin": "@nx/js/typescript",
1031
- "options": {
1032
- "typecheck": {
1033
- "targetName": "typecheck"
1034
- },
1035
- "build": {
1036
- "targetName": "compile",
1037
- "configName": "tsconfig.lib.json",
1038
- "buildDepsName": "build-deps",
1039
- "watchDepsName": "watch-deps"
1040
- }
1041
- }
1042
- }
1043
- ]
1133
+ }
1044
1134
  }
1045
1135
  "
1046
1136
  `;
@@ -1048,44 +1138,35 @@ exports[`react-website generator > Tanstack router integration > should generate
1048
1138
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > package.json 1`] = `
1049
1139
  "{
1050
1140
  "name": "@proj/source",
1051
- "dependencies": {
1052
- "@cloudscape-design/board-components": "3.0.187",
1053
- "@cloudscape-design/components": "3.0.1304",
1054
- "@cloudscape-design/global-styles": "1.0.59",
1055
- "aws-cdk-lib": "2.257.0",
1056
- "constructs": "10.6.0",
1057
- "react": "19.2.7",
1058
- "react-dom": "19.2.7",
1059
- "tailwindcss": "4.3.0"
1060
- },
1141
+ "dependencies": {},
1061
1142
  "devDependencies": {
1062
- "@nx/js": "22.7.5",
1063
- "@nx/react": "22.7.5",
1064
- "@nx/vite": "22.7.5",
1065
- "@nx/vitest": "22.7.5",
1066
- "@nx/web": "22.7.5",
1067
- "@swc-node/register": "~1.11.1",
1068
- "@swc/core": "~1.15.5",
1143
+ "@nx/js": "23.1.1",
1144
+ "@nx/react": "catalog:",
1145
+ "@nx/vite": "23.1.1",
1146
+ "@nx/vitest": "23.1.1",
1147
+ "@nx/web": "23.1.1",
1069
1148
  "@swc/helpers": "~0.5.18",
1070
- "@tailwindcss/vite": "4.3.0",
1149
+ "@tailwindcss/vite": "catalog:",
1071
1150
  "@testing-library/dom": "10.4.0",
1072
1151
  "@testing-library/react": "16.3.0",
1073
- "@types/node": "25.9.1",
1152
+ "@types/node": "catalog:",
1074
1153
  "@types/react": "^19.0.0",
1075
1154
  "@types/react-dom": "^19.0.0",
1076
1155
  "@vitejs/plugin-react": "^6.0.0",
1077
- "@vitest/coverage-v8": "4.1.7",
1078
- "@vitest/ui": "4.1.7",
1156
+ "@vitest/coverage-v8": "catalog:",
1157
+ "@vitest/ui": "catalog:",
1079
1158
  "jiti": "2.4.2",
1080
- "jsdom": "~22.1.0",
1081
- "typescript": "~5.9.2",
1082
- "vite": "8.0.14",
1083
- "vitest": "4.1.7"
1159
+ "jsdom": "^27.1.0",
1160
+ "typescript": "~6.0.3",
1161
+ "vite": "catalog:",
1162
+ "vitest": "catalog:"
1084
1163
  },
1085
1164
  "type": "module",
1086
- "scripts": {
1087
- "dev": "nx serve-local @proj/test-app"
1088
- }
1165
+ "workspaces": [
1166
+ "packages/*",
1167
+ "test-app",
1168
+ "packages/common/constructs"
1169
+ ]
1089
1170
  }
1090
1171
  "
1091
1172
  `;
@@ -1127,6 +1208,24 @@ You can also automatiaclly fix some lint errors by running the following command
1127
1208
  "
1128
1209
  `;
1129
1210
 
1211
+ exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/package.json 1`] = `
1212
+ "{
1213
+ "name": "@proj/common-constructs",
1214
+ "version": "0.0.1",
1215
+ "private": true,
1216
+ "type": "module",
1217
+ "dependencies": {
1218
+ "aws-cdk-lib": "catalog:",
1219
+ "constructs": "catalog:",
1220
+ "tslib": "^2.3.0"
1221
+ },
1222
+ "devDependencies": {
1223
+ "@types/node": "catalog:"
1224
+ }
1225
+ }
1226
+ "
1227
+ `;
1228
+
1130
1229
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/project.json 1`] = `
1131
1230
  "{
1132
1231
  "name": "@proj/common-constructs",
@@ -1134,6 +1233,9 @@ exports[`react-website generator > Tanstack router integration > should generate
1134
1233
  "sourceRoot": "packages/common/constructs/src",
1135
1234
  "projectType": "library",
1136
1235
  "tags": [],
1236
+ "metadata": {
1237
+ "generator": "ts#project"
1238
+ },
1137
1239
  "targets": {
1138
1240
  "build": {
1139
1241
  "dependsOn": ["lint", "compile", "test", "@proj/test-app:build"]
@@ -1146,32 +1248,39 @@ exports[`react-website generator > Tanstack router integration > should generate
1146
1248
  "cwd": "{projectRoot}"
1147
1249
  }
1148
1250
  },
1149
- "lint": {
1251
+ "format": {
1150
1252
  "executor": "nx:run-commands",
1151
1253
  "cache": true,
1152
1254
  "inputs": ["biome"],
1153
1255
  "options": {
1154
- "command": "biome lint {projectRoot}"
1256
+ "command": "biome format {projectRoot}"
1155
1257
  },
1156
1258
  "configurations": {
1157
1259
  "fix": {
1158
- "command": "biome check --write {projectRoot}"
1260
+ "command": "biome format --write {projectRoot}"
1159
1261
  },
1160
1262
  "skip-lint": {
1161
1263
  "command": "node -e \\"\\""
1162
1264
  }
1163
1265
  }
1164
1266
  },
1165
- "test": {
1166
- "executor": "@nx/vitest:test",
1167
- "outputs": ["{options.reportsDirectory}"],
1267
+ "lint": {
1268
+ "executor": "nx:run-commands",
1269
+ "cache": true,
1270
+ "inputs": ["biome"],
1271
+ "dependsOn": ["format"],
1168
1272
  "options": {
1169
- "reportsDirectory": "{workspaceRoot}/coverage/{projectRoot}"
1273
+ "command": "biome lint {projectRoot}"
1274
+ },
1275
+ "configurations": {
1276
+ "fix": {
1277
+ "command": "biome check --write {projectRoot}"
1278
+ },
1279
+ "skip-lint": {
1280
+ "command": "node -e \\"\\""
1281
+ }
1170
1282
  }
1171
1283
  }
1172
- },
1173
- "metadata": {
1174
- "generator": "ts#project"
1175
1284
  }
1176
1285
  }
1177
1286
  "
@@ -1282,10 +1391,31 @@ export const suppressRules = (
1282
1391
  "
1283
1392
  `;
1284
1393
 
1394
+ exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/src/core/cloudfront.ts 1`] = `
1395
+ "import { CfnDistribution, Distribution } from 'aws-cdk-lib/aws-cloudfront';
1396
+
1397
+ /**
1398
+ * Finds the domain names associated with a CloudFront distribution.
1399
+ *
1400
+ * Includes the distribution's default \`*.cloudfront.net\` domain name plus any custom
1401
+ * domain names (aliases) configured on it.
1402
+ */
1403
+ export const findCloudFrontDomainNames = (
1404
+ distribution: Distribution,
1405
+ ): string[] => {
1406
+ const cfnDistribution = distribution.node.defaultChild as CfnDistribution;
1407
+ const distributionConfig =
1408
+ cfnDistribution.distributionConfig as CfnDistribution.DistributionConfigProperty;
1409
+ return [distribution.domainName, ...(distributionConfig.aliases ?? [])];
1410
+ };
1411
+ "
1412
+ `;
1413
+
1285
1414
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > packages/common/constructs/src/core/index.ts 1`] = `
1286
1415
  "export * from './static-website.js';
1287
1416
  export * from './app.js';
1288
1417
  export * from './checkov.js';
1418
+ export * from './cloudfront.js';
1289
1419
  export * from './runtime-config.js';
1290
1420
  export * from './workspace.js';
1291
1421
  "
@@ -1481,11 +1611,21 @@ exports[`react-website generator > Tanstack router integration > should generate
1481
1611
  "import {
1482
1612
  CfnOutput,
1483
1613
  CfnResource,
1614
+ Duration,
1484
1615
  Lazy,
1616
+ Names,
1485
1617
  RemovalPolicy,
1486
1618
  Stack,
1487
1619
  } from 'aws-cdk-lib';
1488
- import { Distribution, ViewerProtocolPolicy } from 'aws-cdk-lib/aws-cloudfront';
1620
+ import {
1621
+ Distribution,
1622
+ HeadersFrameOption,
1623
+ HeadersReferrerPolicy,
1624
+ ResponseHeadersPolicy,
1625
+ SecurityPolicyProtocol,
1626
+ ViewerProtocolPolicy,
1627
+ } from 'aws-cdk-lib/aws-cloudfront';
1628
+ import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager';
1489
1629
  import { S3BucketOrigin } from 'aws-cdk-lib/aws-cloudfront-origins';
1490
1630
  import {
1491
1631
  BlockPublicAccess,
@@ -1494,18 +1634,56 @@ import {
1494
1634
  IBucket,
1495
1635
  ObjectOwnership,
1496
1636
  } from 'aws-cdk-lib/aws-s3';
1497
- import { BucketDeployment, Source } from 'aws-cdk-lib/aws-s3-deployment';
1637
+ import {
1638
+ BucketDeployment,
1639
+ CacheControl,
1640
+ Source,
1641
+ } from 'aws-cdk-lib/aws-s3-deployment';
1498
1642
  import { Construct } from 'constructs';
1499
1643
  import { RuntimeConfig } from './runtime-config.js';
1500
1644
  import { Key } from 'aws-cdk-lib/aws-kms';
1645
+ import {
1646
+ CfnDelivery,
1647
+ CfnDeliveryDestination,
1648
+ CfnDeliverySource,
1649
+ LogGroup,
1650
+ RetentionDays,
1651
+ } from 'aws-cdk-lib/aws-logs';
1652
+ import { Effect, PolicyStatement, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
1501
1653
  import { CfnWebACL } from 'aws-cdk-lib/aws-wafv2';
1502
1654
  import { suppressRules } from './checkov.js';
1503
1655
 
1504
1656
  const DEFAULT_RUNTIME_CONFIG_FILENAME = 'runtime-config.json';
1505
1657
 
1658
+ // Content-Security-Policy enforced on all responses. Restricts scripts and
1659
+ // framing to mitigate XSS and clickjacking, while permitting HTTPS/WSS calls
1660
+ // (connect-src) to AWS service endpoints such as API Gateway, Cognito and
1661
+ // Bedrock AgentCore which are only known at deploy time. Edit this to tighten
1662
+ // connect-src to your specific origins once they are known.
1663
+ const CONTENT_SECURITY_POLICY = [
1664
+ "default-src 'self'",
1665
+ "script-src 'self'",
1666
+ "style-src 'self' 'unsafe-inline'",
1667
+ "img-src 'self' data:",
1668
+ "font-src 'self' data:",
1669
+ "connect-src 'self' https: wss:",
1670
+ "object-src 'none'",
1671
+ "base-uri 'self'",
1672
+ "frame-ancestors 'none'",
1673
+ ].join('; ');
1674
+
1506
1675
  export interface StaticWebsiteProps {
1507
1676
  readonly websiteName: string;
1508
1677
  readonly websiteFilePath: string;
1678
+ /**
1679
+ * Custom domain names for the CloudFront distribution. Requires \`certificate\`.
1680
+ */
1681
+ readonly domainNames?: string[];
1682
+ /**
1683
+ * ACM certificate for the custom domain names. Must be in us-east-1.
1684
+ * When provided, viewers are required to use TLS 1.2 or later.
1685
+ */
1686
+ readonly certificate?: ICertificate;
1509
1687
  }
1510
1688
 
1511
1689
  /**
@@ -1524,39 +1702,48 @@ export class StaticWebsite extends Construct {
1524
1702
  constructor(
1525
1703
  scope: Construct,
1526
1704
  id: string,
1527
- { websiteFilePath, websiteName }: StaticWebsiteProps,
1705
+ {
1706
+ websiteFilePath,
1707
+ websiteName,
1708
+ domainNames,
1709
+ certificate,
1710
+ }: StaticWebsiteProps,
1528
1711
  ) {
1529
1712
  super(scope, id);
1530
- this.node.setContext(
1531
- '@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy',
1532
- true,
1533
- );
1534
1713
 
1535
1714
  const websiteKey = new Key(this, 'WebsiteKey', {
1536
1715
  enableKeyRotation: true,
1537
1716
  });
1538
1717
 
1539
- const accessLogsBucket = new Bucket(this, 'AccessLogsBucket', {
1540
- versioned: false,
1541
- enforceSSL: true,
1542
- autoDeleteObjects: true,
1543
- removalPolicy: RemovalPolicy.DESTROY,
1544
- encryption: BucketEncryption.KMS,
1718
+ // Allow CloudWatch Logs to use the website key for server access log delivery.
1719
+ const stack = Stack.of(this);
1720
+ websiteKey.addToResourcePolicy(
1721
+ new PolicyStatement({
1722
+ effect: Effect.ALLOW,
1723
+ principals: [
1724
+ new ServicePrincipal(\`logs.\${stack.region}.amazonaws.com\`),
1725
+ ],
1726
+ actions: [
1727
+ 'kms:Encrypt',
1728
+ 'kms:Decrypt',
1729
+ 'kms:ReEncrypt*',
1730
+ 'kms:GenerateDataKey*',
1731
+ 'kms:DescribeKey',
1732
+ ],
1733
+ resources: ['*'],
1734
+ conditions: {
1735
+ ArnLike: {
1736
+ 'kms:EncryptionContext:aws:logs:arn': \`arn:aws:logs:\${stack.region}:\${stack.account}:log-group:*\`,
1737
+ },
1738
+ },
1739
+ }),
1740
+ );
1741
+
1742
+ const accessLogs = new LogGroup(this, 'AccessLogs', {
1743
+ retention: RetentionDays.ONE_YEAR,
1545
1744
  encryptionKey: websiteKey,
1546
- objectOwnership: ObjectOwnership.OBJECT_WRITER,
1547
- publicReadAccess: false,
1548
- blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
1745
+ removalPolicy: RemovalPolicy.DESTROY,
1549
1746
  });
1550
- suppressRules(
1551
- accessLogsBucket,
1552
- ['CKV_AWS_21'],
1553
- 'Access log bucket does not need versioning enabled',
1554
- );
1555
- suppressRules(
1556
- accessLogsBucket,
1557
- ['CKV_AWS_18'],
1558
- 'Access log bucket does not need an access log bucket',
1559
- );
1560
1747
 
1561
1748
  // S3 Bucket to hold website files
1562
1749
  this.websiteBucket = new Bucket(this, 'WebsiteBucket', {
@@ -1569,13 +1756,23 @@ export class StaticWebsite extends Construct {
1569
1756
  objectOwnership: ObjectOwnership.BUCKET_OWNER_ENFORCED,
1570
1757
  publicReadAccess: false,
1571
1758
  blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
1572
- serverAccessLogsPrefix: 'website-access-logs',
1573
- serverAccessLogsBucket: accessLogsBucket,
1574
1759
  });
1760
+ suppressRules(
1761
+ this.websiteBucket,
1762
+ ['CKV_AWS_18'],
1763
+ 'Server access logs are delivered to CloudWatch Logs',
1764
+ );
1765
+ this.deliverAccessLogsToCloudWatch(
1766
+ 'Website',
1767
+ this.websiteBucket,
1768
+ accessLogs,
1769
+ );
1575
1770
  // Web ACL
1576
1771
  const wafStack = new CloudfrontWebAcl(this, 'waf');
1577
1772
 
1578
- // Cloudfront Distribution
1773
+ // Bucket holding CloudFront standard access logs. CloudFront delivers its
1774
+ // own logs to S3 only, so this bucket is retained; its S3 server access
1775
+ // logs are delivered to CloudWatch Logs.
1579
1776
  const logBucket = new Bucket(this, 'DistributionLogBucket', {
1580
1777
  enforceSSL: true,
1581
1778
  autoDeleteObjects: true,
@@ -1585,14 +1782,48 @@ export class StaticWebsite extends Construct {
1585
1782
  objectOwnership: ObjectOwnership.BUCKET_OWNER_PREFERRED,
1586
1783
  publicReadAccess: false,
1587
1784
  blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
1588
- serverAccessLogsPrefix: 'distribution-access-logs',
1589
- serverAccessLogsBucket: accessLogsBucket,
1590
1785
  });
1591
1786
  suppressRules(
1592
1787
  logBucket,
1593
1788
  ['CKV_AWS_21'],
1594
1789
  'Distribution log bucket does not need versioning enabled',
1595
1790
  );
1791
+ suppressRules(
1792
+ logBucket,
1793
+ ['CKV_AWS_18'],
1794
+ 'Server access logs are delivered to CloudWatch Logs',
1795
+ );
1796
+ this.deliverAccessLogsToCloudWatch('Distribution', logBucket, accessLogs);
1797
+
1798
+ // Security headers applied to all responses.
1799
+ const responseHeadersPolicy = new ResponseHeadersPolicy(
1800
+ this,
1801
+ 'ResponseHeadersPolicy',
1802
+ {
1803
+ securityHeadersBehavior: {
1804
+ strictTransportSecurity: {
1805
+ accessControlMaxAge: Duration.days(730),
1806
+ includeSubdomains: true,
1807
+ preload: true,
1808
+ override: true,
1809
+ },
1810
+ contentTypeOptions: { override: true },
1811
+ frameOptions: {
1812
+ frameOption: HeadersFrameOption.DENY,
1813
+ override: true,
1814
+ },
1815
+ referrerPolicy: {
1816
+ referrerPolicy:
1817
+ HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN,
1818
+ override: true,
1819
+ },
1820
+ contentSecurityPolicy: {
1821
+ contentSecurityPolicy: CONTENT_SECURITY_POLICY,
1822
+ override: true,
1823
+ },
1824
+ },
1825
+ },
1826
+ );
1596
1827
 
1597
1828
  const defaultRootObject = 'index.html';
1598
1829
  this.cloudFrontDistribution = new Distribution(
@@ -1602,9 +1833,17 @@ export class StaticWebsite extends Construct {
1602
1833
  webAclId: wafStack.wafArn,
1603
1834
  enableLogging: true,
1604
1835
  logBucket: logBucket,
1836
+ ...(certificate
1837
+ ? {
1838
+ certificate,
1839
+ domainNames,
1840
+ minimumProtocolVersion: SecurityPolicyProtocol.TLS_V1_2_2021,
1841
+ }
1842
+ : {}),
1605
1843
  defaultBehavior: {
1606
1844
  origin: S3BucketOrigin.withOriginAccessControl(this.websiteBucket),
1607
1845
  viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
1846
+ responseHeadersPolicy,
1608
1847
  },
1609
1848
  defaultRootObject,
1610
1849
  errorResponses: [
@@ -1621,16 +1860,31 @@ export class StaticWebsite extends Construct {
1621
1860
  ],
1622
1861
  },
1623
1862
  );
1624
- suppressRules(
1625
- this.cloudFrontDistribution,
1626
- ['CKV_AWS_174'],
1627
- 'Cloudfront default certificate does not use TLS 1.2',
1628
- );
1863
+ if (!certificate) {
1864
+ // See https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistValuesGeneral.html
1865
+ suppressRules(
1866
+ this.cloudFrontDistribution,
1867
+ ['CKV_AWS_174'],
1868
+ 'Cloudfront default certificate does not use TLS 1.2',
1869
+ );
1870
+ }
1629
1871
 
1630
1872
  // Deploy Website
1631
1873
  this.bucketDeployment = new BucketDeployment(this, 'WebsiteDeployment', {
1874
+ sources: [Source.asset(websiteFilePath)],
1875
+ destinationBucket: this.websiteBucket,
1876
+ // Files in the distribution's edge caches will be invalidated after files are uploaded to the destination bucket.
1877
+ distribution: this.cloudFrontDistribution,
1878
+ // Exclude the runtime config from this deployment's sync so its default pruning
1879
+ // never deletes the file managed separately by RuntimeConfigDeployment below.
1880
+ exclude: [DEFAULT_RUNTIME_CONFIG_FILENAME],
1881
+ memoryLimit: 1024,
1882
+ });
1883
+
1884
+ // Deploy runtime-config.json separately so it is never cached - clients
1885
+ // must always fetch the latest configuration.
1886
+ new BucketDeployment(this, 'RuntimeConfigDeployment', {
1632
1887
  sources: [
1633
- Source.asset(websiteFilePath),
1634
1888
  Source.data(
1635
1889
  DEFAULT_RUNTIME_CONFIG_FILENAME,
1636
1890
  Lazy.string({
@@ -1642,8 +1896,9 @@ export class StaticWebsite extends Construct {
1642
1896
  ),
1643
1897
  ],
1644
1898
  destinationBucket: this.websiteBucket,
1645
- // Files in the distribution's edge caches will be invalidated after files are uploaded to the destination bucket.
1646
1899
  distribution: this.cloudFrontDistribution,
1900
+ cacheControl: [CacheControl.noCache()],
1901
+ prune: false,
1647
1902
  memoryLimit: 1024,
1648
1903
  });
1649
1904
 
@@ -1664,6 +1919,48 @@ export class StaticWebsite extends Construct {
1664
1919
  value: this.websiteBucket.bucketName,
1665
1920
  });
1666
1921
  }
1922
+
1923
+ /**
1924
+ * Delivers a bucket's S3 server access logs to a CloudWatch log group using
1925
+ * CloudWatch Logs vended log delivery.
1926
+ */
1927
+ private deliverAccessLogsToCloudWatch(
1928
+ id: string,
1929
+ bucket: IBucket,
1930
+ logGroup: LogGroup,
1931
+ ) {
1932
+ const source: CfnDeliverySource = new CfnDeliverySource(
1933
+ this,
1934
+ \`\${id}AccessLogsSource\`,
1935
+ {
1936
+ name: Lazy.string({
1937
+ produce: () => Names.uniqueResourceName(source, { maxLength: 60 }),
1938
+ }),
1939
+ logType: 'S3_SERVER_ACCESS_LOGS',
1940
+ resourceArn: bucket.bucketArn,
1941
+ },
1942
+ );
1943
+ const bucketPolicy = (bucket as Bucket).policy;
1944
+ if (bucketPolicy) {
1945
+ source.node.addDependency(bucketPolicy);
1946
+ }
1947
+ const destination: CfnDeliveryDestination = new CfnDeliveryDestination(
1948
+ this,
1949
+ \`\${id}AccessLogsDestination\`,
1950
+ {
1951
+ name: Lazy.string({
1952
+ produce: () =>
1953
+ Names.uniqueResourceName(destination, { maxLength: 60 }),
1954
+ }),
1955
+ destinationResourceArn: logGroup.logGroupArn,
1956
+ },
1957
+ );
1958
+ const delivery = new CfnDelivery(this, \`\${id}AccessLogsDelivery\`, {
1959
+ deliverySourceName: source.name,
1960
+ deliveryDestinationArn: destination.attrArn,
1961
+ });
1962
+ delivery.addDependency(source);
1963
+ }
1667
1964
  }
1668
1965
 
1669
1966
  export class CloudfrontWebAcl extends Stack {
@@ -1786,9 +2083,13 @@ exports[`react-website generator > Tanstack router integration > should generate
1786
2083
  "emitDeclarationOnly": false,
1787
2084
  "module": "nodenext",
1788
2085
  "moduleResolution": "nodenext",
1789
- "types": ["node"]
2086
+ "types": [
2087
+ "node"
2088
+ ]
1790
2089
  },
1791
- "include": ["src/**/*.ts"],
2090
+ "include": [
2091
+ "src/**/*.ts"
2092
+ ],
1792
2093
  "references": [],
1793
2094
  "exclude": [
1794
2095
  "vite.config.ts",
@@ -1851,7 +2152,7 @@ exports[`react-website generator > Tanstack router integration > should generate
1851
2152
  "import { defineConfig } from 'vitest/config';
1852
2153
 
1853
2154
  export default defineConfig(() => ({
1854
- root: __dirname,
2155
+ root: import.meta.dirname,
1855
2156
  cacheDir: '../../../node_modules/.vite/packages/common/constructs',
1856
2157
  test: {
1857
2158
  passWithNoTests: true,
@@ -1872,9 +2173,25 @@ export default defineConfig(() => ({
1872
2173
 
1873
2174
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > pnpm-workspace.yaml 1`] = `
1874
2175
  "packages:
1875
- - "packages/*"
1876
- - "test-app"
1877
- - "packages/common/*"
2176
+ - packages/*
2177
+ - test-app
2178
+ - packages/common/*
2179
+ catalog:
2180
+ vite: 8.2.1
2181
+ vitest: 4.1.10
2182
+ '@vitest/coverage-v8': 4.1.10
2183
+ constructs: 10.8.1
2184
+ aws-cdk-lib: 2.263.0
2185
+ '@types/node': 26.2.0
2186
+ react: 19.2.8
2187
+ react-dom: 19.2.8
2188
+ '@cloudscape-design/components': 3.0.1342
2189
+ '@cloudscape-design/board-components': 3.0.213
2190
+ '@cloudscape-design/global-styles': 1.0.65
2191
+ tailwindcss: 4.3.3
2192
+ '@nx/react': 23.1.1
2193
+ '@vitest/ui': 4.1.10
2194
+ '@tailwindcss/vite': 4.3.3
1878
2195
  "
1879
2196
  `;
1880
2197
 
@@ -1914,7 +2231,7 @@ You can also automatically fix some lint errors by running the following command
1914
2231
 
1915
2232
  In order to integrate with cognito or trpc backends, you need to have a \`runtime-config.json\` file in your \`/public\` website directory. You can fetch this is follows:
1916
2233
 
1917
- \`pnpm nx run @proj/test-app:load:runtime-config\`
2234
+ \`pnpm nx load-runtime-config @proj/test-app\`
1918
2235
 
1919
2236
  > [!IMPORTANT]
1920
2237
  > Ensure you have AWS CLI and curl installed
@@ -1948,6 +2265,25 @@ exports[`react-website generator > Tanstack router integration > should generate
1948
2265
  "
1949
2266
  `;
1950
2267
 
2268
+ exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > test-app/package.json 1`] = `
2269
+ "{
2270
+ "name": "@proj/test-app",
2271
+ "version": "0.0.1",
2272
+ "private": true,
2273
+ "type": "module",
2274
+ "dependencies": {
2275
+ "@cloudscape-design/board-components": "catalog:",
2276
+ "@cloudscape-design/components": "catalog:",
2277
+ "@cloudscape-design/global-styles": "catalog:",
2278
+ "react": "catalog:",
2279
+ "react-dom": "catalog:",
2280
+ "tailwindcss": "catalog:"
2281
+ },
2282
+ "devDependencies": {}
2283
+ }
2284
+ "
2285
+ `;
2286
+
1951
2287
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > test-app/project.json 1`] = `
1952
2288
  "{
1953
2289
  "name": "@proj/test-app",
@@ -1959,33 +2295,17 @@ exports[`react-website generator > Tanstack router integration > should generate
1959
2295
  "generator": "ts#react-website",
1960
2296
  "ux": "cloudscape",
1961
2297
  "framework": "react",
1962
- "infra": "cloudfront-s3"
2298
+ "infra": "cloudfront-s3",
2299
+ "tailwind": true,
2300
+ "tanstackRouter": false,
2301
+ "iac": "cdk"
1963
2302
  },
1964
2303
  "targets": {
1965
2304
  "build": {
1966
- "dependsOn": ["lint", "compile", "bundle", "test"],
1967
- "options": {
1968
- "outputPath": "dist/{projectRoot}/bundle"
1969
- }
1970
- },
1971
- "bundle": {
1972
- "executor": "@nx/vite:build",
1973
- "outputs": ["{options.outputPath}"],
1974
- "defaultConfiguration": "production",
1975
- "options": {
1976
- "outputPath": "dist/{projectRoot}/bundle"
1977
- },
1978
- "configurations": {
1979
- "development": {
1980
- "mode": "development"
1981
- },
1982
- "production": {
1983
- "mode": "production"
1984
- }
1985
- }
2305
+ "dependsOn": ["lint", "compile", "test", "bundle"]
1986
2306
  },
1987
2307
  "compile": {
1988
- "dependsOn": ["bundle"],
2308
+ "dependsOn": ["^build"],
1989
2309
  "executor": "nx:run-commands",
1990
2310
  "outputs": ["{workspaceRoot}/dist/{projectRoot}/tsc"],
1991
2311
  "options": {
@@ -1993,72 +2313,30 @@ exports[`react-website generator > Tanstack router integration > should generate
1993
2313
  "cwd": "{projectRoot}"
1994
2314
  }
1995
2315
  },
1996
- "load:runtime-config": {
2316
+ "dev": {
1997
2317
  "executor": "nx:run-commands",
1998
- "metadata": {
1999
- "description": "Load runtime config from your deployed stack for dev purposes. You must set your AWS CLI credentials whilst calling 'pnpm nx run @proj/test-app:load:runtime-config'"
2000
- },
2318
+ "continuous": true,
2001
2319
  "options": {
2002
- "command": "aws s3 cp s3://\`aws cloudformation describe-stacks --query \\"Stacks[?starts_with(StackName, 'proj-')][].Outputs[] | [?contains(OutputKey, 'TestAppWebsiteBucketName')].OutputValue\\" --output text\`/runtime-config.json \\"{projectRoot}/public/runtime-config.json\\""
2003
- }
2004
- },
2005
- "preview": {
2006
- "dependsOn": ["build"],
2007
- "executor": "@nx/vite:preview-server",
2008
- "defaultConfiguration": "development",
2009
- "options": {
2010
- "buildTarget": "@proj/test-app:build"
2011
- },
2012
- "configurations": {
2013
- "development": {
2014
- "buildTarget": "@proj/test-app:build:development"
2015
- },
2016
- "production": {
2017
- "buildTarget": "@proj/test-app:build:production"
2018
- }
2320
+ "command": "vite --mode local-dev",
2321
+ "cwd": "{projectRoot}"
2019
2322
  }
2020
2323
  },
2021
- "serve": {
2022
- "executor": "@nx/vite:dev-server",
2023
- "defaultConfiguration": "development",
2324
+ "format": {
2325
+ "executor": "nx:run-commands",
2326
+ "cache": true,
2327
+ "inputs": ["biome"],
2024
2328
  "options": {
2025
- "buildTarget": "@proj/test-app:build"
2329
+ "command": "biome format {projectRoot}"
2026
2330
  },
2027
2331
  "configurations": {
2028
- "development": {
2029
- "buildTarget": "@proj/test-app:build:development",
2030
- "hmr": true
2332
+ "fix": {
2333
+ "command": "biome format --write {projectRoot}"
2031
2334
  },
2032
- "production": {
2033
- "buildTarget": "@proj/test-app:build:production",
2034
- "hmr": false
2335
+ "skip-lint": {
2336
+ "command": "node -e \\"\\""
2035
2337
  }
2036
2338
  }
2037
2339
  },
2038
- "serve-local": {
2039
- "executor": "@nx/vite:dev-server",
2040
- "options": {
2041
- "buildTarget": "@proj/test-app:build:development",
2042
- "hmr": true,
2043
- "mode": "serve-local"
2044
- },
2045
- "continuous": true
2046
- },
2047
- "serve-static": {
2048
- "executor": "@nx/web:file-server",
2049
- "dependsOn": ["build"],
2050
- "options": {
2051
- "buildTarget": "@proj/test-app:build",
2052
- "spa": true
2053
- }
2054
- },
2055
- "test": {
2056
- "executor": "@nx/vitest:test",
2057
- "outputs": ["{options.reportsDirectory}"],
2058
- "options": {
2059
- "reportsDirectory": "{workspaceRoot}/coverage/{projectRoot}"
2060
- }
2061
- },
2062
2340
  "lint": {
2063
2341
  "executor": "nx:run-commands",
2064
2342
  "cache": true,
@@ -2073,6 +2351,16 @@ exports[`react-website generator > Tanstack router integration > should generate
2073
2351
  "skip-lint": {
2074
2352
  "command": "node -e \\"\\""
2075
2353
  }
2354
+ },
2355
+ "dependsOn": ["format"]
2356
+ },
2357
+ "load-runtime-config": {
2358
+ "executor": "nx:run-commands",
2359
+ "metadata": {
2360
+ "description": "Load runtime config from your deployed stack for dev purposes. You must set your AWS CLI credentials whilst calling 'pnpm nx load-runtime-config @proj/test-app'"
2361
+ },
2362
+ "options": {
2363
+ "command": "aws s3 cp s3://\`aws cloudformation describe-stacks --query \\"Stacks[?starts_with(StackName, 'proj-')][].Outputs[] | [?contains(OutputKey, 'TestAppWebsiteBucketName')].OutputValue\\" --output text\`/runtime-config.json \\"{projectRoot}/public/runtime-config.json\\""
2076
2364
  }
2077
2365
  }
2078
2366
  }
@@ -2280,15 +2568,22 @@ exports[`react-website generator > Tanstack router integration > should generate
2280
2568
  "outDir": "../dist/test-app/tsc",
2281
2569
  "tsBuildInfoFile": "../dist/test-app/tsc/tsconfig.lib.tsbuildinfo",
2282
2570
  "jsx": "react-jsx",
2283
- "lib": ["DOM"],
2571
+ "lib": [
2572
+ "DOM"
2573
+ ],
2284
2574
  "types": [
2285
2575
  "node",
2286
2576
  "@nx/react/typings/cssmodule.d.ts",
2287
2577
  "@nx/react/typings/image.d.ts",
2288
2578
  "vite/client"
2289
- ]
2579
+ ],
2580
+ "rootDir": "src",
2581
+ "module": "esnext",
2582
+ "moduleResolution": "bundler"
2290
2583
  },
2291
2584
  "exclude": [
2585
+ "out-tsc",
2586
+ "dist",
2292
2587
  "src/**/*.spec.ts",
2293
2588
  "src/**/*.test.ts",
2294
2589
  "src/**/*.spec.tsx",
@@ -2302,7 +2597,12 @@ exports[`react-website generator > Tanstack router integration > should generate
2302
2597
  "vitest.config.ts",
2303
2598
  "vitest.config.mts"
2304
2599
  ],
2305
- "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
2600
+ "include": [
2601
+ "src/**/*.js",
2602
+ "src/**/*.jsx",
2603
+ "src/**/*.ts",
2604
+ "src/**/*.tsx"
2605
+ ]
2306
2606
  }
2307
2607
  "
2308
2608
  `;
@@ -2341,7 +2641,10 @@ exports[`react-website generator > Tanstack router integration > should generate
2341
2641
  "vitest",
2342
2642
  "@nx/react/typings/cssmodule.d.ts",
2343
2643
  "@nx/react/typings/image.d.ts"
2344
- ]
2644
+ ],
2645
+ "jsx": "react-jsx",
2646
+ "module": "esnext",
2647
+ "moduleResolution": "bundler"
2345
2648
  },
2346
2649
  "include": [
2347
2650
  "vite.config.ts",
@@ -2390,7 +2693,7 @@ export default defineConfig(() => ({
2390
2693
  // plugins: [],
2391
2694
  // },
2392
2695
  build: {
2393
- outDir: '../dist/test-app',
2696
+ outDir: '../dist/test-app/bundle',
2394
2697
  emptyOutDir: true,
2395
2698
  reportCompressedSize: true,
2396
2699
  commonjsOptions: {
@@ -2410,7 +2713,7 @@ export default defineConfig(() => ({
2410
2713
  provider: 'v8' as const,
2411
2714
  },
2412
2715
  },
2413
- resolve: { tsconfigPaths: true },
2716
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
2414
2717
  define: { global: {} },
2415
2718
  }));
2416
2719
  "
@@ -2420,9 +2723,14 @@ exports[`react-website generator > Tanstack router integration > should generate
2420
2723
  "{
2421
2724
  "compilerOptions": {
2422
2725
  "paths": {
2423
- ":proj/test-app": ["./test-app/src/index.ts"],
2424
- ":proj/common-constructs": ["./packages/common/constructs/src/index.ts"]
2726
+ "@proj/test-app": [
2727
+ "./test-app/src/index.ts"
2728
+ ],
2729
+ "@proj/common-constructs": [
2730
+ "./packages/common/constructs/src/index.ts"
2731
+ ]
2425
2732
  },
2733
+ "composite": true,
2426
2734
  "rootDir": "."
2427
2735
  }
2428
2736
  }
@@ -2431,6 +2739,9 @@ exports[`react-website generator > Tanstack router integration > should generate
2431
2739
 
2432
2740
  exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > tsconfig.json 1`] = `
2433
2741
  "{
2742
+ "extends": "./tsconfig.base.json",
2743
+ "files": [],
2744
+ "include": [],
2434
2745
  "references": [
2435
2746
  {
2436
2747
  "path": "./test-app"
@@ -2443,11 +2754,19 @@ exports[`react-website generator > Tanstack router integration > should generate
2443
2754
  "
2444
2755
  `;
2445
2756
 
2446
- exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > vitest.workspace.ts 1`] = `
2447
- "export default [
2448
- '**/vite.config.{mjs,js,ts,mts}',
2449
- '**/vitest.config.{mjs,js,ts,mts}',
2450
- ];
2757
+ exports[`react-website generator > Tanstack router integration > should generate website with no router correctly > vitest.config.ts 1`] = `
2758
+ "import { defineConfig } from 'vitest/config';
2759
+
2760
+ export default defineConfig({
2761
+ test: {
2762
+ projects: [
2763
+ '**/vite.config.{mjs,js,ts,mts}',
2764
+ '**/vitest.config.{mjs,js,ts,mts}',
2765
+ '!vitest.config.{mjs,js,ts,mts}',
2766
+ '!vite.config.{mjs,js,ts,mts}',
2767
+ ],
2768
+ },
2769
+ });
2451
2770
  "
2452
2771
  `;
2453
2772
 
@@ -2463,7 +2782,7 @@ exports[`react-website generator > Tanstack router integration > should generate
2463
2782
 
2464
2783
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > biome.json 1`] = `
2465
2784
  "{
2466
- "$schema": "https://biomejs.dev/schemas/2.4.16/schema.json",
2785
+ "$schema": "https://biomejs.dev/schemas/2.5.7/schema.json",
2467
2786
  "root": true,
2468
2787
  "formatter": {
2469
2788
  "enabled": true,
@@ -2475,6 +2794,9 @@ exports[`react-website generator > Tanstack router integration > should generate
2475
2794
  "formatter": {
2476
2795
  "quoteStyle": "single",
2477
2796
  "trailingCommas": "all"
2797
+ },
2798
+ "resolver": {
2799
+ "experimentalPnpmCatalogs": true
2478
2800
  }
2479
2801
  },
2480
2802
  "css": {
@@ -2488,9 +2810,9 @@ exports[`react-website generator > Tanstack router integration > should generate
2488
2810
  "linter": {
2489
2811
  "enabled": true,
2490
2812
  "rules": {
2491
- "recommended": false,
2813
+ "preset": "none",
2492
2814
  "correctness": {
2493
- "noUndeclaredDependencies": "warn"
2815
+ "noUndeclaredDependencies": "error"
2494
2816
  }
2495
2817
  }
2496
2818
  },
@@ -2509,9 +2831,29 @@ exports[`react-website generator > Tanstack router integration > should generate
2509
2831
  "!**/node_modules",
2510
2832
  "!**/.nx",
2511
2833
  "!**/.venv",
2512
- "!**/*.css"
2834
+ "!**/.grit",
2835
+ "!**/*.css",
2836
+ "!**/*.gen.*",
2837
+ "!**/generated/**",
2838
+ "!**/tsconfig*.json"
2513
2839
  ]
2514
- }
2840
+ },
2841
+ "overrides": [
2842
+ {
2843
+ "includes": [
2844
+ "**/*.config.{ts,mts,cts,js,mjs,cjs}",
2845
+ "**/*.{spec,test}.{ts,tsx,mts,cts,js,jsx,mjs,cjs}",
2846
+ "**/*.stories.{ts,tsx}"
2847
+ ],
2848
+ "linter": {
2849
+ "rules": {
2850
+ "correctness": {
2851
+ "noUndeclaredDependencies": "off"
2852
+ }
2853
+ }
2854
+ }
2855
+ }
2856
+ ]
2515
2857
  }
2516
2858
  "
2517
2859
  `;
@@ -2524,35 +2866,66 @@ exports[`react-website generator > Tanstack router integration > should generate
2524
2866
  "targetDefaults": {
2525
2867
  "build": {
2526
2868
  "cache": true,
2527
- "dependsOn": ["^build"],
2528
2869
  "inputs": ["default"]
2529
2870
  },
2530
2871
  "lint": {
2531
2872
  "cache": true
2532
2873
  },
2533
- "@nx/vite:build": {
2534
- "cache": true,
2874
+ "test": {
2535
2875
  "dependsOn": ["^build"],
2536
- "inputs": ["default", "^default"]
2876
+ "inputs": ["default"]
2537
2877
  },
2538
2878
  "@nx/vitest:test": {
2539
2879
  "cache": true,
2540
- "inputs": ["default", "^default"],
2880
+ "inputs": ["default", "^production"],
2541
2881
  "configurations": {
2542
2882
  "update-snapshot": {
2543
2883
  "args": "--update"
2544
2884
  }
2545
2885
  }
2546
2886
  },
2547
- "test": {
2548
- "dependsOn": ["^build"],
2549
- "inputs": ["default"]
2550
- },
2551
2887
  "compile": {
2552
2888
  "cache": true,
2553
2889
  "inputs": ["default"]
2554
2890
  }
2555
2891
  },
2892
+ "plugins": [
2893
+ {
2894
+ "plugin": "@nx/js/typescript",
2895
+ "options": {
2896
+ "typecheck": {
2897
+ "targetName": "typecheck"
2898
+ },
2899
+ "build": {
2900
+ "targetName": "compile",
2901
+ "configName": "tsconfig.lib.json",
2902
+ "buildDepsName": "build-deps",
2903
+ "watchDepsName": "watch-deps"
2904
+ }
2905
+ }
2906
+ },
2907
+ {
2908
+ "plugin": "@nx/vite/plugin",
2909
+ "options": {
2910
+ "buildTargetName": "bundle",
2911
+ "serveTargetName": "serve",
2912
+ "devTargetName": "serve",
2913
+ "previewTargetName": "preview",
2914
+ "serveStaticTargetName": "serve-static",
2915
+ "typecheckTargetName": "vite:typecheck",
2916
+ "buildDepsTargetName": "build-deps",
2917
+ "watchDepsTargetName": "watch-deps"
2918
+ }
2919
+ },
2920
+ {
2921
+ "plugin": "@nx/vitest",
2922
+ "options": {
2923
+ "testTargetName": "test",
2924
+ "ciTargetName": "test-ci",
2925
+ "testMode": "watch"
2926
+ }
2927
+ }
2928
+ ],
2556
2929
  "generators": {
2557
2930
  "@nx/react": {
2558
2931
  "application": {
@@ -2578,23 +2951,7 @@ exports[`react-website generator > Tanstack router integration > should generate
2578
2951
  "transitive": true
2579
2952
  }
2580
2953
  ]
2581
- },
2582
- "plugins": [
2583
- {
2584
- "plugin": "@nx/js/typescript",
2585
- "options": {
2586
- "typecheck": {
2587
- "targetName": "typecheck"
2588
- },
2589
- "build": {
2590
- "targetName": "compile",
2591
- "configName": "tsconfig.lib.json",
2592
- "buildDepsName": "build-deps",
2593
- "watchDepsName": "watch-deps"
2594
- }
2595
- }
2596
- }
2597
- ]
2954
+ }
2598
2955
  }
2599
2956
  "
2600
2957
  `;
@@ -2602,49 +2959,39 @@ exports[`react-website generator > Tanstack router integration > should generate
2602
2959
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > package.json 1`] = `
2603
2960
  "{
2604
2961
  "name": "@proj/source",
2605
- "dependencies": {
2606
- "@cloudscape-design/board-components": "3.0.187",
2607
- "@cloudscape-design/components": "3.0.1304",
2608
- "@cloudscape-design/global-styles": "1.0.59",
2609
- "@tanstack/react-router": "1.170.10",
2610
- "aws-cdk-lib": "2.257.0",
2611
- "constructs": "10.6.0",
2612
- "react": "19.2.7",
2613
- "react-dom": "19.2.7",
2614
- "tailwindcss": "4.3.0"
2615
- },
2962
+ "dependencies": {},
2616
2963
  "devDependencies": {
2617
- "@nx/js": "22.7.5",
2618
- "@nx/react": "22.7.5",
2619
- "@nx/vite": "22.7.5",
2620
- "@nx/vitest": "22.7.5",
2621
- "@nx/web": "22.7.5",
2622
- "@swc-node/register": "~1.11.1",
2623
- "@swc/core": "~1.15.5",
2964
+ "@nx/js": "23.1.1",
2965
+ "@nx/react": "catalog:",
2966
+ "@nx/vite": "23.1.1",
2967
+ "@nx/vitest": "23.1.1",
2968
+ "@nx/web": "23.1.1",
2624
2969
  "@swc/helpers": "~0.5.18",
2625
- "@tailwindcss/vite": "4.3.0",
2626
- "@tanstack/router-generator": "1.167.12",
2627
- "@tanstack/router-plugin": "1.168.13",
2628
- "@tanstack/router-utils": "1.162.1",
2629
- "@tanstack/virtual-file-routes": "1.162.0",
2970
+ "@tailwindcss/vite": "catalog:",
2971
+ "@tanstack/router-generator": "catalog:",
2972
+ "@tanstack/router-plugin": "catalog:",
2973
+ "@tanstack/router-utils": "catalog:",
2974
+ "@tanstack/virtual-file-routes": "catalog:",
2630
2975
  "@testing-library/dom": "10.4.0",
2631
2976
  "@testing-library/react": "16.3.0",
2632
- "@types/node": "25.9.1",
2977
+ "@types/node": "catalog:",
2633
2978
  "@types/react": "^19.0.0",
2634
2979
  "@types/react-dom": "^19.0.0",
2635
2980
  "@vitejs/plugin-react": "^6.0.0",
2636
- "@vitest/coverage-v8": "4.1.7",
2637
- "@vitest/ui": "4.1.7",
2981
+ "@vitest/coverage-v8": "catalog:",
2982
+ "@vitest/ui": "catalog:",
2638
2983
  "jiti": "2.4.2",
2639
- "jsdom": "~22.1.0",
2640
- "typescript": "~5.9.2",
2641
- "vite": "8.0.14",
2642
- "vitest": "4.1.7"
2984
+ "jsdom": "^27.1.0",
2985
+ "typescript": "~6.0.3",
2986
+ "vite": "catalog:",
2987
+ "vitest": "catalog:"
2643
2988
  },
2644
2989
  "type": "module",
2645
- "scripts": {
2646
- "dev": "nx serve-local @proj/test-app"
2647
- }
2990
+ "workspaces": [
2991
+ "packages/*",
2992
+ "test-app",
2993
+ "packages/common/constructs"
2994
+ ]
2648
2995
  }
2649
2996
  "
2650
2997
  `;
@@ -2686,6 +3033,24 @@ You can also automatiaclly fix some lint errors by running the following command
2686
3033
  "
2687
3034
  `;
2688
3035
 
3036
+ exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/package.json 1`] = `
3037
+ "{
3038
+ "name": "@proj/common-constructs",
3039
+ "version": "0.0.1",
3040
+ "private": true,
3041
+ "type": "module",
3042
+ "dependencies": {
3043
+ "aws-cdk-lib": "catalog:",
3044
+ "constructs": "catalog:",
3045
+ "tslib": "^2.3.0"
3046
+ },
3047
+ "devDependencies": {
3048
+ "@types/node": "catalog:"
3049
+ }
3050
+ }
3051
+ "
3052
+ `;
3053
+
2689
3054
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/project.json 1`] = `
2690
3055
  "{
2691
3056
  "name": "@proj/common-constructs",
@@ -2693,6 +3058,9 @@ exports[`react-website generator > Tanstack router integration > should generate
2693
3058
  "sourceRoot": "packages/common/constructs/src",
2694
3059
  "projectType": "library",
2695
3060
  "tags": [],
3061
+ "metadata": {
3062
+ "generator": "ts#project"
3063
+ },
2696
3064
  "targets": {
2697
3065
  "build": {
2698
3066
  "dependsOn": ["lint", "compile", "test", "@proj/test-app:build"]
@@ -2705,32 +3073,39 @@ exports[`react-website generator > Tanstack router integration > should generate
2705
3073
  "cwd": "{projectRoot}"
2706
3074
  }
2707
3075
  },
2708
- "lint": {
3076
+ "format": {
2709
3077
  "executor": "nx:run-commands",
2710
3078
  "cache": true,
2711
3079
  "inputs": ["biome"],
2712
3080
  "options": {
2713
- "command": "biome lint {projectRoot}"
3081
+ "command": "biome format {projectRoot}"
2714
3082
  },
2715
3083
  "configurations": {
2716
3084
  "fix": {
2717
- "command": "biome check --write {projectRoot}"
3085
+ "command": "biome format --write {projectRoot}"
2718
3086
  },
2719
3087
  "skip-lint": {
2720
3088
  "command": "node -e \\"\\""
2721
3089
  }
2722
3090
  }
2723
3091
  },
2724
- "test": {
2725
- "executor": "@nx/vitest:test",
2726
- "outputs": ["{options.reportsDirectory}"],
3092
+ "lint": {
3093
+ "executor": "nx:run-commands",
3094
+ "cache": true,
3095
+ "inputs": ["biome"],
3096
+ "dependsOn": ["format"],
2727
3097
  "options": {
2728
- "reportsDirectory": "{workspaceRoot}/coverage/{projectRoot}"
3098
+ "command": "biome lint {projectRoot}"
3099
+ },
3100
+ "configurations": {
3101
+ "fix": {
3102
+ "command": "biome check --write {projectRoot}"
3103
+ },
3104
+ "skip-lint": {
3105
+ "command": "node -e \\"\\""
3106
+ }
2729
3107
  }
2730
3108
  }
2731
- },
2732
- "metadata": {
2733
- "generator": "ts#project"
2734
3109
  }
2735
3110
  }
2736
3111
  "
@@ -2841,10 +3216,31 @@ export const suppressRules = (
2841
3216
  "
2842
3217
  `;
2843
3218
 
3219
+ exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/src/core/cloudfront.ts 1`] = `
3220
+ "import { CfnDistribution, Distribution } from 'aws-cdk-lib/aws-cloudfront';
3221
+
3222
+ /**
3223
+ * Finds the domain names associated with a CloudFront distribution.
3224
+ *
3225
+ * Includes the distribution's default \`*.cloudfront.net\` domain name plus any custom
3226
+ * domain names (aliases) configured on it.
3227
+ */
3228
+ export const findCloudFrontDomainNames = (
3229
+ distribution: Distribution,
3230
+ ): string[] => {
3231
+ const cfnDistribution = distribution.node.defaultChild as CfnDistribution;
3232
+ const distributionConfig =
3233
+ cfnDistribution.distributionConfig as CfnDistribution.DistributionConfigProperty;
3234
+ return [distribution.domainName, ...(distributionConfig.aliases ?? [])];
3235
+ };
3236
+ "
3237
+ `;
3238
+
2844
3239
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > packages/common/constructs/src/core/index.ts 1`] = `
2845
3240
  "export * from './static-website.js';
2846
3241
  export * from './app.js';
2847
3242
  export * from './checkov.js';
3243
+ export * from './cloudfront.js';
2848
3244
  export * from './runtime-config.js';
2849
3245
  export * from './workspace.js';
2850
3246
  "
@@ -3040,11 +3436,21 @@ exports[`react-website generator > Tanstack router integration > should generate
3040
3436
  "import {
3041
3437
  CfnOutput,
3042
3438
  CfnResource,
3439
+ Duration,
3043
3440
  Lazy,
3441
+ Names,
3044
3442
  RemovalPolicy,
3045
3443
  Stack,
3046
3444
  } from 'aws-cdk-lib';
3047
- import { Distribution, ViewerProtocolPolicy } from 'aws-cdk-lib/aws-cloudfront';
3445
+ import {
3446
+ Distribution,
3447
+ HeadersFrameOption,
3448
+ HeadersReferrerPolicy,
3449
+ ResponseHeadersPolicy,
3450
+ SecurityPolicyProtocol,
3451
+ ViewerProtocolPolicy,
3452
+ } from 'aws-cdk-lib/aws-cloudfront';
3453
+ import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager';
3048
3454
  import { S3BucketOrigin } from 'aws-cdk-lib/aws-cloudfront-origins';
3049
3455
  import {
3050
3456
  BlockPublicAccess,
@@ -3053,18 +3459,56 @@ import {
3053
3459
  IBucket,
3054
3460
  ObjectOwnership,
3055
3461
  } from 'aws-cdk-lib/aws-s3';
3056
- import { BucketDeployment, Source } from 'aws-cdk-lib/aws-s3-deployment';
3462
+ import {
3463
+ BucketDeployment,
3464
+ CacheControl,
3465
+ Source,
3466
+ } from 'aws-cdk-lib/aws-s3-deployment';
3057
3467
  import { Construct } from 'constructs';
3058
3468
  import { RuntimeConfig } from './runtime-config.js';
3059
3469
  import { Key } from 'aws-cdk-lib/aws-kms';
3470
+ import {
3471
+ CfnDelivery,
3472
+ CfnDeliveryDestination,
3473
+ CfnDeliverySource,
3474
+ LogGroup,
3475
+ RetentionDays,
3476
+ } from 'aws-cdk-lib/aws-logs';
3477
+ import { Effect, PolicyStatement, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
3060
3478
  import { CfnWebACL } from 'aws-cdk-lib/aws-wafv2';
3061
3479
  import { suppressRules } from './checkov.js';
3062
3480
 
3063
3481
  const DEFAULT_RUNTIME_CONFIG_FILENAME = 'runtime-config.json';
3064
3482
 
3483
+ // Content-Security-Policy enforced on all responses. Restricts scripts and
3484
+ // framing to mitigate XSS and clickjacking, while permitting HTTPS/WSS calls
3485
+ // (connect-src) to AWS service endpoints such as API Gateway, Cognito and
3486
+ // Bedrock AgentCore which are only known at deploy time. Edit this to tighten
3487
+ // connect-src to your specific origins once they are known.
3488
+ const CONTENT_SECURITY_POLICY = [
3489
+ "default-src 'self'",
3490
+ "script-src 'self'",
3491
+ "style-src 'self' 'unsafe-inline'",
3492
+ "img-src 'self' data:",
3493
+ "font-src 'self' data:",
3494
+ "connect-src 'self' https: wss:",
3495
+ "object-src 'none'",
3496
+ "base-uri 'self'",
3497
+ "frame-ancestors 'none'",
3498
+ ].join('; ');
3499
+
3065
3500
  export interface StaticWebsiteProps {
3066
3501
  readonly websiteName: string;
3067
3502
  readonly websiteFilePath: string;
3503
+ /**
3504
+ * Custom domain names for the CloudFront distribution. Requires \`certificate\`.
3505
+ */
3506
+ readonly domainNames?: string[];
3507
+ /**
3508
+ * ACM certificate for the custom domain names. Must be in us-east-1.
3509
+ * When provided, viewers are required to use TLS 1.2 or later.
3510
+ */
3511
+ readonly certificate?: ICertificate;
3068
3512
  }
3069
3513
 
3070
3514
  /**
@@ -3083,39 +3527,48 @@ export class StaticWebsite extends Construct {
3083
3527
  constructor(
3084
3528
  scope: Construct,
3085
3529
  id: string,
3086
- { websiteFilePath, websiteName }: StaticWebsiteProps,
3530
+ {
3531
+ websiteFilePath,
3532
+ websiteName,
3533
+ domainNames,
3534
+ certificate,
3535
+ }: StaticWebsiteProps,
3087
3536
  ) {
3088
3537
  super(scope, id);
3089
- this.node.setContext(
3090
- '@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy',
3091
- true,
3092
- );
3093
3538
 
3094
3539
  const websiteKey = new Key(this, 'WebsiteKey', {
3095
3540
  enableKeyRotation: true,
3096
3541
  });
3097
3542
 
3098
- const accessLogsBucket = new Bucket(this, 'AccessLogsBucket', {
3099
- versioned: false,
3100
- enforceSSL: true,
3101
- autoDeleteObjects: true,
3102
- removalPolicy: RemovalPolicy.DESTROY,
3103
- encryption: BucketEncryption.KMS,
3543
+ // Allow CloudWatch Logs to use the website key for server access log delivery.
3544
+ const stack = Stack.of(this);
3545
+ websiteKey.addToResourcePolicy(
3546
+ new PolicyStatement({
3547
+ effect: Effect.ALLOW,
3548
+ principals: [
3549
+ new ServicePrincipal(\`logs.\${stack.region}.amazonaws.com\`),
3550
+ ],
3551
+ actions: [
3552
+ 'kms:Encrypt',
3553
+ 'kms:Decrypt',
3554
+ 'kms:ReEncrypt*',
3555
+ 'kms:GenerateDataKey*',
3556
+ 'kms:DescribeKey',
3557
+ ],
3558
+ resources: ['*'],
3559
+ conditions: {
3560
+ ArnLike: {
3561
+ 'kms:EncryptionContext:aws:logs:arn': \`arn:aws:logs:\${stack.region}:\${stack.account}:log-group:*\`,
3562
+ },
3563
+ },
3564
+ }),
3565
+ );
3566
+
3567
+ const accessLogs = new LogGroup(this, 'AccessLogs', {
3568
+ retention: RetentionDays.ONE_YEAR,
3104
3569
  encryptionKey: websiteKey,
3105
- objectOwnership: ObjectOwnership.OBJECT_WRITER,
3106
- publicReadAccess: false,
3107
- blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
3570
+ removalPolicy: RemovalPolicy.DESTROY,
3108
3571
  });
3109
- suppressRules(
3110
- accessLogsBucket,
3111
- ['CKV_AWS_21'],
3112
- 'Access log bucket does not need versioning enabled',
3113
- );
3114
- suppressRules(
3115
- accessLogsBucket,
3116
- ['CKV_AWS_18'],
3117
- 'Access log bucket does not need an access log bucket',
3118
- );
3119
3572
 
3120
3573
  // S3 Bucket to hold website files
3121
3574
  this.websiteBucket = new Bucket(this, 'WebsiteBucket', {
@@ -3128,13 +3581,23 @@ export class StaticWebsite extends Construct {
3128
3581
  objectOwnership: ObjectOwnership.BUCKET_OWNER_ENFORCED,
3129
3582
  publicReadAccess: false,
3130
3583
  blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
3131
- serverAccessLogsPrefix: 'website-access-logs',
3132
- serverAccessLogsBucket: accessLogsBucket,
3133
3584
  });
3585
+ suppressRules(
3586
+ this.websiteBucket,
3587
+ ['CKV_AWS_18'],
3588
+ 'Server access logs are delivered to CloudWatch Logs',
3589
+ );
3590
+ this.deliverAccessLogsToCloudWatch(
3591
+ 'Website',
3592
+ this.websiteBucket,
3593
+ accessLogs,
3594
+ );
3134
3595
  // Web ACL
3135
3596
  const wafStack = new CloudfrontWebAcl(this, 'waf');
3136
3597
 
3137
- // Cloudfront Distribution
3598
+ // Bucket holding CloudFront standard access logs. CloudFront delivers its
3599
+ // own logs to S3 only, so this bucket is retained; its S3 server access
3600
+ // logs are delivered to CloudWatch Logs.
3138
3601
  const logBucket = new Bucket(this, 'DistributionLogBucket', {
3139
3602
  enforceSSL: true,
3140
3603
  autoDeleteObjects: true,
@@ -3144,14 +3607,48 @@ export class StaticWebsite extends Construct {
3144
3607
  objectOwnership: ObjectOwnership.BUCKET_OWNER_PREFERRED,
3145
3608
  publicReadAccess: false,
3146
3609
  blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
3147
- serverAccessLogsPrefix: 'distribution-access-logs',
3148
- serverAccessLogsBucket: accessLogsBucket,
3149
3610
  });
3150
3611
  suppressRules(
3151
3612
  logBucket,
3152
3613
  ['CKV_AWS_21'],
3153
3614
  'Distribution log bucket does not need versioning enabled',
3154
3615
  );
3616
+ suppressRules(
3617
+ logBucket,
3618
+ ['CKV_AWS_18'],
3619
+ 'Server access logs are delivered to CloudWatch Logs',
3620
+ );
3621
+ this.deliverAccessLogsToCloudWatch('Distribution', logBucket, accessLogs);
3622
+
3623
+ // Security headers applied to all responses.
3624
+ const responseHeadersPolicy = new ResponseHeadersPolicy(
3625
+ this,
3626
+ 'ResponseHeadersPolicy',
3627
+ {
3628
+ securityHeadersBehavior: {
3629
+ strictTransportSecurity: {
3630
+ accessControlMaxAge: Duration.days(730),
3631
+ includeSubdomains: true,
3632
+ preload: true,
3633
+ override: true,
3634
+ },
3635
+ contentTypeOptions: { override: true },
3636
+ frameOptions: {
3637
+ frameOption: HeadersFrameOption.DENY,
3638
+ override: true,
3639
+ },
3640
+ referrerPolicy: {
3641
+ referrerPolicy:
3642
+ HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN,
3643
+ override: true,
3644
+ },
3645
+ contentSecurityPolicy: {
3646
+ contentSecurityPolicy: CONTENT_SECURITY_POLICY,
3647
+ override: true,
3648
+ },
3649
+ },
3650
+ },
3651
+ );
3155
3652
 
3156
3653
  const defaultRootObject = 'index.html';
3157
3654
  this.cloudFrontDistribution = new Distribution(
@@ -3161,9 +3658,17 @@ export class StaticWebsite extends Construct {
3161
3658
  webAclId: wafStack.wafArn,
3162
3659
  enableLogging: true,
3163
3660
  logBucket: logBucket,
3661
+ ...(certificate
3662
+ ? {
3663
+ certificate,
3664
+ domainNames,
3665
+ minimumProtocolVersion: SecurityPolicyProtocol.TLS_V1_2_2021,
3666
+ }
3667
+ : {}),
3164
3668
  defaultBehavior: {
3165
3669
  origin: S3BucketOrigin.withOriginAccessControl(this.websiteBucket),
3166
3670
  viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
3671
+ responseHeadersPolicy,
3167
3672
  },
3168
3673
  defaultRootObject,
3169
3674
  errorResponses: [
@@ -3180,16 +3685,31 @@ export class StaticWebsite extends Construct {
3180
3685
  ],
3181
3686
  },
3182
3687
  );
3183
- suppressRules(
3184
- this.cloudFrontDistribution,
3185
- ['CKV_AWS_174'],
3186
- 'Cloudfront default certificate does not use TLS 1.2',
3187
- );
3688
+ if (!certificate) {
3689
+ // See https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistValuesGeneral.html
3690
+ suppressRules(
3691
+ this.cloudFrontDistribution,
3692
+ ['CKV_AWS_174'],
3693
+ 'Cloudfront default certificate does not use TLS 1.2',
3694
+ );
3695
+ }
3188
3696
 
3189
3697
  // Deploy Website
3190
3698
  this.bucketDeployment = new BucketDeployment(this, 'WebsiteDeployment', {
3699
+ sources: [Source.asset(websiteFilePath)],
3700
+ destinationBucket: this.websiteBucket,
3701
+ // Files in the distribution's edge caches will be invalidated after files are uploaded to the destination bucket.
3702
+ distribution: this.cloudFrontDistribution,
3703
+ // Exclude the runtime config from this deployment's sync so its default pruning
3704
+ // never deletes the file managed separately by RuntimeConfigDeployment below.
3705
+ exclude: [DEFAULT_RUNTIME_CONFIG_FILENAME],
3706
+ memoryLimit: 1024,
3707
+ });
3708
+
3709
+ // Deploy runtime-config.json separately so it is never cached - clients
3710
+ // must always fetch the latest configuration.
3711
+ new BucketDeployment(this, 'RuntimeConfigDeployment', {
3191
3712
  sources: [
3192
- Source.asset(websiteFilePath),
3193
3713
  Source.data(
3194
3714
  DEFAULT_RUNTIME_CONFIG_FILENAME,
3195
3715
  Lazy.string({
@@ -3201,8 +3721,9 @@ export class StaticWebsite extends Construct {
3201
3721
  ),
3202
3722
  ],
3203
3723
  destinationBucket: this.websiteBucket,
3204
- // Files in the distribution's edge caches will be invalidated after files are uploaded to the destination bucket.
3205
3724
  distribution: this.cloudFrontDistribution,
3725
+ cacheControl: [CacheControl.noCache()],
3726
+ prune: false,
3206
3727
  memoryLimit: 1024,
3207
3728
  });
3208
3729
 
@@ -3223,6 +3744,48 @@ export class StaticWebsite extends Construct {
3223
3744
  value: this.websiteBucket.bucketName,
3224
3745
  });
3225
3746
  }
3747
+
3748
+ /**
3749
+ * Delivers a bucket's S3 server access logs to a CloudWatch log group using
3750
+ * CloudWatch Logs vended log delivery.
3751
+ */
3752
+ private deliverAccessLogsToCloudWatch(
3753
+ id: string,
3754
+ bucket: IBucket,
3755
+ logGroup: LogGroup,
3756
+ ) {
3757
+ const source: CfnDeliverySource = new CfnDeliverySource(
3758
+ this,
3759
+ \`\${id}AccessLogsSource\`,
3760
+ {
3761
+ name: Lazy.string({
3762
+ produce: () => Names.uniqueResourceName(source, { maxLength: 60 }),
3763
+ }),
3764
+ logType: 'S3_SERVER_ACCESS_LOGS',
3765
+ resourceArn: bucket.bucketArn,
3766
+ },
3767
+ );
3768
+ const bucketPolicy = (bucket as Bucket).policy;
3769
+ if (bucketPolicy) {
3770
+ source.node.addDependency(bucketPolicy);
3771
+ }
3772
+ const destination: CfnDeliveryDestination = new CfnDeliveryDestination(
3773
+ this,
3774
+ \`\${id}AccessLogsDestination\`,
3775
+ {
3776
+ name: Lazy.string({
3777
+ produce: () =>
3778
+ Names.uniqueResourceName(destination, { maxLength: 60 }),
3779
+ }),
3780
+ destinationResourceArn: logGroup.logGroupArn,
3781
+ },
3782
+ );
3783
+ const delivery = new CfnDelivery(this, \`\${id}AccessLogsDelivery\`, {
3784
+ deliverySourceName: source.name,
3785
+ deliveryDestinationArn: destination.attrArn,
3786
+ });
3787
+ delivery.addDependency(source);
3788
+ }
3226
3789
  }
3227
3790
 
3228
3791
  export class CloudfrontWebAcl extends Stack {
@@ -3345,9 +3908,13 @@ exports[`react-website generator > Tanstack router integration > should generate
3345
3908
  "emitDeclarationOnly": false,
3346
3909
  "module": "nodenext",
3347
3910
  "moduleResolution": "nodenext",
3348
- "types": ["node"]
3911
+ "types": [
3912
+ "node"
3913
+ ]
3349
3914
  },
3350
- "include": ["src/**/*.ts"],
3915
+ "include": [
3916
+ "src/**/*.ts"
3917
+ ],
3351
3918
  "references": [],
3352
3919
  "exclude": [
3353
3920
  "vite.config.ts",
@@ -3410,7 +3977,7 @@ exports[`react-website generator > Tanstack router integration > should generate
3410
3977
  "import { defineConfig } from 'vitest/config';
3411
3978
 
3412
3979
  export default defineConfig(() => ({
3413
- root: __dirname,
3980
+ root: import.meta.dirname,
3414
3981
  cacheDir: '../../../node_modules/.vite/packages/common/constructs',
3415
3982
  test: {
3416
3983
  passWithNoTests: true,
@@ -3431,9 +3998,30 @@ export default defineConfig(() => ({
3431
3998
 
3432
3999
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > pnpm-workspace.yaml 1`] = `
3433
4000
  "packages:
3434
- - "packages/*"
3435
- - "test-app"
3436
- - "packages/common/*"
4001
+ - packages/*
4002
+ - test-app
4003
+ - packages/common/*
4004
+ catalog:
4005
+ vite: 8.2.1
4006
+ vitest: 4.1.10
4007
+ '@vitest/coverage-v8': 4.1.10
4008
+ constructs: 10.8.1
4009
+ aws-cdk-lib: 2.263.0
4010
+ '@types/node': 26.2.0
4011
+ react: 19.2.8
4012
+ react-dom: 19.2.8
4013
+ '@cloudscape-design/components': 3.0.1342
4014
+ '@cloudscape-design/board-components': 3.0.213
4015
+ '@cloudscape-design/global-styles': 1.0.65
4016
+ tailwindcss: 4.3.3
4017
+ '@tanstack/react-router': 1.170.23
4018
+ '@nx/react': 23.1.1
4019
+ '@vitest/ui': 4.1.10
4020
+ '@tailwindcss/vite': 4.3.3
4021
+ '@tanstack/router-plugin': 1.168.27
4022
+ '@tanstack/router-generator': 1.167.25
4023
+ '@tanstack/virtual-file-routes': 1.162.0
4024
+ '@tanstack/router-utils': 1.162.2
3437
4025
  "
3438
4026
  `;
3439
4027
 
@@ -3473,7 +4061,7 @@ You can also automatically fix some lint errors by running the following command
3473
4061
 
3474
4062
  In order to integrate with cognito or trpc backends, you need to have a \`runtime-config.json\` file in your \`/public\` website directory. You can fetch this is follows:
3475
4063
 
3476
- \`pnpm nx run @proj/test-app:load:runtime-config\`
4064
+ \`pnpm nx load-runtime-config @proj/test-app\`
3477
4065
 
3478
4066
  > [!IMPORTANT]
3479
4067
  > Ensure you have AWS CLI and curl installed
@@ -3507,6 +4095,26 @@ exports[`react-website generator > Tanstack router integration > should generate
3507
4095
  "
3508
4096
  `;
3509
4097
 
4098
+ exports[`react-website generator > Tanstack router integration > should generate website with router correctly > test-app/package.json 1`] = `
4099
+ "{
4100
+ "name": "@proj/test-app",
4101
+ "version": "0.0.1",
4102
+ "private": true,
4103
+ "type": "module",
4104
+ "dependencies": {
4105
+ "@cloudscape-design/board-components": "catalog:",
4106
+ "@cloudscape-design/components": "catalog:",
4107
+ "@cloudscape-design/global-styles": "catalog:",
4108
+ "@tanstack/react-router": "catalog:",
4109
+ "react": "catalog:",
4110
+ "react-dom": "catalog:",
4111
+ "tailwindcss": "catalog:"
4112
+ },
4113
+ "devDependencies": {}
4114
+ }
4115
+ "
4116
+ `;
4117
+
3510
4118
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > test-app/project.json 1`] = `
3511
4119
  "{
3512
4120
  "name": "@proj/test-app",
@@ -3518,33 +4126,17 @@ exports[`react-website generator > Tanstack router integration > should generate
3518
4126
  "generator": "ts#react-website",
3519
4127
  "ux": "cloudscape",
3520
4128
  "framework": "react",
3521
- "infra": "cloudfront-s3"
4129
+ "infra": "cloudfront-s3",
4130
+ "tailwind": true,
4131
+ "tanstackRouter": true,
4132
+ "iac": "cdk"
3522
4133
  },
3523
4134
  "targets": {
3524
4135
  "build": {
3525
- "dependsOn": ["lint", "compile", "bundle", "test"],
3526
- "options": {
3527
- "outputPath": "dist/{projectRoot}/bundle"
3528
- }
3529
- },
3530
- "bundle": {
3531
- "executor": "@nx/vite:build",
3532
- "outputs": ["{options.outputPath}"],
3533
- "defaultConfiguration": "production",
3534
- "options": {
3535
- "outputPath": "dist/{projectRoot}/bundle"
3536
- },
3537
- "configurations": {
3538
- "development": {
3539
- "mode": "development"
3540
- },
3541
- "production": {
3542
- "mode": "production"
3543
- }
3544
- }
4136
+ "dependsOn": ["lint", "compile", "test", "bundle"]
3545
4137
  },
3546
4138
  "compile": {
3547
- "dependsOn": ["bundle"],
4139
+ "dependsOn": ["^build"],
3548
4140
  "executor": "nx:run-commands",
3549
4141
  "outputs": ["{workspaceRoot}/dist/{projectRoot}/tsc"],
3550
4142
  "options": {
@@ -3552,72 +4144,30 @@ exports[`react-website generator > Tanstack router integration > should generate
3552
4144
  "cwd": "{projectRoot}"
3553
4145
  }
3554
4146
  },
3555
- "load:runtime-config": {
4147
+ "dev": {
3556
4148
  "executor": "nx:run-commands",
3557
- "metadata": {
3558
- "description": "Load runtime config from your deployed stack for dev purposes. You must set your AWS CLI credentials whilst calling 'pnpm nx run @proj/test-app:load:runtime-config'"
3559
- },
3560
- "options": {
3561
- "command": "aws s3 cp s3://\`aws cloudformation describe-stacks --query \\"Stacks[?starts_with(StackName, 'proj-')][].Outputs[] | [?contains(OutputKey, 'TestAppWebsiteBucketName')].OutputValue\\" --output text\`/runtime-config.json \\"{projectRoot}/public/runtime-config.json\\""
3562
- }
3563
- },
3564
- "preview": {
3565
- "dependsOn": ["build"],
3566
- "executor": "@nx/vite:preview-server",
3567
- "defaultConfiguration": "development",
4149
+ "continuous": true,
3568
4150
  "options": {
3569
- "buildTarget": "@proj/test-app:build"
3570
- },
3571
- "configurations": {
3572
- "development": {
3573
- "buildTarget": "@proj/test-app:build:development"
3574
- },
3575
- "production": {
3576
- "buildTarget": "@proj/test-app:build:production"
3577
- }
4151
+ "command": "vite --mode local-dev",
4152
+ "cwd": "{projectRoot}"
3578
4153
  }
3579
4154
  },
3580
- "serve": {
3581
- "executor": "@nx/vite:dev-server",
3582
- "defaultConfiguration": "development",
4155
+ "format": {
4156
+ "executor": "nx:run-commands",
4157
+ "cache": true,
4158
+ "inputs": ["biome"],
3583
4159
  "options": {
3584
- "buildTarget": "@proj/test-app:build"
4160
+ "command": "biome format {projectRoot}"
3585
4161
  },
3586
4162
  "configurations": {
3587
- "development": {
3588
- "buildTarget": "@proj/test-app:build:development",
3589
- "hmr": true
4163
+ "fix": {
4164
+ "command": "biome format --write {projectRoot}"
3590
4165
  },
3591
- "production": {
3592
- "buildTarget": "@proj/test-app:build:production",
3593
- "hmr": false
4166
+ "skip-lint": {
4167
+ "command": "node -e \\"\\""
3594
4168
  }
3595
4169
  }
3596
4170
  },
3597
- "serve-local": {
3598
- "executor": "@nx/vite:dev-server",
3599
- "options": {
3600
- "buildTarget": "@proj/test-app:build:development",
3601
- "hmr": true,
3602
- "mode": "serve-local"
3603
- },
3604
- "continuous": true
3605
- },
3606
- "serve-static": {
3607
- "executor": "@nx/web:file-server",
3608
- "dependsOn": ["build"],
3609
- "options": {
3610
- "buildTarget": "@proj/test-app:build",
3611
- "spa": true
3612
- }
3613
- },
3614
- "test": {
3615
- "executor": "@nx/vitest:test",
3616
- "outputs": ["{options.reportsDirectory}"],
3617
- "options": {
3618
- "reportsDirectory": "{workspaceRoot}/coverage/{projectRoot}"
3619
- }
3620
- },
3621
4171
  "lint": {
3622
4172
  "executor": "nx:run-commands",
3623
4173
  "cache": true,
@@ -3632,6 +4182,16 @@ exports[`react-website generator > Tanstack router integration > should generate
3632
4182
  "skip-lint": {
3633
4183
  "command": "node -e \\"\\""
3634
4184
  }
4185
+ },
4186
+ "dependsOn": ["format"]
4187
+ },
4188
+ "load-runtime-config": {
4189
+ "executor": "nx:run-commands",
4190
+ "metadata": {
4191
+ "description": "Load runtime config from your deployed stack for dev purposes. You must set your AWS CLI credentials whilst calling 'pnpm nx load-runtime-config @proj/test-app'"
4192
+ },
4193
+ "options": {
4194
+ "command": "aws s3 cp s3://\`aws cloudformation describe-stacks --query \\"Stacks[?starts_with(StackName, 'proj-')][].Outputs[] | [?contains(OutputKey, 'TestAppWebsiteBucketName')].OutputValue\\" --output text\`/runtime-config.json \\"{projectRoot}/public/runtime-config.json\\""
3635
4195
  }
3636
4196
  }
3637
4197
  }
@@ -3917,55 +4477,55 @@ exports[`react-website generator > Tanstack router integration > should generate
3917
4477
  // You should NOT make any changes in this file as it will be overwritten.
3918
4478
  // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
3919
4479
 
3920
- import { Route as rootRouteImport } from './routes/__root';
3921
- import { Route as IndexRouteImport } from './routes/index';
4480
+ import { Route as rootRouteImport } from './routes/__root'
4481
+ import { Route as IndexRouteImport } from './routes/index'
3922
4482
 
3923
4483
  const IndexRoute = IndexRouteImport.update({
3924
4484
  id: '/',
3925
4485
  path: '/',
3926
4486
  getParentRoute: () => rootRouteImport,
3927
- } as any);
4487
+ } as any)
3928
4488
 
3929
4489
  export interface FileRoutesByFullPath {
3930
- '/': typeof IndexRoute;
4490
+ '/': typeof IndexRoute
3931
4491
  }
3932
4492
  export interface FileRoutesByTo {
3933
- '/': typeof IndexRoute;
4493
+ '/': typeof IndexRoute
3934
4494
  }
3935
4495
  export interface FileRoutesById {
3936
- __root__: typeof rootRouteImport;
3937
- '/': typeof IndexRoute;
4496
+ __root__: typeof rootRouteImport
4497
+ '/': typeof IndexRoute
3938
4498
  }
3939
4499
  export interface FileRouteTypes {
3940
- fileRoutesByFullPath: FileRoutesByFullPath;
3941
- fullPaths: '/';
3942
- fileRoutesByTo: FileRoutesByTo;
3943
- to: '/';
3944
- id: '__root__' | '/';
3945
- fileRoutesById: FileRoutesById;
4500
+ fileRoutesByFullPath: FileRoutesByFullPath
4501
+ fullPaths: '/'
4502
+ fileRoutesByTo: FileRoutesByTo
4503
+ to: '/'
4504
+ id: '__root__' | '/'
4505
+ fileRoutesById: FileRoutesById
3946
4506
  }
3947
4507
  export interface RootRouteChildren {
3948
- IndexRoute: typeof IndexRoute;
4508
+ IndexRoute: typeof IndexRoute
3949
4509
  }
3950
4510
 
3951
4511
  declare module '@tanstack/react-router' {
3952
4512
  interface FileRoutesByPath {
3953
4513
  '/': {
3954
- id: '/';
3955
- path: '/';
3956
- fullPath: '/';
3957
- preLoaderRoute: typeof IndexRouteImport;
3958
- parentRoute: typeof rootRouteImport;
3959
- };
4514
+ id: '/'
4515
+ path: '/'
4516
+ fullPath: '/'
4517
+ preLoaderRoute: typeof IndexRouteImport
4518
+ parentRoute: typeof rootRouteImport
4519
+ }
3960
4520
  }
3961
4521
  }
3962
4522
 
3963
4523
  const rootRouteChildren: RootRouteChildren = {
3964
4524
  IndexRoute: IndexRoute,
3965
- };
4525
+ }
3966
4526
  export const routeTree = rootRouteImport
3967
4527
  ._addFileChildren(rootRouteChildren)
3968
- ._addFileTypes<FileRouteTypes>();
4528
+ ._addFileTypes<FileRouteTypes>()
3969
4529
  "
3970
4530
  `;
3971
4531
 
@@ -4023,15 +4583,22 @@ exports[`react-website generator > Tanstack router integration > should generate
4023
4583
  "outDir": "../dist/test-app/tsc",
4024
4584
  "tsBuildInfoFile": "../dist/test-app/tsc/tsconfig.lib.tsbuildinfo",
4025
4585
  "jsx": "react-jsx",
4026
- "lib": ["DOM"],
4586
+ "lib": [
4587
+ "DOM"
4588
+ ],
4027
4589
  "types": [
4028
4590
  "node",
4029
4591
  "@nx/react/typings/cssmodule.d.ts",
4030
4592
  "@nx/react/typings/image.d.ts",
4031
4593
  "vite/client"
4032
- ]
4594
+ ],
4595
+ "rootDir": "src",
4596
+ "module": "esnext",
4597
+ "moduleResolution": "bundler"
4033
4598
  },
4034
4599
  "exclude": [
4600
+ "out-tsc",
4601
+ "dist",
4035
4602
  "src/**/*.spec.ts",
4036
4603
  "src/**/*.test.ts",
4037
4604
  "src/**/*.spec.tsx",
@@ -4045,7 +4612,12 @@ exports[`react-website generator > Tanstack router integration > should generate
4045
4612
  "vitest.config.ts",
4046
4613
  "vitest.config.mts"
4047
4614
  ],
4048
- "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"]
4615
+ "include": [
4616
+ "src/**/*.js",
4617
+ "src/**/*.jsx",
4618
+ "src/**/*.ts",
4619
+ "src/**/*.tsx"
4620
+ ]
4049
4621
  }
4050
4622
  "
4051
4623
  `;
@@ -4084,7 +4656,10 @@ exports[`react-website generator > Tanstack router integration > should generate
4084
4656
  "vitest",
4085
4657
  "@nx/react/typings/cssmodule.d.ts",
4086
4658
  "@nx/react/typings/image.d.ts"
4087
- ]
4659
+ ],
4660
+ "jsx": "react-jsx",
4661
+ "module": "esnext",
4662
+ "moduleResolution": "bundler"
4088
4663
  },
4089
4664
  "include": [
4090
4665
  "vite.config.ts",
@@ -4131,8 +4706,8 @@ export default defineConfig(() => ({
4131
4706
  },
4132
4707
  plugins: [
4133
4708
  tanstackRouter({
4134
- routesDirectory: resolve(__dirname, 'src/routes'),
4135
- generatedRouteTree: resolve(__dirname, 'src/routeTree.gen.ts'),
4709
+ routesDirectory: resolve(import.meta.dirname, 'src/routes'),
4710
+ generatedRouteTree: resolve(import.meta.dirname, 'src/routeTree.gen.ts'),
4136
4711
  }),
4137
4712
  react(),
4138
4713
  tailwindcss(),
@@ -4142,7 +4717,7 @@ export default defineConfig(() => ({
4142
4717
  // plugins: [],
4143
4718
  // },
4144
4719
  build: {
4145
- outDir: '../dist/test-app',
4720
+ outDir: '../dist/test-app/bundle',
4146
4721
  emptyOutDir: true,
4147
4722
  reportCompressedSize: true,
4148
4723
  commonjsOptions: {
@@ -4162,7 +4737,7 @@ export default defineConfig(() => ({
4162
4737
  provider: 'v8' as const,
4163
4738
  },
4164
4739
  },
4165
- resolve: { tsconfigPaths: true },
4740
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
4166
4741
  define: { global: {} },
4167
4742
  }));
4168
4743
  "
@@ -4172,9 +4747,14 @@ exports[`react-website generator > Tanstack router integration > should generate
4172
4747
  "{
4173
4748
  "compilerOptions": {
4174
4749
  "paths": {
4175
- ":proj/test-app": ["./test-app/src/index.ts"],
4176
- ":proj/common-constructs": ["./packages/common/constructs/src/index.ts"]
4750
+ "@proj/test-app": [
4751
+ "./test-app/src/index.ts"
4752
+ ],
4753
+ "@proj/common-constructs": [
4754
+ "./packages/common/constructs/src/index.ts"
4755
+ ]
4177
4756
  },
4757
+ "composite": true,
4178
4758
  "rootDir": "."
4179
4759
  }
4180
4760
  }
@@ -4183,6 +4763,9 @@ exports[`react-website generator > Tanstack router integration > should generate
4183
4763
 
4184
4764
  exports[`react-website generator > Tanstack router integration > should generate website with router correctly > tsconfig.json 1`] = `
4185
4765
  "{
4766
+ "extends": "./tsconfig.base.json",
4767
+ "files": [],
4768
+ "include": [],
4186
4769
  "references": [
4187
4770
  {
4188
4771
  "path": "./test-app"
@@ -4195,11 +4778,19 @@ exports[`react-website generator > Tanstack router integration > should generate
4195
4778
  "
4196
4779
  `;
4197
4780
 
4198
- exports[`react-website generator > Tanstack router integration > should generate website with router correctly > vitest.workspace.ts 1`] = `
4199
- "export default [
4200
- '**/vite.config.{mjs,js,ts,mts}',
4201
- '**/vitest.config.{mjs,js,ts,mts}',
4202
- ];
4781
+ exports[`react-website generator > Tanstack router integration > should generate website with router correctly > vitest.config.ts 1`] = `
4782
+ "import { defineConfig } from 'vitest/config';
4783
+
4784
+ export default defineConfig({
4785
+ test: {
4786
+ projects: [
4787
+ '**/vite.config.{mjs,js,ts,mts}',
4788
+ '**/vitest.config.{mjs,js,ts,mts}',
4789
+ '!vitest.config.{mjs,js,ts,mts}',
4790
+ '!vite.config.{mjs,js,ts,mts}',
4791
+ ],
4792
+ },
4793
+ });
4203
4794
  "
4204
4795
  `;
4205
4796
 
@@ -4244,8 +4835,8 @@ export default defineConfig(() => ({
4244
4835
  },
4245
4836
  plugins: [
4246
4837
  tanstackRouter({
4247
- routesDirectory: resolve(__dirname, 'src/routes'),
4248
- generatedRouteTree: resolve(__dirname, 'src/routeTree.gen.ts'),
4838
+ routesDirectory: resolve(import.meta.dirname, 'src/routes'),
4839
+ generatedRouteTree: resolve(import.meta.dirname, 'src/routeTree.gen.ts'),
4249
4840
  }),
4250
4841
  react(),
4251
4842
  tailwindcss(),
@@ -4255,7 +4846,7 @@ export default defineConfig(() => ({
4255
4846
  // plugins: [],
4256
4847
  // },
4257
4848
  build: {
4258
- outDir: '../dist/test-app',
4849
+ outDir: '../dist/test-app/bundle',
4259
4850
  emptyOutDir: true,
4260
4851
  reportCompressedSize: true,
4261
4852
  commonjsOptions: {
@@ -4275,7 +4866,7 @@ export default defineConfig(() => ({
4275
4866
  provider: 'v8' as const,
4276
4867
  },
4277
4868
  },
4278
- resolve: { tsconfigPaths: true },
4869
+ resolve: { tsconfigPaths: true, dedupe: ['react', 'react-dom'] },
4279
4870
  define: { global: {} },
4280
4871
  }));
4281
4872
  "
@@ -4520,6 +5111,7 @@ exports[`react-website generator > should generate shared constructs > common/co
4520
5111
  "export * from './static-website.js';
4521
5112
  export * from './app.js';
4522
5113
  export * from './checkov.js';
5114
+ export * from './cloudfront.js';
4523
5115
  export * from './runtime-config.js';
4524
5116
  export * from './workspace.js';
4525
5117
  "
@@ -4529,11 +5121,21 @@ exports[`react-website generator > should generate shared constructs > common/co
4529
5121
  "import {
4530
5122
  CfnOutput,
4531
5123
  CfnResource,
5124
+ Duration,
4532
5125
  Lazy,
5126
+ Names,
4533
5127
  RemovalPolicy,
4534
5128
  Stack,
4535
5129
  } from 'aws-cdk-lib';
4536
- import { Distribution, ViewerProtocolPolicy } from 'aws-cdk-lib/aws-cloudfront';
5130
+ import {
5131
+ Distribution,
5132
+ HeadersFrameOption,
5133
+ HeadersReferrerPolicy,
5134
+ ResponseHeadersPolicy,
5135
+ SecurityPolicyProtocol,
5136
+ ViewerProtocolPolicy,
5137
+ } from 'aws-cdk-lib/aws-cloudfront';
5138
+ import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager';
4537
5139
  import { S3BucketOrigin } from 'aws-cdk-lib/aws-cloudfront-origins';
4538
5140
  import {
4539
5141
  BlockPublicAccess,
@@ -4542,18 +5144,56 @@ import {
4542
5144
  IBucket,
4543
5145
  ObjectOwnership,
4544
5146
  } from 'aws-cdk-lib/aws-s3';
4545
- import { BucketDeployment, Source } from 'aws-cdk-lib/aws-s3-deployment';
5147
+ import {
5148
+ BucketDeployment,
5149
+ CacheControl,
5150
+ Source,
5151
+ } from 'aws-cdk-lib/aws-s3-deployment';
4546
5152
  import { Construct } from 'constructs';
4547
5153
  import { RuntimeConfig } from './runtime-config.js';
4548
5154
  import { Key } from 'aws-cdk-lib/aws-kms';
5155
+ import {
5156
+ CfnDelivery,
5157
+ CfnDeliveryDestination,
5158
+ CfnDeliverySource,
5159
+ LogGroup,
5160
+ RetentionDays,
5161
+ } from 'aws-cdk-lib/aws-logs';
5162
+ import { Effect, PolicyStatement, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
4549
5163
  import { CfnWebACL } from 'aws-cdk-lib/aws-wafv2';
4550
5164
  import { suppressRules } from './checkov.js';
4551
5165
 
4552
5166
  const DEFAULT_RUNTIME_CONFIG_FILENAME = 'runtime-config.json';
4553
5167
 
5168
+ // Content-Security-Policy enforced on all responses. Restricts scripts and
5169
+ // framing to mitigate XSS and clickjacking, while permitting HTTPS/WSS calls
5170
+ // (connect-src) to AWS service endpoints such as API Gateway, Cognito and
5171
+ // Bedrock AgentCore which are only known at deploy time. Edit this to tighten
5172
+ // connect-src to your specific origins once they are known.
5173
+ const CONTENT_SECURITY_POLICY = [
5174
+ "default-src 'self'",
5175
+ "script-src 'self'",
5176
+ "style-src 'self' 'unsafe-inline'",
5177
+ "img-src 'self' data:",
5178
+ "font-src 'self' data:",
5179
+ "connect-src 'self' https: wss:",
5180
+ "object-src 'none'",
5181
+ "base-uri 'self'",
5182
+ "frame-ancestors 'none'",
5183
+ ].join('; ');
5184
+
4554
5185
  export interface StaticWebsiteProps {
4555
5186
  readonly websiteName: string;
4556
5187
  readonly websiteFilePath: string;
5188
+ /**
5189
+ * Custom domain names for the CloudFront distribution. Requires \`certificate\`.
5190
+ */
5191
+ readonly domainNames?: string[];
5192
+ /**
5193
+ * ACM certificate for the custom domain names. Must be in us-east-1.
5194
+ * When provided, viewers are required to use TLS 1.2 or later.
5195
+ */
5196
+ readonly certificate?: ICertificate;
4557
5197
  }
4558
5198
 
4559
5199
  /**
@@ -4572,39 +5212,48 @@ export class StaticWebsite extends Construct {
4572
5212
  constructor(
4573
5213
  scope: Construct,
4574
5214
  id: string,
4575
- { websiteFilePath, websiteName }: StaticWebsiteProps,
5215
+ {
5216
+ websiteFilePath,
5217
+ websiteName,
5218
+ domainNames,
5219
+ certificate,
5220
+ }: StaticWebsiteProps,
4576
5221
  ) {
4577
5222
  super(scope, id);
4578
- this.node.setContext(
4579
- '@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy',
4580
- true,
4581
- );
4582
5223
 
4583
5224
  const websiteKey = new Key(this, 'WebsiteKey', {
4584
5225
  enableKeyRotation: true,
4585
5226
  });
4586
5227
 
4587
- const accessLogsBucket = new Bucket(this, 'AccessLogsBucket', {
4588
- versioned: false,
4589
- enforceSSL: true,
4590
- autoDeleteObjects: true,
4591
- removalPolicy: RemovalPolicy.DESTROY,
4592
- encryption: BucketEncryption.KMS,
5228
+ // Allow CloudWatch Logs to use the website key for server access log delivery.
5229
+ const stack = Stack.of(this);
5230
+ websiteKey.addToResourcePolicy(
5231
+ new PolicyStatement({
5232
+ effect: Effect.ALLOW,
5233
+ principals: [
5234
+ new ServicePrincipal(\`logs.\${stack.region}.amazonaws.com\`),
5235
+ ],
5236
+ actions: [
5237
+ 'kms:Encrypt',
5238
+ 'kms:Decrypt',
5239
+ 'kms:ReEncrypt*',
5240
+ 'kms:GenerateDataKey*',
5241
+ 'kms:DescribeKey',
5242
+ ],
5243
+ resources: ['*'],
5244
+ conditions: {
5245
+ ArnLike: {
5246
+ 'kms:EncryptionContext:aws:logs:arn': \`arn:aws:logs:\${stack.region}:\${stack.account}:log-group:*\`,
5247
+ },
5248
+ },
5249
+ }),
5250
+ );
5251
+
5252
+ const accessLogs = new LogGroup(this, 'AccessLogs', {
5253
+ retention: RetentionDays.ONE_YEAR,
4593
5254
  encryptionKey: websiteKey,
4594
- objectOwnership: ObjectOwnership.OBJECT_WRITER,
4595
- publicReadAccess: false,
4596
- blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
5255
+ removalPolicy: RemovalPolicy.DESTROY,
4597
5256
  });
4598
- suppressRules(
4599
- accessLogsBucket,
4600
- ['CKV_AWS_21'],
4601
- 'Access log bucket does not need versioning enabled',
4602
- );
4603
- suppressRules(
4604
- accessLogsBucket,
4605
- ['CKV_AWS_18'],
4606
- 'Access log bucket does not need an access log bucket',
4607
- );
4608
5257
 
4609
5258
  // S3 Bucket to hold website files
4610
5259
  this.websiteBucket = new Bucket(this, 'WebsiteBucket', {
@@ -4617,13 +5266,23 @@ export class StaticWebsite extends Construct {
4617
5266
  objectOwnership: ObjectOwnership.BUCKET_OWNER_ENFORCED,
4618
5267
  publicReadAccess: false,
4619
5268
  blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
4620
- serverAccessLogsPrefix: 'website-access-logs',
4621
- serverAccessLogsBucket: accessLogsBucket,
4622
5269
  });
5270
+ suppressRules(
5271
+ this.websiteBucket,
5272
+ ['CKV_AWS_18'],
5273
+ 'Server access logs are delivered to CloudWatch Logs',
5274
+ );
5275
+ this.deliverAccessLogsToCloudWatch(
5276
+ 'Website',
5277
+ this.websiteBucket,
5278
+ accessLogs,
5279
+ );
4623
5280
  // Web ACL
4624
5281
  const wafStack = new CloudfrontWebAcl(this, 'waf');
4625
5282
 
4626
- // Cloudfront Distribution
5283
+ // Bucket holding CloudFront standard access logs. CloudFront delivers its
5284
+ // own logs to S3 only, so this bucket is retained; its S3 server access
5285
+ // logs are delivered to CloudWatch Logs.
4627
5286
  const logBucket = new Bucket(this, 'DistributionLogBucket', {
4628
5287
  enforceSSL: true,
4629
5288
  autoDeleteObjects: true,
@@ -4633,14 +5292,48 @@ export class StaticWebsite extends Construct {
4633
5292
  objectOwnership: ObjectOwnership.BUCKET_OWNER_PREFERRED,
4634
5293
  publicReadAccess: false,
4635
5294
  blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
4636
- serverAccessLogsPrefix: 'distribution-access-logs',
4637
- serverAccessLogsBucket: accessLogsBucket,
4638
5295
  });
4639
5296
  suppressRules(
4640
5297
  logBucket,
4641
5298
  ['CKV_AWS_21'],
4642
5299
  'Distribution log bucket does not need versioning enabled',
4643
5300
  );
5301
+ suppressRules(
5302
+ logBucket,
5303
+ ['CKV_AWS_18'],
5304
+ 'Server access logs are delivered to CloudWatch Logs',
5305
+ );
5306
+ this.deliverAccessLogsToCloudWatch('Distribution', logBucket, accessLogs);
5307
+
5308
+ // Security headers applied to all responses.
5309
+ const responseHeadersPolicy = new ResponseHeadersPolicy(
5310
+ this,
5311
+ 'ResponseHeadersPolicy',
5312
+ {
5313
+ securityHeadersBehavior: {
5314
+ strictTransportSecurity: {
5315
+ accessControlMaxAge: Duration.days(730),
5316
+ includeSubdomains: true,
5317
+ preload: true,
5318
+ override: true,
5319
+ },
5320
+ contentTypeOptions: { override: true },
5321
+ frameOptions: {
5322
+ frameOption: HeadersFrameOption.DENY,
5323
+ override: true,
5324
+ },
5325
+ referrerPolicy: {
5326
+ referrerPolicy:
5327
+ HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN,
5328
+ override: true,
5329
+ },
5330
+ contentSecurityPolicy: {
5331
+ contentSecurityPolicy: CONTENT_SECURITY_POLICY,
5332
+ override: true,
5333
+ },
5334
+ },
5335
+ },
5336
+ );
4644
5337
 
4645
5338
  const defaultRootObject = 'index.html';
4646
5339
  this.cloudFrontDistribution = new Distribution(
@@ -4650,9 +5343,17 @@ export class StaticWebsite extends Construct {
4650
5343
  webAclId: wafStack.wafArn,
4651
5344
  enableLogging: true,
4652
5345
  logBucket: logBucket,
5346
+ ...(certificate
5347
+ ? {
5348
+ certificate,
5349
+ domainNames,
5350
+ minimumProtocolVersion: SecurityPolicyProtocol.TLS_V1_2_2021,
5351
+ }
5352
+ : {}),
4653
5353
  defaultBehavior: {
4654
5354
  origin: S3BucketOrigin.withOriginAccessControl(this.websiteBucket),
4655
5355
  viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
5356
+ responseHeadersPolicy,
4656
5357
  },
4657
5358
  defaultRootObject,
4658
5359
  errorResponses: [
@@ -4669,16 +5370,31 @@ export class StaticWebsite extends Construct {
4669
5370
  ],
4670
5371
  },
4671
5372
  );
4672
- suppressRules(
4673
- this.cloudFrontDistribution,
4674
- ['CKV_AWS_174'],
4675
- 'Cloudfront default certificate does not use TLS 1.2',
4676
- );
5373
+ if (!certificate) {
5374
+ // See https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistValuesGeneral.html
5375
+ suppressRules(
5376
+ this.cloudFrontDistribution,
5377
+ ['CKV_AWS_174'],
5378
+ 'Cloudfront default certificate does not use TLS 1.2',
5379
+ );
5380
+ }
4677
5381
 
4678
5382
  // Deploy Website
4679
5383
  this.bucketDeployment = new BucketDeployment(this, 'WebsiteDeployment', {
5384
+ sources: [Source.asset(websiteFilePath)],
5385
+ destinationBucket: this.websiteBucket,
5386
+ // Files in the distribution's edge caches will be invalidated after files are uploaded to the destination bucket.
5387
+ distribution: this.cloudFrontDistribution,
5388
+ // Exclude the runtime config from this deployment's sync so its default pruning
5389
+ // never deletes the file managed separately by RuntimeConfigDeployment below.
5390
+ exclude: [DEFAULT_RUNTIME_CONFIG_FILENAME],
5391
+ memoryLimit: 1024,
5392
+ });
5393
+
5394
+ // Deploy runtime-config.json separately so it is never cached - clients
5395
+ // must always fetch the latest configuration.
5396
+ new BucketDeployment(this, 'RuntimeConfigDeployment', {
4680
5397
  sources: [
4681
- Source.asset(websiteFilePath),
4682
5398
  Source.data(
4683
5399
  DEFAULT_RUNTIME_CONFIG_FILENAME,
4684
5400
  Lazy.string({
@@ -4690,8 +5406,9 @@ export class StaticWebsite extends Construct {
4690
5406
  ),
4691
5407
  ],
4692
5408
  destinationBucket: this.websiteBucket,
4693
- // Files in the distribution's edge caches will be invalidated after files are uploaded to the destination bucket.
4694
5409
  distribution: this.cloudFrontDistribution,
5410
+ cacheControl: [CacheControl.noCache()],
5411
+ prune: false,
4695
5412
  memoryLimit: 1024,
4696
5413
  });
4697
5414
 
@@ -4712,6 +5429,48 @@ export class StaticWebsite extends Construct {
4712
5429
  value: this.websiteBucket.bucketName,
4713
5430
  });
4714
5431
  }
5432
+
5433
+ /**
5434
+ * Delivers a bucket's S3 server access logs to a CloudWatch log group using
5435
+ * CloudWatch Logs vended log delivery.
5436
+ */
5437
+ private deliverAccessLogsToCloudWatch(
5438
+ id: string,
5439
+ bucket: IBucket,
5440
+ logGroup: LogGroup,
5441
+ ) {
5442
+ const source: CfnDeliverySource = new CfnDeliverySource(
5443
+ this,
5444
+ \`\${id}AccessLogsSource\`,
5445
+ {
5446
+ name: Lazy.string({
5447
+ produce: () => Names.uniqueResourceName(source, { maxLength: 60 }),
5448
+ }),
5449
+ logType: 'S3_SERVER_ACCESS_LOGS',
5450
+ resourceArn: bucket.bucketArn,
5451
+ },
5452
+ );
5453
+ const bucketPolicy = (bucket as Bucket).policy;
5454
+ if (bucketPolicy) {
5455
+ source.node.addDependency(bucketPolicy);
5456
+ }
5457
+ const destination: CfnDeliveryDestination = new CfnDeliveryDestination(
5458
+ this,
5459
+ \`\${id}AccessLogsDestination\`,
5460
+ {
5461
+ name: Lazy.string({
5462
+ produce: () =>
5463
+ Names.uniqueResourceName(destination, { maxLength: 60 }),
5464
+ }),
5465
+ destinationResourceArn: logGroup.logGroupArn,
5466
+ },
5467
+ );
5468
+ const delivery = new CfnDelivery(this, \`\${id}AccessLogsDelivery\`, {
5469
+ deliverySourceName: source.name,
5470
+ deliveryDestinationArn: destination.attrArn,
5471
+ });
5472
+ delivery.addDependency(source);
5473
+ }
4715
5474
  }
4716
5475
 
4717
5476
  export class CloudfrontWebAcl extends Stack {
@@ -4835,19 +5594,7 @@ root &&
4835
5594
  "
4836
5595
  `;
4837
5596
 
4838
- exports[`react-website generator > should handle npm scope prefix correctly > scoped-dependencies 1`] = `
4839
- {
4840
- "@cloudscape-design/board-components": "3.0.187",
4841
- "@cloudscape-design/components": "3.0.1304",
4842
- "@cloudscape-design/global-styles": "1.0.59",
4843
- "@tanstack/react-router": "1.170.10",
4844
- "aws-cdk-lib": "2.257.0",
4845
- "constructs": "10.6.0",
4846
- "react": "19.2.7",
4847
- "react-dom": "19.2.7",
4848
- "tailwindcss": "4.3.0",
4849
- }
4850
- `;
5597
+ exports[`react-website generator > should handle npm scope prefix correctly > scoped-dependencies 1`] = `{}`;
4851
5598
 
4852
5599
  exports[`react-website generator ux tests > Cloudscape > should update package.json with required dependencies > test-app/src/components/AppLayout/index.tsx 1`] = `
4853
5600
  "import * as React from 'react';
@@ -5088,55 +5835,55 @@ exports[`react-website generator ux tests > Cloudscape > should update package.j
5088
5835
  // You should NOT make any changes in this file as it will be overwritten.
5089
5836
  // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
5090
5837
 
5091
- import { Route as rootRouteImport } from './routes/__root';
5092
- import { Route as IndexRouteImport } from './routes/index';
5838
+ import { Route as rootRouteImport } from './routes/__root'
5839
+ import { Route as IndexRouteImport } from './routes/index'
5093
5840
 
5094
5841
  const IndexRoute = IndexRouteImport.update({
5095
5842
  id: '/',
5096
5843
  path: '/',
5097
5844
  getParentRoute: () => rootRouteImport,
5098
- } as any);
5845
+ } as any)
5099
5846
 
5100
5847
  export interface FileRoutesByFullPath {
5101
- '/': typeof IndexRoute;
5848
+ '/': typeof IndexRoute
5102
5849
  }
5103
5850
  export interface FileRoutesByTo {
5104
- '/': typeof IndexRoute;
5851
+ '/': typeof IndexRoute
5105
5852
  }
5106
5853
  export interface FileRoutesById {
5107
- __root__: typeof rootRouteImport;
5108
- '/': typeof IndexRoute;
5854
+ __root__: typeof rootRouteImport
5855
+ '/': typeof IndexRoute
5109
5856
  }
5110
5857
  export interface FileRouteTypes {
5111
- fileRoutesByFullPath: FileRoutesByFullPath;
5112
- fullPaths: '/';
5113
- fileRoutesByTo: FileRoutesByTo;
5114
- to: '/';
5115
- id: '__root__' | '/';
5116
- fileRoutesById: FileRoutesById;
5858
+ fileRoutesByFullPath: FileRoutesByFullPath
5859
+ fullPaths: '/'
5860
+ fileRoutesByTo: FileRoutesByTo
5861
+ to: '/'
5862
+ id: '__root__' | '/'
5863
+ fileRoutesById: FileRoutesById
5117
5864
  }
5118
5865
  export interface RootRouteChildren {
5119
- IndexRoute: typeof IndexRoute;
5866
+ IndexRoute: typeof IndexRoute
5120
5867
  }
5121
5868
 
5122
5869
  declare module '@tanstack/react-router' {
5123
5870
  interface FileRoutesByPath {
5124
5871
  '/': {
5125
- id: '/';
5126
- path: '/';
5127
- fullPath: '/';
5128
- preLoaderRoute: typeof IndexRouteImport;
5129
- parentRoute: typeof rootRouteImport;
5130
- };
5872
+ id: '/'
5873
+ path: '/'
5874
+ fullPath: '/'
5875
+ preLoaderRoute: typeof IndexRouteImport
5876
+ parentRoute: typeof rootRouteImport
5877
+ }
5131
5878
  }
5132
5879
  }
5133
5880
 
5134
5881
  const rootRouteChildren: RootRouteChildren = {
5135
5882
  IndexRoute: IndexRoute,
5136
- };
5883
+ }
5137
5884
  export const routeTree = rootRouteImport
5138
5885
  ._addFileChildren(rootRouteChildren)
5139
- ._addFileTypes<FileRouteTypes>();
5886
+ ._addFileTypes<FileRouteTypes>()
5140
5887
  "
5141
5888
  `;
5142
5889
 
@@ -5193,8 +5940,8 @@ import {
5193
5940
  SidebarInset,
5194
5941
  SidebarProvider,
5195
5942
  SidebarTrigger,
5196
- } from ':proj/common-shadcn/components/ui/sidebar';
5197
- import { Separator } from ':proj/common-shadcn/components/ui/separator';
5943
+ } from '@proj/common-shadcn/components/ui/sidebar';
5944
+ import { Separator } from '@proj/common-shadcn/components/ui/separator';
5198
5945
  import Config from '../../config';
5199
5946
 
5200
5947
  import { Link, useLocation, useMatchRoute } from '@tanstack/react-router';
@@ -5205,7 +5952,7 @@ import {
5205
5952
  BreadcrumbList,
5206
5953
  BreadcrumbPage,
5207
5954
  BreadcrumbSeparator,
5208
- } from ':proj/common-shadcn/components/ui/breadcrumb';
5955
+ } from '@proj/common-shadcn/components/ui/breadcrumb';
5209
5956
  import { AppSidebar } from '../app-sidebar';
5210
5957
 
5211
5958
  const getBreadcrumbs = (
@@ -5316,7 +6063,7 @@ import {
5316
6063
  Alert as ShadcnAlert,
5317
6064
  AlertDescription,
5318
6065
  AlertTitle,
5319
- } from ':proj/common-shadcn/components/ui/alert';
6066
+ } from '@proj/common-shadcn/components/ui/alert';
5320
6067
 
5321
6068
  type AlertType = 'info' | 'error';
5322
6069
 
@@ -5356,7 +6103,7 @@ import {
5356
6103
  SidebarMenu,
5357
6104
  SidebarMenuButton,
5358
6105
  SidebarMenuItem,
5359
- } from ':proj/common-shadcn/components/ui/sidebar';
6106
+ } from '@proj/common-shadcn/components/ui/sidebar';
5360
6107
  import { Link } from '@tanstack/react-router';
5361
6108
 
5362
6109
  import Config from '../config';
@@ -5398,7 +6145,7 @@ export function AppSidebar() {
5398
6145
  `;
5399
6146
 
5400
6147
  exports[`react-website generator ux tests > Shadcn > should update package.json with required dependencies > test-app/src/components/spinner.tsx 1`] = `
5401
- "import { Spinner as ShadcnSpinner } from ':proj/common-shadcn/components/ui/spinner';
6148
+ "import { Spinner as ShadcnSpinner } from '@proj/common-shadcn/components/ui/spinner';
5402
6149
 
5403
6150
  export const Spinner = ShadcnSpinner;
5404
6151
  "
@@ -5459,55 +6206,55 @@ exports[`react-website generator ux tests > Shadcn > should update package.json
5459
6206
  // You should NOT make any changes in this file as it will be overwritten.
5460
6207
  // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
5461
6208
 
5462
- import { Route as rootRouteImport } from './routes/__root';
5463
- import { Route as IndexRouteImport } from './routes/index';
6209
+ import { Route as rootRouteImport } from './routes/__root'
6210
+ import { Route as IndexRouteImport } from './routes/index'
5464
6211
 
5465
6212
  const IndexRoute = IndexRouteImport.update({
5466
6213
  id: '/',
5467
6214
  path: '/',
5468
6215
  getParentRoute: () => rootRouteImport,
5469
- } as any);
6216
+ } as any)
5470
6217
 
5471
6218
  export interface FileRoutesByFullPath {
5472
- '/': typeof IndexRoute;
6219
+ '/': typeof IndexRoute
5473
6220
  }
5474
6221
  export interface FileRoutesByTo {
5475
- '/': typeof IndexRoute;
6222
+ '/': typeof IndexRoute
5476
6223
  }
5477
6224
  export interface FileRoutesById {
5478
- __root__: typeof rootRouteImport;
5479
- '/': typeof IndexRoute;
6225
+ __root__: typeof rootRouteImport
6226
+ '/': typeof IndexRoute
5480
6227
  }
5481
6228
  export interface FileRouteTypes {
5482
- fileRoutesByFullPath: FileRoutesByFullPath;
5483
- fullPaths: '/';
5484
- fileRoutesByTo: FileRoutesByTo;
5485
- to: '/';
5486
- id: '__root__' | '/';
5487
- fileRoutesById: FileRoutesById;
6229
+ fileRoutesByFullPath: FileRoutesByFullPath
6230
+ fullPaths: '/'
6231
+ fileRoutesByTo: FileRoutesByTo
6232
+ to: '/'
6233
+ id: '__root__' | '/'
6234
+ fileRoutesById: FileRoutesById
5488
6235
  }
5489
6236
  export interface RootRouteChildren {
5490
- IndexRoute: typeof IndexRoute;
6237
+ IndexRoute: typeof IndexRoute
5491
6238
  }
5492
6239
 
5493
6240
  declare module '@tanstack/react-router' {
5494
6241
  interface FileRoutesByPath {
5495
6242
  '/': {
5496
- id: '/';
5497
- path: '/';
5498
- fullPath: '/';
5499
- preLoaderRoute: typeof IndexRouteImport;
5500
- parentRoute: typeof rootRouteImport;
5501
- };
6243
+ id: '/'
6244
+ path: '/'
6245
+ fullPath: '/'
6246
+ preLoaderRoute: typeof IndexRouteImport
6247
+ parentRoute: typeof rootRouteImport
6248
+ }
5502
6249
  }
5503
6250
  }
5504
6251
 
5505
6252
  const rootRouteChildren: RootRouteChildren = {
5506
6253
  IndexRoute: IndexRoute,
5507
- };
6254
+ }
5508
6255
  export const routeTree = rootRouteImport
5509
6256
  ._addFileChildren(rootRouteChildren)
5510
- ._addFileTypes<FileRouteTypes>();
6257
+ ._addFileTypes<FileRouteTypes>()
5511
6258
  "
5512
6259
  `;
5513
6260