@aws/nx-plugin 1.0.0-rc.96 → 1.0.0-rc.98

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 (313) hide show
  1. package/LICENSE-THIRD-PARTY +9 -9
  2. package/migrations.json +124 -84
  3. package/package.json +3 -3
  4. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +2 -2
  5. package/src/agentcore-gateway/generator.js +6 -0
  6. package/src/agentcore-gateway/generator.js.map +1 -1
  7. package/src/agentcore-gateway/react-connection/__snapshots__/generator.spec.ts.snap +4 -1
  8. package/src/agentcore-harness/__snapshots__/generator.spec.ts.snap +68 -4
  9. package/src/agentcore-harness/generator.js +6 -0
  10. package/src/agentcore-harness/generator.js.map +1 -1
  11. package/src/connection/gateway-runtime-config.js +1 -1
  12. package/src/connection/gateway-runtime-config.js.map +1 -1
  13. package/src/infra/app/__snapshots__/generator.spec.ts.snap +10 -10
  14. package/src/infra/app/generator.js +39 -9
  15. package/src/infra/app/generator.js.map +1 -1
  16. package/src/init/generator.d.ts +1 -1
  17. package/src/init/generator.js +8 -6
  18. package/src/init/generator.js.map +1 -1
  19. package/src/init/schema.d.js.map +1 -1
  20. package/src/init/schema.d.ts +1 -0
  21. package/src/init/schema.json +5 -0
  22. package/src/internal/test-matrix/generator.js +2 -2
  23. package/src/internal/test-matrix/generator.js.map +1 -1
  24. package/src/license/sync/generator.d.ts +10 -0
  25. package/src/license/sync/generator.js +1 -1
  26. package/src/license/sync/generator.js.map +1 -1
  27. package/src/mcp-server/server.js +2 -0
  28. package/src/mcp-server/server.js.map +1 -1
  29. package/src/mcp-server/tools/best-practices.d.ts +28 -0
  30. package/src/mcp-server/tools/best-practices.js +43 -0
  31. package/src/mcp-server/tools/best-practices.js.map +1 -0
  32. package/src/mcp-server/tools/general-guidance.d.ts +1 -1
  33. package/src/mcp-server/tools/general-guidance.js +13 -4
  34. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  35. package/src/migrations/latest/sandbox-pattern-nested-stacks/metadata.json +3 -0
  36. package/src/migrations/latest/sandbox-pattern-nested-stacks/migration.js +68 -0
  37. package/src/migrations/latest/sandbox-pattern-nested-stacks/migration.js.map +1 -0
  38. package/src/migrations/latest/shadcn-cn-package/metadata.json +3 -0
  39. package/src/migrations/latest/shadcn-cn-package/migration.js +114 -0
  40. package/src/migrations/latest/shadcn-cn-package/migration.js.map +1 -0
  41. package/src/migrations/v1.0.0-rc.90/0001-dev-target-depends-on-pull-image/migration.js.map +1 -0
  42. package/src/migrations/v1.0.0-rc.90/0002-open-api-codegen-executor/migration.js.map +1 -0
  43. package/src/migrations/v1.0.0-rc.90/0003-terraform-provider-plugin-cache/migration.js.map +1 -0
  44. package/src/migrations/v1.0.0-rc.90/0004-python-test-input-scoping/migration.js.map +1 -0
  45. package/src/migrations/v1.0.0-rc.90/0005-vitest-coverage-output-dir/migration.js.map +1 -0
  46. package/src/migrations/v1.0.0-rc.90/0006-add-assemble-target/migration.js.map +1 -0
  47. package/src/migrations/v1.0.0-rc.90/0007-docker-target-cache-soundness/migration.js.map +1 -0
  48. package/src/migrations/v1.0.0-rc.90/0008-declare-cacheable-target-inputs/migration.js.map +1 -0
  49. package/src/migrations/v1.0.0-rc.90/0009-terraform-fmt-check/migration.js.map +1 -0
  50. package/src/migrations/v1.0.0-rc.92/0001-react-website-unique-dev-ports/migration.js.map +1 -0
  51. package/src/migrations/v1.0.0-rc.94/0001-infra-deploy-express-mode/metadata.json +3 -0
  52. package/src/migrations/{latest/infra-deploy-express-mode → v1.0.0-rc.94/0001-infra-deploy-express-mode}/migration.js +26 -28
  53. package/src/migrations/v1.0.0-rc.94/0001-infra-deploy-express-mode/migration.js.map +1 -0
  54. package/src/migrations/v1.0.0-rc.94/0002-shx-fs-commands/migration.js.map +1 -0
  55. package/src/migrations/v1.0.0-rc.94/0003-agent-core-vendor-target/migration.js.map +1 -0
  56. package/src/migrations/v1.0.0-rc.95/0001-rolldown-config-bundle-transient/migration.d.ts +6 -0
  57. package/src/migrations/v1.0.0-rc.95/0001-rolldown-config-bundle-transient/migration.js.map +1 -0
  58. package/src/migrations/v1.0.0-rc.95/0002-agent-connection-pin-strands-peers/migration.js.map +1 -0
  59. package/src/migrations/v1.0.0-rc.95/0003-ignore-package-manager-temp-files/migration.js.map +1 -0
  60. package/src/migrations/v1.0.0-rc.95/0004-shadcn-package-imports-exports/migration.d.ts +6 -0
  61. package/src/migrations/v1.0.0-rc.95/0004-shadcn-package-imports-exports/migration.js.map +1 -0
  62. package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/__snapshots__/migration.spec.ts.snap +84 -0
  63. package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/metadata.json +3 -0
  64. package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/migration.d.ts +6 -0
  65. package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/migration.js +94 -0
  66. package/src/migrations/v1.0.0-rc.97/0001-gateway-url-accessor/migration.js.map +1 -0
  67. package/src/migrations/v1.0.0-rc.97/0002-checkov-scan-cache-inputs/metadata.json +3 -0
  68. package/src/migrations/v1.0.0-rc.97/0002-checkov-scan-cache-inputs/migration.d.ts +6 -0
  69. package/src/migrations/v1.0.0-rc.97/0002-checkov-scan-cache-inputs/migration.js +58 -0
  70. package/src/migrations/v1.0.0-rc.97/0002-checkov-scan-cache-inputs/migration.js.map +1 -0
  71. package/src/migrations/v1.0.0-rc.97/0003-terraform-validate-without-backend/metadata.json +3 -0
  72. package/src/migrations/v1.0.0-rc.97/0003-terraform-validate-without-backend/migration.d.ts +6 -0
  73. package/src/migrations/v1.0.0-rc.97/0003-terraform-validate-without-backend/migration.js +84 -0
  74. package/src/migrations/v1.0.0-rc.97/0003-terraform-validate-without-backend/migration.js.map +1 -0
  75. package/src/migrations/v1.0.0-rc.97/0004-py-lambda-powertools-context/metadata.json +3 -0
  76. package/src/migrations/v1.0.0-rc.97/0004-py-lambda-powertools-context/migration.d.ts +6 -0
  77. package/src/migrations/v1.0.0-rc.97/0004-py-lambda-powertools-context/migration.js +58 -0
  78. package/src/migrations/v1.0.0-rc.97/0004-py-lambda-powertools-context/migration.js.map +1 -0
  79. package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/__snapshots__/migration.spec.ts.snap +25 -0
  80. package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/metadata.json +3 -0
  81. package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/migration.d.ts +28 -0
  82. package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/migration.js +75 -0
  83. package/src/migrations/v1.0.0-rc.97/0005-smithy-extension-trait-aliases/migration.js.map +1 -0
  84. package/src/migrations/v1.0.0-rc.97/0006-script-project-quality-gates/metadata.json +3 -0
  85. package/src/migrations/v1.0.0-rc.97/0006-script-project-quality-gates/migration.d.ts +6 -0
  86. package/src/migrations/v1.0.0-rc.97/0006-script-project-quality-gates/migration.js +53 -0
  87. package/src/migrations/v1.0.0-rc.97/0006-script-project-quality-gates/migration.js.map +1 -0
  88. package/src/preset/__snapshots__/generator.spec.ts.snap +2 -2
  89. package/src/preset/generator.js +4 -25
  90. package/src/preset/generator.js.map +1 -1
  91. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +2 -2
  92. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +4 -4
  93. package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +4 -4
  94. package/src/py/agent/a2a-connection/generator.d.ts +1 -1
  95. package/src/py/agent/gateway-connection/generator.d.ts +1 -1
  96. package/src/py/agent/mcp-connection/generator.d.ts +1 -1
  97. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +4 -1
  98. package/src/py/agent/react-connection/generator.d.ts +1 -7
  99. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +10 -12
  100. package/src/py/dynamodb/generator.js +34 -7
  101. package/src/py/dynamodb/generator.js.map +1 -1
  102. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +12 -12
  103. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -3
  104. package/src/py/lambda-function/files/handler/__lambdaFunctionSnakeCase__.py.template +2 -1
  105. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +3 -3
  106. package/src/py/project/schema.json +3 -1
  107. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +31 -15
  108. package/src/py/rdb/files/Dockerfile.create-db-user.template +7 -3
  109. package/src/py/rdb/files/Dockerfile.migration.template +7 -3
  110. package/src/py/rdb/generator.js +29 -28
  111. package/src/py/rdb/generator.js.map +1 -1
  112. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +5 -5
  113. package/src/smithy/react-connection/files/model/extensions.smithy.template +3 -3
  114. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +8 -8
  115. package/src/smithy/ts/api/generator.js +7 -2
  116. package/src/smithy/ts/api/generator.js.map +1 -1
  117. package/src/terraform/project/generator.js +34 -10
  118. package/src/terraform/project/generator.js.map +1 -1
  119. package/src/terraform/project/schema.d.js +0 -3
  120. package/src/terraform/project/schema.d.js.map +1 -1
  121. package/src/terraform/project/schema.d.ts +0 -4
  122. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +12 -12
  123. package/src/trpc/backend/generator.js +7 -1
  124. package/src/trpc/backend/generator.js.map +1 -1
  125. package/src/trpc/react/generator.js +6 -0
  126. package/src/trpc/react/generator.js.map +1 -1
  127. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +4 -4
  128. package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +2 -2
  129. package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +2 -2
  130. package/src/ts/agent/generator.js +3 -3
  131. package/src/ts/agent/generator.js.map +1 -1
  132. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +2 -2
  133. package/src/ts/agent/react-connection/generator.d.ts +1 -9
  134. package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +47 -2
  135. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +1 -1
  136. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +6 -4
  137. package/src/ts/dynamodb/generator.js +30 -6
  138. package/src/ts/dynamodb/generator.js.map +1 -1
  139. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  140. package/src/ts/lib/biome.d.ts +15 -1
  141. package/src/ts/lib/biome.js +79 -63
  142. package/src/ts/lib/biome.js.map +1 -1
  143. package/src/ts/lib/generator.js +11 -7
  144. package/src/ts/lib/generator.js.map +1 -1
  145. package/src/ts/lib/ts-project-utils.d.ts +14 -0
  146. package/src/ts/lib/ts-project-utils.js +24 -0
  147. package/src/ts/lib/ts-project-utils.js.map +1 -1
  148. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +3 -3
  149. package/src/ts/mcp-server/files/app/http.ts.template +1 -1
  150. package/src/ts/mcp-server/generator.js +3 -3
  151. package/src/ts/mcp-server/generator.js.map +1 -1
  152. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +2 -2
  153. package/src/ts/nx-generator/files/local/generator.spec.ts.template +2 -2
  154. package/src/ts/nx-migration/generator.js +3 -1
  155. package/src/ts/nx-migration/generator.js.map +1 -1
  156. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +1 -25
  157. package/src/ts/nx-plugin/generator.js +19 -17
  158. package/src/ts/nx-plugin/generator.js.map +1 -1
  159. package/src/ts/nx-plugin/utils.d.ts +21 -0
  160. package/src/ts/nx-plugin/utils.js +41 -1
  161. package/src/ts/nx-plugin/utils.js.map +1 -1
  162. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +13 -8
  163. package/src/ts/rdb/files/Dockerfile.template +5 -0
  164. package/src/ts/rdb/generator.d.ts +8 -0
  165. package/src/ts/rdb/generator.js +28 -24
  166. package/src/ts/rdb/generator.js.map +1 -1
  167. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +39 -0
  168. package/src/ts/rdb/trpc-connection/generator.js +13 -0
  169. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  170. package/src/ts/react-website/agui/files/common/src/components/__agentNameKebabCase__-chat.tsx.template +9 -0
  171. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +4 -1
  172. package/src/ts/react-website/agui/generator.d.ts +1 -5
  173. package/src/ts/react-website/agui/generator.js +6 -2
  174. package/src/ts/react-website/agui/generator.js.map +1 -1
  175. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +26 -26
  176. package/src/ts/react-website/app/generator.d.ts +1 -5
  177. package/src/ts/react-website/app/generator.js +3 -8
  178. package/src/ts/react-website/app/generator.js.map +1 -1
  179. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +2 -2
  180. package/src/utils/agent-connection/agent-connection.d.ts +2 -1
  181. package/src/utils/agent-connection/agent-connection.js +6 -1
  182. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  183. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +11 -7
  184. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +14 -6
  185. package/src/utils/agent-core-packaging.js +5 -5
  186. package/src/utils/agent-core-packaging.js.map +1 -1
  187. package/src/utils/api-constructs/api-constructs.d.ts +5 -0
  188. package/src/utils/api-constructs/api-constructs.js +8 -0
  189. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  190. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +4 -2
  191. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +4 -2
  192. package/src/utils/ast.d.ts +10 -0
  193. package/src/utils/ast.js +87 -15
  194. package/src/utils/ast.js.map +1 -1
  195. package/src/utils/dependencies.d.ts +10 -0
  196. package/src/utils/dependencies.js +93 -1
  197. package/src/utils/dependencies.js.map +1 -1
  198. package/src/utils/docker.d.ts +11 -0
  199. package/src/utils/docker.js +16 -3
  200. package/src/utils/docker.js.map +1 -1
  201. package/src/utils/dynamodb-config.d.ts +48 -0
  202. package/src/utils/dynamodb-config.js +44 -0
  203. package/src/utils/dynamodb-config.js.map +1 -0
  204. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +8 -4
  205. package/src/utils/files/common/shadcn/src/components/ui/alert.tsx.template +1 -2
  206. package/src/utils/files/common/shadcn/src/components/ui/avatar.tsx.template +1 -2
  207. package/src/utils/files/common/shadcn/src/components/ui/breadcrumb.tsx.template +1 -2
  208. package/src/utils/files/common/shadcn/src/components/ui/button.tsx.template +1 -2
  209. package/src/utils/files/common/shadcn/src/components/ui/card.tsx.template +1 -2
  210. package/src/utils/files/common/shadcn/src/components/ui/input.tsx.template +1 -2
  211. package/src/utils/files/common/shadcn/src/components/ui/separator.tsx.template +1 -2
  212. package/src/utils/files/common/shadcn/src/components/ui/sheet.tsx.template +1 -2
  213. package/src/utils/files/common/shadcn/src/components/ui/sidebar.tsx.template +1 -1
  214. package/src/utils/files/common/shadcn/src/components/ui/skeleton.tsx.template +1 -1
  215. package/src/utils/files/common/shadcn/src/components/ui/spinner.tsx.template +1 -2
  216. package/src/utils/files/common/shadcn/src/components/ui/textarea.tsx.template +1 -2
  217. package/src/utils/files/common/shadcn/src/components/ui/tooltip.tsx.template +1 -2
  218. package/src/utils/files/common/shadcn/src/lib/utils.ts.template +1 -6
  219. package/src/utils/git-secrets.d.ts +28 -0
  220. package/src/utils/git-secrets.js +66 -0
  221. package/src/utils/git-secrets.js.map +1 -0
  222. package/src/utils/init.js +7 -6
  223. package/src/utils/init.js.map +1 -1
  224. package/src/utils/local-project-dependency.d.ts +28 -0
  225. package/src/utils/local-project-dependency.js +40 -0
  226. package/src/utils/local-project-dependency.js.map +1 -0
  227. package/src/utils/nx.d.ts +14 -0
  228. package/src/utils/nx.js +30 -0
  229. package/src/utils/nx.js.map +1 -1
  230. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +11 -6
  231. package/src/utils/script-project-targets.d.ts +26 -0
  232. package/src/utils/script-project-targets.js +75 -0
  233. package/src/utils/script-project-targets.js.map +1 -0
  234. package/src/utils/shared-shadcn.d.ts +1 -3
  235. package/src/utils/shared-shadcn.js +1 -4
  236. package/src/utils/shared-shadcn.js.map +1 -1
  237. package/src/utils/versions.d.ts +52 -50
  238. package/src/utils/versions.js +55 -49
  239. package/src/utils/versions.js.map +1 -1
  240. package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +8 -4
  241. package/src/migrations/latest/add-assemble-target/migration.js.map +0 -1
  242. package/src/migrations/latest/agent-connection-pin-strands-peers/migration.js.map +0 -1
  243. package/src/migrations/latest/agent-core-vendor-target/migration.js.map +0 -1
  244. package/src/migrations/latest/declare-cacheable-target-inputs/migration.js.map +0 -1
  245. package/src/migrations/latest/dev-target-depends-on-pull-image/migration.js.map +0 -1
  246. package/src/migrations/latest/docker-target-cache-soundness/migration.js.map +0 -1
  247. package/src/migrations/latest/ignore-package-manager-temp-files/migration.js.map +0 -1
  248. package/src/migrations/latest/infra-deploy-express-mode/metadata.json +0 -3
  249. package/src/migrations/latest/infra-deploy-express-mode/migration.js.map +0 -1
  250. package/src/migrations/latest/open-api-codegen-executor/migration.js.map +0 -1
  251. package/src/migrations/latest/python-test-input-scoping/migration.js.map +0 -1
  252. package/src/migrations/latest/react-website-unique-dev-ports/migration.js.map +0 -1
  253. package/src/migrations/latest/rolldown-config-bundle-transient/migration.js.map +0 -1
  254. package/src/migrations/latest/shadcn-package-imports-exports/migration.js.map +0 -1
  255. package/src/migrations/latest/shx-fs-commands/migration.js.map +0 -1
  256. package/src/migrations/latest/terraform-fmt-check/migration.js.map +0 -1
  257. package/src/migrations/latest/terraform-provider-plugin-cache/migration.js.map +0 -1
  258. package/src/migrations/latest/vitest-coverage-output-dir/migration.js.map +0 -1
  259. package/src/py/dynamodb/files/__name__/__init__.py.template +0 -6
  260. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +0 -4
  261. package/src/py/dynamodb/files/config.json.template +0 -24
  262. package/src/ts/dynamodb/files/config.json.template +0 -24
  263. package/src/ts/dynamodb/files/src/entities/index.ts.template +0 -1
  264. package/src/ts/dynamodb/files/src/index.ts.template +0 -2
  265. /package/src/migrations/latest/{add-assemble-target → sandbox-pattern-nested-stacks}/migration.d.ts +0 -0
  266. /package/src/migrations/latest/{agent-core-vendor-target → shadcn-cn-package}/migration.d.ts +0 -0
  267. /package/src/migrations/{latest/dev-target-depends-on-pull-image → v1.0.0-rc.90/0001-dev-target-depends-on-pull-image}/metadata.json +0 -0
  268. /package/src/migrations/{latest/declare-cacheable-target-inputs → v1.0.0-rc.90/0001-dev-target-depends-on-pull-image}/migration.d.ts +0 -0
  269. /package/src/migrations/{latest/dev-target-depends-on-pull-image → v1.0.0-rc.90/0001-dev-target-depends-on-pull-image}/migration.js +0 -0
  270. /package/src/migrations/{latest/open-api-codegen-executor → v1.0.0-rc.90/0002-open-api-codegen-executor}/metadata.json +0 -0
  271. /package/src/migrations/{latest/dev-target-depends-on-pull-image → v1.0.0-rc.90/0002-open-api-codegen-executor}/migration.d.ts +0 -0
  272. /package/src/migrations/{latest/open-api-codegen-executor → v1.0.0-rc.90/0002-open-api-codegen-executor}/migration.js +0 -0
  273. /package/src/migrations/{latest/terraform-provider-plugin-cache → v1.0.0-rc.90/0003-terraform-provider-plugin-cache}/metadata.json +0 -0
  274. /package/src/migrations/{latest/docker-target-cache-soundness → v1.0.0-rc.90/0003-terraform-provider-plugin-cache}/migration.d.ts +0 -0
  275. /package/src/migrations/{latest/terraform-provider-plugin-cache → v1.0.0-rc.90/0003-terraform-provider-plugin-cache}/migration.js +0 -0
  276. /package/src/migrations/{latest/python-test-input-scoping → v1.0.0-rc.90/0004-python-test-input-scoping}/metadata.json +0 -0
  277. /package/src/migrations/{latest/infra-deploy-express-mode → v1.0.0-rc.90/0004-python-test-input-scoping}/migration.d.ts +0 -0
  278. /package/src/migrations/{latest/python-test-input-scoping → v1.0.0-rc.90/0004-python-test-input-scoping}/migration.js +0 -0
  279. /package/src/migrations/{latest/vitest-coverage-output-dir → v1.0.0-rc.90/0005-vitest-coverage-output-dir}/metadata.json +0 -0
  280. /package/src/migrations/{latest/open-api-codegen-executor → v1.0.0-rc.90/0005-vitest-coverage-output-dir}/migration.d.ts +0 -0
  281. /package/src/migrations/{latest/vitest-coverage-output-dir → v1.0.0-rc.90/0005-vitest-coverage-output-dir}/migration.js +0 -0
  282. /package/src/migrations/{latest/add-assemble-target → v1.0.0-rc.90/0006-add-assemble-target}/metadata.json +0 -0
  283. /package/src/migrations/{latest/python-test-input-scoping → v1.0.0-rc.90/0006-add-assemble-target}/migration.d.ts +0 -0
  284. /package/src/migrations/{latest/add-assemble-target → v1.0.0-rc.90/0006-add-assemble-target}/migration.js +0 -0
  285. /package/src/migrations/{latest/docker-target-cache-soundness → v1.0.0-rc.90/0007-docker-target-cache-soundness}/metadata.json +0 -0
  286. /package/src/migrations/{latest/react-website-unique-dev-ports → v1.0.0-rc.90/0007-docker-target-cache-soundness}/migration.d.ts +0 -0
  287. /package/src/migrations/{latest/docker-target-cache-soundness → v1.0.0-rc.90/0007-docker-target-cache-soundness}/migration.js +0 -0
  288. /package/src/migrations/{latest/declare-cacheable-target-inputs → v1.0.0-rc.90/0008-declare-cacheable-target-inputs}/metadata.json +0 -0
  289. /package/src/migrations/{latest/rolldown-config-bundle-transient → v1.0.0-rc.90/0008-declare-cacheable-target-inputs}/migration.d.ts +0 -0
  290. /package/src/migrations/{latest/declare-cacheable-target-inputs → v1.0.0-rc.90/0008-declare-cacheable-target-inputs}/migration.js +0 -0
  291. /package/src/migrations/{latest/terraform-fmt-check → v1.0.0-rc.90/0009-terraform-fmt-check}/metadata.json +0 -0
  292. /package/src/migrations/{latest/shadcn-package-imports-exports → v1.0.0-rc.90/0009-terraform-fmt-check}/migration.d.ts +0 -0
  293. /package/src/migrations/{latest/terraform-fmt-check → v1.0.0-rc.90/0009-terraform-fmt-check}/migration.js +0 -0
  294. /package/src/migrations/{latest/react-website-unique-dev-ports → v1.0.0-rc.92/0001-react-website-unique-dev-ports}/metadata.json +0 -0
  295. /package/src/migrations/{latest/shx-fs-commands → v1.0.0-rc.92/0001-react-website-unique-dev-ports}/migration.d.ts +0 -0
  296. /package/src/migrations/{latest/react-website-unique-dev-ports → v1.0.0-rc.92/0001-react-website-unique-dev-ports}/migration.js +0 -0
  297. /package/src/migrations/{latest/terraform-fmt-check → v1.0.0-rc.94/0001-infra-deploy-express-mode}/migration.d.ts +0 -0
  298. /package/src/migrations/{latest/shx-fs-commands → v1.0.0-rc.94/0002-shx-fs-commands}/metadata.json +0 -0
  299. /package/src/migrations/{latest/terraform-provider-plugin-cache → v1.0.0-rc.94/0002-shx-fs-commands}/migration.d.ts +0 -0
  300. /package/src/migrations/{latest/shx-fs-commands → v1.0.0-rc.94/0002-shx-fs-commands}/migration.js +0 -0
  301. /package/src/migrations/{latest/agent-core-vendor-target → v1.0.0-rc.94/0003-agent-core-vendor-target}/metadata.json +0 -0
  302. /package/src/migrations/{latest/vitest-coverage-output-dir → v1.0.0-rc.94/0003-agent-core-vendor-target}/migration.d.ts +0 -0
  303. /package/src/migrations/{latest/agent-core-vendor-target → v1.0.0-rc.94/0003-agent-core-vendor-target}/migration.js +0 -0
  304. /package/src/migrations/{latest/rolldown-config-bundle-transient → v1.0.0-rc.95/0001-rolldown-config-bundle-transient}/metadata.json +0 -0
  305. /package/src/migrations/{latest/rolldown-config-bundle-transient → v1.0.0-rc.95/0001-rolldown-config-bundle-transient}/migration.js +0 -0
  306. /package/src/migrations/{latest/agent-connection-pin-strands-peers → v1.0.0-rc.95/0002-agent-connection-pin-strands-peers}/metadata.json +0 -0
  307. /package/src/migrations/{latest/agent-connection-pin-strands-peers → v1.0.0-rc.95/0002-agent-connection-pin-strands-peers}/migration.d.ts +0 -0
  308. /package/src/migrations/{latest/agent-connection-pin-strands-peers → v1.0.0-rc.95/0002-agent-connection-pin-strands-peers}/migration.js +0 -0
  309. /package/src/migrations/{latest/ignore-package-manager-temp-files → v1.0.0-rc.95/0003-ignore-package-manager-temp-files}/metadata.json +0 -0
  310. /package/src/migrations/{latest/ignore-package-manager-temp-files → v1.0.0-rc.95/0003-ignore-package-manager-temp-files}/migration.d.ts +0 -0
  311. /package/src/migrations/{latest/ignore-package-manager-temp-files → v1.0.0-rc.95/0003-ignore-package-manager-temp-files}/migration.js +0 -0
  312. /package/src/migrations/{latest/shadcn-package-imports-exports → v1.0.0-rc.95/0004-shadcn-package-imports-exports}/metadata.json +0 -0
  313. /package/src/migrations/{latest/shadcn-package-imports-exports → v1.0.0-rc.95/0004-shadcn-package-imports-exports}/migration.js +0 -0
