@aws/nx-plugin 1.0.0-rc.24 → 1.0.0-rc.26
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 +2020 -702
- package/package.json +6 -6
- package/src/agentcore-gateway/gateway-connection/generator.d.ts +1 -1
- package/src/agentcore-gateway/gateway-connection/generator.js +7 -5
- package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -1
- package/src/agentcore-gateway/gateway-connection/schema.d.js.map +1 -1
- package/src/agentcore-gateway/gateway-connection/schema.d.ts +1 -0
- package/src/agentcore-gateway/gateway-connection/schema.json +5 -0
- package/src/agentcore-gateway/generator.js +7 -4
- package/src/agentcore-gateway/generator.js.map +1 -1
- package/src/agentcore-gateway/mcp-connection/generator.d.ts +1 -1
- package/src/agentcore-gateway/mcp-connection/generator.js +7 -5
- package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -1
- package/src/agentcore-gateway/mcp-connection/schema.d.js.map +1 -1
- package/src/agentcore-gateway/mcp-connection/schema.d.ts +1 -0
- package/src/agentcore-gateway/mcp-connection/schema.json +5 -0
- package/src/agentcore-gateway/schema.d.js.map +1 -1
- package/src/agentcore-gateway/schema.d.ts +1 -0
- package/src/agentcore-gateway/schema.json +5 -0
- package/src/connection/generator.d.ts +3 -10
- package/src/connection/generator.js +18 -148
- package/src/connection/generator.js.map +1 -1
- package/src/connection/schema.d.js.map +1 -1
- package/src/connection/schema.d.ts +1 -0
- package/src/connection/schema.json +5 -0
- package/src/connection/supported-connections.d.ts +98 -0
- package/src/connection/supported-connections.js +138 -0
- package/src/connection/supported-connections.js.map +1 -0
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +29 -21
- package/src/infra/app/generator.js +12 -6
- package/src/infra/app/generator.js.map +1 -1
- package/src/infra/app/schema.d.js.map +1 -1
- package/src/infra/app/schema.d.ts +1 -1
- package/src/infra/app/schema.json +5 -0
- package/src/license/schema.d.js.map +1 -1
- package/src/license/schema.d.ts +2 -0
- package/src/license/schema.json +5 -0
- package/src/mcp-server/tools/general-guidance.js +17 -0
- package/src/mcp-server/tools/general-guidance.js.map +1 -1
- package/src/preset/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/preset/generator.d.ts +1 -1
- package/src/preset/generator.js +8 -5
- 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/__snapshots__/generator.constructs.spec.ts.snap +9 -9
- package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +10 -10
- package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +1 -1
- package/src/py/agent/a2a-connection/generator.js +7 -4
- package/src/py/agent/a2a-connection/generator.js.map +1 -1
- package/src/py/agent/a2a-connection/schema.d.js.map +1 -1
- package/src/py/agent/a2a-connection/schema.d.ts +1 -0
- package/src/py/agent/a2a-connection/schema.json +5 -0
- package/src/py/agent/gateway-connection/generator.js +7 -4
- package/src/py/agent/gateway-connection/generator.js.map +1 -1
- package/src/py/agent/gateway-connection/schema.d.js.map +1 -1
- package/src/py/agent/gateway-connection/schema.d.ts +1 -0
- package/src/py/agent/gateway-connection/schema.json +5 -0
- package/src/py/agent/generator.js +8 -6
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/generator.js +7 -4
- package/src/py/agent/mcp-connection/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/schema.d.js.map +1 -1
- package/src/py/agent/mcp-connection/schema.d.ts +1 -0
- package/src/py/agent/mcp-connection/schema.json +5 -0
- package/src/py/agent/react-connection/generator.d.ts +1 -1
- package/src/py/agent/react-connection/generator.js +7 -4
- package/src/py/agent/react-connection/generator.js.map +1 -1
- package/src/py/agent/react-connection/schema.d.js.map +1 -1
- package/src/py/agent/react-connection/schema.d.ts +1 -0
- package/src/py/agent/react-connection/schema.json +5 -0
- package/src/py/agent/schema.d.js.map +1 -1
- package/src/py/agent/schema.d.ts +1 -0
- package/src/py/agent/schema.json +5 -0
- package/src/py/api/generator.js +2 -1
- package/src/py/api/generator.js.map +1 -1
- package/src/py/api/schema.d.js.map +1 -1
- package/src/py/api/schema.d.ts +1 -0
- package/src/py/api/schema.json +5 -0
- package/src/py/dynamodb/agent-connection/generator.js +8 -6
- package/src/py/dynamodb/agent-connection/generator.js.map +1 -1
- package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -1
- package/src/py/dynamodb/agent-connection/schema.d.ts +1 -0
- package/src/py/dynamodb/agent-connection/schema.json +5 -0
- package/src/py/dynamodb/fast-api-connection/generator.js +8 -6
- package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -1
- package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -1
- package/src/py/dynamodb/fast-api-connection/schema.d.ts +1 -0
- package/src/py/dynamodb/fast-api-connection/schema.json +5 -0
- package/src/py/dynamodb/generator.js +10 -7
- package/src/py/dynamodb/generator.js.map +1 -1
- package/src/py/dynamodb/mcp-server-connection/generator.js +8 -6
- package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -1
- package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -1
- package/src/py/dynamodb/mcp-server-connection/schema.d.ts +1 -0
- package/src/py/dynamodb/mcp-server-connection/schema.json +5 -0
- package/src/py/dynamodb/schema.d.js.map +1 -1
- package/src/py/dynamodb/schema.d.ts +1 -0
- package/src/py/dynamodb/schema.json +5 -0
- package/src/py/fast-api/generator.js +10 -7
- package/src/py/fast-api/generator.js.map +1 -1
- package/src/py/fast-api/react/generator.d.ts +2 -2
- package/src/py/fast-api/react/generator.js +7 -5
- package/src/py/fast-api/react/generator.js.map +1 -1
- package/src/py/fast-api/react/schema.d.js.map +1 -1
- package/src/py/fast-api/react/schema.d.ts +1 -0
- package/src/py/fast-api/react/schema.json +5 -0
- package/src/py/fast-api/schema.d.js.map +1 -1
- package/src/py/fast-api/schema.d.ts +1 -0
- package/src/py/fast-api/schema.json +5 -0
- package/src/py/lambda-function/generator.js +8 -6
- package/src/py/lambda-function/generator.js.map +1 -1
- package/src/py/lambda-function/schema.d.js.map +1 -1
- package/src/py/lambda-function/schema.d.ts +1 -0
- package/src/py/lambda-function/schema.json +5 -0
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +5 -5
- package/src/py/mcp-server/generator.js +8 -6
- package/src/py/mcp-server/generator.js.map +1 -1
- package/src/py/mcp-server/schema.d.js.map +1 -1
- package/src/py/mcp-server/schema.d.ts +1 -0
- package/src/py/mcp-server/schema.json +5 -0
- package/src/py/project/generator.js +9 -6
- package/src/py/project/generator.js.map +1 -1
- package/src/py/project/schema.d.js.map +1 -1
- package/src/py/project/schema.d.ts +1 -0
- package/src/py/project/schema.json +5 -0
- package/src/sdk/open-api.d.ts +1 -1
- package/src/sdk/open-api.js +1 -1
- package/src/sdk/open-api.js.map +1 -1
- package/src/sdk/utils/ast.d.ts +1 -2
- package/src/sdk/utils/ast.js +1 -2
- package/src/sdk/utils/ast.js.map +1 -1
- package/src/smithy/project/generator.js +7 -4
- package/src/smithy/project/generator.js.map +1 -1
- package/src/smithy/project/schema.d.js.map +1 -1
- package/src/smithy/project/schema.d.ts +1 -0
- package/src/smithy/project/schema.json +5 -0
- package/src/smithy/react-connection/generator.js +7 -4
- package/src/smithy/react-connection/generator.js.map +1 -1
- package/src/smithy/react-connection/schema.d.js.map +1 -1
- package/src/smithy/react-connection/schema.d.ts +1 -0
- package/src/smithy/react-connection/schema.json +5 -0
- package/src/smithy/ts/api/generator.js +11 -6
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/smithy/ts/api/schema.d.js.map +1 -1
- package/src/smithy/ts/api/schema.d.ts +1 -0
- package/src/smithy/ts/api/schema.json +5 -0
- package/src/terraform/project/generator.js +13 -4
- package/src/terraform/project/generator.js.map +1 -1
- package/src/terraform/project/schema.d.js.map +1 -1
- package/src/terraform/project/schema.d.ts +1 -0
- package/src/terraform/project/schema.json +5 -0
- package/src/trpc/backend/generator.d.ts +1 -1
- package/src/trpc/backend/generator.js +9 -5
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/trpc/backend/schema.d.js.map +1 -1
- package/src/trpc/backend/schema.d.ts +1 -0
- package/src/trpc/backend/schema.json +5 -0
- package/src/trpc/react/generator.d.ts +1 -1
- package/src/trpc/react/generator.js +9 -5
- package/src/trpc/react/generator.js.map +1 -1
- package/src/trpc/react/schema.d.js.map +1 -1
- package/src/trpc/react/schema.d.ts +1 -0
- package/src/trpc/react/schema.json +5 -0
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/agent/a2a-connection/generator.js +7 -4
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/a2a-connection/schema.d.js.map +1 -1
- package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
- package/src/ts/agent/a2a-connection/schema.json +5 -0
- package/src/ts/agent/gateway-connection/generator.js +7 -4
- package/src/ts/agent/gateway-connection/generator.js.map +1 -1
- package/src/ts/agent/gateway-connection/schema.d.js.map +1 -1
- package/src/ts/agent/gateway-connection/schema.d.ts +1 -0
- package/src/ts/agent/gateway-connection/schema.json +5 -0
- package/src/ts/agent/generator.js +7 -4
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/generator.js +7 -4
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/schema.d.js.map +1 -1
- package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
- package/src/ts/agent/mcp-connection/schema.json +5 -0
- package/src/ts/agent/react-connection/generator.d.ts +1 -1
- package/src/ts/agent/react-connection/generator.js +14 -8
- package/src/ts/agent/react-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/schema.d.js.map +1 -1
- package/src/ts/agent/react-connection/schema.d.ts +1 -0
- package/src/ts/agent/react-connection/schema.json +5 -0
- package/src/ts/agent/schema.d.js.map +1 -1
- package/src/ts/agent/schema.d.ts +1 -0
- package/src/ts/agent/schema.json +5 -0
- package/src/ts/api/generator.js +4 -2
- package/src/ts/api/generator.js.map +1 -1
- package/src/ts/api/schema.d.js.map +1 -1
- package/src/ts/api/schema.d.ts +1 -0
- package/src/ts/api/schema.json +5 -0
- package/src/ts/astro-docs/generator.js +7 -6
- package/src/ts/astro-docs/generator.js.map +1 -1
- package/src/ts/astro-docs/schema.d.js.map +1 -1
- package/src/ts/astro-docs/schema.d.ts +2 -2
- package/src/ts/astro-docs/schema.json +3 -3
- package/src/ts/docs/schema.d.js.map +1 -1
- package/src/ts/docs/schema.d.ts +1 -4
- package/src/ts/docs/schema.json +3 -3
- package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -1
- package/src/ts/dynamodb/agent-connection/schema.d.ts +1 -0
- package/src/ts/dynamodb/agent-connection/schema.json +5 -0
- package/src/ts/dynamodb/generator.js +9 -5
- package/src/ts/dynamodb/generator.js.map +1 -1
- package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -1
- package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +1 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
- package/src/ts/dynamodb/schema.d.js.map +1 -1
- package/src/ts/dynamodb/schema.d.ts +1 -0
- package/src/ts/dynamodb/schema.json +5 -0
- package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -1
- package/src/ts/dynamodb/smithy-connection/schema.d.ts +1 -0
- package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
- package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -1
- package/src/ts/dynamodb/trpc-connection/schema.d.ts +1 -0
- package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
- package/src/ts/lambda-function/generator.js +7 -4
- package/src/ts/lambda-function/generator.js.map +1 -1
- package/src/ts/lambda-function/schema.d.js.map +1 -1
- package/src/ts/lambda-function/schema.d.ts +1 -0
- package/src/ts/lambda-function/schema.json +5 -0
- package/src/ts/lib/generator.js +10 -6
- package/src/ts/lib/generator.js.map +1 -1
- package/src/ts/lib/schema.d.js.map +1 -1
- package/src/ts/lib/schema.d.ts +1 -1
- package/src/ts/lib/schema.json +5 -0
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/mcp-server/generator.js +7 -4
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/mcp-server/schema.d.js.map +1 -1
- package/src/ts/mcp-server/schema.d.ts +1 -0
- package/src/ts/mcp-server/schema.json +5 -0
- package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +18 -8
- package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
- package/src/ts/nx-generator/files/common/schema.json.template +5 -0
- package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +3 -4
- package/src/ts/nx-generator/generator.js +7 -4
- package/src/ts/nx-generator/generator.js.map +1 -1
- package/src/ts/nx-generator/schema.d.js.map +1 -1
- package/src/ts/nx-generator/schema.d.ts +1 -0
- package/src/ts/nx-generator/schema.json +5 -0
- package/src/ts/nx-plugin/generator.js +13 -6
- package/src/ts/nx-plugin/generator.js.map +1 -1
- package/src/ts/nx-plugin/schema.json +5 -0
- package/src/ts/rdb/agent-connection/schema.d.js.map +1 -1
- package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
- package/src/ts/rdb/agent-connection/schema.json +5 -0
- package/src/ts/rdb/generator.js +9 -5
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
- package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
- package/src/ts/rdb/schema.d.js.map +1 -1
- package/src/ts/rdb/schema.d.ts +1 -0
- package/src/ts/rdb/schema.json +5 -0
- package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -1
- package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
- package/src/ts/rdb/smithy-connection/schema.json +5 -0
- package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -1
- package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
- package/src/ts/rdb/trpc-connection/schema.json +5 -0
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +26 -26
- package/src/ts/react-website/app/generator.d.ts +1 -1
- package/src/ts/react-website/app/generator.js +18 -6
- package/src/ts/react-website/app/generator.js.map +1 -1
- package/src/ts/react-website/app/schema.d.js.map +1 -1
- package/src/ts/react-website/app/schema.d.ts +1 -1
- package/src/ts/react-website/app/schema.json +5 -0
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +10 -7
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +1 -1
- package/src/ts/react-website/cognito-auth/generator.d.ts +1 -1
- package/src/ts/react-website/cognito-auth/generator.js +9 -5
- package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -1
- package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
- package/src/ts/react-website/cognito-auth/schema.json +5 -0
- package/src/ts/react-website/runtime-config/schema.d.js.map +1 -1
- package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
- package/src/ts/react-website/runtime-config/schema.json +5 -0
- package/src/ts/website/app/schema.d.js.map +1 -1
- package/src/ts/website/app/schema.d.ts +1 -1
- package/src/ts/website/app/schema.json +5 -0
- package/src/ts/website/auth/generator.d.ts +1 -1
- package/src/ts/website/auth/generator.js +2 -1
- package/src/ts/website/auth/generator.js.map +1 -1
- package/src/ts/website/auth/schema.d.js.map +1 -1
- package/src/ts/website/auth/schema.d.ts +1 -0
- package/src/ts/website/auth/schema.json +5 -0
- package/src/utils/files/common/scripts/src/infra/stage-credentials/cdk-command.ts.template +11 -3
- package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +10 -7
- package/src/utils/install.d.ts +32 -0
- package/src/utils/install.js +56 -0
- package/src/utils/install.js.map +1 -0
- package/src/utils/versions.d.ts +64 -64
- package/src/utils/versions.js +63 -63
- package/src/utils/versions.js.map +1 -1
|
@@ -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 installPackagesTask,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n writeJson,\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 { formatFilesInSubtree } from '../../utils/format';\nimport { FsCommands } from '../../utils/fs';\nimport { resolveIac } from '../../utils/iac';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\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 { 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 // Create a package.json if one doesn't exist, since we want to add the server as a bin target\n const projectPackageJsonPath = joinPathFragments(\n project.root,\n 'package.json',\n );\n if (!tree.exists(projectPackageJsonPath)) {\n // Default to esm if no package.json found\n writeJson(tree, projectPackageJsonPath, {\n name: project.name,\n type: 'module',\n });\n }\n\n // Generate esm if the package.json is of type module, otherwise we generate commonjs\n // We support commonjs here because nx plugins must be commonjs\n // https://github.com/nrwl/nx/issues/15682\n const esm = readJson(tree, projectPackageJsonPath).type === 'module';\n\n // Add a target for running the MCP server with stdio transport\n // This allows for the project to be published to npm and then configured with npx, ie:\n // npx -p my-package mcp-server\n updateJson(tree, projectPackageJsonPath, (pkg) => {\n pkg.bin ??= {};\n pkg.bin[name] = `${relativeSourceDir}/stdio.js`;\n return pkg;\n });\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 },\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 // 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 addDependenciesToPackageJson(tree, deps, devDeps, projectPackageJsonPath);\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 installPackagesTask(tree);\n };\n};\n\nexport default tsMcpServerGenerator;\n"],"names":["addDependenciesToPackageJson","detectPackageManager","generateFiles","installPackagesTask","joinPathFragments","OverwriteStrategy","readJson","updateJson","updateProjectConfiguration","writeJson","ensureLicenseExceptions","MCP_INSPECTOR_EXCEPTIONS","addMcpServerInfra","addTypeScriptBundleTarget","resolveContainers","formatFilesInSubtree","FsCommands","resolveIac","addGeneratorMetricsIfApplicable","kebabCase","toClassName","getNpmScope","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","assignPort","sharedConstructsGenerator","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","type","esm","pkg","bin","dirname","adotVersion","overwriteStrategy","KeepExisting","deps","devDeps","containers","dockerImageTag","targetFilePath","bundleOutputDir","dockerOutputDir","dockerTargetName","fs","targets","cache","outputs","executor","commands","cp","parallel","dependsOn","iac","mcpServerNameKebabCase","projectName","delete","packageJson","resolutions","localDevPort","component","info","mcpTargets","continuous","cwd","env","PORT","LOCAL_DEV","port","rc"],"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 addDependenciesToPackageJson,\n detectPackageManager,\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n writeJson,\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 { 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 { 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 { 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 // Create a package.json if one doesn't exist, since we want to add the server as a bin target\n const projectPackageJsonPath = joinPathFragments(\n project.root,\n 'package.json',\n );\n if (!tree.exists(projectPackageJsonPath)) {\n // Default to esm if no package.json found\n writeJson(tree, projectPackageJsonPath, {\n name: project.name,\n type: 'module',\n });\n }\n\n // Generate esm if the package.json is of type module, otherwise we generate commonjs\n // We support commonjs here because nx plugins must be commonjs\n // https://github.com/nrwl/nx/issues/15682\n const esm = readJson(tree, projectPackageJsonPath).type === 'module';\n\n // Add a target for running the MCP server with stdio transport\n // This allows for the project to be published to npm and then configured with npx, ie:\n // npx -p my-package mcp-server\n updateJson(tree, projectPackageJsonPath, (pkg) => {\n pkg.bin ??= {};\n pkg.bin[name] = `${relativeSourceDir}/stdio.js`;\n return pkg;\n });\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 },\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 // 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 addDependenciesToPackageJson(tree, deps, devDeps, projectPackageJsonPath);\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","writeJson","ensureLicenseExceptions","MCP_INSPECTOR_EXCEPTIONS","addMcpServerInfra","addTypeScriptBundleTarget","resolveContainers","formatFilesInSubtree","FsCommands","resolveIac","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","getNpmScope","addComponentDevTarget","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","assignPort","sharedConstructsGenerator","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","type","esm","pkg","bin","dirname","adotVersion","overwriteStrategy","KeepExisting","deps","devDeps","containers","dockerImageTag","targetFilePath","bundleOutputDir","dockerOutputDir","dockerTargetName","fs","targets","cache","outputs","executor","commands","cp","parallel","dependsOn","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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/mcp-server/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IacOption } from '../../utils/iac';\n\nexport type TsMcpServerInfra = 'none' | 'agentcore';\n\nexport type TsMcpServerAuth = 'iam' | 'cognito';\n\nexport interface TsMcpServerGeneratorSchema {\n project: string;\n name?: string;\n infra?: TsMcpServerInfra;\n auth?: TsMcpServerAuth;\n iac: IacOption;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAQD,
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/mcp-server/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { IacOption } from '../../utils/iac';\n\nexport type TsMcpServerInfra = 'none' | 'agentcore';\n\nexport type TsMcpServerAuth = 'iam' | 'cognito';\n\nexport interface TsMcpServerGeneratorSchema {\n project: string;\n name?: string;\n infra?: TsMcpServerInfra;\n auth?: TsMcpServerAuth;\n iac: IacOption;\n preferInstallDependencies?: boolean;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAQD,WAOC"}
|
|
@@ -43,6 +43,11 @@
|
|
|
43
43
|
"enum": ["agentcore", "none"],
|
|
44
44
|
"default": "agentcore",
|
|
45
45
|
"x-priority": "important"
|
|
46
|
+
},
|
|
47
|
+
"preferInstallDependencies": {
|
|
48
|
+
"type": "boolean",
|
|
49
|
+
"description": "Whether to prefer installing dependencies after the generator runs. Set to false to defer installing when batching multiple generators (an install still runs if needed so subsequent generators can compute the Nx project graph); install once at the end.",
|
|
50
|
+
"default": true
|
|
46
51
|
}
|
|
47
52
|
},
|
|
48
53
|
"required": ["project"]
|
|
@@ -109,15 +109,12 @@ describe('foo#bar generator', () => {
|
|
|
109
109
|
`;
|
|
110
110
|
|
|
111
111
|
exports[`nx-generator generator > within @aws/nx-plugin > should generate an example schema, generator and test > generator.ts 1`] = `
|
|
112
|
-
"import {
|
|
113
|
-
type GeneratorCallback,
|
|
114
|
-
type Tree,
|
|
115
|
-
installPackagesTask,
|
|
116
|
-
} from '@nx/devkit';
|
|
112
|
+
"import { type GeneratorCallback, type Tree } from '@nx/devkit';
|
|
117
113
|
import type { FooBarGeneratorSchema } from './schema.js';
|
|
118
114
|
import { type NxGeneratorInfo, getGeneratorInfo } from '../utils/nx';
|
|
119
115
|
import { addGeneratorMetricsIfApplicable } from '../utils/metrics';
|
|
120
116
|
import { formatFilesInSubtree } from '../utils/format';
|
|
117
|
+
import { installDependencies } from '../utils/install';
|
|
121
118
|
|
|
122
119
|
export const FOO_BAR_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(
|
|
123
120
|
import.meta.filename,
|
|
@@ -132,9 +129,10 @@ export const fooBarGenerator = async (
|
|
|
132
129
|
await addGeneratorMetricsIfApplicable(tree, [FOO_BAR_GENERATOR_INFO]);
|
|
133
130
|
|
|
134
131
|
await formatFilesInSubtree(tree);
|
|
135
|
-
return () =>
|
|
136
|
-
|
|
137
|
-
|
|
132
|
+
return () =>
|
|
133
|
+
installDependencies(tree, options.preferInstallDependencies, {
|
|
134
|
+
languages: ['typescript'],
|
|
135
|
+
});
|
|
138
136
|
};
|
|
139
137
|
|
|
140
138
|
export default fooBarGenerator;
|
|
@@ -149,6 +147,7 @@ exports[`nx-generator generator > within @aws/nx-plugin > should generate an exa
|
|
|
149
147
|
export interface FooBarGeneratorSchema {
|
|
150
148
|
// Replace with your options
|
|
151
149
|
exampleOption: string;
|
|
150
|
+
preferInstallDependencies?: boolean;
|
|
152
151
|
}
|
|
153
152
|
"
|
|
154
153
|
`;
|
|
@@ -166,6 +165,11 @@ exports[`nx-generator generator > within @aws/nx-plugin > should generate an exa
|
|
|
166
165
|
"description": "An example option. Refer to https://nx.dev/extending-nx/recipes/generator-options for more info",
|
|
167
166
|
"x-priority": "important",
|
|
168
167
|
"x-prompt": "This is an example option!"
|
|
168
|
+
},
|
|
169
|
+
"preferInstallDependencies": {
|
|
170
|
+
"type": "boolean",
|
|
171
|
+
"description": "Whether to prefer installing dependencies after the generator runs. Set to false to defer installing when batching multiple generators (an install still runs if needed so subsequent generators can compute the Nx project graph); install once at the end.",
|
|
172
|
+
"default": true
|
|
169
173
|
}
|
|
170
174
|
},
|
|
171
175
|
"required": ["exampleOption"]
|
|
@@ -254,6 +258,7 @@ exports[`nx-generator generator > within another workspace > should generate an
|
|
|
254
258
|
export interface FooBarGeneratorSchema {
|
|
255
259
|
// Replace with your options
|
|
256
260
|
exampleOption: string;
|
|
261
|
+
preferInstallDependencies?: boolean;
|
|
257
262
|
}
|
|
258
263
|
"
|
|
259
264
|
`;
|
|
@@ -271,6 +276,11 @@ exports[`nx-generator generator > within another workspace > should generate an
|
|
|
271
276
|
"description": "An example option. Refer to https://nx.dev/extending-nx/recipes/generator-options for more info",
|
|
272
277
|
"x-priority": "important",
|
|
273
278
|
"x-prompt": "This is an example option!"
|
|
279
|
+
},
|
|
280
|
+
"preferInstallDependencies": {
|
|
281
|
+
"type": "boolean",
|
|
282
|
+
"description": "Whether to prefer installing dependencies after the generator runs. Set to false to defer installing when batching multiple generators (an install still runs if needed so subsequent generators can compute the Nx project graph); install once at the end.",
|
|
283
|
+
"default": true
|
|
274
284
|
}
|
|
275
285
|
},
|
|
276
286
|
"required": ["exampleOption"]
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
"description": "An example option. Refer to https://nx.dev/extending-nx/recipes/generator-options for more info",
|
|
11
11
|
"x-priority": "important",
|
|
12
12
|
"x-prompt": "This is an example option!"
|
|
13
|
+
},
|
|
14
|
+
"preferInstallDependencies": {
|
|
15
|
+
"type": "boolean",
|
|
16
|
+
"description": "Whether to prefer installing dependencies after the generator runs. Set to false to defer installing when batching multiple generators (an install still runs if needed so subsequent generators can compute the Nx project graph); install once at the end.",
|
|
17
|
+
"default": true
|
|
13
18
|
}
|
|
14
19
|
},
|
|
15
20
|
"required": ["exampleOption"]
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { type GeneratorCallback, type Tree
|
|
1
|
+
import { type GeneratorCallback, type Tree } from "@nx/devkit";
|
|
2
2
|
import type { <%- namePascalCase %>GeneratorSchema } from './schema.js';
|
|
3
3
|
import { type NxGeneratorInfo, getGeneratorInfo } from '<%- pathToProjectSourceRoot %>utils/nx';
|
|
4
4
|
import { addGeneratorMetricsIfApplicable } from '<%- pathToProjectSourceRoot %>utils/metrics';
|
|
5
5
|
import { formatFilesInSubtree } from '<%- pathToProjectSourceRoot %>utils/format';
|
|
6
|
+
import { installDependencies } from '<%- pathToProjectSourceRoot %>utils/install';
|
|
6
7
|
|
|
7
8
|
export const <%- nameUpperSnakeCase %>_GENERATOR_INFO: NxGeneratorInfo =
|
|
8
9
|
getGeneratorInfo(import.meta.filename);
|
|
@@ -14,9 +15,7 @@ export const <%- nameCamelCase %>Generator = async (tree: Tree, options: <%- nam
|
|
|
14
15
|
await addGeneratorMetricsIfApplicable(tree, [<%- nameUpperSnakeCase %>_GENERATOR_INFO]);
|
|
15
16
|
|
|
16
17
|
await formatFilesInSubtree(tree);
|
|
17
|
-
return () => {
|
|
18
|
-
installPackagesTask(tree);
|
|
19
|
-
};
|
|
18
|
+
return () => installDependencies(tree, options.preferInstallDependencies, { languages: ['typescript'] });
|
|
20
19
|
};
|
|
21
20
|
|
|
22
21
|
export default <%- nameCamelCase %>Generator;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/ import { generateFiles,
|
|
4
|
+
*/ import { generateFiles, joinPathFragments, OverwriteStrategy, readJson, writeJson } from "@nx/devkit";
|
|
5
5
|
import camelCase from "lodash.camelcase";
|
|
6
6
|
import PackageJson from "../../../package.json" with {
|
|
7
7
|
type: 'json'
|
|
8
8
|
};
|
|
9
9
|
import { addStarExport, applyGritQL } from "../../utils/ast.js";
|
|
10
10
|
import { formatFilesInSubtree } from "../../utils/format.js";
|
|
11
|
+
import { installDependencies } from "../../utils/install.js";
|
|
11
12
|
import { addGeneratorMetricsIfApplicable } from "../../utils/metrics.js";
|
|
12
13
|
import { kebabCase, pascalCase, snakeCase } from "../../utils/names.js";
|
|
13
14
|
import { addComponentGeneratorMetadata, getGeneratorInfo, readProjectConfigurationUnqualified } from "../../utils/nx.js";
|
|
@@ -112,9 +113,11 @@ export const tsNxGeneratorGenerator = async (tree, options)=>{
|
|
|
112
113
|
NX_GENERATOR_GENERATOR_INFO
|
|
113
114
|
]);
|
|
114
115
|
await formatFilesInSubtree(tree);
|
|
115
|
-
return ()=>{
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
return ()=>installDependencies(tree, options.preferInstallDependencies, {
|
|
117
|
+
languages: [
|
|
118
|
+
'typescript'
|
|
119
|
+
]
|
|
120
|
+
});
|
|
118
121
|
};
|
|
119
122
|
const incrementMetric = (metrics)=>{
|
|
120
123
|
const maxMetric = Math.max(...metrics.map((m)=>Number(m.slice(1))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-generator/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 installPackagesTask,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n writeJson,\n} from '@nx/devkit';\nimport camelCase from 'lodash.camelcase';\nimport PackageJson from '../../../package.json' with { type: 'json' };\nimport { addStarExport, applyGritQL } from '../../utils/ast';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { kebabCase, pascalCase, snakeCase } from '../../utils/names';\nimport {\n addComponentGeneratorMetadata,\n getGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths';\nimport { configureTsProjectAsNxPlugin } from '../nx-plugin/utils';\nimport type { TsNxGeneratorGeneratorSchema } from './schema';\n\nexport const NX_GENERATOR_GENERATOR_INFO = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsNxGeneratorGenerator = async (\n tree: Tree,\n options: TsNxGeneratorGeneratorSchema,\n): Promise<GeneratorCallback | void> => {\n const { name, directory, project: pluginProject, description } = options;\n\n const plugin = readProjectConfigurationUnqualified(tree, pluginProject);\n const sourceRoot = plugin.sourceRoot ?? joinPathFragments(plugin.root, 'src');\n const sourceRootParts = sourceRoot.split('/');\n const srcDir = sourceRootParts[sourceRootParts.length - 1];\n const generatorSubDir = directory ?? kebabCase(name);\n const generatorDir = joinPathFragments(sourceRoot, generatorSubDir);\n\n const rootPackageJson = tree.exists('package.json')\n ? readJson(tree, 'package.json')\n : undefined;\n const isNxPluginForAws = rootPackageJson?.name === '@aws/nx-plugin-source';\n\n // Configure the targeted project as an Nx Plugin\n configureTsProjectAsNxPlugin(tree, pluginProject);\n\n const enhancedOptions = {\n name,\n description,\n namePascalCase: pascalCase(name),\n nameCamelCase: camelCase(name),\n nameKebabCase: kebabCase(name),\n nameUpperSnakeCase: snakeCase(name).toUpperCase(),\n isNxPluginForAws,\n pathToProjectSourceRoot: getRelativePathToRootByDirectory(generatorSubDir),\n generatorDir,\n generatorSubDir,\n };\n\n // Add the common files, preserving any the user has already implemented\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n generatorDir,\n {\n ...enhancedOptions,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add the files specific to this repo vs a local generator in another project\n if (isNxPluginForAws) {\n // Generators should be in the @aws/nx-plugin project\n if (pluginProject !== PackageJson.name) {\n throw new Error(\n `Generators should be added to the ${PackageJson.name} project.`,\n );\n }\n\n // Add the generator\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'nx-plugin-for-aws',\n 'generator',\n ),\n generatorDir,\n {\n ...enhancedOptions,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Generate guide page in docs\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'nx-plugin-for-aws',\n 'docs',\n ),\n joinPathFragments('docs', 'src', 'content', 'docs', 'en', 'guides'),\n {\n ...enhancedOptions,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Update the docs config to add the page entry to the Generator guides sidebar section\n await applyGritQL(\n tree,\n joinPathFragments('docs', 'astro.config.mjs'),\n `\\`items: [$items]\\` where { $items <: within \\`sidebar: [$_]\\`, $items <: contains \\`'ts#project'\\`, $items <: not contains \\`'/guides/${enhancedOptions.nameKebabCase}'\\`, $items += \\`, { label: '${name}', link: '/guides/${enhancedOptions.nameKebabCase}' }\\` }`,\n );\n\n // Expose the generator from the SDK for known prefixes (ts# / py#)\n addSdkExport(tree, plugin.root, name, generatorSubDir, enhancedOptions);\n } else {\n // Local generator in a project other than nx-plugin-for-aws\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'local'),\n generatorDir,\n {\n ...enhancedOptions,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n const indexPath = joinPathFragments(sourceRoot, 'index.ts');\n if (tree.exists(indexPath)) {\n // NodeNext requires explicit extensions; the local plugin is ESM.\n await addStarExport(tree, indexPath, `./${generatorSubDir}/generator.js`);\n }\n\n addComponentGeneratorMetadata(\n tree,\n plugin.name,\n NX_GENERATOR_GENERATOR_INFO,\n joinPathFragments(srcDir, generatorSubDir),\n name,\n );\n }\n\n const factoryBasePath = `./${srcDir}/${generatorSubDir}`;\n\n // Update generators.json\n const generatorsJsonPath = joinPathFragments(plugin.root, 'generators.json');\n const generatorsJson = tree.exists(generatorsJsonPath)\n ? readJson(tree, generatorsJsonPath)\n : { generators: {} };\n // Metrics are only tracked within the @aws/nx-plugin repo. Reuse the existing\n // metric for a same-name re-run, otherwise allocate a new one.\n let metric: string | undefined;\n if (isNxPluginForAws) {\n const existingMetrics = Object.values(generatorsJson?.generators ?? {})\n .map((g: any) => g.metric)\n .filter((m): m is string => typeof m === 'string');\n metric =\n generatorsJson?.generators?.[name]?.metric ??\n (existingMetrics.length > 0 ? incrementMetric(existingMetrics) : 'g1');\n }\n writeJson(tree, generatorsJsonPath, {\n ...generatorsJson,\n generators: sortObjectKeys({\n ...generatorsJson?.generators,\n [name]: {\n factory: `${factoryBasePath}/generator`,\n schema: `${factoryBasePath}/schema.json`,\n description:\n description ?? 'TODO: Add short description of the generator',\n ...(isNxPluginForAws ? { metric } : {}),\n },\n }),\n });\n\n await addGeneratorMetricsIfApplicable(tree, [NX_GENERATOR_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n\n return () => {\n installPackagesTask(tree);\n };\n};\n\nconst incrementMetric = (metrics: string[]): string => {\n const maxMetric = Math.max(...metrics.map((m) => Number(m.slice(1))));\n return `g${maxMetric + 1}`;\n};\n\n// Maps a generator name prefix to the SDK entry point that should re-export it\nconst SDK_EXPORT_PREFIXES: Record<string, string> = {\n 'ts#': 'ts',\n 'py#': 'py',\n};\n\n// Re-exports a generated generator from the matching SDK entry point so it is\n// available programmatically as part of @aws/nx-plugin's SDK\nconst addSdkExport = (\n tree: Tree,\n pluginRoot: string,\n name: string,\n generatorSubDir: string,\n options: { nameCamelCase: string; namePascalCase: string },\n): void => {\n const prefix = Object.keys(SDK_EXPORT_PREFIXES).find((p) =>\n name.startsWith(p),\n );\n if (!prefix) {\n return;\n }\n\n const sdkPath = joinPathFragments(\n pluginRoot,\n 'src',\n 'sdk',\n `${SDK_EXPORT_PREFIXES[prefix]}.ts`,\n );\n const generatorExport = `${options.nameCamelCase}Generator`;\n const schemaExport = `${options.namePascalCase}GeneratorSchema`;\n const moduleBase = `../${generatorSubDir}`;\n\n const contents = tree.exists(sdkPath) ? tree.read(sdkPath).toString() : '';\n // Idempotent: skip if this generator is already exported\n if (contents.includes(`${moduleBase}/generator`)) {\n return;\n }\n\n const block = `// ${options.namePascalCase} Generator\\nexport { ${generatorExport} } from '${moduleBase}/generator';\\nexport type { ${schemaExport} } from '${moduleBase}/schema';\\n`;\n\n const prefixContents = contents.trim()\n ? `${contents.replace(/\\s*$/, '')}\\n\\n`\n : '';\n tree.write(sdkPath, `${prefixContents}${block}`);\n};\n\nexport default tsNxGeneratorGenerator;\n"],"names":["generateFiles","installPackagesTask","joinPathFragments","OverwriteStrategy","readJson","writeJson","camelCase","PackageJson","type","addStarExport","applyGritQL","formatFilesInSubtree","addGeneratorMetricsIfApplicable","kebabCase","pascalCase","snakeCase","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","getRelativePathToRootByDirectory","configureTsProjectAsNxPlugin","NX_GENERATOR_GENERATOR_INFO","filename","tsNxGeneratorGenerator","tree","options","name","directory","project","pluginProject","description","plugin","sourceRoot","root","sourceRootParts","split","srcDir","length","generatorSubDir","generatorDir","rootPackageJson","exists","undefined","isNxPluginForAws","enhancedOptions","namePascalCase","nameCamelCase","nameKebabCase","nameUpperSnakeCase","toUpperCase","pathToProjectSourceRoot","dirname","overwriteStrategy","KeepExisting","Error","addSdkExport","indexPath","factoryBasePath","generatorsJsonPath","generatorsJson","generators","metric","existingMetrics","Object","values","map","g","filter","m","incrementMetric","factory","schema","metrics","maxMetric","Math","max","Number","slice","SDK_EXPORT_PREFIXES","pluginRoot","prefix","keys","find","p","startsWith","sdkPath","generatorExport","schemaExport","moduleBase","contents","read","toString","includes","block","prefixContents","trim","replace","write"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-generator/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n readJson,\n type Tree,\n writeJson,\n} from '@nx/devkit';\nimport camelCase from 'lodash.camelcase';\nimport PackageJson from '../../../package.json' with { type: 'json' };\nimport { addStarExport, applyGritQL } from '../../utils/ast';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { kebabCase, pascalCase, snakeCase } from '../../utils/names';\nimport {\n addComponentGeneratorMetadata,\n getGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport { getRelativePathToRootByDirectory } from '../../utils/paths';\nimport { configureTsProjectAsNxPlugin } from '../nx-plugin/utils';\nimport type { TsNxGeneratorGeneratorSchema } from './schema';\n\nexport const NX_GENERATOR_GENERATOR_INFO = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsNxGeneratorGenerator = async (\n tree: Tree,\n options: TsNxGeneratorGeneratorSchema,\n): Promise<GeneratorCallback | void> => {\n const { name, directory, project: pluginProject, description } = options;\n\n const plugin = readProjectConfigurationUnqualified(tree, pluginProject);\n const sourceRoot = plugin.sourceRoot ?? joinPathFragments(plugin.root, 'src');\n const sourceRootParts = sourceRoot.split('/');\n const srcDir = sourceRootParts[sourceRootParts.length - 1];\n const generatorSubDir = directory ?? kebabCase(name);\n const generatorDir = joinPathFragments(sourceRoot, generatorSubDir);\n\n const rootPackageJson = tree.exists('package.json')\n ? readJson(tree, 'package.json')\n : undefined;\n const isNxPluginForAws = rootPackageJson?.name === '@aws/nx-plugin-source';\n\n // Configure the targeted project as an Nx Plugin\n configureTsProjectAsNxPlugin(tree, pluginProject);\n\n const enhancedOptions = {\n name,\n description,\n namePascalCase: pascalCase(name),\n nameCamelCase: camelCase(name),\n nameKebabCase: kebabCase(name),\n nameUpperSnakeCase: snakeCase(name).toUpperCase(),\n isNxPluginForAws,\n pathToProjectSourceRoot: getRelativePathToRootByDirectory(generatorSubDir),\n generatorDir,\n generatorSubDir,\n };\n\n // Add the common files, preserving any the user has already implemented\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'common'),\n generatorDir,\n {\n ...enhancedOptions,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add the files specific to this repo vs a local generator in another project\n if (isNxPluginForAws) {\n // Generators should be in the @aws/nx-plugin project\n if (pluginProject !== PackageJson.name) {\n throw new Error(\n `Generators should be added to the ${PackageJson.name} project.`,\n );\n }\n\n // Add the generator\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'nx-plugin-for-aws',\n 'generator',\n ),\n generatorDir,\n {\n ...enhancedOptions,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Generate guide page in docs\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'nx-plugin-for-aws',\n 'docs',\n ),\n joinPathFragments('docs', 'src', 'content', 'docs', 'en', 'guides'),\n {\n ...enhancedOptions,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Update the docs config to add the page entry to the Generator guides sidebar section\n await applyGritQL(\n tree,\n joinPathFragments('docs', 'astro.config.mjs'),\n `\\`items: [$items]\\` where { $items <: within \\`sidebar: [$_]\\`, $items <: contains \\`'ts#project'\\`, $items <: not contains \\`'/guides/${enhancedOptions.nameKebabCase}'\\`, $items += \\`, { label: '${name}', link: '/guides/${enhancedOptions.nameKebabCase}' }\\` }`,\n );\n\n // Expose the generator from the SDK for known prefixes (ts# / py#)\n addSdkExport(tree, plugin.root, name, generatorSubDir, enhancedOptions);\n } else {\n // Local generator in a project other than nx-plugin-for-aws\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'local'),\n generatorDir,\n {\n ...enhancedOptions,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n const indexPath = joinPathFragments(sourceRoot, 'index.ts');\n if (tree.exists(indexPath)) {\n // NodeNext requires explicit extensions; the local plugin is ESM.\n await addStarExport(tree, indexPath, `./${generatorSubDir}/generator.js`);\n }\n\n addComponentGeneratorMetadata(\n tree,\n plugin.name,\n NX_GENERATOR_GENERATOR_INFO,\n joinPathFragments(srcDir, generatorSubDir),\n name,\n );\n }\n\n const factoryBasePath = `./${srcDir}/${generatorSubDir}`;\n\n // Update generators.json\n const generatorsJsonPath = joinPathFragments(plugin.root, 'generators.json');\n const generatorsJson = tree.exists(generatorsJsonPath)\n ? readJson(tree, generatorsJsonPath)\n : { generators: {} };\n // Metrics are only tracked within the @aws/nx-plugin repo. Reuse the existing\n // metric for a same-name re-run, otherwise allocate a new one.\n let metric: string | undefined;\n if (isNxPluginForAws) {\n const existingMetrics = Object.values(generatorsJson?.generators ?? {})\n .map((g: any) => g.metric)\n .filter((m): m is string => typeof m === 'string');\n metric =\n generatorsJson?.generators?.[name]?.metric ??\n (existingMetrics.length > 0 ? incrementMetric(existingMetrics) : 'g1');\n }\n writeJson(tree, generatorsJsonPath, {\n ...generatorsJson,\n generators: sortObjectKeys({\n ...generatorsJson?.generators,\n [name]: {\n factory: `${factoryBasePath}/generator`,\n schema: `${factoryBasePath}/schema.json`,\n description:\n description ?? 'TODO: Add short description of the generator',\n ...(isNxPluginForAws ? { metric } : {}),\n },\n }),\n });\n\n await addGeneratorMetricsIfApplicable(tree, [NX_GENERATOR_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nconst incrementMetric = (metrics: string[]): string => {\n const maxMetric = Math.max(...metrics.map((m) => Number(m.slice(1))));\n return `g${maxMetric + 1}`;\n};\n\n// Maps a generator name prefix to the SDK entry point that should re-export it\nconst SDK_EXPORT_PREFIXES: Record<string, string> = {\n 'ts#': 'ts',\n 'py#': 'py',\n};\n\n// Re-exports a generated generator from the matching SDK entry point so it is\n// available programmatically as part of @aws/nx-plugin's SDK\nconst addSdkExport = (\n tree: Tree,\n pluginRoot: string,\n name: string,\n generatorSubDir: string,\n options: { nameCamelCase: string; namePascalCase: string },\n): void => {\n const prefix = Object.keys(SDK_EXPORT_PREFIXES).find((p) =>\n name.startsWith(p),\n );\n if (!prefix) {\n return;\n }\n\n const sdkPath = joinPathFragments(\n pluginRoot,\n 'src',\n 'sdk',\n `${SDK_EXPORT_PREFIXES[prefix]}.ts`,\n );\n const generatorExport = `${options.nameCamelCase}Generator`;\n const schemaExport = `${options.namePascalCase}GeneratorSchema`;\n const moduleBase = `../${generatorSubDir}`;\n\n const contents = tree.exists(sdkPath) ? tree.read(sdkPath).toString() : '';\n // Idempotent: skip if this generator is already exported\n if (contents.includes(`${moduleBase}/generator`)) {\n return;\n }\n\n const block = `// ${options.namePascalCase} Generator\\nexport { ${generatorExport} } from '${moduleBase}/generator';\\nexport type { ${schemaExport} } from '${moduleBase}/schema';\\n`;\n\n const prefixContents = contents.trim()\n ? `${contents.replace(/\\s*$/, '')}\\n\\n`\n : '';\n tree.write(sdkPath, `${prefixContents}${block}`);\n};\n\nexport default tsNxGeneratorGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","readJson","writeJson","camelCase","PackageJson","type","addStarExport","applyGritQL","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","pascalCase","snakeCase","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","getRelativePathToRootByDirectory","configureTsProjectAsNxPlugin","NX_GENERATOR_GENERATOR_INFO","filename","tsNxGeneratorGenerator","tree","options","name","directory","project","pluginProject","description","plugin","sourceRoot","root","sourceRootParts","split","srcDir","length","generatorSubDir","generatorDir","rootPackageJson","exists","undefined","isNxPluginForAws","enhancedOptions","namePascalCase","nameCamelCase","nameKebabCase","nameUpperSnakeCase","toUpperCase","pathToProjectSourceRoot","dirname","overwriteStrategy","KeepExisting","Error","addSdkExport","indexPath","factoryBasePath","generatorsJsonPath","generatorsJson","generators","metric","existingMetrics","Object","values","map","g","filter","m","incrementMetric","factory","schema","preferInstallDependencies","languages","metrics","maxMetric","Math","max","Number","slice","SDK_EXPORT_PREFIXES","pluginRoot","prefix","keys","find","p","startsWith","sdkPath","generatorExport","schemaExport","moduleBase","contents","read","toString","includes","block","prefixContents","trim","replace","write"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-generator/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport interface TsNxGeneratorGeneratorSchema {\n project: string;\n name: string;\n directory?: string;\n description?: string;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAED,
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-generator/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport interface TsNxGeneratorGeneratorSchema {\n project: string;\n name: string;\n directory?: string;\n description?: string;\n preferInstallDependencies?: boolean;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAED,WAMC"}
|
|
@@ -32,6 +32,11 @@
|
|
|
32
32
|
"type": "string",
|
|
33
33
|
"description": "The directory within the plugin project's source folder to add the generator to (default: <name>)",
|
|
34
34
|
"x-prompt": "Choose the directory you would like to generate the generator in relative to the project's source folder (default: <name>)"
|
|
35
|
+
},
|
|
36
|
+
"preferInstallDependencies": {
|
|
37
|
+
"type": "boolean",
|
|
38
|
+
"description": "Whether to prefer installing dependencies after the generator runs. Set to false to defer installing when batching multiple generators (an install still runs if needed so subsequent generators can compute the Nx project graph); install once at the end.",
|
|
39
|
+
"default": true
|
|
35
40
|
}
|
|
36
41
|
},
|
|
37
42
|
"required": ["project", "name"]
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/ import { generateFiles,
|
|
4
|
+
*/ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
|
|
5
5
|
import { formatFilesInSubtree } from "../../utils/format.js";
|
|
6
|
+
import { installDependencies } from "../../utils/install.js";
|
|
6
7
|
import { addGeneratorMetricsIfApplicable } from "../../utils/metrics.js";
|
|
7
8
|
import { addDependencyToTargetIfNotPresent, addGeneratorMetadata, getGeneratorInfo, readProjectConfigurationUnqualified } from "../../utils/nx.js";
|
|
8
9
|
import { sortObjectKeys } from "../../utils/object.js";
|
|
@@ -13,7 +14,10 @@ export const TS_NX_PLUGIN_GENERATOR_INFO = getGeneratorInfo(import.meta.filename
|
|
|
13
14
|
export const tsNxPluginGenerator = async (tree, options)=>{
|
|
14
15
|
// Generate a TypeScript project as the base
|
|
15
16
|
const { fullyQualifiedName, dir } = getTsLibDetails(tree, options);
|
|
16
|
-
await tsProjectGenerator(tree,
|
|
17
|
+
await tsProjectGenerator(tree, {
|
|
18
|
+
...options,
|
|
19
|
+
preferInstallDependencies: false
|
|
20
|
+
});
|
|
17
21
|
// Configure the typescript project as an Nx Plugin
|
|
18
22
|
configureTsProjectAsNxPlugin(tree, fullyQualifiedName);
|
|
19
23
|
// Add a "package" target which creates a package which can be published to NPM
|
|
@@ -70,7 +74,8 @@ export const tsNxPluginGenerator = async (tree, options)=>{
|
|
|
70
74
|
await tsMcpServerGenerator(tree, {
|
|
71
75
|
project: fullyQualifiedName,
|
|
72
76
|
infra: 'none',
|
|
73
|
-
iac: 'cdk'
|
|
77
|
+
iac: 'cdk',
|
|
78
|
+
preferInstallDependencies: false
|
|
74
79
|
});
|
|
75
80
|
const mcpPath = joinPathFragments(project.sourceRoot, 'mcp-server');
|
|
76
81
|
const mcpServerPath = joinPathFragments(mcpPath, 'server.ts');
|
|
@@ -89,9 +94,11 @@ export const tsNxPluginGenerator = async (tree, options)=>{
|
|
|
89
94
|
TS_NX_PLUGIN_GENERATOR_INFO
|
|
90
95
|
]);
|
|
91
96
|
await formatFilesInSubtree(tree);
|
|
92
|
-
return ()=>{
|
|
93
|
-
|
|
94
|
-
|
|
97
|
+
return ()=>installDependencies(tree, options.preferInstallDependencies, {
|
|
98
|
+
languages: [
|
|
99
|
+
'typescript'
|
|
100
|
+
]
|
|
101
|
+
});
|
|
95
102
|
};
|
|
96
103
|
export default tsNxPluginGenerator;
|
|
97
104
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n
|
|
1
|
+
{"version":3,"sources":["../../../../../../packages/nx-plugin/src/ts/nx-plugin/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport {\n addDependencyToTargetIfNotPresent,\n addGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { sortObjectKeys } from '../../utils/object';\nimport tsProjectGenerator, { getTsLibDetails } from '../lib/generator';\nimport tsMcpServerGenerator from '../mcp-server/generator';\nimport type { TsNxPluginGeneratorSchema } from './schema';\nimport { configureTsProjectAsNxPlugin } from './utils';\n\nexport const TS_NX_PLUGIN_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport const tsNxPluginGenerator = async (\n tree: Tree,\n options: TsNxPluginGeneratorSchema,\n): Promise<GeneratorCallback> => {\n // Generate a TypeScript project as the base\n const { fullyQualifiedName, dir } = getTsLibDetails(tree, options);\n await tsProjectGenerator(tree, {\n ...options,\n preferInstallDependencies: false,\n });\n\n // Configure the typescript project as an Nx Plugin\n configureTsProjectAsNxPlugin(tree, fullyQualifiedName);\n\n // Add a \"package\" target which creates a package which can be published to NPM\n const project = readProjectConfigurationUnqualified(tree, fullyQualifiedName);\n project.targets = {\n ...project.targets,\n package: {\n executor: '@nx/js:tsc',\n outputs: ['{options.outputPath}'],\n options: {\n outputPath: `dist/{projectRoot}/package`,\n main: `{projectRoot}/src/index.ts`,\n tsConfig: `{projectRoot}/tsconfig.lib.json`,\n assets: [\n `{projectRoot}/*.md`,\n `{projectRoot}/LICENSE*`,\n `{projectRoot}/NOTICE`,\n {\n input: './{projectRoot}/src',\n glob: '**/!(*.ts)',\n output: './src',\n },\n {\n input: './{projectRoot}/src',\n glob: '**/*.d.ts',\n output: './src',\n },\n {\n input: './{projectRoot}',\n glob: 'generators.json',\n output: '.',\n },\n {\n input: './{projectRoot}',\n glob: 'executors.json',\n output: '.',\n },\n ],\n },\n },\n build: {\n ...project.targets?.build,\n },\n };\n // Append the package dependency without moving an existing entry, so re-runs\n // do not reorder the build dependencies.\n addDependencyToTargetIfNotPresent(project, 'build', 'package');\n // Sort targets so their order is stable regardless of insertion order.\n project.targets = sortObjectKeys(project.targets);\n updateProjectConfiguration(tree, fullyQualifiedName, project);\n\n // Add an MCP Server\n await tsMcpServerGenerator(tree, {\n project: fullyQualifiedName,\n infra: 'none',\n iac: 'cdk', // not used\n preferInstallDependencies: false,\n });\n\n const mcpPath = joinPathFragments(project.sourceRoot, 'mcp-server');\n const mcpServerPath = joinPathFragments(mcpPath, 'server.ts');\n\n // Remove the sample server and tools\n tree.delete(mcpServerPath);\n tree.delete(joinPathFragments(mcpPath, 'tools', 'add.ts'));\n tree.delete(joinPathFragments(mcpPath, 'resources', 'sample-guidance.ts'));\n\n // Add generator MCP server\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'mcp-server'),\n mcpPath,\n {\n name: fullyQualifiedName,\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n addGeneratorMetadata(tree, project.name, TS_NX_PLUGIN_GENERATOR_INFO);\n\n await addGeneratorMetricsIfApplicable(tree, [TS_NX_PLUGIN_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsNxPluginGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","addDependencyToTargetIfNotPresent","addGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","sortObjectKeys","tsProjectGenerator","getTsLibDetails","tsMcpServerGenerator","configureTsProjectAsNxPlugin","TS_NX_PLUGIN_GENERATOR_INFO","filename","tsNxPluginGenerator","tree","options","fullyQualifiedName","dir","preferInstallDependencies","project","targets","package","executor","outputs","outputPath","main","tsConfig","assets","input","glob","output","build","infra","iac","mcpPath","sourceRoot","mcpServerPath","delete","dirname","name","overwriteStrategy","KeepExisting","languages"],"mappings":"AAAA;;;CAGC,GACD,SAEEA,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,EAGjBC,0BAA0B,QACrB,aAAa;AACpB,SAASC,oBAAoB,QAAQ,wBAAqB;AAC1D,SAASC,mBAAmB,QAAQ,yBAAsB;AAC1D,SAASC,+BAA+B,QAAQ,yBAAsB;AACtE,SACEC,iCAAiC,EACjCC,oBAAoB,EACpBC,gBAAgB,EAEhBC,mCAAmC,QAC9B,oBAAiB;AACxB,SAASC,cAAc,QAAQ,wBAAqB;AACpD,OAAOC,sBAAsBC,eAAe,QAAQ,sBAAmB;AACvE,OAAOC,0BAA0B,6BAA0B;AAE3D,SAASC,4BAA4B,QAAQ,aAAU;AAEvD,OAAO,MAAMC,8BAA+CP,iBAC1D,YAAYQ,QAAQ,EACpB;AAEF,OAAO,MAAMC,sBAAsB,OACjCC,MACAC;IAEA,4CAA4C;IAC5C,MAAM,EAAEC,kBAAkB,EAAEC,GAAG,EAAE,GAAGT,gBAAgBM,MAAMC;IAC1D,MAAMR,mBAAmBO,MAAM;QAC7B,GAAGC,OAAO;QACVG,2BAA2B;IAC7B;IAEA,mDAAmD;IACnDR,6BAA6BI,MAAME;IAEnC,+EAA+E;IAC/E,MAAMG,UAAUd,oCAAoCS,MAAME;IAC1DG,QAAQC,OAAO,GAAG;QAChB,GAAGD,QAAQC,OAAO;QAClBC,SAAS;YACPC,UAAU;YACVC,SAAS;gBAAC;aAAuB;YACjCR,SAAS;gBACPS,YAAY,CAAC,0BAA0B,CAAC;gBACxCC,MAAM,CAAC,0BAA0B,CAAC;gBAClCC,UAAU,CAAC,+BAA+B,CAAC;gBAC3CC,QAAQ;oBACN,CAAC,kBAAkB,CAAC;oBACpB,CAAC,sBAAsB,CAAC;oBACxB,CAAC,oBAAoB,CAAC;oBACtB;wBACEC,OAAO;wBACPC,MAAM;wBACNC,QAAQ;oBACV;oBACA;wBACEF,OAAO;wBACPC,MAAM;wBACNC,QAAQ;oBACV;oBACA;wBACEF,OAAO;wBACPC,MAAM;wBACNC,QAAQ;oBACV;oBACA;wBACEF,OAAO;wBACPC,MAAM;wBACNC,QAAQ;oBACV;iBACD;YACH;QACF;QACAC,OAAO;YACL,GAAGZ,QAAQC,OAAO,EAAEW,KAAK;QAC3B;IACF;IACA,6EAA6E;IAC7E,yCAAyC;IACzC7B,kCAAkCiB,SAAS,SAAS;IACpD,uEAAuE;IACvEA,QAAQC,OAAO,GAAGd,eAAea,QAAQC,OAAO;IAChDtB,2BAA2BgB,MAAME,oBAAoBG;IAErD,oBAAoB;IACpB,MAAMV,qBAAqBK,MAAM;QAC/BK,SAASH;QACTgB,OAAO;QACPC,KAAK;QACLf,2BAA2B;IAC7B;IAEA,MAAMgB,UAAUtC,kBAAkBuB,QAAQgB,UAAU,EAAE;IACtD,MAAMC,gBAAgBxC,kBAAkBsC,SAAS;IAEjD,qCAAqC;IACrCpB,KAAKuB,MAAM,CAACD;IACZtB,KAAKuB,MAAM,CAACzC,kBAAkBsC,SAAS,SAAS;IAChDpB,KAAKuB,MAAM,CAACzC,kBAAkBsC,SAAS,aAAa;IAEpD,2BAA2B;IAC3BvC,cACEmB,MACAlB,kBAAkB,YAAY0C,OAAO,EAAE,SAAS,eAChDJ,SACA;QACEK,MAAMvB;IACR,GACA;QAAEwB,mBAAmB3C,kBAAkB4C,YAAY;IAAC;IAGtDtC,qBAAqBW,MAAMK,QAAQoB,IAAI,EAAE5B;IAEzC,MAAMV,gCAAgCa,MAAM;QAACH;KAA4B;IAEzE,MAAMZ,qBAAqBe;IAC3B,OAAO,IACLd,oBAAoBc,MAAMC,QAAQG,yBAAyB,EAAE;YAC3DwB,WAAW;gBAAC;aAAa;QAC3B;AACJ,EAAE;AAEF,eAAe7B,oBAAoB"}
|
|
@@ -26,6 +26,11 @@
|
|
|
26
26
|
"type": "string",
|
|
27
27
|
"description": "The sub directory the lib is placed in. By default this is the library name.",
|
|
28
28
|
"x-prompt": "Which sub directory do you want to create the library in? (By default this is the library name)"
|
|
29
|
+
},
|
|
30
|
+
"preferInstallDependencies": {
|
|
31
|
+
"type": "boolean",
|
|
32
|
+
"description": "Whether to prefer installing dependencies after the generator runs. Set to false to defer installing when batching multiple generators (an install still runs if needed so subsequent generators can compute the Nx project graph); install once at the end.",
|
|
33
|
+
"default": true
|
|
29
34
|
}
|
|
30
35
|
},
|
|
31
36
|
"required": ["name"]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/rdb/agent-connection/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { ComponentMetadata } from '../../../utils/nx';\n\n/**\n * TypeScript types for options defined in schema.json\n */\nexport interface TsRdbAgentConnectionGeneratorSchema {\n sourceProject: string;\n targetProject: string;\n sourceComponent?: ComponentMetadata;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAGD;;CAEC,GACD,
|
|
1
|
+
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/rdb/agent-connection/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { ComponentMetadata } from '../../../utils/nx';\n\n/**\n * TypeScript types for options defined in schema.json\n */\nexport interface TsRdbAgentConnectionGeneratorSchema {\n sourceProject: string;\n targetProject: string;\n sourceComponent?: ComponentMetadata;\n preferInstallDependencies?: boolean;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAGD;;CAEC,GACD,WAKC"}
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
"sourceComponent": {
|
|
17
17
|
"type": "string",
|
|
18
18
|
"description": "The agent component name"
|
|
19
|
+
},
|
|
20
|
+
"preferInstallDependencies": {
|
|
21
|
+
"type": "boolean",
|
|
22
|
+
"description": "Whether to prefer installing dependencies after the generator runs. Set to false to defer installing when batching multiple generators (an install still runs if needed so subsequent generators can compute the Nx project graph); install once at the end.",
|
|
23
|
+
"default": true
|
|
19
24
|
}
|
|
20
25
|
},
|
|
21
26
|
"required": ["sourceProject", "targetProject"]
|
package/src/ts/rdb/generator.js
CHANGED
|
@@ -2,13 +2,14 @@
|
|
|
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,
|
|
5
|
+
import { addDependenciesToPackageJson, generateFiles, joinPathFragments, readProjectConfiguration, updateJson, updateProjectConfiguration } from "@nx/devkit";
|
|
6
6
|
import { addTypeScriptBundleTarget } from "../../utils/bundle/bundle.js";
|
|
7
7
|
import { resolveContainers } from "../../utils/containers.js";
|
|
8
8
|
import { formatFilesInSubtree } from "../../utils/format.js";
|
|
9
9
|
import { FsCommands } from "../../utils/fs.js";
|
|
10
10
|
import { updateGitIgnore } from "../../utils/git.js";
|
|
11
11
|
import { resolveIac } from "../../utils/iac.js";
|
|
12
|
+
import { installDependencies } from "../../utils/install.js";
|
|
12
13
|
import { addGeneratorMetricsIfApplicable } from "../../utils/metrics.js";
|
|
13
14
|
import { kebabCase, snakeCase, toClassName } from "../../utils/names.js";
|
|
14
15
|
import { getNpmScope, toScopeAlias } from "../../utils/npm-scope.js";
|
|
@@ -44,7 +45,8 @@ export const tsRdbGenerator = async (tree, options)=>{
|
|
|
44
45
|
if (!projectExists) {
|
|
45
46
|
await tsProjectGenerator(tree, {
|
|
46
47
|
name: options.name,
|
|
47
|
-
directory: options.directory
|
|
48
|
+
directory: options.directory,
|
|
49
|
+
preferInstallDependencies: false
|
|
48
50
|
});
|
|
49
51
|
}
|
|
50
52
|
updateJson(tree, joinPathFragments(dir, 'tsconfig.lib.json'), (tsConfig)=>({
|
|
@@ -241,9 +243,11 @@ export const tsRdbGenerator = async (tree, options)=>{
|
|
|
241
243
|
TS_RDB_GENERATOR_INFO
|
|
242
244
|
]);
|
|
243
245
|
await formatFilesInSubtree(tree);
|
|
244
|
-
return ()=>{
|
|
245
|
-
|
|
246
|
-
|
|
246
|
+
return ()=>installDependencies(tree, options.preferInstallDependencies, {
|
|
247
|
+
languages: [
|
|
248
|
+
'typescript'
|
|
249
|
+
]
|
|
250
|
+
});
|
|
247
251
|
};
|
|
248
252
|
export default tsRdbGenerator;
|
|
249
253
|
|