@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/mcp-server/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport {\n AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES,\n type AgentCoreArtifact,\n addMcpServerInfra,\n} from '../../utils/agent-core-constructs/agent-core-constructs.js';\nimport {\n addTypeScriptCodePackageTarget,\n agentCoreNodeRuntime,\n CODE_PACKAGE_DEPENDENCIES,\n isAgentCoreHosted,\n isContainerHosted,\n} from '../../utils/agent-core-packaging.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 ADOT_IMAGE_DEPENDENCIES,\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 { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport { kebabCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport type { IacMetadata } from '../../utils/shared-constructs-constants.js';\nimport { BASE_IMAGES, TS_VERSIONS } from '../../utils/versions.js';\nimport type { TsMcpServerGeneratorSchema, TsMcpServerInfra } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsMcpServerMetadata extends IacMetadata {\n readonly port: number;\n readonly rc: string;\n readonly auth: string;\n /**\n * How this component is packaged and hosted, so a consumer can tell a\n * code-packaged runtime from a container-packaged one without re-deriving it.\n */\n readonly infra: TsMcpServerInfra;\n}\n\nexport const DEPENDENCIES = declareDependencies<TsMcpServerMetadata>()({\n ts: [\n { name: '@modelcontextprotocol/sdk' },\n { name: 'zod' },\n { name: 'express' },\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@types/express', dev: true },\n // tsx (local dev) and the MCP inspector are shared tooling.\n { name: 'tsx', dev: true, root: true },\n { name: '@modelcontextprotocol/inspector', dev: true, root: true },\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ...ownedElsewhere(ADOT_IMAGE_DEPENDENCIES),\n ...ownedElsewhere(CODE_PACKAGE_DEPENDENCIES),\n ],\n py: ownedElsewhere(AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES),\n});\n\nexport const TS_MCP_SERVER_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsMcpServerGenerator = async (\n tree: Tree,\n options: TsMcpServerGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const project = readProjectConfigurationUnqualified(tree, options.project);\n\n if (!tree.exists(joinPathFragments(project.root, 'tsconfig.json'))) {\n throw new Error(\n `Unsupported project ${options.project}. Expected a TypeScript project (with a tsconfig.json)`,\n );\n }\n\n const defaultName = `${kebabCase(project.name.split('/').pop())}-mcp-server`;\n const name = kebabCase(options.name || defaultName);\n const mcpServerNameClassName = toClassName(name);\n const mcpTargetPrefix = options.name ? name : 'mcp-server';\n const targetSourceDirRelativeToProjectRoot = joinPathFragments(\n 'src',\n mcpTargetPrefix,\n );\n const targetSourceDir = joinPathFragments(\n project.root,\n targetSourceDirRelativeToProjectRoot,\n );\n const relativeSourceDir = targetSourceDir.replace(project.root + '/', './');\n const distDir = joinPathFragments('dist', project.root);\n\n const infra = options.infra ?? 'agentcore';\n\n // Recorded in the metadata below so the version sync can tell a CDK\n // project from a Terraform one; undefined when no infrastructure was\n // generated, in which case neither provider's packages were added.\n const iac =\n infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (infra === 'none' && options.auth && options.auth !== 'iam') {\n console.warn(\n 'Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)',\n );\n }\n\n const auth = options.auth ?? 'iam';\n\n const projectPackageJsonPath = joinPathFragments(\n project.root,\n 'package.json',\n );\n\n // Generate esm if the project's package.json is `type: module`, falling\n // back to the workspace format when the project has no manifest.\n const esm = tree.exists(projectPackageJsonPath)\n ? readJson(tree, projectPackageJsonPath).type === 'module'\n : isEsmWorkspace(tree);\n\n const templateContext = {\n name,\n esm,\n distDir,\n adotVersion:\n TS_VERSIONS['@aws/aws-distro-opentelemetry-node-autoinstrumentation'],\n jaegerVersion: TS_VERSIONS['@opentelemetry/propagator-jaeger'],\n nodeBaseImage: BASE_IMAGES.node,\n ...nodeImageVersions(),\n };\n\n // Generate example server\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'app'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add hosting based on infra\n if (isAgentCoreHosted(infra)) {\n const container = isContainerHosted(infra);\n const containers = await resolveContainers(tree, 'inherit');\n const dockerImageTag = `${getNpmScope(tree)}-${name}:latest`;\n\n // Add bundle target\n await addTypeScriptBundleTarget(\n tree,\n project,\n {\n targetFilePath: `${targetSourceDirRelativeToProjectRoot}/http.ts`,\n bundleOutputDir: joinPathFragments('mcp', name),\n },\n DEPENDENCIES,\n );\n\n const bundleOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'bundle',\n 'mcp',\n name,\n );\n\n let artifact: AgentCoreArtifact;\n\n if (container) {\n // Add the Dockerfile\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'deploy'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n const dockerTargetName = `${mcpTargetPrefix}-docker`;\n\n const fs = new FsCommands(tree, DEPENDENCIES);\n project.targets[dockerTargetName] = {\n cache: IMAGE_BUILD_CACHE,\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.cpFile(\n `${targetSourceDir}/Dockerfile`,\n `${bundleOutputDir}/Dockerfile`,\n ),\n `${containers} build --platform linux/arm64 -t ${dockerImageTag} ${bundleOutputDir}`,\n ],\n parallel: false,\n },\n dependsOn: ['bundle'],\n };\n\n addDependencyToTargetIfNotPresent(project, 'docker', dockerTargetName);\n addArtifactDependencyToTargets(project, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project,\n containerEngine: containers,\n trivyTargetName: `${mcpTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n },\n DEPENDENCIES,\n );\n\n artifact = {\n type: 'container',\n dockerImageTag,\n outputDir: bundleOutputDir,\n };\n } else {\n const packageOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'package',\n 'mcp',\n name,\n );\n addTypeScriptCodePackageTarget(\n tree,\n {\n project,\n targetName: `${mcpTargetPrefix}-package`,\n bundleTargetName: 'bundle',\n bundleOutputDir,\n packageOutputDir,\n },\n DEPENDENCIES,\n );\n\n artifact = {\n type: 'code',\n outputDir: packageOutputDir,\n runtime: agentCoreNodeRuntime(),\n entryPoint: 'index.js',\n };\n }\n\n // Add shared constructs\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n\n // Add the construct to deploy the mcp server\n await addMcpServerInfra(tree, {\n mcpServerNameKebabCase: name,\n mcpServerNameClassName,\n projectName: project.name,\n artifact,\n iac,\n auth,\n containers,\n });\n }\n\n // @modelcontextprotocol/sdk declares zod as a peer dependency with a wide range\n // (^3.25 || ^4.0). Yarn does not dedupe the peer to the workspace's pinned zod, so\n // without a resolution it installs a separate zod under the SDK's own node_modules.\n // The two zod copies have structurally incompatible types, which breaks type\n // inference for registerTool inputSchema. Scope the resolution to the SDK so\n // other consumers (e.g. @tanstack/router-generator pinning zod@3) are unaffected.\n // Classic yarn only honours the `**/`-prefixed descriptor in a workspace, and\n // berry only the bare one — it deletes a glob descriptor on install — so\n // declare both.\n if (detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@modelcontextprotocol/sdk/zod': TS_VERSIONS['zod'],\n '@modelcontextprotocol/sdk/zod': TS_VERSIONS['zod'],\n };\n return packageJson;\n });\n }\n\n const localDevPort = assignPort(tree, project, 8000, {\n component: { info: TS_MCP_SERVER_GENERATOR_INFO, name: mcpTargetPrefix },\n });\n\n // Recorded below and read by the declaration's predicates, so the packages\n // added here are exactly the ones the version sync will own.\n const metadata: TsMcpServerMetadata = {\n infra,\n port: localDevPort,\n rc: mcpServerNameClassName,\n auth,\n ...(iac ? { iac } : {}),\n };\n\n // The MCP inspector has a postinstall script that cascades installs into its\n // client packages, which no-ops when the package is installed as a dependency.\n // Register it as an explicitly-rejected build so pnpm 11's default\n // `strictDepBuilds=true` skips it instead of failing the install.\n registerPnpmBuiltDependencies(tree, {\n '@modelcontextprotocol/inspector': false,\n });\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: project.root,\n });\n\n const mcpTargets = {\n ...project.targets,\n // Add targets for running the MCP server\n [`${mcpTargetPrefix}-serve-stdio`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/stdio.ts`],\n cwd: '{projectRoot}',\n },\n },\n [`${mcpTargetPrefix}-serve`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/http.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n },\n },\n },\n [`${mcpTargetPrefix}-dev`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/http.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n LOCAL_DEV: 'true',\n },\n },\n },\n [`${mcpTargetPrefix}-inspect`]: {\n executor: 'nx:run-commands',\n continuous: true,\n // Launch the inspector against the locally served HTTP server. The dev\n // target starts the server and any connected dependencies (e.g. a local\n // database).\n dependsOn: [`${mcpTargetPrefix}-dev`],\n options: {\n commands: [\n `mcp-inspector --transport http --server-url http://localhost:${localDevPort}/mcp`,\n ],\n cwd: '{projectRoot}',\n },\n },\n [`${mcpTargetPrefix}-inspect-stdio`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [\n `mcp-inspector -- tsx --watch ${relativeSourceDir}/stdio.ts`,\n ],\n cwd: '{projectRoot}',\n },\n },\n };\n\n // Aggregate `<mcp>-dev` under the project-level `dev` target.\n addComponentDevTarget(mcpTargets, `${mcpTargetPrefix}-dev`);\n\n updateProjectConfiguration(tree, project.name, {\n ...project,\n // Sort targets so their order is stable regardless of insertion order on\n // first run vs re-run.\n targets: sortObjectKeys(mcpTargets),\n });\n\n addComponentGeneratorMetadata(\n tree,\n project.name,\n TS_MCP_SERVER_GENERATOR_INFO,\n targetSourceDirRelativeToProjectRoot,\n mcpTargetPrefix,\n metadata,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_MCP_SERVER_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsMcpServerGenerator;\n"],"names":["detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readJson","updateJson","updateProjectConfiguration","addTsDependencies","AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES","addMcpServerInfra","addTypeScriptCodePackageTarget","agentCoreNodeRuntime","CODE_PACKAGE_DEPENDENCIES","isAgentCoreHosted","isContainerHosted","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","ADOT_IMAGE_DEPENDENCIES","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","isEsmWorkspace","kebabCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","registerPnpmBuiltDependencies","assignPort","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","BASE_IMAGES","TS_VERSIONS","DEPENDENCIES","ts","name","dev","root","py","TS_MCP_SERVER_GENERATOR_INFO","filename","tsMcpServerGenerator","tree","options","project","exists","Error","defaultName","split","pop","mcpServerNameClassName","mcpTargetPrefix","targetSourceDirRelativeToProjectRoot","targetSourceDir","relativeSourceDir","replace","distDir","infra","iac","undefined","auth","console","warn","projectPackageJsonPath","esm","type","templateContext","adotVersion","jaegerVersion","nodeBaseImage","node","dirname","overwriteStrategy","KeepExisting","container","containers","dockerImageTag","targetFilePath","bundleOutputDir","artifact","dockerTargetName","fs","targets","cache","executor","commands","cpFile","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","outputDir","packageOutputDir","targetName","bundleTargetName","runtime","entryPoint","mcpServerNameKebabCase","projectName","packageJson","resolutions","localDevPort","component","info","metadata","port","rc","projectRoot","mcpTargets","continuous","cwd","env","PORT","LOCAL_DEV","preferInstallDependencies","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/mcp-server/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport {\n AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES,\n type AgentCoreArtifact,\n addMcpServerInfra,\n} from '../../utils/agent-core-constructs/agent-core-constructs.js';\nimport {\n addTypeScriptCodePackageTarget,\n agentCoreNodeRuntime,\n CODE_PACKAGE_DEPENDENCIES,\n isAgentCoreHosted,\n isContainerHosted,\n} from '../../utils/agent-core-packaging.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 ADOT_IMAGE_DEPENDENCIES,\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 { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport { kebabCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n normalizeTargetKeyOrder,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport type { IacMetadata } from '../../utils/shared-constructs-constants.js';\nimport { BASE_IMAGES, TS_VERSIONS } from '../../utils/versions.js';\nimport type { TsMcpServerGeneratorSchema, TsMcpServerInfra } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsMcpServerMetadata extends IacMetadata {\n readonly port: number;\n readonly rc: string;\n readonly auth: string;\n /**\n * How this component is packaged and hosted, so a consumer can tell a\n * code-packaged runtime from a container-packaged one without re-deriving it.\n */\n readonly infra: TsMcpServerInfra;\n}\n\nexport const DEPENDENCIES = declareDependencies<TsMcpServerMetadata>()({\n ts: [\n { name: '@modelcontextprotocol/sdk' },\n { name: 'zod' },\n { name: 'express' },\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@types/express', dev: true },\n // tsx (local dev) and the MCP inspector are shared tooling.\n { name: 'tsx', dev: true, root: true },\n { name: '@modelcontextprotocol/inspector', dev: true, root: true },\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ...ownedElsewhere(ADOT_IMAGE_DEPENDENCIES),\n ...ownedElsewhere(CODE_PACKAGE_DEPENDENCIES),\n ],\n py: ownedElsewhere(AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES),\n});\n\nexport const TS_MCP_SERVER_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsMcpServerGenerator = async (\n tree: Tree,\n options: TsMcpServerGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const project = readProjectConfigurationUnqualified(tree, options.project);\n\n if (!tree.exists(joinPathFragments(project.root, 'tsconfig.json'))) {\n throw new Error(\n `Unsupported project ${options.project}. Expected a TypeScript project (with a tsconfig.json)`,\n );\n }\n\n const defaultName = `${kebabCase(project.name.split('/').pop())}-mcp-server`;\n const name = kebabCase(options.name || defaultName);\n const mcpServerNameClassName = toClassName(name);\n const mcpTargetPrefix = options.name ? name : 'mcp-server';\n const targetSourceDirRelativeToProjectRoot = joinPathFragments(\n 'src',\n mcpTargetPrefix,\n );\n const targetSourceDir = joinPathFragments(\n project.root,\n targetSourceDirRelativeToProjectRoot,\n );\n const relativeSourceDir = targetSourceDir.replace(project.root + '/', './');\n const distDir = joinPathFragments('dist', project.root);\n\n const infra = options.infra ?? 'agentcore';\n\n // Recorded in the metadata below so the version sync can tell a CDK\n // project from a Terraform one; undefined when no infrastructure was\n // generated, in which case neither provider's packages were added.\n const iac =\n infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (infra === 'none' && options.auth && options.auth !== 'iam') {\n console.warn(\n 'Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)',\n );\n }\n\n const auth = options.auth ?? 'iam';\n\n const projectPackageJsonPath = joinPathFragments(\n project.root,\n 'package.json',\n );\n\n // Generate esm if the project's package.json is `type: module`, falling\n // back to the workspace format when the project has no manifest.\n const esm = tree.exists(projectPackageJsonPath)\n ? readJson(tree, projectPackageJsonPath).type === 'module'\n : isEsmWorkspace(tree);\n\n const templateContext = {\n name,\n esm,\n distDir,\n adotVersion:\n TS_VERSIONS['@aws/aws-distro-opentelemetry-node-autoinstrumentation'],\n jaegerVersion: TS_VERSIONS['@opentelemetry/propagator-jaeger'],\n nodeBaseImage: BASE_IMAGES.node,\n ...nodeImageVersions(),\n };\n\n // Generate example server\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'app'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add hosting based on infra\n if (isAgentCoreHosted(infra)) {\n const container = isContainerHosted(infra);\n const containers = await resolveContainers(tree, 'inherit');\n const dockerImageTag = `${getNpmScope(tree)}-${name}:latest`;\n\n // Add bundle target\n await addTypeScriptBundleTarget(\n tree,\n project,\n {\n targetFilePath: `${targetSourceDirRelativeToProjectRoot}/http.ts`,\n bundleOutputDir: joinPathFragments('mcp', name),\n },\n DEPENDENCIES,\n );\n\n const bundleOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'bundle',\n 'mcp',\n name,\n );\n\n let artifact: AgentCoreArtifact;\n\n if (container) {\n // Add the Dockerfile\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'deploy'),\n targetSourceDir,\n templateContext,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n const dockerTargetName = `${mcpTargetPrefix}-docker`;\n\n const fs = new FsCommands(tree, DEPENDENCIES);\n project.targets[dockerTargetName] = normalizeTargetKeyOrder({\n cache: IMAGE_BUILD_CACHE,\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.cpFile(\n `${targetSourceDir}/Dockerfile`,\n `${bundleOutputDir}/Dockerfile`,\n ),\n `${containers} build --platform linux/arm64 -t ${dockerImageTag} ${bundleOutputDir}`,\n ],\n parallel: false,\n },\n dependsOn: ['bundle'],\n });\n\n addDependencyToTargetIfNotPresent(project, 'docker', dockerTargetName);\n addArtifactDependencyToTargets(project, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project,\n containerEngine: containers,\n trivyTargetName: `${mcpTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n },\n DEPENDENCIES,\n );\n\n artifact = {\n type: 'container',\n dockerImageTag,\n outputDir: bundleOutputDir,\n };\n } else {\n const packageOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'package',\n 'mcp',\n name,\n );\n addTypeScriptCodePackageTarget(\n tree,\n {\n project,\n targetName: `${mcpTargetPrefix}-package`,\n bundleTargetName: 'bundle',\n bundleOutputDir,\n packageOutputDir,\n },\n DEPENDENCIES,\n );\n\n artifact = {\n type: 'code',\n outputDir: packageOutputDir,\n runtime: agentCoreNodeRuntime(),\n entryPoint: 'index.js',\n };\n }\n\n // Add shared constructs\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n\n // Add the construct to deploy the mcp server\n await addMcpServerInfra(tree, {\n mcpServerNameKebabCase: name,\n mcpServerNameClassName,\n projectName: project.name,\n artifact,\n iac,\n auth,\n containers,\n });\n }\n\n // @modelcontextprotocol/sdk declares zod as a peer dependency with a wide range\n // (^3.25 || ^4.0). Yarn does not dedupe the peer to the workspace's pinned zod, so\n // without a resolution it installs a separate zod under the SDK's own node_modules.\n // The two zod copies have structurally incompatible types, which breaks type\n // inference for registerTool inputSchema. Scope the resolution to the SDK so\n // other consumers (e.g. @tanstack/router-generator pinning zod@3) are unaffected.\n // Classic yarn only honours the `**/`-prefixed descriptor in a workspace, and\n // berry only the bare one — it deletes a glob descriptor on install — so\n // declare both.\n if (detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@modelcontextprotocol/sdk/zod': TS_VERSIONS['zod'],\n '@modelcontextprotocol/sdk/zod': TS_VERSIONS['zod'],\n };\n return packageJson;\n });\n }\n\n const localDevPort = assignPort(tree, project, 8000, {\n component: { info: TS_MCP_SERVER_GENERATOR_INFO, name: mcpTargetPrefix },\n });\n\n // Recorded below and read by the declaration's predicates, so the packages\n // added here are exactly the ones the version sync will own.\n const metadata: TsMcpServerMetadata = {\n infra,\n port: localDevPort,\n rc: mcpServerNameClassName,\n auth,\n ...(iac ? { iac } : {}),\n };\n\n // The MCP inspector has a postinstall script that cascades installs into its\n // client packages, which no-ops when the package is installed as a dependency.\n // Register it as an explicitly-rejected build so pnpm 11's default\n // `strictDepBuilds=true` skips it instead of failing the install.\n registerPnpmBuiltDependencies(tree, {\n '@modelcontextprotocol/inspector': false,\n });\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: project.root,\n });\n\n const mcpTargets = {\n ...project.targets,\n // Add targets for running the MCP server\n [`${mcpTargetPrefix}-serve-stdio`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/stdio.ts`],\n cwd: '{projectRoot}',\n },\n },\n [`${mcpTargetPrefix}-serve`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/http.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n },\n },\n },\n [`${mcpTargetPrefix}-dev`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/http.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n LOCAL_DEV: 'true',\n },\n },\n },\n [`${mcpTargetPrefix}-inspect`]: {\n executor: 'nx:run-commands',\n continuous: true,\n // Launch the inspector against the locally served HTTP server. The dev\n // target starts the server and any connected dependencies (e.g. a local\n // database).\n dependsOn: [`${mcpTargetPrefix}-dev`],\n options: {\n commands: [\n `mcp-inspector --transport http --server-url http://localhost:${localDevPort}/mcp`,\n ],\n cwd: '{projectRoot}',\n },\n },\n [`${mcpTargetPrefix}-inspect-stdio`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [\n `mcp-inspector -- tsx --watch ${relativeSourceDir}/stdio.ts`,\n ],\n cwd: '{projectRoot}',\n },\n },\n };\n\n // Aggregate `<mcp>-dev` under the project-level `dev` target.\n addComponentDevTarget(mcpTargets, `${mcpTargetPrefix}-dev`);\n\n updateProjectConfiguration(tree, project.name, {\n ...project,\n // Sort targets so their order is stable regardless of insertion order on\n // first run vs re-run.\n targets: sortObjectKeys(mcpTargets),\n });\n\n addComponentGeneratorMetadata(\n tree,\n project.name,\n TS_MCP_SERVER_GENERATOR_INFO,\n targetSourceDirRelativeToProjectRoot,\n mcpTargetPrefix,\n metadata,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_MCP_SERVER_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsMcpServerGenerator;\n"],"names":["detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readJson","updateJson","updateProjectConfiguration","addTsDependencies","AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES","addMcpServerInfra","addTypeScriptCodePackageTarget","agentCoreNodeRuntime","CODE_PACKAGE_DEPENDENCIES","isAgentCoreHosted","isContainerHosted","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","ADOT_IMAGE_DEPENDENCIES","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","isEsmWorkspace","kebabCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","normalizeTargetKeyOrder","readProjectConfigurationUnqualified","sortObjectKeys","registerPnpmBuiltDependencies","assignPort","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","BASE_IMAGES","TS_VERSIONS","DEPENDENCIES","ts","name","dev","root","py","TS_MCP_SERVER_GENERATOR_INFO","filename","tsMcpServerGenerator","tree","options","project","exists","Error","defaultName","split","pop","mcpServerNameClassName","mcpTargetPrefix","targetSourceDirRelativeToProjectRoot","targetSourceDir","relativeSourceDir","replace","distDir","infra","iac","undefined","auth","console","warn","projectPackageJsonPath","esm","type","templateContext","adotVersion","jaegerVersion","nodeBaseImage","node","dirname","overwriteStrategy","KeepExisting","container","containers","dockerImageTag","targetFilePath","bundleOutputDir","artifact","dockerTargetName","fs","targets","cache","executor","commands","cpFile","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","outputDir","packageOutputDir","targetName","bundleTargetName","runtime","entryPoint","mcpServerNameKebabCase","projectName","packageJson","resolutions","localDevPort","component","info","metadata","port","rc","projectRoot","mcpTargets","continuous","cwd","env","PORT","LOCAL_DEV","preferInstallDependencies","languages"],"mappings":"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"}
@@ -204,7 +204,7 @@ exports[`nx-generator generator > within @aws/nx-plugin > should update generato
204
204
  `;
205
205
 
206
206
  exports[`nx-generator generator > within another workspace > should generate an example schema, generator and test > local-generator.spec.ts 1`] = `
207
- "import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
207
+ "import { createTreeUsingTsSolutionSetup } from '@aws/nx-plugin/sdk/utils/test';
208
208
  import { Tree } from '@nx/devkit';
209
209
  import { fooBarGenerator } from './generator.js';
210
210
 
@@ -212,7 +212,7 @@ describe('foo#bar generator', () => {
212
212
  let tree: Tree;
213
213
 
214
214
  beforeEach(() => {
215
- tree = createTreeWithEmptyWorkspace();
215
+ tree = createTreeUsingTsSolutionSetup();
216
216
  });
217
217
 
218
218
  it('should run successfully', async () => {
@@ -1,4 +1,4 @@
1
- import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
1
+ import { createTreeUsingTsSolutionSetup } from '@aws/nx-plugin/sdk/utils/test';
2
2
  import { Tree } from '@nx/devkit';
3
3
  import { <%- nameCamelCase %>Generator } from './generator<% if (esm) { %>.js<% } %>';
4
4
 
@@ -6,7 +6,7 @@ describe('<%- name %> generator', () => {
6
6
  let tree: Tree;
7
7
 
8
8
  beforeEach(() => {
9
- tree = createTreeWithEmptyWorkspace();
9
+ tree = createTreeUsingTsSolutionSetup();
10
10
  });
11
11
 
12
12
  it('should run successfully', async () => {
@@ -14,7 +14,7 @@ import { isEsmWorkspace } from "../../utils/module-format.js";
14
14
  import { kebabCase } from "../../utils/names.js";
15
15
  import { getGeneratorInfo, isNxPluginForAwsWorkspace } from "../../utils/nx.js";
16
16
  import { sortObjectKeys } from "../../utils/object.js";
17
- import { addNxPluginDependencies, configureNxPluginPackageJson, NX_PLUGIN_DEPENDENCIES, readNxPluginProject } from "../nx-plugin/utils.js";
17
+ import { addNxPluginDependencies, addNxPluginManifestAssets, configureNxPluginPackageJson, NX_PLUGIN_DEPENDENCIES, readNxPluginProject } from "../nx-plugin/utils.js";
18
18
  export const DEPENDENCIES = declareDependencies()({
19
19
  ts: [
20
20
  ...NX_PLUGIN_DEPENDENCIES
@@ -55,6 +55,8 @@ export const NX_MIGRATION_GENERATOR_INFO = getGeneratorInfo(import.meta.filename
55
55
  const pluginPackageJsonPath = configureNxPluginPackageJson(tree, plugin, 'nx-migrations', {
56
56
  migrations: './migrations.json'
57
57
  });
58
+ // migrations.json must reach the published tarball the package.json points at
59
+ addNxPluginManifestAssets(tree, plugin);
58
60
  // Migrations sit three levels below the source root, so in this repo the
59
61
  // shared utils are relative. Elsewhere they come from the SDK.
60
62
  const formatImportPath = isNxPluginForAws ? '../../../utils/format' : `${PackageJson.name}/sdk/utils/format`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-migration/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n writeJson,\n} from '@nx/devkit';\nimport PackageJson from '../../../package.json' with { type: 'json' };\nimport { declareDependencies } from '../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport {\n LATEST_MIGRATIONS_DIR,\n migrationKey,\n} from '../../utils/migration-versions.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport { kebabCase } from '../../utils/names.js';\nimport {\n getGeneratorInfo,\n isNxPluginForAwsWorkspace,\n type NxGeneratorInfo,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport {\n addNxPluginDependencies,\n configureNxPluginPackageJson,\n NX_PLUGIN_DEPENDENCIES,\n readNxPluginProject,\n} from '../nx-plugin/utils.js';\nimport type { TsNxMigrationGeneratorSchema } from './schema';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [...NX_PLUGIN_DEPENDENCIES],\n});\n\nexport const NX_MIGRATION_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\n/**\n * Scaffolds a migration in an Nx Plugin project and registers it in the\n * plugin's `migrations.json` (creating the manifest and wiring the\n * `nx-migrations` field into the plugin's `package.json` if absent), so\n * `nx migrate` applies it when users upgrade the plugin.\n *\n * Supports all three migration kinds:\n * - `deterministic`: a codemod (`implementation`).\n * - `agentic`: a `prompt` markdown file applied by the user's agent.\n * - `hybrid`: both — the codemod does the mechanical part and returns\n * `agentContext`, then the prompt hands off to the agent for the rest.\n *\n * No `version` is written — the plugin author stamps versions at release time.\n */\nexport const tsNxMigrationGenerator = async (\n tree: Tree,\n options: TsNxMigrationGeneratorSchema,\n): Promise<GeneratorCallback | void> => {\n const name = kebabCase(options.name);\n // Shown by `nx migrate` when the migration runs, so it needs to say something\n const description =\n options.description ?? 'TODO: Add short description of the migration';\n const kind = options.kind ?? 'deterministic';\n\n const hasImplementation = kind === 'deterministic' || kind === 'hybrid';\n const hasPrompt = kind === 'agentic' || kind === 'hybrid';\n const isHybrid = kind === 'hybrid';\n\n const plugin = readNxPluginProject(tree, options.project);\n\n const sourceRoot = plugin.sourceRoot ?? joinPathFragments(plugin.root, 'src');\n const srcDir = sourceRoot.split('/').filter(Boolean).pop();\n // Migrations are grouped by the release that ships them. A new one lands in\n // `latest` — the release that picks it up moves it into its version folder.\n const migrationPath = `${srcDir}/migrations/${LATEST_MIGRATIONS_DIR}/${name}`;\n const migrationDir = joinPathFragments(\n sourceRoot,\n 'migrations',\n LATEST_MIGRATIONS_DIR,\n name,\n );\n const key = migrationKey(LATEST_MIGRATIONS_DIR, name);\n\n const isNxPluginForAws = isNxPluginForAwsWorkspace(tree);\n\n // Point the plugin at its migrations manifest so `nx migrate` finds them\n const pluginPackageJsonPath = configureNxPluginPackageJson(\n tree,\n plugin,\n 'nx-migrations',\n { migrations: './migrations.json' },\n );\n\n // Migrations sit three levels below the source root, so in this repo the\n // shared utils are relative. Elsewhere they come from the SDK.\n const formatImportPath = isNxPluginForAws\n ? '../../../utils/format'\n : `${PackageJson.name}/sdk/utils/format`;\n const testImportPath = isNxPluginForAws\n ? '../../../utils/test'\n : `${PackageJson.name}/sdk/utils/test`;\n // A generated workspace resolves with `nodenext`, which needs the explicit\n // extension on the spec's sibling import; this repo resolves with `bundler`,\n // which takes it extensionless.\n const esm = !isNxPluginForAws && isEsmWorkspace(tree);\n\n // One template set covers all kinds — scaffold it, then prune what this kind\n // doesn't use.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n migrationDir,\n {\n name,\n description,\n isHybrid,\n formatImportPath,\n testImportPath,\n esm,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n if (!hasImplementation) {\n tree.delete(joinPathFragments(migrationDir, 'migration.ts'));\n tree.delete(joinPathFragments(migrationDir, 'migration.spec.ts'));\n }\n if (!hasPrompt) {\n tree.delete(joinPathFragments(migrationDir, 'prompt.md'));\n }\n\n if (isNxPluginForAws) {\n // In the plugin's own repo migrations.json is assembled from these folders\n // at build time (see utils/migration-manifest.ts), so registration is just\n // the description beside the code — its kind comes from the files present.\n // Two migration PRs then touch disjoint files rather than one shared manifest.\n const metadataPath = joinPathFragments(migrationDir, 'metadata.json');\n if (!tree.exists(metadataPath)) {\n writeJson(tree, metadataPath, { description });\n }\n } else {\n // Elsewhere, register the migration under its folder-prefixed key. The fields\n // present discriminate the kind for nx, and paths are relative to\n // migrations.json. No version is written, but an already-stamped one is kept.\n const migrationsJsonPath = joinPathFragments(\n plugin.root,\n 'migrations.json',\n );\n const migrationsJson = tree.exists(migrationsJsonPath)\n ? readJson(tree, migrationsJsonPath)\n : {\n $schema: 'http://json-schema.org/schema',\n name: readJson(tree, pluginPackageJsonPath).name ?? plugin.name,\n generators: {},\n };\n writeJson(tree, migrationsJsonPath, {\n ...migrationsJson,\n generators: sortObjectKeys({\n ...migrationsJson.generators,\n [key]: {\n ...(migrationsJson.generators?.[key]?.version\n ? { version: migrationsJson.generators[key].version }\n : {}),\n description,\n ...(hasImplementation\n ? { implementation: `./${migrationPath}/migration` }\n : {}),\n ...(hasPrompt ? { prompt: `./${migrationPath}/prompt.md` } : {}),\n },\n }),\n });\n }\n\n // Codemods import @nx/devkit and the @aws/nx-plugin SDK, both of which must\n // resolve for nx to run them\n if (hasImplementation) {\n addNxPluginDependencies(tree, pluginPackageJsonPath, DEPENDENCIES);\n }\n\n await addGeneratorMetricsIfApplicable(tree, [NX_MIGRATION_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n\n if (hasImplementation && !isNxPluginForAws) {\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n ensureResolvable: ['@nx/devkit'],\n });\n }\n};\n\nexport default tsNxMigrationGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","readJson","writeJson","PackageJson","type","declareDependencies","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","LATEST_MIGRATIONS_DIR","migrationKey","isEsmWorkspace","kebabCase","getGeneratorInfo","isNxPluginForAwsWorkspace","sortObjectKeys","addNxPluginDependencies","configureNxPluginPackageJson","NX_PLUGIN_DEPENDENCIES","readNxPluginProject","DEPENDENCIES","ts","NX_MIGRATION_GENERATOR_INFO","filename","tsNxMigrationGenerator","tree","options","name","description","kind","hasImplementation","hasPrompt","isHybrid","plugin","project","sourceRoot","root","srcDir","split","filter","Boolean","pop","migrationPath","migrationDir","key","isNxPluginForAws","pluginPackageJsonPath","migrations","formatImportPath","testImportPath","esm","dirname","overwriteStrategy","KeepExisting","delete","metadataPath","exists","migrationsJsonPath","migrationsJson","$schema","generators","version","implementation","prompt","preferInstallDependencies","languages","ensureResolvable"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-migration/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n writeJson,\n} from '@nx/devkit';\nimport PackageJson from '../../../package.json' with { type: 'json' };\nimport { declareDependencies } from '../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport {\n LATEST_MIGRATIONS_DIR,\n migrationKey,\n} from '../../utils/migration-versions.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport { kebabCase } from '../../utils/names.js';\nimport {\n getGeneratorInfo,\n isNxPluginForAwsWorkspace,\n type NxGeneratorInfo,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport {\n addNxPluginDependencies,\n addNxPluginManifestAssets,\n configureNxPluginPackageJson,\n NX_PLUGIN_DEPENDENCIES,\n readNxPluginProject,\n} from '../nx-plugin/utils.js';\nimport type { TsNxMigrationGeneratorSchema } from './schema';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [...NX_PLUGIN_DEPENDENCIES],\n});\n\nexport const NX_MIGRATION_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\n/**\n * Scaffolds a migration in an Nx Plugin project and registers it in the\n * plugin's `migrations.json` (creating the manifest and wiring the\n * `nx-migrations` field into the plugin's `package.json` if absent), so\n * `nx migrate` applies it when users upgrade the plugin.\n *\n * Supports all three migration kinds:\n * - `deterministic`: a codemod (`implementation`).\n * - `agentic`: a `prompt` markdown file applied by the user's agent.\n * - `hybrid`: both — the codemod does the mechanical part and returns\n * `agentContext`, then the prompt hands off to the agent for the rest.\n *\n * No `version` is written — the plugin author stamps versions at release time.\n */\nexport const tsNxMigrationGenerator = async (\n tree: Tree,\n options: TsNxMigrationGeneratorSchema,\n): Promise<GeneratorCallback | void> => {\n const name = kebabCase(options.name);\n // Shown by `nx migrate` when the migration runs, so it needs to say something\n const description =\n options.description ?? 'TODO: Add short description of the migration';\n const kind = options.kind ?? 'deterministic';\n\n const hasImplementation = kind === 'deterministic' || kind === 'hybrid';\n const hasPrompt = kind === 'agentic' || kind === 'hybrid';\n const isHybrid = kind === 'hybrid';\n\n const plugin = readNxPluginProject(tree, options.project);\n\n const sourceRoot = plugin.sourceRoot ?? joinPathFragments(plugin.root, 'src');\n const srcDir = sourceRoot.split('/').filter(Boolean).pop();\n // Migrations are grouped by the release that ships them. A new one lands in\n // `latest` — the release that picks it up moves it into its version folder.\n const migrationPath = `${srcDir}/migrations/${LATEST_MIGRATIONS_DIR}/${name}`;\n const migrationDir = joinPathFragments(\n sourceRoot,\n 'migrations',\n LATEST_MIGRATIONS_DIR,\n name,\n );\n const key = migrationKey(LATEST_MIGRATIONS_DIR, name);\n\n const isNxPluginForAws = isNxPluginForAwsWorkspace(tree);\n\n // Point the plugin at its migrations manifest so `nx migrate` finds them\n const pluginPackageJsonPath = configureNxPluginPackageJson(\n tree,\n plugin,\n 'nx-migrations',\n { migrations: './migrations.json' },\n );\n\n // migrations.json must reach the published tarball the package.json points at\n addNxPluginManifestAssets(tree, plugin);\n\n // Migrations sit three levels below the source root, so in this repo the\n // shared utils are relative. Elsewhere they come from the SDK.\n const formatImportPath = isNxPluginForAws\n ? '../../../utils/format'\n : `${PackageJson.name}/sdk/utils/format`;\n const testImportPath = isNxPluginForAws\n ? '../../../utils/test'\n : `${PackageJson.name}/sdk/utils/test`;\n // A generated workspace resolves with `nodenext`, which needs the explicit\n // extension on the spec's sibling import; this repo resolves with `bundler`,\n // which takes it extensionless.\n const esm = !isNxPluginForAws && isEsmWorkspace(tree);\n\n // One template set covers all kinds — scaffold it, then prune what this kind\n // doesn't use.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n migrationDir,\n {\n name,\n description,\n isHybrid,\n formatImportPath,\n testImportPath,\n esm,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n if (!hasImplementation) {\n tree.delete(joinPathFragments(migrationDir, 'migration.ts'));\n tree.delete(joinPathFragments(migrationDir, 'migration.spec.ts'));\n }\n if (!hasPrompt) {\n tree.delete(joinPathFragments(migrationDir, 'prompt.md'));\n }\n\n if (isNxPluginForAws) {\n // In the plugin's own repo migrations.json is assembled from these folders\n // at build time (see utils/migration-manifest.ts), so registration is just\n // the description beside the code — its kind comes from the files present.\n // Two migration PRs then touch disjoint files rather than one shared manifest.\n const metadataPath = joinPathFragments(migrationDir, 'metadata.json');\n if (!tree.exists(metadataPath)) {\n writeJson(tree, metadataPath, { description });\n }\n } else {\n // Elsewhere, register the migration under its folder-prefixed key. The fields\n // present discriminate the kind for nx, and paths are relative to\n // migrations.json. No version is written, but an already-stamped one is kept.\n const migrationsJsonPath = joinPathFragments(\n plugin.root,\n 'migrations.json',\n );\n const migrationsJson = tree.exists(migrationsJsonPath)\n ? readJson(tree, migrationsJsonPath)\n : {\n $schema: 'http://json-schema.org/schema',\n name: readJson(tree, pluginPackageJsonPath).name ?? plugin.name,\n generators: {},\n };\n writeJson(tree, migrationsJsonPath, {\n ...migrationsJson,\n generators: sortObjectKeys({\n ...migrationsJson.generators,\n [key]: {\n ...(migrationsJson.generators?.[key]?.version\n ? { version: migrationsJson.generators[key].version }\n : {}),\n description,\n ...(hasImplementation\n ? { implementation: `./${migrationPath}/migration` }\n : {}),\n ...(hasPrompt ? { prompt: `./${migrationPath}/prompt.md` } : {}),\n },\n }),\n });\n }\n\n // Codemods import @nx/devkit and the @aws/nx-plugin SDK, both of which must\n // resolve for nx to run them\n if (hasImplementation) {\n addNxPluginDependencies(tree, pluginPackageJsonPath, DEPENDENCIES);\n }\n\n await addGeneratorMetricsIfApplicable(tree, [NX_MIGRATION_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n\n if (hasImplementation && !isNxPluginForAws) {\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n ensureResolvable: ['@nx/devkit'],\n });\n }\n};\n\nexport default tsNxMigrationGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","readJson","writeJson","PackageJson","type","declareDependencies","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","LATEST_MIGRATIONS_DIR","migrationKey","isEsmWorkspace","kebabCase","getGeneratorInfo","isNxPluginForAwsWorkspace","sortObjectKeys","addNxPluginDependencies","addNxPluginManifestAssets","configureNxPluginPackageJson","NX_PLUGIN_DEPENDENCIES","readNxPluginProject","DEPENDENCIES","ts","NX_MIGRATION_GENERATOR_INFO","filename","tsNxMigrationGenerator","tree","options","name","description","kind","hasImplementation","hasPrompt","isHybrid","plugin","project","sourceRoot","root","srcDir","split","filter","Boolean","pop","migrationPath","migrationDir","key","isNxPluginForAws","pluginPackageJsonPath","migrations","formatImportPath","testImportPath","esm","dirname","overwriteStrategy","KeepExisting","delete","metadataPath","exists","migrationsJsonPath","migrationsJson","$schema","generators","version","implementation","prompt","preferInstallDependencies","languages","ensureResolvable"],"mappings":"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"}
@@ -2,9 +2,9 @@
2
2
 
3
3
  exports[`ts#nx-plugin generator > should generate MCP server files > test-plugin/src/mcp-server/http.ts 1`] = `
4
4
  "#!/usr/bin/env node
5
- import { createServer } from './server.js';
6
5
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
7
6
  import express, { Request, Response } from 'express';
7
+ import { createServer } from './server.js';
8
8
 
9
9
  const PORT = parseInt(process.env.PORT || '8000');
10
10
 
@@ -271,30 +271,6 @@ Then, install the plugin package to ensure generators are available:
271
271
  "
272
272
  `;
273
273
 
274
- exports[`ts#nx-plugin generator > should generate MCP server files > test-plugin/src/mcp-server/tools/divide.ts 1`] = `
275
- "import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
276
- import { z } from 'zod';
277
-
278
- export const registerDivideTool = (server: McpServer) => {
279
- server.registerTool(
280
- 'divide',
281
- {
282
- description: 'divides two numbers',
283
- inputSchema: {
284
- a: z.number(),
285
- b: z
286
- .number()
287
- .refine((n) => n !== 0, { message: 'Cannot divide by zero' }),
288
- },
289
- },
290
- async ({ a, b }) => ({
291
- content: [{ type: 'text' as const, text: String(a / b) }],
292
- }),
293
- );
294
- };
295
- "
296
- `;
297
-
298
274
  exports[`ts#nx-plugin generator > should generate MCP server files > test-plugin/src/mcp-server/tools/general-guidance.ts 1`] = `
299
275
  "import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
300
276
  import * as fs from 'fs';
@@ -11,7 +11,7 @@ import { addDependencyToTargetIfNotPresent, addGeneratorMetadata, getGeneratorIn
11
11
  import { sortObjectKeys } from "../../utils/object.js";
12
12
  import tsProjectGenerator, { getTsLibDetails } from "../lib/generator.js";
13
13
  import tsMcpServerGenerator from "../mcp-server/generator.js";
14
- import { configureTsProjectAsNxPlugin, NX_PLUGIN_DEPENDENCIES } from "./utils.js";
14
+ import { configureTsProjectAsNxPlugin, NX_PLUGIN_DEPENDENCIES, nxPluginManifestAssets } from "./utils.js";
15
15
  export const DEPENDENCIES = declareDependencies()({
16
16
  ts: [
17
17
  ...NX_PLUGIN_DEPENDENCIES
@@ -54,16 +54,7 @@ export const tsNxPluginGenerator = async (tree, options)=>{
54
54
  glob: '**/*.d.ts',
55
55
  output: './src'
56
56
  },
57
- {
58
- input: './{projectRoot}',
59
- glob: 'generators.json',
60
- output: '.'
61
- },
62
- {
63
- input: './{projectRoot}',
64
- glob: 'executors.json',
65
- output: '.'
66
- }
57
+ ...nxPluginManifestAssets()
67
58
  ]
68
59
  }
69
60
  },
@@ -77,6 +68,17 @@ export const tsNxPluginGenerator = async (tree, options)=>{
77
68
  // Sort targets so their order is stable regardless of insertion order.
78
69
  project.targets = sortObjectKeys(project.targets);
79
70
  updateProjectConfiguration(tree, fullyQualifiedName, project);
71
+ const mcpPath = joinPathFragments(project.sourceRoot, 'mcp-server');
72
+ // The sample server and tools ts#mcp-server scaffolds are replaced by the
73
+ // generator MCP server below. Only the ones it creates in this run are
74
+ // removed, so a re-run leaves the server the user owns and has customised.
75
+ const SAMPLE_MCP_FILES = [
76
+ 'server.ts',
77
+ 'tools/add.ts',
78
+ 'tools/divide.ts',
79
+ 'resources/sample-guidance.ts'
80
+ ];
81
+ const preexistingSampleFiles = new Set(SAMPLE_MCP_FILES.filter((file)=>tree.exists(joinPathFragments(mcpPath, file))));
80
82
  // Add an MCP Server
81
83
  await tsMcpServerGenerator(tree, {
82
84
  project: fullyQualifiedName,
@@ -84,12 +86,12 @@ export const tsNxPluginGenerator = async (tree, options)=>{
84
86
  iac: 'cdk',
85
87
  preferInstallDependencies: false
86
88
  });
87
- const mcpPath = joinPathFragments(project.sourceRoot, 'mcp-server');
88
- const mcpServerPath = joinPathFragments(mcpPath, 'server.ts');
89
- // Remove the sample server and tools
90
- tree.delete(mcpServerPath);
91
- tree.delete(joinPathFragments(mcpPath, 'tools', 'add.ts'));
92
- tree.delete(joinPathFragments(mcpPath, 'resources', 'sample-guidance.ts'));
89
+ for (const file of SAMPLE_MCP_FILES){
90
+ const sampleFilePath = joinPathFragments(mcpPath, file);
91
+ if (!preexistingSampleFiles.has(file) && tree.exists(sampleFilePath)) {
92
+ tree.delete(sampleFilePath);
93
+ }
94
+ }
93
95
  // Add generator MCP server
94
96
  generateFiles(tree, joinPathFragments(import.meta.dirname, 'files', 'mcp-server'), mcpPath, {
95
97
  name: fullyQualifiedName,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { declareDependencies } from '../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator.js';\nimport tsMcpServerGenerator from '../mcp-server/generator.js';\nimport type { TsNxPluginGeneratorSchema } from './schema';\nimport {\n configureTsProjectAsNxPlugin,\n NX_PLUGIN_DEPENDENCIES,\n} from './utils.js';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [...NX_PLUGIN_DEPENDENCIES],\n});\n\nexport const TS_NX_PLUGIN_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsNxPluginGenerator = async (\n tree: Tree,\n options: TsNxPluginGeneratorSchema,\n): Promise<GeneratorCallback> => {\n // Generate a TypeScript project as the base\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, options);\n await tsProjectGenerator(tree, {\n ...options,\n preferInstallDependencies: false,\n });\n\n // Configure the typescript project as an Nx Plugin\n configureTsProjectAsNxPlugin(tree, fullyQualifiedName, DEPENDENCIES);\n\n // Add a \"package\" target which creates a package which can be published to NPM\n const project = readProjectConfigurationUnqualified(tree, fullyQualifiedName);\n project.targets = {\n ...project.targets,\n package: {\n executor: '@nx/js:tsc',\n outputs: ['{options.outputPath}'],\n options: {\n outputPath: `dist/{projectRoot}/package`,\n main: `{projectRoot}/src/index.ts`,\n tsConfig: `{projectRoot}/tsconfig.lib.json`,\n assets: [\n `{projectRoot}/*.md`,\n `{projectRoot}/LICENSE*`,\n `{projectRoot}/NOTICE`,\n {\n input: './{projectRoot}/src',\n glob: '**/!(*.ts)',\n output: './src',\n },\n {\n input: './{projectRoot}/src',\n glob: '**/*.d.ts',\n output: './src',\n },\n {\n input: './{projectRoot}',\n glob: 'generators.json',\n output: '.',\n },\n {\n input: './{projectRoot}',\n glob: 'executors.json',\n output: '.',\n },\n ],\n },\n },\n build: {\n ...project.targets?.build,\n },\n };\n // Append the package dependency without moving an existing entry, so re-runs\n // do not reorder the build dependencies.\n addDependencyToTargetIfNotPresent(project, 'build', 'package');\n // Sort targets so their order is stable regardless of insertion order.\n project.targets = sortObjectKeys(project.targets);\n updateProjectConfiguration(tree, fullyQualifiedName, project);\n\n // Add an MCP Server\n await tsMcpServerGenerator(tree, {\n project: fullyQualifiedName,\n infra: 'none',\n iac: 'cdk', // not used\n preferInstallDependencies: false,\n });\n\n const mcpPath = joinPathFragments(project.sourceRoot, 'mcp-server');\n const mcpServerPath = joinPathFragments(mcpPath, 'server.ts');\n\n // Remove the sample server and tools\n tree.delete(mcpServerPath);\n tree.delete(joinPathFragments(mcpPath, 'tools', 'add.ts'));\n tree.delete(joinPathFragments(mcpPath, 'resources', 'sample-guidance.ts'));\n\n // Add generator MCP server\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'mcp-server'),\n mcpPath,\n {\n name: fullyQualifiedName,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n addGeneratorMetadata(tree, project.name, TS_NX_PLUGIN_GENERATOR_INFO);\n\n await addGeneratorMetricsIfApplicable(tree, [TS_NX_PLUGIN_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsNxPluginGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","declareDependencies","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","tsProjectGenerator","getTsLibDetails","tsMcpServerGenerator","configureTsProjectAsNxPlugin","NX_PLUGIN_DEPENDENCIES","DEPENDENCIES","ts","TS_NX_PLUGIN_GENERATOR_INFO","filename","tsNxPluginGenerator","tree","options","fullyQualifiedName","dir","preferInstallDependencies","project","targets","package","executor","outputs","outputPath","main","tsConfig","assets","input","glob","output","build","infra","iac","mcpPath","sourceRoot","mcpServerPath","delete","dirname","name","overwriteStrategy","KeepExisting","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { declareDependencies } from '../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator.js';\nimport tsMcpServerGenerator from '../mcp-server/generator.js';\nimport type { TsNxPluginGeneratorSchema } from './schema';\nimport {\n configureTsProjectAsNxPlugin,\n NX_PLUGIN_DEPENDENCIES,\n nxPluginManifestAssets,\n} from './utils.js';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [...NX_PLUGIN_DEPENDENCIES],\n});\n\nexport const TS_NX_PLUGIN_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsNxPluginGenerator = async (\n tree: Tree,\n options: TsNxPluginGeneratorSchema,\n): Promise<GeneratorCallback> => {\n // Generate a TypeScript project as the base\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, options);\n await tsProjectGenerator(tree, {\n ...options,\n preferInstallDependencies: false,\n });\n\n // Configure the typescript project as an Nx Plugin\n configureTsProjectAsNxPlugin(tree, fullyQualifiedName, DEPENDENCIES);\n\n // Add a \"package\" target which creates a package which can be published to NPM\n const project = readProjectConfigurationUnqualified(tree, fullyQualifiedName);\n project.targets = {\n ...project.targets,\n package: {\n executor: '@nx/js:tsc',\n outputs: ['{options.outputPath}'],\n options: {\n outputPath: `dist/{projectRoot}/package`,\n main: `{projectRoot}/src/index.ts`,\n tsConfig: `{projectRoot}/tsconfig.lib.json`,\n assets: [\n `{projectRoot}/*.md`,\n `{projectRoot}/LICENSE*`,\n `{projectRoot}/NOTICE`,\n {\n input: './{projectRoot}/src',\n glob: '**/!(*.ts)',\n output: './src',\n },\n {\n input: './{projectRoot}/src',\n glob: '**/*.d.ts',\n output: './src',\n },\n ...nxPluginManifestAssets(),\n ],\n },\n },\n build: {\n ...project.targets?.build,\n },\n };\n // Append the package dependency without moving an existing entry, so re-runs\n // do not reorder the build dependencies.\n addDependencyToTargetIfNotPresent(project, 'build', 'package');\n // Sort targets so their order is stable regardless of insertion order.\n project.targets = sortObjectKeys(project.targets);\n updateProjectConfiguration(tree, fullyQualifiedName, project);\n\n const mcpPath = joinPathFragments(project.sourceRoot, 'mcp-server');\n\n // The sample server and tools ts#mcp-server scaffolds are replaced by the\n // generator MCP server below. Only the ones it creates in this run are\n // removed, so a re-run leaves the server the user owns and has customised.\n const SAMPLE_MCP_FILES = [\n 'server.ts',\n 'tools/add.ts',\n 'tools/divide.ts',\n 'resources/sample-guidance.ts',\n ];\n const preexistingSampleFiles = new Set(\n SAMPLE_MCP_FILES.filter((file) =>\n tree.exists(joinPathFragments(mcpPath, file)),\n ),\n );\n\n // Add an MCP Server\n await tsMcpServerGenerator(tree, {\n project: fullyQualifiedName,\n infra: 'none',\n iac: 'cdk', // not used\n preferInstallDependencies: false,\n });\n\n for (const file of SAMPLE_MCP_FILES) {\n const sampleFilePath = joinPathFragments(mcpPath, file);\n if (!preexistingSampleFiles.has(file) && tree.exists(sampleFilePath)) {\n tree.delete(sampleFilePath);\n }\n }\n\n // Add generator MCP server\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'mcp-server'),\n mcpPath,\n {\n name: fullyQualifiedName,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n addGeneratorMetadata(tree, project.name, TS_NX_PLUGIN_GENERATOR_INFO);\n\n await addGeneratorMetricsIfApplicable(tree, [TS_NX_PLUGIN_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsNxPluginGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","declareDependencies","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","tsProjectGenerator","getTsLibDetails","tsMcpServerGenerator","configureTsProjectAsNxPlugin","NX_PLUGIN_DEPENDENCIES","nxPluginManifestAssets","DEPENDENCIES","ts","TS_NX_PLUGIN_GENERATOR_INFO","filename","tsNxPluginGenerator","tree","options","fullyQualifiedName","dir","preferInstallDependencies","project","targets","package","executor","outputs","outputPath","main","tsConfig","assets","input","glob","output","build","mcpPath","sourceRoot","SAMPLE_MCP_FILES","preexistingSampleFiles","Set","filter","file","exists","infra","iac","sampleFilePath","has","delete","dirname","name","overwriteStrategy","KeepExisting","languages"],"mappings":"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"}
@@ -16,6 +16,27 @@ export declare const NX_PLUGIN_DEPENDENCIES: readonly [{
16
16
  export declare const readNxPluginProject: (tree: Tree, projectName: string) => ProjectConfiguration;
17
17
  /** `package.json` field pointing Nx at one of a plugin's manifests. */
18
18
  type NxPluginManifestField = 'generators' | 'nx-migrations';
19
+ /**
20
+ * The manifests Nx reads from a published plugin, copied beside the compiled
21
+ * code by the `package` target. `nx migrate` resolves `migrations.json` from the
22
+ * tarball, so it ships even though only `ts#nx-migration` writes it.
23
+ */
24
+ export declare const NX_PLUGIN_MANIFESTS: readonly ["generators.json", "executors.json", "migrations.json"];
25
+ /** The `package` target assets that copy the plugin's manifests into dist. */
26
+ export declare const nxPluginManifestAssets: () => {
27
+ input: string;
28
+ glob: string;
29
+ output: string;
30
+ }[];
31
+ /**
32
+ * Ensure the plugin's `package` target copies every manifest into dist, so a
33
+ * manifest added after the project was generated is still published.
34
+ *
35
+ * Anchored to the `generators.json` asset the target is vended with: a `package`
36
+ * target without it belongs to something other than an Nx Plugin, or has been
37
+ * rewritten, so it is left as it is.
38
+ */
39
+ export declare const addNxPluginManifestAssets: (tree: Tree, project: ProjectConfiguration) => void;
19
40
  /**
20
41
  * Create the plugin project's package.json if absent and point it at the given
21
42
  * manifest, returning its path.
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { joinPathFragments, updateJson, writeJson } from "@nx/devkit";
4
+ */ import { joinPathFragments, updateJson, updateProjectConfiguration, writeJson } from "@nx/devkit";
5
5
  import { forDependencies } from "../../utils/declared-dependencies.js";
6
6
  import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
7
7
  import { isEsmWorkspace } from "../../utils/module-format.js";
@@ -23,6 +23,46 @@ import { withVersions } from "../../utils/versions.js";
23
23
  }
24
24
  return project;
25
25
  };
26
+ /**
27
+ * The manifests Nx reads from a published plugin, copied beside the compiled
28
+ * code by the `package` target. `nx migrate` resolves `migrations.json` from the
29
+ * tarball, so it ships even though only `ts#nx-migration` writes it.
30
+ */ export const NX_PLUGIN_MANIFESTS = [
31
+ 'generators.json',
32
+ 'executors.json',
33
+ 'migrations.json'
34
+ ];
35
+ /** The `package` target assets that copy the plugin's manifests into dist. */ export const nxPluginManifestAssets = ()=>NX_PLUGIN_MANIFESTS.map((glob)=>({
36
+ input: './{projectRoot}',
37
+ glob,
38
+ output: '.'
39
+ }));
40
+ /**
41
+ * Ensure the plugin's `package` target copies every manifest into dist, so a
42
+ * manifest added after the project was generated is still published.
43
+ *
44
+ * Anchored to the `generators.json` asset the target is vended with: a `package`
45
+ * target without it belongs to something other than an Nx Plugin, or has been
46
+ * rewritten, so it is left as it is.
47
+ */ export const addNxPluginManifestAssets = (tree, project)=>{
48
+ const assets = project.targets?.package?.options?.assets;
49
+ if (!Array.isArray(assets)) {
50
+ return;
51
+ }
52
+ const globs = new Set(assets.filter((asset)=>typeof asset === 'object' && asset !== null).map((asset)=>asset.glob));
53
+ if (!globs.has('generators.json')) {
54
+ return;
55
+ }
56
+ const missing = nxPluginManifestAssets().filter((asset)=>!globs.has(asset.glob));
57
+ if (missing.length === 0) {
58
+ return;
59
+ }
60
+ project.targets.package.options.assets = [
61
+ ...assets,
62
+ ...missing
63
+ ];
64
+ updateProjectConfiguration(tree, project.name, project);
65
+ };
26
66
  /**
27
67
  * Create the plugin project's package.json if absent and point it at the given
28
68
  * manifest, returning its path.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/utils.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n writeJson,\n} from '@nx/devkit';\nimport type { PackageJson } from 'nx/src/utils/package-json';\nimport {\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../../utils/declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport {\n nxPluginSelfDependency,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx.js';\nimport { type ITsDepVersion, withVersions } from '../../utils/versions.js';\n\n/** Dependencies a caller must declare to configure an Nx Plugin project. */\nexport const NX_PLUGIN_DEPENDENCIES = [\n { name: '@nx/devkit' },\n] as const satisfies readonly { name: ITsDepVersion }[];\n\n/**\n * Read the configuration of a project which can host Nx Plugin generators or\n * migrations, ie a TypeScript project.\n */\nexport const readNxPluginProject = (\n tree: Tree,\n projectName: string,\n): ProjectConfiguration => {\n const project = readProjectConfigurationUnqualified(tree, projectName);\n\n const tsConfigPath = joinPathFragments(project.root, 'tsconfig.json');\n if (!tree.exists(tsConfigPath)) {\n throw new Error(\n `Selected plugin project ${projectName} is not a TypeScript project`,\n );\n }\n\n return project;\n};\n\n/** `package.json` field pointing Nx at one of a plugin's manifests. */\ntype NxPluginManifestField = 'generators' | 'nx-migrations';\n\n/**\n * Create the plugin project's package.json if absent and point it at the given\n * manifest, returning its path.\n */\nexport const configureNxPluginPackageJson = <\n TField extends NxPluginManifestField,\n>(\n tree: Tree,\n project: ProjectConfiguration,\n manifestField: TField,\n manifestValue: PackageJson[TField],\n): string => {\n const pluginPackageJsonPath = joinPathFragments(project.root, 'package.json');\n if (!tree.exists(pluginPackageJsonPath)) {\n writeJson(tree, pluginPackageJsonPath, {\n name: project.name,\n });\n }\n const esm = isEsmWorkspace(tree);\n updateJson(tree, pluginPackageJsonPath, (pkg) => {\n // Match the plugin's module system to the workspace. Nx loads `.ts` files\n // via Node's native type stripping, as ESM (workspace root is\n // `type: module`) or CommonJS accordingly.\n pkg.type ??= esm ? 'module' : 'commonjs';\n pkg.main ??= esm ? './src/index.js' : './src/index';\n pkg[manifestField] ??= manifestValue;\n return pkg;\n });\n return pluginPackageJsonPath;\n};\n\n/**\n * Declare the dependencies the plugin's `.ts` files import on both the\n * workspace and the plugin, since both must resolve for Nx to load them. A\n * no-op inside the plugin's own monorepo, where they are already present.\n */\nexport const addNxPluginDependencies = <const D extends DependencyDeclaration>(\n tree: Tree,\n pluginPackageJsonPath: string,\n declaration: D & MustDeclare<typeof NX_PLUGIN_DEPENDENCIES, D>,\n): void => {\n const selfDependency = nxPluginSelfDependency(tree);\n if (Object.keys(selfDependency).length === 0) {\n return;\n }\n const deps = {\n ...withVersions(\n forDependencies<typeof NX_PLUGIN_DEPENDENCIES>(declaration),\n ['@nx/devkit'],\n ),\n ...selfDependency,\n };\n addDependenciesToPackageJson(tree, {}, deps);\n addDependenciesToPackageJson(tree, deps, {}, pluginPackageJsonPath);\n};\n\n/**\n * Configures a TypeScript project as an Nx Plugin\n */\nexport const configureTsProjectAsNxPlugin = <\n const D extends DependencyDeclaration,\n>(\n tree: Tree,\n projectName: string,\n declaration: D & MustDeclare<typeof NX_PLUGIN_DEPENDENCIES, D>,\n) => {\n const project = readNxPluginProject(tree, projectName);\n\n // Create an empty generators.json if one dosn't exist\n const generatorsJsonPath = joinPathFragments(project.root, 'generators.json');\n if (!tree.exists(generatorsJsonPath)) {\n writeJson(tree, generatorsJsonPath, {\n generators: {},\n });\n }\n\n const pluginPackageJsonPath = configureNxPluginPackageJson(\n tree,\n project,\n 'generators',\n './generators.json',\n );\n\n addNxPluginDependencies(\n tree,\n pluginPackageJsonPath,\n forDependencies<typeof NX_PLUGIN_DEPENDENCIES>(declaration),\n );\n};\n"],"names":["joinPathFragments","updateJson","writeJson","forDependencies","addDependenciesToPackageJson","isEsmWorkspace","nxPluginSelfDependency","readProjectConfigurationUnqualified","withVersions","NX_PLUGIN_DEPENDENCIES","name","readNxPluginProject","tree","projectName","project","tsConfigPath","root","exists","Error","configureNxPluginPackageJson","manifestField","manifestValue","pluginPackageJsonPath","esm","pkg","type","main","addNxPluginDependencies","declaration","selfDependency","Object","keys","length","deps","configureTsProjectAsNxPlugin","generatorsJsonPath","generators"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,EAGjBC,UAAU,EACVC,SAAS,QACJ,aAAa;AAEpB,SAEEC,eAAe,QAEV,uCAAuC;AAC9C,SAASC,4BAA4B,QAAQ,8BAA8B;AAC3E,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SACEC,sBAAsB,EACtBC,mCAAmC,QAC9B,oBAAoB;AAC3B,SAA6BC,YAAY,QAAQ,0BAA0B;AAE3E,0EAA0E,GAC1E,OAAO,MAAMC,yBAAyB;IACpC;QAAEC,MAAM;IAAa;CACtB,CAAuD;AAExD;;;CAGC,GACD,OAAO,MAAMC,sBAAsB,CACjCC,MACAC;IAEA,MAAMC,UAAUP,oCAAoCK,MAAMC;IAE1D,MAAME,eAAef,kBAAkBc,QAAQE,IAAI,EAAE;IACrD,IAAI,CAACJ,KAAKK,MAAM,CAACF,eAAe;QAC9B,MAAM,IAAIG,MACR,CAAC,wBAAwB,EAAEL,YAAY,4BAA4B,CAAC;IAExE;IAEA,OAAOC;AACT,EAAE;AAKF;;;CAGC,GACD,OAAO,MAAMK,+BAA+B,CAG1CP,MACAE,SACAM,eACAC;IAEA,MAAMC,wBAAwBtB,kBAAkBc,QAAQE,IAAI,EAAE;IAC9D,IAAI,CAACJ,KAAKK,MAAM,CAACK,wBAAwB;QACvCpB,UAAUU,MAAMU,uBAAuB;YACrCZ,MAAMI,QAAQJ,IAAI;QACpB;IACF;IACA,MAAMa,MAAMlB,eAAeO;IAC3BX,WAAWW,MAAMU,uBAAuB,CAACE;QACvC,0EAA0E;QAC1E,8DAA8D;QAC9D,2CAA2C;QAC3CA,IAAIC,IAAI,KAAKF,MAAM,WAAW;QAC9BC,IAAIE,IAAI,KAAKH,MAAM,mBAAmB;QACtCC,GAAG,CAACJ,cAAc,KAAKC;QACvB,OAAOG;IACT;IACA,OAAOF;AACT,EAAE;AAEF;;;;CAIC,GACD,OAAO,MAAMK,0BAA0B,CACrCf,MACAU,uBACAM;IAEA,MAAMC,iBAAiBvB,uBAAuBM;IAC9C,IAAIkB,OAAOC,IAAI,CAACF,gBAAgBG,MAAM,KAAK,GAAG;QAC5C;IACF;IACA,MAAMC,OAAO;QACX,GAAGzB,aACDL,gBAA+CyB,cAC/C;YAAC;SAAa,CACf;QACD,GAAGC,cAAc;IACnB;IACAzB,6BAA6BQ,MAAM,CAAC,GAAGqB;IACvC7B,6BAA6BQ,MAAMqB,MAAM,CAAC,GAAGX;AAC/C,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMY,+BAA+B,CAG1CtB,MACAC,aACAe;IAEA,MAAMd,UAAUH,oBAAoBC,MAAMC;IAE1C,sDAAsD;IACtD,MAAMsB,qBAAqBnC,kBAAkBc,QAAQE,IAAI,EAAE;IAC3D,IAAI,CAACJ,KAAKK,MAAM,CAACkB,qBAAqB;QACpCjC,UAAUU,MAAMuB,oBAAoB;YAClCC,YAAY,CAAC;QACf;IACF;IAEA,MAAMd,wBAAwBH,6BAC5BP,MACAE,SACA,cACA;IAGFa,wBACEf,MACAU,uBACAnB,gBAA+CyB;AAEnD,EAAE"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/utils.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n writeJson,\n} from '@nx/devkit';\nimport type { PackageJson } from 'nx/src/utils/package-json';\nimport {\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../../utils/declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport {\n nxPluginSelfDependency,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx.js';\nimport { type ITsDepVersion, withVersions } from '../../utils/versions.js';\n\n/** Dependencies a caller must declare to configure an Nx Plugin project. */\nexport const NX_PLUGIN_DEPENDENCIES = [\n { name: '@nx/devkit' },\n] as const satisfies readonly { name: ITsDepVersion }[];\n\n/**\n * Read the configuration of a project which can host Nx Plugin generators or\n * migrations, ie a TypeScript project.\n */\nexport const readNxPluginProject = (\n tree: Tree,\n projectName: string,\n): ProjectConfiguration => {\n const project = readProjectConfigurationUnqualified(tree, projectName);\n\n const tsConfigPath = joinPathFragments(project.root, 'tsconfig.json');\n if (!tree.exists(tsConfigPath)) {\n throw new Error(\n `Selected plugin project ${projectName} is not a TypeScript project`,\n );\n }\n\n return project;\n};\n\n/** `package.json` field pointing Nx at one of a plugin's manifests. */\ntype NxPluginManifestField = 'generators' | 'nx-migrations';\n\n/**\n * The manifests Nx reads from a published plugin, copied beside the compiled\n * code by the `package` target. `nx migrate` resolves `migrations.json` from the\n * tarball, so it ships even though only `ts#nx-migration` writes it.\n */\nexport const NX_PLUGIN_MANIFESTS = [\n 'generators.json',\n 'executors.json',\n 'migrations.json',\n] as const;\n\n/** The `package` target assets that copy the plugin's manifests into dist. */\nexport const nxPluginManifestAssets = (): {\n input: string;\n glob: string;\n output: string;\n}[] =>\n NX_PLUGIN_MANIFESTS.map((glob) => ({\n input: './{projectRoot}',\n glob,\n output: '.',\n }));\n\n/**\n * Ensure the plugin's `package` target copies every manifest into dist, so a\n * manifest added after the project was generated is still published.\n *\n * Anchored to the `generators.json` asset the target is vended with: a `package`\n * target without it belongs to something other than an Nx Plugin, or has been\n * rewritten, so it is left as it is.\n */\nexport const addNxPluginManifestAssets = (\n tree: Tree,\n project: ProjectConfiguration,\n): void => {\n const assets = project.targets?.package?.options?.assets;\n if (!Array.isArray(assets)) {\n return;\n }\n const globs = new Set(\n assets\n .filter((asset) => typeof asset === 'object' && asset !== null)\n .map((asset) => asset.glob),\n );\n if (!globs.has('generators.json')) {\n return;\n }\n const missing = nxPluginManifestAssets().filter(\n (asset) => !globs.has(asset.glob),\n );\n if (missing.length === 0) {\n return;\n }\n project.targets.package.options.assets = [...assets, ...missing];\n updateProjectConfiguration(tree, project.name, project);\n};\n\n/**\n * Create the plugin project's package.json if absent and point it at the given\n * manifest, returning its path.\n */\nexport const configureNxPluginPackageJson = <\n TField extends NxPluginManifestField,\n>(\n tree: Tree,\n project: ProjectConfiguration,\n manifestField: TField,\n manifestValue: PackageJson[TField],\n): string => {\n const pluginPackageJsonPath = joinPathFragments(project.root, 'package.json');\n if (!tree.exists(pluginPackageJsonPath)) {\n writeJson(tree, pluginPackageJsonPath, {\n name: project.name,\n });\n }\n const esm = isEsmWorkspace(tree);\n updateJson(tree, pluginPackageJsonPath, (pkg) => {\n // Match the plugin's module system to the workspace. Nx loads `.ts` files\n // via Node's native type stripping, as ESM (workspace root is\n // `type: module`) or CommonJS accordingly.\n pkg.type ??= esm ? 'module' : 'commonjs';\n pkg.main ??= esm ? './src/index.js' : './src/index';\n pkg[manifestField] ??= manifestValue;\n return pkg;\n });\n return pluginPackageJsonPath;\n};\n\n/**\n * Declare the dependencies the plugin's `.ts` files import on both the\n * workspace and the plugin, since both must resolve for Nx to load them. A\n * no-op inside the plugin's own monorepo, where they are already present.\n */\nexport const addNxPluginDependencies = <const D extends DependencyDeclaration>(\n tree: Tree,\n pluginPackageJsonPath: string,\n declaration: D & MustDeclare<typeof NX_PLUGIN_DEPENDENCIES, D>,\n): void => {\n const selfDependency = nxPluginSelfDependency(tree);\n if (Object.keys(selfDependency).length === 0) {\n return;\n }\n const deps = {\n ...withVersions(\n forDependencies<typeof NX_PLUGIN_DEPENDENCIES>(declaration),\n ['@nx/devkit'],\n ),\n ...selfDependency,\n };\n addDependenciesToPackageJson(tree, {}, deps);\n addDependenciesToPackageJson(tree, deps, {}, pluginPackageJsonPath);\n};\n\n/**\n * Configures a TypeScript project as an Nx Plugin\n */\nexport const configureTsProjectAsNxPlugin = <\n const D extends DependencyDeclaration,\n>(\n tree: Tree,\n projectName: string,\n declaration: D & MustDeclare<typeof NX_PLUGIN_DEPENDENCIES, D>,\n) => {\n const project = readNxPluginProject(tree, projectName);\n\n // Create an empty generators.json if one dosn't exist\n const generatorsJsonPath = joinPathFragments(project.root, 'generators.json');\n if (!tree.exists(generatorsJsonPath)) {\n writeJson(tree, generatorsJsonPath, {\n generators: {},\n });\n }\n\n const pluginPackageJsonPath = configureNxPluginPackageJson(\n tree,\n project,\n 'generators',\n './generators.json',\n );\n\n addNxPluginDependencies(\n tree,\n pluginPackageJsonPath,\n forDependencies<typeof NX_PLUGIN_DEPENDENCIES>(declaration),\n );\n};\n"],"names":["joinPathFragments","updateJson","updateProjectConfiguration","writeJson","forDependencies","addDependenciesToPackageJson","isEsmWorkspace","nxPluginSelfDependency","readProjectConfigurationUnqualified","withVersions","NX_PLUGIN_DEPENDENCIES","name","readNxPluginProject","tree","projectName","project","tsConfigPath","root","exists","Error","NX_PLUGIN_MANIFESTS","nxPluginManifestAssets","map","glob","input","output","addNxPluginManifestAssets","assets","targets","package","options","Array","isArray","globs","Set","filter","asset","has","missing","length","configureNxPluginPackageJson","manifestField","manifestValue","pluginPackageJsonPath","esm","pkg","type","main","addNxPluginDependencies","declaration","selfDependency","Object","keys","deps","configureTsProjectAsNxPlugin","generatorsJsonPath","generators"],"mappings":"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"}
@@ -99,8 +99,8 @@ export const handler = async (
99
99
  `;
100
100
 
101
101
  exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/index.ts 1`] = `
102
- "export * from './prisma.js';
103
- // Export your library code here
102
+ "// Export your library code here
103
+ export * from './prisma.js';
104
104
  "
105
105
  `;
106
106
 
@@ -848,7 +848,7 @@ terraform {
848
848
  required_providers {
849
849
  aws = {
850
850
  source = "hashicorp/aws"
851
- version = "6.62.0"
851
+ version = "6.63.0"
852
852
  }
853
853
  null = {
854
854
  source = "hashicorp/null"
@@ -1519,7 +1519,7 @@ exports[`ts#rdb generator > should generate terraform modules when iac is Terraf
1519
1519
  }
1520
1520
  aws = {
1521
1521
  source = "hashicorp/aws"
1522
- version = "6.62.0"
1522
+ version = "6.63.0"
1523
1523
  }
1524
1524
  external = {
1525
1525
  source = "hashicorp/external"
@@ -2214,7 +2214,7 @@ terraform {
2214
2214
  required_providers {
2215
2215
  aws = {
2216
2216
  source = "hashicorp/aws"
2217
- version = "6.62.0"
2217
+ version = "6.63.0"
2218
2218
  }
2219
2219
  null = {
2220
2220
  source = "hashicorp/null"
@@ -2885,7 +2885,7 @@ exports[`ts#rdb generator > should generate terraform modules with MySQL engine
2885
2885
  }
2886
2886
  aws = {
2887
2887
  source = "hashicorp/aws"
2888
- version = "6.62.0"
2888
+ version = "6.63.0"
2889
2889
  }
2890
2890
  external = {
2891
2891
  source = "hashicorp/external"
@@ -3679,8 +3679,8 @@ export const handler = async (
3679
3679
  `;
3680
3680
 
3681
3681
  exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/index.ts 1`] = `
3682
- "export * from './prisma.js';
3683
- // Export your library code here
3682
+ "// Export your library code here
3683
+ export * from './prisma.js';
3684
3684
  "
3685
3685
  `;
3686
3686
 
@@ -4533,10 +4533,15 @@ WORKDIR \${LAMBDA_TASK_ROOT}
4533
4533
 
4534
4534
  # npm blocks dependency install scripts by default; allow prisma's so its
4535
4535
  # postinstall downloads the schema-engine binary needed to run migrations.
4536
+ # The overrides pin transitive dependencies of the CLI with known HIGH/CRITICAL
4537
+ # vulnerabilities to fixed versions, which its own ranges resolve below.
4536
4538
  # npm is removed once prisma is installed — the handler runs prisma's own
4537
4539
  # binary directly, and npm's bundled dependencies would otherwise carry known
4538
4540
  # HIGH/CRITICAL vulnerabilities into the image.
4539
4541
  RUN printf 'allow-scripts[]=prisma\\nallow-scripts[]=@prisma/engines\\n' > .npmrc \\
4542
+ && npm init -y \\
4543
+ && npm pkg set "overrides.deepmerge-ts=8.0.2" \\
4544
+ && npm pkg set "overrides.mysql2=3.24.3" \\
4540
4545
  && npm install prisma@7.10.0 \\
4541
4546
  && rm .npmrc \\
4542
4547
  && npm uninstall -g npm
@@ -14,10 +14,15 @@ WORKDIR ${LAMBDA_TASK_ROOT}
14
14
 
15
15
  # npm blocks dependency install scripts by default; allow prisma's so its
16
16
  # postinstall downloads the schema-engine binary needed to run migrations.
17
+ # The overrides pin transitive dependencies of the CLI with known HIGH/CRITICAL
18
+ # vulnerabilities to fixed versions, which its own ranges resolve below.
17
19
  # npm is removed once prisma is installed — the handler runs prisma's own
18
20
  # binary directly, and npm's bundled dependencies would otherwise carry known
19
21
  # HIGH/CRITICAL vulnerabilities into the image.
20
22
  RUN printf 'allow-scripts[]=prisma\nallow-scripts[]=@prisma/engines\n' > .npmrc \
23
+ && npm init -y \
24
+ && npm pkg set "overrides.deepmerge-ts=<%- deepmergeTsVersion %>" \
25
+ && npm pkg set "overrides.mysql2=<%- mysql2Version %>" \
21
26
  && npm install prisma@<%= prismaVersion %> \
22
27
  && rm .npmrc \
23
28
  && npm uninstall -g npm