@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.
- package/LICENSE-THIRD-PARTY +3 -60
- package/generators.json +9 -9
- package/package.json +7 -3
- package/src/agentcore-gateway/generator.js +12 -2
- package/src/agentcore-gateway/generator.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +25 -31
- package/src/infra/app/generator.js +9 -6
- package/src/infra/app/generator.js.map +1 -1
- package/src/license/config.js +1 -1
- package/src/license/config.js.map +1 -1
- package/src/mcp-server/schema.d.ts +1 -1
- package/src/mcp-server/tools/general-guidance.js +5 -6
- package/src/mcp-server/tools/general-guidance.js.map +1 -1
- package/src/preset/__snapshots__/generator.spec.ts.snap +38 -7
- package/src/preset/generator.d.ts +1 -1
- package/src/preset/generator.js +4 -2
- package/src/preset/generator.js.map +1 -1
- package/src/preset/schema.d.js.map +1 -1
- package/src/preset/schema.d.ts +1 -0
- package/src/preset/schema.json +5 -0
- package/src/py/agent/generator.js +2 -1
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/mcp-server/generator.js +2 -1
- package/src/py/mcp-server/generator.js.map +1 -1
- package/src/py/project/generator.js +2 -1
- package/src/py/project/generator.js.map +1 -1
- package/src/py/rdb/__snapshots__/generator.spec.ts.snap +1 -0
- package/src/py/rdb/generator.js +7 -1
- package/src/py/rdb/generator.js.map +1 -1
- package/src/smithy/ts/api/generator.js +5 -2
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/terraform/project/generator.js +4 -1
- package/src/terraform/project/generator.js.map +1 -1
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +6 -6
- package/src/trpc/backend/generator.js +7 -5
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/trpc/react/generator.js +4 -4
- package/src/trpc/react/generator.js.map +1 -1
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/agent/a2a-connection/generator.js +3 -2
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/gateway-connection/generator.js +4 -3
- package/src/ts/agent/gateway-connection/generator.js.map +1 -1
- package/src/ts/agent/generator.js +8 -5
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/ts/agent/mcp-connection/generator.js +4 -3
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/generator.js +10 -19
- package/src/ts/agent/react-connection/generator.js.map +1 -1
- package/src/ts/astro-docs/generator.js +12 -3
- package/src/ts/astro-docs/generator.js.map +1 -1
- package/src/ts/dcr-proxy/generator.js +5 -5
- package/src/ts/dcr-proxy/generator.js.map +1 -1
- package/src/ts/dynamodb/generator.js +5 -2
- package/src/ts/dynamodb/generator.js.map +1 -1
- package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -2
- package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
- package/src/ts/lambda-function/generator.js +3 -2
- package/src/ts/lambda-function/generator.js.map +1 -1
- package/src/ts/lib/ts-project-utils.js +17 -10
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/lib/vitest.js +2 -1
- package/src/ts/lib/vitest.js.map +1 -1
- package/src/ts/mcp-server/generator.js +11 -11
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/nx-generator/generator.js +5 -0
- package/src/ts/nx-generator/generator.js.map +1 -1
- package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +5 -6
- package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
- package/src/ts/nx-plugin/utils.js +2 -1
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/agent-connection/generator.js +1 -2
- package/src/ts/rdb/agent-connection/generator.js.map +1 -1
- package/src/ts/rdb/generator.js +10 -6
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/generator.js +1 -2
- package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/rdb/smithy-connection/generator.js +1 -2
- package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
- package/src/ts/rdb/trpc-connection/generator.js +1 -2
- package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
- package/src/ts/react-website/agui/generator.js +5 -4
- package/src/ts/react-website/agui/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +219 -79
- package/src/ts/react-website/app/generator.js +34 -14
- package/src/ts/react-website/app/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +11 -6
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +12 -2
- package/src/ts/react-website/cognito-auth/generator.js +3 -2
- package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
- package/src/ts/react-website/runtime-config/generator.js +2 -2
- package/src/ts/react-website/runtime-config/generator.js.map +1 -1
- package/src/ts/sync/generator.js +81 -3
- package/src/ts/sync/generator.js.map +1 -1
- package/src/utils/agent-connection/agent-connection.d.ts +1 -1
- package/src/utils/agent-connection/agent-connection.js +50 -1
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.js +10 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
- package/src/utils/api-constructs/api-constructs.js +15 -1
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/bundle/bundle.js +2 -1
- package/src/utils/bundle/bundle.js.map +1 -1
- package/src/utils/commands.d.ts +5 -3
- package/src/utils/commands.js +24 -3
- package/src/utils/commands.js.map +1 -1
- package/src/utils/config/index.d.ts +16 -0
- package/src/utils/config/index.js.map +1 -1
- package/src/utils/config/utils.d.ts +3 -2
- package/src/utils/config/utils.js +4 -3
- package/src/utils/config/utils.js.map +1 -1
- package/src/utils/connection/open-api/react.js +3 -2
- package/src/utils/connection/open-api/react.js.map +1 -1
- package/src/utils/containers.js +1 -1
- package/src/utils/containers.js.map +1 -1
- package/src/utils/dependencies.d.ts +18 -0
- package/src/utils/dependencies.js +206 -0
- package/src/utils/dependencies.js.map +1 -0
- package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
- package/src/utils/files/shadcn/components.json.template +1 -1
- package/src/utils/format.d.ts +20 -1
- package/src/utils/format.js +83 -49
- package/src/utils/format.js.map +1 -1
- package/src/utils/fs.d.ts +1 -1
- package/src/utils/fs.js +1 -1
- package/src/utils/fs.js.map +1 -1
- package/src/utils/iac.js +1 -1
- package/src/utils/iac.js.map +1 -1
- package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +11 -6
- package/src/utils/identity-constructs/identity-constructs.js +14 -3
- package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
- package/src/utils/init.d.ts +7 -1
- package/src/utils/init.js +38 -17
- package/src/utils/init.js.map +1 -1
- package/src/utils/install.js +3 -1
- package/src/utils/install.js.map +1 -1
- package/src/utils/module-format.d.ts +5 -8
- package/src/utils/module-format.js +29 -12
- package/src/utils/module-format.js.map +1 -1
- package/src/utils/npm-scope.d.ts +0 -4
- package/src/utils/npm-scope.js +0 -5
- package/src/utils/npm-scope.js.map +1 -1
- package/src/utils/pnpm-workspace.d.ts +1 -12
- package/src/utils/pnpm-workspace.js +3 -30
- package/src/utils/pnpm-workspace.js.map +1 -1
- package/src/utils/project-package-json.d.ts +39 -0
- package/src/utils/project-package-json.js +119 -0
- package/src/utils/project-package-json.js.map +1 -0
- package/src/utils/shared-constructs.js +6 -5
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-dynamodb-scripts.js +4 -2
- package/src/utils/shared-dynamodb-scripts.js.map +1 -1
- package/src/utils/shared-infra-scripts.js +5 -4
- package/src/utils/shared-infra-scripts.js.map +1 -1
- package/src/utils/shared-rdb-scripts.js +14 -1
- package/src/utils/shared-rdb-scripts.js.map +1 -1
- package/src/utils/shared-shadcn.js +11 -8
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/test.js +8 -3
- package/src/utils/test.js.map +1 -1
- package/src/utils/versions.d.ts +4 -0
- package/src/utils/versions.js +8 -1
- package/src/utils/versions.js.map +1 -1
- 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 {
|
|
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
|
-
//
|
|
52
|
-
//
|
|
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
|
|
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 {
|
|
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
|
|
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":"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"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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":"AAAA;;;CAGC,GACD,SACEA,4BAA4B,EAE5BC,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,EAEjBC,0BAA0B,QACrB,aAAa;AACpB,OAAOC,eAAe,mBAAmB;AACzC,SAASC,yBAAyB,QAAQ,+BAA4B;AACtE,SAASC,oBAAoB,QAAQ,wBAAqB;AAC1D,SAASC,sBAAsB,QAAQ,yDAAsD;AAC7F,SAASC,UAAU,QAAQ,qBAAkB;AAC7C,SAASC,mBAAmB,QAAQ,yBAAsB;AAC1D,SAASC,+BAA+B,QAAQ,yBAAsB;AACtE,SAASC,UAAU,EAAEC,WAAW,EAAEC,WAAW,QAAQ,uBAAoB;AACzE,SACEC,6BAA6B,EAC7BC,gBAAgB,EAEhBC,mCAAmC,QAC9B,oBAAiB;AACxB,SAASC,cAAc,QAAQ,wBAAqB;AACpD,SAASC,yBAAyB,QAAQ,mCAAgC;AAC1E,SAASC,YAAY,QAAQ,0BAAuB;AACpD,SAASC,uBAAuB,QAAQ,UAAO;AAG/C,OAAO,MAAMC,oCACXN,iBAAiB,YAAYO,QAAQ,EAAE;AAEzC;;CAEC,GACD,OAAO,MAAMC,4BAA4B,OACvCC,MACAC;IAEA,MAAMC,gBAAgBV,oCACpBQ,MACAC,OAAOE,OAAO;IAGhB,MAAMC,eAAe3B,kBAAkByB,cAAcG,IAAI,EAAE;IAE3D,gDAAgD;IAChD,IAAI,CAACL,KAAKM,MAAM,CAACF,eAAe;QAC9B,MAAM,IAAIG,MACR,CAAC,iDAAiD,EAAEN,OAAOE,OAAO,CAAC,uEAAuE,CAAC;IAE/I;IAEA,IAAI,CAACD,cAAcM,UAAU,EAAE;QAC7B,MAAM,IAAID,MACR,CAAC,8HAA8H,CAAC;IAEpI;IAEA,MAAME,MAAMP,cAAcG,IAAI;IAC9B,MAAMK,0BAA0BR,cAAcS,IAAI,CAACC,KAAK,CAAC,KAAKC,GAAG;IACjE,MAAMC,uBAAuBzB,YAAYqB;IACzC,MAAMK,gBAAgB1B,YAAYY,OAAOU,IAAI;IAE7C,MAAMK,iCAAiC,GAAGF,qBAAqB,CAAC,EAAEC,eAAe;IACjF,MAAME,6BAA6B7B,YACjC4B;IAEF,MAAME,0BAA0BtC,UAAUqB,OAAOU,IAAI;IACrD,MAAMQ,0BAA0BhC,WAAWc,OAAOU,IAAI;IACtD,MAAMS,0BAA0B/B,YAAYY,OAAOU,IAAI;IAEvD,MAAMU,8BAA8B5C,kBAClC,OACAwB,OAAOqB,YAAY,IAAI,IACvB,GAAGF,wBAAwB,GAAG,CAAC;IAEjC,MAAME,eAAe7C,kBACnByB,cAAcG,IAAI,EAClBgB;IAGF,MAAME,QAAQtB,OAAOsB,KAAK,IAAI;IAC9B,MAAMC,uBAAuBxB,KAAKM,MAAM,CAACgB;IAEzC,IAAIE,wBAAwBD,UAAU,QAAQ;QAC5C,MAAM,IAAIhB,MACR,CAAC,yDAAyD,EAAEQ,cAAc,0FAA0F,CAAC;IAEzK;IAEA,MAAMU,kBAAkBhD,kBAAkB,UAAU2C;IAEpD,IAAIG,UAAU,QAAQ;QACpB,MAAMG,MAAM,MAAM1C,WAAWgB,MAAMC,OAAOyB,GAAG;QAE7C,MAAMhC,0BAA0BM,MAAM;YACpC0B;QACF;QAEA,MAAM3C,uBAAuBiB,MAAM;YACjC2B,qBAAqBzB,cAAcS,IAAI;YACvCiB,eAAeX;YACfF,eAAeC;YACfa,SAAS;YACTC,SAAS;YACTC,oBAAoBtD,kBAClB,QACAgC,KACA,UACAgB;YAEFC;QACF;IACF;IAEA,MAAMM,kBAAkB;QACtB,GAAG/B,MAAM;QACTiB;QACAC;QACAC;QACAa,YAAYrC,uBAAuB,CAACK,OAAOiC,KAAK,CAAC;IACnD;IAEA,IAAIX,UAAU,QAAQ;QACpB,uCAAuC;QACvC,MAAM1C,0BAA0BmB,MAAME,eAAe;YACnDiC,gBAAgBd;YAChBI;YACAW,UAAU;gBAAC;aAAe;QAC5B;IACF;IAEAlC,cAAcmC,OAAO,GAAG5C,eAAeS,cAAcmC,OAAO;IAC5D1D,2BAA2BqB,MAAME,cAAcS,IAAI,EAAET;IAErD,mCAAmC;IACnC1B,cACEwB,MACAvB,kBAAkB,YAAY6D,OAAO,EAAE,SAAS,YAChD7D,kBAAkByB,cAAcM,UAAU,EAAEP,OAAOqB,YAAY,IAAI,KACnEU,iBACA;QAAEO,mBAAmB7D,kBAAkB8D,YAAY;IAAC;IAGtDjE,6BACEyB,MACAL,aAAa;QACX;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD,GACDA,aAAa;QAAC;KAAoB;IAGpCL,8BACEU,MACAE,cAAcS,IAAI,EAClBd,mCACAwB,6BACAD;IAGF,MAAMlC,gCAAgCc,MAAM;QAC1CH;KACD;IAED,MAAMf,qBAAqBkB;IAE3B,OAAO,IACLf,oBAAoBe,MAAMC,OAAOwC,yBAAyB,EAAE;YAC1DC,WAAW;gBAAC;aAAa;QAC3B;AACJ,EAAE;AAEF,eAAe3C,0BAA0B"}
|
|
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 {
|
|
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
|
-
|
|
76
|
-
|
|
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
|
-
//
|
|
96
|
-
|
|
97
|
-
|
|
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 {
|
|
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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"}
|
package/src/ts/lib/vitest.js
CHANGED
|
@@ -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 {
|
|
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)=>{
|
package/src/ts/lib/vitest.js.map
CHANGED
|
@@ -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 {
|
|
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 {
|
|
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
|
|
45
|
-
//
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
};
|