@aws/nx-plugin 1.0.0-rc.89 → 1.0.0-rc.90

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 (148) hide show
  1. package/README.md +22 -22
  2. package/executors.json +5 -0
  3. package/generators.json +2 -1
  4. package/migrations.json +47 -2
  5. package/package.json +1 -1
  6. package/src/infra/app/__snapshots__/generator.spec.ts.snap +24 -12
  7. package/src/infra/app/generator.js +9 -7
  8. package/src/infra/app/generator.js.map +1 -1
  9. package/src/mcp-server/generator-info.d.ts +5 -0
  10. package/src/mcp-server/generator-info.js +6 -2
  11. package/src/mcp-server/generator-info.js.map +1 -1
  12. package/src/migrations/latest/add-assemble-target/metadata.json +3 -0
  13. package/src/migrations/latest/add-assemble-target/migration.d.ts +6 -0
  14. package/src/migrations/latest/add-assemble-target/migration.js +241 -0
  15. package/src/migrations/latest/add-assemble-target/migration.js.map +1 -0
  16. package/src/migrations/latest/declare-cacheable-target-inputs/metadata.json +3 -0
  17. package/src/migrations/latest/declare-cacheable-target-inputs/migration.d.ts +6 -0
  18. package/src/migrations/latest/declare-cacheable-target-inputs/migration.js +94 -0
  19. package/src/migrations/latest/declare-cacheable-target-inputs/migration.js.map +1 -0
  20. package/src/migrations/latest/dev-target-depends-on-pull-image/metadata.json +3 -0
  21. package/src/migrations/latest/dev-target-depends-on-pull-image/migration.d.ts +6 -0
  22. package/src/migrations/latest/dev-target-depends-on-pull-image/migration.js +67 -0
  23. package/src/migrations/latest/dev-target-depends-on-pull-image/migration.js.map +1 -0
  24. package/src/migrations/latest/docker-target-cache-soundness/metadata.json +3 -0
  25. package/src/migrations/latest/docker-target-cache-soundness/migration.d.ts +6 -0
  26. package/src/migrations/latest/docker-target-cache-soundness/migration.js +95 -0
  27. package/src/migrations/latest/docker-target-cache-soundness/migration.js.map +1 -0
  28. package/src/migrations/latest/open-api-codegen-executor/metadata.json +3 -0
  29. package/src/migrations/latest/open-api-codegen-executor/migration.d.ts +6 -0
  30. package/src/migrations/latest/open-api-codegen-executor/migration.js +100 -0
  31. package/src/migrations/latest/open-api-codegen-executor/migration.js.map +1 -0
  32. package/src/migrations/latest/python-test-input-scoping/metadata.json +3 -0
  33. package/src/migrations/latest/python-test-input-scoping/migration.d.ts +6 -0
  34. package/src/migrations/latest/python-test-input-scoping/migration.js +142 -0
  35. package/src/migrations/latest/python-test-input-scoping/migration.js.map +1 -0
  36. package/src/migrations/latest/terraform-fmt-check/metadata.json +3 -0
  37. package/src/migrations/latest/terraform-fmt-check/migration.d.ts +6 -0
  38. package/src/migrations/latest/terraform-fmt-check/migration.js +165 -0
  39. package/src/migrations/latest/terraform-fmt-check/migration.js.map +1 -0
  40. package/src/migrations/latest/terraform-provider-plugin-cache/metadata.json +3 -0
  41. package/src/migrations/latest/terraform-provider-plugin-cache/migration.d.ts +6 -0
  42. package/src/migrations/latest/terraform-provider-plugin-cache/migration.js +164 -0
  43. package/src/migrations/latest/terraform-provider-plugin-cache/migration.js.map +1 -0
  44. package/src/migrations/latest/vitest-coverage-output-dir/metadata.json +3 -0
  45. package/src/migrations/latest/vitest-coverage-output-dir/migration.d.ts +6 -0
  46. package/src/migrations/latest/vitest-coverage-output-dir/migration.js +177 -0
  47. package/src/migrations/latest/vitest-coverage-output-dir/migration.js.map +1 -0
  48. package/src/open-api/codegen/executor-schema.d.js +6 -0
  49. package/src/open-api/codegen/executor-schema.d.js.map +1 -0
  50. package/src/open-api/codegen/executor-schema.d.ts +18 -0
  51. package/src/open-api/codegen/executor-schema.json +33 -0
  52. package/src/open-api/codegen/executor.d.ts +18 -0
  53. package/src/open-api/codegen/executor.js +56 -0
  54. package/src/open-api/codegen/executor.js.map +1 -0
  55. package/src/preset/__snapshots__/generator.spec.ts.snap +2 -1
  56. package/src/py/agent/generator.js +21 -22
  57. package/src/py/agent/generator.js.map +1 -1
  58. package/src/py/agent/react-connection/generator.js +9 -0
  59. package/src/py/agent/react-connection/generator.js.map +1 -1
  60. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +0 -30
  61. package/src/py/fast-api/react/open-api.js +19 -7
  62. package/src/py/fast-api/react/open-api.js.map +1 -1
  63. package/src/py/mcp-server/generator.js +4 -4
  64. package/src/py/mcp-server/generator.js.map +1 -1
  65. package/src/py/project/generator.d.ts +9 -0
  66. package/src/py/project/generator.js +51 -1
  67. package/src/py/project/generator.js.map +1 -1
  68. package/src/py/rdb/generator.js +10 -4
  69. package/src/py/rdb/generator.js.map +1 -1
  70. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +15 -0
  71. package/src/smithy/project/generator.js +10 -0
  72. package/src/smithy/project/generator.js.map +1 -1
  73. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +7 -0
  74. package/src/terraform/project/files/application/scripts/env.ts.template +11 -0
  75. package/src/terraform/project/files/application/scripts/init.ts.template +2 -1
  76. package/src/terraform/project/files/application/src/providers.tf.template +2 -2
  77. package/src/terraform/project/generator.d.ts +11 -1
  78. package/src/terraform/project/generator.js +104 -20
  79. package/src/terraform/project/generator.js.map +1 -1
  80. package/src/trpc/backend/generator.js +2 -2
  81. package/src/trpc/backend/generator.js.map +1 -1
  82. package/src/ts/agent/generator.js +4 -7
  83. package/src/ts/agent/generator.js.map +1 -1
  84. package/src/ts/astro-docs/generator.js +5 -0
  85. package/src/ts/astro-docs/generator.js.map +1 -1
  86. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +0 -30
  87. package/src/ts/dynamodb/generator.js +3 -0
  88. package/src/ts/dynamodb/generator.js.map +1 -1
  89. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +10 -1
  90. package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +1 -1
  91. package/src/ts/lib/generator.d.ts +16 -0
  92. package/src/ts/lib/generator.js +31 -5
  93. package/src/ts/lib/generator.js.map +1 -1
  94. package/src/ts/lib/vitest.d.ts +11 -0
  95. package/src/ts/lib/vitest.js +31 -2
  96. package/src/ts/lib/vitest.js.map +1 -1
  97. package/src/ts/mcp-server/generator.js +4 -7
  98. package/src/ts/mcp-server/generator.js.map +1 -1
  99. package/src/ts/rdb/generator.js +8 -5
  100. package/src/ts/rdb/generator.js.map +1 -1
  101. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +27 -11
  102. package/src/ts/react-website/app/generator.js +9 -1
  103. package/src/ts/react-website/app/generator.js.map +1 -1
  104. package/src/ts/sync/generator.js +19 -2
  105. package/src/ts/sync/generator.js.map +1 -1
  106. package/src/utils/agent-core-constructs/agent-core-constructs.js +3 -3
  107. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  108. package/src/utils/api-constructs/api-constructs.js +2 -2
  109. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  110. package/src/utils/api-constructs/open-api-metadata.js +15 -36
  111. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  112. package/src/utils/api-constructs/trpc-operations-metadata.js +9 -3
  113. package/src/utils/api-constructs/trpc-operations-metadata.js.map +1 -1
  114. package/src/utils/bundle/bundle.js +13 -4
  115. package/src/utils/bundle/bundle.js.map +1 -1
  116. package/src/utils/connection/open-api/react.js +7 -17
  117. package/src/utils/connection/open-api/react.js.map +1 -1
  118. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js +2 -2
  119. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js.map +1 -1
  120. package/src/utils/docker.d.ts +22 -10
  121. package/src/utils/docker.js +27 -17
  122. package/src/utils/docker.js.map +1 -1
  123. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +2 -2
  124. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
  125. package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +0 -15
  126. package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +0 -15
  127. package/src/utils/format.d.ts +5 -0
  128. package/src/utils/format.js +5 -0
  129. package/src/utils/format.js.map +1 -1
  130. package/src/utils/function-constructs/function-constructs.js +2 -2
  131. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  132. package/src/utils/generators.d.ts +33 -0
  133. package/src/utils/generators.js +18 -3
  134. package/src/utils/generators.js.map +1 -1
  135. package/src/utils/init.js +4 -6
  136. package/src/utils/init.js.map +1 -1
  137. package/src/utils/mock-project-graph.js +5 -2
  138. package/src/utils/mock-project-graph.js.map +1 -1
  139. package/src/utils/nx.d.ts +19 -0
  140. package/src/utils/nx.js +23 -0
  141. package/src/utils/nx.js.map +1 -1
  142. package/src/utils/open-api-codegen-target.d.ts +28 -0
  143. package/src/utils/open-api-codegen-target.js +31 -0
  144. package/src/utils/open-api-codegen-target.js.map +1 -0
  145. package/src/utils/rdb-constructs/rdb-constructs.js +2 -2
  146. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  147. package/src/utils/website-constructs/website-constructs.js +2 -2
  148. package/src/utils/website-constructs/website-constructs.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/lib/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 type NxJsonConfiguration,\n OverwriteStrategy,\n readProjectConfiguration,\n type TargetConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { libraryGenerator } from '@nx/js';\nimport { declareDependencies } from '../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport { toKebabCase } from '../../utils/names.js';\nimport { getNpmScopePrefix } from '../../utils/npm-scope.js';\nimport {\n addGeneratorMetadata,\n getGeneratorInfo,\n mergeTargetDefault,\n type NxGeneratorInfo,\n projectExists,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport { getPackageManagerDisplayCommands } from '../../utils/pkg-manager.js';\nimport type { TsProjectGeneratorSchema } from './schema';\nimport { configureTsProject } from './ts-project-utils.js';\nimport { VITEST_DEPENDENCIES } from './vitest.js';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [...VITEST_DEPENDENCIES],\n});\n\nexport const TS_LIB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport interface TsLibDetails {\n /**\n * Full package name including scope (eg @foo/bar)\n */\n readonly fullyQualifiedName: string;\n /**\n * Directory of the library relative to the root\n */\n readonly dir: string;\n}\n\n/**\n * Returns details about the TS library to be created\n */\nexport const getTsLibDetails = (\n tree: Tree,\n schema: TsProjectGeneratorSchema,\n): TsLibDetails => {\n const scope = getNpmScopePrefix(tree);\n const normalizedName = toKebabCase(schema.name);\n const fullyQualifiedName = `${scope}${normalizedName}`;\n // NB: interactive nx generator cli can pass empty string\n const dir = joinPathFragments(\n schema.directory || '.',\n schema.subDirectory || normalizedName,\n );\n return { dir, fullyQualifiedName };\n};\n\n/**\n * Generates a typescript project\n */\nexport const tsProjectGenerator = async (\n tree: Tree,\n schema: TsProjectGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, schema);\n // The module format is workspace-wide, established by the preset when the\n // workspace is created, so vending generators always infer it from the tree.\n const esm = isEsmWorkspace(tree);\n\n // Only scaffold the project on first run; on re-run skip creation so user\n // edits are preserved, but continue to (re)apply the configuration below.\n if (!projectExists(tree, fullyQualifiedName)) {\n await libraryGenerator(tree, {\n ...schema,\n name: fullyQualifiedName,\n directory: dir,\n skipPackageJson: true,\n bundler: 'tsc', // TODO: consider supporting others\n linter: 'none',\n unitTestRunner: 'vitest',\n // Register the @nx/vitest plugin so the test target is inferred rather\n // than emitting the deprecated @nx/vitest:test executor target.\n addPlugin: true,\n });\n\n // Replace with simpler sample source code\n tree.delete(joinPathFragments(dir, 'src'));\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n joinPathFragments(dir),\n {\n fullyQualifiedName,\n esm,\n pkgMgrCmd: getPackageManagerDisplayCommands().exec,\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n await configureTsProject(\n tree,\n {\n dir,\n fullyQualifiedName,\n esm,\n },\n DEPENDENCIES,\n );\n\n const projectConfiguration = readProjectConfiguration(\n tree,\n fullyQualifiedName,\n );\n const targets = projectConfiguration.targets;\n\n targets['compile'] = {\n executor: 'nx:run-commands',\n outputs: ['{workspaceRoot}/dist/{projectRoot}/tsc'],\n options: {\n command: 'tsc --build tsconfig.lib.json',\n cwd: '{projectRoot}',\n },\n };\n targets['build'] = {\n dependsOn: ['lint', 'compile', 'test'],\n };\n projectConfiguration.targets = sortObjectKeys(targets);\n\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfiguration);\n\n addGeneratorMetadata(tree, fullyQualifiedName, TS_LIB_GENERATOR_INFO);\n\n updateJson(tree, 'nx.json', (nxJson: NxJsonConfiguration) => {\n nxJson.namedInputs = {\n ...nxJson.namedInputs,\n default: [\n ...(nxJson.namedInputs?.default ?? []).filter(\n (input) =>\n typeof input !== 'object' ||\n !('dependentTasksOutputFiles' in input) ||\n !(input.dependentTasksOutputFiles === '**/*' && input.transitive),\n ),\n {\n dependentTasksOutputFiles: '**/*',\n transitive: true,\n },\n ],\n };\n\n const withDefaultInput = (base: Partial<TargetConfiguration>) => ({\n ...base,\n inputs: [\n ...(base.inputs ?? []).filter((i) => i !== 'default'),\n 'default',\n ],\n });\n\n nxJson.targetDefaults = {\n ...nxJson.targetDefaults,\n compile: mergeTargetDefault(nxJson.targetDefaults?.compile, (base) => ({\n cache: true,\n ...withDefaultInput(base),\n })),\n build: mergeTargetDefault(nxJson.targetDefaults?.build, (base) => ({\n cache: true,\n ...withDefaultInput(base),\n })),\n test: mergeTargetDefault(nxJson.targetDefaults?.test, withDefaultInput),\n };\n\n // Ensure we only declare a single typescript plugin with the correct settings\n nxJson.plugins = [\n {\n plugin: '@nx/js/typescript',\n options: {\n typecheck: {\n targetName: 'typecheck',\n },\n build: {\n targetName: 'compile',\n configName: 'tsconfig.lib.json',\n buildDepsName: 'build-deps',\n watchDepsName: 'watch-deps',\n },\n },\n },\n ...(nxJson.plugins ?? []).filter(\n (p) => typeof p === 'string' || p.plugin !== '@nx/js/typescript',\n ),\n ];\n\n return nxJson;\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_LIB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n\n // `installDependencies` ensures vitest resolves for the `typescript` language (the\n // generated vitest.config.mts imports it and Nx loads that config when\n // computing the project graph), so a deferred install still runs when needed.\n return () =>\n installDependencies(tree, schema.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\nexport default tsProjectGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateJson","updateProjectConfiguration","libraryGenerator","declareDependencies","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","isEsmWorkspace","toKebabCase","getNpmScopePrefix","addGeneratorMetadata","getGeneratorInfo","mergeTargetDefault","projectExists","sortObjectKeys","getPackageManagerDisplayCommands","configureTsProject","VITEST_DEPENDENCIES","DEPENDENCIES","ts","TS_LIB_GENERATOR_INFO","filename","getTsLibDetails","tree","schema","scope","normalizedName","name","fullyQualifiedName","dir","directory","subDirectory","tsProjectGenerator","esm","skipPackageJson","bundler","linter","unitTestRunner","addPlugin","delete","dirname","pkgMgrCmd","exec","overwriteStrategy","KeepExisting","projectConfiguration","targets","executor","outputs","options","command","cwd","dependsOn","nxJson","namedInputs","default","filter","input","dependentTasksOutputFiles","transitive","withDefaultInput","base","inputs","i","targetDefaults","compile","cache","build","test","plugins","plugin","typecheck","targetName","configName","buildDepsName","watchDepsName","p","preferInstallDependencies","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/lib/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 type NxJsonConfiguration,\n OverwriteStrategy,\n readProjectConfiguration,\n type TargetConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { libraryGenerator } from '@nx/js';\nimport { declareDependencies } from '../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport { toKebabCase } from '../../utils/names.js';\nimport { getNpmScopePrefix } from '../../utils/npm-scope.js';\nimport {\n addGeneratorMetadata,\n getGeneratorInfo,\n mergeTargetDefault,\n type NxGeneratorInfo,\n projectExists,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport { getPackageManagerDisplayCommands } from '../../utils/pkg-manager.js';\nimport type { TsProjectGeneratorSchema } from './schema';\nimport { configureTsProject } from './ts-project-utils.js';\nimport { VITEST_DEPENDENCIES } from './vitest.js';\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [...VITEST_DEPENDENCIES],\n});\n\nexport const TS_LIB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\n/**\n * Consumes build artifacts produced by a project's dependencies, so a task\n * re-runs when the output it actually reads changes.\n *\n * Test reports are excluded rather than build artifacts included: several\n * generators emit generated sources outside `dist` (an OpenAPI client under a\n * website's `src/generated`, a Smithy SSDK, the Prisma client) and add them to\n * `.gitignore`, which keeps them out of the project's own fileset — so this\n * input is the only thing that hashes them. `reports/` and `coverage/` hold\n * pytest's JUnit and coverage XML, which carry a wall-clock timestamp and so\n * mint a fresh hash on every test run that would cascade through the graph.\n */\nexport const DEPENDENT_TASKS_OUTPUT_FILES_INPUT = {\n dependentTasksOutputFiles: '!{reports,coverage}/**',\n transitive: true,\n};\n\n// Globs this generator has vended for the dependent-task-output input. Any of\n// them is replaced in place, so the entry is neither duplicated nor left at a\n// different scope when a generator re-runs.\nconst VENDED_DEPENDENT_TASKS_OUTPUT_GLOBS = [\n '**/*',\n 'dist/**',\n DEPENDENT_TASKS_OUTPUT_FILES_INPUT.dependentTasksOutputFiles,\n];\n\nexport interface TsLibDetails {\n /**\n * Full package name including scope (eg @foo/bar)\n */\n readonly fullyQualifiedName: string;\n /**\n * Directory of the library relative to the root\n */\n readonly dir: string;\n}\n\n/**\n * Returns details about the TS library to be created\n */\nexport const getTsLibDetails = (\n tree: Tree,\n schema: TsProjectGeneratorSchema,\n): TsLibDetails => {\n const scope = getNpmScopePrefix(tree);\n const normalizedName = toKebabCase(schema.name);\n const fullyQualifiedName = `${scope}${normalizedName}`;\n // NB: interactive nx generator cli can pass empty string\n const dir = joinPathFragments(\n schema.directory || '.',\n schema.subDirectory || normalizedName,\n );\n return { dir, fullyQualifiedName };\n};\n\n/**\n * Generates a typescript project\n */\nexport const tsProjectGenerator = async (\n tree: Tree,\n schema: TsProjectGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, schema);\n // The module format is workspace-wide, established by the preset when the\n // workspace is created, so vending generators always infer it from the tree.\n const esm = isEsmWorkspace(tree);\n\n // Only scaffold the project on first run; on re-run skip creation so user\n // edits are preserved, but continue to (re)apply the configuration below.\n if (!projectExists(tree, fullyQualifiedName)) {\n await libraryGenerator(tree, {\n ...schema,\n name: fullyQualifiedName,\n directory: dir,\n skipPackageJson: true,\n bundler: 'tsc', // TODO: consider supporting others\n linter: 'none',\n unitTestRunner: 'vitest',\n // Register the @nx/vitest plugin so the test target is inferred rather\n // than emitting the deprecated @nx/vitest:test executor target.\n addPlugin: true,\n });\n\n // Replace with simpler sample source code\n tree.delete(joinPathFragments(dir, 'src'));\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n joinPathFragments(dir),\n {\n fullyQualifiedName,\n esm,\n pkgMgrCmd: getPackageManagerDisplayCommands().exec,\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n await configureTsProject(\n tree,\n {\n dir,\n fullyQualifiedName,\n esm,\n },\n DEPENDENCIES,\n );\n\n const projectConfiguration = readProjectConfiguration(\n tree,\n fullyQualifiedName,\n );\n const targets = projectConfiguration.targets;\n\n targets['compile'] = {\n executor: 'nx:run-commands',\n outputs: ['{workspaceRoot}/dist/{projectRoot}/tsc'],\n options: {\n command: 'tsc --build tsconfig.lib.json',\n cwd: '{projectRoot}',\n },\n };\n targets['build'] = {\n dependsOn: ['lint', 'compile', 'test'],\n };\n // The artifact-only sibling of build, which the deploy targets depend on.\n targets['assemble'] = {\n dependsOn: ['compile'],\n };\n projectConfiguration.targets = sortObjectKeys(targets);\n\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfiguration);\n\n addGeneratorMetadata(tree, fullyQualifiedName, TS_LIB_GENERATOR_INFO);\n\n updateJson(tree, 'nx.json', (nxJson: NxJsonConfiguration) => {\n nxJson.namedInputs = {\n ...nxJson.namedInputs,\n default: [\n ...(nxJson.namedInputs?.default ?? []).filter(\n (input) =>\n typeof input !== 'object' ||\n !('dependentTasksOutputFiles' in input) ||\n !(\n VENDED_DEPENDENT_TASKS_OUTPUT_GLOBS.includes(\n input.dependentTasksOutputFiles as string,\n ) && input.transitive\n ),\n ),\n DEPENDENT_TASKS_OUTPUT_FILES_INPUT,\n ],\n };\n\n const withDefaultInput = (base: Partial<TargetConfiguration>) => ({\n ...base,\n inputs: [\n ...(base.inputs ?? []).filter((i) => i !== 'default'),\n 'default',\n ],\n });\n\n nxJson.targetDefaults = {\n ...nxJson.targetDefaults,\n compile: mergeTargetDefault(nxJson.targetDefaults?.compile, (base) => ({\n cache: true,\n ...withDefaultInput(base),\n })),\n build: mergeTargetDefault(nxJson.targetDefaults?.build, (base) => ({\n cache: true,\n ...withDefaultInput(base),\n })),\n test: mergeTargetDefault(nxJson.targetDefaults?.test, withDefaultInput),\n };\n\n // Ensure we only declare a single typescript plugin with the correct settings\n nxJson.plugins = [\n {\n plugin: '@nx/js/typescript',\n options: {\n typecheck: {\n targetName: 'typecheck',\n },\n build: {\n targetName: 'compile',\n configName: 'tsconfig.lib.json',\n buildDepsName: 'build-deps',\n watchDepsName: 'watch-deps',\n },\n },\n },\n ...(nxJson.plugins ?? []).filter(\n (p) => typeof p === 'string' || p.plugin !== '@nx/js/typescript',\n ),\n ];\n\n return nxJson;\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_LIB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n\n // `installDependencies` ensures vitest resolves for the `typescript` language (the\n // generated vitest.config.mts imports it and Nx loads that config when\n // computing the project graph), so a deferred install still runs when needed.\n return () =>\n installDependencies(tree, schema.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\nexport default tsProjectGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateJson","updateProjectConfiguration","libraryGenerator","declareDependencies","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","isEsmWorkspace","toKebabCase","getNpmScopePrefix","addGeneratorMetadata","getGeneratorInfo","mergeTargetDefault","projectExists","sortObjectKeys","getPackageManagerDisplayCommands","configureTsProject","VITEST_DEPENDENCIES","DEPENDENCIES","ts","TS_LIB_GENERATOR_INFO","filename","DEPENDENT_TASKS_OUTPUT_FILES_INPUT","dependentTasksOutputFiles","transitive","VENDED_DEPENDENT_TASKS_OUTPUT_GLOBS","getTsLibDetails","tree","schema","scope","normalizedName","name","fullyQualifiedName","dir","directory","subDirectory","tsProjectGenerator","esm","skipPackageJson","bundler","linter","unitTestRunner","addPlugin","delete","dirname","pkgMgrCmd","exec","overwriteStrategy","KeepExisting","projectConfiguration","targets","executor","outputs","options","command","cwd","dependsOn","nxJson","namedInputs","default","filter","input","includes","withDefaultInput","base","inputs","i","targetDefaults","compile","cache","build","test","plugins","plugin","typecheck","targetName","configName","buildDepsName","watchDepsName","p","preferInstallDependencies","languages"],"mappings":"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"}
