@aws/nx-plugin 1.0.0-rc.53 → 1.0.0-rc.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/migrations.json +50 -0
- package/package.json +1 -1
- package/src/agentcore-gateway/gateway-connection/generator.js +3 -1
- package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -1
- package/src/agentcore-gateway/generator.d.ts +49 -1
- package/src/agentcore-gateway/generator.js +55 -22
- package/src/agentcore-gateway/generator.js.map +1 -1
- package/src/agentcore-gateway/mcp-connection/generator.js +3 -1
- package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +2 -0
- package/src/infra/app/generator.d.ts +43 -0
- package/src/infra/app/generator.js +47 -18
- package/src/infra/app/generator.js.map +1 -1
- package/src/init/generator.d.ts +13 -0
- package/src/init/generator.js +14 -3
- package/src/init/generator.js.map +1 -1
- package/src/migrations/latest/backfill-generator-metadata/migration.d.ts +96 -0
- package/src/migrations/latest/backfill-generator-metadata/migration.js +670 -0
- package/src/migrations/latest/backfill-generator-metadata/migration.js.map +1 -0
- package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.d.ts +6 -0
- package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.js +94 -0
- package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
- package/src/preset/generator.d.ts +13 -0
- package/src/preset/generator.js +12 -3
- package/src/preset/generator.js.map +1 -1
- package/src/py/agent/a2a-connection/generator.d.ts +24 -0
- package/src/py/agent/a2a-connection/generator.js +49 -20
- package/src/py/agent/a2a-connection/generator.js.map +1 -1
- package/src/py/agent/gateway-connection/generator.d.ts +23 -0
- package/src/py/agent/gateway-connection/generator.js +45 -11
- package/src/py/agent/gateway-connection/generator.js.map +1 -1
- package/src/py/agent/generator.d.ts +146 -1
- package/src/py/agent/generator.js +173 -76
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/generator.d.ts +23 -0
- package/src/py/agent/mcp-connection/generator.js +45 -11
- package/src/py/agent/mcp-connection/generator.js.map +1 -1
- package/src/py/agent/react-connection/generator.d.ts +146 -0
- package/src/py/agent/react-connection/generator.js +27 -4
- package/src/py/agent/react-connection/generator.js.map +1 -1
- package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/py/dynamodb/agent-connection/generator.js +7 -1
- package/src/py/dynamodb/agent-connection/generator.js.map +1 -1
- package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/py/dynamodb/fast-api-connection/generator.js +3 -1
- package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -1
- package/src/py/dynamodb/generator.d.ts +29 -0
- package/src/py/dynamodb/generator.js +32 -12
- package/src/py/dynamodb/generator.js.map +1 -1
- package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/py/dynamodb/mcp-server-connection/generator.js +7 -1
- package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -1
- package/src/py/fast-api/generator.d.ts +63 -0
- package/src/py/fast-api/generator.js +58 -23
- package/src/py/fast-api/generator.js.map +1 -1
- package/src/py/fast-api/react/generator.d.ts +16 -1
- package/src/py/fast-api/react/generator.js +15 -3
- package/src/py/fast-api/react/generator.js.map +1 -1
- package/src/py/lambda-function/generator.d.ts +21 -0
- package/src/py/lambda-function/generator.js +29 -10
- package/src/py/lambda-function/generator.js.map +1 -1
- package/src/py/mcp-server/generator.d.ts +60 -0
- package/src/py/mcp-server/generator.js +62 -25
- package/src/py/mcp-server/generator.js.map +1 -1
- package/src/py/project/generator.d.ts +13 -0
- package/src/py/project/generator.js +29 -10
- package/src/py/project/generator.js.map +1 -1
- package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +19 -0
- package/src/py/rdb/agent-connection/generator.js +7 -1
- package/src/py/rdb/agent-connection/generator.js.map +1 -1
- package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +7 -0
- package/src/py/rdb/fast-api-connection/generator.js +3 -1
- package/src/py/rdb/fast-api-connection/generator.js.map +1 -1
- package/src/py/rdb/generator.d.ts +89 -0
- package/src/py/rdb/generator.js +88 -40
- package/src/py/rdb/generator.js.map +1 -1
- package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/py/rdb/mcp-server-connection/generator.js +7 -1
- package/src/py/rdb/mcp-server-connection/generator.js.map +1 -1
- package/src/smithy/project/generator.d.ts +7 -0
- package/src/smithy/project/generator.js +8 -2
- package/src/smithy/project/generator.js.map +1 -1
- package/src/smithy/react-connection/generator.d.ts +15 -0
- package/src/smithy/react-connection/generator.js +17 -3
- package/src/smithy/react-connection/generator.js.map +1 -1
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +1 -0
- package/src/smithy/ts/api/generator.d.ts +79 -0
- package/src/smithy/ts/api/generator.js +77 -33
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/terraform/project/generator.d.ts +50 -0
- package/src/terraform/project/generator.js +63 -17
- package/src/terraform/project/generator.js.map +1 -1
- package/src/trpc/backend/generator.d.ts +84 -0
- package/src/trpc/backend/generator.js +98 -38
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/trpc/react/generator.d.ts +37 -0
- package/src/trpc/react/generator.js +63 -26
- package/src/trpc/react/generator.js.map +1 -1
- package/src/ts/agent/a2a-connection/generator.d.ts +46 -0
- package/src/ts/agent/a2a-connection/generator.js +53 -16
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/gateway-connection/generator.d.ts +37 -0
- package/src/ts/agent/gateway-connection/generator.js +41 -14
- package/src/ts/agent/gateway-connection/generator.js.map +1 -1
- package/src/ts/agent/generator.d.ts +162 -0
- package/src/ts/agent/generator.js +166 -75
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/generator.d.ts +37 -0
- package/src/ts/agent/mcp-connection/generator.js +41 -14
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/generator.d.ts +186 -0
- package/src/ts/agent/react-connection/generator.js +70 -21
- package/src/ts/agent/react-connection/generator.js.map +1 -1
- package/src/ts/astro-docs/generator.d.ts +38 -0
- package/src/ts/astro-docs/generator.js +58 -19
- package/src/ts/astro-docs/generator.js.map +1 -1
- package/src/ts/dcr-proxy/generator.d.ts +24 -0
- package/src/ts/dcr-proxy/generator.js +31 -14
- package/src/ts/dcr-proxy/generator.js.map +1 -1
- package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/ts/dynamodb/agent-connection/generator.js +7 -1
- package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/generator.d.ts +41 -0
- package/src/ts/dynamodb/generator.js +47 -20
- package/src/ts/dynamodb/generator.js.map +1 -1
- package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/ts/dynamodb/mcp-server-connection/generator.js +7 -1
- package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/ts/dynamodb/smithy-connection/generator.js +3 -1
- package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/ts/dynamodb/trpc-connection/generator.js +3 -1
- package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
- package/src/ts/lambda-function/generator.d.ts +38 -0
- package/src/ts/lambda-function/generator.js +49 -20
- package/src/ts/lambda-function/generator.js.map +1 -1
- package/src/ts/lib/generator.d.ts +7 -0
- package/src/ts/lib/generator.js +8 -1
- package/src/ts/lib/generator.js.map +1 -1
- package/src/ts/lib/ts-project-utils.d.ts +3 -1
- package/src/ts/lib/ts-project-utils.js +3 -2
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/lib/vitest.d.ts +10 -1
- package/src/ts/lib/vitest.js +14 -2
- package/src/ts/lib/vitest.js.map +1 -1
- package/src/ts/mcp-server/generator.d.ts +71 -0
- package/src/ts/mcp-server/generator.js +73 -36
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/nx-generator/generator.d.ts +3 -0
- package/src/ts/nx-generator/generator.js +8 -2
- package/src/ts/nx-generator/generator.js.map +1 -1
- package/src/ts/nx-migration/generator.d.ts +3 -0
- package/src/ts/nx-migration/generator.js +8 -2
- package/src/ts/nx-migration/generator.js.map +1 -1
- package/src/ts/nx-plugin/generator.d.ts +3 -0
- package/src/ts/nx-plugin/generator.js +8 -2
- package/src/ts/nx-plugin/generator.js.map +1 -1
- package/src/ts/nx-plugin/utils.d.ts +7 -2
- package/src/ts/nx-plugin/utils.js +10 -4
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +10 -0
- package/src/ts/rdb/agent-connection/generator.js +8 -1
- package/src/ts/rdb/agent-connection/generator.js.map +1 -1
- package/src/ts/rdb/generator.d.ts +101 -0
- package/src/ts/rdb/generator.js +93 -41
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +10 -0
- package/src/ts/rdb/mcp-server-connection/generator.js +8 -1
- package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/ts/rdb/smithy-connection/generator.js +4 -1
- package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
- package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/ts/rdb/trpc-connection/generator.js +3 -1
- package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
- package/src/ts/react-website/agui/generator.d.ts +86 -0
- package/src/ts/react-website/agui/generator.js +63 -28
- package/src/ts/react-website/agui/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +20 -2
- package/src/ts/react-website/app/generator.d.ts +136 -1
- package/src/ts/react-website/app/generator.js +109 -40
- package/src/ts/react-website/app/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/generator.d.ts +19 -0
- package/src/ts/react-website/cognito-auth/generator.js +21 -9
- package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
- package/src/utils/add-dependencies.d.ts +38 -0
- package/src/utils/add-dependencies.js +83 -0
- package/src/utils/add-dependencies.js.map +1 -0
- package/src/utils/agent-connection/agent-connection.d.ts +27 -6
- package/src/utils/agent-connection/agent-connection.js +47 -18
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +19 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.js +26 -6
- package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
- package/src/utils/api-constructs/api-constructs.d.ts +21 -2
- package/src/utils/api-constructs/api-constructs.js +26 -5
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/bundle/bundle.d.ts +6 -1
- package/src/utils/bundle/bundle.js +8 -2
- package/src/utils/bundle/bundle.js.map +1 -1
- package/src/utils/commands.d.ts +5 -4
- package/src/utils/commands.js +2 -6
- package/src/utils/commands.js.map +1 -1
- package/src/utils/connection/open-api/react.d.ts +18 -1
- package/src/utils/connection/open-api/react.js +27 -3
- package/src/utils/connection/open-api/react.js.map +1 -1
- package/src/utils/declared-dependencies.d.ts +140 -0
- package/src/utils/declared-dependencies.js +64 -0
- package/src/utils/declared-dependencies.js.map +1 -0
- package/src/utils/docker.d.ts +10 -1
- package/src/utils/docker.js +7 -3
- package/src/utils/docker.js.map +1 -1
- package/src/utils/fs.d.ts +15 -4
- package/src/utils/fs.js +26 -13
- package/src/utils/fs.js.map +1 -1
- package/src/utils/init.d.ts +14 -1
- package/src/utils/init.js +25 -7
- package/src/utils/init.js.map +1 -1
- package/src/utils/migration-versions.d.ts +15 -1
- package/src/utils/migration-versions.js +53 -7
- package/src/utils/migration-versions.js.map +1 -1
- package/src/utils/nx.d.ts +18 -0
- package/src/utils/nx.js +4 -0
- package/src/utils/nx.js.map +1 -1
- package/src/utils/py.d.ts +3 -2
- package/src/utils/py.js +10 -10
- package/src/utils/py.js.map +1 -1
- package/src/utils/shared-constructs-constants.d.ts +39 -4
- package/src/utils/shared-constructs-constants.js +29 -0
- package/src/utils/shared-constructs-constants.js.map +1 -1
- package/src/utils/shared-constructs.d.ts +4 -1
- package/src/utils/shared-constructs.js +5 -4
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-dynamodb-scripts.d.ts +8 -1
- package/src/utils/shared-dynamodb-scripts.js +11 -3
- package/src/utils/shared-dynamodb-scripts.js.map +1 -1
- package/src/utils/shared-infra-scripts.d.ts +16 -1
- package/src/utils/shared-infra-scripts.js +18 -3
- package/src/utils/shared-infra-scripts.js.map +1 -1
- package/src/utils/shared-rdb-scripts.d.ts +12 -1
- package/src/utils/shared-rdb-scripts.js +17 -3
- package/src/utils/shared-rdb-scripts.js.map +1 -1
- package/src/utils/shared-shadcn.d.ts +26 -1
- package/src/utils/shared-shadcn.js +31 -14
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/version-upgrade-migration/migration.d.ts +14 -0
- package/src/utils/version-upgrade-migration/migration.js +16 -0
- package/src/utils/version-upgrade-migration/migration.js.map +1 -0
- package/src/utils/version-upgrade-migration/nx-package-updates.d.ts +35 -0
- package/src/utils/version-upgrade-migration/nx-package-updates.js +42 -0
- package/src/utils/version-upgrade-migration/nx-package-updates.js.map +1 -0
- package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +50 -0
- package/src/utils/version-upgrade-migration/owned-dependencies.js +98 -0
- package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -0
- package/src/utils/version-upgrade-migration/register.d.ts +18 -0
- package/src/utils/version-upgrade-migration/register.js +33 -0
- package/src/utils/version-upgrade-migration/register.js.map +1 -0
- package/src/utils/version-upgrade-migration/sync-metrics-version.d.ts +13 -0
- package/src/utils/version-upgrade-migration/sync-metrics-version.js +33 -0
- package/src/utils/version-upgrade-migration/sync-metrics-version.js.map +1 -0
- package/src/utils/version-upgrade-migration/sync-vended-versions.d.ts +10 -0
- package/src/utils/version-upgrade-migration/sync-vended-versions.js +504 -0
- package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -0
- package/src/utils/version-upgrade-migration/vended-upgrade.d.ts +14 -0
- package/src/utils/version-upgrade-migration/vended-upgrade.js +40 -0
- package/src/utils/version-upgrade-migration/vended-upgrade.js.map +1 -0
- package/src/utils/versions.d.ts +25 -5
- package/src/utils/versions.js +46 -4
- package/src/utils/versions.js.map +1 -1
- package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +4 -0
|
@@ -0,0 +1,670 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/ import { relative } from "node:path";
|
|
5
|
+
import { getProjects, joinPathFragments, readJson, updateProjectConfiguration } from "@nx/devkit";
|
|
6
|
+
import { AGENTCORE_GATEWAY_GATEWAY_CONNECTION_GENERATOR_INFO } from "../../../agentcore-gateway/gateway-connection/generator.js";
|
|
7
|
+
import { AGENTCORE_GATEWAY_GENERATOR_INFO } from "../../../agentcore-gateway/generator.js";
|
|
8
|
+
import { AGENTCORE_GATEWAY_MCP_CONNECTION_GENERATOR_INFO } from "../../../agentcore-gateway/mcp-connection/generator.js";
|
|
9
|
+
import { PY_AGENT_A2A_CONNECTION_GENERATOR_INFO } from "../../../py/agent/a2a-connection/generator.js";
|
|
10
|
+
import { PY_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO } from "../../../py/agent/gateway-connection/generator.js";
|
|
11
|
+
import { PY_AGENT_GENERATOR_INFO } from "../../../py/agent/generator.js";
|
|
12
|
+
import { PY_AGENT_MCP_CONNECTION_GENERATOR_INFO } from "../../../py/agent/mcp-connection/generator.js";
|
|
13
|
+
import { PY_AGENT_REACT_CONNECTION_GENERATOR_INFO } from "../../../py/agent/react-connection/generator.js";
|
|
14
|
+
import { PY_DYNAMODB_AGENT_CONNECTION_GENERATOR_INFO } from "../../../py/dynamodb/agent-connection/generator.js";
|
|
15
|
+
import { PY_DYNAMODB_FAST_API_CONNECTION_GENERATOR_INFO } from "../../../py/dynamodb/fast-api-connection/generator.js";
|
|
16
|
+
import { PY_DYNAMODB_GENERATOR_INFO } from "../../../py/dynamodb/generator.js";
|
|
17
|
+
import { PY_DYNAMODB_MCP_SERVER_CONNECTION_GENERATOR_INFO } from "../../../py/dynamodb/mcp-server-connection/generator.js";
|
|
18
|
+
import { FAST_API_GENERATOR_INFO } from "../../../py/fast-api/generator.js";
|
|
19
|
+
import { FAST_API_REACT_GENERATOR_INFO } from "../../../py/fast-api/react/generator.js";
|
|
20
|
+
import { LAMBDA_FUNCTION_GENERATOR_INFO as PY_LAMBDA_FUNCTION_GENERATOR_INFO } from "../../../py/lambda-function/generator.js";
|
|
21
|
+
import { PY_MCP_SERVER_GENERATOR_INFO } from "../../../py/mcp-server/generator.js";
|
|
22
|
+
import { PY_RDB_AGENT_CONNECTION_GENERATOR_INFO } from "../../../py/rdb/agent-connection/generator.js";
|
|
23
|
+
import { PY_RDB_FAST_API_CONNECTION_GENERATOR_INFO } from "../../../py/rdb/fast-api-connection/generator.js";
|
|
24
|
+
import { PY_RDB_GENERATOR_INFO } from "../../../py/rdb/generator.js";
|
|
25
|
+
import { PY_RDB_MCP_SERVER_CONNECTION_GENERATOR_INFO } from "../../../py/rdb/mcp-server-connection/generator.js";
|
|
26
|
+
import { SMITHY_PROJECT_GENERATOR_INFO } from "../../../smithy/project/generator.js";
|
|
27
|
+
import { SMITHY_REACT_CONNECTION_GENERATOR_INFO } from "../../../smithy/react-connection/generator.js";
|
|
28
|
+
import { TS_SMITHY_API_GENERATOR_INFO } from "../../../smithy/ts/api/generator.js";
|
|
29
|
+
import { TRPC_BACKEND_GENERATOR_INFO } from "../../../trpc/backend/generator.js";
|
|
30
|
+
import { TRPC_REACT_GENERATOR_INFO } from "../../../trpc/react/generator.js";
|
|
31
|
+
import { TS_AGENT_A2A_CONNECTION_GENERATOR_INFO } from "../../../ts/agent/a2a-connection/generator.js";
|
|
32
|
+
import { TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO } from "../../../ts/agent/gateway-connection/generator.js";
|
|
33
|
+
import { TS_AGENT_GENERATOR_INFO } from "../../../ts/agent/generator.js";
|
|
34
|
+
import { TS_AGENT_MCP_CONNECTION_GENERATOR_INFO } from "../../../ts/agent/mcp-connection/generator.js";
|
|
35
|
+
import { TS_AGENT_REACT_CONNECTION_GENERATOR_INFO } from "../../../ts/agent/react-connection/generator.js";
|
|
36
|
+
import { TS_DCR_PROXY_GENERATOR_INFO } from "../../../ts/dcr-proxy/generator.js";
|
|
37
|
+
import { TS_DYNAMODB_AGENT_CONNECTION_GENERATOR_INFO } from "../../../ts/dynamodb/agent-connection/generator.js";
|
|
38
|
+
import { TS_DYNAMODB_GENERATOR_INFO } from "../../../ts/dynamodb/generator.js";
|
|
39
|
+
import { TS_DYNAMODB_MCP_SERVER_CONNECTION_GENERATOR_INFO } from "../../../ts/dynamodb/mcp-server-connection/generator.js";
|
|
40
|
+
import { TS_DYNAMODB_SMITHY_CONNECTION_GENERATOR_INFO } from "../../../ts/dynamodb/smithy-connection/generator.js";
|
|
41
|
+
import { TS_DYNAMODB_TRPC_CONNECTION_GENERATOR_INFO } from "../../../ts/dynamodb/trpc-connection/generator.js";
|
|
42
|
+
import { TS_LAMBDA_FUNCTION_GENERATOR_INFO } from "../../../ts/lambda-function/generator.js";
|
|
43
|
+
import { TS_LIB_GENERATOR_INFO } from "../../../ts/lib/generator.js";
|
|
44
|
+
import { TS_MCP_SERVER_GENERATOR_INFO } from "../../../ts/mcp-server/generator.js";
|
|
45
|
+
import { TS_RDB_AGENT_CONNECTION_GENERATOR_INFO } from "../../../ts/rdb/agent-connection/generator.js";
|
|
46
|
+
import { TS_RDB_GENERATOR_INFO } from "../../../ts/rdb/generator.js";
|
|
47
|
+
import { TS_RDB_MCP_SERVER_CONNECTION_GENERATOR_INFO } from "../../../ts/rdb/mcp-server-connection/generator.js";
|
|
48
|
+
import { TS_RDB_SMITHY_CONNECTION_GENERATOR_INFO } from "../../../ts/rdb/smithy-connection/generator.js";
|
|
49
|
+
import { TS_RDB_TRPC_CONNECTION_GENERATOR_INFO } from "../../../ts/rdb/trpc-connection/generator.js";
|
|
50
|
+
import { REACT_WEBSITE_APP_GENERATOR_INFO } from "../../../ts/react-website/app/generator.js";
|
|
51
|
+
import { COGNITO_AUTH_GENERATOR_INFO } from "../../../ts/react-website/cognito-auth/generator.js";
|
|
52
|
+
import { PY_CLIENT_NAMING, resolveAgentFramework } from "../../../utils/agent-connection/agent-connection.js";
|
|
53
|
+
import { matchGritQL } from "../../../utils/ast.js";
|
|
54
|
+
import { DCR_PROXY_HANDLERS } from "../../../utils/dcr-proxy-constructs/dcr-proxy-constructs.js";
|
|
55
|
+
import { formatFilesInSubtree } from "../../../utils/format.js";
|
|
56
|
+
import { camelCase, kebabCase, pascalCase, toClassName, toSnakeCase } from "../../../utils/names.js";
|
|
57
|
+
import { PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, SHARED_TERRAFORM_DIR } from "../../../utils/shared-constructs-constants.js";
|
|
58
|
+
/** The shared project each provider generates its infrastructure into. */ const SHARED_INFRA_ROOT = {
|
|
59
|
+
cdk: joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR),
|
|
60
|
+
terraform: joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR)
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* The provider each project's infrastructure was generated with.
|
|
64
|
+
*
|
|
65
|
+
* Every infra helper registers `<project>:build` on the build target of the shared
|
|
66
|
+
* project belonging to the provider it ran with, so those lists name exactly the
|
|
67
|
+
* projects that received infrastructure, and which provider gave it to them.
|
|
68
|
+
*
|
|
69
|
+
* Read per project rather than per workspace because `iac` is a per-generator
|
|
70
|
+
* option: one workspace can hold both providers.
|
|
71
|
+
*/ const infrastructureProviders = (tree)=>{
|
|
72
|
+
const providers = new Map();
|
|
73
|
+
for (const iac of [
|
|
74
|
+
'cdk',
|
|
75
|
+
'terraform'
|
|
76
|
+
]){
|
|
77
|
+
const configPath = joinPathFragments(SHARED_INFRA_ROOT[iac], 'project.json');
|
|
78
|
+
if (!tree.exists(configPath)) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const config = readJson(tree, configPath);
|
|
82
|
+
for (const dependency of config.targets?.build?.dependsOn ?? []){
|
|
83
|
+
// Registered as `<project>:build`, either as that string or as an object.
|
|
84
|
+
const name = typeof dependency === 'string' ? dependency.split(':')[0] : dependency.projects;
|
|
85
|
+
if (name) {
|
|
86
|
+
providers.set(name, iac);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return providers;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Where a component's infrastructure lives under a provider's shared project,
|
|
94
|
+
* keyed by the generator that created it.
|
|
95
|
+
*
|
|
96
|
+
* These components belong to a project rather than being one, and each records its
|
|
97
|
+
* own `iac` — a project can hold a CDK-deployed agent alongside one generated with
|
|
98
|
+
* `infra: 'none'` — so the project-level build dependency isn't precise enough.
|
|
99
|
+
* Each component gets its own entry under the app directory below, which is.
|
|
100
|
+
*
|
|
101
|
+
* `paths` lists the candidates because the two providers don't lay out every
|
|
102
|
+
* component the same way: a Lambda function is one CDK file but a Terraform
|
|
103
|
+
* directory.
|
|
104
|
+
*/ const COMPONENT_INFRA = {
|
|
105
|
+
...Object.fromEntries([
|
|
106
|
+
[
|
|
107
|
+
TS_AGENT_GENERATOR_INFO.id,
|
|
108
|
+
'agents'
|
|
109
|
+
],
|
|
110
|
+
[
|
|
111
|
+
PY_AGENT_GENERATOR_INFO.id,
|
|
112
|
+
'agents'
|
|
113
|
+
],
|
|
114
|
+
[
|
|
115
|
+
TS_MCP_SERVER_GENERATOR_INFO.id,
|
|
116
|
+
'mcp-servers'
|
|
117
|
+
],
|
|
118
|
+
[
|
|
119
|
+
PY_MCP_SERVER_GENERATOR_INFO.id,
|
|
120
|
+
'mcp-servers'
|
|
121
|
+
]
|
|
122
|
+
].map(([id, appDirectory])=>[
|
|
123
|
+
id,
|
|
124
|
+
{
|
|
125
|
+
appDirectory,
|
|
126
|
+
paths: (name)=>[
|
|
127
|
+
name
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
])),
|
|
131
|
+
...Object.fromEntries([
|
|
132
|
+
TS_LAMBDA_FUNCTION_GENERATOR_INFO.id,
|
|
133
|
+
PY_LAMBDA_FUNCTION_GENERATOR_INFO.id
|
|
134
|
+
].map((id)=>[
|
|
135
|
+
id,
|
|
136
|
+
{
|
|
137
|
+
appDirectory: 'lambda-functions',
|
|
138
|
+
// CDK vends `<name>.ts`; Terraform vends `<name>/<name>.tf`.
|
|
139
|
+
paths: (name)=>[
|
|
140
|
+
`${name}.ts`,
|
|
141
|
+
name
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
]))
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* The provider a component's own infrastructure was generated with, from the entry
|
|
148
|
+
* the infra helper created for it under one provider's shared project.
|
|
149
|
+
*
|
|
150
|
+
* That entry is named after the component, which for these generators is the name
|
|
151
|
+
* the component records.
|
|
152
|
+
*/ const componentInfrastructureProvider = (tree, component)=>{
|
|
153
|
+
const layout = component.generator ? COMPONENT_INFRA[component.generator] : undefined;
|
|
154
|
+
if (!layout || !component.name) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
for (const iac of [
|
|
158
|
+
'cdk',
|
|
159
|
+
'terraform'
|
|
160
|
+
]){
|
|
161
|
+
for (const entry of layout.paths(component.name)){
|
|
162
|
+
if (tree.exists(joinPathFragments(SHARED_INFRA_ROOT[iac], 'src', 'app', layout.appDirectory, entry))) {
|
|
163
|
+
return iac;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* `ts#dcr-proxy` creates its handler project through `ts#project`, which recorded
|
|
171
|
+
* its own id — so an existing workspace attributes the project to `ts#project` and
|
|
172
|
+
* owns none of the proxy's dependencies. The six vended handlers are its
|
|
173
|
+
* signature; a project carrying every one of them is a DCR proxy.
|
|
174
|
+
*/ const isDcrProxyProject = (tree, projectRoot)=>DCR_PROXY_HANDLERS.every((handler)=>tree.exists(joinPathFragments(projectRoot, 'src', 'handlers', `${handler}.ts`)));
|
|
175
|
+
/**
|
|
176
|
+
* What a Smithy project models, from the `smithy-build.json` each kind gets: a
|
|
177
|
+
* service builds an OpenAPI spec and a TypeScript SSDK from its model, so it has
|
|
178
|
+
* the plugins to do so, while a shape library only shares shapes and has none.
|
|
179
|
+
*/ const smithyProjectType = (tree, projectRoot)=>{
|
|
180
|
+
const buildPath = joinPathFragments(projectRoot, 'smithy-build.json');
|
|
181
|
+
if (!tree.exists(buildPath)) {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
const build = readJson(tree, buildPath);
|
|
185
|
+
return build.plugins && Object.keys(build.plugins).length > 0 ? 'service' : 'shapes';
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* The Smithy namespace a project's shapes are declared in, read from the model
|
|
189
|
+
* rather than derived from the npm scope: the generator takes it as an option, so
|
|
190
|
+
* a project may not carry the default.
|
|
191
|
+
*/ const smithyNamespace = (tree, project)=>{
|
|
192
|
+
const modelPath = joinPathFragments(project.sourceRoot ?? joinPathFragments(project.root, 'src'), 'main.smithy');
|
|
193
|
+
if (!tree.exists(modelPath)) {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
// Smithy is not a language GritQL parses, and `namespace <x>` is a single
|
|
197
|
+
// declaration on its own line rather than a structure worth an AST for.
|
|
198
|
+
return /^namespace\s+(\S+)\s*$/m.exec(tree.read(modelPath, 'utf-8') ?? '')?.at(1);
|
|
199
|
+
};
|
|
200
|
+
/**
|
|
201
|
+
* Whether a website's vite config registers the given plugin, which is how
|
|
202
|
+
* `tailwind` and `tanstackRouter` show up in a generated workspace: both default
|
|
203
|
+
* to true, so only the config proves one was turned off.
|
|
204
|
+
*
|
|
205
|
+
* Matched on the AST rather than the text so the plugin's arguments, and any
|
|
206
|
+
* reformatting since, don't hide it.
|
|
207
|
+
*/ const usesVitePlugin = (tree, projectRoot, plugin)=>matchGritQL(tree, joinPathFragments(projectRoot, 'vite.config.mts'), `\`${plugin}\``);
|
|
208
|
+
/** `<sourceComponent>-<target>`, the name the database connections record. */ const sourceQualifiedName = (target, fallback)=>(context)=>`${context.source.name ?? fallback}-${target(context)}`;
|
|
209
|
+
/** The database name as each language's connections case it. */ const camelDatabase = ({ target })=>camelCase(target.databaseName);
|
|
210
|
+
const targetProjectName = ({ target })=>target.projectName;
|
|
211
|
+
/** Prefix a GritQL pattern to match against Python rather than TypeScript. */ const py = (pattern)=>`language python\n${pattern}`;
|
|
212
|
+
/**
|
|
213
|
+
* Whether the source project's `dev` chain runs the target project's, which every
|
|
214
|
+
* connection wires up so `nx run <source>:dev` starts what it depends on.
|
|
215
|
+
*
|
|
216
|
+
* This is the only trace left by the connections that vend no code (the DynamoDB
|
|
217
|
+
* ones grant IAM in the target's infrastructure instead). It identifies the pair
|
|
218
|
+
* because the dependency names the target project.
|
|
219
|
+
*/ const dependsOnTargetDev = (project, target, devTarget)=>(project.targets?.[devTarget]?.dependsOn ?? []).some((dependency)=>{
|
|
220
|
+
const projects = typeof dependency === 'string' ? dependency.split(':')[0] : dependency.projects;
|
|
221
|
+
return Array.isArray(projects) ? projects.includes(target.projectName) : projects === target.projectName;
|
|
222
|
+
});
|
|
223
|
+
/**
|
|
224
|
+
* An agent-to-service connection, which imports a Layer-2 client named after the
|
|
225
|
+
* target into the source agent's entry point.
|
|
226
|
+
*/ const agentClientConnection = (id, language, targetGenerators)=>({
|
|
227
|
+
id,
|
|
228
|
+
sourceGenerator: language === 'ts' ? TS_AGENT_GENERATOR_INFO.id : PY_AGENT_GENERATOR_INFO.id,
|
|
229
|
+
targetGenerators,
|
|
230
|
+
evidence: async ({ tree, project, source, target })=>{
|
|
231
|
+
const path = joinPathFragments(source.path ?? 'src', language === 'ts' ? 'agent.ts' : 'agent.py');
|
|
232
|
+
// The Python client's class suffix follows the source agent's framework, read
|
|
233
|
+
// from the same naming table the generators use.
|
|
234
|
+
const client = language === 'ts' ? `${target.className}ClientStrands` : `${target.className}Client${PY_CLIENT_NAMING[resolveAgentFramework(source.framework)].clientClassSuffix}`;
|
|
235
|
+
const pattern = `\`${client}\``;
|
|
236
|
+
return await matchGritQL(tree, joinPathFragments(project.root, path), language === 'ts' ? pattern : py(pattern)) ? path : undefined;
|
|
237
|
+
},
|
|
238
|
+
...language === 'py' ? {
|
|
239
|
+
metadata: ({ source })=>({
|
|
240
|
+
framework: resolveAgentFramework(source.framework)
|
|
241
|
+
})
|
|
242
|
+
} : {}
|
|
243
|
+
});
|
|
244
|
+
/**
|
|
245
|
+
* A database-to-component connection, which imports the database's client getter
|
|
246
|
+
* into the component it connects to and aliases it after the database.
|
|
247
|
+
*/ const rdbConnection = (id, options)=>({
|
|
248
|
+
id,
|
|
249
|
+
sourceGenerator: options.sourceGenerator,
|
|
250
|
+
targetGenerators: [
|
|
251
|
+
options.targetGenerator
|
|
252
|
+
],
|
|
253
|
+
recordedName: options.recordedName,
|
|
254
|
+
evidence: async ({ tree, project, source, target })=>{
|
|
255
|
+
const path = options.entryPoint(source);
|
|
256
|
+
return await matchGritQL(tree, joinPathFragments(project.root, path), // Aliased to `get<Database>` on import, so the alias names the target.
|
|
257
|
+
`\`get${pascalCase(target.databaseName)}\``) ? path : undefined;
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
/**
|
|
261
|
+
* A connection that vends no code, recognised by the dev chain it wires from the
|
|
262
|
+
* source component to the target project.
|
|
263
|
+
*/ const devChainConnection = (id, options)=>({
|
|
264
|
+
id,
|
|
265
|
+
sourceGenerator: options.sourceGenerator,
|
|
266
|
+
targetGenerators: [
|
|
267
|
+
options.targetGenerator
|
|
268
|
+
],
|
|
269
|
+
recordedName: options.recordedName,
|
|
270
|
+
evidence: ({ project, source, target })=>dependsOnTargetDev(project, target, options.devTarget?.(source) ?? 'dev') ? target.projectRoot : undefined
|
|
271
|
+
});
|
|
272
|
+
/** The `<component>-dev` target a component generator authors for itself. */ const componentDevTarget = (source)=>`${source.name ?? 'agent'}-dev`;
|
|
273
|
+
/** The tRPC-over-HTTP integration patterns, whose extra client packages differ. */ const REST_API_INFRA = new Set([
|
|
274
|
+
'rest-lambda',
|
|
275
|
+
'serverlessapigatewayrestapi'
|
|
276
|
+
]);
|
|
277
|
+
/**
|
|
278
|
+
* A website connection, recognised by the provider component it vends for its
|
|
279
|
+
* target under the website's source root.
|
|
280
|
+
*/ const websiteConnection = (id, options)=>({
|
|
281
|
+
id,
|
|
282
|
+
sourceGenerator: REACT_WEBSITE_APP_GENERATOR_INFO.id,
|
|
283
|
+
targetGenerators: [
|
|
284
|
+
options.targetGenerator
|
|
285
|
+
],
|
|
286
|
+
evidence: ({ tree, project, target })=>{
|
|
287
|
+
const sourceRoot = project.sourceRoot ?? joinPathFragments(project.root, 'src');
|
|
288
|
+
const provider = joinPathFragments('components', options.provider(target.className));
|
|
289
|
+
return tree.exists(joinPathFragments(sourceRoot, `${provider}.tsx`)) ? joinPathFragments(relative(project.root, sourceRoot), provider) : undefined;
|
|
290
|
+
},
|
|
291
|
+
metadata: options.metadata
|
|
292
|
+
});
|
|
293
|
+
/**
|
|
294
|
+
* Every connection generator, and the trace each leaves on the project it connects
|
|
295
|
+
* from.
|
|
296
|
+
*
|
|
297
|
+
* Grouped by how a run is recognised, since that follows what the generator does
|
|
298
|
+
* rather than which pair it joins.
|
|
299
|
+
*/ export const CONNECTION_KINDS = [
|
|
300
|
+
// Agent to service: imports a Layer-2 client named after the target.
|
|
301
|
+
agentClientConnection(TS_AGENT_MCP_CONNECTION_GENERATOR_INFO.id, 'ts', [
|
|
302
|
+
TS_MCP_SERVER_GENERATOR_INFO.id,
|
|
303
|
+
PY_MCP_SERVER_GENERATOR_INFO.id
|
|
304
|
+
]),
|
|
305
|
+
agentClientConnection(TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO.id, 'ts', [
|
|
306
|
+
AGENTCORE_GATEWAY_GENERATOR_INFO.id
|
|
307
|
+
]),
|
|
308
|
+
agentClientConnection(TS_AGENT_A2A_CONNECTION_GENERATOR_INFO.id, 'ts', [
|
|
309
|
+
TS_AGENT_GENERATOR_INFO.id,
|
|
310
|
+
PY_AGENT_GENERATOR_INFO.id
|
|
311
|
+
]),
|
|
312
|
+
agentClientConnection(PY_AGENT_MCP_CONNECTION_GENERATOR_INFO.id, 'py', [
|
|
313
|
+
TS_MCP_SERVER_GENERATOR_INFO.id,
|
|
314
|
+
PY_MCP_SERVER_GENERATOR_INFO.id
|
|
315
|
+
]),
|
|
316
|
+
agentClientConnection(PY_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO.id, 'py', [
|
|
317
|
+
AGENTCORE_GATEWAY_GENERATOR_INFO.id
|
|
318
|
+
]),
|
|
319
|
+
agentClientConnection(PY_AGENT_A2A_CONNECTION_GENERATOR_INFO.id, 'py', [
|
|
320
|
+
TS_AGENT_GENERATOR_INFO.id,
|
|
321
|
+
PY_AGENT_GENERATOR_INFO.id
|
|
322
|
+
]),
|
|
323
|
+
// Website to backend: vends a provider component named after the target.
|
|
324
|
+
websiteConnection(TRPC_REACT_GENERATOR_INFO.id, {
|
|
325
|
+
targetGenerator: TRPC_BACKEND_GENERATOR_INFO.id,
|
|
326
|
+
provider: (className)=>`${className}ClientProvider`,
|
|
327
|
+
metadata: ({ target })=>({
|
|
328
|
+
auth: String(target.project.auth ?? 'iam').toLowerCase(),
|
|
329
|
+
isRestApi: REST_API_INFRA.has(String(target.project.infra ?? target.project.computeType ?? '').toLowerCase())
|
|
330
|
+
})
|
|
331
|
+
}),
|
|
332
|
+
// Both OpenAPI react clients vend the same provider shape.
|
|
333
|
+
websiteConnection(SMITHY_REACT_CONNECTION_GENERATOR_INFO.id, {
|
|
334
|
+
targetGenerator: TS_SMITHY_API_GENERATOR_INFO.id,
|
|
335
|
+
provider: (className)=>`${className}Provider`
|
|
336
|
+
}),
|
|
337
|
+
websiteConnection(FAST_API_REACT_GENERATOR_INFO.id, {
|
|
338
|
+
targetGenerator: FAST_API_GENERATOR_INFO.id,
|
|
339
|
+
provider: (className)=>`${className}Provider`
|
|
340
|
+
}),
|
|
341
|
+
websiteConnection(TS_AGENT_REACT_CONNECTION_GENERATOR_INFO.id, {
|
|
342
|
+
targetGenerator: TS_AGENT_GENERATOR_INFO.id,
|
|
343
|
+
provider: (className)=>`${className}AgentClientProvider`
|
|
344
|
+
}),
|
|
345
|
+
websiteConnection(PY_AGENT_REACT_CONNECTION_GENERATOR_INFO.id, {
|
|
346
|
+
targetGenerator: PY_AGENT_GENERATOR_INFO.id,
|
|
347
|
+
provider: (className)=>`${className}AgentClientProvider`
|
|
348
|
+
}),
|
|
349
|
+
// Database to component: imports the database's `get<Database>` client getter.
|
|
350
|
+
rdbConnection(TS_RDB_AGENT_CONNECTION_GENERATOR_INFO.id, {
|
|
351
|
+
sourceGenerator: TS_AGENT_GENERATOR_INFO.id,
|
|
352
|
+
targetGenerator: TS_RDB_GENERATOR_INFO.id,
|
|
353
|
+
entryPoint: (source)=>joinPathFragments('src', source.name ?? 'agent', 'agent.ts'),
|
|
354
|
+
recordedName: sourceQualifiedName(camelDatabase, 'agent')
|
|
355
|
+
}),
|
|
356
|
+
rdbConnection(TS_RDB_MCP_SERVER_CONNECTION_GENERATOR_INFO.id, {
|
|
357
|
+
sourceGenerator: TS_MCP_SERVER_GENERATOR_INFO.id,
|
|
358
|
+
targetGenerator: TS_RDB_GENERATOR_INFO.id,
|
|
359
|
+
entryPoint: (source)=>joinPathFragments('src', source.name ?? 'mcp-server', 'server.ts'),
|
|
360
|
+
recordedName: sourceQualifiedName(camelDatabase, 'mcp-server')
|
|
361
|
+
}),
|
|
362
|
+
rdbConnection(TS_RDB_SMITHY_CONNECTION_GENERATOR_INFO.id, {
|
|
363
|
+
targetGenerator: TS_RDB_GENERATOR_INFO.id,
|
|
364
|
+
entryPoint: ()=>joinPathFragments('src', 'context.ts'),
|
|
365
|
+
recordedName: camelDatabase
|
|
366
|
+
}),
|
|
367
|
+
// Vends a middleware or dependency module named after the database.
|
|
368
|
+
{
|
|
369
|
+
id: TS_RDB_TRPC_CONNECTION_GENERATOR_INFO.id,
|
|
370
|
+
targetGenerators: [
|
|
371
|
+
TS_RDB_GENERATOR_INFO.id
|
|
372
|
+
],
|
|
373
|
+
recordedName: camelDatabase,
|
|
374
|
+
evidence: ({ tree, project, target })=>{
|
|
375
|
+
const path = joinPathFragments('src', 'middleware', `${kebabCase(target.databaseName)}.ts`);
|
|
376
|
+
return tree.exists(joinPathFragments(project.root, path)) ? path : undefined;
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
id: PY_RDB_FAST_API_CONNECTION_GENERATOR_INFO.id,
|
|
381
|
+
targetGenerators: [
|
|
382
|
+
PY_RDB_GENERATOR_INFO.id
|
|
383
|
+
],
|
|
384
|
+
recordedName: ({ target })=>toSnakeCase(target.databaseName),
|
|
385
|
+
evidence: ({ tree, project, target })=>{
|
|
386
|
+
const dependencies = pythonDependenciesDir(tree, project);
|
|
387
|
+
if (!dependencies) {
|
|
388
|
+
return undefined;
|
|
389
|
+
}
|
|
390
|
+
const path = joinPathFragments(dependencies, `${toSnakeCase(target.databaseName)}.py`);
|
|
391
|
+
return tree.exists(joinPathFragments(project.root, path)) ? path : undefined;
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
// Python database connections vend no code into the source, so the dev chain and
|
|
395
|
+
// the workspace dependency on the database project are the trace.
|
|
396
|
+
devChainConnection(PY_RDB_AGENT_CONNECTION_GENERATOR_INFO.id, {
|
|
397
|
+
recordedName: sourceQualifiedName(targetProjectName, 'agent'),
|
|
398
|
+
sourceGenerator: PY_AGENT_GENERATOR_INFO.id,
|
|
399
|
+
targetGenerator: PY_RDB_GENERATOR_INFO.id,
|
|
400
|
+
devTarget: componentDevTarget
|
|
401
|
+
}),
|
|
402
|
+
devChainConnection(PY_RDB_MCP_SERVER_CONNECTION_GENERATOR_INFO.id, {
|
|
403
|
+
recordedName: sourceQualifiedName(targetProjectName, 'mcp-server'),
|
|
404
|
+
sourceGenerator: PY_MCP_SERVER_GENERATOR_INFO.id,
|
|
405
|
+
targetGenerator: PY_RDB_GENERATOR_INFO.id,
|
|
406
|
+
devTarget: (source)=>`${source.name ?? 'mcp-server'}-dev`
|
|
407
|
+
}),
|
|
408
|
+
// DynamoDB connections grant IAM in the target's infrastructure rather than
|
|
409
|
+
// vending code, so the dev chain is all they leave behind.
|
|
410
|
+
devChainConnection(TS_DYNAMODB_AGENT_CONNECTION_GENERATOR_INFO.id, {
|
|
411
|
+
recordedName: sourceQualifiedName(targetProjectName, 'agent'),
|
|
412
|
+
sourceGenerator: TS_AGENT_GENERATOR_INFO.id,
|
|
413
|
+
targetGenerator: TS_DYNAMODB_GENERATOR_INFO.id,
|
|
414
|
+
devTarget: componentDevTarget
|
|
415
|
+
}),
|
|
416
|
+
devChainConnection(TS_DYNAMODB_MCP_SERVER_CONNECTION_GENERATOR_INFO.id, {
|
|
417
|
+
recordedName: sourceQualifiedName(targetProjectName, 'mcp-server'),
|
|
418
|
+
sourceGenerator: TS_MCP_SERVER_GENERATOR_INFO.id,
|
|
419
|
+
targetGenerator: TS_DYNAMODB_GENERATOR_INFO.id,
|
|
420
|
+
devTarget: (source)=>`${source.name ?? 'mcp-server'}-dev`
|
|
421
|
+
}),
|
|
422
|
+
devChainConnection(TS_DYNAMODB_TRPC_CONNECTION_GENERATOR_INFO.id, {
|
|
423
|
+
recordedName: targetProjectName,
|
|
424
|
+
targetGenerator: TS_DYNAMODB_GENERATOR_INFO.id
|
|
425
|
+
}),
|
|
426
|
+
devChainConnection(TS_DYNAMODB_SMITHY_CONNECTION_GENERATOR_INFO.id, {
|
|
427
|
+
recordedName: targetProjectName,
|
|
428
|
+
targetGenerator: TS_DYNAMODB_GENERATOR_INFO.id
|
|
429
|
+
}),
|
|
430
|
+
devChainConnection(PY_DYNAMODB_AGENT_CONNECTION_GENERATOR_INFO.id, {
|
|
431
|
+
recordedName: sourceQualifiedName(targetProjectName, 'agent'),
|
|
432
|
+
sourceGenerator: PY_AGENT_GENERATOR_INFO.id,
|
|
433
|
+
targetGenerator: PY_DYNAMODB_GENERATOR_INFO.id,
|
|
434
|
+
devTarget: componentDevTarget
|
|
435
|
+
}),
|
|
436
|
+
devChainConnection(PY_DYNAMODB_MCP_SERVER_CONNECTION_GENERATOR_INFO.id, {
|
|
437
|
+
recordedName: sourceQualifiedName(targetProjectName, 'mcp-server'),
|
|
438
|
+
sourceGenerator: PY_MCP_SERVER_GENERATOR_INFO.id,
|
|
439
|
+
targetGenerator: PY_DYNAMODB_GENERATOR_INFO.id,
|
|
440
|
+
devTarget: (source)=>`${source.name ?? 'mcp-server'}-dev`
|
|
441
|
+
}),
|
|
442
|
+
devChainConnection(PY_DYNAMODB_FAST_API_CONNECTION_GENERATOR_INFO.id, {
|
|
443
|
+
recordedName: targetProjectName,
|
|
444
|
+
targetGenerator: PY_DYNAMODB_GENERATOR_INFO.id
|
|
445
|
+
}),
|
|
446
|
+
// Gateway to upstream: registers the upstream in the gateway's local-dev.ts,
|
|
447
|
+
// under the kebab-cased class name the deployed gateway also uses.
|
|
448
|
+
...[
|
|
449
|
+
[
|
|
450
|
+
AGENTCORE_GATEWAY_MCP_CONNECTION_GENERATOR_INFO.id,
|
|
451
|
+
[
|
|
452
|
+
TS_MCP_SERVER_GENERATOR_INFO.id,
|
|
453
|
+
PY_MCP_SERVER_GENERATOR_INFO.id
|
|
454
|
+
]
|
|
455
|
+
],
|
|
456
|
+
[
|
|
457
|
+
AGENTCORE_GATEWAY_GATEWAY_CONNECTION_GENERATOR_INFO.id,
|
|
458
|
+
[
|
|
459
|
+
AGENTCORE_GATEWAY_GENERATOR_INFO.id
|
|
460
|
+
]
|
|
461
|
+
]
|
|
462
|
+
].map(([id, targetGenerators])=>({
|
|
463
|
+
id,
|
|
464
|
+
sourceGenerator: AGENTCORE_GATEWAY_GENERATOR_INFO.id,
|
|
465
|
+
targetGenerators,
|
|
466
|
+
recordedName: ({ target })=>kebabCase(target.className),
|
|
467
|
+
evidence: async ({ tree, project, target })=>await matchGritQL(tree, joinPathFragments(project.root, 'local-dev.ts'), `\`'${kebabCase(target.className)}'\``) ? target.projectRoot : undefined
|
|
468
|
+
}))
|
|
469
|
+
];
|
|
470
|
+
/**
|
|
471
|
+
* Every connection target in the workspace, keyed by the generator that created it.
|
|
472
|
+
*
|
|
473
|
+
* A target may be a component of a project (an agent, an MCP server) or a whole
|
|
474
|
+
* project (a gateway, an API, a database), so both are indexed. Agents, MCP servers
|
|
475
|
+
* and gateways record the class name directly as `rc`; an API's is derived from its
|
|
476
|
+
* `apiName` the same way its connection generator derives it.
|
|
477
|
+
*/ const connectionTargets = (tree)=>{
|
|
478
|
+
const targets = new Map();
|
|
479
|
+
for (const [projectName, project] of getProjects(tree)){
|
|
480
|
+
const metadata = project.metadata;
|
|
481
|
+
if (!metadata) {
|
|
482
|
+
continue;
|
|
483
|
+
}
|
|
484
|
+
const shared = {
|
|
485
|
+
// The database generators split on `/` for TypeScript and `.` for Python.
|
|
486
|
+
databaseName: projectName.split(/[/.]/).pop() ?? projectName,
|
|
487
|
+
projectName,
|
|
488
|
+
projectRoot: project.root,
|
|
489
|
+
project: metadata
|
|
490
|
+
};
|
|
491
|
+
const add = (generator, className)=>{
|
|
492
|
+
if (!generator || typeof className !== 'string') {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
targets.set(generator, [
|
|
496
|
+
...targets.get(generator) ?? [],
|
|
497
|
+
{
|
|
498
|
+
...shared,
|
|
499
|
+
className
|
|
500
|
+
}
|
|
501
|
+
]);
|
|
502
|
+
};
|
|
503
|
+
add(metadata.generator, metadata.rc ?? (typeof metadata.apiName === 'string' ? toClassName(metadata.apiName) : shared.databaseName));
|
|
504
|
+
for (const component of metadata.components ?? []){
|
|
505
|
+
add(component.generator, component.rc);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return targets;
|
|
509
|
+
};
|
|
510
|
+
/**
|
|
511
|
+
* The Python module a FastAPI project's sources live in, found by looking for the
|
|
512
|
+
* `dependencies` directory the connections vend into.
|
|
513
|
+
*
|
|
514
|
+
* The module name mixes the workspace's npm scope with the API name, so it is read
|
|
515
|
+
* off the tree rather than derived — a scope that has since changed would make a
|
|
516
|
+
* derived name wrong.
|
|
517
|
+
*/ const pythonDependenciesDir = (tree, project)=>tree.children(project.root).map((child)=>joinPathFragments(child, 'dependencies')).find((dir)=>tree.exists(joinPathFragments(project.root, dir)));
|
|
518
|
+
export default async function migration(tree) {
|
|
519
|
+
const providers = infrastructureProviders(tree);
|
|
520
|
+
const targets = connectionTargets(tree);
|
|
521
|
+
for (const [projectName, project] of getProjects(tree)){
|
|
522
|
+
const metadata = project.metadata;
|
|
523
|
+
if (!metadata?.generator && !metadata?.components?.length) {
|
|
524
|
+
continue;
|
|
525
|
+
}
|
|
526
|
+
const next = {
|
|
527
|
+
...metadata
|
|
528
|
+
};
|
|
529
|
+
let changed = false;
|
|
530
|
+
if (next.generator === TS_LIB_GENERATOR_INFO.id && isDcrProxyProject(tree, project.root)) {
|
|
531
|
+
next.generator = TS_DCR_PROXY_GENERATOR_INFO.id;
|
|
532
|
+
changed = true;
|
|
533
|
+
}
|
|
534
|
+
// The provider this project's infrastructure was generated with. Left unset
|
|
535
|
+
// where the project received none, matching what the generators record: the
|
|
536
|
+
// sync reads a set `iac` as "infrastructure was generated", and would claim
|
|
537
|
+
// the helpers' packages for a project that never got them.
|
|
538
|
+
const iac = providers.get(projectName);
|
|
539
|
+
if (iac && next.iac === undefined) {
|
|
540
|
+
next.iac = iac;
|
|
541
|
+
changed = true;
|
|
542
|
+
}
|
|
543
|
+
// What a Smithy project models, and the namespace it declares. Neither gates a
|
|
544
|
+
// dependency yet, but recording them now means a future gate reads them in a
|
|
545
|
+
// workspace this backfill has already run on.
|
|
546
|
+
if (next.generator === SMITHY_PROJECT_GENERATOR_INFO.id) {
|
|
547
|
+
if (next.smithyType === undefined) {
|
|
548
|
+
const smithyType = smithyProjectType(tree, project.root);
|
|
549
|
+
if (smithyType) {
|
|
550
|
+
next.smithyType = smithyType;
|
|
551
|
+
changed = true;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
if (next.namespace === undefined) {
|
|
555
|
+
const namespace = smithyNamespace(tree, project);
|
|
556
|
+
if (namespace) {
|
|
557
|
+
next.namespace = namespace;
|
|
558
|
+
changed = true;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
if (next.generator === REACT_WEBSITE_APP_GENERATOR_INFO.id) {
|
|
563
|
+
if (next.tailwind === undefined) {
|
|
564
|
+
next.tailwind = await usesVitePlugin(tree, project.root, 'tailwindcss');
|
|
565
|
+
changed = true;
|
|
566
|
+
}
|
|
567
|
+
if (next.tanstackRouter === undefined) {
|
|
568
|
+
next.tanstackRouter = await usesVitePlugin(tree, project.root, 'tanstackRouter');
|
|
569
|
+
changed = true;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
// The provider each of this project's components generated with. Recorded on
|
|
573
|
+
// the component because that is where these generators record it — an agent
|
|
574
|
+
// and an MCP server each choose their own provider.
|
|
575
|
+
//
|
|
576
|
+
// Left absent rather than set to an empty list where the project has no
|
|
577
|
+
// components, so a project this backfill has nothing to add to is untouched.
|
|
578
|
+
next.components = next.components?.map((component)=>{
|
|
579
|
+
if (component.iac !== undefined) {
|
|
580
|
+
return component;
|
|
581
|
+
}
|
|
582
|
+
const componentIac = // The auth component vends no infrastructure of its own; it always
|
|
583
|
+
// generates the shared constructs, so it took the project's provider.
|
|
584
|
+
component.generator === COGNITO_AUTH_GENERATOR_INFO.id ? iac : componentInfrastructureProvider(tree, component);
|
|
585
|
+
if (!componentIac) {
|
|
586
|
+
return component;
|
|
587
|
+
}
|
|
588
|
+
changed = true;
|
|
589
|
+
return {
|
|
590
|
+
...component,
|
|
591
|
+
iac: componentIac
|
|
592
|
+
};
|
|
593
|
+
});
|
|
594
|
+
// A connection already recorded is left as it is: re-recording it would
|
|
595
|
+
// duplicate the entry, and the sync counts entries.
|
|
596
|
+
const recorded = new Set((next.components ?? []).map((component)=>`${component.generator}:${component.name}`));
|
|
597
|
+
const record = (component)=>{
|
|
598
|
+
next.components = [
|
|
599
|
+
...next.components ?? [],
|
|
600
|
+
component
|
|
601
|
+
];
|
|
602
|
+
recorded.add(`${component.generator}:${component.name}`);
|
|
603
|
+
changed = true;
|
|
604
|
+
};
|
|
605
|
+
// The connections made from this project, each found by the trace its
|
|
606
|
+
// generator left for the exact pair it wired up.
|
|
607
|
+
for (const kind of CONNECTION_KINDS){
|
|
608
|
+
// A connection made from a component starts at each matching component. One
|
|
609
|
+
// made from the project as a whole — a website, a tRPC API — starts at the
|
|
610
|
+
// project's own metadata, which stands in for the source.
|
|
611
|
+
const componentSources = (next.components ?? []).filter((component)=>component.generator === kind.sourceGenerator);
|
|
612
|
+
const sources = componentSources.length ? componentSources : (kind.sourceGenerator === undefined || kind.sourceGenerator === next.generator) && next.generator ? [
|
|
613
|
+
{
|
|
614
|
+
...next,
|
|
615
|
+
generator: next.generator
|
|
616
|
+
}
|
|
617
|
+
] : [];
|
|
618
|
+
const candidates = kind.targetGenerators.flatMap((generator)=>targets.get(generator) ?? []);
|
|
619
|
+
for (const source of sources){
|
|
620
|
+
for (const target of candidates){
|
|
621
|
+
// A connection from a component to itself is not one any generator makes.
|
|
622
|
+
if (target.projectName === projectName && target.className === source.rc) {
|
|
623
|
+
continue;
|
|
624
|
+
}
|
|
625
|
+
const context = {
|
|
626
|
+
tree,
|
|
627
|
+
project,
|
|
628
|
+
source,
|
|
629
|
+
target
|
|
630
|
+
};
|
|
631
|
+
const name = kind.recordedName?.(context) ?? target.className;
|
|
632
|
+
if (recorded.has(`${kind.id}:${name}`)) {
|
|
633
|
+
continue;
|
|
634
|
+
}
|
|
635
|
+
const path = await kind.evidence(context);
|
|
636
|
+
if (path === undefined) {
|
|
637
|
+
continue;
|
|
638
|
+
}
|
|
639
|
+
record({
|
|
640
|
+
generator: kind.id,
|
|
641
|
+
path,
|
|
642
|
+
name,
|
|
643
|
+
...kind.sourceGenerator && source.path ? {
|
|
644
|
+
sourcePath: source.path
|
|
645
|
+
} : {},
|
|
646
|
+
...kind.metadata?.(context)
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
if (changed) {
|
|
652
|
+
// Keep metadata before targets so the serialized key order matches what the
|
|
653
|
+
// generators write, leaving this a pure metadata edit.
|
|
654
|
+
const { targets: projectTargets, ...rest } = project;
|
|
655
|
+
updateProjectConfiguration(tree, projectName, {
|
|
656
|
+
...rest,
|
|
657
|
+
metadata: next,
|
|
658
|
+
...projectTargets ? {
|
|
659
|
+
targets: projectTargets
|
|
660
|
+
} : {}
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
await formatFilesInSubtree(tree);
|
|
665
|
+
return {
|
|
666
|
+
nextSteps: []
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
//# sourceMappingURL=migration.js.map
|