@aws/nx-plugin 1.0.0-rc.45 → 1.0.0-rc.47

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 (165) hide show
  1. package/LICENSE-THIRD-PARTY +3 -60
  2. package/generators.json +9 -9
  3. package/package.json +7 -3
  4. package/src/agentcore-gateway/generator.js +12 -2
  5. package/src/agentcore-gateway/generator.js.map +1 -1
  6. package/src/infra/app/__snapshots__/generator.spec.ts.snap +25 -31
  7. package/src/infra/app/generator.js +9 -6
  8. package/src/infra/app/generator.js.map +1 -1
  9. package/src/license/config.js +1 -1
  10. package/src/license/config.js.map +1 -1
  11. package/src/mcp-server/schema.d.ts +1 -1
  12. package/src/mcp-server/tools/general-guidance.js +5 -6
  13. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  14. package/src/preset/__snapshots__/generator.spec.ts.snap +38 -7
  15. package/src/preset/generator.d.ts +1 -1
  16. package/src/preset/generator.js +4 -2
  17. package/src/preset/generator.js.map +1 -1
  18. package/src/preset/schema.d.js.map +1 -1
  19. package/src/preset/schema.d.ts +1 -0
  20. package/src/preset/schema.json +5 -0
  21. package/src/py/agent/generator.js +2 -1
  22. package/src/py/agent/generator.js.map +1 -1
  23. package/src/py/mcp-server/generator.js +2 -1
  24. package/src/py/mcp-server/generator.js.map +1 -1
  25. package/src/py/project/generator.js +2 -1
  26. package/src/py/project/generator.js.map +1 -1
  27. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +1 -0
  28. package/src/py/rdb/generator.js +7 -1
  29. package/src/py/rdb/generator.js.map +1 -1
  30. package/src/smithy/ts/api/generator.js +5 -2
  31. package/src/smithy/ts/api/generator.js.map +1 -1
  32. package/src/terraform/project/generator.js +4 -1
  33. package/src/terraform/project/generator.js.map +1 -1
  34. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +6 -6
  35. package/src/trpc/backend/generator.js +7 -5
  36. package/src/trpc/backend/generator.js.map +1 -1
  37. package/src/trpc/react/generator.js +4 -4
  38. package/src/trpc/react/generator.js.map +1 -1
  39. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +2 -2
  40. package/src/ts/agent/a2a-connection/generator.js +3 -2
  41. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  42. package/src/ts/agent/gateway-connection/generator.js +4 -3
  43. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  44. package/src/ts/agent/generator.js +8 -5
  45. package/src/ts/agent/generator.js.map +1 -1
  46. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +1 -1
  47. package/src/ts/agent/mcp-connection/generator.js +4 -3
  48. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  49. package/src/ts/agent/react-connection/generator.js +10 -19
  50. package/src/ts/agent/react-connection/generator.js.map +1 -1
  51. package/src/ts/astro-docs/generator.js +12 -3
  52. package/src/ts/astro-docs/generator.js.map +1 -1
  53. package/src/ts/dcr-proxy/generator.js +5 -5
  54. package/src/ts/dcr-proxy/generator.js.map +1 -1
  55. package/src/ts/dynamodb/generator.js +5 -2
  56. package/src/ts/dynamodb/generator.js.map +1 -1
  57. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -2
  58. package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
  59. package/src/ts/lambda-function/generator.js +3 -2
  60. package/src/ts/lambda-function/generator.js.map +1 -1
  61. package/src/ts/lib/ts-project-utils.js +17 -10
  62. package/src/ts/lib/ts-project-utils.js.map +1 -1
  63. package/src/ts/lib/vitest.js +2 -1
  64. package/src/ts/lib/vitest.js.map +1 -1
  65. package/src/ts/mcp-server/generator.js +11 -11
  66. package/src/ts/mcp-server/generator.js.map +1 -1
  67. package/src/ts/nx-generator/generator.js +5 -0
  68. package/src/ts/nx-generator/generator.js.map +1 -1
  69. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +5 -6
  70. package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
  71. package/src/ts/nx-plugin/utils.js +2 -1
  72. package/src/ts/nx-plugin/utils.js.map +1 -1
  73. package/src/ts/rdb/agent-connection/generator.js +1 -2
  74. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  75. package/src/ts/rdb/generator.js +10 -6
  76. package/src/ts/rdb/generator.js.map +1 -1
  77. package/src/ts/rdb/mcp-server-connection/generator.js +1 -2
  78. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  79. package/src/ts/rdb/smithy-connection/generator.js +1 -2
  80. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  81. package/src/ts/rdb/trpc-connection/generator.js +1 -2
  82. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  83. package/src/ts/react-website/agui/generator.js +5 -4
  84. package/src/ts/react-website/agui/generator.js.map +1 -1
  85. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +219 -79
  86. package/src/ts/react-website/app/generator.js +34 -14
  87. package/src/ts/react-website/app/generator.js.map +1 -1
  88. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +11 -6
  89. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +12 -2
  90. package/src/ts/react-website/cognito-auth/generator.js +3 -2
  91. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  92. package/src/ts/react-website/runtime-config/generator.js +2 -2
  93. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  94. package/src/ts/sync/generator.js +81 -3
  95. package/src/ts/sync/generator.js.map +1 -1
  96. package/src/utils/agent-connection/agent-connection.d.ts +1 -1
  97. package/src/utils/agent-connection/agent-connection.js +50 -1
  98. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  99. package/src/utils/agent-core-constructs/agent-core-constructs.js +10 -1
  100. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  101. package/src/utils/api-constructs/api-constructs.js +15 -1
  102. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  103. package/src/utils/bundle/bundle.js +2 -1
  104. package/src/utils/bundle/bundle.js.map +1 -1
  105. package/src/utils/commands.d.ts +5 -3
  106. package/src/utils/commands.js +24 -3
  107. package/src/utils/commands.js.map +1 -1
  108. package/src/utils/config/index.d.ts +16 -0
  109. package/src/utils/config/index.js.map +1 -1
  110. package/src/utils/config/utils.d.ts +3 -2
  111. package/src/utils/config/utils.js +4 -3
  112. package/src/utils/config/utils.js.map +1 -1
  113. package/src/utils/connection/open-api/react.js +3 -2
  114. package/src/utils/connection/open-api/react.js.map +1 -1
  115. package/src/utils/containers.js +1 -1
  116. package/src/utils/containers.js.map +1 -1
  117. package/src/utils/dependencies.d.ts +18 -0
  118. package/src/utils/dependencies.js +206 -0
  119. package/src/utils/dependencies.js.map +1 -0
  120. package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
  121. package/src/utils/files/shadcn/components.json.template +1 -1
  122. package/src/utils/format.d.ts +20 -1
  123. package/src/utils/format.js +83 -49
  124. package/src/utils/format.js.map +1 -1
  125. package/src/utils/fs.d.ts +1 -1
  126. package/src/utils/fs.js +1 -1
  127. package/src/utils/fs.js.map +1 -1
  128. package/src/utils/iac.js +1 -1
  129. package/src/utils/iac.js.map +1 -1
  130. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +11 -6
  131. package/src/utils/identity-constructs/identity-constructs.js +14 -3
  132. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  133. package/src/utils/init.d.ts +7 -1
  134. package/src/utils/init.js +38 -17
  135. package/src/utils/init.js.map +1 -1
  136. package/src/utils/install.js +3 -1
  137. package/src/utils/install.js.map +1 -1
  138. package/src/utils/module-format.d.ts +5 -8
  139. package/src/utils/module-format.js +29 -12
  140. package/src/utils/module-format.js.map +1 -1
  141. package/src/utils/npm-scope.d.ts +0 -4
  142. package/src/utils/npm-scope.js +0 -5
  143. package/src/utils/npm-scope.js.map +1 -1
  144. package/src/utils/pnpm-workspace.d.ts +1 -12
  145. package/src/utils/pnpm-workspace.js +3 -30
  146. package/src/utils/pnpm-workspace.js.map +1 -1
  147. package/src/utils/project-package-json.d.ts +39 -0
  148. package/src/utils/project-package-json.js +119 -0
  149. package/src/utils/project-package-json.js.map +1 -0
  150. package/src/utils/shared-constructs.js +6 -5
  151. package/src/utils/shared-constructs.js.map +1 -1
  152. package/src/utils/shared-dynamodb-scripts.js +4 -2
  153. package/src/utils/shared-dynamodb-scripts.js.map +1 -1
  154. package/src/utils/shared-infra-scripts.js +5 -4
  155. package/src/utils/shared-infra-scripts.js.map +1 -1
  156. package/src/utils/shared-rdb-scripts.js +14 -1
  157. package/src/utils/shared-rdb-scripts.js.map +1 -1
  158. package/src/utils/shared-shadcn.js +11 -8
  159. package/src/utils/shared-shadcn.js.map +1 -1
  160. package/src/utils/test.js +8 -3
  161. package/src/utils/test.js.map +1 -1
  162. package/src/utils/versions.d.ts +4 -0
  163. package/src/utils/versions.js +8 -1
  164. package/src/utils/versions.js.map +1 -1
  165. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +3 -0
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { addDependenciesToPackageJson, generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
4
+ */ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
5
5
  import tsProjectGenerator from "../lib/generator.js";
6
6
  import { addTypeScriptBundleTarget } from "../../utils/bundle/bundle.js";
7
7
  import { addDcrProxyInfra, DCR_PROXY_HANDLERS } from "../../utils/dcr-proxy-constructs/dcr-proxy-constructs.js";
8
+ import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
8
9
  import { formatFilesInSubtree } from "../../utils/format.js";
9
10
  import { resolveIac } from "../../utils/iac.js";
10
11
  import { installDependencies } from "../../utils/install.js";
@@ -48,14 +49,13 @@ export const tsDcrProxyGenerator = async (tree, options)=>{
48
49
  }, {
49
50
  overwriteStrategy: OverwriteStrategy.KeepExisting
50
51
  });
