@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
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { type Tree } from '@nx/devkit';
6
+ /** A cross-project import a generator emits. */
7
+ export interface LocalProjectDependency {
8
+ /** Root of the project whose generated source contains the import. */
9
+ readonly consumerRoot: string;
10
+ /** Root of the project being imported. */
11
+ readonly dependencyRoot: string;
12
+ }
13
+ /**
14
+ * Declare a generated cross-project import in the importing project's own
15
+ * `package.json`, so a freshly generated workspace passes `lint`.
16
+ *
17
+ * `noUndeclaredDependencies` fails a project whose source imports a package its
18
+ * manifest doesn't declare. The `ts#sync` generator derives that from the
19
+ * project graph, but only runs as part of a task run — so a workspace that has
20
+ * never built fails `lint` before it has had the chance to, on generated code
21
+ * the user never touched.
22
+ *
23
+ * The specifier matches what `ts#sync` writes, so the two agree and re-running
24
+ * either is a no-op. TypeScript project references are left to
25
+ * `@nx/js:typescript-sync`, which owns resolving them. Sync stays the safety
26
+ * net for imports the user adds themselves.
27
+ */
28
+ export declare const addLocalProjectDependency: (tree: Tree, { consumerRoot, dependencyRoot }: LocalProjectDependency) => void;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */ import { joinPathFragments, readJson } from "@nx/devkit";
5
+ import { addDependenciesToPackageJson, getLocalDependencySpecifier } from "./dependencies.js";
6
+ /**
7
+ * Declare a generated cross-project import in the importing project's own
8
+ * `package.json`, so a freshly generated workspace passes `lint`.
9
+ *
10
+ * `noUndeclaredDependencies` fails a project whose source imports a package its
11
+ * manifest doesn't declare. The `ts#sync` generator derives that from the
12
+ * project graph, but only runs as part of a task run — so a workspace that has
13
+ * never built fails `lint` before it has had the chance to, on generated code
14
+ * the user never touched.
15
+ *
16
+ * The specifier matches what `ts#sync` writes, so the two agree and re-running
17
+ * either is a no-op. TypeScript project references are left to
18
+ * `@nx/js:typescript-sync`, which owns resolving them. Sync stays the safety
19
+ * net for imports the user adds themselves.
20
+ */ export const addLocalProjectDependency = (tree, { consumerRoot, dependencyRoot })=>{
21
+ const dependencyManifest = joinPathFragments(dependencyRoot, 'package.json');
22
+ const consumerManifest = joinPathFragments(consumerRoot, 'package.json');
23
+ if (!tree.exists(dependencyManifest) || !tree.exists(consumerManifest)) {
24
+ return;
25
+ }
26
+ const packageName = readJson(tree, dependencyManifest).name;
27
+ if (!packageName) {
28
+ return;
29
+ }
30
+ const { dependencies = {}, devDependencies = {} } = readJson(tree, consumerManifest);
31
+ // Declared in either list already — leave the user's choice alone.
32
+ if (dependencies[packageName] || devDependencies[packageName]) {
33
+ return;
34
+ }
35
+ addDependenciesToPackageJson(tree, {
36
+ [packageName]: getLocalDependencySpecifier(tree)
37
+ }, {}, consumerManifest);
38
+ };
39
+
40
+ //# sourceMappingURL=local-project-dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../packages/nx-plugin/src/utils/local-project-dependency.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { joinPathFragments, readJson, type Tree } from '@nx/devkit';\nimport {\n addDependenciesToPackageJson,\n getLocalDependencySpecifier,\n} from './dependencies.js';\n\n/** A cross-project import a generator emits. */\nexport interface LocalProjectDependency {\n /** Root of the project whose generated source contains the import. */\n readonly consumerRoot: string;\n /** Root of the project being imported. */\n readonly dependencyRoot: string;\n}\n\n/**\n * Declare a generated cross-project import in the importing project's own\n * `package.json`, so a freshly generated workspace passes `lint`.\n *\n * `noUndeclaredDependencies` fails a project whose source imports a package its\n * manifest doesn't declare. The `ts#sync` generator derives that from the\n * project graph, but only runs as part of a task run — so a workspace that has\n * never built fails `lint` before it has had the chance to, on generated code\n * the user never touched.\n *\n * The specifier matches what `ts#sync` writes, so the two agree and re-running\n * either is a no-op. TypeScript project references are left to\n * `@nx/js:typescript-sync`, which owns resolving them. Sync stays the safety\n * net for imports the user adds themselves.\n */\nexport const addLocalProjectDependency = (\n tree: Tree,\n { consumerRoot, dependencyRoot }: LocalProjectDependency,\n): void => {\n const dependencyManifest = joinPathFragments(dependencyRoot, 'package.json');\n const consumerManifest = joinPathFragments(consumerRoot, 'package.json');\n if (!tree.exists(dependencyManifest) || !tree.exists(consumerManifest)) {\n return;\n }\n const packageName = readJson<{ name?: string }>(\n tree,\n dependencyManifest,\n ).name;\n if (!packageName) {\n return;\n }\n const { dependencies = {}, devDependencies = {} } = readJson<{\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n }>(tree, consumerManifest);\n // Declared in either list already — leave the user's choice alone.\n if (dependencies[packageName] || devDependencies[packageName]) {\n return;\n }\n addDependenciesToPackageJson(\n tree,\n { [packageName]: getLocalDependencySpecifier(tree) },\n {},\n consumerManifest,\n );\n};\n"],"names":["joinPathFragments","readJson","addDependenciesToPackageJson","getLocalDependencySpecifier","addLocalProjectDependency","tree","consumerRoot","dependencyRoot","dependencyManifest","consumerManifest","exists","packageName","name","dependencies","devDependencies"],"mappings":"AAAA;;;CAGC,GACD,SAASA,iBAAiB,EAAEC,QAAQ,QAAmB,aAAa;AACpE,SACEC,4BAA4B,EAC5BC,2BAA2B,QACtB,oBAAoB;AAU3B;;;;;;;;;;;;;;CAcC,GACD,OAAO,MAAMC,4BAA4B,CACvCC,MACA,EAAEC,YAAY,EAAEC,cAAc,EAA0B;IAExD,MAAMC,qBAAqBR,kBAAkBO,gBAAgB;IAC7D,MAAME,mBAAmBT,kBAAkBM,cAAc;IACzD,IAAI,CAACD,KAAKK,MAAM,CAACF,uBAAuB,CAACH,KAAKK,MAAM,CAACD,mBAAmB;QACtE;IACF;IACA,MAAME,cAAcV,SAClBI,MACAG,oBACAI,IAAI;IACN,IAAI,CAACD,aAAa;QAChB;IACF;IACA,MAAM,EAAEE,eAAe,CAAC,CAAC,EAAEC,kBAAkB,CAAC,CAAC,EAAE,GAAGb,SAGjDI,MAAMI;IACT,mEAAmE;IACnE,IAAII,YAAY,CAACF,YAAY,IAAIG,eAAe,CAACH,YAAY,EAAE;QAC7D;IACF;IACAT,6BACEG,MACA;QAAE,CAACM,YAAY,EAAER,4BAA4BE;IAAM,GACnD,CAAC,GACDI;AAEJ,EAAE"}
package/src/utils/nx.d.ts CHANGED
@@ -115,6 +115,20 @@ export type TargetDependency = string | {
115
115
  * same order when first authoring a target keeps generators idempotent.
116
116
  */
117
117
  export declare const normalizeTargetKeyOrder: <T extends object>(target: T) => T;
118
+ /**
119
+ * Merge the configuration a generator owns into a project's existing target, so
120
+ * re-running converges that configuration without discarding what other
121
+ * generators (or the user) contributed to the same target.
122
+ *
123
+ * `dependsOn` is unioned: existing entries keep their order and the desired ones
124
+ * are appended only when absent, so a re-run neither drops an entry (e.g. the
125
+ * `bundle` a lambda function adds to `build`) nor duplicates one. Every other
126
+ * key the caller passes wins, since those are the ones the generator owns.
127
+ *
128
+ * The result carries Nx's own key order, so a target authored on the first run
129
+ * serializes identically to the same target merged into on a re-run.
130
+ */
131
+ export declare const mergeTarget: (existing: TargetConfiguration | undefined, desired: TargetConfiguration) => TargetConfiguration;
118
132
  /**
119
133
  * Mutate the project to add the dependency to the target if not already present
120
134
  * Adds the target if not present.
package/src/utils/nx.js CHANGED
@@ -209,6 +209,36 @@ const NX_TARGET_KEY_ORDER = [
209
209
  const bi = NX_TARGET_KEY_ORDER.indexOf(b);
210
210
  return (ai === -1 ? NX_TARGET_KEY_ORDER.length : ai) - (bi === -1 ? NX_TARGET_KEY_ORDER.length : bi);
211
211
  }));
212
+ /**
213
+ * Merge the configuration a generator owns into a project's existing target, so
214
+ * re-running converges that configuration without discarding what other
215
+ * generators (or the user) contributed to the same target.
216
+ *
217
+ * `dependsOn` is unioned: existing entries keep their order and the desired ones
218
+ * are appended only when absent, so a re-run neither drops an entry (e.g. the
219
+ * `bundle` a lambda function adds to `build`) nor duplicates one. Every other
220
+ * key the caller passes wins, since those are the ones the generator owns.
221
+ *
222
+ * The result carries Nx's own key order, so a target authored on the first run
223
+ * serializes identically to the same target merged into on a re-run.
224
+ */ export const mergeTarget = (existing, desired)=>{
225
+ const merged = {
226
+ ...existing,
227
+ ...desired
228
+ };
229
+ const dependsOn = [
230
+ ...existing?.dependsOn ?? []
231
+ ];
232
+ for (const dependency of desired.dependsOn ?? []){
233
+ if (!dependsOn.some((d)=>targetDependencyEquals(d, dependency))) {
234
+ dependsOn.push(dependency);
235
+ }
236
+ }
237
+ if (dependsOn.length > 0) {
238
+ merged.dependsOn = dependsOn;
239
+ }
240
+ return normalizeTargetKeyOrder(merged);
241
+ };
212
242
  /**
213
243
  * Mutate the project to add the dependency to the target if not already present
214
244
  * Adds the target if not present.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/nx-plugin/src/utils/nx.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n getProjects,\n type ProjectConfiguration,\n readJson,\n readProjectConfiguration,\n type TargetConfiguration,\n type TargetDefaultValue,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport * as path from 'path';\nimport PackageJson from '../../package.json' with { type: 'json' };\nimport { NX_PLUGIN_MCP_PACKAGE_NAME } from './mcp.js';\nimport { toSnakeCase } from './names.js';\nimport { getNpmScope, getNpmScopePrefix } from './npm-scope.js';\n\nexport type { GeneratorInfo, NxGeneratorInfo } from './generators.js';\nexport { buildGeneratorInfoList } from './generators.js';\n\nimport { buildGeneratorInfoList, type GeneratorInfo } from './generators.js';\n\nconst GENERATORS = buildGeneratorInfoList(\n path.resolve(import.meta.dirname, '..', '..'),\n);\n\n/**\n * List Nx Plugin for AWS generators\n * @param includeHidden include hidden generators (default false)\n */\nexport const listGenerators = (includeHidden = false) =>\n GENERATORS.filter((g) => includeHidden || !g.hidden);\n\n/**\n * Return generator information. Call this from a generator method with import.meta.filename\n */\nexport const getGeneratorInfo = (generatorFileName: string): GeneratorInfo => {\n const { dir, name } = path.parse(path.resolve(generatorFileName));\n const resolvedFactoryPath = path.join(dir, name);\n return GENERATORS.find(\n (generatorInfo) =>\n generatorInfo.resolvedFactoryPath === resolvedFactoryPath,\n );\n};\n\nexport const getPackageVersion = () => {\n return PackageJson.version;\n};\n\n/**\n * True inside the plugin's own monorepo, where the plugin is the source rather\n * than a dependency.\n */\nexport const isNxPluginForAwsWorkspace = (tree: Tree): boolean => {\n const rootPackageJson = tree.exists('package.json')\n ? readJson(tree, 'package.json')\n : undefined;\n return rootPackageJson?.name === '@aws/nx-plugin-source';\n};\n\n/**\n * The `@aws/nx-plugin` devDependency entry for a workspace the plugin generates\n * into, keyed to the version the running generators come from. Empty inside the\n * plugin's own monorepo.\n */\nexport const nxPluginSelfDependency = (tree: Tree): Record<string, string> =>\n isNxPluginForAwsWorkspace(tree)\n ? {}\n : { [PackageJson.name]: `^${PackageJson.version}` };\n\n/**\n * The `@aws/nx-plugin-mcp` devDependency entry, keyed to the running generators'\n * version — the two packages are released in lockstep. Declaring it pins the MCP\n * server the vended config runs in the workspace's lockfile, so upgrading it\n * upgrades the server. Empty inside the plugin's own monorepo.\n */\nexport const nxPluginMcpDependency = (tree: Tree): Record<string, string> =>\n isNxPluginForAwsWorkspace(tree)\n ? {}\n : { [NX_PLUGIN_MCP_PACKAGE_NAME]: `^${PackageJson.version}` };\n\n/**\n * Read a project configuration where the project name may not be fully qualified (ie may omit the scope prefix)\n */\nexport const readProjectConfigurationUnqualified = (\n tree: Tree,\n projectName: string,\n) => {\n try {\n return readProjectConfiguration(tree, projectName);\n } catch (e) {\n // Attempt to find the project without the scope\n const project = [...getProjects(tree).values()].find(\n (p) =>\n p.name &&\n (p.name === `${getNpmScopePrefix(tree)}${projectName}` || // TypeScript fully-qualified name\n p.name === `${toSnakeCase(getNpmScope(tree))}.${projectName}`), // Python fully-qualified name\n );\n if (project) {\n return project;\n }\n throw e;\n }\n};\n\n/**\n * Returns whether a project with the given name already exists in the workspace.\n * The project name may be unqualified (ie may omit the scope prefix).\n */\nexport const projectExists = (tree: Tree, projectName: string): boolean => {\n try {\n readProjectConfigurationUnqualified(tree, projectName);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Add metadata about the generator that generated the project to the project.json\n */\nexport const addGeneratorMetadata = (\n tree: Tree,\n projectName: string,\n info: { id: string },\n additionalMetadata?: { [key: string]: any },\n) => {\n const config = readProjectConfigurationUnqualified(tree, projectName);\n const metadata = {\n ...config?.metadata,\n generator: info.id,\n ...additionalMetadata,\n };\n // Skip the write when nothing changed so re-running doesn't reserialize\n // project.json. metadata is plain JSON built in a fixed key order, so a\n // stringify comparison is exact here.\n if (JSON.stringify(config?.metadata) === JSON.stringify(metadata)) {\n return;\n }\n // Place metadata immediately before targets so the serialized key order is\n // identical whether or not metadata already existed (matching the order Nx\n // normalizes a read config to), keeping the change a pure metadata insert.\n const { targets, ...rest } = config;\n updateProjectConfiguration(tree, config.name, {\n ...rest,\n metadata: metadata as any,\n ...(targets ? { targets } : {}),\n });\n};\n\n/**\n * Represents a component entry in project metadata\n */\nexport interface ComponentMetadata {\n readonly generator: string;\n readonly name?: string;\n /**\n * What this entry wires up. For a connection that is the target — the thing\n * being connected to — paired with `sourcePath` below.\n */\n readonly path?: string;\n /**\n * The component the connection is made *from*, when both ends are components\n * of a project rather than whole projects.\n *\n * A connection records the project it lives on and the target it reaches, which\n * alone can't tell which of several components on that project is wired up.\n * Recorded as a path for the same reason `path` is: it identifies a component\n * within its project without depending on a name that may repeat.\n */\n readonly sourcePath?: string;\n [key: string]: any;\n}\n\n/**\n * Add metadata about the generator that generated the component to the project.json\n *\n * A connection between two components passes the source's path as\n * `additionalMetadata.sourcePath`, so the pair is identifiable rather than just\n * the two projects.\n */\nexport const addComponentGeneratorMetadata = (\n tree: Tree,\n projectName: string,\n info: { id: string },\n componentPath: string,\n componentName?: string,\n additionalMetadata?: { [key: string]: any },\n) => {\n const config = readProjectConfigurationUnqualified(tree, projectName);\n\n const existingComponents = (config?.metadata as any)?.components ?? [];\n const alreadyAdded = existingComponents.filter(\n (c: any) => c.generator === info.id && c.name === componentName,\n );\n\n if (alreadyAdded.length === 0) {\n const componentMetadata: ComponentMetadata = {\n generator: info.id,\n path: componentPath,\n ...(componentName ? { name: componentName } : {}),\n ...additionalMetadata,\n };\n // Place metadata before targets for a stable serialized key order.\n const { targets, ...rest } = config;\n updateProjectConfiguration(tree, config.name, {\n ...rest,\n metadata: {\n ...config?.metadata,\n components: [...existingComponents, componentMetadata],\n } as any,\n ...(targets ? { targets } : {}),\n });\n }\n};\n\n/**\n * Merge a generator's own config into an `nx.json` `targetDefaults` value,\n * preserving whatever the workspace already had. `apply` receives the config to\n * layer onto and returns the merged config (e.g. `(base) => ({ cache: true,\n * ...base })`); it must be idempotent so re-running the generator is a no-op.\n *\n * Nx 23.1 widened each value to either a config object or an ordered array of\n * filtered entries. The plugin only contributes unfiltered (catch-all) config,\n * so the input's shape is preserved: an object (or unset) stays an object;\n * an array keeps the user's filtered entries and `apply` merges into its first\n * unfiltered entry, prepending one as the base if none exists (Nx layers later\n * matches on top, so our catch-all must stay first to not override a filter).\n */\nexport const mergeTargetDefault = (\n value: TargetDefaultValue | undefined,\n apply: (base: Partial<TargetConfiguration>) => Partial<TargetConfiguration>,\n): TargetDefaultValue => {\n if (!Array.isArray(value)) {\n return apply(value ?? {});\n }\n const catchAllIndex = value.findIndex((entry) => entry.filter === undefined);\n if (catchAllIndex === -1) {\n return [apply({}), ...value];\n }\n return value.map((entry, index) =>\n index === catchAllIndex ? apply(entry) : entry,\n );\n};\n\n/**\n * A single entry in an Nx `dependsOn` array.\n * Matches the shape accepted by Nx without requiring a devkit type import.\n */\nexport type TargetDependency =\n | string\n | {\n projects?: string | string[];\n target: string;\n params?: 'ignore' | 'forward';\n };\n\nconst targetDependencyEquals = (a: TargetDependency, b: TargetDependency) => {\n if (typeof a === 'string' || typeof b === 'string') {\n return a === b;\n }\n if (a.target !== b.target || a.params !== b.params) {\n return false;\n }\n const aProjects = Array.isArray(a.projects)\n ? a.projects\n : a.projects !== undefined\n ? [a.projects]\n : [];\n const bProjects = Array.isArray(b.projects)\n ? b.projects\n : b.projects !== undefined\n ? [b.projects]\n : [];\n if (aProjects.length !== bProjects.length) {\n return false;\n }\n return aProjects.every((p, i) => p === bProjects[i]);\n};\n\n// The order target properties are authored in. Nx preserves a target's\n// authored key order when it reads then rewrites an existing project.json,\n// except `options` and `configurations`, which it always moves to the end (in\n// that order). Keeping `options`/`configurations` last here therefore makes a\n// generator's first-run output byte-identical to subsequent runs (idempotency);\n// the remaining keys are ordered to read intuitively.\nconst NX_TARGET_KEY_ORDER = [\n 'executor',\n 'dependsOn',\n 'continuous',\n 'cache',\n 'inputs',\n 'outputs',\n 'metadata',\n 'defaultConfiguration',\n 'options',\n 'configurations',\n];\n\n/**\n * Reorder a target's keys to match Nx's own serialization order. Nx reorders\n * target properties when it rewrites an existing project.json, so applying the\n * same order when first authoring a target keeps generators idempotent.\n */\nexport const normalizeTargetKeyOrder = <T extends object>(target: T): T =>\n Object.fromEntries(\n Object.entries(target as Record<string, unknown>).sort(([a], [b]) => {\n const ai = NX_TARGET_KEY_ORDER.indexOf(a);\n const bi = NX_TARGET_KEY_ORDER.indexOf(b);\n return (\n (ai === -1 ? NX_TARGET_KEY_ORDER.length : ai) -\n (bi === -1 ? NX_TARGET_KEY_ORDER.length : bi)\n );\n }),\n ) as T;\n\n/**\n * Mutate the project to add the dependency to the target if not already present\n * Adds the target if not present.\n *\n * Accepts either a string target name (e.g. `'build'`) or a dependency config\n * object (e.g. `{ projects: ['foo'], target: 'dev' }`). Deduplicates\n * using deep equality so re-running a generator does not grow `dependsOn`.\n */\nexport const addDependencyToTargetIfNotPresent = (\n project: ProjectConfiguration,\n target: string,\n dependency: TargetDependency,\n) => {\n project.targets ??= {};\n project.targets[target] ??= {};\n project.targets[target].dependsOn ??= [];\n const dependsOn = project.targets[target].dependsOn;\n // Leave existing dependencies in place so re-running does not reorder them;\n // only append when the dependency is genuinely absent.\n if (!dependsOn.some((d) => targetDependencyEquals(d, dependency))) {\n dependsOn.push(dependency);\n }\n // Keep key order aligned with Nx's so first run matches subsequent runs.\n project.targets[target] = normalizeTargetKeyOrder(project.targets[target]);\n};\n\n/**\n * Register a dependency that produces a deployable artifact on both `build` and\n * `assemble`.\n *\n * `build` is the everything target: artifacts plus the quality gates (lint,\n * test, typecheck). `assemble` is its artifact-only sibling, which the deploy\n * targets depend on so a deploy builds what it deploys and nothing else.\n */\nexport const addArtifactDependencyToTargets = (\n project: ProjectConfiguration,\n dependency: TargetDependency,\n) => {\n addDependencyToTargetIfNotPresent(project, 'build', dependency);\n addDependencyToTargetIfNotPresent(project, 'assemble', dependency);\n};\n\n/**\n * Register another project whose artifacts this one consumes, on both `build`\n * and `assemble`.\n *\n * The shared infrastructure project reads the artifacts of every project it\n * deploys, and those cross-project edges are explicit because Nx's `^` operator\n * only follows package dependencies. `assemble` mirrors the list against the\n * consumed projects' own `assemble`, keeping the artifact-only chain closed.\n */\nexport const addArtifactProjectToTargets = (\n project: ProjectConfiguration,\n consumedProjectName: string,\n) => {\n addDependencyToTargetIfNotPresent(\n project,\n 'build',\n `${consumedProjectName}:build`,\n );\n addDependencyToTargetIfNotPresent(\n project,\n 'assemble',\n `${consumedProjectName}:assemble`,\n );\n};\n\n/**\n * Register a component's `<name>-dev` target under the project-level `dev`\n * target, so `nx run <project>:dev` starts every component in the project.\n *\n * Component generators author their own continuous `<name>-dev` runner and call\n * this to aggregate it. Every component added to the project accumulates its\n * `<name>-dev` under `dev`. Nx keys tasks by `project:target`, so any\n * dependencies shared between components run exactly once.\n */\nexport const addComponentDevTarget = (\n targets: Record<string, ProjectConfiguration['targets'][string]>,\n componentDevTargetName: string,\n) => {\n targets['dev'] ??= { continuous: true, dependsOn: [] };\n const projectDev = targets['dev'];\n projectDev.continuous = true;\n projectDev.dependsOn ??= [];\n // Append in component-creation order; dedupe keeps re-runs idempotent.\n if (!projectDev.dependsOn.includes(componentDevTargetName)) {\n projectDev.dependsOn.push(componentDevTargetName);\n }\n targets['dev'] = normalizeTargetKeyOrder(projectDev);\n};\n"],"names":["getProjects","readJson","readProjectConfiguration","updateProjectConfiguration","path","PackageJson","type","NX_PLUGIN_MCP_PACKAGE_NAME","toSnakeCase","getNpmScope","getNpmScopePrefix","buildGeneratorInfoList","GENERATORS","resolve","dirname","listGenerators","includeHidden","filter","g","hidden","getGeneratorInfo","generatorFileName","dir","name","parse","resolvedFactoryPath","join","find","generatorInfo","getPackageVersion","version","isNxPluginForAwsWorkspace","tree","rootPackageJson","exists","undefined","nxPluginSelfDependency","nxPluginMcpDependency","readProjectConfigurationUnqualified","projectName","e","project","values","p","projectExists","addGeneratorMetadata","info","additionalMetadata","config","metadata","generator","id","JSON","stringify","targets","rest","addComponentGeneratorMetadata","componentPath","componentName","existingComponents","components","alreadyAdded","c","length","componentMetadata","mergeTargetDefault","value","apply","Array","isArray","catchAllIndex","findIndex","entry","map","index","targetDependencyEquals","a","b","target","params","aProjects","projects","bProjects","every","i","NX_TARGET_KEY_ORDER","normalizeTargetKeyOrder","Object","fromEntries","entries","sort","ai","indexOf","bi","addDependencyToTargetIfNotPresent","dependency","dependsOn","some","d","push","addArtifactDependencyToTargets","addArtifactProjectToTargets","consumedProjectName","addComponentDevTarget","componentDevTargetName","continuous","projectDev","includes"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../packages/nx-plugin/src/utils/nx.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n getProjects,\n type ProjectConfiguration,\n readJson,\n readProjectConfiguration,\n type TargetConfiguration,\n type TargetDefaultValue,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport * as path from 'path';\nimport PackageJson from '../../package.json' with { type: 'json' };\nimport { NX_PLUGIN_MCP_PACKAGE_NAME } from './mcp.js';\nimport { toSnakeCase } from './names.js';\nimport { getNpmScope, getNpmScopePrefix } from './npm-scope.js';\n\nexport type { GeneratorInfo, NxGeneratorInfo } from './generators.js';\nexport { buildGeneratorInfoList } from './generators.js';\n\nimport { buildGeneratorInfoList, type GeneratorInfo } from './generators.js';\n\nconst GENERATORS = buildGeneratorInfoList(\n path.resolve(import.meta.dirname, '..', '..'),\n);\n\n/**\n * List Nx Plugin for AWS generators\n * @param includeHidden include hidden generators (default false)\n */\nexport const listGenerators = (includeHidden = false) =>\n GENERATORS.filter((g) => includeHidden || !g.hidden);\n\n/**\n * Return generator information. Call this from a generator method with import.meta.filename\n */\nexport const getGeneratorInfo = (generatorFileName: string): GeneratorInfo => {\n const { dir, name } = path.parse(path.resolve(generatorFileName));\n const resolvedFactoryPath = path.join(dir, name);\n return GENERATORS.find(\n (generatorInfo) =>\n generatorInfo.resolvedFactoryPath === resolvedFactoryPath,\n );\n};\n\nexport const getPackageVersion = () => {\n return PackageJson.version;\n};\n\n/**\n * True inside the plugin's own monorepo, where the plugin is the source rather\n * than a dependency.\n */\nexport const isNxPluginForAwsWorkspace = (tree: Tree): boolean => {\n const rootPackageJson = tree.exists('package.json')\n ? readJson(tree, 'package.json')\n : undefined;\n return rootPackageJson?.name === '@aws/nx-plugin-source';\n};\n\n/**\n * The `@aws/nx-plugin` devDependency entry for a workspace the plugin generates\n * into, keyed to the version the running generators come from. Empty inside the\n * plugin's own monorepo.\n */\nexport const nxPluginSelfDependency = (tree: Tree): Record<string, string> =>\n isNxPluginForAwsWorkspace(tree)\n ? {}\n : { [PackageJson.name]: `^${PackageJson.version}` };\n\n/**\n * The `@aws/nx-plugin-mcp` devDependency entry, keyed to the running generators'\n * version — the two packages are released in lockstep. Declaring it pins the MCP\n * server the vended config runs in the workspace's lockfile, so upgrading it\n * upgrades the server. Empty inside the plugin's own monorepo.\n */\nexport const nxPluginMcpDependency = (tree: Tree): Record<string, string> =>\n isNxPluginForAwsWorkspace(tree)\n ? {}\n : { [NX_PLUGIN_MCP_PACKAGE_NAME]: `^${PackageJson.version}` };\n\n/**\n * Read a project configuration where the project name may not be fully qualified (ie may omit the scope prefix)\n */\nexport const readProjectConfigurationUnqualified = (\n tree: Tree,\n projectName: string,\n) => {\n try {\n return readProjectConfiguration(tree, projectName);\n } catch (e) {\n // Attempt to find the project without the scope\n const project = [...getProjects(tree).values()].find(\n (p) =>\n p.name &&\n (p.name === `${getNpmScopePrefix(tree)}${projectName}` || // TypeScript fully-qualified name\n p.name === `${toSnakeCase(getNpmScope(tree))}.${projectName}`), // Python fully-qualified name\n );\n if (project) {\n return project;\n }\n throw e;\n }\n};\n\n/**\n * Returns whether a project with the given name already exists in the workspace.\n * The project name may be unqualified (ie may omit the scope prefix).\n */\nexport const projectExists = (tree: Tree, projectName: string): boolean => {\n try {\n readProjectConfigurationUnqualified(tree, projectName);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Add metadata about the generator that generated the project to the project.json\n */\nexport const addGeneratorMetadata = (\n tree: Tree,\n projectName: string,\n info: { id: string },\n additionalMetadata?: { [key: string]: any },\n) => {\n const config = readProjectConfigurationUnqualified(tree, projectName);\n const metadata = {\n ...config?.metadata,\n generator: info.id,\n ...additionalMetadata,\n };\n // Skip the write when nothing changed so re-running doesn't reserialize\n // project.json. metadata is plain JSON built in a fixed key order, so a\n // stringify comparison is exact here.\n if (JSON.stringify(config?.metadata) === JSON.stringify(metadata)) {\n return;\n }\n // Place metadata immediately before targets so the serialized key order is\n // identical whether or not metadata already existed (matching the order Nx\n // normalizes a read config to), keeping the change a pure metadata insert.\n const { targets, ...rest } = config;\n updateProjectConfiguration(tree, config.name, {\n ...rest,\n metadata: metadata as any,\n ...(targets ? { targets } : {}),\n });\n};\n\n/**\n * Represents a component entry in project metadata\n */\nexport interface ComponentMetadata {\n readonly generator: string;\n readonly name?: string;\n /**\n * What this entry wires up. For a connection that is the target — the thing\n * being connected to — paired with `sourcePath` below.\n */\n readonly path?: string;\n /**\n * The component the connection is made *from*, when both ends are components\n * of a project rather than whole projects.\n *\n * A connection records the project it lives on and the target it reaches, which\n * alone can't tell which of several components on that project is wired up.\n * Recorded as a path for the same reason `path` is: it identifies a component\n * within its project without depending on a name that may repeat.\n */\n readonly sourcePath?: string;\n [key: string]: any;\n}\n\n/**\n * Add metadata about the generator that generated the component to the project.json\n *\n * A connection between two components passes the source's path as\n * `additionalMetadata.sourcePath`, so the pair is identifiable rather than just\n * the two projects.\n */\nexport const addComponentGeneratorMetadata = (\n tree: Tree,\n projectName: string,\n info: { id: string },\n componentPath: string,\n componentName?: string,\n additionalMetadata?: { [key: string]: any },\n) => {\n const config = readProjectConfigurationUnqualified(tree, projectName);\n\n const existingComponents = (config?.metadata as any)?.components ?? [];\n const alreadyAdded = existingComponents.filter(\n (c: any) => c.generator === info.id && c.name === componentName,\n );\n\n if (alreadyAdded.length === 0) {\n const componentMetadata: ComponentMetadata = {\n generator: info.id,\n path: componentPath,\n ...(componentName ? { name: componentName } : {}),\n ...additionalMetadata,\n };\n // Place metadata before targets for a stable serialized key order.\n const { targets, ...rest } = config;\n updateProjectConfiguration(tree, config.name, {\n ...rest,\n metadata: {\n ...config?.metadata,\n components: [...existingComponents, componentMetadata],\n } as any,\n ...(targets ? { targets } : {}),\n });\n }\n};\n\n/**\n * Merge a generator's own config into an `nx.json` `targetDefaults` value,\n * preserving whatever the workspace already had. `apply` receives the config to\n * layer onto and returns the merged config (e.g. `(base) => ({ cache: true,\n * ...base })`); it must be idempotent so re-running the generator is a no-op.\n *\n * Nx 23.1 widened each value to either a config object or an ordered array of\n * filtered entries. The plugin only contributes unfiltered (catch-all) config,\n * so the input's shape is preserved: an object (or unset) stays an object;\n * an array keeps the user's filtered entries and `apply` merges into its first\n * unfiltered entry, prepending one as the base if none exists (Nx layers later\n * matches on top, so our catch-all must stay first to not override a filter).\n */\nexport const mergeTargetDefault = (\n value: TargetDefaultValue | undefined,\n apply: (base: Partial<TargetConfiguration>) => Partial<TargetConfiguration>,\n): TargetDefaultValue => {\n if (!Array.isArray(value)) {\n return apply(value ?? {});\n }\n const catchAllIndex = value.findIndex((entry) => entry.filter === undefined);\n if (catchAllIndex === -1) {\n return [apply({}), ...value];\n }\n return value.map((entry, index) =>\n index === catchAllIndex ? apply(entry) : entry,\n );\n};\n\n/**\n * A single entry in an Nx `dependsOn` array.\n * Matches the shape accepted by Nx without requiring a devkit type import.\n */\nexport type TargetDependency =\n | string\n | {\n projects?: string | string[];\n target: string;\n params?: 'ignore' | 'forward';\n };\n\nconst targetDependencyEquals = (a: TargetDependency, b: TargetDependency) => {\n if (typeof a === 'string' || typeof b === 'string') {\n return a === b;\n }\n if (a.target !== b.target || a.params !== b.params) {\n return false;\n }\n const aProjects = Array.isArray(a.projects)\n ? a.projects\n : a.projects !== undefined\n ? [a.projects]\n : [];\n const bProjects = Array.isArray(b.projects)\n ? b.projects\n : b.projects !== undefined\n ? [b.projects]\n : [];\n if (aProjects.length !== bProjects.length) {\n return false;\n }\n return aProjects.every((p, i) => p === bProjects[i]);\n};\n\n// The order target properties are authored in. Nx preserves a target's\n// authored key order when it reads then rewrites an existing project.json,\n// except `options` and `configurations`, which it always moves to the end (in\n// that order). Keeping `options`/`configurations` last here therefore makes a\n// generator's first-run output byte-identical to subsequent runs (idempotency);\n// the remaining keys are ordered to read intuitively.\nconst NX_TARGET_KEY_ORDER = [\n 'executor',\n 'dependsOn',\n 'continuous',\n 'cache',\n 'inputs',\n 'outputs',\n 'metadata',\n 'defaultConfiguration',\n 'options',\n 'configurations',\n];\n\n/**\n * Reorder a target's keys to match Nx's own serialization order. Nx reorders\n * target properties when it rewrites an existing project.json, so applying the\n * same order when first authoring a target keeps generators idempotent.\n */\nexport const normalizeTargetKeyOrder = <T extends object>(target: T): T =>\n Object.fromEntries(\n Object.entries(target as Record<string, unknown>).sort(([a], [b]) => {\n const ai = NX_TARGET_KEY_ORDER.indexOf(a);\n const bi = NX_TARGET_KEY_ORDER.indexOf(b);\n return (\n (ai === -1 ? NX_TARGET_KEY_ORDER.length : ai) -\n (bi === -1 ? NX_TARGET_KEY_ORDER.length : bi)\n );\n }),\n ) as T;\n\n/**\n * Merge the configuration a generator owns into a project's existing target, so\n * re-running converges that configuration without discarding what other\n * generators (or the user) contributed to the same target.\n *\n * `dependsOn` is unioned: existing entries keep their order and the desired ones\n * are appended only when absent, so a re-run neither drops an entry (e.g. the\n * `bundle` a lambda function adds to `build`) nor duplicates one. Every other\n * key the caller passes wins, since those are the ones the generator owns.\n *\n * The result carries Nx's own key order, so a target authored on the first run\n * serializes identically to the same target merged into on a re-run.\n */\nexport const mergeTarget = (\n existing: TargetConfiguration | undefined,\n desired: TargetConfiguration,\n): TargetConfiguration => {\n const merged: TargetConfiguration = { ...existing, ...desired };\n const dependsOn = [...(existing?.dependsOn ?? [])];\n for (const dependency of desired.dependsOn ?? []) {\n if (!dependsOn.some((d) => targetDependencyEquals(d, dependency))) {\n dependsOn.push(dependency);\n }\n }\n if (dependsOn.length > 0) {\n merged.dependsOn = dependsOn;\n }\n return normalizeTargetKeyOrder(merged);\n};\n\n/**\n * Mutate the project to add the dependency to the target if not already present\n * Adds the target if not present.\n *\n * Accepts either a string target name (e.g. `'build'`) or a dependency config\n * object (e.g. `{ projects: ['foo'], target: 'dev' }`). Deduplicates\n * using deep equality so re-running a generator does not grow `dependsOn`.\n */\nexport const addDependencyToTargetIfNotPresent = (\n project: ProjectConfiguration,\n target: string,\n dependency: TargetDependency,\n) => {\n project.targets ??= {};\n project.targets[target] ??= {};\n project.targets[target].dependsOn ??= [];\n const dependsOn = project.targets[target].dependsOn;\n // Leave existing dependencies in place so re-running does not reorder them;\n // only append when the dependency is genuinely absent.\n if (!dependsOn.some((d) => targetDependencyEquals(d, dependency))) {\n dependsOn.push(dependency);\n }\n // Keep key order aligned with Nx's so first run matches subsequent runs.\n project.targets[target] = normalizeTargetKeyOrder(project.targets[target]);\n};\n\n/**\n * Register a dependency that produces a deployable artifact on both `build` and\n * `assemble`.\n *\n * `build` is the everything target: artifacts plus the quality gates (lint,\n * test, typecheck). `assemble` is its artifact-only sibling, which the deploy\n * targets depend on so a deploy builds what it deploys and nothing else.\n */\nexport const addArtifactDependencyToTargets = (\n project: ProjectConfiguration,\n dependency: TargetDependency,\n) => {\n addDependencyToTargetIfNotPresent(project, 'build', dependency);\n addDependencyToTargetIfNotPresent(project, 'assemble', dependency);\n};\n\n/**\n * Register another project whose artifacts this one consumes, on both `build`\n * and `assemble`.\n *\n * The shared infrastructure project reads the artifacts of every project it\n * deploys, and those cross-project edges are explicit because Nx's `^` operator\n * only follows package dependencies. `assemble` mirrors the list against the\n * consumed projects' own `assemble`, keeping the artifact-only chain closed.\n */\nexport const addArtifactProjectToTargets = (\n project: ProjectConfiguration,\n consumedProjectName: string,\n) => {\n addDependencyToTargetIfNotPresent(\n project,\n 'build',\n `${consumedProjectName}:build`,\n );\n addDependencyToTargetIfNotPresent(\n project,\n 'assemble',\n `${consumedProjectName}:assemble`,\n );\n};\n\n/**\n * Register a component's `<name>-dev` target under the project-level `dev`\n * target, so `nx run <project>:dev` starts every component in the project.\n *\n * Component generators author their own continuous `<name>-dev` runner and call\n * this to aggregate it. Every component added to the project accumulates its\n * `<name>-dev` under `dev`. Nx keys tasks by `project:target`, so any\n * dependencies shared between components run exactly once.\n */\nexport const addComponentDevTarget = (\n targets: Record<string, ProjectConfiguration['targets'][string]>,\n componentDevTargetName: string,\n) => {\n targets['dev'] ??= { continuous: true, dependsOn: [] };\n const projectDev = targets['dev'];\n projectDev.continuous = true;\n projectDev.dependsOn ??= [];\n // Append in component-creation order; dedupe keeps re-runs idempotent.\n if (!projectDev.dependsOn.includes(componentDevTargetName)) {\n projectDev.dependsOn.push(componentDevTargetName);\n }\n targets['dev'] = normalizeTargetKeyOrder(projectDev);\n};\n"],"names":["getProjects","readJson","readProjectConfiguration","updateProjectConfiguration","path","PackageJson","type","NX_PLUGIN_MCP_PACKAGE_NAME","toSnakeCase","getNpmScope","getNpmScopePrefix","buildGeneratorInfoList","GENERATORS","resolve","dirname","listGenerators","includeHidden","filter","g","hidden","getGeneratorInfo","generatorFileName","dir","name","parse","resolvedFactoryPath","join","find","generatorInfo","getPackageVersion","version","isNxPluginForAwsWorkspace","tree","rootPackageJson","exists","undefined","nxPluginSelfDependency","nxPluginMcpDependency","readProjectConfigurationUnqualified","projectName","e","project","values","p","projectExists","addGeneratorMetadata","info","additionalMetadata","config","metadata","generator","id","JSON","stringify","targets","rest","addComponentGeneratorMetadata","componentPath","componentName","existingComponents","components","alreadyAdded","c","length","componentMetadata","mergeTargetDefault","value","apply","Array","isArray","catchAllIndex","findIndex","entry","map","index","targetDependencyEquals","a","b","target","params","aProjects","projects","bProjects","every","i","NX_TARGET_KEY_ORDER","normalizeTargetKeyOrder","Object","fromEntries","entries","sort","ai","indexOf","bi","mergeTarget","existing","desired","merged","dependsOn","dependency","some","d","push","addDependencyToTargetIfNotPresent","addArtifactDependencyToTargets","addArtifactProjectToTargets","consumedProjectName","addComponentDevTarget","componentDevTargetName","continuous","projectDev","includes"],"mappings":"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"}
@@ -15,10 +15,15 @@ import {
15
15
  Runtime,
16
16
  <%_ } _%>
17
17
  } from 'aws-cdk-lib/aws-lambda';
18
+ <%_ /* Alias the core imports only when this database's name would shadow them. */ _%>
19
+ <%_ const collides = ['AuroraDatabase', 'AuroraDatabaseEngines', 'AuroraDatabaseProps'].includes(nameClassName); _%>
20
+ <%_ const coreDb = collides ? 'CoreAuroraDatabase' : 'AuroraDatabase'; _%>
21
+ <%_ const coreDbEngines = collides ? 'CoreAuroraDatabaseEngines' : 'AuroraDatabaseEngines'; _%>
22
+ <%_ const coreDbProps = collides ? 'CoreAuroraDatabaseProps' : 'AuroraDatabaseProps'; _%>
18
23
  import {
19
- AuroraDatabase,
20
- AuroraDatabaseEngines,
21
- AuroraDatabaseProps,
24
+ AuroraDatabase<% if (collides) { %> as <%= coreDb %><% } %>,
25
+ AuroraDatabaseEngines<% if (collides) { %> as <%= coreDbEngines %><% } %>,
26
+ AuroraDatabaseProps<% if (collides) { %> as <%= coreDbProps %><% } %>,
22
27
  } from '../../core/rdb/aurora<% if (esm) { %>.js<% } %>';
23
28
  import { findWorkspaceRoot } from '../../core/workspace<% if (esm) { %>.js<% } %>';
24
29
 
@@ -43,21 +48,21 @@ const createDbUserBundleDir = path.join(
43
48
  );
44
49
 
45
50
  export type <%= nameClassName %>Props = Omit<
46
- AuroraDatabaseProps,
51
+ <%= coreDbProps %>,
47
52
  'databaseName' | 'adminUser' | 'runtimeConfigKey' | 'engine'
48
53
  >;
49
54
 
50
55
  /**
51
56
  * CDK construct that provisions an Aurora Serverless v2 cluster.
52
57
  */
53
- export class <%= nameClassName %> extends AuroraDatabase {
58
+ export class <%= nameClassName %> extends <%= coreDb %> {
54
59
  constructor(scope: Construct, id: string, props: <%= nameClassName %>Props) {
55
60
  super(scope, id, {
56
61
  ...props,
57
62
  databaseName: '<%= databaseName %>',
58
63
  adminUser: '<%= adminUser %>',
59
64
  runtimeConfigKey,
60
- engine: AuroraDatabaseEngines.<%= engine %>({}),
65
+ engine: <%= coreDbEngines %>.<%= engine %>({}),
61
66
  });
62
67
  }
63
68
 
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { type ProjectConfiguration, type Tree } from '@nx/devkit';
6
+ export interface AddScriptProjectTargetsOptions {
7
+ /** Project configuration to add the targets to (mutated in place). */
8
+ readonly project: ProjectConfiguration;
9
+ /** Additional `tsconfig.json` `types` entries beyond `node`. */
10
+ readonly types?: readonly string[];
11
+ }
12
+ /**
13
+ * Give a script-only TypeScript project the same targets a `ts#project` gets,
14
+ * so its vended TypeScript is covered by `nx run-many --target build --all`.
15
+ *
16
+ * Writes a `noEmit` `tsconfig.json` (kept if the user already has one) and adds
17
+ * `typecheck` alongside the shared Biome `lint`/`format` targets and a `build`
18
+ * that runs them. `compile` is deliberately absent: these projects run through
19
+ * `tsx`, so there is no build artifact to produce.
20
+ *
21
+ * The tsconfig is not registered as a workspace project reference — a `noEmit`
22
+ * project produces no declarations for another project to consume, and Nx's
23
+ * `@nx/js/typescript` plugin disables an inferred `typecheck` for any project
24
+ * reachable from one.
25
+ */
26
+ export declare const addScriptProjectTargets: (tree: Tree, options: AddScriptProjectTargetsOptions) => void;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */ import { joinPathFragments, writeJson } from "@nx/devkit";
5
+ import { biomeTargets, registerBiomeNamedInput } from "../ts/lib/biome.js";
6
+ import { normalizeTargetKeyOrder } from "./nx.js";
7
+ import { sortObjectKeys } from "./object.js";
8
+ import { getRelativePathToRootByDirectory } from "./paths.js";
9
+ /**
10
+ * Config a script-only project is type-checked against. It runs through `tsx`
11
+ * and emits nothing, so it opts out of the emit options the workspace's
12
+ * `tsconfig.base.json` sets for project references.
13
+ */ const SCRIPT_TSCONFIG_FILE_NAME = 'tsconfig.json';
14
+ /**
15
+ * Give a script-only TypeScript project the same targets a `ts#project` gets,
16
+ * so its vended TypeScript is covered by `nx run-many --target build --all`.
17
+ *
18
+ * Writes a `noEmit` `tsconfig.json` (kept if the user already has one) and adds
19
+ * `typecheck` alongside the shared Biome `lint`/`format` targets and a `build`
20
+ * that runs them. `compile` is deliberately absent: these projects run through
21
+ * `tsx`, so there is no build artifact to produce.
22
+ *
23
+ * The tsconfig is not registered as a workspace project reference — a `noEmit`
24
+ * project produces no declarations for another project to consume, and Nx's
25
+ * `@nx/js/typescript` plugin disables an inferred `typecheck` for any project
26
+ * reachable from one.
27
+ */ export const addScriptProjectTargets = (tree, options)=>{
28
+ const { project, types = [] } = options;
29
+ const tsConfigPath = joinPathFragments(project.root, SCRIPT_TSCONFIG_FILE_NAME);
30
+ if (!tree.exists(tsConfigPath)) {
31
+ writeJson(tree, tsConfigPath, {
32
+ extends: joinPathFragments(getRelativePathToRootByDirectory(project.root), 'tsconfig.base.json'),
33
+ compilerOptions: {
34
+ composite: false,
35
+ declarationMap: false,
36
+ emitDeclarationOnly: false,
37
+ noEmit: true,
38
+ types: [
39
+ 'node',
40
+ ...types
41
+ ]
42
+ },
43
+ include: [
44
+ '**/*.ts'
45
+ ]
46
+ });
47
+ }
48
+ project.targets ??= {};
49
+ project.targets = sortObjectKeys({
50
+ ...project.targets,
51
+ ...biomeTargets(tree),
52
+ typecheck: normalizeTargetKeyOrder({
53
+ executor: 'nx:run-commands',
54
+ cache: true,
55
+ inputs: [
56
+ 'default',
57
+ '^default'
58
+ ],
59
+ options: {
60
+ command: `tsc --noEmit -p ${SCRIPT_TSCONFIG_FILE_NAME}`,
61
+ cwd: '{projectRoot}'
62
+ }
63
+ }),
64
+ build: normalizeTargetKeyOrder({
65
+ ...project.targets.build,
66
+ dependsOn: [
67
+ 'lint',
68
+ 'typecheck'
69
+ ]
70
+ })
71
+ });
72
+ registerBiomeNamedInput(tree);
73
+ };
74
+
75
+ //# sourceMappingURL=script-project-targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../packages/nx-plugin/src/utils/script-project-targets.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 writeJson,\n} from '@nx/devkit';\nimport { biomeTargets, registerBiomeNamedInput } from '../ts/lib/biome.js';\nimport { normalizeTargetKeyOrder } from './nx.js';\nimport { sortObjectKeys } from './object.js';\nimport { getRelativePathToRootByDirectory } from './paths.js';\n\n/**\n * Config a script-only project is type-checked against. It runs through `tsx`\n * and emits nothing, so it opts out of the emit options the workspace's\n * `tsconfig.base.json` sets for project references.\n */\nconst SCRIPT_TSCONFIG_FILE_NAME = 'tsconfig.json';\n\nexport interface AddScriptProjectTargetsOptions {\n /** Project configuration to add the targets to (mutated in place). */\n readonly project: ProjectConfiguration;\n /** Additional `tsconfig.json` `types` entries beyond `node`. */\n readonly types?: readonly string[];\n}\n\n/**\n * Give a script-only TypeScript project the same targets a `ts#project` gets,\n * so its vended TypeScript is covered by `nx run-many --target build --all`.\n *\n * Writes a `noEmit` `tsconfig.json` (kept if the user already has one) and adds\n * `typecheck` alongside the shared Biome `lint`/`format` targets and a `build`\n * that runs them. `compile` is deliberately absent: these projects run through\n * `tsx`, so there is no build artifact to produce.\n *\n * The tsconfig is not registered as a workspace project reference — a `noEmit`\n * project produces no declarations for another project to consume, and Nx's\n * `@nx/js/typescript` plugin disables an inferred `typecheck` for any project\n * reachable from one.\n */\nexport const addScriptProjectTargets = (\n tree: Tree,\n options: AddScriptProjectTargetsOptions,\n): void => {\n const { project, types = [] } = options;\n const tsConfigPath = joinPathFragments(\n project.root,\n SCRIPT_TSCONFIG_FILE_NAME,\n );\n\n if (!tree.exists(tsConfigPath)) {\n writeJson(tree, tsConfigPath, {\n extends: joinPathFragments(\n getRelativePathToRootByDirectory(project.root),\n 'tsconfig.base.json',\n ),\n compilerOptions: {\n composite: false,\n declarationMap: false,\n emitDeclarationOnly: false,\n noEmit: true,\n types: ['node', ...types],\n },\n include: ['**/*.ts'],\n });\n }\n\n project.targets ??= {};\n project.targets = sortObjectKeys({\n ...project.targets,\n ...biomeTargets(tree),\n typecheck: normalizeTargetKeyOrder({\n executor: 'nx:run-commands',\n cache: true,\n inputs: ['default', '^default'],\n options: {\n command: `tsc --noEmit -p ${SCRIPT_TSCONFIG_FILE_NAME}`,\n cwd: '{projectRoot}',\n },\n }),\n build: normalizeTargetKeyOrder({\n ...project.targets.build,\n dependsOn: ['lint', 'typecheck'],\n }),\n });\n\n registerBiomeNamedInput(tree);\n};\n"],"names":["joinPathFragments","writeJson","biomeTargets","registerBiomeNamedInput","normalizeTargetKeyOrder","sortObjectKeys","getRelativePathToRootByDirectory","SCRIPT_TSCONFIG_FILE_NAME","addScriptProjectTargets","tree","options","project","types","tsConfigPath","root","exists","extends","compilerOptions","composite","declarationMap","emitDeclarationOnly","noEmit","include","targets","typecheck","executor","cache","inputs","command","cwd","build","dependsOn"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,EAGjBC,SAAS,QACJ,aAAa;AACpB,SAASC,YAAY,EAAEC,uBAAuB,QAAQ,qBAAqB;AAC3E,SAASC,uBAAuB,QAAQ,UAAU;AAClD,SAASC,cAAc,QAAQ,cAAc;AAC7C,SAASC,gCAAgC,QAAQ,aAAa;AAE9D;;;;CAIC,GACD,MAAMC,4BAA4B;AASlC;;;;;;;;;;;;;CAaC,GACD,OAAO,MAAMC,0BAA0B,CACrCC,MACAC;IAEA,MAAM,EAAEC,OAAO,EAAEC,QAAQ,EAAE,EAAE,GAAGF;IAChC,MAAMG,eAAeb,kBACnBW,QAAQG,IAAI,EACZP;IAGF,IAAI,CAACE,KAAKM,MAAM,CAACF,eAAe;QAC9BZ,UAAUQ,MAAMI,cAAc;YAC5BG,SAAShB,kBACPM,iCAAiCK,QAAQG,IAAI,GAC7C;YAEFG,iBAAiB;gBACfC,WAAW;gBACXC,gBAAgB;gBAChBC,qBAAqB;gBACrBC,QAAQ;gBACRT,OAAO;oBAAC;uBAAWA;iBAAM;YAC3B;YACAU,SAAS;gBAAC;aAAU;QACtB;IACF;IAEAX,QAAQY,OAAO,KAAK,CAAC;IACrBZ,QAAQY,OAAO,GAAGlB,eAAe;QAC/B,GAAGM,QAAQY,OAAO;QAClB,GAAGrB,aAAaO,KAAK;QACrBe,WAAWpB,wBAAwB;YACjCqB,UAAU;YACVC,OAAO;YACPC,QAAQ;gBAAC;gBAAW;aAAW;YAC/BjB,SAAS;gBACPkB,SAAS,CAAC,gBAAgB,EAAErB,2BAA2B;gBACvDsB,KAAK;YACP;QACF;QACAC,OAAO1B,wBAAwB;YAC7B,GAAGO,QAAQY,OAAO,CAACO,KAAK;YACxBC,WAAW;gBAAC;gBAAQ;aAAY;QAClC;IACF;IAEA5B,wBAAwBM;AAC1B,EAAE"}
@@ -12,9 +12,7 @@ export declare const SHADCN_DEPENDENCIES: readonly [{
12
12
  }, {
13
13
  readonly name: "class-variance-authority";
14
14
  }, {
15
- readonly name: "clsx";
16
- }, {
17
- readonly name: "tailwind-merge";
15
+ readonly name: "cn";
18
16
  }, {
19
17
  readonly name: "lucide-react";
20
18
  }, {
@@ -23,10 +23,7 @@ import { withVersions } from "./versions.js";
23
23
  name: 'class-variance-authority'
24
24
  },
25
25
  {
26
- name: 'clsx'
27
- },
28
- {
29
- name: 'tailwind-merge'
26
+ name: 'cn'
30
27
  },
31
28
  {
32
29
  name: 'lucide-react'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/nx-plugin/src/utils/shared-shadcn.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport tsProjectGenerator from '../ts/lib/generator.js';\nimport {\n configureTsProject,\n TS_PROJECT_DEPENDENCIES,\n} from '../ts/lib/ts-project-utils.js';\nimport { VITEST_DEPENDENCIES } from '../ts/lib/vitest.js';\nimport {\n type DependencyDeclaration,\n declaredNames,\n forDependencies,\n type MustDeclare,\n} from './declared-dependencies.js';\nimport {\n addDependenciesToPackageJson,\n getLocalDependencySpecifier,\n} from './dependencies.js';\nimport { formatFilesInSubtree } from './format.js';\nimport { esmVars } from './module-format.js';\nimport { getNpmScopePrefix } from './npm-scope.js';\nimport {\n PACKAGES_DIR,\n SHARED_SHADCN_DIR,\n SHARED_SHADCN_NAME,\n} from './shared-constructs-constants.js';\nimport { type ITsDepVersion, withVersions } from './versions.js';\n\n/** Dependencies a caller must declare to use the shared shadcn project. */\nexport const SHADCN_DEPENDENCIES = [\n { name: 'react' },\n { name: 'react-dom' },\n { name: 'class-variance-authority' },\n { name: 'clsx' },\n { name: 'tailwind-merge' },\n { name: 'lucide-react' },\n { name: 'tw-animate-css' },\n { name: 'radix-ui' },\n ...VITEST_DEPENDENCIES,\n ...TS_PROJECT_DEPENDENCIES,\n] as const satisfies readonly { name: ITsDepVersion; dev?: boolean }[];\n\n/** The shared shadcn package's fully-qualified npm name for this workspace. */\nexport const getSharedShadcnFullyQualifiedName = (tree: Tree): string =>\n `${getNpmScopePrefix(tree)}${SHARED_SHADCN_NAME}`;\n\n/**\n * Declares a `workspace:*` dependency on the shared shadcn package in a\n * consumer's own package.json, so it resolves through the shared package's\n * `exports` map (real package resolution) rather than a tsconfig `paths`\n * alias - see `sharedShadcnGenerator` for why.\n */\nexport const addSharedShadcnDependency = (\n tree: Tree,\n consumerDir: string,\n): void => {\n addDependenciesToPackageJson(\n tree,\n {\n [getSharedShadcnFullyQualifiedName(tree)]:\n getLocalDependencySpecifier(tree),\n },\n {},\n joinPathFragments(consumerDir, 'package.json'),\n );\n};\n\nexport async function sharedShadcnGenerator<\n const D extends DependencyDeclaration,\n>(tree: Tree, declaration: D & MustDeclare<typeof SHADCN_DEPENDENCIES, D>) {\n const fullyQualifiedName = getSharedShadcnFullyQualifiedName(tree);\n const libraryRoot = joinPathFragments(PACKAGES_DIR, SHARED_SHADCN_DIR);\n const shadcnSrcRoot = joinPathFragments(libraryRoot, 'src');\n\n if (!tree.exists(joinPathFragments(libraryRoot, 'project.json'))) {\n await tsProjectGenerator(tree, {\n name: SHARED_SHADCN_NAME,\n directory: PACKAGES_DIR,\n subDirectory: SHARED_SHADCN_DIR,\n });\n\n tree.delete(shadcnSrcRoot);\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', SHARED_SHADCN_DIR, 'src'),\n shadcnSrcRoot,\n esmVars(tree),\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n SHARED_SHADCN_DIR,\n 'readme',\n ),\n libraryRoot,\n {\n fullyQualifiedName,\n },\n {\n overwriteStrategy: OverwriteStrategy.Overwrite,\n },\n );\n\n await configureTsProject(\n tree,\n {\n dir: libraryRoot,\n fullyQualifiedName,\n },\n forDependencies<typeof SHADCN_DEPENDENCIES>(declaration),\n );\n\n updateJson(\n tree,\n joinPathFragments(libraryRoot, 'tsconfig.lib.json'),\n (json) => ({\n ...json,\n compilerOptions: {\n ...json.compilerOptions,\n jsx: 'react-jsx',\n module: 'preserve',\n moduleResolution: 'bundler',\n lib: Array.from(\n new Set([...(json.compilerOptions?.lib ?? []), 'DOM']),\n ),\n },\n include: Array.from(new Set([...(json.include ?? []), 'src/**/*.tsx'])),\n }),\n );\n\n addDependenciesToPackageJson(\n tree,\n withVersions(\n forDependencies<typeof SHADCN_DEPENDENCIES>(declaration),\n declaredNames(SHADCN_DEPENDENCIES),\n ),\n {},\n joinPathFragments(libraryRoot, 'package.json'),\n );\n\n // shadcn 4.x's CLI resolves the `components.json` alias via `imports`/\n // `exports` (Node's package resolution), not a tsconfig `paths` alias.\n // `imports` covers this package's own internal component-to-component\n // references (aliased in components.json below); `exports` covers every\n // other consumer.\n updateJson(\n tree,\n joinPathFragments(libraryRoot, 'package.json'),\n (packageJson) => ({\n ...packageJson,\n imports: {\n '#components/*': './src/components/*.tsx',\n '#lib/*': './src/lib/*.ts',\n '#hooks/*': './src/hooks/*.ts',\n },\n exports: {\n '.': './src/index.ts',\n './styles/*': './src/styles/*',\n './components/*': './src/components/*.tsx',\n './lib/*': './src/lib/*.ts',\n './hooks/*': './src/hooks/*.ts',\n },\n }),\n );\n }\n\n // components.json lives in the package so `shadcn add` runs there and\n // installs component dependencies into the package's own manifest.\n if (!tree.exists(joinPathFragments(libraryRoot, 'components.json'))) {\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'shadcn'),\n libraryRoot,\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n\n await formatFilesInSubtree(tree);\n}\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","tsProjectGenerator","configureTsProject","TS_PROJECT_DEPENDENCIES","VITEST_DEPENDENCIES","declaredNames","forDependencies","addDependenciesToPackageJson","getLocalDependencySpecifier","formatFilesInSubtree","esmVars","getNpmScopePrefix","PACKAGES_DIR","SHARED_SHADCN_DIR","SHARED_SHADCN_NAME","withVersions","SHADCN_DEPENDENCIES","name","getSharedShadcnFullyQualifiedName","tree","addSharedShadcnDependency","consumerDir","sharedShadcnGenerator","declaration","fullyQualifiedName","libraryRoot","shadcnSrcRoot","exists","directory","subDirectory","delete","dirname","overwriteStrategy","KeepExisting","Overwrite","dir","json","compilerOptions","jsx","module","moduleResolution","lib","Array","from","Set","include","packageJson","imports","exports"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../packages/nx-plugin/src/utils/shared-shadcn.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport tsProjectGenerator from '../ts/lib/generator.js';\nimport {\n configureTsProject,\n TS_PROJECT_DEPENDENCIES,\n} from '../ts/lib/ts-project-utils.js';\nimport { VITEST_DEPENDENCIES } from '../ts/lib/vitest.js';\nimport {\n type DependencyDeclaration,\n declaredNames,\n forDependencies,\n type MustDeclare,\n} from './declared-dependencies.js';\nimport {\n addDependenciesToPackageJson,\n getLocalDependencySpecifier,\n} from './dependencies.js';\nimport { formatFilesInSubtree } from './format.js';\nimport { esmVars } from './module-format.js';\nimport { getNpmScopePrefix } from './npm-scope.js';\nimport {\n PACKAGES_DIR,\n SHARED_SHADCN_DIR,\n SHARED_SHADCN_NAME,\n} from './shared-constructs-constants.js';\nimport { type ITsDepVersion, withVersions } from './versions.js';\n\n/** Dependencies a caller must declare to use the shared shadcn project. */\nexport const SHADCN_DEPENDENCIES = [\n { name: 'react' },\n { name: 'react-dom' },\n { name: 'class-variance-authority' },\n { name: 'cn' },\n { name: 'lucide-react' },\n { name: 'tw-animate-css' },\n { name: 'radix-ui' },\n ...VITEST_DEPENDENCIES,\n ...TS_PROJECT_DEPENDENCIES,\n] as const satisfies readonly { name: ITsDepVersion; dev?: boolean }[];\n\n/** The shared shadcn package's fully-qualified npm name for this workspace. */\nexport const getSharedShadcnFullyQualifiedName = (tree: Tree): string =>\n `${getNpmScopePrefix(tree)}${SHARED_SHADCN_NAME}`;\n\n/**\n * Declares a `workspace:*` dependency on the shared shadcn package in a\n * consumer's own package.json, so it resolves through the shared package's\n * `exports` map (real package resolution) rather than a tsconfig `paths`\n * alias - see `sharedShadcnGenerator` for why.\n */\nexport const addSharedShadcnDependency = (\n tree: Tree,\n consumerDir: string,\n): void => {\n addDependenciesToPackageJson(\n tree,\n {\n [getSharedShadcnFullyQualifiedName(tree)]:\n getLocalDependencySpecifier(tree),\n },\n {},\n joinPathFragments(consumerDir, 'package.json'),\n );\n};\n\nexport async function sharedShadcnGenerator<\n const D extends DependencyDeclaration,\n>(tree: Tree, declaration: D & MustDeclare<typeof SHADCN_DEPENDENCIES, D>) {\n const fullyQualifiedName = getSharedShadcnFullyQualifiedName(tree);\n const libraryRoot = joinPathFragments(PACKAGES_DIR, SHARED_SHADCN_DIR);\n const shadcnSrcRoot = joinPathFragments(libraryRoot, 'src');\n\n if (!tree.exists(joinPathFragments(libraryRoot, 'project.json'))) {\n await tsProjectGenerator(tree, {\n name: SHARED_SHADCN_NAME,\n directory: PACKAGES_DIR,\n subDirectory: SHARED_SHADCN_DIR,\n });\n\n tree.delete(shadcnSrcRoot);\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', SHARED_SHADCN_DIR, 'src'),\n shadcnSrcRoot,\n esmVars(tree),\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n SHARED_SHADCN_DIR,\n 'readme',\n ),\n libraryRoot,\n {\n fullyQualifiedName,\n },\n {\n overwriteStrategy: OverwriteStrategy.Overwrite,\n },\n );\n\n await configureTsProject(\n tree,\n {\n dir: libraryRoot,\n fullyQualifiedName,\n },\n forDependencies<typeof SHADCN_DEPENDENCIES>(declaration),\n );\n\n updateJson(\n tree,\n joinPathFragments(libraryRoot, 'tsconfig.lib.json'),\n (json) => ({\n ...json,\n compilerOptions: {\n ...json.compilerOptions,\n jsx: 'react-jsx',\n module: 'preserve',\n moduleResolution: 'bundler',\n lib: Array.from(\n new Set([...(json.compilerOptions?.lib ?? []), 'DOM']),\n ),\n },\n include: Array.from(new Set([...(json.include ?? []), 'src/**/*.tsx'])),\n }),\n );\n\n addDependenciesToPackageJson(\n tree,\n withVersions(\n forDependencies<typeof SHADCN_DEPENDENCIES>(declaration),\n declaredNames(SHADCN_DEPENDENCIES),\n ),\n {},\n joinPathFragments(libraryRoot, 'package.json'),\n );\n\n // shadcn 4.x's CLI resolves the `components.json` alias via `imports`/\n // `exports` (Node's package resolution), not a tsconfig `paths` alias.\n // `imports` covers this package's own internal component-to-component\n // references (aliased in components.json below); `exports` covers every\n // other consumer.\n updateJson(\n tree,\n joinPathFragments(libraryRoot, 'package.json'),\n (packageJson) => ({\n ...packageJson,\n imports: {\n '#components/*': './src/components/*.tsx',\n '#lib/*': './src/lib/*.ts',\n '#hooks/*': './src/hooks/*.ts',\n },\n exports: {\n '.': './src/index.ts',\n './styles/*': './src/styles/*',\n './components/*': './src/components/*.tsx',\n './lib/*': './src/lib/*.ts',\n './hooks/*': './src/hooks/*.ts',\n },\n }),\n );\n }\n\n // components.json lives in the package so `shadcn add` runs there and\n // installs component dependencies into the package's own manifest.\n if (!tree.exists(joinPathFragments(libraryRoot, 'components.json'))) {\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'shadcn'),\n libraryRoot,\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n\n await formatFilesInSubtree(tree);\n}\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","tsProjectGenerator","configureTsProject","TS_PROJECT_DEPENDENCIES","VITEST_DEPENDENCIES","declaredNames","forDependencies","addDependenciesToPackageJson","getLocalDependencySpecifier","formatFilesInSubtree","esmVars","getNpmScopePrefix","PACKAGES_DIR","SHARED_SHADCN_DIR","SHARED_SHADCN_NAME","withVersions","SHADCN_DEPENDENCIES","name","getSharedShadcnFullyQualifiedName","tree","addSharedShadcnDependency","consumerDir","sharedShadcnGenerator","declaration","fullyQualifiedName","libraryRoot","shadcnSrcRoot","exists","directory","subDirectory","delete","dirname","overwriteStrategy","KeepExisting","Overwrite","dir","json","compilerOptions","jsx","module","moduleResolution","lib","Array","from","Set","include","packageJson","imports","exports"],"mappings":"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"}