@@ -5,6 +5,17 @@
5
5
  import { type Tree } from '@nx/devkit';
6
6
  import { type DependencyDeclaration, type MustDeclare } from '../../utils/declared-dependencies.js';
7
7
  import type { ConfigureProjectOptions } from './types.js';
8
+ /** The `reportsDirectory` `@nx/vitest` writes, resolved against the project root. */
9
+ export declare const GENERATED_REPORTS_DIRECTORY = "./test-output/vitest/coverage";
10
+ /**
11
+ * The coverage directory for a project, as a path relative to the project root
12
+ * (vitest resolves `reportsDirectory` against the config's `root`).
13
+ *
14
+ * Coverage lands under the workspace's `dist` rather than inside the project, so
15
+ * the HTML reporter's vendored assets are neither formatted by the `format`
16
+ * target nor counted as an input to the project's own tasks.
17
+ */
18
+ export declare const getCoverageReportsDirectory: (dir: string) => string;
8
19
  /** Dependencies a caller must declare to configure vitest. */
9
20
  export declare const VITEST_DEPENDENCIES: readonly [{
10
21
  readonly name: "vite";
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { readNxJson, updateNxJson } from "@nx/devkit";
4
+ */ import { joinPathFragments, readNxJson, updateNxJson } from "@nx/devkit";
5
5
  import { readFileSync } from "fs";
6
- import { join } from "path";
6
+ import { join, relative } from "path";
7
7
  import { applyGritQL } from "../../utils/ast.js";
8
8
  import { forDependencies } from "../../utils/declared-dependencies.js";
9
9
  import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
@@ -20,6 +20,34 @@ const readGritPattern = (name)=>readFileSync(join(import.meta.dirname, 'grit', `
20
20
  $props <: some \`root: __dirname\` as $root,
21
21
  $root => \`root: import.meta.dirname\`
22
22
  }`;
23
+ /** The `reportsDirectory` `@nx/vitest` writes, resolved against the project root. */ export const GENERATED_REPORTS_DIRECTORY = './test-output/vitest/coverage';
24
+ /**
25
+ * The coverage directory for a project, as a path relative to the project root
26
+ * (vitest resolves `reportsDirectory` against the config's `root`).
27
+ *
28
+ * Coverage lands under the workspace's `dist` rather than inside the project, so
29
+ * the HTML reporter's vendored assets are neither formatted by the `format`
30
+ * target nor counted as an input to the project's own tasks.
31
+ */ export const getCoverageReportsDirectory = (dir)=>joinPathFragments(relative(join('/', dir), '/'), 'dist', dir, 'test-output/vitest/coverage');
32
+ /**
33
+ * Point coverage at the project's `dist` directory.
34
+ *
35
+ * `@nx/vitest` writes `reportsDirectory: './test-output/vitest/coverage'`, which
36
+ * resolves inside the project. Coverage is off by default, so the directory is
37
+ * dormant until someone runs `vitest --coverage` — at which point the HTML
38
+ * reporter's bundled third-party scripts land in the project, where the `format`
39
+ * target reformats them (failing the build from then on) and the `default` named
40
+ * input counts them, so no task in the project can ever be cached again.
41
+ *
42
+ * Anchored to the exact literal `@nx/vitest` generates, and scoped to the
43
+ * `coverage` block of the config's own `test` object, so a directory the user has
44
+ * repointed is left alone.
45
+ */ const coverageReportsDirectoryPattern = (dir)=>`\`test: { $props }\` where {
46
+ $props <: within \`defineConfig($_)\`,
47
+ $props <: some \`coverage: { $cov }\`,
48
+ $cov <: some \`reportsDirectory: '${GENERATED_REPORTS_DIRECTORY}'\` as $reportsDirectory,
49
+ $reportsDirectory => \`reportsDirectory: '${getCoverageReportsDirectory(dir)}'\`
50
+ }`;
23
51
  /** Dependencies a caller must declare to configure vitest. */ export const VITEST_DEPENDENCIES = [
24
52
  {
25
53
  name: 'vite'
@@ -40,6 +68,7 @@ export const configureVitest = async (tree, options, declaration)=>{
40
68
  if (configPath) {
41
69
  await applyGritQL(tree, configPath, readGritPattern('vitest-pass-with-no-tests'));
42
70
  await applyGritQL(tree, configPath, ROOT_IMPORT_META_DIRNAME);
71
+ await applyGritQL(tree, configPath, coverageReportsDirectoryPattern(options.dir));
43
72
  const nxJson = readNxJson(tree);
44
73
  updateNxJson(tree, {
45
74
  ...nxJson,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/lib/vitest.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { readNxJson, type Tree, updateNxJson } from '@nx/devkit';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport { applyGritQL } from '../../utils/ast.js';\nimport {\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../../utils/declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies.js';\nimport { type ITsDepVersion, withVersions } from '../../utils/versions.js';\nimport type { ConfigureProjectOptions } from './types.js';\n\nconst readGritPattern = (name: string): string =>\n readFileSync(\n join(import.meta.dirname, 'grit', `${name}.grit`),\n 'utf-8',\n ).trim();\n\n/**\n * Resolve the config's `root` from `import.meta.dirname`.\n *\n * `@nx/js` writes `root: __dirname`, which Vite's native config loader does not\n * provide — it warns today and will reject once `configLoader: 'native'` becomes\n * the default. Scoped with `some` to a direct property of the object the config\n * factory returns, so a nested `root` (a `test.alias` entry, say) is untouched.\n */\nconst ROOT_IMPORT_META_DIRNAME = `\\`defineConfig(() => ({ $props }))\\` where {\n $props <: some \\`root: __dirname\\` as $root,\n $root => \\`root: import.meta.dirname\\`\n}`;\n\n/** Dependencies a caller must declare to configure vitest. */\nexport const VITEST_DEPENDENCIES = [\n { name: 'vite' },\n { name: 'vitest' },\n { name: '@vitest/coverage-v8' },\n] as const satisfies readonly { name: ITsDepVersion }[];\n\nexport const configureVitest = async <const D extends DependencyDeclaration>(\n tree: Tree,\n options: ConfigureProjectOptions,\n declaration: D & MustDeclare<typeof VITEST_DEPENDENCIES, D>,\n) => {\n // Find vitest.config.mts or vite.config.mts\n const configPath = [\n join(options.dir, 'vitest.config.mts'),\n join(options.dir, 'vite.config.mts'),\n ].find((config) => tree.exists(config));\n\n if (configPath) {\n await applyGritQL(\n tree,\n configPath,\n readGritPattern('vitest-pass-with-no-tests'),\n );\n\n await applyGritQL(tree, configPath, ROOT_IMPORT_META_DIRNAME);\n\n const nxJson = readNxJson(tree);\n updateNxJson(tree, {\n ...nxJson,\n targetDefaults: {\n ...(nxJson.targetDefaults ?? {}),\n '@nx/vitest:test': {\n cache: true,\n inputs: ['default', '^production'],\n configurations: {\n 'update-snapshot': {\n args: '--update',\n },\n },\n ...nxJson.targetDefaults['@nx/vitest:test'],\n },\n },\n });\n }\n\n addDependenciesToPackageJson(\n tree,\n {},\n withVersions(forDependencies<typeof VITEST_DEPENDENCIES>(declaration), [\n 'vite',\n 'vitest',\n '@vitest/coverage-v8',\n ]),\n );\n};\n"],"names":["readNxJson","updateNxJson","readFileSync","join","applyGritQL","forDependencies","addDependenciesToPackageJson","withVersions","readGritPattern","name","dirname","trim","ROOT_IMPORT_META_DIRNAME","VITEST_DEPENDENCIES","configureVitest","tree","options","declaration","configPath","dir","find","config","exists","nxJson","targetDefaults","cache","inputs","configurations","args"],"mappings":"AAAA;;;CAGC,GACD,SAASA,UAAU,EAAaC,YAAY,QAAQ,aAAa;AACjE,SAASC,YAAY,QAAQ,KAAK;AAClC,SAASC,IAAI,QAAQ,OAAO;AAC5B,SAASC,WAAW,QAAQ,qBAAqB;AACjD,SAEEC,eAAe,QAEV,uCAAuC;AAC9C,SAASC,4BAA4B,QAAQ,8BAA8B;AAC3E,SAA6BC,YAAY,QAAQ,0BAA0B;AAG3E,MAAMC,kBAAkB,CAACC,OACvBP,aACEC,KAAK,YAAYO,OAAO,EAAE,QAAQ,GAAGD,KAAK,KAAK,CAAC,GAChD,SACAE,IAAI;AAER;;;;;;;CAOC,GACD,MAAMC,2BAA2B,CAAC;;;CAGjC,CAAC;AAEF,4DAA4D,GAC5D,OAAO,MAAMC,sBAAsB;IACjC;QAAEJ,MAAM;IAAO;IACf;QAAEA,MAAM;IAAS;IACjB;QAAEA,MAAM;IAAsB;CAC/B,CAAuD;AAExD,OAAO,MAAMK,kBAAkB,OAC7BC,MACAC,SACAC;IAEA,4CAA4C;IAC5C,MAAMC,aAAa;QACjBf,KAAKa,QAAQG,GAAG,EAAE;QAClBhB,KAAKa,QAAQG,GAAG,EAAE;KACnB,CAACC,IAAI,CAAC,CAACC,SAAWN,KAAKO,MAAM,CAACD;IAE/B,IAAIH,YAAY;QACd,MAAMd,YACJW,MACAG,YACAV,gBAAgB;QAGlB,MAAMJ,YAAYW,MAAMG,YAAYN;QAEpC,MAAMW,SAASvB,WAAWe;QAC1Bd,aAAac,MAAM;YACjB,GAAGQ,MAAM;YACTC,gBAAgB;gBACd,GAAID,OAAOC,cAAc,IAAI,CAAC,CAAC;gBAC/B,mBAAmB;oBACjBC,OAAO;oBACPC,QAAQ;wBAAC;wBAAW;qBAAc;oBAClCC,gBAAgB;wBACd,mBAAmB;4BACjBC,MAAM;wBACR;oBACF;oBACA,GAAGL,OAAOC,cAAc,CAAC,kBAAkB;gBAC7C;YACF;QACF;IACF;IAEAlB,6BACES,MACA,CAAC,GACDR,aAAaF,gBAA4CY,cAAc;QACrE;QACA;QACA;KACD;AAEL,EAAE"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/lib/vitest.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 readNxJson,\n type Tree,\n updateNxJson,\n} from '@nx/devkit';\nimport { readFileSync } from 'fs';\nimport { join, relative } from 'path';\nimport { applyGritQL } from '../../utils/ast.js';\nimport {\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../../utils/declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies.js';\nimport { type ITsDepVersion, withVersions } from '../../utils/versions.js';\nimport type { ConfigureProjectOptions } from './types.js';\n\nconst readGritPattern = (name: string): string =>\n readFileSync(\n join(import.meta.dirname, 'grit', `${name}.grit`),\n 'utf-8',\n ).trim();\n\n/**\n * Resolve the config's `root` from `import.meta.dirname`.\n *\n * `@nx/js` writes `root: __dirname`, which Vite's native config loader does not\n * provide — it warns today and will reject once `configLoader: 'native'` becomes\n * the default. Scoped with `some` to a direct property of the object the config\n * factory returns, so a nested `root` (a `test.alias` entry, say) is untouched.\n */\nconst ROOT_IMPORT_META_DIRNAME = `\\`defineConfig(() => ({ $props }))\\` where {\n $props <: some \\`root: __dirname\\` as $root,\n $root => \\`root: import.meta.dirname\\`\n}`;\n\n/** The `reportsDirectory` `@nx/vitest` writes, resolved against the project root. */\nexport const GENERATED_REPORTS_DIRECTORY = './test-output/vitest/coverage';\n\n/**\n * The coverage directory for a project, as a path relative to the project root\n * (vitest resolves `reportsDirectory` against the config's `root`).\n *\n * Coverage lands under the workspace's `dist` rather than inside the project, so\n * the HTML reporter's vendored assets are neither formatted by the `format`\n * target nor counted as an input to the project's own tasks.\n */\nexport const getCoverageReportsDirectory = (dir: string): string =>\n joinPathFragments(\n relative(join('/', dir), '/'),\n 'dist',\n dir,\n 'test-output/vitest/coverage',\n );\n\n/**\n * Point coverage at the project's `dist` directory.\n *\n * `@nx/vitest` writes `reportsDirectory: './test-output/vitest/coverage'`, which\n * resolves inside the project. Coverage is off by default, so the directory is\n * dormant until someone runs `vitest --coverage` — at which point the HTML\n * reporter's bundled third-party scripts land in the project, where the `format`\n * target reformats them (failing the build from then on) and the `default` named\n * input counts them, so no task in the project can ever be cached again.\n *\n * Anchored to the exact literal `@nx/vitest` generates, and scoped to the\n * `coverage` block of the config's own `test` object, so a directory the user has\n * repointed is left alone.\n */\nconst coverageReportsDirectoryPattern = (dir: string): string =>\n `\\`test: { $props }\\` where {\n $props <: within \\`defineConfig($_)\\`,\n $props <: some \\`coverage: { $cov }\\`,\n $cov <: some \\`reportsDirectory: '${GENERATED_REPORTS_DIRECTORY}'\\` as $reportsDirectory,\n $reportsDirectory => \\`reportsDirectory: '${getCoverageReportsDirectory(dir)}'\\`\n}`;\n\n/** Dependencies a caller must declare to configure vitest. */\nexport const VITEST_DEPENDENCIES = [\n { name: 'vite' },\n { name: 'vitest' },\n { name: '@vitest/coverage-v8' },\n] as const satisfies readonly { name: ITsDepVersion }[];\n\nexport const configureVitest = async <const D extends DependencyDeclaration>(\n tree: Tree,\n options: ConfigureProjectOptions,\n declaration: D & MustDeclare<typeof VITEST_DEPENDENCIES, D>,\n) => {\n // Find vitest.config.mts or vite.config.mts\n const configPath = [\n join(options.dir, 'vitest.config.mts'),\n join(options.dir, 'vite.config.mts'),\n ].find((config) => tree.exists(config));\n\n if (configPath) {\n await applyGritQL(\n tree,\n configPath,\n readGritPattern('vitest-pass-with-no-tests'),\n );\n\n await applyGritQL(tree, configPath, ROOT_IMPORT_META_DIRNAME);\n\n await applyGritQL(\n tree,\n configPath,\n coverageReportsDirectoryPattern(options.dir),\n );\n\n const nxJson = readNxJson(tree);\n updateNxJson(tree, {\n ...nxJson,\n targetDefaults: {\n ...(nxJson.targetDefaults ?? {}),\n '@nx/vitest:test': {\n cache: true,\n inputs: ['default', '^production'],\n configurations: {\n 'update-snapshot': {\n args: '--update',\n },\n },\n ...nxJson.targetDefaults['@nx/vitest:test'],\n },\n },\n });\n }\n\n addDependenciesToPackageJson(\n tree,\n {},\n withVersions(forDependencies<typeof VITEST_DEPENDENCIES>(declaration), [\n 'vite',\n 'vitest',\n '@vitest/coverage-v8',\n ]),\n );\n};\n"],"names":["joinPathFragments","readNxJson","updateNxJson","readFileSync","join","relative","applyGritQL","forDependencies","addDependenciesToPackageJson","withVersions","readGritPattern","name","dirname","trim","ROOT_IMPORT_META_DIRNAME","GENERATED_REPORTS_DIRECTORY","getCoverageReportsDirectory","dir","coverageReportsDirectoryPattern","VITEST_DEPENDENCIES","configureVitest","tree","options","declaration","configPath","find","config","exists","nxJson","targetDefaults","cache","inputs","configurations","args"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,EACjBC,UAAU,EAEVC,YAAY,QACP,aAAa;AACpB,SAASC,YAAY,QAAQ,KAAK;AAClC,SAASC,IAAI,EAAEC,QAAQ,QAAQ,OAAO;AACtC,SAASC,WAAW,QAAQ,qBAAqB;AACjD,SAEEC,eAAe,QAEV,uCAAuC;AAC9C,SAASC,4BAA4B,QAAQ,8BAA8B;AAC3E,SAA6BC,YAAY,QAAQ,0BAA0B;AAG3E,MAAMC,kBAAkB,CAACC,OACvBR,aACEC,KAAK,YAAYQ,OAAO,EAAE,QAAQ,GAAGD,KAAK,KAAK,CAAC,GAChD,SACAE,IAAI;AAER;;;;;;;CAOC,GACD,MAAMC,2BAA2B,CAAC;;;CAGjC,CAAC;AAEF,mFAAmF,GACnF,OAAO,MAAMC,8BAA8B,gCAAgC;AAE3E;;;;;;;CAOC,GACD,OAAO,MAAMC,8BAA8B,CAACC,MAC1CjB,kBACEK,SAASD,KAAK,KAAKa,MAAM,MACzB,QACAA,KACA,+BACA;AAEJ;;;;;;;;;;;;;CAaC,GACD,MAAMC,kCAAkC,CAACD,MACvC,CAAC;;;oCAGiC,EAAEF,4BAA4B;4CACtB,EAAEC,4BAA4BC,KAAK;CAC9E,CAAC;AAEF,4DAA4D,GAC5D,OAAO,MAAME,sBAAsB;IACjC;QAAER,MAAM;IAAO;IACf;QAAEA,MAAM;IAAS;IACjB;QAAEA,MAAM;IAAsB;CAC/B,CAAuD;AAExD,OAAO,MAAMS,kBAAkB,OAC7BC,MACAC,SACAC;IAEA,4CAA4C;IAC5C,MAAMC,aAAa;QACjBpB,KAAKkB,QAAQL,GAAG,EAAE;QAClBb,KAAKkB,QAAQL,GAAG,EAAE;KACnB,CAACQ,IAAI,CAAC,CAACC,SAAWL,KAAKM,MAAM,CAACD;IAE/B,IAAIF,YAAY;QACd,MAAMlB,YACJe,MACAG,YACAd,gBAAgB;QAGlB,MAAMJ,YAAYe,MAAMG,YAAYV;QAEpC,MAAMR,YACJe,MACAG,YACAN,gCAAgCI,QAAQL,GAAG;QAG7C,MAAMW,SAAS3B,WAAWoB;QAC1BnB,aAAamB,MAAM;YACjB,GAAGO,MAAM;YACTC,gBAAgB;gBACd,GAAID,OAAOC,cAAc,IAAI,CAAC,CAAC;gBAC/B,mBAAmB;oBACjBC,OAAO;oBACPC,QAAQ;wBAAC;wBAAW;qBAAc;oBAClCC,gBAAgB;wBACd,mBAAmB;4BACjBC,MAAM;wBACR;oBACF;oBACA,GAAGL,OAAOC,cAAc,CAAC,kBAAkB;gBAC7C;YACF;QACF;IACF;IAEArB,6BACEa,MACA,CAAC,GACDZ,aAAaF,gBAA4CgB,cAAc;QACrE;QACA;QACA;KACD;AAEL,EAAE"}
@@ -7,7 +7,7 @@ import { AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES, addMcpServerInfra } from "../../
7
7
  import { addTypeScriptBundleTarget, BUNDLE_DEPENDENCIES } from "../../utils/bundle/bundle.js";
8
8
  import { resolveContainers } from "../../utils/containers.js";
9
9
  import { declareDependencies, ownedElsewhere } from "../../utils/declared-dependencies.js";
10
- import { ADOT_IMAGE_DEPENDENCIES, addDockerScanTarget, DOCKER_DEPENDENCIES, NODE_IMAGE_DEPENDENCIES, nodeImageVersions } from "../../utils/docker.js";
10
+ import { ADOT_IMAGE_DEPENDENCIES, addDockerScanTarget, DOCKER_DEPENDENCIES, IMAGE_BUILD_CACHE, NODE_IMAGE_DEPENDENCIES, nodeImageVersions } from "../../utils/docker.js";
11
11
  import { formatFilesInSubtree } from "../../utils/format.js";
12
12
  import { FS_DEPENDENCIES, FsCommands } from "../../utils/fs.js";
13
13
  import { resolveIac } from "../../utils/iac.js";
@@ -16,7 +16,7 @@ import { addGeneratorMetricsIfApplicable } from "../../utils/metrics.js";
16
16
  import { isEsmWorkspace } from "../../utils/module-format.js";
17
17
  import { kebabCase, toClassName } from "../../utils/names.js";
18
18
  import { getNpmScope } from "../../utils/npm-scope.js";
19
- import { addComponentDevTarget, addComponentGeneratorMetadata, addDependencyToTargetIfNotPresent, getGeneratorInfo, readProjectConfigurationUnqualified } from "../../utils/nx.js";
19
+ import { addArtifactDependencyToTargets, addComponentDevTarget, addComponentGeneratorMetadata, addDependencyToTargetIfNotPresent, getGeneratorInfo, readProjectConfigurationUnqualified } from "../../utils/nx.js";
20
20
  import { sortObjectKeys } from "../../utils/object.js";
21
21
  import { registerPnpmBuiltDependencies } from "../../utils/pnpm-workspace.js";
22
22
  import { assignPort } from "../../utils/port.js";
@@ -115,10 +115,7 @@ export const tsMcpServerGenerator = async (tree, options)=>{
115
115
  const dockerTargetName = `${mcpTargetPrefix}-docker`;
116
116
  const fs = new FsCommands(tree, DEPENDENCIES);
117
117
  project.targets[dockerTargetName] = {
118
- cache: true,
119
- outputs: [
120
- `{workspaceRoot}/${dockerOutputDir}/Dockerfile`
121
- ],
118
+ cache: IMAGE_BUILD_CACHE,
122
119
  executor: 'nx:run-commands',
123
120
  options: {
124
121
  commands: [
@@ -132,7 +129,7 @@ export const tsMcpServerGenerator = async (tree, options)=>{
132
129
  ]
133
130
  };
134
131
  addDependencyToTargetIfNotPresent(project, 'docker', dockerTargetName);
135
- addDependencyToTargetIfNotPresent(project, 'build', 'docker');
132
+ addArtifactDependencyToTargets(project, 'docker');
136
133
  addDockerScanTarget(tree, {
137
134
  project,
138
135
  containerEngine: containers,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/mcp-server/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport {\n AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES,\n addMcpServerInfra,\n} from '../../utils/agent-core-constructs/agent-core-constructs.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n ADOT_IMAGE_DEPENDENCIES,\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n NODE_IMAGE_DEPENDENCIES,\n nodeImageVersions,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport { kebabCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport type { IacMetadata } from '../../utils/shared-constructs-constants.js';\nimport { BASE_IMAGES, TS_VERSIONS } from '../../utils/versions.js';\nimport type { TsMcpServerGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsMcpServerMetadata extends IacMetadata {\n readonly port: number;\n readonly rc: string;\n readonly auth: string;\n}\n\nexport const DEPENDENCIES = declareDependencies<TsMcpServerMetadata>()({\n ts: [\n { name: '@modelcontextprotocol/sdk' },\n { name: 'zod' },\n { name: 'express' },\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@types/express', dev: true },\n // tsx (local dev) and the MCP inspector are shared tooling.\n { name: 'tsx', dev: true, root: true },\n { name: '@modelcontextprotocol/inspector', dev: true, root: true },\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ...ownedElsewhere(ADOT_IMAGE_DEPENDENCIES),\n ],\n py: ownedElsewhere(AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES),\n});\n\nexport const TS_MCP_SERVER_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsMcpServerGenerator = async (\n tree: Tree,\n options: TsMcpServerGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const project = readProjectConfigurationUnqualified(tree, options.project);\n\n if (!tree.exists(joinPathFragments(project.root, 'tsconfig.json'))) {\n throw new Error(\n `Unsupported project ${options.project}. Expected a TypeScript project (with a tsconfig.json)`,\n );\n }\n\n const defaultName = `${kebabCase(project.name.split('/').pop())}-mcp-server`;\n const name = kebabCase(options.name || defaultName);\n const mcpServerNameClassName = toClassName(name);\n const mcpTargetPrefix = options.name ? name : 'mcp-server';\n const targetSourceDirRelativeToProjectRoot = joinPathFragments(\n 'src',\n mcpTargetPrefix,\n );\n const targetSourceDir = joinPathFragments(\n project.root,\n targetSourceDirRelativeToProjectRoot,\n );\n const relativeSourceDir = targetSourceDir.replace(project.root + '/', './');\n const distDir = joinPathFragments('dist', project.root);\n\n const infra = options.infra ?? 'agentcore';\n\n // Recorded in the metadata below so the version sync can tell a CDK\n // project from a Terraform one; undefined when no infrastructure was\n // generated, in which case neither provider's packages were added.\n const iac =\n infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (infra === 'none' && options.auth && options.auth !== 'iam') {\n console.warn(\n 'Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)',\n );\n }\n\n const auth = options.auth ?? 'iam';\n\n const projectPackageJsonPath = joinPathFragments(\n project.root,\n 'package.json',\n );\n\n // Generate esm if the project's package.json is `type: module`, falling\n // back to the workspace format when the project has no manifest.\n const esm = tree.exists(projectPackageJsonPath)\n ? readJson(tree, projectPackageJsonPath).type === 'module'\n : isEsmWorkspace(tree);\n\n // Generate example server\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n targetSourceDir,\n {\n name,\n esm,\n distDir,\n adotVersion:\n TS_VERSIONS['@aws/aws-distro-opentelemetry-node-autoinstrumentation'],\n jaegerVersion: TS_VERSIONS['@opentelemetry/propagator-jaeger'],\n nodeBaseImage: BASE_IMAGES.node,\n ...nodeImageVersions(),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add hosting based on infra\n if (infra === 'agentcore') {\n const containers = await resolveContainers(tree, 'inherit');\n const dockerImageTag = `${getNpmScope(tree)}-${name}:latest`;\n\n // Add bundle target\n await addTypeScriptBundleTarget(\n tree,\n project,\n {\n targetFilePath: `${targetSourceDirRelativeToProjectRoot}/http.ts`,\n bundleOutputDir: joinPathFragments('mcp', name),\n },\n DEPENDENCIES,\n );\n\n const dockerOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'bundle',\n 'mcp',\n name,\n );\n const dockerTargetName = `${mcpTargetPrefix}-docker`;\n\n const fs = new FsCommands(tree, DEPENDENCIES);\n project.targets[dockerTargetName] = {\n cache: true,\n outputs: [`{workspaceRoot}/${dockerOutputDir}/Dockerfile`],\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.cp(\n `${targetSourceDir}/Dockerfile`,\n `${dockerOutputDir}/Dockerfile`,\n ),\n `${containers} build --platform linux/arm64 -t ${dockerImageTag} ${dockerOutputDir}`,\n ],\n parallel: false,\n },\n dependsOn: ['bundle'],\n };\n\n addDependencyToTargetIfNotPresent(project, 'docker', dockerTargetName);\n addDependencyToTargetIfNotPresent(project, 'build', 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project,\n containerEngine: containers,\n trivyTargetName: `${mcpTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n },\n DEPENDENCIES,\n );\n\n // Add shared constructs\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n\n // Add the construct to deploy the mcp server\n await addMcpServerInfra(tree, {\n mcpServerNameKebabCase: name,\n mcpServerNameClassName,\n projectName: project.name,\n dockerImageTag,\n dockerOutputDir,\n iac,\n auth,\n containers,\n });\n } else {\n // No Dockerfile needed for non-hosted MCP\n tree.delete(joinPathFragments(targetSourceDir, 'Dockerfile'));\n }\n\n // @modelcontextprotocol/sdk declares zod as a peer dependency with a wide range\n // (^3.25 || ^4.0). Yarn does not dedupe the peer to the workspace's pinned zod, so\n // without a resolution it installs a separate zod under the SDK's own node_modules.\n // The two zod copies have structurally incompatible types, which breaks type\n // inference for registerTool inputSchema. Scope the resolution to the SDK so\n // other consumers (e.g. @tanstack/router-generator pinning zod@3) are unaffected.\n // Classic yarn only honours the `**/`-prefixed descriptor in a workspace, and\n // berry only the bare one — it deletes a glob descriptor on install — so\n // declare both.\n if (detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@modelcontextprotocol/sdk/zod': TS_VERSIONS['zod'],\n '@modelcontextprotocol/sdk/zod': TS_VERSIONS['zod'],\n };\n return packageJson;\n });\n }\n\n const localDevPort = assignPort(tree, project, 8000, {\n component: { info: TS_MCP_SERVER_GENERATOR_INFO, name: mcpTargetPrefix },\n });\n\n // Recorded below and read by the declaration's predicates, so the packages\n // added here are exactly the ones the version sync will own.\n const metadata: TsMcpServerMetadata = {\n port: localDevPort,\n rc: mcpServerNameClassName,\n auth,\n ...(iac ? { iac } : {}),\n };\n\n // The MCP inspector has a postinstall script that cascades installs into its\n // client packages, which no-ops when the package is installed as a dependency.\n // Register it as an explicitly-rejected build so pnpm 11's default\n // `strictDepBuilds=true` skips it instead of failing the install.\n registerPnpmBuiltDependencies(tree, {\n '@modelcontextprotocol/inspector': false,\n });\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: project.root,\n });\n\n const mcpTargets = {\n ...project.targets,\n // Add targets for running the MCP server\n [`${mcpTargetPrefix}-serve-stdio`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/stdio.ts`],\n cwd: '{projectRoot}',\n },\n },\n [`${mcpTargetPrefix}-serve`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/http.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n },\n },\n },\n [`${mcpTargetPrefix}-dev`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/http.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n LOCAL_DEV: 'true',\n },\n },\n },\n [`${mcpTargetPrefix}-inspect`]: {\n executor: 'nx:run-commands',\n continuous: true,\n // Launch the inspector against the locally served HTTP server. The dev\n // target starts the server and any connected dependencies (e.g. a local\n // database).\n dependsOn: [`${mcpTargetPrefix}-dev`],\n options: {\n commands: [\n `mcp-inspector --transport http --server-url http://localhost:${localDevPort}/mcp`,\n ],\n cwd: '{projectRoot}',\n },\n },\n [`${mcpTargetPrefix}-inspect-stdio`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [\n `mcp-inspector -- tsx --watch ${relativeSourceDir}/stdio.ts`,\n ],\n cwd: '{projectRoot}',\n },\n },\n };\n\n // Aggregate `<mcp>-dev` under the project-level `dev` target.\n addComponentDevTarget(mcpTargets, `${mcpTargetPrefix}-dev`);\n\n updateProjectConfiguration(tree, project.name, {\n ...project,\n // Sort targets so their order is stable regardless of insertion order on\n // first run vs re-run.\n targets: sortObjectKeys(mcpTargets),\n });\n\n addComponentGeneratorMetadata(\n tree,\n project.name,\n TS_MCP_SERVER_GENERATOR_INFO,\n targetSourceDirRelativeToProjectRoot,\n mcpTargetPrefix,\n metadata,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_MCP_SERVER_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsMcpServerGenerator;\n"],"names":["detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readJson","updateJson","updateProjectConfiguration","addTsDependencies","AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES","addMcpServerInfra","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","ADOT_IMAGE_DEPENDENCIES","addDockerScanTarget","DOCKER_DEPENDENCIES","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","isEsmWorkspace","kebabCase","toClassName","getNpmScope","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","registerPnpmBuiltDependencies","assignPort","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","BASE_IMAGES","TS_VERSIONS","DEPENDENCIES","ts","name","dev","root","py","TS_MCP_SERVER_GENERATOR_INFO","filename","tsMcpServerGenerator","tree","options","project","exists","Error","defaultName","split","pop","mcpServerNameClassName","mcpTargetPrefix","targetSourceDirRelativeToProjectRoot","targetSourceDir","relativeSourceDir","replace","distDir","infra","iac","undefined","auth","console","warn","projectPackageJsonPath","esm","type","dirname","adotVersion","jaegerVersion","nodeBaseImage","node","overwriteStrategy","KeepExisting","containers","dockerImageTag","targetFilePath","bundleOutputDir","dockerOutputDir","dockerTargetName","fs","targets","cache","outputs","executor","commands","cp","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","mcpServerNameKebabCase","projectName","delete","packageJson","resolutions","localDevPort","component","info","metadata","port","rc","projectRoot","mcpTargets","continuous","cwd","env","PORT","LOCAL_DEV","preferInstallDependencies","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/mcp-server/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport {\n AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES,\n addMcpServerInfra,\n} from '../../utils/agent-core-constructs/agent-core-constructs.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n ADOT_IMAGE_DEPENDENCIES,\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n IMAGE_BUILD_CACHE,\n NODE_IMAGE_DEPENDENCIES,\n nodeImageVersions,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { isEsmWorkspace } from '../../utils/module-format.js';\nimport { kebabCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx.js';\nimport { sortObjectKeys } from '../../utils/object.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport type { IacMetadata } from '../../utils/shared-constructs-constants.js';\nimport { BASE_IMAGES, TS_VERSIONS } from '../../utils/versions.js';\nimport type { TsMcpServerGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsMcpServerMetadata extends IacMetadata {\n readonly port: number;\n readonly rc: string;\n readonly auth: string;\n}\n\nexport const DEPENDENCIES = declareDependencies<TsMcpServerMetadata>()({\n ts: [\n { name: '@modelcontextprotocol/sdk' },\n { name: 'zod' },\n { name: 'express' },\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@types/express', dev: true },\n // tsx (local dev) and the MCP inspector are shared tooling.\n { name: 'tsx', dev: true, root: true },\n { name: '@modelcontextprotocol/inspector', dev: true, root: true },\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ...ownedElsewhere(ADOT_IMAGE_DEPENDENCIES),\n ],\n py: ownedElsewhere(AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES),\n});\n\nexport const TS_MCP_SERVER_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsMcpServerGenerator = async (\n tree: Tree,\n options: TsMcpServerGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const project = readProjectConfigurationUnqualified(tree, options.project);\n\n if (!tree.exists(joinPathFragments(project.root, 'tsconfig.json'))) {\n throw new Error(\n `Unsupported project ${options.project}. Expected a TypeScript project (with a tsconfig.json)`,\n );\n }\n\n const defaultName = `${kebabCase(project.name.split('/').pop())}-mcp-server`;\n const name = kebabCase(options.name || defaultName);\n const mcpServerNameClassName = toClassName(name);\n const mcpTargetPrefix = options.name ? name : 'mcp-server';\n const targetSourceDirRelativeToProjectRoot = joinPathFragments(\n 'src',\n mcpTargetPrefix,\n );\n const targetSourceDir = joinPathFragments(\n project.root,\n targetSourceDirRelativeToProjectRoot,\n );\n const relativeSourceDir = targetSourceDir.replace(project.root + '/', './');\n const distDir = joinPathFragments('dist', project.root);\n\n const infra = options.infra ?? 'agentcore';\n\n // Recorded in the metadata below so the version sync can tell a CDK\n // project from a Terraform one; undefined when no infrastructure was\n // generated, in which case neither provider's packages were added.\n const iac =\n infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (infra === 'none' && options.auth && options.auth !== 'iam') {\n console.warn(\n 'Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)',\n );\n }\n\n const auth = options.auth ?? 'iam';\n\n const projectPackageJsonPath = joinPathFragments(\n project.root,\n 'package.json',\n );\n\n // Generate esm if the project's package.json is `type: module`, falling\n // back to the workspace format when the project has no manifest.\n const esm = tree.exists(projectPackageJsonPath)\n ? readJson(tree, projectPackageJsonPath).type === 'module'\n : isEsmWorkspace(tree);\n\n // Generate example server\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n targetSourceDir,\n {\n name,\n esm,\n distDir,\n adotVersion:\n TS_VERSIONS['@aws/aws-distro-opentelemetry-node-autoinstrumentation'],\n jaegerVersion: TS_VERSIONS['@opentelemetry/propagator-jaeger'],\n nodeBaseImage: BASE_IMAGES.node,\n ...nodeImageVersions(),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add hosting based on infra\n if (infra === 'agentcore') {\n const containers = await resolveContainers(tree, 'inherit');\n const dockerImageTag = `${getNpmScope(tree)}-${name}:latest`;\n\n // Add bundle target\n await addTypeScriptBundleTarget(\n tree,\n project,\n {\n targetFilePath: `${targetSourceDirRelativeToProjectRoot}/http.ts`,\n bundleOutputDir: joinPathFragments('mcp', name),\n },\n DEPENDENCIES,\n );\n\n const dockerOutputDir = joinPathFragments(\n 'dist',\n project.root,\n 'bundle',\n 'mcp',\n name,\n );\n const dockerTargetName = `${mcpTargetPrefix}-docker`;\n\n const fs = new FsCommands(tree, DEPENDENCIES);\n project.targets[dockerTargetName] = {\n cache: IMAGE_BUILD_CACHE,\n executor: 'nx:run-commands',\n options: {\n commands: [\n fs.cp(\n `${targetSourceDir}/Dockerfile`,\n `${dockerOutputDir}/Dockerfile`,\n ),\n `${containers} build --platform linux/arm64 -t ${dockerImageTag} ${dockerOutputDir}`,\n ],\n parallel: false,\n },\n dependsOn: ['bundle'],\n };\n\n addDependencyToTargetIfNotPresent(project, 'docker', dockerTargetName);\n addArtifactDependencyToTargets(project, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project,\n containerEngine: containers,\n trivyTargetName: `${mcpTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n },\n DEPENDENCIES,\n );\n\n // Add shared constructs\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n\n // Add the construct to deploy the mcp server\n await addMcpServerInfra(tree, {\n mcpServerNameKebabCase: name,\n mcpServerNameClassName,\n projectName: project.name,\n dockerImageTag,\n dockerOutputDir,\n iac,\n auth,\n containers,\n });\n } else {\n // No Dockerfile needed for non-hosted MCP\n tree.delete(joinPathFragments(targetSourceDir, 'Dockerfile'));\n }\n\n // @modelcontextprotocol/sdk declares zod as a peer dependency with a wide range\n // (^3.25 || ^4.0). Yarn does not dedupe the peer to the workspace's pinned zod, so\n // without a resolution it installs a separate zod under the SDK's own node_modules.\n // The two zod copies have structurally incompatible types, which breaks type\n // inference for registerTool inputSchema. Scope the resolution to the SDK so\n // other consumers (e.g. @tanstack/router-generator pinning zod@3) are unaffected.\n // Classic yarn only honours the `**/`-prefixed descriptor in a workspace, and\n // berry only the bare one — it deletes a glob descriptor on install — so\n // declare both.\n if (detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@modelcontextprotocol/sdk/zod': TS_VERSIONS['zod'],\n '@modelcontextprotocol/sdk/zod': TS_VERSIONS['zod'],\n };\n return packageJson;\n });\n }\n\n const localDevPort = assignPort(tree, project, 8000, {\n component: { info: TS_MCP_SERVER_GENERATOR_INFO, name: mcpTargetPrefix },\n });\n\n // Recorded below and read by the declaration's predicates, so the packages\n // added here are exactly the ones the version sync will own.\n const metadata: TsMcpServerMetadata = {\n port: localDevPort,\n rc: mcpServerNameClassName,\n auth,\n ...(iac ? { iac } : {}),\n };\n\n // The MCP inspector has a postinstall script that cascades installs into its\n // client packages, which no-ops when the package is installed as a dependency.\n // Register it as an explicitly-rejected build so pnpm 11's default\n // `strictDepBuilds=true` skips it instead of failing the install.\n registerPnpmBuiltDependencies(tree, {\n '@modelcontextprotocol/inspector': false,\n });\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: project.root,\n });\n\n const mcpTargets = {\n ...project.targets,\n // Add targets for running the MCP server\n [`${mcpTargetPrefix}-serve-stdio`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/stdio.ts`],\n cwd: '{projectRoot}',\n },\n },\n [`${mcpTargetPrefix}-serve`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/http.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n },\n },\n },\n [`${mcpTargetPrefix}-dev`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [`tsx --watch ${relativeSourceDir}/http.ts`],\n cwd: '{projectRoot}',\n env: {\n PORT: `${localDevPort}`,\n LOCAL_DEV: 'true',\n },\n },\n },\n [`${mcpTargetPrefix}-inspect`]: {\n executor: 'nx:run-commands',\n continuous: true,\n // Launch the inspector against the locally served HTTP server. The dev\n // target starts the server and any connected dependencies (e.g. a local\n // database).\n dependsOn: [`${mcpTargetPrefix}-dev`],\n options: {\n commands: [\n `mcp-inspector --transport http --server-url http://localhost:${localDevPort}/mcp`,\n ],\n cwd: '{projectRoot}',\n },\n },\n [`${mcpTargetPrefix}-inspect-stdio`]: {\n executor: 'nx:run-commands',\n continuous: true,\n options: {\n commands: [\n `mcp-inspector -- tsx --watch ${relativeSourceDir}/stdio.ts`,\n ],\n cwd: '{projectRoot}',\n },\n },\n };\n\n // Aggregate `<mcp>-dev` under the project-level `dev` target.\n addComponentDevTarget(mcpTargets, `${mcpTargetPrefix}-dev`);\n\n updateProjectConfiguration(tree, project.name, {\n ...project,\n // Sort targets so their order is stable regardless of insertion order on\n // first run vs re-run.\n targets: sortObjectKeys(mcpTargets),\n });\n\n addComponentGeneratorMetadata(\n tree,\n project.name,\n TS_MCP_SERVER_GENERATOR_INFO,\n targetSourceDirRelativeToProjectRoot,\n mcpTargetPrefix,\n metadata,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_MCP_SERVER_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsMcpServerGenerator;\n"],"names":["detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readJson","updateJson","updateProjectConfiguration","addTsDependencies","AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES","addMcpServerInfra","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","ADOT_IMAGE_DEPENDENCIES","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","isEsmWorkspace","kebabCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","registerPnpmBuiltDependencies","assignPort","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","BASE_IMAGES","TS_VERSIONS","DEPENDENCIES","ts","name","dev","root","py","TS_MCP_SERVER_GENERATOR_INFO","filename","tsMcpServerGenerator","tree","options","project","exists","Error","defaultName","split","pop","mcpServerNameClassName","mcpTargetPrefix","targetSourceDirRelativeToProjectRoot","targetSourceDir","relativeSourceDir","replace","distDir","infra","iac","undefined","auth","console","warn","projectPackageJsonPath","esm","type","dirname","adotVersion","jaegerVersion","nodeBaseImage","node","overwriteStrategy","KeepExisting","containers","dockerImageTag","targetFilePath","bundleOutputDir","dockerOutputDir","dockerTargetName","fs","targets","cache","executor","commands","cp","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","mcpServerNameKebabCase","projectName","delete","packageJson","resolutions","localDevPort","component","info","metadata","port","rc","projectRoot","mcpTargets","continuous","cwd","env","PORT","LOCAL_DEV","preferInstallDependencies","languages"],"mappings":"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"}
@@ -8,7 +8,7 @@ import { addStarExport } from "../../utils/ast.js";
8
8
  import { addTypeScriptBundleTarget, BUNDLE_DEPENDENCIES } from "../../utils/bundle/bundle.js";
9
9
  import { resolveContainers } from "../../utils/containers.js";
10
10
  import { declareDependencies, ownedElsewhere } from "../../utils/declared-dependencies.js";
11
- import { addDockerScanTarget, DOCKER_DEPENDENCIES, NODE_IMAGE_DEPENDENCIES, nodeImageVersions } from "../../utils/docker.js";
11
+ import { addDockerScanTarget, DOCKER_DEPENDENCIES, IMAGE_BUILD_CACHE, NODE_IMAGE_DEPENDENCIES, nodeImageVersions } from "../../utils/docker.js";
12
12
  import { formatFilesInSubtree } from "../../utils/format.js";
13
13
  import { FS_DEPENDENCIES, FsCommands } from "../../utils/fs.js";
14
14
  import { updateGitIgnore } from "../../utils/git.js";
@@ -18,7 +18,7 @@ import { addGeneratorMetricsIfApplicable } from "../../utils/metrics.js";
18
18
  import { esmVars } from "../../utils/module-format.js";
19
19
  import { kebabCase, snakeCase, toClassName } from "../../utils/names.js";
20
20
  import { getNpmScope } from "../../utils/npm-scope.js";
21
- import { addDependencyToTargetIfNotPresent, addGeneratorMetadata, getGeneratorInfo } from "../../utils/nx.js";
21
+ import { addArtifactDependencyToTargets, addDependencyToTargetIfNotPresent, addGeneratorMetadata, getGeneratorInfo } from "../../utils/nx.js";
22
22
  import { getRelativePathToRootByDirectory } from "../../utils/paths.js";
23
23
  import { registerPnpmBuiltDependencies } from "../../utils/pnpm-workspace.js";
24
24
  import { assignPort } from "../../utils/port.js";
@@ -238,6 +238,9 @@ export const tsRdbGenerator = async (tree, options)=>{
238
238
  };
239
239
  projectConfig.targets['dev'] = {
240
240
  executor: 'nx:run-commands',
241
+ dependsOn: [
242
+ 'pull-image'
243
+ ],
241
244
  options: {
242
245
  command: `tsx ${scriptsDir}/start-container.ts`,
243
246
  cwd: '{projectRoot}'
@@ -275,7 +278,7 @@ export const tsRdbGenerator = async (tree, options)=>{
275
278
  if (options.infra !== 'none') {
276
279
  if (iac === 'terraform') {
277
280
  projectConfig.targets['docker'] = {
278
- cache: true,
281
+ cache: IMAGE_BUILD_CACHE,
279
282
  executor: 'nx:run-commands',
280
283
  options: {
281
284
  command: `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`
@@ -284,7 +287,7 @@ export const tsRdbGenerator = async (tree, options)=>{
284
287
  'bundle'
285
288
  ]
286
289
  };
287
- addDependencyToTargetIfNotPresent(projectConfig, 'build', 'docker');
290
+ addArtifactDependencyToTargets(projectConfig, 'docker');
288
291
  addDockerScanTarget(tree, {
289
292
  project: projectConfig,
290
293
  containerEngine,
@@ -295,7 +298,7 @@ export const tsRdbGenerator = async (tree, options)=>{
295
298
  ]
296
299
  }, DEPENDENCIES);
297
300
  }
298
- addDependencyToTargetIfNotPresent(projectConfig, 'build', 'bundle');
301
+ addArtifactDependencyToTargets(projectConfig, 'bundle');
299
302
  }
300
303
  addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');
301
304
  updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/rdb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { relative } from 'node:path';\nimport {\n detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readProjectConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n writeJson,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport { addStarExport } from '../../utils/ast.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n NODE_IMAGE_DEPENDENCIES,\n nodeImageVersions,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { updateGitIgnore } from '../../utils/git.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx.js';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_RDB_SCRIPTS_DEPENDENCIES,\n sharedRdbScriptsGenerator,\n} from '../../utils/shared-rdb-scripts.js';\nimport { TS_VERSIONS } from '../../utils/versions.js';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator.js';\nimport type { TsRdbGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsRdbMetadata extends IacMetadata {\n readonly engine: TsRdbGeneratorSchema['engine'];\n}\n\n// Each entry names the engine branch it belongs to, so the same declaration\n// drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<TsRdbMetadata>()({\n ts: [\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@aws-sdk/client-secrets-manager' },\n { name: '@aws-sdk/rds-signer' },\n { name: '@prisma/client' },\n { name: '@prisma/adapter-mariadb', when: (m) => m.engine === 'mysql' },\n { name: 'mariadb', when: (m) => m.engine === 'mysql' },\n { name: '@prisma/adapter-pg', when: (m) => m.engine !== 'mysql' },\n { name: 'pg', when: (m) => m.engine !== 'mysql' },\n { name: '@types/aws-lambda', dev: true },\n { name: '@types/pg', when: (m) => m.engine !== 'mysql', dev: true },\n // The prisma CLI and tsx run migration/seed scripts from the root.\n { name: 'prisma', dev: true, root: true },\n { name: 'tsx', dev: true, root: true },\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_RDB_SCRIPTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ],\n});\n\nexport const TS_RDB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsRdbGenerator = async (\n tree: Tree,\n options: TsRdbGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameKebabCase = kebabCase(options.name);\n const nameClassName = toClassName(options.name);\n const databaseUser = options.databaseUser ?? 'dbadmin';\n const databaseName = snakeCase(options.databaseName ?? options.name);\n const containerEngine = await resolveContainers(tree, 'inherit');\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n });\n\n let projectExists: boolean;\n try {\n readProjectConfiguration(tree, fullyQualifiedName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n await tsProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n preferInstallDependencies: false,\n });\n }\n\n updateJson(tree, joinPathFragments(dir, 'tsconfig.lib.json'), (tsConfig) => ({\n ...tsConfig,\n include: ['src/**/*.ts', 'generated/prisma/**/*.ts'],\n }));\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n const localDbPort = assignPort(\n tree,\n projectConfig,\n options.engine === 'mysql' ? 3306 : 5432,\n );\n const localDbHost = 'localhost';\n const localDbUser = options.engine === 'mysql' ? 'root' : 'dbadmin';\n const localDbPassword = 'password';\n const containerName = `${getNpmScope(tree)}-${databaseName}`;\n const dockerImage =\n options.engine === 'mysql'\n ? 'public.ecr.aws/docker/library/mysql:8.0.44'\n : 'public.ecr.aws/docker/library/postgres:17.7';\n\n const templateOptions = {\n engine: options.engine,\n runtimeConfigKey: nameClassName,\n databasePackageAlias: fullyQualifiedName,\n databaseProvider: options.engine === 'mysql' ? 'mysql' : 'postgresql',\n prismaVersion: TS_VERSIONS.prisma,\n ...nodeImageVersions(),\n prismaAdapterPackage:\n options.engine === 'mysql'\n ? '@prisma/adapter-mariadb'\n : '@prisma/adapter-pg',\n prismaAdapterClassName:\n options.engine === 'mysql' ? 'PrismaMariaDb' : 'PrismaPg',\n localDbPort,\n localDbHost,\n localDbName: databaseName,\n localDbUser,\n localDbPassword,\n containerEngine,\n containerName,\n dockerImage,\n ...esmVars(tree),\n };\n\n // The Prisma schema and models, the handlers and the prisma client module are\n // all user-editable, so a re-run (to add infrastructure, or after a failed\n // run) must not clobber the user's schema and edits.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The barrel re-exports prisma.ts. `tsProjectGenerator` writes a stub index.ts\n // when it creates the project, so the re-export is added to whatever is there\n // rather than replacing it — which also leaves a user's own additions to the\n // barrel alone on a re-run.\n await addStarExport(\n tree,\n joinPathFragments(dir, 'src', 'index.ts'),\n './prisma.js',\n );\n\n // config.json is framework-owned: it carries values derived from the\n // generator's options, so it converges on a re-run with changed options.\n writeJson(tree, joinPathFragments(dir, 'config.json'), {\n runtimeConfigKey: nameClassName,\n localDev: {\n containerEngine,\n containerName,\n image: dockerImage,\n port: localDbPort,\n host: localDbHost,\n dbName: databaseName,\n dbUser: localDbUser,\n dbPassword: localDbPassword,\n dbEngine: options.engine,\n },\n });\n updateGitIgnore(tree, dir, (patterns) => [...patterns, 'generated/prisma']);\n await sharedRdbScriptsGenerator(tree, options.engine, DEPENDENCIES);\n const waitForDbScript =\n options.engine === 'mysql'\n ? 'wait-for-mysql-db.ts'\n : 'wait-for-postgres-db.ts';\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'rdb'),\n );\n const relativePathToRoot = getRelativePathToRootByDirectory(\n projectConfig.root,\n );\n const fs = new FsCommands(tree, DEPENDENCIES);\n const migrationBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'migration',\n );\n const migrationDockerImageTag = `${getNpmScope(tree)}-${kebabCase(options.name)}-migration:latest`;\n\n if (options.infra !== 'none') {\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/migration-handler.ts',\n bundleOutputDir: 'migration',\n },\n DEPENDENCIES,\n );\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/create-db-user-handler.ts',\n bundleOutputDir: 'create-db-user',\n },\n DEPENDENCIES,\n );\n const bundleTarget = projectConfig.targets['bundle'];\n // The bundle target starts with a single rolldown `command`. Wrap it with\n // the migration asset copy steps, unless it has already been transformed\n // into a `commands` array on a previous run.\n if (!bundleTarget.options.commands) {\n const rolldownCommand = bundleTarget.options.command;\n delete bundleTarget.options.command;\n bundleTarget.options = {\n ...bundleTarget.options,\n commands: [\n fs.rm(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.mkdir(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.cp(\n 'prisma',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma`,\n ),\n fs.cp(\n 'prisma.config.ts',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma.config.ts`,\n ),\n fs.cp(\n 'Dockerfile',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/Dockerfile`,\n ),\n rolldownCommand,\n ],\n parallel: false,\n };\n }\n }\n\n projectConfig.targets.generate = {\n executor: 'nx:run-commands',\n outputs: ['{projectRoot}/generated/prisma'],\n options: {\n command: 'prisma generate',\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['pull-image'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/pull-image.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['dev'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/start-container.ts`,\n cwd: '{projectRoot}',\n },\n continuous: true,\n };\n projectConfig.targets['wait-for-db'] = {\n executor: 'nx:run-commands',\n dependsOn: ['dev'],\n options: {\n command: `tsx ${scriptsDir}/${waitForDbScript}`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets.prisma = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n cwd: '{projectRoot}',\n command: 'prisma',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n // Recorded in the metadata below so the version sync can tell a CDK project\n // from a Terraform one; undefined when no infrastructure was generated, in\n // which case neither provider's packages were added.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (options.infra !== 'none') {\n if (iac === 'terraform') {\n projectConfig.targets['docker'] = {\n cache: true,\n executor: 'nx:run-commands',\n options: {\n command: `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`,\n },\n dependsOn: ['bundle'],\n };\n addDependencyToTargetIfNotPresent(projectConfig, 'build', 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project: projectConfig,\n containerEngine,\n trivyTargetName: 'trivy',\n dockerTargetName: 'docker',\n imageTags: [migrationDockerImageTag],\n },\n DEPENDENCIES,\n );\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'build', 'bundle');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n // Recorded here and read by the declaration's predicates, so the packages\n // added below are exactly the ones the version sync will own.\n const metadata: TsRdbMetadata = {\n engine: options.engine,\n ...(iac ? { iac } : {}),\n };\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n TS_RDB_GENERATOR_INFO,\n metadata,\n );\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase,\n databasePackageAlias: fullyQualifiedName,\n databaseName,\n adminUser: databaseUser,\n engine: options.engine,\n migrationBundleDir,\n createDbUserBundleDir: joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'create-db-user',\n ),\n framework: options.framework,\n migrationDockerImageTag,\n containerEngine,\n });\n }\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: projectConfig.root,\n });\n\n // @prisma/adapter-pg depends on @types/pg ^8.16.0. Yarn does not dedupe it to\n // the workspace's pinned @types/pg, so it installs a separate copy under the\n // adapter's own node_modules whenever a newer @types/pg is published. The two\n // copies declare structurally incompatible Pool types, so passing our `new\n // Pool(...)` to `new PrismaPg(...)` fails to compile. Scope the resolution to\n // the adapter so other @types/pg consumers are unaffected. Classic yarn only\n // honours the `**/`-prefixed descriptor in a workspace and berry only the\n // bare one, so declare both.\n if (options.engine === 'postgres' && detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n '@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n };\n return packageJson;\n });\n }\n\n registerPnpmBuiltDependencies(tree, {\n '@prisma/engines': false,\n prisma: false,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_RDB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsRdbGenerator;\n"],"names":["relative","detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateJson","updateProjectConfiguration","writeJson","addTsDependencies","addStarExport","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","snakeCase","toClassName","getNpmScope","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","getRelativePathToRootByDirectory","registerPnpmBuiltDependencies","assignPort","addRdbInfra","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_RDB_SCRIPTS_DEPENDENCIES","sharedRdbScriptsGenerator","TS_VERSIONS","tsProjectGenerator","getTsLibDetails","DEPENDENCIES","ts","name","when","m","engine","dev","root","TS_RDB_GENERATOR_INFO","filename","tsRdbGenerator","tree","options","nameKebabCase","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","tsConfig","include","projectConfig","localDbPort","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","databasePackageAlias","databaseProvider","prismaVersion","prisma","prismaAdapterPackage","prismaAdapterClassName","localDbName","dirname","overwriteStrategy","KeepExisting","localDev","image","port","host","dbName","dbUser","dbPassword","dbEngine","patterns","waitForDbScript","scriptsDir","relativePathToRoot","fs","migrationBundleDir","migrationDockerImageTag","infra","targetFilePath","bundleOutputDir","bundleTarget","targets","commands","rolldownCommand","command","rm","mkdir","cp","parallel","generate","executor","outputs","cwd","continuous","dependsOn","env","LOCAL_DEV","iac","undefined","cache","project","trivyTargetName","dockerTargetName","imageTags","metadata","projectName","projectRoot","adminUser","createDbUserBundleDir","framework","packageJson","resolutions","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/rdb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { relative } from 'node:path';\nimport {\n detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readProjectConfiguration,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n writeJson,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../utils/add-dependencies.js';\nimport { addStarExport } from '../../utils/ast.js';\nimport {\n addTypeScriptBundleTarget,\n BUNDLE_DEPENDENCIES,\n} from '../../utils/bundle/bundle.js';\nimport { resolveContainers } from '../../utils/containers.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../utils/declared-dependencies.js';\nimport {\n addDockerScanTarget,\n DOCKER_DEPENDENCIES,\n IMAGE_BUILD_CACHE,\n NODE_IMAGE_DEPENDENCIES,\n nodeImageVersions,\n} from '../../utils/docker.js';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { FS_DEPENDENCIES, FsCommands } from '../../utils/fs.js';\nimport { updateGitIgnore } from '../../utils/git.js';\nimport { resolveIac } from '../../utils/iac.js';\nimport { installDependencies } from '../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport { kebabCase, snakeCase, toClassName } from '../../utils/names.js';\nimport { getNpmScope } from '../../utils/npm-scope.js';\nimport {\n addArtifactDependencyToTargets,\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx.js';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths.js';\nimport { registerPnpmBuiltDependencies } from '../../utils/pnpm-workspace.js';\nimport { assignPort } from '../../utils/port.js';\nimport { addRdbInfra } from '../../utils/rdb-constructs/rdb-constructs.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../utils/shared-constructs.js';\nimport {\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants.js';\nimport {\n SHARED_RDB_SCRIPTS_DEPENDENCIES,\n sharedRdbScriptsGenerator,\n} from '../../utils/shared-rdb-scripts.js';\nimport { TS_VERSIONS } from '../../utils/versions.js';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator.js';\nimport type { TsRdbGeneratorSchema } from './schema';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsRdbMetadata extends IacMetadata {\n readonly engine: TsRdbGeneratorSchema['engine'];\n}\n\n// Each entry names the engine branch it belongs to, so the same declaration\n// drives both adding and the version sync.\nexport const DEPENDENCIES = declareDependencies<TsRdbMetadata>()({\n ts: [\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: '@aws-sdk/client-secrets-manager' },\n { name: '@aws-sdk/rds-signer' },\n { name: '@prisma/client' },\n { name: '@prisma/adapter-mariadb', when: (m) => m.engine === 'mysql' },\n { name: 'mariadb', when: (m) => m.engine === 'mysql' },\n { name: '@prisma/adapter-pg', when: (m) => m.engine !== 'mysql' },\n { name: 'pg', when: (m) => m.engine !== 'mysql' },\n { name: '@types/aws-lambda', dev: true },\n { name: '@types/pg', when: (m) => m.engine !== 'mysql', dev: true },\n // The prisma CLI and tsx run migration/seed scripts from the root.\n { name: 'prisma', dev: true, root: true },\n { name: 'tsx', dev: true, root: true },\n ...ownedElsewhere(BUNDLE_DEPENDENCIES),\n ...ownedElsewhere(FS_DEPENDENCIES),\n ...ownedElsewhere(DOCKER_DEPENDENCIES),\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ...ownedElsewhere(SHARED_RDB_SCRIPTS_DEPENDENCIES),\n ...ownedElsewhere(NODE_IMAGE_DEPENDENCIES),\n ],\n});\n\nexport const TS_RDB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsRdbGenerator = async (\n tree: Tree,\n options: TsRdbGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameKebabCase = kebabCase(options.name);\n const nameClassName = toClassName(options.name);\n const databaseUser = options.databaseUser ?? 'dbadmin';\n const databaseName = snakeCase(options.databaseName ?? options.name);\n const containerEngine = await resolveContainers(tree, 'inherit');\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n });\n\n let projectExists: boolean;\n try {\n readProjectConfiguration(tree, fullyQualifiedName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n await tsProjectGenerator(tree, {\n name: options.name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n preferInstallDependencies: false,\n });\n }\n\n updateJson(tree, joinPathFragments(dir, 'tsconfig.lib.json'), (tsConfig) => ({\n ...tsConfig,\n include: ['src/**/*.ts', 'generated/prisma/**/*.ts'],\n }));\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n const localDbPort = assignPort(\n tree,\n projectConfig,\n options.engine === 'mysql' ? 3306 : 5432,\n );\n const localDbHost = 'localhost';\n const localDbUser = options.engine === 'mysql' ? 'root' : 'dbadmin';\n const localDbPassword = 'password';\n const containerName = `${getNpmScope(tree)}-${databaseName}`;\n const dockerImage =\n options.engine === 'mysql'\n ? 'public.ecr.aws/docker/library/mysql:8.0.44'\n : 'public.ecr.aws/docker/library/postgres:17.7';\n\n const templateOptions = {\n engine: options.engine,\n runtimeConfigKey: nameClassName,\n databasePackageAlias: fullyQualifiedName,\n databaseProvider: options.engine === 'mysql' ? 'mysql' : 'postgresql',\n prismaVersion: TS_VERSIONS.prisma,\n ...nodeImageVersions(),\n prismaAdapterPackage:\n options.engine === 'mysql'\n ? '@prisma/adapter-mariadb'\n : '@prisma/adapter-pg',\n prismaAdapterClassName:\n options.engine === 'mysql' ? 'PrismaMariaDb' : 'PrismaPg',\n localDbPort,\n localDbHost,\n localDbName: databaseName,\n localDbUser,\n localDbPassword,\n containerEngine,\n containerName,\n dockerImage,\n ...esmVars(tree),\n };\n\n // The Prisma schema and models, the handlers and the prisma client module are\n // all user-editable, so a re-run (to add infrastructure, or after a failed\n // run) must not clobber the user's schema and edits.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // The barrel re-exports prisma.ts. `tsProjectGenerator` writes a stub index.ts\n // when it creates the project, so the re-export is added to whatever is there\n // rather than replacing it — which also leaves a user's own additions to the\n // barrel alone on a re-run.\n await addStarExport(\n tree,\n joinPathFragments(dir, 'src', 'index.ts'),\n './prisma.js',\n );\n\n // config.json is framework-owned: it carries values derived from the\n // generator's options, so it converges on a re-run with changed options.\n writeJson(tree, joinPathFragments(dir, 'config.json'), {\n runtimeConfigKey: nameClassName,\n localDev: {\n containerEngine,\n containerName,\n image: dockerImage,\n port: localDbPort,\n host: localDbHost,\n dbName: databaseName,\n dbUser: localDbUser,\n dbPassword: localDbPassword,\n dbEngine: options.engine,\n },\n });\n updateGitIgnore(tree, dir, (patterns) => [...patterns, 'generated/prisma']);\n await sharedRdbScriptsGenerator(tree, options.engine, DEPENDENCIES);\n const waitForDbScript =\n options.engine === 'mysql'\n ? 'wait-for-mysql-db.ts'\n : 'wait-for-postgres-db.ts';\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'rdb'),\n );\n const relativePathToRoot = getRelativePathToRootByDirectory(\n projectConfig.root,\n );\n const fs = new FsCommands(tree, DEPENDENCIES);\n const migrationBundleDir = joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'migration',\n );\n const migrationDockerImageTag = `${getNpmScope(tree)}-${kebabCase(options.name)}-migration:latest`;\n\n if (options.infra !== 'none') {\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/migration-handler.ts',\n bundleOutputDir: 'migration',\n },\n DEPENDENCIES,\n );\n await addTypeScriptBundleTarget(\n tree,\n projectConfig,\n {\n targetFilePath: 'src/create-db-user-handler.ts',\n bundleOutputDir: 'create-db-user',\n },\n DEPENDENCIES,\n );\n const bundleTarget = projectConfig.targets['bundle'];\n // The bundle target starts with a single rolldown `command`. Wrap it with\n // the migration asset copy steps, unless it has already been transformed\n // into a `commands` array on a previous run.\n if (!bundleTarget.options.commands) {\n const rolldownCommand = bundleTarget.options.command;\n delete bundleTarget.options.command;\n bundleTarget.options = {\n ...bundleTarget.options,\n commands: [\n fs.rm(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.mkdir(`${relativePathToRoot}dist/{projectRoot}/bundle/migration`),\n fs.cp(\n 'prisma',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma`,\n ),\n fs.cp(\n 'prisma.config.ts',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/prisma.config.ts`,\n ),\n fs.cp(\n 'Dockerfile',\n `${relativePathToRoot}dist/{projectRoot}/bundle/migration/Dockerfile`,\n ),\n rolldownCommand,\n ],\n parallel: false,\n };\n }\n }\n\n projectConfig.targets.generate = {\n executor: 'nx:run-commands',\n outputs: ['{projectRoot}/generated/prisma'],\n options: {\n command: 'prisma generate',\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['pull-image'] = {\n executor: 'nx:run-commands',\n options: {\n command: `tsx ${scriptsDir}/pull-image.ts`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets['dev'] = {\n executor: 'nx:run-commands',\n dependsOn: ['pull-image'],\n options: {\n command: `tsx ${scriptsDir}/start-container.ts`,\n cwd: '{projectRoot}',\n },\n continuous: true,\n };\n projectConfig.targets['wait-for-db'] = {\n executor: 'nx:run-commands',\n dependsOn: ['dev'],\n options: {\n command: `tsx ${scriptsDir}/${waitForDbScript}`,\n cwd: '{projectRoot}',\n },\n };\n projectConfig.targets.prisma = {\n executor: 'nx:run-commands',\n dependsOn: ['dev', 'wait-for-db'],\n options: {\n cwd: '{projectRoot}',\n command: 'prisma',\n env: {\n LOCAL_DEV: 'true',\n },\n },\n };\n // Recorded in the metadata below so the version sync can tell a CDK project\n // from a Terraform one; undefined when no infrastructure was generated, in\n // which case neither provider's packages were added.\n const iac =\n options.infra !== 'none' ? await resolveIac(tree, options.iac) : undefined;\n\n if (options.infra !== 'none') {\n if (iac === 'terraform') {\n projectConfig.targets['docker'] = {\n cache: IMAGE_BUILD_CACHE,\n executor: 'nx:run-commands',\n options: {\n command: `${containerEngine} build --platform linux/arm64 --provenance=false -t ${migrationDockerImageTag} ${migrationBundleDir}`,\n },\n dependsOn: ['bundle'],\n };\n addArtifactDependencyToTargets(projectConfig, 'docker');\n\n addDockerScanTarget(\n tree,\n {\n project: projectConfig,\n containerEngine,\n trivyTargetName: 'trivy',\n dockerTargetName: 'docker',\n imageTags: [migrationDockerImageTag],\n },\n DEPENDENCIES,\n );\n }\n addArtifactDependencyToTargets(projectConfig, 'bundle');\n }\n addDependencyToTargetIfNotPresent(projectConfig, 'compile', 'generate');\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n // Recorded here and read by the declaration's predicates, so the packages\n // added below are exactly the ones the version sync will own.\n const metadata: TsRdbMetadata = {\n engine: options.engine,\n ...(iac ? { iac } : {}),\n };\n addGeneratorMetadata(\n tree,\n fullyQualifiedName,\n TS_RDB_GENERATOR_INFO,\n metadata,\n );\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac }, DEPENDENCIES);\n await addRdbInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n projectRoot: dir,\n nameClassName,\n nameKebabCase,\n databasePackageAlias: fullyQualifiedName,\n databaseName,\n adminUser: databaseUser,\n engine: options.engine,\n migrationBundleDir,\n createDbUserBundleDir: joinPathFragments(\n 'dist',\n projectConfig.root,\n 'bundle',\n 'create-db-user',\n ),\n framework: options.framework,\n migrationDockerImageTag,\n containerEngine,\n });\n }\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata,\n projectRoot: projectConfig.root,\n });\n\n // @prisma/adapter-pg depends on @types/pg ^8.16.0. Yarn does not dedupe it to\n // the workspace's pinned @types/pg, so it installs a separate copy under the\n // adapter's own node_modules whenever a newer @types/pg is published. The two\n // copies declare structurally incompatible Pool types, so passing our `new\n // Pool(...)` to `new PrismaPg(...)` fails to compile. Scope the resolution to\n // the adapter so other @types/pg consumers are unaffected. Classic yarn only\n // honours the `**/`-prefixed descriptor in a workspace and berry only the\n // bare one, so declare both.\n if (options.engine === 'postgres' && detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\n '**/@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n '@prisma/adapter-pg/@types/pg': TS_VERSIONS['@types/pg'],\n };\n return packageJson;\n });\n }\n\n registerPnpmBuiltDependencies(tree, {\n '@prisma/engines': false,\n prisma: false,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_RDB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsRdbGenerator;\n"],"names":["relative","detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readProjectConfiguration","updateJson","updateProjectConfiguration","writeJson","addTsDependencies","addStarExport","addTypeScriptBundleTarget","BUNDLE_DEPENDENCIES","resolveContainers","declareDependencies","ownedElsewhere","addDockerScanTarget","DOCKER_DEPENDENCIES","IMAGE_BUILD_CACHE","NODE_IMAGE_DEPENDENCIES","nodeImageVersions","formatFilesInSubtree","FS_DEPENDENCIES","FsCommands","updateGitIgnore","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","snakeCase","toClassName","getNpmScope","addArtifactDependencyToTargets","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","getRelativePathToRootByDirectory","registerPnpmBuiltDependencies","assignPort","addRdbInfra","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","PACKAGES_DIR","SHARED_SCRIPTS_DIR","SHARED_RDB_SCRIPTS_DEPENDENCIES","sharedRdbScriptsGenerator","TS_VERSIONS","tsProjectGenerator","getTsLibDetails","DEPENDENCIES","ts","name","when","m","engine","dev","root","TS_RDB_GENERATOR_INFO","filename","tsRdbGenerator","tree","options","nameKebabCase","nameClassName","databaseUser","databaseName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","tsConfig","include","projectConfig","localDbPort","localDbHost","localDbUser","localDbPassword","containerName","dockerImage","templateOptions","runtimeConfigKey","databasePackageAlias","databaseProvider","prismaVersion","prisma","prismaAdapterPackage","prismaAdapterClassName","localDbName","dirname","overwriteStrategy","KeepExisting","localDev","image","port","host","dbName","dbUser","dbPassword","dbEngine","patterns","waitForDbScript","scriptsDir","relativePathToRoot","fs","migrationBundleDir","migrationDockerImageTag","infra","targetFilePath","bundleOutputDir","bundleTarget","targets","commands","rolldownCommand","command","rm","mkdir","cp","parallel","generate","executor","outputs","cwd","dependsOn","continuous","env","LOCAL_DEV","iac","undefined","cache","project","trivyTargetName","dockerTargetName","imageTags","metadata","projectName","projectRoot","adminUser","createDbUserBundleDir","framework","packageJson","resolutions","languages"],"mappings":"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"}