51
- // The token handler imports @aws-sdk/client-secrets-manager (provided by the
52
- // Lambda runtime but needed for type-checking and local dev) and the handlers
53
- // are typed against @types/aws-lambda.
52
+ // Handler imports: @aws-sdk/client-secrets-manager (token handler) and
53
+ // @types/aws-lambda (handler signatures).
54
54
  addDependenciesToPackageJson(tree, withVersions([
55
55
  '@aws-sdk/client-secrets-manager'
56
56
  ]), withVersions([
57
57
  '@types/aws-lambda'
58
- ]));
58
+ ]), joinPathFragments(proxyRoot, 'package.json'));
59
59
  // Bundle each handler independently to dist/<root>/bundle/<handler>/index.js
60
60
  for (const handler of DCR_PROXY_HANDLERS){
61
61
  await addTypeScriptBundleTarget(tree, projectConfig, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/dcr-proxy/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n addDependenciesToPackageJson,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport tsProjectGenerator from '../../ts/lib/generator';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport {\n addDcrProxyInfra,\n DCR_PROXY_HANDLERS,\n type DcrProxyHandler,\n} from '../../utils/dcr-proxy-constructs/dcr-proxy-constructs';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { kebabCase, toClassName } from '../../utils/names';\nimport { getNpmScopePrefix } from '../../utils/npm-scope';\nimport {\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport { withVersions } from '../../utils/versions';\nimport type { TsDcrProxyGeneratorSchema } from './schema';\n\nexport const TS_DCR_PROXY_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsDcrProxyGenerator = async (\n tree: Tree,\n options: TsDcrProxyGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const name = kebabCase(options.name ? options.name : 'dcr-proxy');\n const nameClassName = toClassName(name);\n\n const iac = await resolveIac(tree, options.iac);\n\n // The handlers live in a standalone TypeScript project so they can be bundled\n // (rolldown) into deployable artifacts referenced by both CDK and Terraform.\n const namespace = getNpmScopePrefix(tree);\n const proxyProjectName = `${namespace}${name}`;\n\n let projectExists: boolean;\n try {\n readProjectConfigurationUnqualified(tree, proxyProjectName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n await tsProjectGenerator(tree, {\n name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n preferInstallDependencies: false,\n });\n }\n\n const projectConfig = readProjectConfigurationUnqualified(\n tree,\n proxyProjectName,\n );\n const proxyRoot = projectConfig.root;\n\n // Place the Lambda handlers in the project source\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '..',\n '..',\n 'utils',\n 'dcr-proxy-constructs',\n 'files',\n 'project',\n ),\n proxyRoot,\n { nameClassName, nameKebabCase: name },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // The token handler imports @aws-sdk/client-secrets-manager (provided by the\n // Lambda runtime but needed for type-checking and local dev) and the handlers\n // are typed against @types/aws-lambda.\n addDependenciesToPackageJson(\n tree,\n withVersions(['@aws-sdk/client-secrets-manager']),\n withVersions(['@types/aws-lambda']),\n );\n\n // Bundle each handler independently to dist/<root>/bundle/<handler>/index.js\n for (const handler of DCR_PROXY_HANDLERS) {\n await addTypeScriptBundleTarget(tree, projectConfig, {\n targetFilePath: `src/handlers/${handler}.ts`,\n bundleOutputDir: handler,\n external: [/@aws-sdk\\/.*/], // lambda runtime provides the aws sdk\n platform: 'node',\n });\n }\n\n projectConfig.targets = sortObjectKeys(projectConfig.targets);\n updateProjectConfiguration(tree, projectConfig.name, projectConfig);\n\n const bundlePathsFromRoot = Object.fromEntries(\n DCR_PROXY_HANDLERS.map((handler) => [\n handler,\n joinPathFragments('dist', proxyRoot, 'bundle', handler),\n ]),\n ) as Record<DcrProxyHandler, string>;\n\n await sharedConstructsGenerator(tree, { iac });\n\n await addDcrProxyInfra(tree, {\n dcrProxyNameClassName: nameClassName,\n dcrProxyNameKebabCase: name,\n proxyProjectName,\n bundlePathsFromRoot,\n iac,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_DCR_PROXY_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsDcrProxyGenerator;\n"],"names":["addDependenciesToPackageJson","generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","tsProjectGenerator","addTypeScriptBundleTarget","addDcrProxyInfra","DCR_PROXY_HANDLERS","formatFilesInSubtree","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","getNpmScopePrefix","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","sharedConstructsGenerator","withVersions","TS_DCR_PROXY_GENERATOR_INFO","filename","tsDcrProxyGenerator","tree","options","name","nameClassName","iac","namespace","proxyProjectName","projectExists","directory","subDirectory","preferInstallDependencies","projectConfig","proxyRoot","root","dirname","nameKebabCase","overwriteStrategy","KeepExisting","handler","targetFilePath","bundleOutputDir","external","platform","targets","bundlePathsFromRoot","Object","fromEntries","map","dcrProxyNameClassName","dcrProxyNameKebabCase","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/dcr-proxy/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport tsProjectGenerator from '../../ts/lib/generator';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport {\n addDcrProxyInfra,\n DCR_PROXY_HANDLERS,\n type DcrProxyHandler,\n} from '../../utils/dcr-proxy-constructs/dcr-proxy-constructs';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { kebabCase, toClassName } from '../../utils/names';\nimport { getNpmScopePrefix } from '../../utils/npm-scope';\nimport {\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport { withVersions } from '../../utils/versions';\nimport type { TsDcrProxyGeneratorSchema } from './schema';\n\nexport const TS_DCR_PROXY_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsDcrProxyGenerator = async (\n tree: Tree,\n options: TsDcrProxyGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const name = kebabCase(options.name ? options.name : 'dcr-proxy');\n const nameClassName = toClassName(name);\n\n const iac = await resolveIac(tree, options.iac);\n\n // The handlers live in a standalone TypeScript project so they can be bundled\n // (rolldown) into deployable artifacts referenced by both CDK and Terraform.\n const namespace = getNpmScopePrefix(tree);\n const proxyProjectName = `${namespace}${name}`;\n\n let projectExists: boolean;\n try {\n readProjectConfigurationUnqualified(tree, proxyProjectName);\n projectExists = true;\n } catch {\n projectExists = false;\n }\n\n if (!projectExists) {\n await tsProjectGenerator(tree, {\n name,\n directory: options.directory,\n subDirectory: options.subDirectory,\n preferInstallDependencies: false,\n });\n }\n\n const projectConfig = readProjectConfigurationUnqualified(\n tree,\n proxyProjectName,\n );\n const proxyRoot = projectConfig.root;\n\n // Place the Lambda handlers in the project source\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '..',\n '..',\n 'utils',\n 'dcr-proxy-constructs',\n 'files',\n 'project',\n ),\n proxyRoot,\n { nameClassName, nameKebabCase: name },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Handler imports: @aws-sdk/client-secrets-manager (token handler) and\n // @types/aws-lambda (handler signatures).\n addDependenciesToPackageJson(\n tree,\n withVersions(['@aws-sdk/client-secrets-manager']),\n withVersions(['@types/aws-lambda']),\n joinPathFragments(proxyRoot, 'package.json'),\n );\n\n // Bundle each handler independently to dist/<root>/bundle/<handler>/index.js\n for (const handler of DCR_PROXY_HANDLERS) {\n await addTypeScriptBundleTarget(tree, projectConfig, {\n targetFilePath: `src/handlers/${handler}.ts`,\n bundleOutputDir: handler,\n external: [/@aws-sdk\\/.*/], // lambda runtime provides the aws sdk\n platform: 'node',\n });\n }\n\n projectConfig.targets = sortObjectKeys(projectConfig.targets);\n updateProjectConfiguration(tree, projectConfig.name, projectConfig);\n\n const bundlePathsFromRoot = Object.fromEntries(\n DCR_PROXY_HANDLERS.map((handler) => [\n handler,\n joinPathFragments('dist', proxyRoot, 'bundle', handler),\n ]),\n ) as Record<DcrProxyHandler, string>;\n\n await sharedConstructsGenerator(tree, { iac });\n\n await addDcrProxyInfra(tree, {\n dcrProxyNameClassName: nameClassName,\n dcrProxyNameKebabCase: name,\n proxyProjectName,\n bundlePathsFromRoot,\n iac,\n });\n\n await addGeneratorMetricsIfApplicable(tree, [TS_DCR_PROXY_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsDcrProxyGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","tsProjectGenerator","addTypeScriptBundleTarget","addDcrProxyInfra","DCR_PROXY_HANDLERS","addDependenciesToPackageJson","formatFilesInSubtree","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","getNpmScopePrefix","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","sharedConstructsGenerator","withVersions","TS_DCR_PROXY_GENERATOR_INFO","filename","tsDcrProxyGenerator","tree","options","name","nameClassName","iac","namespace","proxyProjectName","projectExists","directory","subDirectory","preferInstallDependencies","projectConfig","proxyRoot","root","dirname","nameKebabCase","overwriteStrategy","KeepExisting","handler","targetFilePath","bundleOutputDir","external","platform","targets","bundlePathsFromRoot","Object","fromEntries","map","dcrProxyNameClassName","dcrProxyNameKebabCase","languages"],"mappings":"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"}
@@ -2,8 +2,9 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */ import { relative } from "node:path";
5
- import { addDependenciesToPackageJson, generateFiles, joinPathFragments, readProjectConfiguration, updateProjectConfiguration } from "@nx/devkit";
5
+ import { generateFiles, joinPathFragments, readProjectConfiguration, updateProjectConfiguration } from "@nx/devkit";
6
6
  import { resolveContainers } from "../../utils/containers.js";
7
+ import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
7
8
  import { addDynamoDBInfra } from "../../utils/dynamodb-constructs/dynamodb-constructs.js";
8
9
  import { formatFilesInSubtree } from "../../utils/format.js";
9
10
  import { resolveIac } from "../../utils/iac.js";
@@ -99,9 +100,11 @@ export const tsDynamoDBGenerator = async (tree, options)=>{
99
100
  '@aws-lambda-powertools/parameters',
100
101
  '@aws-sdk/client-appconfigdata'
101
102
  ]), withVersions([
102
- 'tsx',
103
103
  '@types/aws-lambda',
104
104
  '@types/node'
105
+ ]), joinPathFragments(dir, 'package.json'));
106
+ addDependenciesToPackageJson(tree, {}, withVersions([
107
+ 'tsx'
105
108
  ]));
106
109
  await addGeneratorMetricsIfApplicable(tree, [
107
110
  TS_DYNAMODB_GENERATOR_INFO
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/dynamodb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { relative } from 'node:path';\nimport {\n addDependenciesToPackageJson,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n readProjectConfiguration,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { resolveContainers } from '../../utils/containers';\nimport { addDynamoDBInfra } from '../../utils/dynamodb-constructs/dynamodb-constructs';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { esmVars } from '../../utils/module-format';\nimport { kebabCase, toClassName } from '../../utils/names';\nimport { getNpmScope } from '../../utils/npm-scope';\nimport {\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx';\nimport { assignSharedPort } from '../../utils/port';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport {\n DYNAMODB_GENERATOR_IDS,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants';\nimport { sharedDynamoDBScriptsGenerator } from '../../utils/shared-dynamodb-scripts';\nimport { withVersions } from '../../utils/versions';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator';\nimport type { TsDynamoDBGeneratorSchema } from './schema';\n\nexport const TS_DYNAMODB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsDynamoDBGenerator = async (\n tree: Tree,\n options: TsDynamoDBGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameKebabCase = kebabCase(options.name);\n const nameClassName = toClassName(options.name);\n const localTableName = `${getNpmScope(tree)}-${kebabCase(options.tableName ?? 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 preferInstallDependencies: false,\n });\n }\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n\n const localDynamoDBPort = assignSharedPort(\n tree,\n projectConfig,\n DYNAMODB_GENERATOR_IDS,\n 8000,\n );\n\n const containerName = `${getNpmScope(tree)}-dynamodb`;\n\n const templateOptions = {\n runtimeConfigKey: nameClassName,\n localDynamoDBPort,\n localTableName,\n containerName,\n containerEngine,\n ...esmVars(tree),\n };\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n );\n\n await sharedDynamoDBScriptsGenerator(tree);\n\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'dynamodb'),\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 continuous: true,\n options: {\n commands: [\n `tsx ${scriptsDir}/start-container.ts`,\n `tsx ${scriptsDir}/create-local-table.ts`,\n ],\n parallel: true,\n cwd: '{projectRoot}',\n },\n };\n\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n addGeneratorMetadata(tree, fullyQualifiedName, TS_DYNAMODB_GENERATOR_INFO);\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac });\n await addDynamoDBInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n nameClassName,\n nameKebabCase,\n tableName: localTableName,\n projectRoot: dir,\n });\n }\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@aws-sdk/client-dynamodb',\n 'electrodb',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n ]),\n withVersions(['tsx', '@types/aws-lambda', '@types/node']),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_DYNAMODB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsDynamoDBGenerator;\n"],"names":["relative","addDependenciesToPackageJson","generateFiles","joinPathFragments","readProjectConfiguration","updateProjectConfiguration","resolveContainers","addDynamoDBInfra","formatFilesInSubtree","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","toClassName","getNpmScope","addGeneratorMetadata","getGeneratorInfo","assignSharedPort","sharedConstructsGenerator","DYNAMODB_GENERATOR_IDS","PACKAGES_DIR","SHARED_SCRIPTS_DIR","sharedDynamoDBScriptsGenerator","withVersions","tsProjectGenerator","getTsLibDetails","TS_DYNAMODB_GENERATOR_INFO","filename","tsDynamoDBGenerator","tree","options","nameKebabCase","name","nameClassName","localTableName","tableName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","projectConfig","localDynamoDBPort","containerName","templateOptions","runtimeConfigKey","dirname","scriptsDir","targets","executor","command","cwd","continuous","commands","parallel","infra","iac","projectName","projectRoot","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/dynamodb/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { relative } from 'node:path';\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n readProjectConfiguration,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { resolveContainers } from '../../utils/containers';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies';\nimport { addDynamoDBInfra } from '../../utils/dynamodb-constructs/dynamodb-constructs';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { esmVars } from '../../utils/module-format';\nimport { kebabCase, toClassName } from '../../utils/names';\nimport { getNpmScope } from '../../utils/npm-scope';\nimport {\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n} from '../../utils/nx';\nimport { assignSharedPort } from '../../utils/port';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport {\n DYNAMODB_GENERATOR_IDS,\n PACKAGES_DIR,\n SHARED_SCRIPTS_DIR,\n} from '../../utils/shared-constructs-constants';\nimport { sharedDynamoDBScriptsGenerator } from '../../utils/shared-dynamodb-scripts';\nimport { withVersions } from '../../utils/versions';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator';\nimport type { TsDynamoDBGeneratorSchema } from './schema';\n\nexport const TS_DYNAMODB_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsDynamoDBGenerator = async (\n tree: Tree,\n options: TsDynamoDBGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const nameKebabCase = kebabCase(options.name);\n const nameClassName = toClassName(options.name);\n const localTableName = `${getNpmScope(tree)}-${kebabCase(options.tableName ?? 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 preferInstallDependencies: false,\n });\n }\n\n const projectConfig = readProjectConfiguration(tree, fullyQualifiedName);\n\n const localDynamoDBPort = assignSharedPort(\n tree,\n projectConfig,\n DYNAMODB_GENERATOR_IDS,\n 8000,\n );\n\n const containerName = `${getNpmScope(tree)}-dynamodb`;\n\n const templateOptions = {\n runtimeConfigKey: nameClassName,\n localDynamoDBPort,\n localTableName,\n containerName,\n containerEngine,\n ...esmVars(tree),\n };\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n dir,\n templateOptions,\n );\n\n await sharedDynamoDBScriptsGenerator(tree);\n\n const scriptsDir = relative(\n dir,\n joinPathFragments(PACKAGES_DIR, SHARED_SCRIPTS_DIR, 'src', 'dynamodb'),\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 continuous: true,\n options: {\n commands: [\n `tsx ${scriptsDir}/start-container.ts`,\n `tsx ${scriptsDir}/create-local-table.ts`,\n ],\n parallel: true,\n cwd: '{projectRoot}',\n },\n };\n\n updateProjectConfiguration(tree, fullyQualifiedName, projectConfig);\n addGeneratorMetadata(tree, fullyQualifiedName, TS_DYNAMODB_GENERATOR_INFO);\n\n if (options.infra !== 'none') {\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac });\n await addDynamoDBInfra(tree, {\n iac,\n projectName: fullyQualifiedName,\n nameClassName,\n nameKebabCase,\n tableName: localTableName,\n projectRoot: dir,\n });\n }\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@aws-sdk/client-dynamodb',\n 'electrodb',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n ]),\n withVersions(['@types/aws-lambda', '@types/node']),\n joinPathFragments(dir, 'package.json'),\n );\n addDependenciesToPackageJson(tree, {}, withVersions(['tsx']));\n\n await addGeneratorMetricsIfApplicable(tree, [TS_DYNAMODB_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsDynamoDBGenerator;\n"],"names":["relative","generateFiles","joinPathFragments","readProjectConfiguration","updateProjectConfiguration","resolveContainers","addDependenciesToPackageJson","addDynamoDBInfra","formatFilesInSubtree","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","toClassName","getNpmScope","addGeneratorMetadata","getGeneratorInfo","assignSharedPort","sharedConstructsGenerator","DYNAMODB_GENERATOR_IDS","PACKAGES_DIR","SHARED_SCRIPTS_DIR","sharedDynamoDBScriptsGenerator","withVersions","tsProjectGenerator","getTsLibDetails","TS_DYNAMODB_GENERATOR_INFO","filename","tsDynamoDBGenerator","tree","options","nameKebabCase","name","nameClassName","localTableName","tableName","containerEngine","fullyQualifiedName","dir","directory","subDirectory","projectExists","preferInstallDependencies","projectConfig","localDynamoDBPort","containerName","templateOptions","runtimeConfigKey","dirname","scriptsDir","targets","executor","command","cwd","continuous","commands","parallel","infra","iac","projectName","projectRoot","languages"],"mappings":"AAAA;;;CAGC,GAED,SAASA,QAAQ,QAAQ,YAAY;AACrC,SAEEC,aAAa,EACbC,iBAAiB,EACjBC,wBAAwB,EAExBC,0BAA0B,QACrB,aAAa;AACpB,SAASC,iBAAiB,QAAQ,4BAAyB;AAC3D,SAASC,4BAA4B,QAAQ,8BAA2B;AACxE,SAASC,gBAAgB,QAAQ,yDAAsD;AACvF,SAASC,oBAAoB,QAAQ,wBAAqB;AAC1D,SAASC,UAAU,QAAQ,qBAAkB;AAC7C,SAASC,mBAAmB,QAAQ,yBAAsB;AAC1D,SAASC,+BAA+B,QAAQ,yBAAsB;AACtE,SAASC,OAAO,QAAQ,+BAA4B;AACpD,SAASC,SAAS,EAAEC,WAAW,QAAQ,uBAAoB;AAC3D,SAASC,WAAW,QAAQ,2BAAwB;AACpD,SACEC,oBAAoB,EACpBC,gBAAgB,QAEX,oBAAiB;AACxB,SAASC,gBAAgB,QAAQ,sBAAmB;AACpD,SAASC,yBAAyB,QAAQ,mCAAgC;AAC1E,SACEC,sBAAsB,EACtBC,YAAY,EACZC,kBAAkB,QACb,6CAA0C;AACjD,SAASC,8BAA8B,QAAQ,yCAAsC;AACrF,SAASC,YAAY,QAAQ,0BAAuB;AACpD,OAAOC,sBAAsBC,eAAe,QAAQ,sBAAmB;AAGvE,OAAO,MAAMC,6BAA8CV,iBACzD,YAAYW,QAAQ,EACpB;AAEF,OAAO,MAAMC,sBAAsB,OACjCC,MACAC;IAEA,MAAMC,gBAAgBnB,UAAUkB,QAAQE,IAAI;IAC5C,MAAMC,gBAAgBpB,YAAYiB,QAAQE,IAAI;IAC9C,MAAME,iBAAiB,GAAGpB,YAAYe,MAAM,CAAC,EAAEjB,UAAUkB,QAAQK,SAAS,IAAIL,QAAQE,IAAI,GAAG;IAC7F,MAAMI,kBAAkB,MAAMhC,kBAAkByB,MAAM;IACtD,MAAM,EAAEQ,kBAAkB,EAAEC,GAAG,EAAE,GAAGb,gBAAgBI,MAAM;QACxDG,MAAMF,QAAQE,IAAI;QAClBO,WAAWT,QAAQS,SAAS;QAC5BC,cAAcV,QAAQU,YAAY;IACpC;IAEA,IAAIC;IACJ,IAAI;QACFvC,yBAAyB2B,MAAMQ;QAC/BI,gBAAgB;IAClB,EAAE,OAAM;QACNA,gBAAgB;IAClB;IAEA,IAAI,CAACA,eAAe;QAClB,MAAMjB,mBAAmBK,MAAM;YAC7BG,MAAMF,QAAQE,IAAI;YAClBO,WAAWT,QAAQS,SAAS;YAC5BG,2BAA2B;QAC7B;IACF;IAEA,MAAMC,gBAAgBzC,yBAAyB2B,MAAMQ;IAErD,MAAMO,oBAAoB3B,iBACxBY,MACAc,eACAxB,wBACA;IAGF,MAAM0B,gBAAgB,GAAG/B,YAAYe,MAAM,SAAS,CAAC;IAErD,MAAMiB,kBAAkB;QACtBC,kBAAkBd;QAClBW;QACAV;QACAW;QACAT;QACA,GAAGzB,QAAQkB,KAAK;IAClB;IAEA7B,cACE6B,MACA5B,kBAAkB,YAAY+C,OAAO,EAAE,UACvCV,KACAQ;IAGF,MAAMxB,+BAA+BO;IAErC,MAAMoB,aAAalD,SACjBuC,KACArC,kBAAkBmB,cAAcC,oBAAoB,OAAO;IAG7DsB,cAAcO,OAAO,CAAC,aAAa,GAAG;QACpCC,UAAU;QACVrB,SAAS;YACPsB,SAAS,CAAC,IAAI,EAAEH,WAAW,cAAc,CAAC;YAC1CI,KAAK;QACP;IACF;IACAV,cAAcO,OAAO,CAAC,MAAM,GAAG;QAC7BC,UAAU;QACVG,YAAY;QACZxB,SAAS;YACPyB,UAAU;gBACR,CAAC,IAAI,EAAEN,WAAW,mBAAmB,CAAC;gBACtC,CAAC,IAAI,EAAEA,WAAW,sBAAsB,CAAC;aAC1C;YACDO,UAAU;YACVH,KAAK;QACP;IACF;IAEAlD,2BAA2B0B,MAAMQ,oBAAoBM;IACrD5B,qBAAqBc,MAAMQ,oBAAoBX;IAE/C,IAAII,QAAQ2B,KAAK,KAAK,QAAQ;QAC5B,MAAMC,MAAM,MAAMlD,WAAWqB,MAAMC,QAAQ4B,GAAG;QAC9C,MAAMxC,0BAA0BW,MAAM;YAAE6B;QAAI;QAC5C,MAAMpD,iBAAiBuB,MAAM;YAC3B6B;YACAC,aAAatB;YACbJ;YACAF;YACAI,WAAWD;YACX0B,aAAatB;QACf;IACF;IAEAjC,6BACEwB,MACAN,aAAa;QACX;QACA;QACA;QACA;KACD,GACDA,aAAa;QAAC;QAAqB;KAAc,GACjDtB,kBAAkBqC,KAAK;IAEzBjC,6BAA6BwB,MAAM,CAAC,GAAGN,aAAa;QAAC;KAAM;IAE3D,MAAMb,gCAAgCmB,MAAM;QAACH;KAA2B;IAExE,MAAMnB,qBAAqBsB;IAC3B,OAAO,IACLpB,oBAAoBoB,MAAMC,QAAQY,yBAAyB,EAAE;YAC3DmB,WAAW;gBAAC;aAAa;QAC3B;AACJ,EAAE;AAEF,eAAejC,oBAAoB"}
@@ -36,7 +36,8 @@ import { injectLambdaContext } from '@aws-lambda-powertools/logger/middleware';
36
36
  import { Logger } from '@aws-lambda-powertools/logger';
37
37
  import { Metrics } from '@aws-lambda-powertools/metrics';
38
38
  import { logMetrics } from '@aws-lambda-powertools/metrics/middleware';
39
- export type { Context } from 'aws-lambda';
39
+ import type { Context } from 'aws-lambda';
40
+ export type { Context };
40
41
 
41
42
  process.env.POWERTOOLS_METRICS_NAMESPACE = 'TestFunction';
42
43
  process.env.POWERTOOLS_SERVICE_NAME = 'TestFunction';
@@ -70,7 +71,8 @@ import { injectLambdaContext } from '@aws-lambda-powertools/logger/middleware';
70
71
  import { Logger } from '@aws-lambda-powertools/logger';
71
72
  import { Metrics } from '@aws-lambda-powertools/metrics';
72
73
  import { logMetrics } from '@aws-lambda-powertools/metrics/middleware';
73
- export type { Context } from 'aws-lambda';
74
+ import type { Context } from 'aws-lambda';
75
+ export type { Context };
74
76
 
75
77
  process.env.POWERTOOLS_METRICS_NAMESPACE = 'TestFunction';
76
78
  process.env.POWERTOOLS_SERVICE_NAME = 'TestFunction';
@@ -13,7 +13,8 @@ import { logMetrics } from '@aws-lambda-powertools/metrics/middleware';
13
13
  <%_ if (returnType.imports.length > 0) { _%>
14
14
  import type { <%= returnType.imports.join(', ') %> } from 'aws-lambda';
15
15
  <%_ } else { _%>
16
- export type { Context } from 'aws-lambda';
16
+ import type { Context } from 'aws-lambda';
17
+ export type { Context };
17
18
  <%_ } _%>
18
19
 
19
20
  process.env.POWERTOOLS_METRICS_NAMESPACE = "<%= lambdaFunctionClassName %>";
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { addDependenciesToPackageJson, generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
4
+ */ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
5
5
  import camelCase from "lodash.camelcase";
6
6
  import { addTypeScriptBundleTarget } from "../../utils/bundle/bundle.js";
7
+ import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
7
8
  import { formatFilesInSubtree } from "../../utils/format.js";
8
9
  import { addLambdaFunctionInfra } from "../../utils/function-constructs/function-constructs.js";
9
10
  import { resolveIac } from "../../utils/iac.js";
@@ -94,7 +95,7 @@ export const TS_LAMBDA_FUNCTION_GENERATOR_INFO = getGeneratorInfo(import.meta.fi
94
95
  'zod'
95
96
  ]), withVersions([
96
97
  '@types/aws-lambda'
97
- ]));
98
+ ]), joinPathFragments(dir, 'package.json'));
98
99
  addComponentGeneratorMetadata(tree, projectConfig.name, TS_LAMBDA_FUNCTION_GENERATOR_INFO, functionPathFromProjectRoot, lambdaFunctionKebabCase);
99
100
  await addGeneratorMetricsIfApplicable(tree, [
100
101
  TS_LAMBDA_FUNCTION_GENERATOR_INFO
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/lambda-function/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n addDependenciesToPackageJson,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport camelCase from 'lodash.camelcase';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { addLambdaFunctionInfra } from '../../utils/function-constructs/function-constructs';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { pascalCase, toClassName, toKebabCase } from '../../utils/names';\nimport {\n addComponentGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport { withVersions } from '../../utils/versions';\nimport { TS_HANDLER_RETURN_TYPES } from './io';\nimport type { TsLambdaFunctionGeneratorSchema } from './schema';\n\nexport const TS_LAMBDA_FUNCTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\n/**\n * Generates a TypeScript Lambda Function to add to a TypeScript project\n */\nexport const tsLambdaFunctionGenerator = async (\n tree: Tree,\n schema: TsLambdaFunctionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const projectConfig = readProjectConfigurationUnqualified(\n tree,\n schema.project,\n );\n\n const tsconfigPath = joinPathFragments(projectConfig.root, 'tsconfig.json');\n\n // Check if the project has a tsconfig.json file\n if (!tree.exists(tsconfigPath)) {\n throw new Error(\n `This generator does not support selected project ${schema.project}. The project must be a typescript project (ie contain a tsconfig.json)`,\n );\n }\n\n if (!projectConfig.sourceRoot) {\n throw new Error(\n `This project does not have a source root. Please add a source root to the project configuration before running this generator.`,\n );\n }\n\n const dir = projectConfig.root;\n const projectNameWithOutScope = projectConfig.name.split('/').pop();\n const projectNameKebabCase = toKebabCase(projectNameWithOutScope);\n const nameKebabCase = toKebabCase(schema.name);\n\n const constructFunctionNameKebabCase = `${projectNameKebabCase}-${nameKebabCase}`;\n const constructFunctionClassName = toClassName(\n constructFunctionNameKebabCase,\n );\n const lambdaFunctionCamelCase = camelCase(schema.name);\n const lambdaFunctionClassName = pascalCase(schema.name);\n const lambdaFunctionKebabCase = toKebabCase(schema.name);\n\n const functionPathFromProjectRoot = joinPathFragments(\n 'src',\n schema.functionPath ?? '',\n `${lambdaFunctionKebabCase}.ts`,\n );\n const functionPath = joinPathFragments(\n projectConfig.root,\n functionPathFromProjectRoot,\n );\n\n const infra = schema.infra ?? 'lambda';\n const handlerAlreadyExists = tree.exists(functionPath);\n\n if (handlerAlreadyExists && infra === 'none') {\n throw new Error(\n `This project already has a lambda function with the name ${nameKebabCase}. Please remove the lambda function before running this generator or use a different name.`,\n );\n }\n\n const bundleOutputDir = joinPathFragments('lambda', lambdaFunctionKebabCase);\n\n if (infra !== 'none') {\n const iac = await resolveIac(tree, schema.iac);\n\n await sharedConstructsGenerator(tree, {\n iac,\n });\n\n await addLambdaFunctionInfra(tree, {\n functionProjectName: projectConfig.name,\n nameClassName: constructFunctionClassName,\n nameKebabCase: constructFunctionNameKebabCase,\n handler: 'index.handler',\n runtime: 'node',\n bundlePathFromRoot: joinPathFragments(\n 'dist',\n dir,\n 'bundle',\n bundleOutputDir,\n ),\n iac,\n });\n }\n\n const enhancedOptions = {\n ...schema,\n lambdaFunctionCamelCase,\n lambdaFunctionClassName,\n lambdaFunctionKebabCase,\n returnType: TS_HANDLER_RETURN_TYPES[schema.event],\n };\n\n if (infra !== 'none') {\n // Add a bundle target for the function\n await addTypeScriptBundleTarget(tree, projectConfig, {\n targetFilePath: functionPathFromProjectRoot,\n bundleOutputDir,\n external: [/@aws-sdk\\/.*/], // lambda runtime provides aws sdk\n });\n }\n\n projectConfig.targets = sortObjectKeys(projectConfig.targets);\n updateProjectConfiguration(tree, projectConfig.name, projectConfig);\n\n // Generate the lambda handler file\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'handler'),\n joinPathFragments(projectConfig.sourceRoot, schema.functionPath ?? ''),\n enhancedOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@aws-lambda-powertools/tracer',\n '@aws-lambda-powertools/logger',\n '@aws-lambda-powertools/metrics',\n '@aws-lambda-powertools/parameters',\n '@aws-lambda-powertools/parser',\n '@aws-sdk/client-appconfigdata',\n '@middy/core',\n 'zod',\n ]),\n withVersions(['@types/aws-lambda']),\n );\n\n addComponentGeneratorMetadata(\n tree,\n projectConfig.name,\n TS_LAMBDA_FUNCTION_GENERATOR_INFO,\n functionPathFromProjectRoot,\n lambdaFunctionKebabCase,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_LAMBDA_FUNCTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n\n return () =>\n installDependencies(tree, schema.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsLambdaFunctionGenerator;\n"],"names":["addDependenciesToPackageJson","generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","camelCase","addTypeScriptBundleTarget","formatFilesInSubtree","addLambdaFunctionInfra","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","pascalCase","toClassName","toKebabCase","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","sharedConstructsGenerator","withVersions","TS_HANDLER_RETURN_TYPES","TS_LAMBDA_FUNCTION_GENERATOR_INFO","filename","tsLambdaFunctionGenerator","tree","schema","projectConfig","project","tsconfigPath","root","exists","Error","sourceRoot","dir","projectNameWithOutScope","name","split","pop","projectNameKebabCase","nameKebabCase","constructFunctionNameKebabCase","constructFunctionClassName","lambdaFunctionCamelCase","lambdaFunctionClassName","lambdaFunctionKebabCase","functionPathFromProjectRoot","functionPath","infra","handlerAlreadyExists","bundleOutputDir","iac","functionProjectName","nameClassName","handler","runtime","bundlePathFromRoot","enhancedOptions","returnType","event","targetFilePath","external","targets","dirname","overwriteStrategy","KeepExisting","preferInstallDependencies","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/lambda-function/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport camelCase from 'lodash.camelcase';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { addLambdaFunctionInfra } from '../../utils/function-constructs/function-constructs';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { pascalCase, toClassName, toKebabCase } from '../../utils/names';\nimport {\n addComponentGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport { withVersions } from '../../utils/versions';\nimport { TS_HANDLER_RETURN_TYPES } from './io';\nimport type { TsLambdaFunctionGeneratorSchema } from './schema';\n\nexport const TS_LAMBDA_FUNCTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\n/**\n * Generates a TypeScript Lambda Function to add to a TypeScript project\n */\nexport const tsLambdaFunctionGenerator = async (\n tree: Tree,\n schema: TsLambdaFunctionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const projectConfig = readProjectConfigurationUnqualified(\n tree,\n schema.project,\n );\n\n const tsconfigPath = joinPathFragments(projectConfig.root, 'tsconfig.json');\n\n // Check if the project has a tsconfig.json file\n if (!tree.exists(tsconfigPath)) {\n throw new Error(\n `This generator does not support selected project ${schema.project}. The project must be a typescript project (ie contain a tsconfig.json)`,\n );\n }\n\n if (!projectConfig.sourceRoot) {\n throw new Error(\n `This project does not have a source root. Please add a source root to the project configuration before running this generator.`,\n );\n }\n\n const dir = projectConfig.root;\n const projectNameWithOutScope = projectConfig.name.split('/').pop();\n const projectNameKebabCase = toKebabCase(projectNameWithOutScope);\n const nameKebabCase = toKebabCase(schema.name);\n\n const constructFunctionNameKebabCase = `${projectNameKebabCase}-${nameKebabCase}`;\n const constructFunctionClassName = toClassName(\n constructFunctionNameKebabCase,\n );\n const lambdaFunctionCamelCase = camelCase(schema.name);\n const lambdaFunctionClassName = pascalCase(schema.name);\n const lambdaFunctionKebabCase = toKebabCase(schema.name);\n\n const functionPathFromProjectRoot = joinPathFragments(\n 'src',\n schema.functionPath ?? '',\n `${lambdaFunctionKebabCase}.ts`,\n );\n const functionPath = joinPathFragments(\n projectConfig.root,\n functionPathFromProjectRoot,\n );\n\n const infra = schema.infra ?? 'lambda';\n const handlerAlreadyExists = tree.exists(functionPath);\n\n if (handlerAlreadyExists && infra === 'none') {\n throw new Error(\n `This project already has a lambda function with the name ${nameKebabCase}. Please remove the lambda function before running this generator or use a different name.`,\n );\n }\n\n const bundleOutputDir = joinPathFragments('lambda', lambdaFunctionKebabCase);\n\n if (infra !== 'none') {\n const iac = await resolveIac(tree, schema.iac);\n\n await sharedConstructsGenerator(tree, {\n iac,\n });\n\n await addLambdaFunctionInfra(tree, {\n functionProjectName: projectConfig.name,\n nameClassName: constructFunctionClassName,\n nameKebabCase: constructFunctionNameKebabCase,\n handler: 'index.handler',\n runtime: 'node',\n bundlePathFromRoot: joinPathFragments(\n 'dist',\n dir,\n 'bundle',\n bundleOutputDir,\n ),\n iac,\n });\n }\n\n const enhancedOptions = {\n ...schema,\n lambdaFunctionCamelCase,\n lambdaFunctionClassName,\n lambdaFunctionKebabCase,\n returnType: TS_HANDLER_RETURN_TYPES[schema.event],\n };\n\n if (infra !== 'none') {\n // Add a bundle target for the function\n await addTypeScriptBundleTarget(tree, projectConfig, {\n targetFilePath: functionPathFromProjectRoot,\n bundleOutputDir,\n external: [/@aws-sdk\\/.*/], // lambda runtime provides aws sdk\n });\n }\n\n projectConfig.targets = sortObjectKeys(projectConfig.targets);\n updateProjectConfiguration(tree, projectConfig.name, projectConfig);\n\n // Generate the lambda handler file\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'handler'),\n joinPathFragments(projectConfig.sourceRoot, schema.functionPath ?? ''),\n enhancedOptions,\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@aws-lambda-powertools/tracer',\n '@aws-lambda-powertools/logger',\n '@aws-lambda-powertools/metrics',\n '@aws-lambda-powertools/parameters',\n '@aws-lambda-powertools/parser',\n '@aws-sdk/client-appconfigdata',\n '@middy/core',\n 'zod',\n ]),\n withVersions(['@types/aws-lambda']),\n joinPathFragments(dir, 'package.json'),\n );\n\n addComponentGeneratorMetadata(\n tree,\n projectConfig.name,\n TS_LAMBDA_FUNCTION_GENERATOR_INFO,\n functionPathFromProjectRoot,\n lambdaFunctionKebabCase,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_LAMBDA_FUNCTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n\n return () =>\n installDependencies(tree, schema.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsLambdaFunctionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","camelCase","addTypeScriptBundleTarget","addDependenciesToPackageJson","formatFilesInSubtree","addLambdaFunctionInfra","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","pascalCase","toClassName","toKebabCase","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","sharedConstructsGenerator","withVersions","TS_HANDLER_RETURN_TYPES","TS_LAMBDA_FUNCTION_GENERATOR_INFO","filename","tsLambdaFunctionGenerator","tree","schema","projectConfig","project","tsconfigPath","root","exists","Error","sourceRoot","dir","projectNameWithOutScope","name","split","pop","projectNameKebabCase","nameKebabCase","constructFunctionNameKebabCase","constructFunctionClassName","lambdaFunctionCamelCase","lambdaFunctionClassName","lambdaFunctionKebabCase","functionPathFromProjectRoot","functionPath","infra","handlerAlreadyExists","bundleOutputDir","iac","functionProjectName","nameClassName","handler","runtime","bundlePathFromRoot","enhancedOptions","returnType","event","targetFilePath","external","targets","dirname","overwriteStrategy","KeepExisting","preferInstallDependencies","languages"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { joinPathFragments, updateJson } from "@nx/devkit";
4
+ */ import { joinPathFragments, logger, updateJson } from "@nx/devkit";
5
5
  import { join, relative } from "path";
6
6
  import { addLicenseCheckToLintTarget } from "../../license/config.js";
7
+ import { AWS_NX_PLUGIN_CONFIG_FILE_NAME } from "../../utils/config/utils.js";
7
8
  import { isEsmWorkspace } from "../../utils/module-format.js";
8
- import { toScopeAlias } from "../../utils/npm-scope.js";
9
+ import { ensureProjectPackageJson } from "../../utils/project-package-json.js";
9
10
  import { configureBiomeLint } from "./biome.js";
10
11
  import { configureVitest } from "./vitest.js";
11
12
  /**
@@ -28,6 +29,11 @@ import { configureVitest } from "./vitest.js";
28
29
  /**
29
30
  * Updates typescript projects
30
31
  */ export const configureTsProject = async (tree, options)=>{
32
+ // Point users at init when the workspace hasn't been configured, since
33
+ // lint/format targets and workspace dependency sync depend on it.
34
+ if (!tree.exists(AWS_NX_PLUGIN_CONFIG_FILE_NAME)) {
35
+ logger.warn(`This workspace has no ${AWS_NX_PLUGIN_CONFIG_FILE_NAME} — run 'nx g @aws/nx-plugin:init' (or 'nx add @aws/nx-plugin') to configure linting, formatting and workspace dependency sync.`);
36
+ }
31
37
  // When the caller doesn't specify a module format, infer it from the
32
38
  // workspace root package.json (defaulting to ESM for a fresh workspace).
33
39
  const esm = options.esm ?? isEsmWorkspace(tree);
@@ -72,10 +78,8 @@ import { configureVitest } from "./vitest.js";
72
78
  baseUrl: undefined,
73
79
  rootDir: '.',
74
80
  paths: {
75
- // Remove any path aliases for this project with the npm scope prefix (eg remove @foo/bar)
76
- ...Object.fromEntries(Object.entries(tsConfig.compilerOptions?.paths ?? {}).filter(([k])=>k !== options.fullyQualifiedName)),
77
- // Add aliases which begin with colon (eg :foo/bar) to avoid sniping attacks
78
- [toScopeAlias(options.fullyQualifiedName)]: [
81
+ ...tsConfig.compilerOptions?.paths,
82
+ [options.fullyQualifiedName]: [
79
83
  `./${joinPathFragments(options.dir, 'src', 'index.ts')}`
80
84
  ]
81
85
  }
@@ -92,10 +96,13 @@ import { configureVitest } from "./vitest.js";
92
96
  ])
93
97
  }));
94
98
  }
95
- // Remove package.json if it exists
96
- if (tree.exists(join(options.dir, 'package.json'))) {
97
- tree.delete(join(options.dir, 'package.json'));
98
- }
99
+ // Every project carries a minimal private package.json so the workspace
100
+ // follows the standard npm package layout (see ensureProjectPackageJson).
101
+ ensureProjectPackageJson(tree, {
102
+ dir: options.dir,
103
+ fullyQualifiedName: options.fullyQualifiedName,
104
+ esm
105
+ });
99
106
  await configureBiomeLint(tree, options);
100
107
  await configureVitest(tree, options);
101
108
  // If license checking is configured, make this project's lint target depend
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/lib/ts-project-utils.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { joinPathFragments, type Tree, updateJson } from '@nx/devkit';\nimport { join, relative } from 'path';\nimport { addLicenseCheckToLintTarget } from '../../license/config';\nimport { isEsmWorkspace } from '../../utils/module-format';\nimport { toScopeAlias } from '../../utils/npm-scope';\nimport { configureBiomeLint } from './biome';\nimport type { ConfigureProjectOptions } from './types';\nimport { configureVitest } from './vitest';\n\ninterface TsConfigReference {\n path: string;\n}\n\n/**\n * Merges new TypeScript project references into existing ones, deduplicating by\n * path and preserving the order of existing references so re-running a\n * generator neither duplicates nor reorders references.\n */\nexport const mergeTsReferences = (\n existing: TsConfigReference[] | undefined,\n toAdd: TsConfigReference[],\n): TsConfigReference[] => {\n const references = [...(existing ?? [])];\n const existingPaths = new Set(references.map((ref) => ref.path));\n for (const ref of toAdd) {\n if (!existingPaths.has(ref.path)) {\n references.push(ref);\n existingPaths.add(ref.path);\n }\n }\n return references;\n};\n\n/**\n * Updates typescript projects\n */\nexport const configureTsProject = async (\n tree: Tree,\n options: ConfigureProjectOptions,\n) => {\n // When the caller doesn't specify a module format, infer it from the\n // workspace root package.json (defaulting to ESM for a fresh workspace).\n const esm = options.esm ?? isEsmWorkspace(tree);\n\n // Remove a conflicting `module: commonjs` from the project tsconfig.json\n // (CommonJS is configured on tsconfig.lib.json below when needed).\n updateJson(tree, join(options.dir, 'tsconfig.json'), (tsConfig) => ({\n ...tsConfig,\n compilerOptions: {\n ...tsConfig.compilerOptions,\n module:\n tsConfig.compilerOptions?.module === 'commonjs'\n ? undefined\n : tsConfig.compilerOptions?.module,\n },\n }));\n const outDirToRootRelativePath = relative(\n join(tree.root, options.dir),\n tree.root,\n );\n const distDir = join(outDirToRootRelativePath, 'dist', options.dir, 'tsc');\n // Remove baseUrl and rootDir from the tsconfig.lib.json\n if (tree.exists(join(options.dir, 'tsconfig.lib.json'))) {\n updateJson(tree, join(options.dir, 'tsconfig.lib.json'), (tsConfig) => ({\n ...tsConfig,\n compilerOptions: {\n ...tsConfig.compilerOptions,\n baseUrl: undefined,\n rootDir: '.',\n outDir: distDir,\n tsBuildInfoFile: join(distDir, 'tsconfig.lib.tsbuildinfo'),\n // @nx/js configures the lib for ESM (module `nodenext`). CommonJS\n // projects use `node16`, which honours the workspace's\n // `type: commonjs`, emits CommonJS and resolves extensionless relative\n // imports. (Plain `commonjs`/`node` is deprecated in TypeScript 6.)\n ...(esm ? {} : { module: 'node16', moduleResolution: 'node16' }),\n },\n }));\n }\n // Update root project tsconfig\n updateJson(tree, 'tsconfig.base.json', (tsConfig) => ({\n ...tsConfig,\n compilerOptions: {\n ...tsConfig.compilerOptions,\n // baseUrl is deprecated in TypeScript 6 — use ./ prefix in paths instead\n baseUrl: undefined,\n rootDir: '.',\n paths: {\n // Remove any path aliases for this project with the npm scope prefix (eg remove @foo/bar)\n ...Object.fromEntries(\n Object.entries(tsConfig.compilerOptions?.paths ?? {}).filter(\n ([k]) => k !== options.fullyQualifiedName,\n ),\n ),\n // Add aliases which begin with colon (eg :foo/bar) to avoid sniping attacks\n [toScopeAlias(options.fullyQualifiedName)]: [\n `./${joinPathFragments(options.dir, 'src', 'index.ts')}`,\n ],\n },\n },\n }));\n if (tree.exists('tsconfig.json')) {\n updateJson(tree, 'tsconfig.json', (tsConfig) => ({\n ...tsConfig,\n // Add project references, deduplicating and preserving existing order\n references: mergeTsReferences(tsConfig.references, [\n { path: `./${options.dir}` },\n ]),\n }));\n }\n // Remove package.json if it exists\n if (tree.exists(join(options.dir, 'package.json'))) {\n tree.delete(join(options.dir, 'package.json'));\n }\n\n await configureBiomeLint(tree, options);\n await configureVitest(tree, options);\n\n // If license checking is configured, make this project's lint target depend\n // on the root license-check target. No-op if there's no license-check target\n // (i.e. the license generator hasn't run); the license generator wires up\n // existing projects itself, so this works regardless of generator order.\n addLicenseCheckToLintTarget(tree, options.fullyQualifiedName);\n};\n"],"names":["joinPathFragments","updateJson","join","relative","addLicenseCheckToLintTarget","isEsmWorkspace","toScopeAlias","configureBiomeLint","configureVitest","mergeTsReferences","existing","toAdd","references","existingPaths","Set","map","ref","path","has","push","add","configureTsProject","tree","options","esm","dir","tsConfig","compilerOptions","module","undefined","outDirToRootRelativePath","root","distDir","exists","baseUrl","rootDir","outDir","tsBuildInfoFile","moduleResolution","paths","Object","fromEntries","entries","filter","k","fullyQualifiedName","delete"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/lib/ts-project-utils.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { joinPathFragments, logger, type Tree, updateJson } from '@nx/devkit';\nimport { join, relative } from 'path';\nimport { addLicenseCheckToLintTarget } from '../../license/config';\nimport { AWS_NX_PLUGIN_CONFIG_FILE_NAME } from '../../utils/config/utils';\nimport { isEsmWorkspace } from '../../utils/module-format';\nimport { ensureProjectPackageJson } from '../../utils/project-package-json';\nimport { configureBiomeLint } from './biome';\nimport type { ConfigureProjectOptions } from './types';\nimport { configureVitest } from './vitest';\n\ninterface TsConfigReference {\n path: string;\n}\n\n/**\n * Merges new TypeScript project references into existing ones, deduplicating by\n * path and preserving the order of existing references so re-running a\n * generator neither duplicates nor reorders references.\n */\nexport const mergeTsReferences = (\n existing: TsConfigReference[] | undefined,\n toAdd: TsConfigReference[],\n): TsConfigReference[] => {\n const references = [...(existing ?? [])];\n const existingPaths = new Set(references.map((ref) => ref.path));\n for (const ref of toAdd) {\n if (!existingPaths.has(ref.path)) {\n references.push(ref);\n existingPaths.add(ref.path);\n }\n }\n return references;\n};\n\n/**\n * Updates typescript projects\n */\nexport const configureTsProject = async (\n tree: Tree,\n options: ConfigureProjectOptions,\n) => {\n // Point users at init when the workspace hasn't been configured, since\n // lint/format targets and workspace dependency sync depend on it.\n if (!tree.exists(AWS_NX_PLUGIN_CONFIG_FILE_NAME)) {\n logger.warn(\n `This workspace has no ${AWS_NX_PLUGIN_CONFIG_FILE_NAME} — run 'nx g @aws/nx-plugin:init' (or 'nx add @aws/nx-plugin') to configure linting, formatting and workspace dependency sync.`,\n );\n }\n\n // When the caller doesn't specify a module format, infer it from the\n // workspace root package.json (defaulting to ESM for a fresh workspace).\n const esm = options.esm ?? isEsmWorkspace(tree);\n\n // Remove a conflicting `module: commonjs` from the project tsconfig.json\n // (CommonJS is configured on tsconfig.lib.json below when needed).\n updateJson(tree, join(options.dir, 'tsconfig.json'), (tsConfig) => ({\n ...tsConfig,\n compilerOptions: {\n ...tsConfig.compilerOptions,\n module:\n tsConfig.compilerOptions?.module === 'commonjs'\n ? undefined\n : tsConfig.compilerOptions?.module,\n },\n }));\n const outDirToRootRelativePath = relative(\n join(tree.root, options.dir),\n tree.root,\n );\n const distDir = join(outDirToRootRelativePath, 'dist', options.dir, 'tsc');\n // Remove baseUrl and rootDir from the tsconfig.lib.json\n if (tree.exists(join(options.dir, 'tsconfig.lib.json'))) {\n updateJson(tree, join(options.dir, 'tsconfig.lib.json'), (tsConfig) => ({\n ...tsConfig,\n compilerOptions: {\n ...tsConfig.compilerOptions,\n baseUrl: undefined,\n rootDir: '.',\n outDir: distDir,\n tsBuildInfoFile: join(distDir, 'tsconfig.lib.tsbuildinfo'),\n // @nx/js configures the lib for ESM (module `nodenext`). CommonJS\n // projects use `node16`, which honours the workspace's\n // `type: commonjs`, emits CommonJS and resolves extensionless relative\n // imports. (Plain `commonjs`/`node` is deprecated in TypeScript 6.)\n ...(esm ? {} : { module: 'node16', moduleResolution: 'node16' }),\n },\n }));\n }\n // Update root project tsconfig\n updateJson(tree, 'tsconfig.base.json', (tsConfig) => ({\n ...tsConfig,\n compilerOptions: {\n ...tsConfig.compilerOptions,\n // baseUrl is deprecated in TypeScript 6 — use ./ prefix in paths instead\n baseUrl: undefined,\n rootDir: '.',\n paths: {\n ...tsConfig.compilerOptions?.paths,\n [options.fullyQualifiedName]: [\n `./${joinPathFragments(options.dir, 'src', 'index.ts')}`,\n ],\n },\n },\n }));\n if (tree.exists('tsconfig.json')) {\n updateJson(tree, 'tsconfig.json', (tsConfig) => ({\n ...tsConfig,\n // Add project references, deduplicating and preserving existing order\n references: mergeTsReferences(tsConfig.references, [\n { path: `./${options.dir}` },\n ]),\n }));\n }\n // Every project carries a minimal private package.json so the workspace\n // follows the standard npm package layout (see ensureProjectPackageJson).\n ensureProjectPackageJson(tree, {\n dir: options.dir,\n fullyQualifiedName: options.fullyQualifiedName,\n esm,\n });\n\n await configureBiomeLint(tree, options);\n await configureVitest(tree, options);\n\n // If license checking is configured, make this project's lint target depend\n // on the root license-check target. No-op if there's no license-check target\n // (i.e. the license generator hasn't run); the license generator wires up\n // existing projects itself, so this works regardless of generator order.\n addLicenseCheckToLintTarget(tree, options.fullyQualifiedName);\n};\n"],"names":["joinPathFragments","logger","updateJson","join","relative","addLicenseCheckToLintTarget","AWS_NX_PLUGIN_CONFIG_FILE_NAME","isEsmWorkspace","ensureProjectPackageJson","configureBiomeLint","configureVitest","mergeTsReferences","existing","toAdd","references","existingPaths","Set","map","ref","path","has","push","add","configureTsProject","tree","options","exists","warn","esm","dir","tsConfig","compilerOptions","module","undefined","outDirToRootRelativePath","root","distDir","baseUrl","rootDir","outDir","tsBuildInfoFile","moduleResolution","paths","fullyQualifiedName"],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { addDependenciesToPackageJson, readNxJson, updateNxJson } from "@nx/devkit";
4
+ */ import { readNxJson, updateNxJson } from "@nx/devkit";
5
5
  import { readFileSync } from "fs";
6
6
  import { join } from "path";
7
7
  import { applyGritQL } from "../../utils/ast.js";
8
+ import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
8
9
  import { withVersions } from "../../utils/versions.js";
9
10
  const readGritPattern = (name)=>readFileSync(join(import.meta.dirname, 'grit', `${name}.grit`), 'utf-8').trim();
10
11
  export const configureVitest = async (tree, options)=>{
@@ -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 {\n addDependenciesToPackageJson,\n readNxJson,\n type Tree,\n updateNxJson,\n} from '@nx/devkit';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport { applyGritQL } from '../../utils/ast';\nimport { withVersions } from '../../utils/versions';\nimport type { ConfigureProjectOptions } from './types';\n\nconst readGritPattern = (name: string): string =>\n readFileSync(\n join(import.meta.dirname, 'grit', `${name}.grit`),\n 'utf-8',\n ).trim();\n\nexport const configureVitest = async (\n tree: Tree,\n options: ConfigureProjectOptions,\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 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(['vite', 'vitest', '@vitest/coverage-v8']),\n );\n};\n"],"names":["addDependenciesToPackageJson","readNxJson","updateNxJson","readFileSync","join","applyGritQL","withVersions","readGritPattern","name","dirname","trim","configureVitest","tree","options","configPath","dir","find","config","exists","nxJson","targetDefaults","cache","inputs","configurations","args"],"mappings":"AAAA;;;CAGC,GACD,SACEA,4BAA4B,EAC5BC,UAAU,EAEVC,YAAY,QACP,aAAa;AACpB,SAASC,YAAY,QAAQ,KAAK;AAClC,SAASC,IAAI,QAAQ,OAAO;AAC5B,SAASC,WAAW,QAAQ,qBAAkB;AAC9C,SAASC,YAAY,QAAQ,0BAAuB;AAGpD,MAAMC,kBAAkB,CAACC,OACvBL,aACEC,KAAK,YAAYK,OAAO,EAAE,QAAQ,GAAGD,KAAK,KAAK,CAAC,GAChD,SACAE,IAAI;AAER,OAAO,MAAMC,kBAAkB,OAC7BC,MACAC;IAEA,4CAA4C;IAC5C,MAAMC,aAAa;QACjBV,KAAKS,QAAQE,GAAG,EAAE;QAClBX,KAAKS,QAAQE,GAAG,EAAE;KACnB,CAACC,IAAI,CAAC,CAACC,SAAWL,KAAKM,MAAM,CAACD;IAE/B,IAAIH,YAAY;QACd,MAAMT,YACJO,MACAE,YACAP,gBAAgB;QAGlB,MAAMY,SAASlB,WAAWW;QAC1BV,aAAaU,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;IAEApB,6BACEY,MACA,CAAC,GACDN,aAAa;QAAC;QAAQ;QAAU;KAAsB;AAE1D,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 { readNxJson, type Tree, updateNxJson } from '@nx/devkit';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport { applyGritQL } from '../../utils/ast';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies';\nimport { withVersions } from '../../utils/versions';\nimport type { ConfigureProjectOptions } from './types';\n\nconst readGritPattern = (name: string): string =>\n readFileSync(\n join(import.meta.dirname, 'grit', `${name}.grit`),\n 'utf-8',\n ).trim();\n\nexport const configureVitest = async (\n tree: Tree,\n options: ConfigureProjectOptions,\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 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(['vite', 'vitest', '@vitest/coverage-v8']),\n );\n};\n"],"names":["readNxJson","updateNxJson","readFileSync","join","applyGritQL","addDependenciesToPackageJson","withVersions","readGritPattern","name","dirname","trim","configureVitest","tree","options","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,qBAAkB;AAC9C,SAASC,4BAA4B,QAAQ,8BAA2B;AACxE,SAASC,YAAY,QAAQ,0BAAuB;AAGpD,MAAMC,kBAAkB,CAACC,OACvBN,aACEC,KAAK,YAAYM,OAAO,EAAE,QAAQ,GAAGD,KAAK,KAAK,CAAC,GAChD,SACAE,IAAI;AAER,OAAO,MAAMC,kBAAkB,OAC7BC,MACAC;IAEA,4CAA4C;IAC5C,MAAMC,aAAa;QACjBX,KAAKU,QAAQE,GAAG,EAAE;QAClBZ,KAAKU,QAAQE,GAAG,EAAE;KACnB,CAACC,IAAI,CAAC,CAACC,SAAWL,KAAKM,MAAM,CAACD;IAE/B,IAAIH,YAAY;QACd,MAAMV,YACJQ,MACAE,YACAP,gBAAgB;QAGlB,MAAMY,SAASnB,WAAWY;QAC1BX,aAAaW,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;IAEAf,6BACEO,MACA,CAAC,GACDN,aAAa;QAAC;QAAQ;QAAU;KAAsB;AAE1D,EAAE"}
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
- */ import { addDependenciesToPackageJson, detectPackageManager, generateFiles, joinPathFragments, OverwriteStrategy, readJson, updateJson, updateProjectConfiguration } from "@nx/devkit";
4
+ */ import { detectPackageManager, generateFiles, joinPathFragments, OverwriteStrategy, readJson, updateJson, updateProjectConfiguration } from "@nx/devkit";
5
5
  import { ensureLicenseExceptions } from "../../license/config.js";
6
6
  import { MCP_INSPECTOR_EXCEPTIONS } from "../../license/known-exceptions.js";
7
7
  import { addMcpServerInfra } from "../../utils/agent-core-constructs/agent-core-constructs.js";
8
8
  import { addTypeScriptBundleTarget } from "../../utils/bundle/bundle.js";
9
9
  import { resolveContainers } from "../../utils/containers.js";
10
+ import { addDependenciesToPackageJson } from "../../utils/dependencies.js";
10
11
  import { addDockerScanTarget } from "../../utils/docker.js";
11
12
  import { formatFilesInSubtree } from "../../utils/format.js";
12
13
  import { FsCommands } from "../../utils/fs.js";
@@ -41,9 +42,8 @@ export const tsMcpServerGenerator = async (tree, options)=>{
41
42
  }
42
43
  const auth = options.auth ?? 'iam';
43
44
  const projectPackageJsonPath = joinPathFragments(project.root, 'package.json');
44
- // Generate esm if the module system is esm, otherwise commonjs. Projects
45
- // don't typically have their own package.json (dependencies are declared in
46
- // the workspace root), so fall back to the workspace format when absent.
45
+ // Generate esm if the project's package.json is `type: module`, falling
46
+ // back to the workspace format when the project has no manifest.
47
47
  const esm = tree.exists(projectPackageJsonPath) ? readJson(tree, projectPackageJsonPath).type === 'module' : isEsmWorkspace(tree);
48
48
  // Generate example server
49
49
  generateFiles(tree, joinPathFragments(import.meta.dirname, 'files'), targetSourceDir, {
@@ -66,8 +66,11 @@ export const tsMcpServerGenerator = async (tree, options)=>{
66
66
  '@aws-sdk/client-appconfigdata'
67
67
  ]);
68
68
  const devDeps = withVersions([
69
+ '@types/express'
70
+ ]);
71
+ // tsx (local dev) and the MCP inspector are shared tooling.
72
+ const rootDevDeps = withVersions([
69
73
  'tsx',
70
- '@types/express',
71
74
  '@modelcontextprotocol/inspector'
72
75
  ]);
73
76
  // Add hosting based on infra
@@ -130,12 +133,9 @@ export const tsMcpServerGenerator = async (tree, options)=>{
130
133
  // No Dockerfile needed for non-hosted MCP
131
134
  tree.delete(joinPathFragments(targetSourceDir, 'Dockerfile'));
132
135
  }
133
- addDependenciesToPackageJson(tree, deps, devDeps);
134
- // Add to the project's package.json too if it has one (e.g. nx plugins),
135
- // otherwise dependencies live in the workspace root only.
136
- if (tree.exists(projectPackageJsonPath)) {
137
- addDependenciesToPackageJson(tree, deps, devDeps, projectPackageJsonPath);
138
- }
136
+ // Runtime deps go in the project manifest; shared tooling goes to the root.
137
+ addDependenciesToPackageJson(tree, deps, devDeps, projectPackageJsonPath);
138
+ addDependenciesToPackageJson(tree, {}, rootDevDeps);
139
139
  // @modelcontextprotocol/sdk declares zod as a peer dependency with a wide range
140
140
  // (^3.25 || ^4.0). Yarn does not dedupe the peer to the workspace's pinned zod, so
141
141
  // without a resolution it installs a separate zod under the SDK's own node_modules.
@@ -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 addDependenciesToPackageJson,\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 { ensureLicenseExceptions } from '../../license/config';\nimport { MCP_INSPECTOR_EXCEPTIONS } from '../../license/known-exceptions';\nimport { addMcpServerInfra } from '../../utils/agent-core-constructs/agent-core-constructs';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport { resolveContainers } from '../../utils/containers';\nimport { addDockerScanTarget } from '../../utils/docker';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { FsCommands } from '../../utils/fs';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { isEsmWorkspace } from '../../utils/module-format';\nimport { kebabCase, toClassName } from '../../utils/names';\nimport { getNpmScope } from '../../utils/npm-scope';\nimport {\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { assignPort } from '../../utils/port';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport { BASE_IMAGES, TS_VERSIONS, withVersions } from '../../utils/versions';\nimport type { TsMcpServerGeneratorSchema } from './schema';\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 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 module system is esm, otherwise commonjs. Projects\n // don't typically have their own package.json (dependencies are declared in\n // the workspace root), so fall back to the workspace format when absent.\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 npmVersion: TS_VERSIONS.npm,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add dependencies\n const deps = withVersions([\n '@modelcontextprotocol/sdk',\n 'zod',\n 'express',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n ]);\n const devDeps = withVersions([\n 'tsx',\n '@types/express',\n '@modelcontextprotocol/inspector',\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(tree, project, {\n targetFilePath: `${targetSourceDirRelativeToProjectRoot}/http.ts`,\n bundleOutputDir: joinPathFragments('mcp', name),\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);\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(tree, {\n project,\n containerEngine: containers,\n trivyTargetName: `${mcpTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n });\n\n // Add shared constructs\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac });\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 addDependenciesToPackageJson(tree, deps, devDeps);\n // Add to the project's package.json too if it has one (e.g. nx plugins),\n // otherwise dependencies live in the workspace root only.\n if (tree.exists(projectPackageJsonPath)) {\n addDependenciesToPackageJson(tree, deps, devDeps, projectPackageJsonPath);\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 if (detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\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 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 {\n port: localDevPort,\n rc: mcpServerNameClassName,\n auth,\n },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_MCP_SERVER_GENERATOR_INFO]);\n\n await ensureLicenseExceptions(tree, MCP_INSPECTOR_EXCEPTIONS);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsMcpServerGenerator;\n"],"names":["addDependenciesToPackageJson","detectPackageManager","generateFiles","joinPathFragments","OverwriteStrategy","readJson","updateJson","updateProjectConfiguration","ensureLicenseExceptions","MCP_INSPECTOR_EXCEPTIONS","addMcpServerInfra","addTypeScriptBundleTarget","resolveContainers","addDockerScanTarget","formatFilesInSubtree","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","isEsmWorkspace","kebabCase","toClassName","getNpmScope","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","assignPort","sharedConstructsGenerator","BASE_IMAGES","TS_VERSIONS","withVersions","TS_MCP_SERVER_GENERATOR_INFO","filename","tsMcpServerGenerator","tree","options","project","exists","root","Error","defaultName","name","split","pop","mcpServerNameClassName","mcpTargetPrefix","targetSourceDirRelativeToProjectRoot","targetSourceDir","relativeSourceDir","replace","distDir","infra","auth","console","warn","projectPackageJsonPath","esm","type","dirname","adotVersion","jaegerVersion","nodeBaseImage","node","npmVersion","npm","overwriteStrategy","KeepExisting","deps","devDeps","containers","dockerImageTag","targetFilePath","bundleOutputDir","dockerOutputDir","dockerTargetName","fs","targets","cache","outputs","executor","commands","cp","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","iac","mcpServerNameKebabCase","projectName","delete","packageJson","resolutions","localDevPort","component","info","mcpTargets","continuous","cwd","env","PORT","LOCAL_DEV","port","rc","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 { ensureLicenseExceptions } from '../../license/config';\nimport { MCP_INSPECTOR_EXCEPTIONS } from '../../license/known-exceptions';\nimport { addMcpServerInfra } from '../../utils/agent-core-constructs/agent-core-constructs';\nimport { addTypeScriptBundleTarget } from '../../utils/bundle/bundle';\nimport { resolveContainers } from '../../utils/containers';\nimport { addDependenciesToPackageJson } from '../../utils/dependencies';\nimport { addDockerScanTarget } from '../../utils/docker';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { FsCommands } from '../../utils/fs';\nimport { resolveIac } from '../../utils/iac';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { isEsmWorkspace } from '../../utils/module-format';\nimport { kebabCase, toClassName } from '../../utils/names';\nimport { getNpmScope } from '../../utils/npm-scope';\nimport {\n addComponentDevTarget,\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { assignPort } from '../../utils/port';\nimport { sharedConstructsGenerator } from '../../utils/shared-constructs';\nimport { BASE_IMAGES, TS_VERSIONS, withVersions } from '../../utils/versions';\nimport type { TsMcpServerGeneratorSchema } from './schema';\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 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 npmVersion: TS_VERSIONS.npm,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add dependencies\n const deps = withVersions([\n '@modelcontextprotocol/sdk',\n 'zod',\n 'express',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n ]);\n const devDeps = withVersions(['@types/express']);\n // tsx (local dev) and the MCP inspector are shared tooling.\n const rootDevDeps = withVersions(['tsx', '@modelcontextprotocol/inspector']);\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(tree, project, {\n targetFilePath: `${targetSourceDirRelativeToProjectRoot}/http.ts`,\n bundleOutputDir: joinPathFragments('mcp', name),\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);\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(tree, {\n project,\n containerEngine: containers,\n trivyTargetName: `${mcpTargetPrefix}-trivy`,\n dockerTargetName,\n imageTags: [dockerImageTag],\n });\n\n // Add shared constructs\n const iac = await resolveIac(tree, options.iac);\n await sharedConstructsGenerator(tree, { iac });\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 // Runtime deps go in the project manifest; shared tooling goes to the root.\n addDependenciesToPackageJson(tree, deps, devDeps, projectPackageJsonPath);\n addDependenciesToPackageJson(tree, {}, rootDevDeps);\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 if (detectPackageManager() === 'yarn') {\n updateJson(tree, 'package.json', (packageJson) => {\n packageJson.resolutions = {\n ...packageJson.resolutions,\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 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 {\n port: localDevPort,\n rc: mcpServerNameClassName,\n auth,\n },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [TS_MCP_SERVER_GENERATOR_INFO]);\n\n await ensureLicenseExceptions(tree, MCP_INSPECTOR_EXCEPTIONS);\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","ensureLicenseExceptions","MCP_INSPECTOR_EXCEPTIONS","addMcpServerInfra","addTypeScriptBundleTarget","resolveContainers","addDependenciesToPackageJson","addDockerScanTarget","formatFilesInSubtree","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","isEsmWorkspace","kebabCase","toClassName","getNpmScope","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","assignPort","sharedConstructsGenerator","BASE_IMAGES","TS_VERSIONS","withVersions","TS_MCP_SERVER_GENERATOR_INFO","filename","tsMcpServerGenerator","tree","options","project","exists","root","Error","defaultName","name","split","pop","mcpServerNameClassName","mcpTargetPrefix","targetSourceDirRelativeToProjectRoot","targetSourceDir","relativeSourceDir","replace","distDir","infra","auth","console","warn","projectPackageJsonPath","esm","type","dirname","adotVersion","jaegerVersion","nodeBaseImage","node","npmVersion","npm","overwriteStrategy","KeepExisting","deps","devDeps","rootDevDeps","containers","dockerImageTag","targetFilePath","bundleOutputDir","dockerOutputDir","dockerTargetName","fs","targets","cache","outputs","executor","commands","cp","parallel","dependsOn","containerEngine","trivyTargetName","imageTags","iac","mcpServerNameKebabCase","projectName","delete","packageJson","resolutions","localDevPort","component","info","mcpTargets","continuous","cwd","env","PORT","LOCAL_DEV","port","rc","preferInstallDependencies","languages"],"mappings":"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"}
@@ -116,9 +116,14 @@ export const tsNxGeneratorGenerator = async (tree, options)=>{
116
116
  NX_GENERATOR_GENERATOR_INFO
117
117
  ]);
118
118
  await formatFilesInSubtree(tree);
119
+ // The generated generator.ts imports @nx/devkit, which must resolve for
120
+ // Nx to run it (bun's isolated layout doesn't hoist it from @nx/js).
119
121
  return ()=>installDependencies(tree, options.preferInstallDependencies, {
120
122
  languages: [
121
123
  'typescript'
124
+ ],
125
+ ensureResolvable: [
126
+ '@nx/devkit'
122
127
  ]
123
128
  });
124
129
  };