@@ -93,6 +93,14 @@ export declare const DEPENDENCIES: import("../../utils/declared-dependencies.js"
93
93
  readonly name: "minimatch";
94
94
  } & {
95
95
  versionOnly: true;
96
+ }, {
97
+ readonly name: "deepmerge-ts";
98
+ } & {
99
+ versionOnly: true;
100
+ }, {
101
+ readonly name: "mysql2";
102
+ } & {
103
+ versionOnly: true;
96
104
  }], readonly import("../../utils/declared-dependencies.js").DeclaredPyDependency<"ruff" | "a2a-sdk" | "ag-ui-langgraph" | "ag-ui-protocol" | "ag-ui-strands" | "aiosqlite" | "aws-lambda-powertools" | "aws-lambda-powertools[tracer]" | "aws-lambda-powertools[parser]" | "aws-opentelemetry-distro" | "bedrock-agentcore" | "boto3" | "checkov" | "fastapi" | "fastapi[standard]" | "httpx" | "langchain" | "langchain-aws" | "langchain-mcp-adapters" | "langgraph" | "langgraph-checkpoint-aws" | "langgraph-checkpoint-sqlite" | "mcp" | "pip-check-updates" | "pip-licenses" | "strands-agents" | "strands-agents[a2a]" | "strands-agents-tools" | "ty" | "pynamodb" | "uvicorn" | "sqlmodel" | "alembic" | "aiomysql" | "asyncpg" | "greenlet", TsRdbMetadata>[]>;
