@aws/nx-plugin 1.0.0-rc.53 → 1.0.0-rc.55

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 (271) hide show
  1. package/migrations.json +50 -0
  2. package/package.json +1 -1
  3. package/src/agentcore-gateway/gateway-connection/generator.js +3 -1
  4. package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -1
  5. package/src/agentcore-gateway/generator.d.ts +49 -1
  6. package/src/agentcore-gateway/generator.js +55 -22
  7. package/src/agentcore-gateway/generator.js.map +1 -1
  8. package/src/agentcore-gateway/mcp-connection/generator.js +3 -1
  9. package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -1
  10. package/src/infra/app/__snapshots__/generator.spec.ts.snap +2 -0
  11. package/src/infra/app/generator.d.ts +43 -0
  12. package/src/infra/app/generator.js +47 -18
  13. package/src/infra/app/generator.js.map +1 -1
  14. package/src/init/generator.d.ts +13 -0
  15. package/src/init/generator.js +14 -3
  16. package/src/init/generator.js.map +1 -1
  17. package/src/migrations/latest/backfill-generator-metadata/migration.d.ts +96 -0
  18. package/src/migrations/latest/backfill-generator-metadata/migration.js +670 -0
  19. package/src/migrations/latest/backfill-generator-metadata/migration.js.map +1 -0
  20. package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.d.ts +6 -0
  21. package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.js +94 -0
  22. package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
  23. package/src/preset/generator.d.ts +13 -0
  24. package/src/preset/generator.js +12 -3
  25. package/src/preset/generator.js.map +1 -1
  26. package/src/py/agent/a2a-connection/generator.d.ts +24 -0
  27. package/src/py/agent/a2a-connection/generator.js +49 -20
  28. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  29. package/src/py/agent/gateway-connection/generator.d.ts +23 -0
  30. package/src/py/agent/gateway-connection/generator.js +45 -11
  31. package/src/py/agent/gateway-connection/generator.js.map +1 -1
  32. package/src/py/agent/generator.d.ts +146 -1
  33. package/src/py/agent/generator.js +173 -76
  34. package/src/py/agent/generator.js.map +1 -1
  35. package/src/py/agent/mcp-connection/generator.d.ts +23 -0
  36. package/src/py/agent/mcp-connection/generator.js +45 -11
  37. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  38. package/src/py/agent/react-connection/generator.d.ts +146 -0
  39. package/src/py/agent/react-connection/generator.js +27 -4
  40. package/src/py/agent/react-connection/generator.js.map +1 -1
  41. package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +18 -0
  42. package/src/py/dynamodb/agent-connection/generator.js +7 -1
  43. package/src/py/dynamodb/agent-connection/generator.js.map +1 -1
  44. package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +9 -0
  45. package/src/py/dynamodb/fast-api-connection/generator.js +3 -1
  46. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -1
  47. package/src/py/dynamodb/generator.d.ts +29 -0
  48. package/src/py/dynamodb/generator.js +32 -12
  49. package/src/py/dynamodb/generator.js.map +1 -1
  50. package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +18 -0
  51. package/src/py/dynamodb/mcp-server-connection/generator.js +7 -1
  52. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -1
  53. package/src/py/fast-api/generator.d.ts +63 -0
  54. package/src/py/fast-api/generator.js +58 -23
  55. package/src/py/fast-api/generator.js.map +1 -1
  56. package/src/py/fast-api/react/generator.d.ts +16 -1
  57. package/src/py/fast-api/react/generator.js +15 -3
  58. package/src/py/fast-api/react/generator.js.map +1 -1
  59. package/src/py/lambda-function/generator.d.ts +21 -0
  60. package/src/py/lambda-function/generator.js +29 -10
  61. package/src/py/lambda-function/generator.js.map +1 -1
  62. package/src/py/mcp-server/generator.d.ts +60 -0
  63. package/src/py/mcp-server/generator.js +62 -25
  64. package/src/py/mcp-server/generator.js.map +1 -1
  65. package/src/py/project/generator.d.ts +13 -0
  66. package/src/py/project/generator.js +29 -10
  67. package/src/py/project/generator.js.map +1 -1
  68. package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +19 -0
  69. package/src/py/rdb/agent-connection/generator.js +7 -1
  70. package/src/py/rdb/agent-connection/generator.js.map +1 -1
  71. package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +7 -0
  72. package/src/py/rdb/fast-api-connection/generator.js +3 -1
  73. package/src/py/rdb/fast-api-connection/generator.js.map +1 -1
  74. package/src/py/rdb/generator.d.ts +89 -0
  75. package/src/py/rdb/generator.js +88 -40
  76. package/src/py/rdb/generator.js.map +1 -1
  77. package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +18 -0
  78. package/src/py/rdb/mcp-server-connection/generator.js +7 -1
  79. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -1
  80. package/src/smithy/project/generator.d.ts +7 -0
  81. package/src/smithy/project/generator.js +8 -2
  82. package/src/smithy/project/generator.js.map +1 -1
  83. package/src/smithy/react-connection/generator.d.ts +15 -0
  84. package/src/smithy/react-connection/generator.js +17 -3
  85. package/src/smithy/react-connection/generator.js.map +1 -1
  86. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +1 -0
  87. package/src/smithy/ts/api/generator.d.ts +79 -0
  88. package/src/smithy/ts/api/generator.js +77 -33
  89. package/src/smithy/ts/api/generator.js.map +1 -1
  90. package/src/terraform/project/generator.d.ts +50 -0
  91. package/src/terraform/project/generator.js +63 -17
  92. package/src/terraform/project/generator.js.map +1 -1
  93. package/src/trpc/backend/generator.d.ts +84 -0
  94. package/src/trpc/backend/generator.js +98 -38
  95. package/src/trpc/backend/generator.js.map +1 -1
  96. package/src/trpc/react/generator.d.ts +37 -0
  97. package/src/trpc/react/generator.js +63 -26
  98. package/src/trpc/react/generator.js.map +1 -1
  99. package/src/ts/agent/a2a-connection/generator.d.ts +46 -0
  100. package/src/ts/agent/a2a-connection/generator.js +53 -16
  101. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  102. package/src/ts/agent/gateway-connection/generator.d.ts +37 -0
  103. package/src/ts/agent/gateway-connection/generator.js +41 -14
  104. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  105. package/src/ts/agent/generator.d.ts +162 -0
  106. package/src/ts/agent/generator.js +166 -75
  107. package/src/ts/agent/generator.js.map +1 -1
  108. package/src/ts/agent/mcp-connection/generator.d.ts +37 -0
  109. package/src/ts/agent/mcp-connection/generator.js +41 -14
  110. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  111. package/src/ts/agent/react-connection/generator.d.ts +186 -0
  112. package/src/ts/agent/react-connection/generator.js +70 -21
  113. package/src/ts/agent/react-connection/generator.js.map +1 -1
  114. package/src/ts/astro-docs/generator.d.ts +38 -0
  115. package/src/ts/astro-docs/generator.js +58 -19
  116. package/src/ts/astro-docs/generator.js.map +1 -1
  117. package/src/ts/dcr-proxy/generator.d.ts +24 -0
  118. package/src/ts/dcr-proxy/generator.js +31 -14
  119. package/src/ts/dcr-proxy/generator.js.map +1 -1
  120. package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +18 -0
  121. package/src/ts/dynamodb/agent-connection/generator.js +7 -1
  122. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
  123. package/src/ts/dynamodb/generator.d.ts +41 -0
  124. package/src/ts/dynamodb/generator.js +47 -20
  125. package/src/ts/dynamodb/generator.js.map +1 -1
  126. package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +18 -0
  127. package/src/ts/dynamodb/mcp-server-connection/generator.js +7 -1
  128. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
  129. package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +9 -0
  130. package/src/ts/dynamodb/smithy-connection/generator.js +3 -1
  131. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
  132. package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +9 -0
  133. package/src/ts/dynamodb/trpc-connection/generator.js +3 -1
  134. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
  135. package/src/ts/lambda-function/generator.d.ts +38 -0
  136. package/src/ts/lambda-function/generator.js +49 -20
  137. package/src/ts/lambda-function/generator.js.map +1 -1
  138. package/src/ts/lib/generator.d.ts +7 -0
  139. package/src/ts/lib/generator.js +8 -1
  140. package/src/ts/lib/generator.js.map +1 -1
  141. package/src/ts/lib/ts-project-utils.d.ts +3 -1
  142. package/src/ts/lib/ts-project-utils.js +3 -2
  143. package/src/ts/lib/ts-project-utils.js.map +1 -1
  144. package/src/ts/lib/vitest.d.ts +10 -1
  145. package/src/ts/lib/vitest.js +14 -2
  146. package/src/ts/lib/vitest.js.map +1 -1
  147. package/src/ts/mcp-server/generator.d.ts +71 -0
  148. package/src/ts/mcp-server/generator.js +73 -36
  149. package/src/ts/mcp-server/generator.js.map +1 -1
  150. package/src/ts/nx-generator/generator.d.ts +3 -0
  151. package/src/ts/nx-generator/generator.js +8 -2
  152. package/src/ts/nx-generator/generator.js.map +1 -1
  153. package/src/ts/nx-migration/generator.d.ts +3 -0
  154. package/src/ts/nx-migration/generator.js +8 -2
  155. package/src/ts/nx-migration/generator.js.map +1 -1
  156. package/src/ts/nx-plugin/generator.d.ts +3 -0
  157. package/src/ts/nx-plugin/generator.js +8 -2
  158. package/src/ts/nx-plugin/generator.js.map +1 -1
  159. package/src/ts/nx-plugin/utils.d.ts +7 -2
  160. package/src/ts/nx-plugin/utils.js +10 -4
  161. package/src/ts/nx-plugin/utils.js.map +1 -1
  162. package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +10 -0
  163. package/src/ts/rdb/agent-connection/generator.js +8 -1
  164. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  165. package/src/ts/rdb/generator.d.ts +101 -0
  166. package/src/ts/rdb/generator.js +93 -41
  167. package/src/ts/rdb/generator.js.map +1 -1
  168. package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +10 -0
  169. package/src/ts/rdb/mcp-server-connection/generator.js +8 -1
  170. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  171. package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +9 -0
  172. package/src/ts/rdb/smithy-connection/generator.js +4 -1
  173. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  174. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +9 -0
  175. package/src/ts/rdb/trpc-connection/generator.js +3 -1
  176. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  177. package/src/ts/react-website/agui/generator.d.ts +86 -0
  178. package/src/ts/react-website/agui/generator.js +63 -28
  179. package/src/ts/react-website/agui/generator.js.map +1 -1
  180. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +20 -2
  181. package/src/ts/react-website/app/generator.d.ts +136 -1
  182. package/src/ts/react-website/app/generator.js +109 -40
  183. package/src/ts/react-website/app/generator.js.map +1 -1
  184. package/src/ts/react-website/cognito-auth/generator.d.ts +19 -0
  185. package/src/ts/react-website/cognito-auth/generator.js +21 -9
  186. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  187. package/src/utils/add-dependencies.d.ts +38 -0
  188. package/src/utils/add-dependencies.js +83 -0
  189. package/src/utils/add-dependencies.js.map +1 -0
  190. package/src/utils/agent-connection/agent-connection.d.ts +27 -6
  191. package/src/utils/agent-connection/agent-connection.js +47 -18
  192. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  193. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +19 -1
  194. package/src/utils/agent-core-constructs/agent-core-constructs.js +26 -6
  195. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  196. package/src/utils/api-constructs/api-constructs.d.ts +21 -2
  197. package/src/utils/api-constructs/api-constructs.js +26 -5
  198. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  199. package/src/utils/bundle/bundle.d.ts +6 -1
  200. package/src/utils/bundle/bundle.js +8 -2
  201. package/src/utils/bundle/bundle.js.map +1 -1
  202. package/src/utils/commands.d.ts +5 -4
  203. package/src/utils/commands.js +2 -6
  204. package/src/utils/commands.js.map +1 -1
  205. package/src/utils/connection/open-api/react.d.ts +18 -1
  206. package/src/utils/connection/open-api/react.js +27 -3
  207. package/src/utils/connection/open-api/react.js.map +1 -1
  208. package/src/utils/declared-dependencies.d.ts +140 -0
  209. package/src/utils/declared-dependencies.js +64 -0
  210. package/src/utils/declared-dependencies.js.map +1 -0
  211. package/src/utils/docker.d.ts +10 -1
  212. package/src/utils/docker.js +7 -3
  213. package/src/utils/docker.js.map +1 -1
  214. package/src/utils/fs.d.ts +15 -4
  215. package/src/utils/fs.js +26 -13
  216. package/src/utils/fs.js.map +1 -1
  217. package/src/utils/init.d.ts +14 -1
  218. package/src/utils/init.js +25 -7
  219. package/src/utils/init.js.map +1 -1
  220. package/src/utils/migration-versions.d.ts +15 -1
  221. package/src/utils/migration-versions.js +53 -7
  222. package/src/utils/migration-versions.js.map +1 -1
  223. package/src/utils/nx.d.ts +18 -0
  224. package/src/utils/nx.js +4 -0
  225. package/src/utils/nx.js.map +1 -1
  226. package/src/utils/py.d.ts +3 -2
  227. package/src/utils/py.js +10 -10
  228. package/src/utils/py.js.map +1 -1
  229. package/src/utils/shared-constructs-constants.d.ts +39 -4
  230. package/src/utils/shared-constructs-constants.js +29 -0
  231. package/src/utils/shared-constructs-constants.js.map +1 -1
  232. package/src/utils/shared-constructs.d.ts +4 -1
  233. package/src/utils/shared-constructs.js +5 -4
  234. package/src/utils/shared-constructs.js.map +1 -1
  235. package/src/utils/shared-dynamodb-scripts.d.ts +8 -1
  236. package/src/utils/shared-dynamodb-scripts.js +11 -3
  237. package/src/utils/shared-dynamodb-scripts.js.map +1 -1
  238. package/src/utils/shared-infra-scripts.d.ts +16 -1
  239. package/src/utils/shared-infra-scripts.js +18 -3
  240. package/src/utils/shared-infra-scripts.js.map +1 -1
  241. package/src/utils/shared-rdb-scripts.d.ts +12 -1
  242. package/src/utils/shared-rdb-scripts.js +17 -3
  243. package/src/utils/shared-rdb-scripts.js.map +1 -1
  244. package/src/utils/shared-shadcn.d.ts +26 -1
  245. package/src/utils/shared-shadcn.js +31 -14
  246. package/src/utils/shared-shadcn.js.map +1 -1
  247. package/src/utils/version-upgrade-migration/migration.d.ts +14 -0
  248. package/src/utils/version-upgrade-migration/migration.js +16 -0
  249. package/src/utils/version-upgrade-migration/migration.js.map +1 -0
  250. package/src/utils/version-upgrade-migration/nx-package-updates.d.ts +35 -0
  251. package/src/utils/version-upgrade-migration/nx-package-updates.js +42 -0
  252. package/src/utils/version-upgrade-migration/nx-package-updates.js.map +1 -0
  253. package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +50 -0
  254. package/src/utils/version-upgrade-migration/owned-dependencies.js +98 -0
  255. package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -0
  256. package/src/utils/version-upgrade-migration/register.d.ts +18 -0
  257. package/src/utils/version-upgrade-migration/register.js +33 -0
  258. package/src/utils/version-upgrade-migration/register.js.map +1 -0
  259. package/src/utils/version-upgrade-migration/sync-metrics-version.d.ts +13 -0
  260. package/src/utils/version-upgrade-migration/sync-metrics-version.js +33 -0
  261. package/src/utils/version-upgrade-migration/sync-metrics-version.js.map +1 -0
  262. package/src/utils/version-upgrade-migration/sync-vended-versions.d.ts +10 -0
  263. package/src/utils/version-upgrade-migration/sync-vended-versions.js +504 -0
  264. package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -0
  265. package/src/utils/version-upgrade-migration/vended-upgrade.d.ts +14 -0
  266. package/src/utils/version-upgrade-migration/vended-upgrade.js +40 -0
  267. package/src/utils/version-upgrade-migration/vended-upgrade.js.map +1 -0
  268. package/src/utils/versions.d.ts +25 -5
  269. package/src/utils/versions.js +46 -4
  270. package/src/utils/versions.js.map +1 -1
  271. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +4 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-migration/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n writeJson,\n} from '@nx/devkit';\nimport PackageJson from '../../../package.json' with { type: 'json' };\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport {\n LATEST_MIGRATIONS_DIR,\n migrationKey,\n} from '../../utils/migration-versions';\nimport { kebabCase } from '../../utils/names';\nimport {\n getGeneratorInfo,\n isNxPluginForAwsWorkspace,\n type NxGeneratorInfo,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport {\n addNxPluginDependencies,\n configureNxPluginPackageJson,\n readNxPluginProject,\n} from '../nx-plugin/utils';\nimport type { TsNxMigrationGeneratorSchema } from './schema';\n\nexport const NX_MIGRATION_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\n/**\n * Scaffolds a migration in an Nx Plugin project and registers it in the\n * plugin's `migrations.json` (creating the manifest and wiring the\n * `nx-migrations` field into the plugin's `package.json` if absent), so\n * `nx migrate` applies it when users upgrade the plugin.\n *\n * Supports all three migration kinds:\n * - `deterministic`: a codemod (`implementation`).\n * - `agentic`: a `prompt` markdown file applied by the user's agent.\n * - `hybrid`: both — the codemod does the mechanical part and returns\n * `agentContext`, then the prompt hands off to the agent for the rest.\n *\n * No `version` is written — the plugin author stamps versions at release time.\n */\nexport const tsNxMigrationGenerator = async (\n tree: Tree,\n options: TsNxMigrationGeneratorSchema,\n): Promise<GeneratorCallback | void> => {\n const name = kebabCase(options.name);\n // Shown by `nx migrate` when the migration runs, so it needs to say something\n const description =\n options.description ?? 'TODO: Add short description of the migration';\n const kind = options.kind ?? 'deterministic';\n\n const hasImplementation = kind === 'deterministic' || kind === 'hybrid';\n const hasPrompt = kind === 'agentic' || kind === 'hybrid';\n const isHybrid = kind === 'hybrid';\n\n const plugin = readNxPluginProject(tree, options.project);\n\n const sourceRoot = plugin.sourceRoot ?? joinPathFragments(plugin.root, 'src');\n const srcDir = sourceRoot.split('/').filter(Boolean).pop();\n // Migrations are grouped by the release that ships them. A new one lands in\n // `latest` — the release that picks it up moves it into its version folder.\n const migrationPath = `${srcDir}/migrations/${LATEST_MIGRATIONS_DIR}/${name}`;\n const migrationDir = joinPathFragments(\n sourceRoot,\n 'migrations',\n LATEST_MIGRATIONS_DIR,\n name,\n );\n const key = migrationKey(LATEST_MIGRATIONS_DIR, name);\n\n const isNxPluginForAws = isNxPluginForAwsWorkspace(tree);\n\n // Point the plugin at its migrations manifest so `nx migrate` finds them\n const pluginPackageJsonPath = configureNxPluginPackageJson(\n tree,\n plugin,\n 'nx-migrations',\n { migrations: './migrations.json' },\n );\n\n // Migrations sit three levels below the source root, so in this repo the\n // shared utils are relative. Elsewhere they come from the SDK.\n const formatImportPath = isNxPluginForAws\n ? '../../../utils/format'\n : `${PackageJson.name}/sdk/utils/format`;\n const testImportPath = isNxPluginForAws\n ? '../../../utils/test'\n : `${PackageJson.name}/sdk/utils/test`;\n\n // One template set covers all kinds — scaffold it, then prune what this kind\n // doesn't use.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n migrationDir,\n { name, description, isHybrid, formatImportPath, testImportPath },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n if (!hasImplementation) {\n tree.delete(joinPathFragments(migrationDir, 'migration.ts'));\n tree.delete(joinPathFragments(migrationDir, 'migration.spec.ts'));\n }\n if (!hasPrompt) {\n tree.delete(joinPathFragments(migrationDir, 'prompt.md'));\n }\n\n // Register the migration under its folder-prefixed key. The fields present\n // discriminate the kind for nx, and paths are relative to migrations.json.\n // No version is written, but an already-stamped one is preserved.\n const migrationsJsonPath = joinPathFragments(plugin.root, 'migrations.json');\n const migrationsJson = tree.exists(migrationsJsonPath)\n ? readJson(tree, migrationsJsonPath)\n : {\n $schema: 'http://json-schema.org/schema',\n name: readJson(tree, pluginPackageJsonPath).name ?? plugin.name,\n generators: {},\n };\n writeJson(tree, migrationsJsonPath, {\n ...migrationsJson,\n generators: sortObjectKeys({\n ...migrationsJson.generators,\n [key]: {\n ...(migrationsJson.generators?.[key]?.version\n ? { version: migrationsJson.generators[key].version }\n : {}),\n description,\n ...(hasImplementation\n ? { implementation: `./${migrationPath}/migration` }\n : {}),\n ...(hasPrompt ? { prompt: `./${migrationPath}/prompt.md` } : {}),\n },\n }),\n });\n\n // Codemods import @nx/devkit and the @aws/nx-plugin SDK, both of which must\n // resolve for nx to run them\n if (hasImplementation) {\n addNxPluginDependencies(tree, pluginPackageJsonPath);\n }\n\n await addGeneratorMetricsIfApplicable(tree, [NX_MIGRATION_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n\n if (hasImplementation && !isNxPluginForAws) {\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n ensureResolvable: ['@nx/devkit'],\n });\n }\n};\n\nexport default tsNxMigrationGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","readJson","writeJson","PackageJson","type","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","LATEST_MIGRATIONS_DIR","migrationKey","kebabCase","getGeneratorInfo","isNxPluginForAwsWorkspace","sortObjectKeys","addNxPluginDependencies","configureNxPluginPackageJson","readNxPluginProject","NX_MIGRATION_GENERATOR_INFO","filename","tsNxMigrationGenerator","tree","options","name","description","kind","hasImplementation","hasPrompt","isHybrid","plugin","project","sourceRoot","root","srcDir","split","filter","Boolean","pop","migrationPath","migrationDir","key","isNxPluginForAws","pluginPackageJsonPath","migrations","formatImportPath","testImportPath","dirname","overwriteStrategy","KeepExisting","delete","migrationsJsonPath","migrationsJson","exists","$schema","generators","version","implementation","prompt","preferInstallDependencies","languages","ensureResolvable"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-migration/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n writeJson,\n} from '@nx/devkit';\nimport PackageJson from '../../../package.json' with { type: 'json' };\nimport { declareDependencies } from '../../utils/declared-dependencies';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport {\n LATEST_MIGRATIONS_DIR,\n migrationKey,\n} from '../../utils/migration-versions';\nimport { kebabCase } from '../../utils/names';\nimport {\n getGeneratorInfo,\n isNxPluginForAwsWorkspace,\n type NxGeneratorInfo,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport {\n addNxPluginDependencies,\n configureNxPluginPackageJson,\n NX_PLUGIN_DEPENDENCIES,\n readNxPluginProject,\n} from '../nx-plugin/utils';\nimport type { TsNxMigrationGeneratorSchema } from './schema';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [...NX_PLUGIN_DEPENDENCIES],\n});\n\nexport const NX_MIGRATION_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\n/**\n * Scaffolds a migration in an Nx Plugin project and registers it in the\n * plugin's `migrations.json` (creating the manifest and wiring the\n * `nx-migrations` field into the plugin's `package.json` if absent), so\n * `nx migrate` applies it when users upgrade the plugin.\n *\n * Supports all three migration kinds:\n * - `deterministic`: a codemod (`implementation`).\n * - `agentic`: a `prompt` markdown file applied by the user's agent.\n * - `hybrid`: both — the codemod does the mechanical part and returns\n * `agentContext`, then the prompt hands off to the agent for the rest.\n *\n * No `version` is written — the plugin author stamps versions at release time.\n */\nexport const tsNxMigrationGenerator = async (\n tree: Tree,\n options: TsNxMigrationGeneratorSchema,\n): Promise<GeneratorCallback | void> => {\n const name = kebabCase(options.name);\n // Shown by `nx migrate` when the migration runs, so it needs to say something\n const description =\n options.description ?? 'TODO: Add short description of the migration';\n const kind = options.kind ?? 'deterministic';\n\n const hasImplementation = kind === 'deterministic' || kind === 'hybrid';\n const hasPrompt = kind === 'agentic' || kind === 'hybrid';\n const isHybrid = kind === 'hybrid';\n\n const plugin = readNxPluginProject(tree, options.project);\n\n const sourceRoot = plugin.sourceRoot ?? joinPathFragments(plugin.root, 'src');\n const srcDir = sourceRoot.split('/').filter(Boolean).pop();\n // Migrations are grouped by the release that ships them. A new one lands in\n // `latest` — the release that picks it up moves it into its version folder.\n const migrationPath = `${srcDir}/migrations/${LATEST_MIGRATIONS_DIR}/${name}`;\n const migrationDir = joinPathFragments(\n sourceRoot,\n 'migrations',\n LATEST_MIGRATIONS_DIR,\n name,\n );\n const key = migrationKey(LATEST_MIGRATIONS_DIR, name);\n\n const isNxPluginForAws = isNxPluginForAwsWorkspace(tree);\n\n // Point the plugin at its migrations manifest so `nx migrate` finds them\n const pluginPackageJsonPath = configureNxPluginPackageJson(\n tree,\n plugin,\n 'nx-migrations',\n { migrations: './migrations.json' },\n );\n\n // Migrations sit three levels below the source root, so in this repo the\n // shared utils are relative. Elsewhere they come from the SDK.\n const formatImportPath = isNxPluginForAws\n ? '../../../utils/format'\n : `${PackageJson.name}/sdk/utils/format`;\n const testImportPath = isNxPluginForAws\n ? '../../../utils/test'\n : `${PackageJson.name}/sdk/utils/test`;\n\n // One template set covers all kinds — scaffold it, then prune what this kind\n // doesn't use.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n migrationDir,\n { name, description, isHybrid, formatImportPath, testImportPath },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n if (!hasImplementation) {\n tree.delete(joinPathFragments(migrationDir, 'migration.ts'));\n tree.delete(joinPathFragments(migrationDir, 'migration.spec.ts'));\n }\n if (!hasPrompt) {\n tree.delete(joinPathFragments(migrationDir, 'prompt.md'));\n }\n\n // Register the migration under its folder-prefixed key. The fields present\n // discriminate the kind for nx, and paths are relative to migrations.json.\n // No version is written, but an already-stamped one is preserved.\n const migrationsJsonPath = joinPathFragments(plugin.root, 'migrations.json');\n const migrationsJson = tree.exists(migrationsJsonPath)\n ? readJson(tree, migrationsJsonPath)\n : {\n $schema: 'http://json-schema.org/schema',\n name: readJson(tree, pluginPackageJsonPath).name ?? plugin.name,\n generators: {},\n };\n writeJson(tree, migrationsJsonPath, {\n ...migrationsJson,\n generators: sortObjectKeys({\n ...migrationsJson.generators,\n [key]: {\n ...(migrationsJson.generators?.[key]?.version\n ? { version: migrationsJson.generators[key].version }\n : {}),\n description,\n ...(hasImplementation\n ? { implementation: `./${migrationPath}/migration` }\n : {}),\n ...(hasPrompt ? { prompt: `./${migrationPath}/prompt.md` } : {}),\n },\n }),\n });\n\n // Codemods import @nx/devkit and the @aws/nx-plugin SDK, both of which must\n // resolve for nx to run them\n if (hasImplementation) {\n addNxPluginDependencies(tree, pluginPackageJsonPath, DEPENDENCIES);\n }\n\n await addGeneratorMetricsIfApplicable(tree, [NX_MIGRATION_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n\n if (hasImplementation && !isNxPluginForAws) {\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n ensureResolvable: ['@nx/devkit'],\n });\n }\n};\n\nexport default tsNxMigrationGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","readJson","writeJson","PackageJson","type","declareDependencies","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","LATEST_MIGRATIONS_DIR","migrationKey","kebabCase","getGeneratorInfo","isNxPluginForAwsWorkspace","sortObjectKeys","addNxPluginDependencies","configureNxPluginPackageJson","NX_PLUGIN_DEPENDENCIES","readNxPluginProject","DEPENDENCIES","ts","NX_MIGRATION_GENERATOR_INFO","filename","tsNxMigrationGenerator","tree","options","name","description","kind","hasImplementation","hasPrompt","isHybrid","plugin","project","sourceRoot","root","srcDir","split","filter","Boolean","pop","migrationPath","migrationDir","key","isNxPluginForAws","pluginPackageJsonPath","migrations","formatImportPath","testImportPath","dirname","overwriteStrategy","KeepExisting","delete","migrationsJsonPath","migrationsJson","exists","$schema","generators","version","implementation","prompt","preferInstallDependencies","languages","ensureResolvable"],"mappings":"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"}
@@ -5,6 +5,9 @@
5
5
  import { type GeneratorCallback, type Tree } from '@nx/devkit';
6
6
  import { type NxGeneratorInfo } from '../../utils/nx';
7
7
  import type { TsNxPluginGeneratorSchema } from './schema';
8
+ export declare const DEPENDENCIES: import("../../utils/declared-dependencies").DependencyDeclaration<readonly [{
9
+ readonly name: "@nx/devkit";
10
+ }], readonly import("../../utils/declared-dependencies").DeclaredPyDependency<"a2a-sdk" | "ag-ui-langgraph" | "ag-ui-protocol" | "ag-ui-strands" | "aws-lambda-powertools" | "aws-lambda-powertools[tracer]" | "aws-lambda-powertools[parser]" | "aws-opentelemetry-distro" | "bedrock-agentcore" | "boto3" | "checkov" | "fastapi" | "fastapi[standard]" | "httpx" | "langchain" | "langchain-aws" | "langchain-mcp-adapters" | "langgraph" | "mcp" | "pip-check-updates" | "pip-licenses" | "ruff" | "strands-agents" | "strands-agents[a2a]" | "strands-agents-tools" | "ty" | "pynamodb" | "uvicorn" | "sqlmodel" | "alembic" | "aiomysql" | "asyncpg" | "greenlet", Record<string, never>>[]>;
8
11
  export declare const TS_NX_PLUGIN_GENERATOR_INFO: NxGeneratorInfo;
9
12
  export declare const tsNxPluginGenerator: (tree: Tree, options: TsNxPluginGeneratorSchema) => Promise<GeneratorCallback>;
10
13
  export default tsNxPluginGenerator;
@@ -2,6 +2,7 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
5
+ import { declareDependencies } from "../../utils/declared-dependencies.js";
5
6
  import { formatFilesInSubtree } from "../../utils/format.js";
6
7
  import { installDependencies } from "../../utils/install.js";
7
8
  import { addGeneratorMetricsIfApplicable } from "../../utils/metrics.js";
@@ -10,7 +11,12 @@ import { addDependencyToTargetIfNotPresent, addGeneratorMetadata, getGeneratorIn
10
11
  import { sortObjectKeys } from "../../utils/object.js";
11
12
  import tsProjectGenerator, { getTsLibDetails } from "../lib/generator.js";
12
13
  import tsMcpServerGenerator from "../mcp-server/generator.js";
13
- import { configureTsProjectAsNxPlugin } from "./utils.js";
14
+ import { configureTsProjectAsNxPlugin, NX_PLUGIN_DEPENDENCIES } from "./utils.js";
15
+ export const DEPENDENCIES = declareDependencies()({
16
+ ts: [
17
+ ...NX_PLUGIN_DEPENDENCIES
18
+ ]
19
+ });
14
20
  export const TS_NX_PLUGIN_GENERATOR_INFO = getGeneratorInfo(import.meta.filename);
15
21
  export const tsNxPluginGenerator = async (tree, options)=>{
16
22
  // Generate a TypeScript project as the base
@@ -20,7 +26,7 @@ export const tsNxPluginGenerator = async (tree, options)=>{
20
26
  preferInstallDependencies: false
21
27
  });
22
28
  // Configure the typescript project as an Nx Plugin
23
- configureTsProjectAsNxPlugin(tree, fullyQualifiedName);
29
+ configureTsProjectAsNxPlugin(tree, fullyQualifiedName, DEPENDENCIES);
24
30
  // Add a "package" target which creates a package which can be published to NPM
25
31
  const project = readProjectConfigurationUnqualified(tree, fullyQualifiedName);
26
32
  project.targets = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { esmVars } from '../../utils/module-format';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator';\nimport tsMcpServerGenerator from '../mcp-server/generator';\nimport type { TsNxPluginGeneratorSchema } from './schema';\nimport { configureTsProjectAsNxPlugin } from './utils';\n\nexport const TS_NX_PLUGIN_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsNxPluginGenerator = async (\n tree: Tree,\n options: TsNxPluginGeneratorSchema,\n): Promise<GeneratorCallback> => {\n // Generate a TypeScript project as the base\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, options);\n await tsProjectGenerator(tree, {\n ...options,\n preferInstallDependencies: false,\n });\n\n // Configure the typescript project as an Nx Plugin\n configureTsProjectAsNxPlugin(tree, fullyQualifiedName);\n\n // Add a \"package\" target which creates a package which can be published to NPM\n const project = readProjectConfigurationUnqualified(tree, fullyQualifiedName);\n project.targets = {\n ...project.targets,\n package: {\n executor: '@nx/js:tsc',\n outputs: ['{options.outputPath}'],\n options: {\n outputPath: `dist/{projectRoot}/package`,\n main: `{projectRoot}/src/index.ts`,\n tsConfig: `{projectRoot}/tsconfig.lib.json`,\n assets: [\n `{projectRoot}/*.md`,\n `{projectRoot}/LICENSE*`,\n `{projectRoot}/NOTICE`,\n {\n input: './{projectRoot}/src',\n glob: '**/!(*.ts)',\n output: './src',\n },\n {\n input: './{projectRoot}/src',\n glob: '**/*.d.ts',\n output: './src',\n },\n {\n input: './{projectRoot}',\n glob: 'generators.json',\n output: '.',\n },\n {\n input: './{projectRoot}',\n glob: 'executors.json',\n output: '.',\n },\n ],\n },\n },\n build: {\n ...project.targets?.build,\n },\n };\n // Append the package dependency without moving an existing entry, so re-runs\n // do not reorder the build dependencies.\n addDependencyToTargetIfNotPresent(project, 'build', 'package');\n // Sort targets so their order is stable regardless of insertion order.\n project.targets = sortObjectKeys(project.targets);\n updateProjectConfiguration(tree, fullyQualifiedName, project);\n\n // Add an MCP Server\n await tsMcpServerGenerator(tree, {\n project: fullyQualifiedName,\n infra: 'none',\n iac: 'cdk', // not used\n preferInstallDependencies: false,\n });\n\n const mcpPath = joinPathFragments(project.sourceRoot, 'mcp-server');\n const mcpServerPath = joinPathFragments(mcpPath, 'server.ts');\n\n // Remove the sample server and tools\n tree.delete(mcpServerPath);\n tree.delete(joinPathFragments(mcpPath, 'tools', 'add.ts'));\n tree.delete(joinPathFragments(mcpPath, 'resources', 'sample-guidance.ts'));\n\n // Add generator MCP server\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'mcp-server'),\n mcpPath,\n {\n name: fullyQualifiedName,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n addGeneratorMetadata(tree, project.name, TS_NX_PLUGIN_GENERATOR_INFO);\n\n await addGeneratorMetricsIfApplicable(tree, [TS_NX_PLUGIN_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsNxPluginGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","tsProjectGenerator","getTsLibDetails","tsMcpServerGenerator","configureTsProjectAsNxPlugin","TS_NX_PLUGIN_GENERATOR_INFO","filename","tsNxPluginGenerator","tree","options","fullyQualifiedName","dir","preferInstallDependencies","project","targets","package","executor","outputs","outputPath","main","tsConfig","assets","input","glob","output","build","infra","iac","mcpPath","sourceRoot","mcpServerPath","delete","dirname","name","overwriteStrategy","KeepExisting","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { declareDependencies } from '../../utils/declared-dependencies';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { esmVars } from '../../utils/module-format';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator';\nimport tsMcpServerGenerator from '../mcp-server/generator';\nimport type { TsNxPluginGeneratorSchema } from './schema';\nimport { configureTsProjectAsNxPlugin, NX_PLUGIN_DEPENDENCIES } from './utils';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [...NX_PLUGIN_DEPENDENCIES],\n});\n\nexport const TS_NX_PLUGIN_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsNxPluginGenerator = async (\n tree: Tree,\n options: TsNxPluginGeneratorSchema,\n): Promise<GeneratorCallback> => {\n // Generate a TypeScript project as the base\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, options);\n await tsProjectGenerator(tree, {\n ...options,\n preferInstallDependencies: false,\n });\n\n // Configure the typescript project as an Nx Plugin\n configureTsProjectAsNxPlugin(tree, fullyQualifiedName, DEPENDENCIES);\n\n // Add a \"package\" target which creates a package which can be published to NPM\n const project = readProjectConfigurationUnqualified(tree, fullyQualifiedName);\n project.targets = {\n ...project.targets,\n package: {\n executor: '@nx/js:tsc',\n outputs: ['{options.outputPath}'],\n options: {\n outputPath: `dist/{projectRoot}/package`,\n main: `{projectRoot}/src/index.ts`,\n tsConfig: `{projectRoot}/tsconfig.lib.json`,\n assets: [\n `{projectRoot}/*.md`,\n `{projectRoot}/LICENSE*`,\n `{projectRoot}/NOTICE`,\n {\n input: './{projectRoot}/src',\n glob: '**/!(*.ts)',\n output: './src',\n },\n {\n input: './{projectRoot}/src',\n glob: '**/*.d.ts',\n output: './src',\n },\n {\n input: './{projectRoot}',\n glob: 'generators.json',\n output: '.',\n },\n {\n input: './{projectRoot}',\n glob: 'executors.json',\n output: '.',\n },\n ],\n },\n },\n build: {\n ...project.targets?.build,\n },\n };\n // Append the package dependency without moving an existing entry, so re-runs\n // do not reorder the build dependencies.\n addDependencyToTargetIfNotPresent(project, 'build', 'package');\n // Sort targets so their order is stable regardless of insertion order.\n project.targets = sortObjectKeys(project.targets);\n updateProjectConfiguration(tree, fullyQualifiedName, project);\n\n // Add an MCP Server\n await tsMcpServerGenerator(tree, {\n project: fullyQualifiedName,\n infra: 'none',\n iac: 'cdk', // not used\n preferInstallDependencies: false,\n });\n\n const mcpPath = joinPathFragments(project.sourceRoot, 'mcp-server');\n const mcpServerPath = joinPathFragments(mcpPath, 'server.ts');\n\n // Remove the sample server and tools\n tree.delete(mcpServerPath);\n tree.delete(joinPathFragments(mcpPath, 'tools', 'add.ts'));\n tree.delete(joinPathFragments(mcpPath, 'resources', 'sample-guidance.ts'));\n\n // Add generator MCP server\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'mcp-server'),\n mcpPath,\n {\n name: fullyQualifiedName,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n addGeneratorMetadata(tree, project.name, TS_NX_PLUGIN_GENERATOR_INFO);\n\n await addGeneratorMetricsIfApplicable(tree, [TS_NX_PLUGIN_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsNxPluginGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","declareDependencies","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","tsProjectGenerator","getTsLibDetails","tsMcpServerGenerator","configureTsProjectAsNxPlugin","NX_PLUGIN_DEPENDENCIES","DEPENDENCIES","ts","TS_NX_PLUGIN_GENERATOR_INFO","filename","tsNxPluginGenerator","tree","options","fullyQualifiedName","dir","preferInstallDependencies","project","targets","package","executor","outputs","outputPath","main","tsConfig","assets","input","glob","output","build","infra","iac","mcpPath","sourceRoot","mcpServerPath","delete","dirname","name","overwriteStrategy","KeepExisting","languages"],"mappings":"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"}
@@ -4,6 +4,11 @@
4
4
  */
5
5
  import { type ProjectConfiguration, type Tree } from '@nx/devkit';
6
6
  import type { PackageJson } from 'nx/src/utils/package-json';
7
+ import { type DependencyDeclaration, type MustDeclare } from '../../utils/declared-dependencies';
8
+ /** Dependencies a caller must declare to configure an Nx Plugin project. */
9
+ export declare const NX_PLUGIN_DEPENDENCIES: readonly [{
10
+ readonly name: "@nx/devkit";
11
+ }];
7
12
  /**
8
13
  * Read the configuration of a project which can host Nx Plugin generators or
9
14
  * migrations, ie a TypeScript project.
@@ -21,9 +26,9 @@ export declare const configureNxPluginPackageJson: <TField extends NxPluginManif
21
26
  * workspace and the plugin, since both must resolve for Nx to load them. A
22
27
  * no-op inside the plugin's own monorepo, where they are already present.
23
28
  */
24
- export declare const addNxPluginDependencies: (tree: Tree, pluginPackageJsonPath: string) => void;
29
+ export declare const addNxPluginDependencies: <const D extends DependencyDeclaration>(tree: Tree, pluginPackageJsonPath: string, declaration: D & MustDeclare<typeof NX_PLUGIN_DEPENDENCIES, D>) => void;
25
30
  /**
26
31
  * Configures a TypeScript project as an Nx Plugin
27
32
  */
28
- export declare const configureTsProjectAsNxPlugin: (tree: Tree, projectName: string) => void;
33
+ export declare const configureTsProjectAsNxPlugin: <const D extends DependencyDeclaration>(tree: Tree, projectName: string, declaration: D & MustDeclare<typeof NX_PLUGIN_DEPENDENCIES, D>) => void;
29
34
  export {};
@@ -2,10 +2,16 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */ import { joinPathFragments, updateJson, writeJson } from "@nx/devkit";
5
+ import { forDependencies } from "../../utils/declared-dependencies.js";
5
6
  import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
6
7
  import { isEsmWorkspace } from "../../utils/module-format.js";
7
8
  import { nxPluginSelfDependency, readProjectConfigurationUnqualified } from "../../utils/nx.js";
8
9
  import { withVersions } from "../../utils/versions.js";
10
+ /** Dependencies a caller must declare to configure an Nx Plugin project. */ export const NX_PLUGIN_DEPENDENCIES = [
11
+ {
12
+ name: '@nx/devkit'
13
+ }
14
+ ];
9
15
  /**
10
16
  * Read the configuration of a project which can host Nx Plugin generators or
11
17
  * migrations, ie a TypeScript project.
@@ -43,13 +49,13 @@ import { withVersions } from "../../utils/versions.js";
43
49
  * Declare the dependencies the plugin's `.ts` files import on both the
44
50
  * workspace and the plugin, since both must resolve for Nx to load them. A
45
51
  * no-op inside the plugin's own monorepo, where they are already present.
46
- */ export const addNxPluginDependencies = (tree, pluginPackageJsonPath)=>{
52
+ */ export const addNxPluginDependencies = (tree, pluginPackageJsonPath, declaration)=>{
47
53
  const selfDependency = nxPluginSelfDependency(tree);
48
54
  if (Object.keys(selfDependency).length === 0) {
49
55
  return;
50
56
  }
51
57
  const deps = {
52
- ...withVersions([
58
+ ...withVersions(forDependencies(declaration), [
53
59
  '@nx/devkit'
54
60
  ]),
55
61
  ...selfDependency
@@ -59,7 +65,7 @@ import { withVersions } from "../../utils/versions.js";
59
65
  };
60
66
  /**
61
67
  * Configures a TypeScript project as an Nx Plugin
62
- */ export const configureTsProjectAsNxPlugin = (tree, projectName)=>{
68
+ */ export const configureTsProjectAsNxPlugin = (tree, projectName, declaration)=>{
63
69
  const project = readNxPluginProject(tree, projectName);
64
70
  // Create an empty generators.json if one dosn't exist
65
71
  const generatorsJsonPath = joinPathFragments(project.root, 'generators.json');
@@ -69,7 +75,7 @@ import { withVersions } from "../../utils/versions.js";
69
75
  });
70
76
  }
71
77
  const pluginPackageJsonPath = configureNxPluginPackageJson(tree, project, 'generators', './generators.json');
72
- addNxPluginDependencies(tree, pluginPackageJsonPath);
78
+ addNxPluginDependencies(tree, pluginPackageJsonPath, forDependencies(declaration));
73
79
  };
74
80
 
75
81
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/utils.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n writeJson,\n} from '@nx/devkit';\nimport type { PackageJson } from 'nx/src/utils/package-json';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies';\nimport { isEsmWorkspace } from '../../utils/module-format';\nimport {\n nxPluginSelfDependency,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { withVersions } from '../../utils/versions';\n\n/**\n * Read the configuration of a project which can host Nx Plugin generators or\n * migrations, ie a TypeScript project.\n */\nexport const readNxPluginProject = (\n tree: Tree,\n projectName: string,\n): ProjectConfiguration => {\n const project = readProjectConfigurationUnqualified(tree, projectName);\n\n const tsConfigPath = joinPathFragments(project.root, 'tsconfig.json');\n if (!tree.exists(tsConfigPath)) {\n throw new Error(\n `Selected plugin project ${projectName} is not a TypeScript project`,\n );\n }\n\n return project;\n};\n\n/** `package.json` field pointing Nx at one of a plugin's manifests. */\ntype NxPluginManifestField = 'generators' | 'nx-migrations';\n\n/**\n * Create the plugin project's package.json if absent and point it at the given\n * manifest, returning its path.\n */\nexport const configureNxPluginPackageJson = <\n TField extends NxPluginManifestField,\n>(\n tree: Tree,\n project: ProjectConfiguration,\n manifestField: TField,\n manifestValue: PackageJson[TField],\n): string => {\n const pluginPackageJsonPath = joinPathFragments(project.root, 'package.json');\n if (!tree.exists(pluginPackageJsonPath)) {\n writeJson(tree, pluginPackageJsonPath, {\n name: project.name,\n });\n }\n const esm = isEsmWorkspace(tree);\n updateJson(tree, pluginPackageJsonPath, (pkg) => {\n // Match the plugin's module system to the workspace. Nx loads `.ts` files\n // via Node's native type stripping, as ESM (workspace root is\n // `type: module`) or CommonJS accordingly.\n pkg.type ??= esm ? 'module' : 'commonjs';\n pkg.main ??= esm ? './src/index.js' : './src/index';\n pkg[manifestField] ??= manifestValue;\n return pkg;\n });\n return pluginPackageJsonPath;\n};\n\n/**\n * Declare the dependencies the plugin's `.ts` files import on both the\n * workspace and the plugin, since both must resolve for Nx to load them. A\n * no-op inside the plugin's own monorepo, where they are already present.\n */\nexport const addNxPluginDependencies = (\n tree: Tree,\n pluginPackageJsonPath: string,\n): void => {\n const selfDependency = nxPluginSelfDependency(tree);\n if (Object.keys(selfDependency).length === 0) {\n return;\n }\n const deps = {\n ...withVersions(['@nx/devkit']),\n ...selfDependency,\n };\n addDependenciesToPackageJson(tree, {}, deps);\n addDependenciesToPackageJson(tree, deps, {}, pluginPackageJsonPath);\n};\n\n/**\n * Configures a TypeScript project as an Nx Plugin\n */\nexport const configureTsProjectAsNxPlugin = (\n tree: Tree,\n projectName: string,\n) => {\n const project = readNxPluginProject(tree, projectName);\n\n // Create an empty generators.json if one dosn't exist\n const generatorsJsonPath = joinPathFragments(project.root, 'generators.json');\n if (!tree.exists(generatorsJsonPath)) {\n writeJson(tree, generatorsJsonPath, {\n generators: {},\n });\n }\n\n const pluginPackageJsonPath = configureNxPluginPackageJson(\n tree,\n project,\n 'generators',\n './generators.json',\n );\n\n addNxPluginDependencies(tree, pluginPackageJsonPath);\n};\n"],"names":["joinPathFragments","updateJson","writeJson","addDependenciesToPackageJson","isEsmWorkspace","nxPluginSelfDependency","readProjectConfigurationUnqualified","withVersions","readNxPluginProject","tree","projectName","project","tsConfigPath","root","exists","Error","configureNxPluginPackageJson","manifestField","manifestValue","pluginPackageJsonPath","name","esm","pkg","type","main","addNxPluginDependencies","selfDependency","Object","keys","length","deps","configureTsProjectAsNxPlugin","generatorsJsonPath","generators"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,EAGjBC,UAAU,EACVC,SAAS,QACJ,aAAa;AAEpB,SAASC,4BAA4B,QAAQ,8BAA2B;AACxE,SAASC,cAAc,QAAQ,+BAA4B;AAC3D,SACEC,sBAAsB,EACtBC,mCAAmC,QAC9B,oBAAiB;AACxB,SAASC,YAAY,QAAQ,0BAAuB;AAEpD;;;CAGC,GACD,OAAO,MAAMC,sBAAsB,CACjCC,MACAC;IAEA,MAAMC,UAAUL,oCAAoCG,MAAMC;IAE1D,MAAME,eAAeZ,kBAAkBW,QAAQE,IAAI,EAAE;IACrD,IAAI,CAACJ,KAAKK,MAAM,CAACF,eAAe;QAC9B,MAAM,IAAIG,MACR,CAAC,wBAAwB,EAAEL,YAAY,4BAA4B,CAAC;IAExE;IAEA,OAAOC;AACT,EAAE;AAKF;;;CAGC,GACD,OAAO,MAAMK,+BAA+B,CAG1CP,MACAE,SACAM,eACAC;IAEA,MAAMC,wBAAwBnB,kBAAkBW,QAAQE,IAAI,EAAE;IAC9D,IAAI,CAACJ,KAAKK,MAAM,CAACK,wBAAwB;QACvCjB,UAAUO,MAAMU,uBAAuB;YACrCC,MAAMT,QAAQS,IAAI;QACpB;IACF;IACA,MAAMC,MAAMjB,eAAeK;IAC3BR,WAAWQ,MAAMU,uBAAuB,CAACG;QACvC,0EAA0E;QAC1E,8DAA8D;QAC9D,2CAA2C;QAC3CA,IAAIC,IAAI,KAAKF,MAAM,WAAW;QAC9BC,IAAIE,IAAI,KAAKH,MAAM,mBAAmB;QACtCC,GAAG,CAACL,cAAc,KAAKC;QACvB,OAAOI;IACT;IACA,OAAOH;AACT,EAAE;AAEF;;;;CAIC,GACD,OAAO,MAAMM,0BAA0B,CACrChB,MACAU;IAEA,MAAMO,iBAAiBrB,uBAAuBI;IAC9C,IAAIkB,OAAOC,IAAI,CAACF,gBAAgBG,MAAM,KAAK,GAAG;QAC5C;IACF;IACA,MAAMC,OAAO;QACX,GAAGvB,aAAa;YAAC;SAAa,CAAC;QAC/B,GAAGmB,cAAc;IACnB;IACAvB,6BAA6BM,MAAM,CAAC,GAAGqB;IACvC3B,6BAA6BM,MAAMqB,MAAM,CAAC,GAAGX;AAC/C,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMY,+BAA+B,CAC1CtB,MACAC;IAEA,MAAMC,UAAUH,oBAAoBC,MAAMC;IAE1C,sDAAsD;IACtD,MAAMsB,qBAAqBhC,kBAAkBW,QAAQE,IAAI,EAAE;IAC3D,IAAI,CAACJ,KAAKK,MAAM,CAACkB,qBAAqB;QACpC9B,UAAUO,MAAMuB,oBAAoB;YAClCC,YAAY,CAAC;QACf;IACF;IAEA,MAAMd,wBAAwBH,6BAC5BP,MACAE,SACA,cACA;IAGFc,wBAAwBhB,MAAMU;AAChC,EAAE"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/utils.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n writeJson,\n} from '@nx/devkit';\nimport type { PackageJson } from 'nx/src/utils/package-json';\nimport {\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../../utils/declared-dependencies';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies';\nimport { isEsmWorkspace } from '../../utils/module-format';\nimport {\n nxPluginSelfDependency,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { type ITsDepVersion, withVersions } from '../../utils/versions';\n\n/** Dependencies a caller must declare to configure an Nx Plugin project. */\nexport const NX_PLUGIN_DEPENDENCIES = [\n { name: '@nx/devkit' },\n] as const satisfies readonly { name: ITsDepVersion }[];\n\n/**\n * Read the configuration of a project which can host Nx Plugin generators or\n * migrations, ie a TypeScript project.\n */\nexport const readNxPluginProject = (\n tree: Tree,\n projectName: string,\n): ProjectConfiguration => {\n const project = readProjectConfigurationUnqualified(tree, projectName);\n\n const tsConfigPath = joinPathFragments(project.root, 'tsconfig.json');\n if (!tree.exists(tsConfigPath)) {\n throw new Error(\n `Selected plugin project ${projectName} is not a TypeScript project`,\n );\n }\n\n return project;\n};\n\n/** `package.json` field pointing Nx at one of a plugin's manifests. */\ntype NxPluginManifestField = 'generators' | 'nx-migrations';\n\n/**\n * Create the plugin project's package.json if absent and point it at the given\n * manifest, returning its path.\n */\nexport const configureNxPluginPackageJson = <\n TField extends NxPluginManifestField,\n>(\n tree: Tree,\n project: ProjectConfiguration,\n manifestField: TField,\n manifestValue: PackageJson[TField],\n): string => {\n const pluginPackageJsonPath = joinPathFragments(project.root, 'package.json');\n if (!tree.exists(pluginPackageJsonPath)) {\n writeJson(tree, pluginPackageJsonPath, {\n name: project.name,\n });\n }\n const esm = isEsmWorkspace(tree);\n updateJson(tree, pluginPackageJsonPath, (pkg) => {\n // Match the plugin's module system to the workspace. Nx loads `.ts` files\n // via Node's native type stripping, as ESM (workspace root is\n // `type: module`) or CommonJS accordingly.\n pkg.type ??= esm ? 'module' : 'commonjs';\n pkg.main ??= esm ? './src/index.js' : './src/index';\n pkg[manifestField] ??= manifestValue;\n return pkg;\n });\n return pluginPackageJsonPath;\n};\n\n/**\n * Declare the dependencies the plugin's `.ts` files import on both the\n * workspace and the plugin, since both must resolve for Nx to load them. A\n * no-op inside the plugin's own monorepo, where they are already present.\n */\nexport const addNxPluginDependencies = <const D extends DependencyDeclaration>(\n tree: Tree,\n pluginPackageJsonPath: string,\n declaration: D & MustDeclare<typeof NX_PLUGIN_DEPENDENCIES, D>,\n): void => {\n const selfDependency = nxPluginSelfDependency(tree);\n if (Object.keys(selfDependency).length === 0) {\n return;\n }\n const deps = {\n ...withVersions(\n forDependencies<typeof NX_PLUGIN_DEPENDENCIES>(declaration),\n ['@nx/devkit'],\n ),\n ...selfDependency,\n };\n addDependenciesToPackageJson(tree, {}, deps);\n addDependenciesToPackageJson(tree, deps, {}, pluginPackageJsonPath);\n};\n\n/**\n * Configures a TypeScript project as an Nx Plugin\n */\nexport const configureTsProjectAsNxPlugin = <\n const D extends DependencyDeclaration,\n>(\n tree: Tree,\n projectName: string,\n declaration: D & MustDeclare<typeof NX_PLUGIN_DEPENDENCIES, D>,\n) => {\n const project = readNxPluginProject(tree, projectName);\n\n // Create an empty generators.json if one dosn't exist\n const generatorsJsonPath = joinPathFragments(project.root, 'generators.json');\n if (!tree.exists(generatorsJsonPath)) {\n writeJson(tree, generatorsJsonPath, {\n generators: {},\n });\n }\n\n const pluginPackageJsonPath = configureNxPluginPackageJson(\n tree,\n project,\n 'generators',\n './generators.json',\n );\n\n addNxPluginDependencies(\n tree,\n pluginPackageJsonPath,\n forDependencies<typeof NX_PLUGIN_DEPENDENCIES>(declaration),\n );\n};\n"],"names":["joinPathFragments","updateJson","writeJson","forDependencies","addDependenciesToPackageJson","isEsmWorkspace","nxPluginSelfDependency","readProjectConfigurationUnqualified","withVersions","NX_PLUGIN_DEPENDENCIES","name","readNxPluginProject","tree","projectName","project","tsConfigPath","root","exists","Error","configureNxPluginPackageJson","manifestField","manifestValue","pluginPackageJsonPath","esm","pkg","type","main","addNxPluginDependencies","declaration","selfDependency","Object","keys","length","deps","configureTsProjectAsNxPlugin","generatorsJsonPath","generators"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,EAGjBC,UAAU,EACVC,SAAS,QACJ,aAAa;AAEpB,SAEEC,eAAe,QAEV,uCAAoC;AAC3C,SAASC,4BAA4B,QAAQ,8BAA2B;AACxE,SAASC,cAAc,QAAQ,+BAA4B;AAC3D,SACEC,sBAAsB,EACtBC,mCAAmC,QAC9B,oBAAiB;AACxB,SAA6BC,YAAY,QAAQ,0BAAuB;AAExE,0EAA0E,GAC1E,OAAO,MAAMC,yBAAyB;IACpC;QAAEC,MAAM;IAAa;CACtB,CAAuD;AAExD;;;CAGC,GACD,OAAO,MAAMC,sBAAsB,CACjCC,MACAC;IAEA,MAAMC,UAAUP,oCAAoCK,MAAMC;IAE1D,MAAME,eAAef,kBAAkBc,QAAQE,IAAI,EAAE;IACrD,IAAI,CAACJ,KAAKK,MAAM,CAACF,eAAe;QAC9B,MAAM,IAAIG,MACR,CAAC,wBAAwB,EAAEL,YAAY,4BAA4B,CAAC;IAExE;IAEA,OAAOC;AACT,EAAE;AAKF;;;CAGC,GACD,OAAO,MAAMK,+BAA+B,CAG1CP,MACAE,SACAM,eACAC;IAEA,MAAMC,wBAAwBtB,kBAAkBc,QAAQE,IAAI,EAAE;IAC9D,IAAI,CAACJ,KAAKK,MAAM,CAACK,wBAAwB;QACvCpB,UAAUU,MAAMU,uBAAuB;YACrCZ,MAAMI,QAAQJ,IAAI;QACpB;IACF;IACA,MAAMa,MAAMlB,eAAeO;IAC3BX,WAAWW,MAAMU,uBAAuB,CAACE;QACvC,0EAA0E;QAC1E,8DAA8D;QAC9D,2CAA2C;QAC3CA,IAAIC,IAAI,KAAKF,MAAM,WAAW;QAC9BC,IAAIE,IAAI,KAAKH,MAAM,mBAAmB;QACtCC,GAAG,CAACJ,cAAc,KAAKC;QACvB,OAAOG;IACT;IACA,OAAOF;AACT,EAAE;AAEF;;;;CAIC,GACD,OAAO,MAAMK,0BAA0B,CACrCf,MACAU,uBACAM;IAEA,MAAMC,iBAAiBvB,uBAAuBM;IAC9C,IAAIkB,OAAOC,IAAI,CAACF,gBAAgBG,MAAM,KAAK,GAAG;QAC5C;IACF;IACA,MAAMC,OAAO;QACX,GAAGzB,aACDL,gBAA+CyB,cAC/C;YAAC;SAAa,CACf;QACD,GAAGC,cAAc;IACnB;IACAzB,6BAA6BQ,MAAM,CAAC,GAAGqB;IACvC7B,6BAA6BQ,MAAMqB,MAAM,CAAC,GAAGX;AAC/C,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMY,+BAA+B,CAG1CtB,MACAC,aACAe;IAEA,MAAMd,UAAUH,oBAAoBC,MAAMC;IAE1C,sDAAsD;IACtD,MAAMsB,qBAAqBnC,kBAAkBc,QAAQE,IAAI,EAAE;IAC3D,IAAI,CAACJ,KAAKK,MAAM,CAACkB,qBAAqB;QACpCjC,UAAUU,MAAMuB,oBAAoB;YAClCC,YAAY,CAAC;QACf;IACF;IAEA,MAAMd,wBAAwBH,6BAC5BP,MACAE,SACA,cACA;IAGFa,wBACEf,MACAU,uBACAnB,gBAA+CyB;AAEnD,EAAE"}
@@ -53,6 +53,11 @@ exports[`ts#rdb agent-connection generator > should add rdb dev dependency to th
53
53
  "path": "src/my-agent",
54
54
  "protocol": "HTTP",
55
55
  },
56
+ {
57
+ "generator": "ts#rdb#agent-connection",
58
+ "name": "my-agent-db",
59
+ "path": "src/my-agent/agent.ts",
60
+ },
56
61
  ],
57
62
  },
58
63
  "name": "my-service",
@@ -152,6 +157,11 @@ exports[`ts#rdb agent-connection generator > should fall back to agent-dev when
152
157
  "path": "src/agent",
153
158
  "protocol": "HTTP",
154
159
  },
160
+ {
161
+ "generator": "ts#rdb#agent-connection",
162
+ "name": "agent-db",
163
+ "path": "src/agent/agent.ts",
164
+ },
155
165
  ],
156
166
  },
157
167
  "name": "my-service",
@@ -7,7 +7,8 @@ import { addDestructuredImport, applyGritQL } from "../../../utils/ast.js";
7
7
  import { formatFilesInSubtree } from "../../../utils/format.js";
8
8
  import { addGeneratorMetricsIfApplicable } from "../../../utils/metrics.js";
9
9
  import { pascalCase } from "../../../utils/names.js";
10
- import { addDependencyToTargetIfNotPresent, getGeneratorInfo, readProjectConfigurationUnqualified } from "../../../utils/nx.js";
10
+ import { addComponentGeneratorMetadata, addDependencyToTargetIfNotPresent, getGeneratorInfo, readProjectConfigurationUnqualified } from "../../../utils/nx.js";
11
+ import { toProjectRelativePath } from "../../../utils/paths.js";
11
12
  import { injectRdsCaBundleIntoDockerfile } from "../utils.js";
12
13
  export const TS_RDB_AGENT_CONNECTION_GENERATOR_INFO = getGeneratorInfo(import.meta.filename);
13
14
  export const tsRdbAgentConnectionGenerator = async (tree, options)=>{
@@ -57,6 +58,12 @@ export const tsRdbAgentConnectionGenerator = async (tree, options)=>{
57
58
  tree.write(agentPath, content.replace(dbDecl, `${dbDecl}\n ${onCall}`));
58
59
  }
59
60
  }
61
+ // Recorded so the version sync can identify this connection.
62
+ addComponentGeneratorMetadata(tree, sourceProject.name, TS_RDB_AGENT_CONNECTION_GENERATOR_INFO, toProjectRelativePath(sourceProject, agentPath), `${agentName}-${rdbNameCamel}`, // The source component this connection is made from, so the pair is
63
+ // identifiable rather than just the two projects.
64
+ {
65
+ sourcePath: options.sourceComponent?.path
66
+ });
60
67
  await addGeneratorMetricsIfApplicable(tree, [
61
68
  TS_RDB_AGENT_CONNECTION_GENERATOR_INFO
62
69
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/rdb/agent-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport camelCase from 'lodash.camelcase';\nimport { addDestructuredImport, applyGritQL } from '../../../utils/ast';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { pascalCase } from '../../../utils/names';\nimport {\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { injectRdsCaBundleIntoDockerfile } from '../utils';\nimport type { TsRdbAgentConnectionGeneratorSchema } from './schema';\n\nexport const TS_RDB_AGENT_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsRdbAgentConnectionGenerator = async (\n tree: Tree,\n options: TsRdbAgentConnectionGeneratorSchema,\n): Promise<void> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentName = options.sourceComponent?.name ?? 'agent';\n const devTarget = `${agentName}-dev`;\n\n if (sourceProject.targets?.[devTarget]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTarget, {\n projects: [targetProject.name],\n target: 'dev',\n });\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n const rdbBaseName = targetProject.name.split('/').pop();\n const rdbNameCamel = camelCase(rdbBaseName);\n const rdbNamePascal = pascalCase(rdbBaseName);\n const rdbPackageAlias = targetProject.name;\n const getterAlias = `getPrisma as get${rdbNamePascal}`;\n\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n 'src',\n agentName,\n );\n const agentPath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n // Dockerfile: install RDS CA bundle for direct Aurora SSL connections\n const dockerfilePath = joinPathFragments(agentSourceDir, 'Dockerfile');\n injectRdsCaBundleIntoDockerfile(tree, dockerfilePath);\n\n if (tree.exists(agentPath)) {\n await addDestructuredImport(\n tree,\n agentPath,\n [getterAlias],\n rdbPackageAlias,\n );\n\n // Block body form: export const getAgent = async () => { ... }\n await applyGritQL(\n tree,\n agentPath,\n `\\`export const getAgent = async () => { $body }\\` => raw\\`export const getAgent = async () => {\n const ${rdbNameCamel} = await get${rdbNamePascal}();\n $body\n}\\` where { $body <: not some \\`const ${rdbNameCamel} = await get${rdbNamePascal}()\\` }`,\n );\n\n // Expression body form: export const getAgent = async () => expr\n await applyGritQL(\n tree,\n agentPath,\n `\\`export const getAgent = async () => $expr\\` => raw\\`export const getAgent = async () => {\n const ${rdbNameCamel} = await get${rdbNamePascal}();\n return $expr;\n}\\` where { $expr <: not \\`{ $_ }\\` }`,\n );\n\n // Add $on error handler after the db declaration.\n // Done via string replacement because GritQL treats $on as a metavariable.\n const dbDecl = `const ${rdbNameCamel} = await get${rdbNamePascal}();`;\n const onCall = `${rdbNameCamel}.$on('error', console.error);`;\n const content = tree.read(agentPath, 'utf-8')!;\n if (content.includes(dbDecl) && !content.includes(`${rdbNameCamel}.$on`)) {\n tree.write(agentPath, content.replace(dbDecl, `${dbDecl}\\n ${onCall}`));\n }\n }\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_RDB_AGENT_CONNECTION_GENERATOR_INFO,\n ]);\n await formatFilesInSubtree(tree);\n};\n\nexport default tsRdbAgentConnectionGenerator;\n"],"names":["joinPathFragments","updateProjectConfiguration","camelCase","addDestructuredImport","applyGritQL","formatFilesInSubtree","addGeneratorMetricsIfApplicable","pascalCase","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","injectRdsCaBundleIntoDockerfile","TS_RDB_AGENT_CONNECTION_GENERATOR_INFO","filename","tsRdbAgentConnectionGenerator","tree","options","sourceProject","targetProject","agentName","sourceComponent","name","devTarget","targets","projects","target","rdbBaseName","split","pop","rdbNameCamel","rdbNamePascal","rdbPackageAlias","getterAlias","agentSourceDir","root","agentPath","dockerfilePath","exists","dbDecl","onCall","content","read","includes","write","replace"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,EAEjBC,0BAA0B,QACrB,aAAa;AACpB,OAAOC,eAAe,mBAAmB;AACzC,SAASC,qBAAqB,EAAEC,WAAW,QAAQ,wBAAqB;AACxE,SAASC,oBAAoB,QAAQ,2BAAwB;AAC7D,SAASC,+BAA+B,QAAQ,4BAAyB;AACzE,SAASC,UAAU,QAAQ,0BAAuB;AAClD,SACEC,iCAAiC,EACjCC,gBAAgB,EAEhBC,mCAAmC,QAC9B,uBAAoB;AAC3B,SAASC,+BAA+B,QAAQ,cAAW;AAG3D,OAAO,MAAMC,yCACXH,iBAAiB,YAAYI,QAAQ,EAAE;AAEzC,OAAO,MAAMC,gCAAgC,OAC3CC,MACAC;IAEA,MAAMC,gBAAgBP,oCACpBK,MACAC,QAAQC,aAAa;IAEvB,MAAMC,gBAAgBR,oCACpBK,MACAC,QAAQE,aAAa;IAGvB,MAAMC,YAAYH,QAAQI,eAAe,EAAEC,QAAQ;IACnD,MAAMC,YAAY,GAAGH,UAAU,IAAI,CAAC;IAEpC,IAAIF,cAAcM,OAAO,EAAE,CAACD,UAAU,EAAE;QACtCd,kCAAkCS,eAAeK,WAAW;YAC1DE,UAAU;gBAACN,cAAcG,IAAI;aAAC;YAC9BI,QAAQ;QACV;QACAxB,2BAA2Bc,MAAME,cAAcI,IAAI,EAAEJ;IACvD;IAEA,MAAMS,cAAcR,cAAcG,IAAI,CAACM,KAAK,CAAC,KAAKC,GAAG;IACrD,MAAMC,eAAe3B,UAAUwB;IAC/B,MAAMI,gBAAgBvB,WAAWmB;IACjC,MAAMK,kBAAkBb,cAAcG,IAAI;IAC1C,MAAMW,cAAc,CAAC,gBAAgB,EAAEF,eAAe;IAEtD,MAAMG,iBAAiBjC,kBACrBiB,cAAciB,IAAI,EAClB,OACAf;IAEF,MAAMgB,YAAYnC,kBAAkBiC,gBAAgB;IAEpD,sEAAsE;IACtE,MAAMG,iBAAiBpC,kBAAkBiC,gBAAgB;IACzDtB,gCAAgCI,MAAMqB;IAEtC,IAAIrB,KAAKsB,MAAM,CAACF,YAAY;QAC1B,MAAMhC,sBACJY,MACAoB,WACA;YAACH;SAAY,EACbD;QAGF,+DAA+D;QAC/D,MAAM3B,YACJW,MACAoB,WACA,CAAC;QACC,EAAEN,aAAa,YAAY,EAAEC,cAAc;;sCAEb,EAAED,aAAa,YAAY,EAAEC,cAAc,MAAM,CAAC;QAGpF,iEAAiE;QACjE,MAAM1B,YACJW,MACAoB,WACA,CAAC;QACC,EAAEN,aAAa,YAAY,EAAEC,cAAc;;qCAEd,CAAC;QAGlC,kDAAkD;QAClD,2EAA2E;QAC3E,MAAMQ,SAAS,CAAC,MAAM,EAAET,aAAa,YAAY,EAAEC,cAAc,GAAG,CAAC;QACrE,MAAMS,SAAS,GAAGV,aAAa,6BAA6B,CAAC;QAC7D,MAAMW,UAAUzB,KAAK0B,IAAI,CAACN,WAAW;QACrC,IAAIK,QAAQE,QAAQ,CAACJ,WAAW,CAACE,QAAQE,QAAQ,CAAC,GAAGb,aAAa,IAAI,CAAC,GAAG;YACxEd,KAAK4B,KAAK,CAACR,WAAWK,QAAQI,OAAO,CAACN,QAAQ,GAAGA,OAAO,IAAI,EAAEC,QAAQ;QACxE;IACF;IAEA,MAAMjC,gCAAgCS,MAAM;QAC1CH;KACD;IACD,MAAMP,qBAAqBU;AAC7B,EAAE;AAEF,eAAeD,8BAA8B"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/rdb/agent-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport camelCase from 'lodash.camelcase';\nimport { addDestructuredImport, applyGritQL } from '../../../utils/ast';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { pascalCase } from '../../../utils/names';\nimport {\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { toProjectRelativePath } from '../../../utils/paths';\nimport { injectRdsCaBundleIntoDockerfile } from '../utils';\nimport type { TsRdbAgentConnectionGeneratorSchema } from './schema';\n\nexport const TS_RDB_AGENT_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsRdbAgentConnectionGenerator = async (\n tree: Tree,\n options: TsRdbAgentConnectionGeneratorSchema,\n): Promise<void> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentName = options.sourceComponent?.name ?? 'agent';\n const devTarget = `${agentName}-dev`;\n\n if (sourceProject.targets?.[devTarget]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTarget, {\n projects: [targetProject.name],\n target: 'dev',\n });\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n const rdbBaseName = targetProject.name.split('/').pop();\n const rdbNameCamel = camelCase(rdbBaseName);\n const rdbNamePascal = pascalCase(rdbBaseName);\n const rdbPackageAlias = targetProject.name;\n const getterAlias = `getPrisma as get${rdbNamePascal}`;\n\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n 'src',\n agentName,\n );\n const agentPath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n // Dockerfile: install RDS CA bundle for direct Aurora SSL connections\n const dockerfilePath = joinPathFragments(agentSourceDir, 'Dockerfile');\n injectRdsCaBundleIntoDockerfile(tree, dockerfilePath);\n\n if (tree.exists(agentPath)) {\n await addDestructuredImport(\n tree,\n agentPath,\n [getterAlias],\n rdbPackageAlias,\n );\n\n // Block body form: export const getAgent = async () => { ... }\n await applyGritQL(\n tree,\n agentPath,\n `\\`export const getAgent = async () => { $body }\\` => raw\\`export const getAgent = async () => {\n const ${rdbNameCamel} = await get${rdbNamePascal}();\n $body\n}\\` where { $body <: not some \\`const ${rdbNameCamel} = await get${rdbNamePascal}()\\` }`,\n );\n\n // Expression body form: export const getAgent = async () => expr\n await applyGritQL(\n tree,\n agentPath,\n `\\`export const getAgent = async () => $expr\\` => raw\\`export const getAgent = async () => {\n const ${rdbNameCamel} = await get${rdbNamePascal}();\n return $expr;\n}\\` where { $expr <: not \\`{ $_ }\\` }`,\n );\n\n // Add $on error handler after the db declaration.\n // Done via string replacement because GritQL treats $on as a metavariable.\n const dbDecl = `const ${rdbNameCamel} = await get${rdbNamePascal}();`;\n const onCall = `${rdbNameCamel}.$on('error', console.error);`;\n const content = tree.read(agentPath, 'utf-8')!;\n if (content.includes(dbDecl) && !content.includes(`${rdbNameCamel}.$on`)) {\n tree.write(agentPath, content.replace(dbDecl, `${dbDecl}\\n ${onCall}`));\n }\n }\n\n // Recorded so the version sync can identify this connection.\n addComponentGeneratorMetadata(\n tree,\n sourceProject.name,\n TS_RDB_AGENT_CONNECTION_GENERATOR_INFO,\n toProjectRelativePath(sourceProject, agentPath),\n `${agentName}-${rdbNameCamel}`,\n // The source component this connection is made from, so the pair is\n // identifiable rather than just the two projects.\n { sourcePath: options.sourceComponent?.path },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_RDB_AGENT_CONNECTION_GENERATOR_INFO,\n ]);\n await formatFilesInSubtree(tree);\n};\n\nexport default tsRdbAgentConnectionGenerator;\n"],"names":["joinPathFragments","updateProjectConfiguration","camelCase","addDestructuredImport","applyGritQL","formatFilesInSubtree","addGeneratorMetricsIfApplicable","pascalCase","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","injectRdsCaBundleIntoDockerfile","TS_RDB_AGENT_CONNECTION_GENERATOR_INFO","filename","tsRdbAgentConnectionGenerator","tree","options","sourceProject","targetProject","agentName","sourceComponent","name","devTarget","targets","projects","target","rdbBaseName","split","pop","rdbNameCamel","rdbNamePascal","rdbPackageAlias","getterAlias","agentSourceDir","root","agentPath","dockerfilePath","exists","dbDecl","onCall","content","read","includes","write","replace","sourcePath","path"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,EAEjBC,0BAA0B,QACrB,aAAa;AACpB,OAAOC,eAAe,mBAAmB;AACzC,SAASC,qBAAqB,EAAEC,WAAW,QAAQ,wBAAqB;AACxE,SAASC,oBAAoB,QAAQ,2BAAwB;AAC7D,SAASC,+BAA+B,QAAQ,4BAAyB;AACzE,SAASC,UAAU,QAAQ,0BAAuB;AAClD,SACEC,6BAA6B,EAC7BC,iCAAiC,EACjCC,gBAAgB,EAEhBC,mCAAmC,QAC9B,uBAAoB;AAC3B,SAASC,qBAAqB,QAAQ,0BAAuB;AAC7D,SAASC,+BAA+B,QAAQ,cAAW;AAG3D,OAAO,MAAMC,yCACXJ,iBAAiB,YAAYK,QAAQ,EAAE;AAEzC,OAAO,MAAMC,gCAAgC,OAC3CC,MACAC;IAEA,MAAMC,gBAAgBR,oCACpBM,MACAC,QAAQC,aAAa;IAEvB,MAAMC,gBAAgBT,oCACpBM,MACAC,QAAQE,aAAa;IAGvB,MAAMC,YAAYH,QAAQI,eAAe,EAAEC,QAAQ;IACnD,MAAMC,YAAY,GAAGH,UAAU,IAAI,CAAC;IAEpC,IAAIF,cAAcM,OAAO,EAAE,CAACD,UAAU,EAAE;QACtCf,kCAAkCU,eAAeK,WAAW;YAC1DE,UAAU;gBAACN,cAAcG,IAAI;aAAC;YAC9BI,QAAQ;QACV;QACA1B,2BAA2BgB,MAAME,cAAcI,IAAI,EAAEJ;IACvD;IAEA,MAAMS,cAAcR,cAAcG,IAAI,CAACM,KAAK,CAAC,KAAKC,GAAG;IACrD,MAAMC,eAAe7B,UAAU0B;IAC/B,MAAMI,gBAAgBzB,WAAWqB;IACjC,MAAMK,kBAAkBb,cAAcG,IAAI;IAC1C,MAAMW,cAAc,CAAC,gBAAgB,EAAEF,eAAe;IAEtD,MAAMG,iBAAiBnC,kBACrBmB,cAAciB,IAAI,EAClB,OACAf;IAEF,MAAMgB,YAAYrC,kBAAkBmC,gBAAgB;IAEpD,sEAAsE;IACtE,MAAMG,iBAAiBtC,kBAAkBmC,gBAAgB;IACzDtB,gCAAgCI,MAAMqB;IAEtC,IAAIrB,KAAKsB,MAAM,CAACF,YAAY;QAC1B,MAAMlC,sBACJc,MACAoB,WACA;YAACH;SAAY,EACbD;QAGF,+DAA+D;QAC/D,MAAM7B,YACJa,MACAoB,WACA,CAAC;QACC,EAAEN,aAAa,YAAY,EAAEC,cAAc;;sCAEb,EAAED,aAAa,YAAY,EAAEC,cAAc,MAAM,CAAC;QAGpF,iEAAiE;QACjE,MAAM5B,YACJa,MACAoB,WACA,CAAC;QACC,EAAEN,aAAa,YAAY,EAAEC,cAAc;;qCAEd,CAAC;QAGlC,kDAAkD;QAClD,2EAA2E;QAC3E,MAAMQ,SAAS,CAAC,MAAM,EAAET,aAAa,YAAY,EAAEC,cAAc,GAAG,CAAC;QACrE,MAAMS,SAAS,GAAGV,aAAa,6BAA6B,CAAC;QAC7D,MAAMW,UAAUzB,KAAK0B,IAAI,CAACN,WAAW;QACrC,IAAIK,QAAQE,QAAQ,CAACJ,WAAW,CAACE,QAAQE,QAAQ,CAAC,GAAGb,aAAa,IAAI,CAAC,GAAG;YACxEd,KAAK4B,KAAK,CAACR,WAAWK,QAAQI,OAAO,CAACN,QAAQ,GAAGA,OAAO,IAAI,EAAEC,QAAQ;QACxE;IACF;IAEA,6DAA6D;IAC7DjC,8BACES,MACAE,cAAcI,IAAI,EAClBT,wCACAF,sBAAsBO,eAAekB,YACrC,GAAGhB,UAAU,CAAC,EAAEU,cAAc,EAC9B,oEAAoE;IACpE,kDAAkD;IAClD;QAAEgB,YAAY7B,QAAQI,eAAe,EAAE0B;IAAK;IAG9C,MAAM1C,gCAAgCW,MAAM;QAC1CH;KACD;IACD,MAAMT,qBAAqBY;AAC7B,EAAE;AAEF,eAAeD,8BAA8B"}
@@ -1,6 +1,107 @@
1
1
  import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
2
  import { type NxGeneratorInfo } from '../../utils/nx';
3
+ import { type IacMetadata } from '../../utils/shared-constructs-constants';
3
4
  import type { TsRdbGeneratorSchema } from './schema';
5
+ /** The metadata this generator records, which its predicates read. */
6
+ export interface TsRdbMetadata extends IacMetadata {
7
+ readonly engine: TsRdbGeneratorSchema['engine'];
8
+ }
9
+ export declare const DEPENDENCIES: import("../../utils/declared-dependencies").DependencyDeclaration<readonly [{
10
+ readonly name: "@aws-lambda-powertools/parameters";
11
+ }, {
12
+ readonly name: "@aws-sdk/client-appconfigdata";
13
+ }, {
14
+ readonly name: "@aws-sdk/client-secrets-manager";
15
+ }, {
16
+ readonly name: "@aws-sdk/rds-signer";
17
+ }, {
18
+ readonly name: "@prisma/client";
19
+ }, {
20
+ readonly name: "@prisma/adapter-mariadb";
21
+ readonly when: (m: TsRdbMetadata) => boolean;
22
+ }, {
23
+ readonly name: "mariadb";
24
+ readonly when: (m: TsRdbMetadata) => boolean;
25
+ }, {
26
+ readonly name: "@prisma/adapter-pg";
27
+ readonly when: (m: TsRdbMetadata) => boolean;
28
+ }, {
29
+ readonly name: "pg";
30
+ readonly when: (m: TsRdbMetadata) => boolean;
31
+ }, {
32
+ readonly name: "@types/aws-lambda";
33
+ readonly dev: true;
34
+ }, {
35
+ readonly name: "@types/pg";
36
+ readonly when: (m: TsRdbMetadata) => boolean;
37
+ readonly dev: true;
38
+ }, {
39
+ readonly name: "prisma";
40
+ readonly dev: true;
41
+ readonly root: true;
42
+ }, {
43
+ readonly name: "tsx";
44
+ readonly dev: true;
45
+ readonly root: true;
46
+ }, {
47
+ readonly name: "rolldown";
48
+ } & {
49
+ versionOnly: true;
50
+ }, {
51
+ readonly name: "ncp";
52
+ } & {
53
+ versionOnly: true;
54
+ }, {
55
+ readonly name: "rimraf";
56
+ } & {
57
+ versionOnly: true;
58
+ }, {
59
+ readonly name: "make-dir-cli";
60
+ } & {
61
+ versionOnly: true;
62
+ }, {
63
+ readonly name: "ncp";
64
+ } & {
65
+ versionOnly: true;
66
+ }, {
67
+ readonly name: "rimraf";
68
+ } & {
69
+ versionOnly: true;
70
+ }, {
71
+ readonly name: "make-dir-cli";
72
+ } & {
73
+ versionOnly: true;
74
+ }, {
75
+ readonly name: "constructs";
76
+ readonly when: (m: IacMetadata) => boolean;
77
+ } & {
78
+ versionOnly: true;
79
+ }, {
80
+ readonly name: "aws-cdk-lib";
81
+ readonly when: (m: IacMetadata) => boolean;
82
+ } & {
83
+ versionOnly: true;
84
+ }, {
85
+ readonly name: "@types/node";
86
+ } & {
87
+ versionOnly: true;
88
+ }, {
89
+ readonly name: "pg";
90
+ } & {
91
+ versionOnly: true;
92
+ }, {
93
+ readonly name: "@types/pg";
94
+ } & {
95
+ versionOnly: true;
96
+ }, {
97
+ readonly name: "mariadb";
98
+ } & {
99
+ versionOnly: true;
100
+ }, {
101
+ readonly name: "tsx";
102
+ } & {
103
+ versionOnly: true;
104
+ }], readonly import("../../utils/declared-dependencies").DeclaredPyDependency<"a2a-sdk" | "ag-ui-langgraph" | "ag-ui-protocol" | "ag-ui-strands" | "aws-lambda-powertools" | "aws-lambda-powertools[tracer]" | "aws-lambda-powertools[parser]" | "aws-opentelemetry-distro" | "bedrock-agentcore" | "boto3" | "checkov" | "fastapi" | "fastapi[standard]" | "httpx" | "langchain" | "langchain-aws" | "langchain-mcp-adapters" | "langgraph" | "mcp" | "pip-check-updates" | "pip-licenses" | "ruff" | "strands-agents" | "strands-agents[a2a]" | "strands-agents-tools" | "ty" | "pynamodb" | "uvicorn" | "sqlmodel" | "alembic" | "aiomysql" | "asyncpg" | "greenlet", TsRdbMetadata>[]>;
4
105
  export declare const TS_RDB_GENERATOR_INFO: NxGeneratorInfo;
5
106
  export declare const tsRdbGenerator: (tree: Tree, options: TsRdbGeneratorSchema) => Promise<GeneratorCallback>;
6
107
  export default tsRdbGenerator;