97
105
  export declare const TS_RDB_GENERATOR_INFO: NxGeneratorInfo;
98
106
  export declare const tsRdbGenerator: (tree: Tree, options: TsRdbGeneratorSchema) => Promise<GeneratorCallback>;
@@ -8,7 +8,7 @@ import { addStarExport } from "../../utils/ast.js";
8
8
  import { addTypeScriptBundleTarget, BUNDLE_DEPENDENCIES } from "../../utils/bundle/bundle.js";
9
9
  import { resolveContainers } from "../../utils/containers.js";
10
10
  import { declareDependencies, ownedElsewhere } from "../../utils/declared-dependencies.js";
11
- import { addDockerScanTarget, DOCKER_DEPENDENCIES, IMAGE_BUILD_CACHE, NODE_IMAGE_DEPENDENCIES, nodeImageVersions } from "../../utils/docker.js";
11
+ import { addDockerScanTarget, DOCKER_DEPENDENCIES, IMAGE_BUILD_CACHE, NODE_IMAGE_DEPENDENCIES, nodeImageVersions, PRISMA_IMAGE_DEPENDENCIES } from "../../utils/docker.js";
12
12
  import { formatFilesInSubtree } from "../../utils/format.js";
13
13
  import { FS_DEPENDENCIES, FsCommands } from "../../utils/fs.js";
14
14
  import { updateGitIgnore } from "../../utils/git.js";
@@ -88,7 +88,8 @@ export const DEPENDENCIES = declareDependencies()({
88
88
  ...ownedElsewhere(DOCKER_DEPENDENCIES),
89
89
  ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),
90
90
  ...ownedElsewhere(SHARED_RDB_SCRIPTS_DEPENDENCIES),
91
- ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES)
91
+ ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),
92
+ ...ownedElsewhere(PRISMA_IMAGE_DEPENDENCIES)
92
93
  ]
93
94
  });
94
95
  export const TS_RDB_GENERATOR_INFO = getGeneratorInfo(import.meta.filename);
@@ -138,6 +139,8 @@ export const tsRdbGenerator = async (tree, options)=>{
138
139
  databasePackageAlias: fullyQualifiedName,
139
140
  databaseProvider: options.engine === 'mysql' ? 'mysql' : 'postgresql',
140
141
  prismaVersion: TS_VERSIONS.prisma,
142
+ deepmergeTsVersion: TS_VERSIONS['deepmerge-ts'],
143
+ mysql2Version: TS_VERSIONS.mysql2,
141
144
  ...nodeImageVersions(),
142
145
  prismaAdapterPackage: options.engine === 'mysql' ? '@prisma/adapter-mariadb' : '@prisma/adapter-pg',
143
146
  prismaAdapterClassName: options.engine === 'mysql' ? 'PrismaMariaDb' : 'PrismaPg',
@@ -276,28 +279,29 @@ export const tsRdbGenerator = async (tree, options)=>{
276
279
  // which case neither provider's packages were added.
277
280
  const iac = options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;
278
281
  if (options.infra !== 'none') {
279
- if (iac === 'terraform') {
280
- projectConfig.targets['docker'] = {
281
- cache: IMAGE_BUILD_CACHE,
282
- executor: 'nx:run-commands',
283
- options: {
284
- command: `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`
285
- },
286
- dependsOn: [
287
- 'bundle'
288
- ]
289
- };
290
- addArtifactDependencyToTargets(projectConfig, 'docker');
291
- addDockerScanTarget(tree, {
292
- project: projectConfig,
293
- containerEngine,
294
- trivyTargetName: 'trivy',
295
- dockerTargetName: 'docker',
296
- imageTags: [
297
- migrationDockerImageTag
298
- ]
299
- }, DEPENDENCIES);
300
- }
282
+ // The migration image ships under both providers — Terraform pushes the
283
+ // locally built tag, CDK builds the same context as an image asset — so the
284
+ // build and its scan are wired up for either.
285
+ projectConfig.targets['docker'] = {
286
+ cache: IMAGE_BUILD_CACHE,
287
+ executor: 'nx:run-commands',
288
+ options: {
289
+ command: `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`
290
+ },
291
+ dependsOn: [
292
+ 'bundle'
293
+ ]
294
+ };
295
+ addArtifactDependencyToTargets(projectConfig, 'docker');
296
+ addDockerScanTarget(tree, {
297
+ project: projectConfig,
298
+ containerEngine,
299
+ trivyTargetName: 'trivy',
300
+ dockerTargetName: 'docker',
301
+ imageTags: [
302
+ migrationDockerImageTag
303
+ ]
304
+ }, DEPENDENCIES);
301
305
  addArtifactDependencyToTargets(projectConfig, 'bundle');
302
306
  }
303
307
  addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/rdb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { relative } from 'node:path';\nimport {\n detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readProjectConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n writeJson,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport { addStarExport } from '../../utils/ast.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n IMAGE_BUILD_CACHE,\n NODE_IMAGE_DEPENDENCIES,\n nodeImageVersions,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { updateGitIgnore } from '../../utils/git.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx.js';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_RDB_SCRIPTS_DEPENDENCIES,\n sharedRdbScriptsGenerator,\n} from '../../utils/shared-rdb-scripts.js';\nimport { TS_VERSIONS } from '../../utils/versions.js';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator.js';\nimport type { TsRdbGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsRdbMetadata extends IacMetadata {\n readonly engine: TsRdbGeneratorSchema['engine'];\n}\n\n// Each entry names the engine branch it belongs to, so the same declaration\n// drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<TsRdbMetadata>()({\n ts: [\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@aws-sdk/client-secrets-manager' },\n { name: '@aws-sdk/rds-signer' },\n { name: '@prisma/client' },\n { name: '@prisma/adapter-mariadb', when: (m) => m.engine === 'mysql' },\n { name: 'mariadb', when: (m) => m.engine === 'mysql' },\n { name: '@prisma/adapter-pg', when: (m) => m.engine !== 'mysql' },\n { name: 'pg', when: (m) => m.engine !== 'mysql' },\n { name: '@types/aws-lambda', dev: true },\n { name: '@types/pg', when: (m) => m.engine !== 'mysql', dev: true },\n // The prisma CLI and tsx run migration/seed scripts from the root.\n { name: 'prisma', dev: true, root: true },\n { name: 'tsx', dev: true, root: true },\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_RDB_SCRIPTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ],\n});\n\nexport const TS_RDB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsRdbGenerator = async (\n tree: Tree,\n options: TsRdbGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameKebabCase = kebabCase(options.name);\n const nameClassName = toClassName(options.name);\n const databaseUser = options.databaseUser ?? 'dbadmin';\n const databaseName = snakeCase(options.databaseName ?? options.name);\n const containerEngine = await resolveContainers(tree, 'inherit');\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n });\n\n let projectExists: boolean;\n try {\n readProjectConfiguration(tree, fullyQualifiedName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n await tsProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n preferInstallDependencies: false,\n });\n }\n\n updateJson(tree, joinPathFragments(dir, 'tsconfig.lib.json'), (tsConfig) => ({\n ...tsConfig,\n include: ['src/**/*.ts', 'generated/prisma/**/*.ts'],\n }));\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n const localDbPort = assignPort(\n tree,\n projectConfig,\n options.engine === 'mysql' ? 3306 : 5432,\n );\n const localDbHost = 'localhost';\n const localDbUser = options.engine === 'mysql' ? 'root' : 'dbadmin';\n const localDbPassword = 'password';\n const containerName = `${getNpmScope(tree)}-${databaseName}`;\n const dockerImage =\n options.engine === 'mysql'\n ? 'public.ecr.aws/docker/library/mysql:8.0.44'\n : 'public.ecr.aws/docker/library/postgres:17.7';\n\n const templateOptions = {\n engine: options.engine,\n runtimeConfigKey: nameClassName,\n databasePackageAlias: fullyQualifiedName,\n databaseProvider: options.engine === 'mysql' ? 'mysql' : 'postgresql',\n prismaVersion: TS_VERSIONS.prisma,\n ...nodeImageVersions(),\n prismaAdapterPackage:\n options.engine === 'mysql'\n ? '@prisma/adapter-mariadb'\n : '@prisma/adapter-pg',\n prismaAdapterClassName:\n options.engine === 'mysql' ? 'PrismaMariaDb' : 'PrismaPg',\n localDbPort,\n localDbHost,\n localDbName: databaseName,\n localDbUser,\n localDbPassword,\n containerEngine,\n containerName,\n dockerImage,\n ...esmVars(tree),\n };\n\n // The Prisma schema and models, the handlers and the prisma client module are\n // all user-editable, so a re-run (to add infrastructure, or after a failed\n // run) must not clobber the user's schema and edits.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The barrel re-exports prisma.ts. `tsProjectGenerator` writes a stub index.ts\n // when it creates the project, so the re-export is added to whatever is there\n // rather than replacing it — which also leaves a user's own additions to the\n // barrel alone on a re-run.\n await addStarExport(\n tree,\n joinPathFragments(dir, 'src', 'index.ts'),\n './prisma.js',\n );\n\n // config.json is framework-owned: it carries values derived from the\n // generator's options, so it converges on a re-run with changed options.\n writeJson(tree, joinPathFragments(dir, 'config.json'), {\n runtimeConfigKey: nameClassName,\n localDev: {\n containerEngine,\n containerName,\n image: dockerImage,\n port: localDbPort,\n host: localDbHost,\n dbName: databaseName,\n dbUser: localDbUser,\n dbPassword: localDbPassword,\n dbEngine: options.engine,\n },\n });\n updateGitIgnore(tree, dir, (patterns) => [...patterns, 'generated/prisma']);\n await sharedRdbScriptsGenerator(tree, options.engine, DEPENDENCIES);\n const waitForDbScript =\n options.engine === 'mysql'\n ? 'wait-for-mysql-db.ts'\n : 'wait-for-postgres-db.ts';\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'rdb'),\n );\n const relativePathToRoot = getRelativePathToRootByDirectory(\n projectConfig.root,\n );\n const fs = new FsCommands(tree, DEPENDENCIES);\n const migrationBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'migration',\n );\n const migrationDockerImageTag = `${getNpmScope(tree)}-${kebabCase(options.name)}-migration:latest`;\n\n if (options.infra !== 'none') {\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/migration-handler.ts',\n bundleOutputDir: 'migration',\n },\n DEPENDENCIES,\n );\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/create-db-user-handler.ts',\n bundleOutputDir: 'create-db-user',\n },\n DEPENDENCIES,\n );\n const bundleTarget = projectConfig.targets['bundle'];\n // The bundle target starts with a single rolldown `command`. Wrap it with\n // the migration asset copy steps, unless it has already been transformed\n // into a `commands` array on a previous run.\n if (!bundleTarget.options.commands) {\n const rolldownCommand = bundleTarget.options.command;\n delete bundleTarget.options.command;\n bundleTarget.options = {\n ...bundleTarget.options,\n commands: [\n fs.rm(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.mkdir(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.cpDir(\n 'prisma',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma`,\n ),\n fs.cpFile(\n 'prisma.config.ts',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma.config.ts`,\n ),\n fs.cpFile(\n 'Dockerfile',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/Dockerfile`,\n ),\n rolldownCommand,\n ],\n parallel: false,\n };\n }\n }\n\n projectConfig.targets.generate = {\n executor: 'nx:run-commands',\n outputs: ['{projectRoot}/generated/prisma'],\n options: {\n command: 'prisma generate',\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['pull-image'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/pull-image.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['dev'] = {\n executor: 'nx:run-commands',\n dependsOn: ['pull-image'],\n options: {\n command: `tsx ${scriptsDir}/start-container.ts`,\n cwd: '{projectRoot}',\n },\n continuous: true,\n };\n projectConfig.targets['wait-for-db'] = {\n executor: 'nx:run-commands',\n dependsOn: ['dev'],\n options: {\n command: `tsx ${scriptsDir}/${waitForDbScript}`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets.prisma = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n cwd: '{projectRoot}',\n command: 'prisma',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n // Recorded in the metadata below so the version sync can tell a CDK project\n // from a Terraform one; undefined when no infrastructure was generated, in\n // which case neither provider's packages were added.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (options.infra !== 'none') {\n if (iac === 'terraform') {\n projectConfig.targets['docker'] = {\n cache: IMAGE_BUILD_CACHE,\n executor: 'nx:run-commands',\n options: {\n command: `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`,\n },\n dependsOn: ['bundle'],\n };\n addArtifactDependencyToTargets(projectConfig, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project: projectConfig,\n containerEngine,\n trivyTargetName: 'trivy',\n dockerTargetName: 'docker',\n imageTags: [migrationDockerImageTag],\n },\n DEPENDENCIES,\n );\n }\n addArtifactDependencyToTargets(projectConfig, 'bundle');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n // Recorded here and read by the declaration's predicates, so the packages\n // added below are exactly the ones the version sync will own.\n const metadata: TsRdbMetadata = {\n engine: options.engine,\n ...(iac ? { iac } : {}),\n };\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n TS_RDB_GENERATOR_INFO,\n metadata,\n );\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase,\n databasePackageAlias: fullyQualifiedName,\n databaseName,\n adminUser: databaseUser,\n engine: options.engine,\n migrationBundleDir,\n createDbUserBundleDir: joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'create-db-user',\n ),\n framework: options.framework,\n migrationDockerImageTag,\n containerEngine,\n });\n }\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: projectConfig.root,\n });\n\n // @prisma/adapter-pg depends on @types/pg ^8.16.0. Yarn does not dedupe it to\n // the workspace's pinned @types/pg, so it installs a separate copy under the\n // adapter's own node_modules whenever a newer @types/pg is published. The two\n // copies declare structurally incompatible Pool types, so passing our `new\n // Pool(...)` to `new PrismaPg(...)` fails to compile. Scope the resolution to\n // the adapter so other @types/pg consumers are unaffected. Classic yarn only\n // honours the `**/`-prefixed descriptor in a workspace and berry only the\n // bare one, so declare both.\n if (options.engine === 'postgres' && detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n '@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n };\n return packageJson;\n });\n }\n\n registerPnpmBuiltDependencies(tree, {\n '@prisma/engines': false,\n prisma: false,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_RDB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsRdbGenerator;\n"],"names":["relative","detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateJson","updateProjectConfiguration","writeJson","addTsDependencies","addStarExport","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","snakeCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","getRelativePathToRootByDirectory","registerPnpmBuiltDependencies","assignPort","addRdbInfra","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_RDB_SCRIPTS_DEPENDENCIES","sharedRdbScriptsGenerator","TS_VERSIONS","tsProjectGenerator","getTsLibDetails","DEPENDENCIES","ts","name","when","m","engine","dev","root","TS_RDB_GENERATOR_INFO","filename","tsRdbGenerator","tree","options","nameKebabCase","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","tsConfig","include","projectConfig","localDbPort","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","databasePackageAlias","databaseProvider","prismaVersion","prisma","prismaAdapterPackage","prismaAdapterClassName","localDbName","dirname","overwriteStrategy","KeepExisting","localDev","image","port","host","dbName","dbUser","dbPassword","dbEngine","patterns","waitForDbScript","scriptsDir","relativePathToRoot","fs","migrationBundleDir","migrationDockerImageTag","infra","targetFilePath","bundleOutputDir","bundleTarget","targets","commands","rolldownCommand","command","rm","mkdir","cpDir","cpFile","parallel","generate","executor","outputs","cwd","dependsOn","continuous","env","LOCAL_DEV","iac","undefined","cache","project","trivyTargetName","dockerTargetName","imageTags","metadata","projectName","projectRoot","adminUser","createDbUserBundleDir","framework","packageJson","resolutions","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/rdb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { relative } from 'node:path';\nimport {\n detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readProjectConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n writeJson,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport { addStarExport } from '../../utils/ast.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n IMAGE_BUILD_CACHE,\n NODE_IMAGE_DEPENDENCIES,\n nodeImageVersions,\n PRISMA_IMAGE_DEPENDENCIES,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { updateGitIgnore } from '../../utils/git.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx.js';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_RDB_SCRIPTS_DEPENDENCIES,\n sharedRdbScriptsGenerator,\n} from '../../utils/shared-rdb-scripts.js';\nimport { TS_VERSIONS } from '../../utils/versions.js';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator.js';\nimport type { TsRdbGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsRdbMetadata extends IacMetadata {\n readonly engine: TsRdbGeneratorSchema['engine'];\n}\n\n// Each entry names the engine branch it belongs to, so the same declaration\n// drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<TsRdbMetadata>()({\n ts: [\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@aws-sdk/client-secrets-manager' },\n { name: '@aws-sdk/rds-signer' },\n { name: '@prisma/client' },\n { name: '@prisma/adapter-mariadb', when: (m) => m.engine === 'mysql' },\n { name: 'mariadb', when: (m) => m.engine === 'mysql' },\n { name: '@prisma/adapter-pg', when: (m) => m.engine !== 'mysql' },\n { name: 'pg', when: (m) => m.engine !== 'mysql' },\n { name: '@types/aws-lambda', dev: true },\n { name: '@types/pg', when: (m) => m.engine !== 'mysql', dev: true },\n // The prisma CLI and tsx run migration/seed scripts from the root.\n { name: 'prisma', dev: true, root: true },\n { name: 'tsx', dev: true, root: true },\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_RDB_SCRIPTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ...ownedElsewhere(PRISMA_IMAGE_DEPENDENCIES),\n ],\n});\n\nexport const TS_RDB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsRdbGenerator = async (\n tree: Tree,\n options: TsRdbGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameKebabCase = kebabCase(options.name);\n const nameClassName = toClassName(options.name);\n const databaseUser = options.databaseUser ?? 'dbadmin';\n const databaseName = snakeCase(options.databaseName ?? options.name);\n const containerEngine = await resolveContainers(tree, 'inherit');\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n });\n\n let projectExists: boolean;\n try {\n readProjectConfiguration(tree, fullyQualifiedName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n await tsProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n preferInstallDependencies: false,\n });\n }\n\n updateJson(tree, joinPathFragments(dir, 'tsconfig.lib.json'), (tsConfig) => ({\n ...tsConfig,\n include: ['src/**/*.ts', 'generated/prisma/**/*.ts'],\n }));\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n const localDbPort = assignPort(\n tree,\n projectConfig,\n options.engine === 'mysql' ? 3306 : 5432,\n );\n const localDbHost = 'localhost';\n const localDbUser = options.engine === 'mysql' ? 'root' : 'dbadmin';\n const localDbPassword = 'password';\n const containerName = `${getNpmScope(tree)}-${databaseName}`;\n const dockerImage =\n options.engine === 'mysql'\n ? 'public.ecr.aws/docker/library/mysql:8.0.44'\n : 'public.ecr.aws/docker/library/postgres:17.7';\n\n const templateOptions = {\n engine: options.engine,\n runtimeConfigKey: nameClassName,\n databasePackageAlias: fullyQualifiedName,\n databaseProvider: options.engine === 'mysql' ? 'mysql' : 'postgresql',\n prismaVersion: TS_VERSIONS.prisma,\n deepmergeTsVersion: TS_VERSIONS['deepmerge-ts'],\n mysql2Version: TS_VERSIONS.mysql2,\n ...nodeImageVersions(),\n prismaAdapterPackage:\n options.engine === 'mysql'\n ? '@prisma/adapter-mariadb'\n : '@prisma/adapter-pg',\n prismaAdapterClassName:\n options.engine === 'mysql' ? 'PrismaMariaDb' : 'PrismaPg',\n localDbPort,\n localDbHost,\n localDbName: databaseName,\n localDbUser,\n localDbPassword,\n containerEngine,\n containerName,\n dockerImage,\n ...esmVars(tree),\n };\n\n // The Prisma schema and models, the handlers and the prisma client module are\n // all user-editable, so a re-run (to add infrastructure, or after a failed\n // run) must not clobber the user's schema and edits.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The barrel re-exports prisma.ts. `tsProjectGenerator` writes a stub index.ts\n // when it creates the project, so the re-export is added to whatever is there\n // rather than replacing it — which also leaves a user's own additions to the\n // barrel alone on a re-run.\n await addStarExport(\n tree,\n joinPathFragments(dir, 'src', 'index.ts'),\n './prisma.js',\n );\n\n // config.json is framework-owned: it carries values derived from the\n // generator's options, so it converges on a re-run with changed options.\n writeJson(tree, joinPathFragments(dir, 'config.json'), {\n runtimeConfigKey: nameClassName,\n localDev: {\n containerEngine,\n containerName,\n image: dockerImage,\n port: localDbPort,\n host: localDbHost,\n dbName: databaseName,\n dbUser: localDbUser,\n dbPassword: localDbPassword,\n dbEngine: options.engine,\n },\n });\n updateGitIgnore(tree, dir, (patterns) => [...patterns, 'generated/prisma']);\n await sharedRdbScriptsGenerator(tree, options.engine, DEPENDENCIES);\n const waitForDbScript =\n options.engine === 'mysql'\n ? 'wait-for-mysql-db.ts'\n : 'wait-for-postgres-db.ts';\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'rdb'),\n );\n const relativePathToRoot = getRelativePathToRootByDirectory(\n projectConfig.root,\n );\n const fs = new FsCommands(tree, DEPENDENCIES);\n const migrationBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'migration',\n );\n const migrationDockerImageTag = `${getNpmScope(tree)}-${kebabCase(options.name)}-migration:latest`;\n\n if (options.infra !== 'none') {\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/migration-handler.ts',\n bundleOutputDir: 'migration',\n },\n DEPENDENCIES,\n );\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/create-db-user-handler.ts',\n bundleOutputDir: 'create-db-user',\n },\n DEPENDENCIES,\n );\n const bundleTarget = projectConfig.targets['bundle'];\n // The bundle target starts with a single rolldown `command`. Wrap it with\n // the migration asset copy steps, unless it has already been transformed\n // into a `commands` array on a previous run.\n if (!bundleTarget.options.commands) {\n const rolldownCommand = bundleTarget.options.command;\n delete bundleTarget.options.command;\n bundleTarget.options = {\n ...bundleTarget.options,\n commands: [\n fs.rm(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.mkdir(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.cpDir(\n 'prisma',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma`,\n ),\n fs.cpFile(\n 'prisma.config.ts',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma.config.ts`,\n ),\n fs.cpFile(\n 'Dockerfile',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/Dockerfile`,\n ),\n rolldownCommand,\n ],\n parallel: false,\n };\n }\n }\n\n projectConfig.targets.generate = {\n executor: 'nx:run-commands',\n outputs: ['{projectRoot}/generated/prisma'],\n options: {\n command: 'prisma generate',\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['pull-image'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/pull-image.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['dev'] = {\n executor: 'nx:run-commands',\n dependsOn: ['pull-image'],\n options: {\n command: `tsx ${scriptsDir}/start-container.ts`,\n cwd: '{projectRoot}',\n },\n continuous: true,\n };\n projectConfig.targets['wait-for-db'] = {\n executor: 'nx:run-commands',\n dependsOn: ['dev'],\n options: {\n command: `tsx ${scriptsDir}/${waitForDbScript}`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets.prisma = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n cwd: '{projectRoot}',\n command: 'prisma',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n // Recorded in the metadata below so the version sync can tell a CDK project\n // from a Terraform one; undefined when no infrastructure was generated, in\n // which case neither provider's packages were added.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (options.infra !== 'none') {\n // The migration image ships under both providers — Terraform pushes the\n // locally built tag, CDK builds the same context as an image asset — so the\n // build and its scan are wired up for either.\n projectConfig.targets['docker'] = {\n cache: IMAGE_BUILD_CACHE,\n executor: 'nx:run-commands',\n options: {\n command: `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`,\n },\n dependsOn: ['bundle'],\n };\n addArtifactDependencyToTargets(projectConfig, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project: projectConfig,\n containerEngine,\n trivyTargetName: 'trivy',\n dockerTargetName: 'docker',\n imageTags: [migrationDockerImageTag],\n },\n DEPENDENCIES,\n );\n addArtifactDependencyToTargets(projectConfig, 'bundle');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n // Recorded here and read by the declaration's predicates, so the packages\n // added below are exactly the ones the version sync will own.\n const metadata: TsRdbMetadata = {\n engine: options.engine,\n ...(iac ? { iac } : {}),\n };\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n TS_RDB_GENERATOR_INFO,\n metadata,\n );\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase,\n databasePackageAlias: fullyQualifiedName,\n databaseName,\n adminUser: databaseUser,\n engine: options.engine,\n migrationBundleDir,\n createDbUserBundleDir: joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'create-db-user',\n ),\n framework: options.framework,\n migrationDockerImageTag,\n containerEngine,\n });\n }\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: projectConfig.root,\n });\n\n // @prisma/adapter-pg depends on @types/pg ^8.16.0. Yarn does not dedupe it to\n // the workspace's pinned @types/pg, so it installs a separate copy under the\n // adapter's own node_modules whenever a newer @types/pg is published. The two\n // copies declare structurally incompatible Pool types, so passing our `new\n // Pool(...)` to `new PrismaPg(...)` fails to compile. Scope the resolution to\n // the adapter so other @types/pg consumers are unaffected. Classic yarn only\n // honours the `**/`-prefixed descriptor in a workspace and berry only the\n // bare one, so declare both.\n if (options.engine === 'postgres' && detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n '@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n };\n return packageJson;\n });\n }\n\n registerPnpmBuiltDependencies(tree, {\n '@prisma/engines': false,\n prisma: false,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_RDB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsRdbGenerator;\n"],"names":["relative","detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateJson","updateProjectConfiguration","writeJson","addTsDependencies","addStarExport","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","PRISMA_IMAGE_DEPENDENCIES","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","snakeCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","getRelativePathToRootByDirectory","registerPnpmBuiltDependencies","assignPort","addRdbInfra","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_RDB_SCRIPTS_DEPENDENCIES","sharedRdbScriptsGenerator","TS_VERSIONS","tsProjectGenerator","getTsLibDetails","DEPENDENCIES","ts","name","when","m","engine","dev","root","TS_RDB_GENERATOR_INFO","filename","tsRdbGenerator","tree","options","nameKebabCase","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","tsConfig","include","projectConfig","localDbPort","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","databasePackageAlias","databaseProvider","prismaVersion","prisma","deepmergeTsVersion","mysql2Version","mysql2","prismaAdapterPackage","prismaAdapterClassName","localDbName","dirname","overwriteStrategy","KeepExisting","localDev","image","port","host","dbName","dbUser","dbPassword","dbEngine","patterns","waitForDbScript","scriptsDir","relativePathToRoot","fs","migrationBundleDir","migrationDockerImageTag","infra","targetFilePath","bundleOutputDir","bundleTarget","targets","commands","rolldownCommand","command","rm","mkdir","cpDir","cpFile","parallel","generate","executor","outputs","cwd","dependsOn","continuous","env","LOCAL_DEV","iac","undefined","cache","project","trivyTargetName","dockerTargetName","imageTags","metadata","projectName","projectRoot","adminUser","createDbUserBundleDir","framework","packageJson","resolutions","languages"],"mappings":"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"}
@@ -82,3 +82,42 @@ export const createDbPlugin = () => {
82
82
  };
83
83
  "
84
84
  `;
85
+
86
+ exports[`ts#rdb trpc-connection generator > should widen the root context in init.ts 1`] = `
87
+ "import { IDbContext } from './middleware/db.js';
88
+ import { initTRPC } from '@trpc/server';
89
+ import {
90
+ createErrorPlugin,
91
+ createLoggerPlugin,
92
+ IMiddlewareContext,
93
+ } from './middleware/index.js';
94
+
95
+ export type Context = IMiddlewareContext & IDbContext;
96
+
97
+ export const t = initTRPC.context<Context>().create();
98
+
99
+ export const publicProcedure = t.procedure
100
+ .concat(createLoggerPlugin())
101
+ .concat(createErrorPlugin());
102
+ "
103
+ `;
104
+
105
+ exports[`ts#rdb trpc-connection generator > should widen the root context once per database 1`] = `
106
+ "import { IOtherDbContext } from './middleware/other-db.js';
107
+ import { IDbContext } from './middleware/db.js';
108
+ import { initTRPC } from '@trpc/server';
109
+ import {
110
+ createErrorPlugin,
111
+ createLoggerPlugin,
112
+ IMiddlewareContext,
113
+ } from './middleware/index.js';
114
+
115
+ export type Context = IMiddlewareContext & IDbContext & IOtherDbContext;
116
+
117
+ export const t = initTRPC.context<Context>().create();
118
+
119
+ export const publicProcedure = t.procedure
120
+ .concat(createLoggerPlugin())
121
+ .concat(createErrorPlugin());
122
+ "
123
+ `;
@@ -3,6 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
5
5
  import camelCase from "lodash.camelcase";
6
+ import { addDestructuredImport, applyGritQL, matchGritQL } from "../../../utils/ast.js";
6
7
  import { formatFilesInSubtree } from "../../../utils/format.js";
7
8
  import { addGeneratorMetricsIfApplicable } from "../../../utils/metrics.js";
8
9
  import { kebabCase, pascalCase } from "../../../utils/names.js";
@@ -35,6 +36,18 @@ export const tsRdbTrpcConnectionGenerator = async (tree, options)=>{
35
36
  }, {
36
37
  overwriteStrategy: OverwriteStrategy.KeepExisting
37
38
  });
39
+ // Widen the root context so procedures composed with the plugin typecheck.
40
+ const initPath = joinPathFragments(sourceProject.root, 'src', 'init.ts');
41
+ const contextInterface = `I${rdbNamePascal}Context`;
42
+ if (tree.exists(initPath)) {
43
+ await applyGritQL(tree, initPath, `\`export type Context = $ctx;\` => \`export type Context = $ctx & ${contextInterface};\` where { $ctx <: not contains \`${contextInterface}\` }`);
44
+ const contextIncludesDb = await matchGritQL(tree, initPath, `\`export type Context = $ctx;\` where { $ctx <: contains \`${contextInterface}\` }`);
45
+ if (contextIncludesDb) {
46
+ await addDestructuredImport(tree, initPath, [
47
+ contextInterface
48
+ ], `./middleware/${rdbNameKebab}.js`);
49
+ }
50
+ }
38
51
  // Recorded so the version sync can identify this connection.
39
52
  addComponentGeneratorMetadata(tree, sourceProject.name, TS_RDB_TRPC_CONNECTION_GENERATOR_INFO, joinPathFragments('src', 'middleware', `${rdbNameKebab}.ts`), rdbNameCamel);
40
53
  await addGeneratorMetricsIfApplicable(tree, [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/rdb/trpc-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport camelCase from 'lodash.camelcase';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { kebabCase, pascalCase } from '../../../utils/names.js';\nimport {\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport type { TsRdbTrpcConnectionGeneratorSchema } from './schema';\n\nexport const TS_RDB_TRPC_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsRdbTrpcConnectionGenerator = async (\n tree: Tree,\n options: TsRdbTrpcConnectionGeneratorSchema,\n): Promise<void> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n if (sourceProject.targets?.['dev']) {\n addDependencyToTargetIfNotPresent(sourceProject, 'dev', {\n projects: [targetProject.name],\n target: 'dev',\n });\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n const rdbBaseName = targetProject.name.split('/').pop();\n const rdbNameKebab = kebabCase(rdbBaseName);\n const rdbNameCamel = camelCase(rdbBaseName);\n const rdbNamePascal = pascalCase(rdbBaseName);\n const rdbPackageAlias = targetProject.name;\n const engine = ((targetProject.metadata as any) ?? {}).engine ?? 'PostgreSQL';\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n sourceProject.root,\n { rdbNameKebab, rdbNameCamel, rdbNamePascal, rdbPackageAlias, engine },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Recorded so the version sync can identify this connection.\n addComponentGeneratorMetadata(\n tree,\n sourceProject.name,\n TS_RDB_TRPC_CONNECTION_GENERATOR_INFO,\n joinPathFragments('src', 'middleware', `${rdbNameKebab}.ts`),\n rdbNameCamel,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_RDB_TRPC_CONNECTION_GENERATOR_INFO,\n ]);\n await formatFilesInSubtree(tree);\n};\n\nexport default tsRdbTrpcConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","camelCase","formatFilesInSubtree","addGeneratorMetricsIfApplicable","kebabCase","pascalCase","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","TS_RDB_TRPC_CONNECTION_GENERATOR_INFO","filename","tsRdbTrpcConnectionGenerator","tree","options","sourceProject","targetProject","targets","projects","name","target","rdbBaseName","split","pop","rdbNameKebab","rdbNameCamel","rdbNamePascal","rdbPackageAlias","engine","metadata","dirname","root","overwriteStrategy","KeepExisting"],"mappings":"AAAA;;;CAGC,GACD,SACEA,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,EAEjBC,0BAA0B,QACrB,aAAa;AACpB,OAAOC,eAAe,mBAAmB;AACzC,SAASC,oBAAoB,QAAQ,2BAA2B;AAChE,SAASC,+BAA+B,QAAQ,4BAA4B;AAC5E,SAASC,SAAS,EAAEC,UAAU,QAAQ,0BAA0B;AAChE,SACEC,6BAA6B,EAC7BC,iCAAiC,EACjCC,gBAAgB,EAEhBC,mCAAmC,QAC9B,uBAAuB;AAG9B,OAAO,MAAMC,wCACXF,iBAAiB,YAAYG,QAAQ,EAAE;AAEzC,OAAO,MAAMC,+BAA+B,OAC1CC,MACAC;IAEA,MAAMC,gBAAgBN,oCACpBI,MACAC,QAAQC,aAAa;IAEvB,MAAMC,gBAAgBP,oCACpBI,MACAC,QAAQE,aAAa;IAGvB,IAAID,cAAcE,OAAO,EAAE,CAAC,MAAM,EAAE;QAClCV,kCAAkCQ,eAAe,OAAO;YACtDG,UAAU;gBAACF,cAAcG,IAAI;aAAC;YAC9BC,QAAQ;QACV;QACApB,2BAA2Ba,MAAME,cAAcI,IAAI,EAAEJ;IACvD;IAEA,MAAMM,cAAcL,cAAcG,IAAI,CAACG,KAAK,CAAC,KAAKC,GAAG;IACrD,MAAMC,eAAepB,UAAUiB;IAC/B,MAAMI,eAAexB,UAAUoB;IAC/B,MAAMK,gBAAgBrB,WAAWgB;IACjC,MAAMM,kBAAkBX,cAAcG,IAAI;IAC1C,MAAMS,SAAS,AAAC,CAAA,AAACZ,cAAca,QAAQ,IAAY,CAAC,CAAA,EAAGD,MAAM,IAAI;IAEjE/B,cACEgB,MACAf,kBAAkB,YAAYgC,OAAO,EAAE,UACvCf,cAAcgB,IAAI,EAClB;QAAEP;QAAcC;QAAcC;QAAeC;QAAiBC;IAAO,GACrE;QAAEI,mBAAmBjC,kBAAkBkC,YAAY;IAAC;IAGtD,6DAA6D;IAC7D3B,8BACEO,MACAE,cAAcI,IAAI,EAClBT,uCACAZ,kBAAkB,OAAO,cAAc,GAAG0B,aAAa,GAAG,CAAC,GAC3DC;IAGF,MAAMtB,gCAAgCU,MAAM;QAC1CH;KACD;IACD,MAAMR,qBAAqBW;AAC7B,EAAE;AAEF,eAAeD,6BAA6B"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/rdb/trpc-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport camelCase from 'lodash.camelcase';\nimport {\n addDestructuredImport,\n applyGritQL,\n matchGritQL,\n} from '../../../utils/ast.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { kebabCase, pascalCase } from '../../../utils/names.js';\nimport {\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport type { TsRdbTrpcConnectionGeneratorSchema } from './schema';\n\nexport const TS_RDB_TRPC_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsRdbTrpcConnectionGenerator = async (\n tree: Tree,\n options: TsRdbTrpcConnectionGeneratorSchema,\n): Promise<void> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n if (sourceProject.targets?.['dev']) {\n addDependencyToTargetIfNotPresent(sourceProject, 'dev', {\n projects: [targetProject.name],\n target: 'dev',\n });\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n const rdbBaseName = targetProject.name.split('/').pop();\n const rdbNameKebab = kebabCase(rdbBaseName);\n const rdbNameCamel = camelCase(rdbBaseName);\n const rdbNamePascal = pascalCase(rdbBaseName);\n const rdbPackageAlias = targetProject.name;\n const engine = ((targetProject.metadata as any) ?? {}).engine ?? 'PostgreSQL';\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n sourceProject.root,\n { rdbNameKebab, rdbNameCamel, rdbNamePascal, rdbPackageAlias, engine },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Widen the root context so procedures composed with the plugin typecheck.\n const initPath = joinPathFragments(sourceProject.root, 'src', 'init.ts');\n const contextInterface = `I${rdbNamePascal}Context`;\n if (tree.exists(initPath)) {\n await applyGritQL(\n tree,\n initPath,\n `\\`export type Context = $ctx;\\` => \\`export type Context = $ctx & ${contextInterface};\\` where { $ctx <: not contains \\`${contextInterface}\\` }`,\n );\n\n const contextIncludesDb = await matchGritQL(\n tree,\n initPath,\n `\\`export type Context = $ctx;\\` where { $ctx <: contains \\`${contextInterface}\\` }`,\n );\n if (contextIncludesDb) {\n await addDestructuredImport(\n tree,\n initPath,\n [contextInterface],\n `./middleware/${rdbNameKebab}.js`,\n );\n }\n }\n\n // Recorded so the version sync can identify this connection.\n addComponentGeneratorMetadata(\n tree,\n sourceProject.name,\n TS_RDB_TRPC_CONNECTION_GENERATOR_INFO,\n joinPathFragments('src', 'middleware', `${rdbNameKebab}.ts`),\n rdbNameCamel,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_RDB_TRPC_CONNECTION_GENERATOR_INFO,\n ]);\n await formatFilesInSubtree(tree);\n};\n\nexport default tsRdbTrpcConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","camelCase","addDestructuredImport","applyGritQL","matchGritQL","formatFilesInSubtree","addGeneratorMetricsIfApplicable","kebabCase","pascalCase","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","TS_RDB_TRPC_CONNECTION_GENERATOR_INFO","filename","tsRdbTrpcConnectionGenerator","tree","options","sourceProject","targetProject","targets","projects","name","target","rdbBaseName","split","pop","rdbNameKebab","rdbNameCamel","rdbNamePascal","rdbPackageAlias","engine","metadata","dirname","root","overwriteStrategy","KeepExisting","initPath","contextInterface","exists","contextIncludesDb"],"mappings":"AAAA;;;CAGC,GACD,SACEA,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,EAEjBC,0BAA0B,QACrB,aAAa;AACpB,OAAOC,eAAe,mBAAmB;AACzC,SACEC,qBAAqB,EACrBC,WAAW,EACXC,WAAW,QACN,wBAAwB;AAC/B,SAASC,oBAAoB,QAAQ,2BAA2B;AAChE,SAASC,+BAA+B,QAAQ,4BAA4B;AAC5E,SAASC,SAAS,EAAEC,UAAU,QAAQ,0BAA0B;AAChE,SACEC,6BAA6B,EAC7BC,iCAAiC,EACjCC,gBAAgB,EAEhBC,mCAAmC,QAC9B,uBAAuB;AAG9B,OAAO,MAAMC,wCACXF,iBAAiB,YAAYG,QAAQ,EAAE;AAEzC,OAAO,MAAMC,+BAA+B,OAC1CC,MACAC;IAEA,MAAMC,gBAAgBN,oCACpBI,MACAC,QAAQC,aAAa;IAEvB,MAAMC,gBAAgBP,oCACpBI,MACAC,QAAQE,aAAa;IAGvB,IAAID,cAAcE,OAAO,EAAE,CAAC,MAAM,EAAE;QAClCV,kCAAkCQ,eAAe,OAAO;YACtDG,UAAU;gBAACF,cAAcG,IAAI;aAAC;YAC9BC,QAAQ;QACV;QACAvB,2BAA2BgB,MAAME,cAAcI,IAAI,EAAEJ;IACvD;IAEA,MAAMM,cAAcL,cAAcG,IAAI,CAACG,KAAK,CAAC,KAAKC,GAAG;IACrD,MAAMC,eAAepB,UAAUiB;IAC/B,MAAMI,eAAe3B,UAAUuB;IAC/B,MAAMK,gBAAgBrB,WAAWgB;IACjC,MAAMM,kBAAkBX,cAAcG,IAAI;IAC1C,MAAMS,SAAS,AAAC,CAAA,AAACZ,cAAca,QAAQ,IAAY,CAAC,CAAA,EAAGD,MAAM,IAAI;IAEjElC,cACEmB,MACAlB,kBAAkB,YAAYmC,OAAO,EAAE,UACvCf,cAAcgB,IAAI,EAClB;QAAEP;QAAcC;QAAcC;QAAeC;QAAiBC;IAAO,GACrE;QAAEI,mBAAmBpC,kBAAkBqC,YAAY;IAAC;IAGtD,2EAA2E;IAC3E,MAAMC,WAAWvC,kBAAkBoB,cAAcgB,IAAI,EAAE,OAAO;IAC9D,MAAMI,mBAAmB,CAAC,CAAC,EAAET,cAAc,OAAO,CAAC;IACnD,IAAIb,KAAKuB,MAAM,CAACF,WAAW;QACzB,MAAMlC,YACJa,MACAqB,UACA,CAAC,kEAAkE,EAAEC,iBAAiB,mCAAmC,EAAEA,iBAAiB,IAAI,CAAC;QAGnJ,MAAME,oBAAoB,MAAMpC,YAC9BY,MACAqB,UACA,CAAC,2DAA2D,EAAEC,iBAAiB,IAAI,CAAC;QAEtF,IAAIE,mBAAmB;YACrB,MAAMtC,sBACJc,MACAqB,UACA;gBAACC;aAAiB,EAClB,CAAC,aAAa,EAAEX,aAAa,GAAG,CAAC;QAErC;IACF;IAEA,6DAA6D;IAC7DlB,8BACEO,MACAE,cAAcI,IAAI,EAClBT,uCACAf,kBAAkB,OAAO,cAAc,GAAG6B,aAAa,GAAG,CAAC,GAC3DC;IAGF,MAAMtB,gCAAgCU,MAAM;QAC1CH;KACD;IACD,MAAMR,qBAAqBW;AAC7B,EAAE;AAEF,eAAeD,6BAA6B"}
@@ -0,0 +1,9 @@
1
+ import { CopilotChat } from './copilot';
2
+ import type { CopilotChatProps } from '@copilotkit/react-core/v2';
3
+ import { <%= agentNameConstantName %>_ID } from '../hooks/useAgui<%= agentNameClassName %>';
4
+
5
+ export const <%= agentNameClassName %>Chat = (
6
+ props: Omit<CopilotChatProps, 'agentId'>,
7
+ ) => <CopilotChat agentId={<%= agentNameConstantName %>_ID} {...props} />;
8
+
9
+ export default <%= agentNameClassName %>Chat;
@@ -104,6 +104,9 @@ class AgentCoreHttpAgent extends HttpAgent {
104
104
  }
105
105
  <%_ } _%>
106
106
 
107
+ // The id this agent is registered under, used as `agentId` by CopilotKit components.
108
+ export const <%= agentNameConstantName %>_ID = '<%= agentName %>';
109
+
107
110
  export const useAgui<%= agentNameClassName %> = (): Record<string, AbstractAgent> => {
108
111
  const runtimeConfig = useRuntimeConfig();
109
112
  <%_ if (gatewayRoute) { _%>
@@ -138,6 +141,6 @@ export const useAgui<%= agentNameClassName %> = (): Record<string, AbstractAgent
138
141
  const agent = new AgentCoreHttpAgent({ url });
139
142
  <%_ } _%>
140
143
 
141
- return { '<%= agentName %>': agent };
144
+ return { [<%= agentNameConstantName %>_ID]: agent };
142
145
  }, [url<% if (auth === 'iam') { %>, sigv4<% } else if (auth === 'cognito') { %>, auth<% } %>]);
143
146
  };
@@ -50,11 +50,7 @@ export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.
50
50
  } & {
51
51
  versionOnly: true;
52
52
  }, {
53
- readonly name: "clsx";
54
- } & {
55
- versionOnly: true;
56
- }, {
57
- readonly name: "tailwind-merge";
53
+ readonly name: "cn";
58
54
  } & {
59
55
  versionOnly: true;
60
56
  }, {
@@ -6,7 +6,7 @@ import { addAgentRuntimeToConnectionNamespace } from "../../../connection/agent-
6
6
  import { addTsDependencies } from "../../../utils/add-dependencies.js";
7
7
  import { addDestructuredImport, addSingleImport, applyGritQL } from "../../../utils/ast.js";
8
8
  import { declareDependencies, ownedElsewhere } from "../../../utils/declared-dependencies.js";
9
- import { kebabCase } from "../../../utils/names.js";
9
+ import { kebabCase, snakeCase } from "../../../utils/names.js";
10
10
  import { getNpmScopePrefix } from "../../../utils/npm-scope.js";
11
11
  import { registerPnpmBuiltDependencies } from "../../../utils/pnpm-workspace.js";
12
12
  import { addSharedShadcnDependency, SHADCN_DEPENDENCIES, sharedShadcnGenerator } from "../../../utils/shared-shadcn.js";
@@ -76,12 +76,16 @@ export const DEPENDENCIES = declareDependencies()({
76
76
  auth
77
77
  };
78
78
  const scopeAlias = getNpmScopePrefix(tree);
79
- // Generates `src/components/AguiProvider.tsx` (if absent) and
79
+ // Generates `src/components/AguiProvider.tsx` (if absent),
80
+ // `src/components/<agent-name>-chat.tsx` and
80
81
  // `src/hooks/useAgui<AgentName>.tsx`. Existing files are kept so re-running
81
82
  // the generator is idempotent.
82
83
  generateFiles(tree, joinPathFragments(import.meta.dirname, 'files', 'common'), frontendProjectConfig.root, {
83
84
  agentName,
84
85
  agentNameClassName,
86
+ agentNameKebabCase: kebabCase(agentNameClassName),
87
+ // STORY_AGENT, naming the exported `<name>_ID` constant
88
+ agentNameConstantName: snakeCase(agentNameClassName).toUpperCase(),
85
89
  auth,
86
90
  gatewayRoute
87
91
  }, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/react-website/agui/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n} from '@nx/devkit';\nimport { addAgentRuntimeToConnectionNamespace } from '../../../connection/agent-runtime-config.js';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport {\n addDestructuredImport,\n addSingleImport,\n applyGritQL,\n} from '../../../utils/ast.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { kebabCase } from '../../../utils/names.js';\nimport { getNpmScopePrefix } from '../../../utils/npm-scope.js';\nimport { registerPnpmBuiltDependencies } from '../../../utils/pnpm-workspace.js';\nimport {\n addSharedShadcnDependency,\n SHADCN_DEPENDENCIES,\n sharedShadcnGenerator,\n} from '../../../utils/shared-shadcn.js';\nimport { runtimeConfigGenerator } from '../runtime-config/generator.js';\n\n/**\n * The values this helper's predicates read. Its callers record them, so the\n * theme and auth branches taken here can be confirmed at upgrade time.\n */\nexport interface AgUiMetadata {\n readonly theme: string;\n readonly auth: string;\n}\n\n// Each entry names the theme or auth branch it belongs to, so the same\n// declaration drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<AgUiMetadata>()({\n ts: [\n { name: '@copilotkit/react-core' },\n { name: '@ag-ui/client' },\n {\n name: '@cloudscape-design/chat-components',\n when: (m) => m.theme === 'cloudscape',\n },\n { name: 'lucide-react', when: (m) => m.theme === 'shadcn' },\n { name: 'oidc-client-ts', when: (m) => m.auth === 'iam' },\n { name: 'aws4fetch', when: (m) => m.auth === 'iam' },\n {\n name: '@aws-sdk/credential-provider-cognito-identity',\n when: (m) => m.auth === 'iam',\n },\n {\n name: 'react-oidc-context',\n when: (m) => m.auth === 'iam' || m.auth === 'cognito',\n },\n { name: '@smithy/types', when: (m) => m.auth === 'iam', dev: true },\n // `sharedShadcnGenerator` adds these to the shared shadcn project it\n // creates, not to the website.\n ...ownedElsewhere(SHADCN_DEPENDENCIES),\n ],\n});\n\nexport type AgUiAuth = 'iam' | 'cognito' | 'none';\n\nexport type AgUiTheme = 'cloudscape' | 'shadcn' | 'default';\n\nexport interface AgUiReactConnectionOptions {\n /** The React website project to connect FROM */\n frontendProjectConfig: ProjectConfiguration;\n /** The AG-UI agent's exposed name (used as CopilotKit's agent key) */\n agentName: string;\n /** PascalCase class name used for component names and runtime config keys */\n agentNameClassName: string;\n /** Auth scheme used by the agent */\n auth: AgUiAuth;\n /**\n * When set, the generated hook reads the gateway's URL from\n * runtimeConfig.gateways and routes to the agent via the gateway's\n * path-based `/<targetName>/invocations` route instead of invoking the\n * runtime directly. The gateway publishes its own URL to the website, so\n * the agent's construct is left unpatched.\n */\n gatewayRoute?: {\n gatewayClassName: string;\n targetName: string;\n };\n}\n\n/**\n * Wires a React website up to an AG-UI agent using CopilotKit and\n * @ag-ui/client's HttpAgent. Agent-server-language agnostic.\n *\n * On first invocation creates a shared `AguiProvider` component (with an empty\n * `selfManagedAgents` registry) and wraps `<App />` in it. Each invocation\n * AST-patches `AguiProvider` to register one more agent hook — running the\n * generator multiple times is idempotent and additive.\n *\n * Also vends a `src/components/copilot` theme module picked from the\n * website's `metadata.ux` (cloudscape / shadcn / default).\n */\nexport const addAgUiReactConnection = async (\n tree: Tree,\n options: AgUiReactConnectionOptions,\n) => {\n const {\n frontendProjectConfig,\n agentName,\n agentNameClassName,\n auth,\n gatewayRoute,\n } = options;\n\n const theme = resolveAgUiTheme(frontendProjectConfig);\n // The values the declaration's predicates read. Callers record the same pair,\n // so what is added here is exactly what the version sync owns.\n const metadata: AgUiMetadata = { theme, auth };\n const scopeAlias = getNpmScopePrefix(tree);\n\n // Generates `src/components/AguiProvider.tsx` (if absent) and\n // `src/hooks/useAgui<AgentName>.tsx`. Existing files are kept so re-running\n // the generator is idempotent.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n frontendProjectConfig.root,\n { agentName, agentNameClassName, auth, gatewayRoute },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Shadcn theme imports from the shared shadcn library, so it must exist.\n if (theme === 'shadcn') {\n await sharedShadcnGenerator(tree, DEPENDENCIES);\n addSharedShadcnDependency(tree, frontendProjectConfig.root);\n }\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', theme),\n frontendProjectConfig.root,\n { scopeAlias },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n if (auth === 'iam') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/hooks/sigv4',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'hooks'),\n {},\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n }\n\n await runtimeConfigGenerator(tree, {\n project: frontendProjectConfig.name,\n });\n\n // AST-patch AguiProvider to register this agent's hook\n await registerAgentHookInProvider(\n tree,\n frontendProjectConfig,\n agentNameClassName,\n );\n\n // Wrap <App /> in <AguiProvider> in main.tsx (idempotent)\n const mainTsxPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'main.tsx',\n );\n await addSingleImport(\n tree,\n mainTsxPath,\n 'AguiProvider',\n './components/AguiProvider',\n );\n await applyGritQL(\n tree,\n mainTsxPath,\n `\\`<App />\\` => \\`<AguiProvider><App /></AguiProvider>\\` where { $program <: not contains \\`<AguiProvider>$_</AguiProvider>\\` }`,\n );\n\n // @copilotkit/react-core transitively pulls in @scarf/scarf (telemetry),\n // which has a postinstall script. Under pnpm 11's default\n // `strictDepBuilds=true` that script is treated as an unreviewed build and\n // fails the install. Register it as an explicitly-rejected build so pnpm\n // knows we've seen it and will skip it instead of erroring.\n registerPnpmBuiltDependencies(tree, { '@scarf/scarf': false });\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: frontendProjectConfig.root,\n });\n\n // Agents only publish their runtime ARN to the 'agentcore' namespace by\n // default, which isn't exposed to the website. Patch the agent's CDK/TF\n // construct to also publish under 'connection' so the browser can read it\n // from runtime-config.json. When routing via a gateway, the gateway\n // publishes its own URL instead.\n if (!gatewayRoute) {\n await addAgentRuntimeToConnectionNamespace(tree, {\n agentNameKebabCase: kebabCase(agentNameClassName),\n agentNameClassName,\n });\n }\n};\n\n/**\n * The theme module this helper vends, from the website's `metadata.ux`. Callers\n * record the resolved value, so the theme predicates read what the code branches\n * on.\n */\nexport const resolveAgUiTheme = (\n frontendProjectConfig: ProjectConfiguration,\n): AgUiTheme => {\n const ux = (\n (frontendProjectConfig.metadata as any)?.ux as string | undefined\n )?.toLowerCase();\n switch (ux) {\n case 'cloudscape':\n return 'cloudscape';\n case 'shadcn':\n return 'shadcn';\n default:\n return 'default';\n }\n};\n\n/**\n * Register this agent's hook in the shared `AguiProvider` using GritQL AST\n * patches. The provider starts out with an empty `selfManagedAgents` registry\n * (from the template); each call appends:\n * - `import { useAgui<Name> } from '../hooks/useAgui<Name>';`\n * - `const <varName> = useAgui<Name>();` before the `useMemo` call\n * - `...<varName>` into the memoised object literal\n * - `<varName>` into the `useMemo` deps array\n *\n * All steps are guarded so re-running produces byte-identical output.\n */\nconst registerAgentHookInProvider = async (\n tree: Tree,\n frontendProjectConfig: ProjectConfiguration,\n agentNameClassName: string,\n) => {\n const providerPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'components',\n 'AguiProvider.tsx',\n );\n const hookName = `useAgui${agentNameClassName}`;\n // useAguiStoryAgent -> storyAgentAgents\n const varName = `${agentNameClassName.charAt(0).toLowerCase()}${agentNameClassName.slice(1)}Agents`;\n\n // 1. Add the hook import\n await addDestructuredImport(\n tree,\n providerPath,\n [hookName],\n `../hooks/${hookName}`,\n );\n\n // 2. Insert `const <varName> = <hookName>();` before the useMemo declaration\n await applyGritQL(\n tree,\n providerPath,\n `\\`const selfManagedAgents = useMemo<Record<string, AbstractAgent>>($body, $deps);\\` => ` +\n `\\`const ${varName} = ${hookName}();\\nconst selfManagedAgents = useMemo<Record<string, AbstractAgent>>($body, $deps);\\` ` +\n `where { $program <: not contains \\`const ${varName} = ${hookName}()\\` }`,\n );\n\n // 3. Spread `...<varName>` into the memoised object and add `<varName>` to\n // the deps array. Branches on `{}`/`[]` vs populated so both the\n // first-agent and nth-agent cases produce clean output.\n await applyGritQL(\n tree,\n providerPath,\n `\\`useMemo<Record<string, AbstractAgent>>(() => ($obj), $deps)\\` where {` +\n ` $obj <: not contains \\`...${varName}\\`,` +\n ` if ($obj <: \\`{}\\`) { $obj => \\`{ ...${varName} }\\` }` +\n ` else { $obj <: \\`{$items}\\` where { $items += \\`, ...${varName}\\` } },` +\n ` if ($deps <: \\`[]\\`) { $deps => \\`[${varName}]\\` }` +\n ` else { $deps <: \\`[$dd]\\` where { $dd += \\`, ${varName}\\` } }` +\n ` }`,\n );\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","addAgentRuntimeToConnectionNamespace","addTsDependencies","addDestructuredImport","addSingleImport","applyGritQL","declareDependencies","ownedElsewhere","kebabCase","getNpmScopePrefix","registerPnpmBuiltDependencies","addSharedShadcnDependency","SHADCN_DEPENDENCIES","sharedShadcnGenerator","runtimeConfigGenerator","DEPENDENCIES","ts","name","when","m","theme","auth","dev","addAgUiReactConnection","tree","options","frontendProjectConfig","agentName","agentNameClassName","gatewayRoute","resolveAgUiTheme","metadata","scopeAlias","dirname","root","overwriteStrategy","KeepExisting","sourceRoot","project","registerAgentHookInProvider","mainTsxPath","projectRoot","agentNameKebabCase","ux","toLowerCase","providerPath","hookName","varName","charAt","slice"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/react-website/agui/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n} from '@nx/devkit';\nimport { addAgentRuntimeToConnectionNamespace } from '../../../connection/agent-runtime-config.js';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport {\n addDestructuredImport,\n addSingleImport,\n applyGritQL,\n} from '../../../utils/ast.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { kebabCase, snakeCase } from '../../../utils/names.js';\nimport { getNpmScopePrefix } from '../../../utils/npm-scope.js';\nimport { registerPnpmBuiltDependencies } from '../../../utils/pnpm-workspace.js';\nimport {\n addSharedShadcnDependency,\n SHADCN_DEPENDENCIES,\n sharedShadcnGenerator,\n} from '../../../utils/shared-shadcn.js';\nimport { runtimeConfigGenerator } from '../runtime-config/generator.js';\n\n/**\n * The values this helper's predicates read. Its callers record them, so the\n * theme and auth branches taken here can be confirmed at upgrade time.\n */\nexport interface AgUiMetadata {\n readonly theme: string;\n readonly auth: string;\n}\n\n// Each entry names the theme or auth branch it belongs to, so the same\n// declaration drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<AgUiMetadata>()({\n ts: [\n { name: '@copilotkit/react-core' },\n { name: '@ag-ui/client' },\n {\n name: '@cloudscape-design/chat-components',\n when: (m) => m.theme === 'cloudscape',\n },\n { name: 'lucide-react', when: (m) => m.theme === 'shadcn' },\n { name: 'oidc-client-ts', when: (m) => m.auth === 'iam' },\n { name: 'aws4fetch', when: (m) => m.auth === 'iam' },\n {\n name: '@aws-sdk/credential-provider-cognito-identity',\n when: (m) => m.auth === 'iam',\n },\n {\n name: 'react-oidc-context',\n when: (m) => m.auth === 'iam' || m.auth === 'cognito',\n },\n { name: '@smithy/types', when: (m) => m.auth === 'iam', dev: true },\n // `sharedShadcnGenerator` adds these to the shared shadcn project it\n // creates, not to the website.\n ...ownedElsewhere(SHADCN_DEPENDENCIES),\n ],\n});\n\nexport type AgUiAuth = 'iam' | 'cognito' | 'none';\n\nexport type AgUiTheme = 'cloudscape' | 'shadcn' | 'default';\n\nexport interface AgUiReactConnectionOptions {\n /** The React website project to connect FROM */\n frontendProjectConfig: ProjectConfiguration;\n /** The AG-UI agent's exposed name (used as CopilotKit's agent key) */\n agentName: string;\n /** PascalCase class name used for component names and runtime config keys */\n agentNameClassName: string;\n /** Auth scheme used by the agent */\n auth: AgUiAuth;\n /**\n * When set, the generated hook reads the gateway's URL from\n * runtimeConfig.gateways and routes to the agent via the gateway's\n * path-based `/<targetName>/invocations` route instead of invoking the\n * runtime directly. The gateway publishes its own URL to the website, so\n * the agent's construct is left unpatched.\n */\n gatewayRoute?: {\n gatewayClassName: string;\n targetName: string;\n };\n}\n\n/**\n * Wires a React website up to an AG-UI agent using CopilotKit and\n * @ag-ui/client's HttpAgent. Agent-server-language agnostic.\n *\n * On first invocation creates a shared `AguiProvider` component (with an empty\n * `selfManagedAgents` registry) and wraps `<App />` in it. Each invocation\n * AST-patches `AguiProvider` to register one more agent hook — running the\n * generator multiple times is idempotent and additive.\n *\n * Also vends a `src/components/copilot` theme module picked from the\n * website's `metadata.ux` (cloudscape / shadcn / default).\n */\nexport const addAgUiReactConnection = async (\n tree: Tree,\n options: AgUiReactConnectionOptions,\n) => {\n const {\n frontendProjectConfig,\n agentName,\n agentNameClassName,\n auth,\n gatewayRoute,\n } = options;\n\n const theme = resolveAgUiTheme(frontendProjectConfig);\n // The values the declaration's predicates read. Callers record the same pair,\n // so what is added here is exactly what the version sync owns.\n const metadata: AgUiMetadata = { theme, auth };\n const scopeAlias = getNpmScopePrefix(tree);\n\n // Generates `src/components/AguiProvider.tsx` (if absent),\n // `src/components/<agent-name>-chat.tsx` and\n // `src/hooks/useAgui<AgentName>.tsx`. Existing files are kept so re-running\n // the generator is idempotent.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n frontendProjectConfig.root,\n {\n agentName,\n agentNameClassName,\n agentNameKebabCase: kebabCase(agentNameClassName),\n // STORY_AGENT, naming the exported `<name>_ID` constant\n agentNameConstantName: snakeCase(agentNameClassName).toUpperCase(),\n auth,\n gatewayRoute,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Shadcn theme imports from the shared shadcn library, so it must exist.\n if (theme === 'shadcn') {\n await sharedShadcnGenerator(tree, DEPENDENCIES);\n addSharedShadcnDependency(tree, frontendProjectConfig.root);\n }\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', theme),\n frontendProjectConfig.root,\n { scopeAlias },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n if (auth === 'iam') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/hooks/sigv4',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'hooks'),\n {},\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n }\n\n await runtimeConfigGenerator(tree, {\n project: frontendProjectConfig.name,\n });\n\n // AST-patch AguiProvider to register this agent's hook\n await registerAgentHookInProvider(\n tree,\n frontendProjectConfig,\n agentNameClassName,\n );\n\n // Wrap <App /> in <AguiProvider> in main.tsx (idempotent)\n const mainTsxPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'main.tsx',\n );\n await addSingleImport(\n tree,\n mainTsxPath,\n 'AguiProvider',\n './components/AguiProvider',\n );\n await applyGritQL(\n tree,\n mainTsxPath,\n `\\`<App />\\` => \\`<AguiProvider><App /></AguiProvider>\\` where { $program <: not contains \\`<AguiProvider>$_</AguiProvider>\\` }`,\n );\n\n // @copilotkit/react-core transitively pulls in @scarf/scarf (telemetry),\n // which has a postinstall script. Under pnpm 11's default\n // `strictDepBuilds=true` that script is treated as an unreviewed build and\n // fails the install. Register it as an explicitly-rejected build so pnpm\n // knows we've seen it and will skip it instead of erroring.\n registerPnpmBuiltDependencies(tree, { '@scarf/scarf': false });\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: frontendProjectConfig.root,\n });\n\n // Agents only publish their runtime ARN to the 'agentcore' namespace by\n // default, which isn't exposed to the website. Patch the agent's CDK/TF\n // construct to also publish under 'connection' so the browser can read it\n // from runtime-config.json. When routing via a gateway, the gateway\n // publishes its own URL instead.\n if (!gatewayRoute) {\n await addAgentRuntimeToConnectionNamespace(tree, {\n agentNameKebabCase: kebabCase(agentNameClassName),\n agentNameClassName,\n });\n }\n};\n\n/**\n * The theme module this helper vends, from the website's `metadata.ux`. Callers\n * record the resolved value, so the theme predicates read what the code branches\n * on.\n */\nexport const resolveAgUiTheme = (\n frontendProjectConfig: ProjectConfiguration,\n): AgUiTheme => {\n const ux = (\n (frontendProjectConfig.metadata as any)?.ux as string | undefined\n )?.toLowerCase();\n switch (ux) {\n case 'cloudscape':\n return 'cloudscape';\n case 'shadcn':\n return 'shadcn';\n default:\n return 'default';\n }\n};\n\n/**\n * Register this agent's hook in the shared `AguiProvider` using GritQL AST\n * patches. The provider starts out with an empty `selfManagedAgents` registry\n * (from the template); each call appends:\n * - `import { useAgui<Name> } from '../hooks/useAgui<Name>';`\n * - `const <varName> = useAgui<Name>();` before the `useMemo` call\n * - `...<varName>` into the memoised object literal\n * - `<varName>` into the `useMemo` deps array\n *\n * All steps are guarded so re-running produces byte-identical output.\n */\nconst registerAgentHookInProvider = async (\n tree: Tree,\n frontendProjectConfig: ProjectConfiguration,\n agentNameClassName: string,\n) => {\n const providerPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'components',\n 'AguiProvider.tsx',\n );\n const hookName = `useAgui${agentNameClassName}`;\n // useAguiStoryAgent -> storyAgentAgents\n const varName = `${agentNameClassName.charAt(0).toLowerCase()}${agentNameClassName.slice(1)}Agents`;\n\n // 1. Add the hook import\n await addDestructuredImport(\n tree,\n providerPath,\n [hookName],\n `../hooks/${hookName}`,\n );\n\n // 2. Insert `const <varName> = <hookName>();` before the useMemo declaration\n await applyGritQL(\n tree,\n providerPath,\n `\\`const selfManagedAgents = useMemo<Record<string, AbstractAgent>>($body, $deps);\\` => ` +\n `\\`const ${varName} = ${hookName}();\\nconst selfManagedAgents = useMemo<Record<string, AbstractAgent>>($body, $deps);\\` ` +\n `where { $program <: not contains \\`const ${varName} = ${hookName}()\\` }`,\n );\n\n // 3. Spread `...<varName>` into the memoised object and add `<varName>` to\n // the deps array. Branches on `{}`/`[]` vs populated so both the\n // first-agent and nth-agent cases produce clean output.\n await applyGritQL(\n tree,\n providerPath,\n `\\`useMemo<Record<string, AbstractAgent>>(() => ($obj), $deps)\\` where {` +\n ` $obj <: not contains \\`...${varName}\\`,` +\n ` if ($obj <: \\`{}\\`) { $obj => \\`{ ...${varName} }\\` }` +\n ` else { $obj <: \\`{$items}\\` where { $items += \\`, ...${varName}\\` } },` +\n ` if ($deps <: \\`[]\\`) { $deps => \\`[${varName}]\\` }` +\n ` else { $deps <: \\`[$dd]\\` where { $dd += \\`, ${varName}\\` } }` +\n ` }`,\n );\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","addAgentRuntimeToConnectionNamespace","addTsDependencies","addDestructuredImport","addSingleImport","applyGritQL","declareDependencies","ownedElsewhere","kebabCase","snakeCase","getNpmScopePrefix","registerPnpmBuiltDependencies","addSharedShadcnDependency","SHADCN_DEPENDENCIES","sharedShadcnGenerator","runtimeConfigGenerator","DEPENDENCIES","ts","name","when","m","theme","auth","dev","addAgUiReactConnection","tree","options","frontendProjectConfig","agentName","agentNameClassName","gatewayRoute","resolveAgUiTheme","metadata","scopeAlias","dirname","root","agentNameKebabCase","agentNameConstantName","toUpperCase","overwriteStrategy","KeepExisting","sourceRoot","project","registerAgentHookInProvider","mainTsxPath","projectRoot","ux","toLowerCase","providerPath","hookName","varName","charAt","slice"],"mappings":"AAAA;;;CAGC,GACD,SACEA,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,QAGZ,aAAa;AACpB,SAASC,oCAAoC,QAAQ,8CAA8C;AACnG,SAASC,iBAAiB,QAAQ,qCAAqC;AACvE,SACEC,qBAAqB,EACrBC,eAAe,EACfC,WAAW,QACN,wBAAwB;AAC/B,SACEC,mBAAmB,EACnBC,cAAc,QACT,0CAA0C;AACjD,SAASC,SAAS,EAAEC,SAAS,QAAQ,0BAA0B;AAC/D,SAASC,iBAAiB,QAAQ,8BAA8B;AAChE,SAASC,6BAA6B,QAAQ,mCAAmC;AACjF,SACEC,yBAAyB,EACzBC,mBAAmB,EACnBC,qBAAqB,QAChB,kCAAkC;AACzC,SAASC,sBAAsB,QAAQ,iCAAiC;AAWxE,uEAAuE;AACvE,uDAAuD;AACvD,OAAO,MAAMC,eAAeV,sBAAoC;IAC9DW,IAAI;QACF;YAAEC,MAAM;QAAyB;QACjC;YAAEA,MAAM;QAAgB;QACxB;YACEA,MAAM;YACNC,MAAM,CAACC,IAAMA,EAAEC,KAAK,KAAK;QAC3B;QACA;YAAEH,MAAM;YAAgBC,MAAM,CAACC,IAAMA,EAAEC,KAAK,KAAK;QAAS;QAC1D;YAAEH,MAAM;YAAkBC,MAAM,CAACC,IAAMA,EAAEE,IAAI,KAAK;QAAM;QACxD;YAAEJ,MAAM;YAAaC,MAAM,CAACC,IAAMA,EAAEE,IAAI,KAAK;QAAM;QACnD;YACEJ,MAAM;YACNC,MAAM,CAACC,IAAMA,EAAEE,IAAI,KAAK;QAC1B;QACA;YACEJ,MAAM;YACNC,MAAM,CAACC,IAAMA,EAAEE,IAAI,KAAK,SAASF,EAAEE,IAAI,KAAK;QAC9C;QACA;YAAEJ,MAAM;YAAiBC,MAAM,CAACC,IAAMA,EAAEE,IAAI,KAAK;YAAOC,KAAK;QAAK;QAClE,qEAAqE;QACrE,+BAA+B;WAC5BhB,eAAeM;KACnB;AACH,GAAG;AA4BH;;;;;;;;;;;CAWC,GACD,OAAO,MAAMW,yBAAyB,OACpCC,MACAC;IAEA,MAAM,EACJC,qBAAqB,EACrBC,SAAS,EACTC,kBAAkB,EAClBP,IAAI,EACJQ,YAAY,EACb,GAAGJ;IAEJ,MAAML,QAAQU,iBAAiBJ;IAC/B,8EAA8E;IAC9E,+DAA+D;IAC/D,MAAMK,WAAyB;QAAEX;QAAOC;IAAK;IAC7C,MAAMW,aAAavB,kBAAkBe;IAErC,2DAA2D;IAC3D,6CAA6C;IAC7C,4EAA4E;IAC5E,+BAA+B;IAC/B3B,cACE2B,MACA1B,kBAAkB,YAAYmC,OAAO,EAAE,SAAS,WAChDP,sBAAsBQ,IAAI,EAC1B;QACEP;QACAC;QACAO,oBAAoB5B,UAAUqB;QAC9B,wDAAwD;QACxDQ,uBAAuB5B,UAAUoB,oBAAoBS,WAAW;QAChEhB;QACAQ;IACF,GACA;QAAES,mBAAmBvC,kBAAkBwC,YAAY;IAAC;IAGtD,yEAAyE;IACzE,IAAInB,UAAU,UAAU;QACtB,MAAMP,sBAAsBW,MAAMT;QAClCJ,0BAA0Ba,MAAME,sBAAsBQ,IAAI;IAC5D;IACArC,cACE2B,MACA1B,kBAAkB,YAAYmC,OAAO,EAAE,SAASb,QAChDM,sBAAsBQ,IAAI,EAC1B;QAAEF;IAAW,GACb;QAAEM,mBAAmBvC,kBAAkBwC,YAAY;IAAC;IAGtD,IAAIlB,SAAS,OAAO;QAClBxB,cACE2B,MACA1B,kBACE,YAAYmC,OAAO,EACnB,6CAEFnC,kBAAkB4B,sBAAsBc,UAAU,EAAE,UACpD,CAAC,GACD;YAAEF,mBAAmBvC,kBAAkBwC,YAAY;QAAC;IAExD;IAEA,MAAMzB,uBAAuBU,MAAM;QACjCiB,SAASf,sBAAsBT,IAAI;IACrC;IAEA,uDAAuD;IACvD,MAAMyB,4BACJlB,MACAE,uBACAE;IAGF,0DAA0D;IAC1D,MAAMe,cAAc7C,kBAClB4B,sBAAsBc,UAAU,EAChC;IAEF,MAAMrC,gBACJqB,MACAmB,aACA,gBACA;IAEF,MAAMvC,YACJoB,MACAmB,aACA,CAAC,8HAA8H,CAAC;IAGlI,yEAAyE;IACzE,0DAA0D;IAC1D,2EAA2E;IAC3E,yEAAyE;IACzE,4DAA4D;IAC5DjC,8BAA8Bc,MAAM;QAAE,gBAAgB;IAAM;IAE5DvB,kBAAkBuB,MAAMT,cAAc;QACpCgB;QACAa,aAAalB,sBAAsBQ,IAAI;IACzC;IAEA,wEAAwE;IACxE,wEAAwE;IACxE,0EAA0E;IAC1E,oEAAoE;IACpE,iCAAiC;IACjC,IAAI,CAACL,cAAc;QACjB,MAAM7B,qCAAqCwB,MAAM;YAC/CW,oBAAoB5B,UAAUqB;YAC9BA;QACF;IACF;AACF,EAAE;AAEF;;;;CAIC,GACD,OAAO,MAAME,mBAAmB,CAC9BJ;IAEA,MAAMmB,KACHnB,sBAAsBK,QAAQ,EAAUc,IACxCC;IACH,OAAQD;QACN,KAAK;YACH,OAAO;QACT,KAAK;YACH,OAAO;QACT;YACE,OAAO;IACX;AACF,EAAE;AAEF;;;;;;;;;;CAUC,GACD,MAAMH,8BAA8B,OAClClB,MACAE,uBACAE;IAEA,MAAMmB,eAAejD,kBACnB4B,sBAAsBc,UAAU,EAChC,cACA;IAEF,MAAMQ,WAAW,CAAC,OAAO,EAAEpB,oBAAoB;IAC/C,wCAAwC;IACxC,MAAMqB,UAAU,GAAGrB,mBAAmBsB,MAAM,CAAC,GAAGJ,WAAW,KAAKlB,mBAAmBuB,KAAK,CAAC,GAAG,MAAM,CAAC;IAEnG,yBAAyB;IACzB,MAAMjD,sBACJsB,MACAuB,cACA;QAACC;KAAS,EACV,CAAC,SAAS,EAAEA,UAAU;IAGxB,6EAA6E;IAC7E,MAAM5C,YACJoB,MACAuB,cACA,CAAC,uFAAuF,CAAC,GACvF,CAAC,QAAQ,EAAEE,QAAQ,GAAG,EAAED,SAAS,uFAAuF,CAAC,GACzH,CAAC,yCAAyC,EAAEC,QAAQ,GAAG,EAAED,SAAS,MAAM,CAAC;IAG7E,2EAA2E;IAC3E,oEAAoE;IACpE,2DAA2D;IAC3D,MAAM5C,YACJoB,MACAuB,cACA,CAAC,uEAAuE,CAAC,GACvE,CAAC,2BAA2B,EAAEE,QAAQ,GAAG,CAAC,GAC1C,CAAC,sCAAsC,EAAEA,QAAQ,MAAM,CAAC,GACxD,CAAC,sDAAsD,EAAEA,QAAQ,OAAO,CAAC,GACzE,CAAC,oCAAoC,EAAEA,QAAQ,KAAK,CAAC,GACrD,CAAC,8CAA8C,EAAEA,QAAQ,MAAM,CAAC,GAChE,CAAC,EAAE,CAAC;AAEV"}