@aws/nx-plugin 1.0.0-rc.85 → 1.0.0-rc.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/migrations.json +11 -1
  2. package/package.json +1 -1
  3. package/src/infra/app/__snapshots__/generator.spec.ts.snap +34 -8
  4. package/src/infra/app/files/app/README.md.template +14 -0
  5. package/src/infra/app/generator.js +15 -2
  6. package/src/infra/app/generator.js.map +1 -1
  7. package/src/mcp-server/tools/general-guidance.js +1 -1
  8. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  9. package/src/migrations/latest/add-destroy-sandbox-target/metadata.json +3 -0
  10. package/src/migrations/latest/add-destroy-sandbox-target/migration.d.ts +6 -0
  11. package/src/migrations/latest/add-destroy-sandbox-target/migration.js +150 -0
  12. package/src/migrations/latest/add-destroy-sandbox-target/migration.js.map +1 -0
  13. package/src/migrations/latest/terraform-rdb-proxy-iam-connect-grant/__snapshots__/migration.spec.ts.snap +23 -0
  14. package/src/migrations/latest/terraform-rdb-proxy-iam-connect-grant/metadata.json +3 -0
  15. package/src/migrations/latest/terraform-rdb-proxy-iam-connect-grant/migration.d.ts +6 -0
  16. package/src/migrations/latest/terraform-rdb-proxy-iam-connect-grant/migration.js +88 -0
  17. package/src/migrations/latest/terraform-rdb-proxy-iam-connect-grant/migration.js.map +1 -0
  18. package/src/open-api/ts-client/generator.js.map +1 -1
  19. package/src/open-api/ts-hooks/generator.spec.tsx +1 -1
  20. package/src/py/project/generator.js +5 -5
  21. package/src/py/project/generator.js.map +1 -1
  22. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +21 -9
  23. package/src/py/rdb/files/__name__/utils.py.template +17 -1
  24. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +8 -8
  25. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +16 -16
  26. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +3 -3
  27. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +3 -3
  28. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +132 -261
  29. package/src/ts/rdb/files/src/utils.ts.template +28 -1
  30. package/src/ts/react-website/cognito-auth/generator.js +1 -1
  31. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  32. package/src/ts/react-website/runtime-config/generator.js +1 -1
  33. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  34. package/src/utils/agent-core-constructs/agent-core-constructs.js +3 -2
  35. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  36. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +1 -1
  37. package/src/utils/api-constructs/api-constructs.js +7 -4
  38. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  39. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +4 -4
  40. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +4 -4
  41. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +1 -1
  42. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +4 -4
  43. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +4 -4
  44. package/src/utils/ast.d.ts +13 -0
  45. package/src/utils/ast.js +36 -0
  46. package/src/utils/ast.js.map +1 -1
  47. package/src/utils/bundle/bundle.js +5 -2
  48. package/src/utils/bundle/bundle.js.map +1 -1
  49. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js +5 -3
  50. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js.map +1 -1
  51. package/src/utils/dcr-proxy-constructs/files/cdk/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.ts.template +1 -1
  52. package/src/utils/dcr-proxy-constructs/files/terraform/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
  53. package/src/utils/files/common/scripts/src/infra/stage-credentials/cdk-command.ts.template +7 -3
  54. package/src/utils/function-constructs/function-constructs.js +3 -3
  55. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  56. package/src/utils/lambda-runtime-resolution.d.ts +74 -0
  57. package/src/utils/lambda-runtime-resolution.js +97 -0
  58. package/src/utils/lambda-runtime-resolution.js.map +1 -0
  59. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +3 -3
  60. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +10 -29
  61. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +28 -116
  62. package/src/utils/rdb-constructs/rdb-constructs.js +5 -3
  63. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  64. package/src/utils/version-upgrade-migration/sync-lambda-runtimes.d.ts +28 -0
  65. package/src/utils/version-upgrade-migration/sync-lambda-runtimes.js +148 -0
  66. package/src/utils/version-upgrade-migration/sync-lambda-runtimes.js.map +1 -0
  67. package/src/utils/version-upgrade-migration/sync-python-language-version.d.ts +31 -0
  68. package/src/utils/version-upgrade-migration/sync-python-language-version.js +110 -0
  69. package/src/utils/version-upgrade-migration/sync-python-language-version.js.map +1 -0
  70. package/src/utils/version-upgrade-migration/sync-vended-versions.js +36 -7
  71. package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -1
  72. package/src/utils/versions.d.ts +60 -0
  73. package/src/utils/versions.js +51 -0
  74. package/src/utils/versions.js.map +1 -1
@@ -21,6 +21,22 @@ export type DatabaseSecret = {
21
21
  port: number;
22
22
  };
23
23
 
24
+ /**
25
+ * Connection details for the admin credentials secret. RDS-managed secrets hold
26
+ * only `username` and `password`, so the host, port and database name are taken
27
+ * from the environment when the secret omits them.
28
+ */
29
+ type SecretConnectionOverrides = Partial<Omit<DatabaseSecret, 'username' | 'password'>>;
30
+
31
+ const connectionOverridesFromEnv = (): SecretConnectionOverrides => {
32
+ const { DATABASE_HOST, DATABASE_PORT, DATABASE_NAME } = process.env;
33
+ return {
34
+ ...(DATABASE_HOST ? { host: DATABASE_HOST } : {}),
35
+ ...(DATABASE_PORT ? { port: Number(DATABASE_PORT) } : {}),
36
+ ...(DATABASE_NAME ? { dbname: DATABASE_NAME } : {}),
37
+ };
38
+ };
39
+
24
40
  const databaseConfigPromises: Record<string, Promise<DatabaseConfig>> = {};
25
41
 
26
42
  const getSecretValue = async (secretArn: string): Promise<string> => {
@@ -47,7 +63,18 @@ export const getDatabaseSecret = async (): Promise<DatabaseSecret> => {
47
63
  );
48
64
  }
49
65
 
50
- return JSON.parse(await getSecretValue(secretArn)) as DatabaseSecret;
66
+ const secret = JSON.parse(await getSecretValue(secretArn)) as DatabaseSecret;
67
+ const secretWithConnection = { ...secret, ...connectionOverridesFromEnv() };
68
+
69
+ for (const key of ['host', 'port', 'dbname'] as const) {
70
+ if (secretWithConnection[key] == null) {
71
+ throw new Error(
72
+ `Database secret is missing ${key} and no override was provided in the environment.`,
73
+ );
74
+ }
75
+ }
76
+
77
+ return secretWithConnection;
51
78
  };
52
79
 
53
80
  const loadDatabaseConfig = async (
@@ -5,8 +5,8 @@
5
5
  import { readFileSync } from "fs";
6
6
  import { join } from "path";
7
7
  import { addTsDependencies } from "../../../utils/add-dependencies.js";
8
- import { addDestructuredImport, addSingleImport, applyGritQL } from "../../../utils/ast.js";
9
8
  import { addHookResultToRouterProviderContext } from "../../../utils/ast/website.js";
9
+ import { addDestructuredImport, addSingleImport, applyGritQL } from "../../../utils/ast.js";
10
10
  import { declareDependencies, ownedElsewhere } from "../../../utils/declared-dependencies.js";
11
11
  import { formatFilesInSubtree } from "../../../utils/format.js";
12
12
  import { resolveIac } from "../../../utils/iac.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/react-website/cognito-auth/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n} from '@nx/devkit';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport {\n addDestructuredImport,\n addSingleImport,\n applyGritQL,\n} from '../../../utils/ast.js';\nimport { addHookResultToRouterProviderContext } from '../../../utils/ast/website.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { resolveIac } from '../../../utils/iac.js';\nimport {\n addIdentityInfra,\n IDENTITY_CONSTRUCTS_PY_DEPENDENCIES,\n} from '../../../utils/identity-constructs/identity-constructs.js';\nimport { installDependencies } from '../../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { getNpmScope } from '../../../utils/npm-scope.js';\nimport {\n addComponentGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { toProjectRelativePath } from '../../../utils/paths.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../../utils/shared-constructs.js';\nimport { runtimeConfigGenerator } from '../runtime-config/generator.js';\nimport type { TsReactWebsiteAuthGeneratorSchema } from './schema';\nimport {\n addCloudscapeAuthMenu,\n addNoneAuthMenu,\n addShadcnAuthMenu,\n deriveCognitoDomainPrefix,\n} from './utils.js';\n\nconst readGritPattern = (name: string): string =>\n readFileSync(\n join(import.meta.dirname, 'grit', `${name}.grit`),\n 'utf-8',\n ).trim();\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [\n { name: 'oidc-client-ts' },\n { name: 'react-oidc-context' },\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ],\n py: ownedElsewhere(IDENTITY_CONSTRUCTS_PY_DEPENDENCIES),\n});\n\nexport const COGNITO_AUTH_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport async function tsReactWebsiteAuthGenerator(\n tree: Tree,\n options: TsReactWebsiteAuthGeneratorSchema,\n) {\n const projectConfig = readProjectConfigurationUnqualified(\n tree,\n options.project,\n );\n const srcRoot = projectConfig.sourceRoot;\n\n const cognitoDomain =\n options.cognitoDomain && options.cognitoDomain.length > 0\n ? options.cognitoDomain\n : deriveCognitoDomainPrefix(getNpmScope(tree), projectConfig.name!);\n\n await runtimeConfigGenerator(tree, {\n project: options.project,\n preferInstallDependencies: false,\n });\n\n const iac = await resolveIac(tree, options.iac);\n\n await sharedConstructsGenerator(\n tree,\n {\n iac,\n },\n DEPENDENCIES,\n );\n\n await addIdentityInfra(tree, {\n iac,\n allowSignup: options.allowSignup,\n cognitoDomain,\n });\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'app'),\n srcRoot,\n options,\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n addTsDependencies(tree, DEPENDENCIES, { projectRoot: projectConfig.root });\n\n const mainTsxPath = joinPathFragments(srcRoot, 'main.tsx');\n\n await addSingleImport(\n tree,\n mainTsxPath,\n 'CognitoAuth',\n './components/CognitoAuth',\n );\n\n await addHookResultToRouterProviderContext(tree, mainTsxPath, {\n hook: 'useAuth',\n module: 'react-oidc-context',\n contextProp: 'auth',\n });\n\n const projectConfiguration = readProjectConfigurationUnqualified(\n tree,\n options.project,\n );\n\n const ux = (\n (projectConfiguration.metadata as any)?.ux ?? 'shadcn'\n ).toLowerCase();\n\n await applyGritQL(tree, mainTsxPath, readGritPattern('cognito-auth-wrapper'));\n // Update App Layout\n const appLayoutTsxPath = joinPathFragments(\n srcRoot,\n 'components',\n 'AppLayout',\n 'index.tsx',\n );\n if (tree.exists(appLayoutTsxPath)) {\n await addDestructuredImport(\n tree,\n appLayoutTsxPath,\n ['useAuth'],\n 'react-oidc-context',\n );\n await applyGritQL(\n tree,\n appLayoutTsxPath,\n readGritPattern('app-layout-use-auth'),\n );\n // TODO: update utils if they exist by appending to the array\n // Add a top-level navigation menu that shows the signed-in user's profile and actions\n switch (ux) {\n case 'cloudscape':\n await addCloudscapeAuthMenu(tree, appLayoutTsxPath);\n break;\n case 'shadcn':\n await addShadcnAuthMenu(tree, appLayoutTsxPath);\n break;\n case 'none':\n await addNoneAuthMenu(tree, appLayoutTsxPath);\n break;\n default:\n throw new Error(\n `Top-level navigation menu to show the signed-in user for ux \"${ux}\" is not implemented.`,\n );\n }\n } else {\n console.info(\n `Skipping update to ${appLayoutTsxPath} as it does not exist.`,\n );\n }\n // End update App Layout\n\n addComponentGeneratorMetadata(\n tree,\n options.project,\n COGNITO_AUTH_GENERATOR_INFO,\n toProjectRelativePath(\n projectConfig,\n joinPathFragments(srcRoot, 'components', 'CognitoAuth'),\n ),\n undefined,\n { iac },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [COGNITO_AUTH_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n}\nexport default tsReactWebsiteAuthGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","readFileSync","join","addTsDependencies","addDestructuredImport","addSingleImport","applyGritQL","addHookResultToRouterProviderContext","declareDependencies","ownedElsewhere","formatFilesInSubtree","resolveIac","addIdentityInfra","IDENTITY_CONSTRUCTS_PY_DEPENDENCIES","installDependencies","addGeneratorMetricsIfApplicable","getNpmScope","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","runtimeConfigGenerator","addCloudscapeAuthMenu","addNoneAuthMenu","addShadcnAuthMenu","deriveCognitoDomainPrefix","readGritPattern","name","dirname","trim","DEPENDENCIES","ts","py","COGNITO_AUTH_GENERATOR_INFO","filename","tsReactWebsiteAuthGenerator","tree","options","projectConfig","project","srcRoot","sourceRoot","cognitoDomain","length","preferInstallDependencies","iac","allowSignup","overwriteStrategy","KeepExisting","projectRoot","root","mainTsxPath","hook","module","contextProp","projectConfiguration","ux","metadata","toLowerCase","appLayoutTsxPath","exists","Error","console","info","undefined","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/react-website/cognito-auth/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n} from '@nx/devkit';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport { addHookResultToRouterProviderContext } from '../../../utils/ast/website.js';\nimport {\n addDestructuredImport,\n addSingleImport,\n applyGritQL,\n} from '../../../utils/ast.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { resolveIac } from '../../../utils/iac.js';\nimport {\n addIdentityInfra,\n IDENTITY_CONSTRUCTS_PY_DEPENDENCIES,\n} from '../../../utils/identity-constructs/identity-constructs.js';\nimport { installDependencies } from '../../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { getNpmScope } from '../../../utils/npm-scope.js';\nimport {\n addComponentGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { toProjectRelativePath } from '../../../utils/paths.js';\nimport {\n SHARED_CONSTRUCTS_DEPENDENCIES,\n sharedConstructsGenerator,\n} from '../../../utils/shared-constructs.js';\nimport { runtimeConfigGenerator } from '../runtime-config/generator.js';\nimport type { TsReactWebsiteAuthGeneratorSchema } from './schema';\nimport {\n addCloudscapeAuthMenu,\n addNoneAuthMenu,\n addShadcnAuthMenu,\n deriveCognitoDomainPrefix,\n} from './utils.js';\n\nconst readGritPattern = (name: string): string =>\n readFileSync(\n join(import.meta.dirname, 'grit', `${name}.grit`),\n 'utf-8',\n ).trim();\n\nexport const DEPENDENCIES = declareDependencies()({\n ts: [\n { name: 'oidc-client-ts' },\n { name: 'react-oidc-context' },\n ...ownedElsewhere(SHARED_CONSTRUCTS_DEPENDENCIES),\n ],\n py: ownedElsewhere(IDENTITY_CONSTRUCTS_PY_DEPENDENCIES),\n});\n\nexport const COGNITO_AUTH_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport async function tsReactWebsiteAuthGenerator(\n tree: Tree,\n options: TsReactWebsiteAuthGeneratorSchema,\n) {\n const projectConfig = readProjectConfigurationUnqualified(\n tree,\n options.project,\n );\n const srcRoot = projectConfig.sourceRoot;\n\n const cognitoDomain =\n options.cognitoDomain && options.cognitoDomain.length > 0\n ? options.cognitoDomain\n : deriveCognitoDomainPrefix(getNpmScope(tree), projectConfig.name!);\n\n await runtimeConfigGenerator(tree, {\n project: options.project,\n preferInstallDependencies: false,\n });\n\n const iac = await resolveIac(tree, options.iac);\n\n await sharedConstructsGenerator(\n tree,\n {\n iac,\n },\n DEPENDENCIES,\n );\n\n await addIdentityInfra(tree, {\n iac,\n allowSignup: options.allowSignup,\n cognitoDomain,\n });\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'app'),\n srcRoot,\n options,\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n addTsDependencies(tree, DEPENDENCIES, { projectRoot: projectConfig.root });\n\n const mainTsxPath = joinPathFragments(srcRoot, 'main.tsx');\n\n await addSingleImport(\n tree,\n mainTsxPath,\n 'CognitoAuth',\n './components/CognitoAuth',\n );\n\n await addHookResultToRouterProviderContext(tree, mainTsxPath, {\n hook: 'useAuth',\n module: 'react-oidc-context',\n contextProp: 'auth',\n });\n\n const projectConfiguration = readProjectConfigurationUnqualified(\n tree,\n options.project,\n );\n\n const ux = (\n (projectConfiguration.metadata as any)?.ux ?? 'shadcn'\n ).toLowerCase();\n\n await applyGritQL(tree, mainTsxPath, readGritPattern('cognito-auth-wrapper'));\n // Update App Layout\n const appLayoutTsxPath = joinPathFragments(\n srcRoot,\n 'components',\n 'AppLayout',\n 'index.tsx',\n );\n if (tree.exists(appLayoutTsxPath)) {\n await addDestructuredImport(\n tree,\n appLayoutTsxPath,\n ['useAuth'],\n 'react-oidc-context',\n );\n await applyGritQL(\n tree,\n appLayoutTsxPath,\n readGritPattern('app-layout-use-auth'),\n );\n // TODO: update utils if they exist by appending to the array\n // Add a top-level navigation menu that shows the signed-in user's profile and actions\n switch (ux) {\n case 'cloudscape':\n await addCloudscapeAuthMenu(tree, appLayoutTsxPath);\n break;\n case 'shadcn':\n await addShadcnAuthMenu(tree, appLayoutTsxPath);\n break;\n case 'none':\n await addNoneAuthMenu(tree, appLayoutTsxPath);\n break;\n default:\n throw new Error(\n `Top-level navigation menu to show the signed-in user for ux \"${ux}\" is not implemented.`,\n );\n }\n } else {\n console.info(\n `Skipping update to ${appLayoutTsxPath} as it does not exist.`,\n );\n }\n // End update App Layout\n\n addComponentGeneratorMetadata(\n tree,\n options.project,\n COGNITO_AUTH_GENERATOR_INFO,\n toProjectRelativePath(\n projectConfig,\n joinPathFragments(srcRoot, 'components', 'CognitoAuth'),\n ),\n undefined,\n { iac },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [COGNITO_AUTH_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n}\nexport default tsReactWebsiteAuthGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","readFileSync","join","addTsDependencies","addHookResultToRouterProviderContext","addDestructuredImport","addSingleImport","applyGritQL","declareDependencies","ownedElsewhere","formatFilesInSubtree","resolveIac","addIdentityInfra","IDENTITY_CONSTRUCTS_PY_DEPENDENCIES","installDependencies","addGeneratorMetricsIfApplicable","getNpmScope","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","SHARED_CONSTRUCTS_DEPENDENCIES","sharedConstructsGenerator","runtimeConfigGenerator","addCloudscapeAuthMenu","addNoneAuthMenu","addShadcnAuthMenu","deriveCognitoDomainPrefix","readGritPattern","name","dirname","trim","DEPENDENCIES","ts","py","COGNITO_AUTH_GENERATOR_INFO","filename","tsReactWebsiteAuthGenerator","tree","options","projectConfig","project","srcRoot","sourceRoot","cognitoDomain","length","preferInstallDependencies","iac","allowSignup","overwriteStrategy","KeepExisting","projectRoot","root","mainTsxPath","hook","module","contextProp","projectConfiguration","ux","metadata","toLowerCase","appLayoutTsxPath","exists","Error","console","info","undefined","languages"],"mappings":"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"}
@@ -2,8 +2,8 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */ import { generateFiles, joinPathFragments, OverwriteStrategy } from "@nx/devkit";
5
- import { addSingleImport, applyGritQL, matchGritQL } from "../../../utils/ast.js";
6
5
  import { addHookResultToRouterProviderContext } from "../../../utils/ast/website.js";
6
+ import { addSingleImport, applyGritQL, matchGritQL } from "../../../utils/ast.js";
7
7
  import { formatFilesInSubtree } from "../../../utils/format.js";
8
8
  import { addGeneratorMetricsIfApplicable } from "../../../utils/metrics.js";
9
9
  import { getNpmScopePrefix } from "../../../utils/npm-scope.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/react-website/runtime-config/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n} from '@nx/devkit';\nimport {\n addSingleImport,\n applyGritQL,\n matchGritQL,\n} from '../../../utils/ast.js';\nimport { addHookResultToRouterProviderContext } from '../../../utils/ast/website.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { getNpmScopePrefix } from '../../../utils/npm-scope.js';\nimport {\n addComponentGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { toProjectRelativePath } from '../../../utils/paths.js';\nimport type { RuntimeConfigGeneratorSchema } from './schema';\n\nexport const RUNTIME_CONFIG_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport async function runtimeConfigGenerator(\n tree: Tree,\n options: RuntimeConfigGeneratorSchema,\n) {\n const projectConfig = readProjectConfigurationUnqualified(\n tree,\n options.project,\n );\n const srcRoot = projectConfig.sourceRoot;\n const mainTsxPath = joinPathFragments(srcRoot, 'main.tsx');\n if (!tree.exists(mainTsxPath)) {\n throw new Error(\n `Can only run this generator on a project which contains ${mainTsxPath}`,\n );\n }\n\n const runtimeConfigPath = joinPathFragments(\n srcRoot,\n 'components',\n 'RuntimeConfig',\n 'index.tsx',\n );\n if (tree.exists(runtimeConfigPath)) {\n console.debug('Runtime config already exists, skipping generation');\n return;\n }\n\n const npmScopePrefix = getNpmScopePrefix(tree);\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'app'),\n srcRoot,\n {\n ...options,\n npmScopePrefix,\n scopeAlias: npmScopePrefix,\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Only add RuntimeConfigProvider wrapper and import if not already present in JSX\n const alreadyWrapped = await matchGritQL(\n tree,\n mainTsxPath,\n '`<RuntimeConfigProvider>$_</RuntimeConfigProvider>`',\n );\n if (!alreadyWrapped) {\n await addSingleImport(\n tree,\n mainTsxPath,\n 'RuntimeConfigProvider',\n './components/RuntimeConfig',\n );\n\n const wrapped = await applyGritQL(\n tree,\n mainTsxPath,\n '`<App />` => `<RuntimeConfigProvider><App /></RuntimeConfigProvider>`',\n );\n\n if (!wrapped) {\n throw new Error('Could not locate the App element in main.tsx');\n }\n }\n\n await addHookResultToRouterProviderContext(tree, mainTsxPath, {\n hook: 'useRuntimeConfig',\n module: './hooks/useRuntimeConfig',\n contextProp: 'runtimeConfig',\n });\n\n addComponentGeneratorMetadata(\n tree,\n options.project,\n RUNTIME_CONFIG_GENERATOR_INFO,\n toProjectRelativePath(\n projectConfig,\n joinPathFragments(srcRoot, 'components', 'RuntimeConfig'),\n ),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [RUNTIME_CONFIG_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n}\nexport default runtimeConfigGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","addSingleImport","applyGritQL","matchGritQL","addHookResultToRouterProviderContext","formatFilesInSubtree","addGeneratorMetricsIfApplicable","getNpmScopePrefix","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","RUNTIME_CONFIG_GENERATOR_INFO","filename","runtimeConfigGenerator","tree","options","projectConfig","project","srcRoot","sourceRoot","mainTsxPath","exists","Error","runtimeConfigPath","console","debug","npmScopePrefix","dirname","scopeAlias","overwriteStrategy","KeepExisting","alreadyWrapped","wrapped","hook","module","contextProp"],"mappings":"AAAA;;;CAGC,GACD,SACEA,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,QAEZ,aAAa;AACpB,SACEC,eAAe,EACfC,WAAW,EACXC,WAAW,QACN,wBAAwB;AAC/B,SAASC,oCAAoC,QAAQ,gCAAgC;AACrF,SAASC,oBAAoB,QAAQ,2BAA2B;AAChE,SAASC,+BAA+B,QAAQ,4BAA4B;AAC5E,SAASC,iBAAiB,QAAQ,8BAA8B;AAChE,SACEC,6BAA6B,EAC7BC,gBAAgB,EAEhBC,mCAAmC,QAC9B,uBAAuB;AAC9B,SAASC,qBAAqB,QAAQ,0BAA0B;AAGhE,OAAO,MAAMC,gCAAiDH,iBAC5D,YAAYI,QAAQ,EACpB;AAEF,OAAO,eAAeC,uBACpBC,IAAU,EACVC,OAAqC;IAErC,MAAMC,gBAAgBP,oCACpBK,MACAC,QAAQE,OAAO;IAEjB,MAAMC,UAAUF,cAAcG,UAAU;IACxC,MAAMC,cAActB,kBAAkBoB,SAAS;IAC/C,IAAI,CAACJ,KAAKO,MAAM,CAACD,cAAc;QAC7B,MAAM,IAAIE,MACR,CAAC,wDAAwD,EAAEF,aAAa;IAE5E;IAEA,MAAMG,oBAAoBzB,kBACxBoB,SACA,cACA,iBACA;IAEF,IAAIJ,KAAKO,MAAM,CAACE,oBAAoB;QAClCC,QAAQC,KAAK,CAAC;QACd;IACF;IAEA,MAAMC,iBAAiBpB,kBAAkBQ;IACzCjB,cACEiB,MACAhB,kBAAkB,YAAY6B,OAAO,EAAE,SAAS,QAChDT,SACA;QACE,GAAGH,OAAO;QACVW;QACAE,YAAYF;IACd,GACA;QACEG,mBAAmB9B,kBAAkB+B,YAAY;IACnD;IAGF,kFAAkF;IAClF,MAAMC,iBAAiB,MAAM7B,YAC3BY,MACAM,aACA;IAEF,IAAI,CAACW,gBAAgB;QACnB,MAAM/B,gBACJc,MACAM,aACA,yBACA;QAGF,MAAMY,UAAU,MAAM/B,YACpBa,MACAM,aACA;QAGF,IAAI,CAACY,SAAS;YACZ,MAAM,IAAIV,MAAM;QAClB;IACF;IAEA,MAAMnB,qCAAqCW,MAAMM,aAAa;QAC5Da,MAAM;QACNC,QAAQ;QACRC,aAAa;IACf;IAEA5B,8BACEO,MACAC,QAAQE,OAAO,EACfN,+BACAD,sBACEM,eACAlB,kBAAkBoB,SAAS,cAAc;IAI7C,MAAMb,gCAAgCS,MAAM;QAACH;KAA8B;IAE3E,MAAMP,qBAAqBU;AAC7B;AACA,eAAeD,uBAAuB"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/react-website/runtime-config/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n} from '@nx/devkit';\nimport { addHookResultToRouterProviderContext } from '../../../utils/ast/website.js';\nimport {\n addSingleImport,\n applyGritQL,\n matchGritQL,\n} from '../../../utils/ast.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { getNpmScopePrefix } from '../../../utils/npm-scope.js';\nimport {\n addComponentGeneratorMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { toProjectRelativePath } from '../../../utils/paths.js';\nimport type { RuntimeConfigGeneratorSchema } from './schema';\n\nexport const RUNTIME_CONFIG_GENERATOR_INFO: NxGeneratorInfo = getGeneratorInfo(\n import.meta.filename,\n);\n\nexport async function runtimeConfigGenerator(\n tree: Tree,\n options: RuntimeConfigGeneratorSchema,\n) {\n const projectConfig = readProjectConfigurationUnqualified(\n tree,\n options.project,\n );\n const srcRoot = projectConfig.sourceRoot;\n const mainTsxPath = joinPathFragments(srcRoot, 'main.tsx');\n if (!tree.exists(mainTsxPath)) {\n throw new Error(\n `Can only run this generator on a project which contains ${mainTsxPath}`,\n );\n }\n\n const runtimeConfigPath = joinPathFragments(\n srcRoot,\n 'components',\n 'RuntimeConfig',\n 'index.tsx',\n );\n if (tree.exists(runtimeConfigPath)) {\n console.debug('Runtime config already exists, skipping generation');\n return;\n }\n\n const npmScopePrefix = getNpmScopePrefix(tree);\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'app'),\n srcRoot,\n {\n ...options,\n npmScopePrefix,\n scopeAlias: npmScopePrefix,\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Only add RuntimeConfigProvider wrapper and import if not already present in JSX\n const alreadyWrapped = await matchGritQL(\n tree,\n mainTsxPath,\n '`<RuntimeConfigProvider>$_</RuntimeConfigProvider>`',\n );\n if (!alreadyWrapped) {\n await addSingleImport(\n tree,\n mainTsxPath,\n 'RuntimeConfigProvider',\n './components/RuntimeConfig',\n );\n\n const wrapped = await applyGritQL(\n tree,\n mainTsxPath,\n '`<App />` => `<RuntimeConfigProvider><App /></RuntimeConfigProvider>`',\n );\n\n if (!wrapped) {\n throw new Error('Could not locate the App element in main.tsx');\n }\n }\n\n await addHookResultToRouterProviderContext(tree, mainTsxPath, {\n hook: 'useRuntimeConfig',\n module: './hooks/useRuntimeConfig',\n contextProp: 'runtimeConfig',\n });\n\n addComponentGeneratorMetadata(\n tree,\n options.project,\n RUNTIME_CONFIG_GENERATOR_INFO,\n toProjectRelativePath(\n projectConfig,\n joinPathFragments(srcRoot, 'components', 'RuntimeConfig'),\n ),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [RUNTIME_CONFIG_GENERATOR_INFO]);\n\n await formatFilesInSubtree(tree);\n}\nexport default runtimeConfigGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","addHookResultToRouterProviderContext","addSingleImport","applyGritQL","matchGritQL","formatFilesInSubtree","addGeneratorMetricsIfApplicable","getNpmScopePrefix","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","RUNTIME_CONFIG_GENERATOR_INFO","filename","runtimeConfigGenerator","tree","options","projectConfig","project","srcRoot","sourceRoot","mainTsxPath","exists","Error","runtimeConfigPath","console","debug","npmScopePrefix","dirname","scopeAlias","overwriteStrategy","KeepExisting","alreadyWrapped","wrapped","hook","module","contextProp"],"mappings":"AAAA;;;CAGC,GACD,SACEA,aAAa,EACbC,iBAAiB,EACjBC,iBAAiB,QAEZ,aAAa;AACpB,SAASC,oCAAoC,QAAQ,gCAAgC;AACrF,SACEC,eAAe,EACfC,WAAW,EACXC,WAAW,QACN,wBAAwB;AAC/B,SAASC,oBAAoB,QAAQ,2BAA2B;AAChE,SAASC,+BAA+B,QAAQ,4BAA4B;AAC5E,SAASC,iBAAiB,QAAQ,8BAA8B;AAChE,SACEC,6BAA6B,EAC7BC,gBAAgB,EAEhBC,mCAAmC,QAC9B,uBAAuB;AAC9B,SAASC,qBAAqB,QAAQ,0BAA0B;AAGhE,OAAO,MAAMC,gCAAiDH,iBAC5D,YAAYI,QAAQ,EACpB;AAEF,OAAO,eAAeC,uBACpBC,IAAU,EACVC,OAAqC;IAErC,MAAMC,gBAAgBP,oCACpBK,MACAC,QAAQE,OAAO;IAEjB,MAAMC,UAAUF,cAAcG,UAAU;IACxC,MAAMC,cAActB,kBAAkBoB,SAAS;IAC/C,IAAI,CAACJ,KAAKO,MAAM,CAACD,cAAc;QAC7B,MAAM,IAAIE,MACR,CAAC,wDAAwD,EAAEF,aAAa;IAE5E;IAEA,MAAMG,oBAAoBzB,kBACxBoB,SACA,cACA,iBACA;IAEF,IAAIJ,KAAKO,MAAM,CAACE,oBAAoB;QAClCC,QAAQC,KAAK,CAAC;QACd;IACF;IAEA,MAAMC,iBAAiBpB,kBAAkBQ;IACzCjB,cACEiB,MACAhB,kBAAkB,YAAY6B,OAAO,EAAE,SAAS,QAChDT,SACA;QACE,GAAGH,OAAO;QACVW;QACAE,YAAYF;IACd,GACA;QACEG,mBAAmB9B,kBAAkB+B,YAAY;IACnD;IAGF,kFAAkF;IAClF,MAAMC,iBAAiB,MAAM5B,YAC3BW,MACAM,aACA;IAEF,IAAI,CAACW,gBAAgB;QACnB,MAAM9B,gBACJa,MACAM,aACA,yBACA;QAGF,MAAMY,UAAU,MAAM9B,YACpBY,MACAM,aACA;QAGF,IAAI,CAACY,SAAS;YACZ,MAAM,IAAIV,MAAM;QAClB;IACF;IAEA,MAAMtB,qCAAqCc,MAAMM,aAAa;QAC5Da,MAAM;QACNC,QAAQ;QACRC,aAAa;IACf;IAEA5B,8BACEO,MACAC,QAAQE,OAAO,EACfN,+BACAD,sBACEM,eACAlB,kBAAkBoB,SAAS,cAAc;IAI7C,MAAMb,gCAAgCS,MAAM;QAACH;KAA8B;IAE3E,MAAMP,qBAAqBU;AAC7B;AACA,eAAeD,uBAAuB"}
@@ -8,7 +8,7 @@ import { addDependenciesToPackageJson } from "../dependencies.js";
8
8
  import { esmVars } from "../module-format.js";
9
9
  import { addDependencyToTargetIfNotPresent } from "../nx.js";
10
10
  import { generatedCdk, generatedTerraform, PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, SHARED_TERRAFORM_DIR } from "../shared-constructs-constants.js";
11
- import { PY_VERSIONS, terraformProviderVersions, withVersions } from "../versions.js";
11
+ import { cdkLambdaRuntimeVars, PY_VERSIONS, terraformProviderVersions, withVersions } from "../versions.js";
12
12
  /**
13
13
  * Dependencies a caller must declare to add an AgentCore Gateway construct.
14
14
  *
@@ -154,7 +154,8 @@ const addAgentCoreGatewayCDKInfra = async (tree, options, declaration)=>{
154
154
  // Generic gateway construct (readiness probe, policy engine, Cedar policy
155
155
  // loading) shared by all gateways
156
156
  generateFiles(tree, joinPathFragments(import.meta.dirname, 'files', 'cdk', 'core', 'agentcore-gateway'), joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'src', 'core', 'agentcore-gateway'), {
157
- ...esmVars(tree)
157
+ ...esmVars(tree),
158
+ ...cdkLambdaRuntimeVars()
158
159
  }, {
159
160
  overwriteStrategy: OverwriteStrategy.KeepExisting
160
161
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/utils/agent-core-constructs/agent-core-constructs.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addStarExport } from '../ast.js';\nimport type { Containers } from '../containers.js';\nimport {\n type DeclaredPyDependency,\n type DeclaredTsDependency,\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../dependencies.js';\nimport type { Iac } from '../iac.js';\nimport { esmVars } from '../module-format.js';\nimport { addDependencyToTargetIfNotPresent } from '../nx.js';\nimport {\n generatedCdk,\n generatedTerraform,\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n SHARED_TERRAFORM_DIR,\n} from '../shared-constructs-constants.js';\nimport {\n type IPyDepVersion,\n type ITsDepVersion,\n PY_VERSIONS,\n terraformProviderVersions,\n withVersions,\n} from '../versions.js';\n\ntype IACProvider = { iac: Iac };\n\n/**\n * Dependencies a caller must declare to add an AgentCore Gateway construct.\n *\n * Both providers render Cedar policies with `ejs`, each from a different\n * manifest: the CDK construct imports it from the shared constructs project,\n * while Terraform's `render-cedar.cjs` resolves it from the workspace root,\n * since the shared terraform project it runs in has no `package.json`.\n */\nexport const AGENT_CORE_CONSTRUCTS_DEPENDENCIES = [\n { name: 'ejs', when: generatedCdk },\n { name: '@aws-sdk/client-bedrock-agentcore', when: generatedCdk },\n { name: '@types/ejs', when: generatedCdk },\n { name: 'ejs', when: generatedTerraform, dev: true, root: true },\n] as const satisfies readonly DeclaredTsDependency<\n ITsDepVersion,\n IacMetadata\n>[];\n\n/**\n * Python versions the generated Terraform pins in an inline `uv run --with`\n * script, rather than in any `pyproject.toml`.\n *\n * Spread through `ownedElsewhere` because nothing installs them into the\n * workspace — the pin is owned so the version sync keeps it current, and gated on\n * Terraform since the CDK branch writes no such script.\n */\nexport const AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES = [\n { name: 'boto3', when: generatedTerraform },\n { name: 'httpx', when: generatedTerraform },\n { name: 'mcp', when: generatedTerraform },\n] as const satisfies readonly DeclaredPyDependency<\n IPyDepVersion,\n IacMetadata\n>[];\n\nexport type AgentCoreAuth = 'iam' | 'cognito';\n\nexport type AgentCoreSession = 's3' | 'dynamodb-s3' | 'in-memory';\n\nexport interface AddAgentCoreInfraProps {\n nameClassName: string;\n nameKebabCase: string;\n projectName: string;\n dockerImageTag: string;\n dockerOutputDir: string;\n appDirectory: string;\n serverProtocol: 'mcp' | 'http' | 'a2a';\n auth: AgentCoreAuth;\n /** How this runtime's session should be persisted. MCP servers have no session, so pass 'in-memory'. */\n session: AgentCoreSession;\n containers: Containers;\n}\n\nconst addAgentCoreInfra = async (\n tree: Tree,\n options: AddAgentCoreInfraProps & { iac: Iac },\n) => {\n switch (options.iac) {\n case 'cdk':\n await addAgentCoreCDKInfra(tree, options);\n break;\n case 'terraform':\n addAgentCoreTerraformInfra(tree, options);\n break;\n }\n\n // Update shared constructs/terraform project configuration to depend on this project\n updateJson(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n options.iac === 'cdk' ? SHARED_CONSTRUCTS_DIR : SHARED_TERRAFORM_DIR,\n 'project.json',\n ),\n (config: ProjectConfiguration) => {\n addDependencyToTargetIfNotPresent(\n config,\n 'build',\n `${options.projectName}:build`,\n );\n return config;\n },\n );\n};\n\nconst addAgentCoreCDKInfra = async (\n tree: Tree,\n options: AddAgentCoreInfraProps,\n) => {\n // Generate app specific CDK construct\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'cdk', 'app', 'agent-core'),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n options.appDirectory,\n ),\n { ...options, ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Export app specific CDK construct\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n options.appDirectory,\n 'index.ts',\n ),\n `./${options.nameKebabCase}/${options.nameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n `./${options.appDirectory}/index.js`,\n );\n};\n\nconst addAgentCoreTerraformInfra = (\n tree: Tree,\n options: AddAgentCoreInfraProps,\n) => {\n // Add the AgentCore shared module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'core',\n 'agent-core',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'core',\n 'agent-core',\n ),\n {\n containers: options.containers,\n boto3Version: PY_VERSIONS.boto3,\n ...terraformProviderVersions(),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate app specific agent core configuration\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'agent-core',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'app',\n options.appDirectory,\n ),\n { ...options, ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n};\n\nexport interface AddMcpServerInfraProps {\n mcpServerNameClassName: string;\n mcpServerNameKebabCase: string;\n projectName: string;\n dockerImageTag: string;\n dockerOutputDir: string;\n auth: AgentCoreAuth;\n containers: Containers;\n}\n\n/**\n * Add an MCP server CDK construct\n */\nexport const addMcpServerInfra = async (\n tree: Tree,\n options: AddMcpServerInfraProps & IACProvider,\n) => {\n await addAgentCoreInfra(tree, {\n nameClassName: options.mcpServerNameClassName,\n nameKebabCase: options.mcpServerNameKebabCase,\n dockerImageTag: options.dockerImageTag,\n dockerOutputDir: options.dockerOutputDir,\n projectName: options.projectName,\n appDirectory: 'mcp-servers',\n serverProtocol: 'mcp',\n iac: options.iac,\n auth: options.auth,\n // MCP servers are stateless (no conversation session to persist).\n session: 'in-memory',\n containers: options.containers,\n });\n};\n\nexport interface AddAgentInfraProps {\n agentNameClassName: string;\n agentNameKebabCase: string;\n projectName: string;\n dockerImageTag: string;\n dockerOutputDir: string;\n auth: AgentCoreAuth;\n session: AgentCoreSession;\n serverProtocol?: 'http' | 'a2a';\n containers: Containers;\n}\n\n/**\n * Add an agent CDK construct\n */\nexport const addAgentInfra = async (\n tree: Tree,\n options: AddAgentInfraProps & IACProvider,\n) => {\n await addAgentCoreInfra(tree, {\n nameClassName: options.agentNameClassName,\n nameKebabCase: options.agentNameKebabCase,\n projectName: options.projectName,\n dockerImageTag: options.dockerImageTag,\n dockerOutputDir: options.dockerOutputDir,\n appDirectory: 'agents',\n session: options.session,\n serverProtocol: options.serverProtocol ?? 'http',\n iac: options.iac,\n auth: options.auth,\n containers: options.containers,\n });\n};\n\nexport interface AddAgentCoreGatewayInfraProps {\n gatewayNameClassName: string;\n gatewayNameKebabCase: string;\n projectName: string;\n projectDirectory: string;\n cedarPolicy: boolean;\n auth: AgentCoreAuth;\n /**\n * The gateway's protocol: mcp aggregates MCP server targets, http proxies\n * agent runtime targets via path-based routing.\n */\n protocol: 'mcp' | 'http';\n}\n\nexport const addAgentCoreGatewayInfra = async <\n const D extends DependencyDeclaration,\n>(\n tree: Tree,\n options: AddAgentCoreGatewayInfraProps & IACProvider,\n declaration: D & MustDeclare<typeof AGENT_CORE_CONSTRUCTS_DEPENDENCIES, D>,\n) => {\n switch (options.iac) {\n case 'cdk':\n await addAgentCoreGatewayCDKInfra(tree, options, declaration);\n break;\n case 'terraform':\n addAgentCoreGatewayTerraformInfra(tree, options, declaration);\n break;\n }\n\n updateJson(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n options.iac === 'cdk' ? SHARED_CONSTRUCTS_DIR : SHARED_TERRAFORM_DIR,\n 'project.json',\n ),\n (config: ProjectConfiguration) => {\n addDependencyToTargetIfNotPresent(\n config,\n 'build',\n `${options.projectName}:build`,\n );\n return config;\n },\n );\n};\n\nconst addAgentCoreGatewayCDKInfra = async (\n tree: Tree,\n options: AddAgentCoreGatewayInfraProps,\n declaration: DependencyDeclaration,\n) => {\n // Generic gateway construct (readiness probe, policy engine, Cedar policy\n // loading) shared by all gateways\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'core',\n 'agentcore-gateway',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'core',\n 'agentcore-gateway',\n ),\n { ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'app',\n 'agentcore-gateway',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'gateways',\n ),\n {\n nameClassName: options.gatewayNameClassName,\n nameKebabCase: options.gatewayNameKebabCase,\n projectDirectory: options.projectDirectory,\n cedarPolicy: options.cedarPolicy,\n auth: options.auth,\n protocol: options.protocol,\n ...esmVars(tree),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'core',\n 'index.ts',\n ),\n './agentcore-gateway/agentcore-gateway.js',\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'gateways',\n 'index.ts',\n ),\n `./${options.gatewayNameKebabCase}/${options.gatewayNameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n './gateways/index.js',\n );\n\n // The gateway construct renders Cedar policies with ejs and its readiness\n // probe uses the AgentCore SDK client; declare both so the lint passes.\n addDependenciesToPackageJson(\n tree,\n withVersions(\n forDependencies<typeof AGENT_CORE_CONSTRUCTS_DEPENDENCIES>(declaration),\n ['ejs', '@aws-sdk/client-bedrock-agentcore'],\n ),\n withVersions(\n forDependencies<typeof AGENT_CORE_CONSTRUCTS_DEPENDENCIES>(declaration),\n ['@types/ejs'],\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'package.json'),\n );\n};\n\nconst addAgentCoreGatewayTerraformInfra = (\n tree: Tree,\n options: AddAgentCoreGatewayInfraProps,\n declaration: DependencyDeclaration,\n) => {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'core',\n 'agentcore-gateway',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'core',\n 'agentcore-gateway',\n ),\n { ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'agentcore-gateway',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'app',\n 'gateways',\n ),\n {\n nameClassName: options.gatewayNameClassName,\n nameKebabCase: options.gatewayNameKebabCase,\n projectDirectory: options.projectDirectory,\n cedarPolicy: options.cedarPolicy,\n auth: options.auth,\n protocol: options.protocol,\n boto3Version: PY_VERSIONS.boto3,\n httpxVersion: PY_VERSIONS.httpx,\n mcpVersion: PY_VERSIONS.mcp,\n ...terraformProviderVersions(),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // The Cedar render script is only needed when policies are enabled\n if (!options.cedarPolicy) {\n const renderScript = joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'app',\n 'gateways',\n options.gatewayNameKebabCase,\n 'render-cedar.cjs',\n );\n if (tree.exists(renderScript)) {\n tree.delete(renderScript);\n }\n return;\n }\n\n // render-cedar.cjs resolves ejs from the workspace root, since the shared\n // terraform project it runs in has no package.json.\n addDependenciesToPackageJson(\n tree,\n {},\n withVersions(\n forDependencies<typeof AGENT_CORE_CONSTRUCTS_DEPENDENCIES>(declaration),\n ['ejs'],\n ),\n );\n};\n\nexport interface AddAgentCoreHarnessInfraProps {\n harnessNameClassName: string;\n harnessNameKebabCase: string;\n /**\n * Workspace-root-relative harness project root, eg `packages/my-harness`.\n * The `src/PROMPT.md` path both templates read is derived from it.\n */\n projectRoot: string;\n /** Leading-letter-guaranteed, 31-char-truncated resource name prefix. */\n harnessNamePrefix: string;\n}\n\n/**\n * Template substitution context shared by the CDK and Terraform harness\n * branches. Both prompt path fields carry the same workspace-root-relative\n * path, named per provider so each template's usage reads on its own.\n */\ninterface HarnessTemplateContext {\n nameClassName: string;\n nameKebabCase: string;\n harnessNamePrefix: string;\n /** Joined onto `findWorkspaceRoot()` in the CDK construct. */\n promptPathFromCdk: string;\n /** Appended to the `path.module` walk to the workspace root in Terraform. */\n promptPathFromTerraform: string;\n}\n\n/**\n * Add AgentCore Harness infrastructure for the selected IaC provider.\n *\n * Renders the provider-specific Harness infrastructure (a CDK construct or\n * a Terraform module) into the Shared Infrastructure Project with\n * `KeepExisting`, so existing files become user-owned and are never\n * rewritten by reruns.\n *\n * Unlike agents, MCP servers and gateways, no build dependency is added\n * from the shared infrastructure project to the Harness Project: generated\n * Harness infrastructure does not import Harness Project source, so a\n * dependency would only create false rebuild coupling.\n */\nexport const addAgentCoreHarnessInfra = async (\n tree: Tree,\n options: AddAgentCoreHarnessInfraProps & IACProvider,\n): Promise<void> => {\n // One resolved template context, built once and passed to both provider\n // branches. The prompt path is derived from the same projectRoot the\n // Harness Project is written to, so explicit placement needs no extra logic.\n const promptPath = joinPathFragments(options.projectRoot, 'src', 'PROMPT.md');\n const templateContext: HarnessTemplateContext = {\n nameClassName: options.harnessNameClassName,\n nameKebabCase: options.harnessNameKebabCase,\n harnessNamePrefix: options.harnessNamePrefix,\n promptPathFromCdk: promptPath,\n promptPathFromTerraform: promptPath,\n };\n\n switch (options.iac) {\n case 'cdk':\n await addAgentCoreHarnessCDKInfra(tree, templateContext);\n break;\n case 'terraform':\n addAgentCoreHarnessTerraformInfra(tree, templateContext);\n break;\n }\n};\n\nconst addAgentCoreHarnessCDKInfra = async (\n tree: Tree,\n templateContext: HarnessTemplateContext,\n) => {\n // Generate the app specific CDK construct under\n // src/app/harnesses/<kebab-case-name>/\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'app',\n 'agentcore-harness',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'harnesses',\n ),\n { ...templateContext, ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Export the construct through the harnesses app index and the shared\n // app index. addStarExport creates a missing index file and semantically\n // deduplicates equivalent exports on reruns.\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'harnesses',\n 'index.ts',\n ),\n `./${templateContext.nameKebabCase}/${templateContext.nameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n './harnesses/index.js',\n );\n};\n\nconst addAgentCoreHarnessTerraformInfra = (\n tree: Tree,\n templateContext: HarnessTemplateContext,\n) => {\n // Generate the app specific Terraform module under\n // src/app/harnesses/<kebab-case-name>/. No CDK files or exports are\n // created on this path.\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'agentcore-harness',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'app',\n 'harnesses',\n ),\n { ...templateContext, ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addStarExport","forDependencies","addDependenciesToPackageJson","esmVars","addDependencyToTargetIfNotPresent","generatedCdk","generatedTerraform","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","SHARED_TERRAFORM_DIR","PY_VERSIONS","terraformProviderVersions","withVersions","AGENT_CORE_CONSTRUCTS_DEPENDENCIES","name","when","dev","root","AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES","addAgentCoreInfra","tree","options","iac","addAgentCoreCDKInfra","addAgentCoreTerraformInfra","config","projectName","dirname","appDirectory","overwriteStrategy","KeepExisting","nameKebabCase","containers","boto3Version","boto3","addMcpServerInfra","nameClassName","mcpServerNameClassName","mcpServerNameKebabCase","dockerImageTag","dockerOutputDir","serverProtocol","auth","session","addAgentInfra","agentNameClassName","agentNameKebabCase","addAgentCoreGatewayInfra","declaration","addAgentCoreGatewayCDKInfra","addAgentCoreGatewayTerraformInfra","gatewayNameClassName","gatewayNameKebabCase","projectDirectory","cedarPolicy","protocol","httpxVersion","httpx","mcpVersion","mcp","renderScript","exists","delete","addAgentCoreHarnessInfra","promptPath","projectRoot","templateContext","harnessNameClassName","harnessNameKebabCase","harnessNamePrefix","promptPathFromCdk","promptPathFromTerraform","addAgentCoreHarnessCDKInfra","addAgentCoreHarnessTerraformInfra"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/utils/agent-core-constructs/agent-core-constructs.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addStarExport } from '../ast.js';\nimport type { Containers } from '../containers.js';\nimport {\n type DeclaredPyDependency,\n type DeclaredTsDependency,\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../dependencies.js';\nimport type { Iac } from '../iac.js';\nimport { esmVars } from '../module-format.js';\nimport { addDependencyToTargetIfNotPresent } from '../nx.js';\nimport {\n generatedCdk,\n generatedTerraform,\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n SHARED_TERRAFORM_DIR,\n} from '../shared-constructs-constants.js';\nimport {\n cdkLambdaRuntimeVars,\n type IPyDepVersion,\n type ITsDepVersion,\n PY_VERSIONS,\n terraformProviderVersions,\n withVersions,\n} from '../versions.js';\n\ntype IACProvider = { iac: Iac };\n\n/**\n * Dependencies a caller must declare to add an AgentCore Gateway construct.\n *\n * Both providers render Cedar policies with `ejs`, each from a different\n * manifest: the CDK construct imports it from the shared constructs project,\n * while Terraform's `render-cedar.cjs` resolves it from the workspace root,\n * since the shared terraform project it runs in has no `package.json`.\n */\nexport const AGENT_CORE_CONSTRUCTS_DEPENDENCIES = [\n { name: 'ejs', when: generatedCdk },\n { name: '@aws-sdk/client-bedrock-agentcore', when: generatedCdk },\n { name: '@types/ejs', when: generatedCdk },\n { name: 'ejs', when: generatedTerraform, dev: true, root: true },\n] as const satisfies readonly DeclaredTsDependency<\n ITsDepVersion,\n IacMetadata\n>[];\n\n/**\n * Python versions the generated Terraform pins in an inline `uv run --with`\n * script, rather than in any `pyproject.toml`.\n *\n * Spread through `ownedElsewhere` because nothing installs them into the\n * workspace — the pin is owned so the version sync keeps it current, and gated on\n * Terraform since the CDK branch writes no such script.\n */\nexport const AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES = [\n { name: 'boto3', when: generatedTerraform },\n { name: 'httpx', when: generatedTerraform },\n { name: 'mcp', when: generatedTerraform },\n] as const satisfies readonly DeclaredPyDependency<\n IPyDepVersion,\n IacMetadata\n>[];\n\nexport type AgentCoreAuth = 'iam' | 'cognito';\n\nexport type AgentCoreSession = 's3' | 'dynamodb-s3' | 'in-memory';\n\nexport interface AddAgentCoreInfraProps {\n nameClassName: string;\n nameKebabCase: string;\n projectName: string;\n dockerImageTag: string;\n dockerOutputDir: string;\n appDirectory: string;\n serverProtocol: 'mcp' | 'http' | 'a2a';\n auth: AgentCoreAuth;\n /** How this runtime's session should be persisted. MCP servers have no session, so pass 'in-memory'. */\n session: AgentCoreSession;\n containers: Containers;\n}\n\nconst addAgentCoreInfra = async (\n tree: Tree,\n options: AddAgentCoreInfraProps & { iac: Iac },\n) => {\n switch (options.iac) {\n case 'cdk':\n await addAgentCoreCDKInfra(tree, options);\n break;\n case 'terraform':\n addAgentCoreTerraformInfra(tree, options);\n break;\n }\n\n // Update shared constructs/terraform project configuration to depend on this project\n updateJson(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n options.iac === 'cdk' ? SHARED_CONSTRUCTS_DIR : SHARED_TERRAFORM_DIR,\n 'project.json',\n ),\n (config: ProjectConfiguration) => {\n addDependencyToTargetIfNotPresent(\n config,\n 'build',\n `${options.projectName}:build`,\n );\n return config;\n },\n );\n};\n\nconst addAgentCoreCDKInfra = async (\n tree: Tree,\n options: AddAgentCoreInfraProps,\n) => {\n // Generate app specific CDK construct\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'cdk', 'app', 'agent-core'),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n options.appDirectory,\n ),\n { ...options, ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Export app specific CDK construct\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n options.appDirectory,\n 'index.ts',\n ),\n `./${options.nameKebabCase}/${options.nameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n `./${options.appDirectory}/index.js`,\n );\n};\n\nconst addAgentCoreTerraformInfra = (\n tree: Tree,\n options: AddAgentCoreInfraProps,\n) => {\n // Add the AgentCore shared module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'core',\n 'agent-core',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'core',\n 'agent-core',\n ),\n {\n containers: options.containers,\n boto3Version: PY_VERSIONS.boto3,\n ...terraformProviderVersions(),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate app specific agent core configuration\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'agent-core',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'app',\n options.appDirectory,\n ),\n { ...options, ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n};\n\nexport interface AddMcpServerInfraProps {\n mcpServerNameClassName: string;\n mcpServerNameKebabCase: string;\n projectName: string;\n dockerImageTag: string;\n dockerOutputDir: string;\n auth: AgentCoreAuth;\n containers: Containers;\n}\n\n/**\n * Add an MCP server CDK construct\n */\nexport const addMcpServerInfra = async (\n tree: Tree,\n options: AddMcpServerInfraProps & IACProvider,\n) => {\n await addAgentCoreInfra(tree, {\n nameClassName: options.mcpServerNameClassName,\n nameKebabCase: options.mcpServerNameKebabCase,\n dockerImageTag: options.dockerImageTag,\n dockerOutputDir: options.dockerOutputDir,\n projectName: options.projectName,\n appDirectory: 'mcp-servers',\n serverProtocol: 'mcp',\n iac: options.iac,\n auth: options.auth,\n // MCP servers are stateless (no conversation session to persist).\n session: 'in-memory',\n containers: options.containers,\n });\n};\n\nexport interface AddAgentInfraProps {\n agentNameClassName: string;\n agentNameKebabCase: string;\n projectName: string;\n dockerImageTag: string;\n dockerOutputDir: string;\n auth: AgentCoreAuth;\n session: AgentCoreSession;\n serverProtocol?: 'http' | 'a2a';\n containers: Containers;\n}\n\n/**\n * Add an agent CDK construct\n */\nexport const addAgentInfra = async (\n tree: Tree,\n options: AddAgentInfraProps & IACProvider,\n) => {\n await addAgentCoreInfra(tree, {\n nameClassName: options.agentNameClassName,\n nameKebabCase: options.agentNameKebabCase,\n projectName: options.projectName,\n dockerImageTag: options.dockerImageTag,\n dockerOutputDir: options.dockerOutputDir,\n appDirectory: 'agents',\n session: options.session,\n serverProtocol: options.serverProtocol ?? 'http',\n iac: options.iac,\n auth: options.auth,\n containers: options.containers,\n });\n};\n\nexport interface AddAgentCoreGatewayInfraProps {\n gatewayNameClassName: string;\n gatewayNameKebabCase: string;\n projectName: string;\n projectDirectory: string;\n cedarPolicy: boolean;\n auth: AgentCoreAuth;\n /**\n * The gateway's protocol: mcp aggregates MCP server targets, http proxies\n * agent runtime targets via path-based routing.\n */\n protocol: 'mcp' | 'http';\n}\n\nexport const addAgentCoreGatewayInfra = async <\n const D extends DependencyDeclaration,\n>(\n tree: Tree,\n options: AddAgentCoreGatewayInfraProps & IACProvider,\n declaration: D & MustDeclare<typeof AGENT_CORE_CONSTRUCTS_DEPENDENCIES, D>,\n) => {\n switch (options.iac) {\n case 'cdk':\n await addAgentCoreGatewayCDKInfra(tree, options, declaration);\n break;\n case 'terraform':\n addAgentCoreGatewayTerraformInfra(tree, options, declaration);\n break;\n }\n\n updateJson(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n options.iac === 'cdk' ? SHARED_CONSTRUCTS_DIR : SHARED_TERRAFORM_DIR,\n 'project.json',\n ),\n (config: ProjectConfiguration) => {\n addDependencyToTargetIfNotPresent(\n config,\n 'build',\n `${options.projectName}:build`,\n );\n return config;\n },\n );\n};\n\nconst addAgentCoreGatewayCDKInfra = async (\n tree: Tree,\n options: AddAgentCoreGatewayInfraProps,\n declaration: DependencyDeclaration,\n) => {\n // Generic gateway construct (readiness probe, policy engine, Cedar policy\n // loading) shared by all gateways\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'core',\n 'agentcore-gateway',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'core',\n 'agentcore-gateway',\n ),\n { ...esmVars(tree), ...cdkLambdaRuntimeVars() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'app',\n 'agentcore-gateway',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'gateways',\n ),\n {\n nameClassName: options.gatewayNameClassName,\n nameKebabCase: options.gatewayNameKebabCase,\n projectDirectory: options.projectDirectory,\n cedarPolicy: options.cedarPolicy,\n auth: options.auth,\n protocol: options.protocol,\n ...esmVars(tree),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'core',\n 'index.ts',\n ),\n './agentcore-gateway/agentcore-gateway.js',\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'gateways',\n 'index.ts',\n ),\n `./${options.gatewayNameKebabCase}/${options.gatewayNameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n './gateways/index.js',\n );\n\n // The gateway construct renders Cedar policies with ejs and its readiness\n // probe uses the AgentCore SDK client; declare both so the lint passes.\n addDependenciesToPackageJson(\n tree,\n withVersions(\n forDependencies<typeof AGENT_CORE_CONSTRUCTS_DEPENDENCIES>(declaration),\n ['ejs', '@aws-sdk/client-bedrock-agentcore'],\n ),\n withVersions(\n forDependencies<typeof AGENT_CORE_CONSTRUCTS_DEPENDENCIES>(declaration),\n ['@types/ejs'],\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'package.json'),\n );\n};\n\nconst addAgentCoreGatewayTerraformInfra = (\n tree: Tree,\n options: AddAgentCoreGatewayInfraProps,\n declaration: DependencyDeclaration,\n) => {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'core',\n 'agentcore-gateway',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'core',\n 'agentcore-gateway',\n ),\n { ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'agentcore-gateway',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'app',\n 'gateways',\n ),\n {\n nameClassName: options.gatewayNameClassName,\n nameKebabCase: options.gatewayNameKebabCase,\n projectDirectory: options.projectDirectory,\n cedarPolicy: options.cedarPolicy,\n auth: options.auth,\n protocol: options.protocol,\n boto3Version: PY_VERSIONS.boto3,\n httpxVersion: PY_VERSIONS.httpx,\n mcpVersion: PY_VERSIONS.mcp,\n ...terraformProviderVersions(),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // The Cedar render script is only needed when policies are enabled\n if (!options.cedarPolicy) {\n const renderScript = joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'app',\n 'gateways',\n options.gatewayNameKebabCase,\n 'render-cedar.cjs',\n );\n if (tree.exists(renderScript)) {\n tree.delete(renderScript);\n }\n return;\n }\n\n // render-cedar.cjs resolves ejs from the workspace root, since the shared\n // terraform project it runs in has no package.json.\n addDependenciesToPackageJson(\n tree,\n {},\n withVersions(\n forDependencies<typeof AGENT_CORE_CONSTRUCTS_DEPENDENCIES>(declaration),\n ['ejs'],\n ),\n );\n};\n\nexport interface AddAgentCoreHarnessInfraProps {\n harnessNameClassName: string;\n harnessNameKebabCase: string;\n /**\n * Workspace-root-relative harness project root, eg `packages/my-harness`.\n * The `src/PROMPT.md` path both templates read is derived from it.\n */\n projectRoot: string;\n /** Leading-letter-guaranteed, 31-char-truncated resource name prefix. */\n harnessNamePrefix: string;\n}\n\n/**\n * Template substitution context shared by the CDK and Terraform harness\n * branches. Both prompt path fields carry the same workspace-root-relative\n * path, named per provider so each template's usage reads on its own.\n */\ninterface HarnessTemplateContext {\n nameClassName: string;\n nameKebabCase: string;\n harnessNamePrefix: string;\n /** Joined onto `findWorkspaceRoot()` in the CDK construct. */\n promptPathFromCdk: string;\n /** Appended to the `path.module` walk to the workspace root in Terraform. */\n promptPathFromTerraform: string;\n}\n\n/**\n * Add AgentCore Harness infrastructure for the selected IaC provider.\n *\n * Renders the provider-specific Harness infrastructure (a CDK construct or\n * a Terraform module) into the Shared Infrastructure Project with\n * `KeepExisting`, so existing files become user-owned and are never\n * rewritten by reruns.\n *\n * Unlike agents, MCP servers and gateways, no build dependency is added\n * from the shared infrastructure project to the Harness Project: generated\n * Harness infrastructure does not import Harness Project source, so a\n * dependency would only create false rebuild coupling.\n */\nexport const addAgentCoreHarnessInfra = async (\n tree: Tree,\n options: AddAgentCoreHarnessInfraProps & IACProvider,\n): Promise<void> => {\n // One resolved template context, built once and passed to both provider\n // branches. The prompt path is derived from the same projectRoot the\n // Harness Project is written to, so explicit placement needs no extra logic.\n const promptPath = joinPathFragments(options.projectRoot, 'src', 'PROMPT.md');\n const templateContext: HarnessTemplateContext = {\n nameClassName: options.harnessNameClassName,\n nameKebabCase: options.harnessNameKebabCase,\n harnessNamePrefix: options.harnessNamePrefix,\n promptPathFromCdk: promptPath,\n promptPathFromTerraform: promptPath,\n };\n\n switch (options.iac) {\n case 'cdk':\n await addAgentCoreHarnessCDKInfra(tree, templateContext);\n break;\n case 'terraform':\n addAgentCoreHarnessTerraformInfra(tree, templateContext);\n break;\n }\n};\n\nconst addAgentCoreHarnessCDKInfra = async (\n tree: Tree,\n templateContext: HarnessTemplateContext,\n) => {\n // Generate the app specific CDK construct under\n // src/app/harnesses/<kebab-case-name>/\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'app',\n 'agentcore-harness',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'harnesses',\n ),\n { ...templateContext, ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Export the construct through the harnesses app index and the shared\n // app index. addStarExport creates a missing index file and semantically\n // deduplicates equivalent exports on reruns.\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'harnesses',\n 'index.ts',\n ),\n `./${templateContext.nameKebabCase}/${templateContext.nameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n './harnesses/index.js',\n );\n};\n\nconst addAgentCoreHarnessTerraformInfra = (\n tree: Tree,\n templateContext: HarnessTemplateContext,\n) => {\n // Generate the app specific Terraform module under\n // src/app/harnesses/<kebab-case-name>/. No CDK files or exports are\n // created on this path.\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'agentcore-harness',\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'app',\n 'harnesses',\n ),\n { ...templateContext, ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addStarExport","forDependencies","addDependenciesToPackageJson","esmVars","addDependencyToTargetIfNotPresent","generatedCdk","generatedTerraform","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","SHARED_TERRAFORM_DIR","cdkLambdaRuntimeVars","PY_VERSIONS","terraformProviderVersions","withVersions","AGENT_CORE_CONSTRUCTS_DEPENDENCIES","name","when","dev","root","AGENT_CORE_CONSTRUCTS_PY_DEPENDENCIES","addAgentCoreInfra","tree","options","iac","addAgentCoreCDKInfra","addAgentCoreTerraformInfra","config","projectName","dirname","appDirectory","overwriteStrategy","KeepExisting","nameKebabCase","containers","boto3Version","boto3","addMcpServerInfra","nameClassName","mcpServerNameClassName","mcpServerNameKebabCase","dockerImageTag","dockerOutputDir","serverProtocol","auth","session","addAgentInfra","agentNameClassName","agentNameKebabCase","addAgentCoreGatewayInfra","declaration","addAgentCoreGatewayCDKInfra","addAgentCoreGatewayTerraformInfra","gatewayNameClassName","gatewayNameKebabCase","projectDirectory","cedarPolicy","protocol","httpxVersion","httpx","mcpVersion","mcp","renderScript","exists","delete","addAgentCoreHarnessInfra","promptPath","projectRoot","templateContext","harnessNameClassName","harnessNameKebabCase","harnessNamePrefix","promptPathFromCdk","promptPathFromTerraform","addAgentCoreHarnessCDKInfra","addAgentCoreHarnessTerraformInfra"],"mappings":"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"}
@@ -605,7 +605,7 @@ export class AgentCoreGateway extends Construct implements iam.IGrantable {
605
605
  this,
606
606
  'TargetReadinessProbe',
607
607
  {
608
- runtime: lambda.Runtime.NODEJS_22_X,
608
+ runtime: lambda.<%- nodeRuntime %>,
609
609
  handler: 'index.handler',
610
610
  timeout: cdk.Duration.seconds(210),
611
611
  code: lambda.Code.fromAsset(
@@ -8,7 +8,7 @@ import { addDependenciesToPackageJson } from "../dependencies.js";
8
8
  import { esmVars } from "../module-format.js";
9
9
  import { addDependencyToTargetIfNotPresent } from "../nx.js";
10
10
  import { generatedInfrastructure, generatedTerraform, PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, SHARED_TERRAFORM_DIR } from "../shared-constructs-constants.js";
11
- import { PY_VERSIONS, terraformProviderVersions, withVersions } from "../versions.js";
11
+ import { cdkLambdaRuntimeVars, PY_VERSIONS, terraformLambdaRuntimeVars, terraformProviderVersions, withVersions } from "../versions.js";
12
12
  /**
13
13
  * Dependencies a caller must declare to add API Gateway infrastructure.
14
14
  *
@@ -67,7 +67,8 @@ export const addApiGatewayInfra = async (tree, options, declaration)=>{
67
67
  */ const addApiGatewayCdkConstructs = async (tree, options, declaration)=>{
68
68
  const generateCoreApiFile = (name)=>{
69
69
  generateFiles(tree, joinPathFragments(import.meta.dirname, 'files', 'cdk', 'core', 'api', name), joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'src', 'core', 'api'), {
70
- ...esmVars(tree)
70
+ ...esmVars(tree),
71
+ ...cdkLambdaRuntimeVars()
71
72
  }, {
72
73
  overwriteStrategy: OverwriteStrategy.KeepExisting
73
74
  });
@@ -94,7 +95,8 @@ export const addApiGatewayInfra = async (tree, options, declaration)=>{
94
95
  // Generate app specific CDK construct
95
96
  generateFiles(tree, joinPathFragments(import.meta.dirname, 'files', 'cdk', 'app', 'apis', options.constructType), joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'src', 'app', 'apis'), {
96
97
  ...options,
97
- ...esmVars(tree)
98
+ ...esmVars(tree),
99
+ ...cdkLambdaRuntimeVars()
98
100
  }, {
99
101
  overwriteStrategy: OverwriteStrategy.KeepExisting
100
102
  });
@@ -116,7 +118,8 @@ export const addApiGatewayInfra = async (tree, options, declaration)=>{
116
118
  generateFiles(tree, joinPathFragments(import.meta.dirname, 'files', 'terraform', 'app', 'apis', options.constructType), joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'app', 'apis'), {
117
119
  ...options,
118
120
  maxRestPathDepth: MAX_REST_PATH_DEPTH,
119
- ...terraformProviderVersions()
121
+ ...terraformProviderVersions(),
122
+ ...terraformLambdaRuntimeVars()
120
123
  }, {
121
124
  overwriteStrategy: OverwriteStrategy.KeepExisting
122
125
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/utils/api-constructs/api-constructs.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addStarExport } from '../ast.js';\nimport {\n type DeclaredPyDependency,\n type DeclaredTsDependency,\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../dependencies.js';\nimport type { Iac } from '../iac.js';\nimport { esmVars } from '../module-format.js';\nimport { addDependencyToTargetIfNotPresent } from '../nx.js';\nimport {\n generatedInfrastructure,\n generatedTerraform,\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n SHARED_TERRAFORM_DIR,\n} from '../shared-constructs-constants.js';\nimport {\n type IPyDepVersion,\n type ITsDepVersion,\n PY_VERSIONS,\n terraformProviderVersions,\n withVersions,\n} from '../versions.js';\n\n/**\n * Dependencies a caller must declare to add API Gateway infrastructure.\n *\n * Gated on infrastructure having been generated: `addApiGatewayInfra` only runs\n * on that branch, so a project generated with `infra: 'none'` never receives\n * these.\n */\nexport const API_CONSTRUCTS_DEPENDENCIES = [\n { name: '@aws-sdk/client-api-gateway', when: generatedInfrastructure },\n { name: '@aws-sdk/client-iam', when: generatedInfrastructure },\n { name: '@trpc/server', when: generatedInfrastructure },\n] as const satisfies readonly DeclaredTsDependency<\n ITsDepVersion,\n IacMetadata\n>[];\n\n/**\n * Python version the generated Terraform pins in the account module's inline\n * `uv run --with` script. Nothing installs it, so it is declared for its version\n * alone, and only on the Terraform branch that writes the script.\n */\nexport const API_CONSTRUCTS_PY_DEPENDENCIES = [\n { name: 'boto3', when: generatedTerraform },\n] as const satisfies readonly DeclaredPyDependency<\n IPyDepVersion,\n IacMetadata\n>[];\n\n/**\n * Path segments a REST API operation may have in the generated Terraform.\n *\n * API Gateway REST APIs need a resource per path segment, and instances of a\n * Terraform resource cannot reference one another\n * (https://github.com/hashicorp/terraform/issues/26697), so the module declares\n * one resource per level up to this depth. Deeper paths fail the plan with a\n * message pointing at the fix. Empty levels create no resources, so the only\n * cost of the headroom is the generated configuration itself.\n */\nconst MAX_REST_PATH_DEPTH = 16;\n\ninterface BackendOptions {\n type: 'trpc' | 'fastapi' | 'smithy';\n integrationPattern: 'isolated' | 'shared';\n}\n\nexport interface TrpcBackendOptions extends BackendOptions {\n type: 'trpc';\n projectAlias: string;\n bundleOutputDir: string;\n authorizerBundleOutputDir?: string;\n}\n\nexport interface FastApiBackendOptions extends BackendOptions {\n type: 'fastapi';\n moduleName: string;\n bundleOutputDir: string;\n}\n\nexport interface SmithyBackendOptions extends BackendOptions {\n type: 'smithy';\n bundleOutputDir: string;\n authorizerBundleOutputDir?: string;\n}\n\nexport interface AddApiGatewayConstructOptions {\n apiProjectName: string;\n apiNameClassName: string;\n apiNameKebabCase: string;\n constructType: 'http' | 'rest';\n backend: TrpcBackendOptions | FastApiBackendOptions | SmithyBackendOptions;\n auth: 'iam' | 'cognito' | 'custom';\n}\n\nexport const addApiGatewayInfra = async <const D extends DependencyDeclaration>(\n tree: Tree,\n options: AddApiGatewayConstructOptions & { iac: Iac },\n declaration: D & MustDeclare<typeof API_CONSTRUCTS_DEPENDENCIES, D>,\n) => {\n if (options.iac === 'cdk') {\n await addApiGatewayCdkConstructs(tree, options, declaration);\n } else if (options.iac === 'terraform') {\n addApiGatewayTerraformModules(tree, options);\n } else {\n throw new Error(`Unsupported iac ${options.iac}`);\n }\n\n updateJson(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n options.iac === 'cdk' ? SHARED_CONSTRUCTS_DIR : SHARED_TERRAFORM_DIR,\n 'project.json',\n ),\n (config: ProjectConfiguration) => {\n addDependencyToTargetIfNotPresent(\n config,\n 'build',\n `${options.apiProjectName}:build`,\n );\n return config;\n },\n );\n};\n\n/**\n * Add an API CDK construct, and update the Runtime Config type to export its url\n */\nconst addApiGatewayCdkConstructs = async (\n tree: Tree,\n options: AddApiGatewayConstructOptions,\n declaration: DependencyDeclaration,\n) => {\n const generateCoreApiFile = (name: string) => {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'core',\n 'api',\n name,\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'core',\n 'api',\n ),\n { ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n };\n\n // Generate relevant core CDK construct and utilities\n generateCoreApiFile(options.constructType);\n generateCoreApiFile('utils');\n if (options.backend.type === 'trpc') {\n generateCoreApiFile('trpc');\n }\n\n // Declare the deps the generated core construct files import.\n const constructDeps: (typeof API_CONSTRUCTS_DEPENDENCIES)[number]['name'][] =\n [];\n if (options.constructType === 'rest') {\n // REST account construct configures the account via the AWS SDK.\n constructDeps.push('@aws-sdk/client-api-gateway', '@aws-sdk/client-iam');\n }\n if (options.backend.type === 'trpc') {\n // trpc-utils.ts types the router with @trpc/server.\n constructDeps.push('@trpc/server');\n }\n if (constructDeps.length > 0) {\n addDependenciesToPackageJson(\n tree,\n withVersions(\n forDependencies<typeof API_CONSTRUCTS_DEPENDENCIES>(declaration),\n constructDeps,\n ),\n {},\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'package.json'),\n );\n }\n\n // Generate app specific CDK construct\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'app',\n 'apis',\n options.constructType,\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'apis',\n ),\n { ...options, ...esmVars(tree) },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Export app specific CDK construct\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'apis',\n 'index.ts',\n ),\n `./${options.apiNameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n './apis/index.js',\n );\n};\n\n/**\n * Add an API terraform module, and update the Runtime Config type to export its url\n */\nconst addApiGatewayTerraformModules = (\n tree: Tree,\n options: AddApiGatewayConstructOptions,\n) => {\n // Generate core terraform module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'core',\n 'api',\n options.constructType,\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'core', 'api'),\n { boto3Version: PY_VERSIONS.boto3, ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate app specific terraform module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'apis',\n options.constructType,\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'app', 'apis'),\n {\n ...options,\n maxRestPathDepth: MAX_REST_PATH_DEPTH,\n ...terraformProviderVersions(),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addStarExport","forDependencies","addDependenciesToPackageJson","esmVars","addDependencyToTargetIfNotPresent","generatedInfrastructure","generatedTerraform","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","SHARED_TERRAFORM_DIR","PY_VERSIONS","terraformProviderVersions","withVersions","API_CONSTRUCTS_DEPENDENCIES","name","when","API_CONSTRUCTS_PY_DEPENDENCIES","MAX_REST_PATH_DEPTH","addApiGatewayInfra","tree","options","declaration","iac","addApiGatewayCdkConstructs","addApiGatewayTerraformModules","Error","config","apiProjectName","generateCoreApiFile","dirname","overwriteStrategy","KeepExisting","constructType","backend","type","constructDeps","push","length","apiNameKebabCase","boto3Version","boto3","maxRestPathDepth"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/utils/api-constructs/api-constructs.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type ProjectConfiguration,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addStarExport } from '../ast.js';\nimport {\n type DeclaredPyDependency,\n type DeclaredTsDependency,\n type DependencyDeclaration,\n forDependencies,\n type MustDeclare,\n} from '../declared-dependencies.js';\nimport { addDependenciesToPackageJson } from '../dependencies.js';\nimport type { Iac } from '../iac.js';\nimport { esmVars } from '../module-format.js';\nimport { addDependencyToTargetIfNotPresent } from '../nx.js';\nimport {\n generatedInfrastructure,\n generatedTerraform,\n type IacMetadata,\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n SHARED_TERRAFORM_DIR,\n} from '../shared-constructs-constants.js';\nimport {\n cdkLambdaRuntimeVars,\n type IPyDepVersion,\n type ITsDepVersion,\n PY_VERSIONS,\n terraformLambdaRuntimeVars,\n terraformProviderVersions,\n withVersions,\n} from '../versions.js';\n\n/**\n * Dependencies a caller must declare to add API Gateway infrastructure.\n *\n * Gated on infrastructure having been generated: `addApiGatewayInfra` only runs\n * on that branch, so a project generated with `infra: 'none'` never receives\n * these.\n */\nexport const API_CONSTRUCTS_DEPENDENCIES = [\n { name: '@aws-sdk/client-api-gateway', when: generatedInfrastructure },\n { name: '@aws-sdk/client-iam', when: generatedInfrastructure },\n { name: '@trpc/server', when: generatedInfrastructure },\n] as const satisfies readonly DeclaredTsDependency<\n ITsDepVersion,\n IacMetadata\n>[];\n\n/**\n * Python version the generated Terraform pins in the account module's inline\n * `uv run --with` script. Nothing installs it, so it is declared for its version\n * alone, and only on the Terraform branch that writes the script.\n */\nexport const API_CONSTRUCTS_PY_DEPENDENCIES = [\n { name: 'boto3', when: generatedTerraform },\n] as const satisfies readonly DeclaredPyDependency<\n IPyDepVersion,\n IacMetadata\n>[];\n\n/**\n * Path segments a REST API operation may have in the generated Terraform.\n *\n * API Gateway REST APIs need a resource per path segment, and instances of a\n * Terraform resource cannot reference one another\n * (https://github.com/hashicorp/terraform/issues/26697), so the module declares\n * one resource per level up to this depth. Deeper paths fail the plan with a\n * message pointing at the fix. Empty levels create no resources, so the only\n * cost of the headroom is the generated configuration itself.\n */\nconst MAX_REST_PATH_DEPTH = 16;\n\ninterface BackendOptions {\n type: 'trpc' | 'fastapi' | 'smithy';\n integrationPattern: 'isolated' | 'shared';\n}\n\nexport interface TrpcBackendOptions extends BackendOptions {\n type: 'trpc';\n projectAlias: string;\n bundleOutputDir: string;\n authorizerBundleOutputDir?: string;\n}\n\nexport interface FastApiBackendOptions extends BackendOptions {\n type: 'fastapi';\n moduleName: string;\n bundleOutputDir: string;\n}\n\nexport interface SmithyBackendOptions extends BackendOptions {\n type: 'smithy';\n bundleOutputDir: string;\n authorizerBundleOutputDir?: string;\n}\n\nexport interface AddApiGatewayConstructOptions {\n apiProjectName: string;\n apiNameClassName: string;\n apiNameKebabCase: string;\n constructType: 'http' | 'rest';\n backend: TrpcBackendOptions | FastApiBackendOptions | SmithyBackendOptions;\n auth: 'iam' | 'cognito' | 'custom';\n}\n\nexport const addApiGatewayInfra = async <const D extends DependencyDeclaration>(\n tree: Tree,\n options: AddApiGatewayConstructOptions & { iac: Iac },\n declaration: D & MustDeclare<typeof API_CONSTRUCTS_DEPENDENCIES, D>,\n) => {\n if (options.iac === 'cdk') {\n await addApiGatewayCdkConstructs(tree, options, declaration);\n } else if (options.iac === 'terraform') {\n addApiGatewayTerraformModules(tree, options);\n } else {\n throw new Error(`Unsupported iac ${options.iac}`);\n }\n\n updateJson(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n options.iac === 'cdk' ? SHARED_CONSTRUCTS_DIR : SHARED_TERRAFORM_DIR,\n 'project.json',\n ),\n (config: ProjectConfiguration) => {\n addDependencyToTargetIfNotPresent(\n config,\n 'build',\n `${options.apiProjectName}:build`,\n );\n return config;\n },\n );\n};\n\n/**\n * Add an API CDK construct, and update the Runtime Config type to export its url\n */\nconst addApiGatewayCdkConstructs = async (\n tree: Tree,\n options: AddApiGatewayConstructOptions,\n declaration: DependencyDeclaration,\n) => {\n const generateCoreApiFile = (name: string) => {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'core',\n 'api',\n name,\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'core',\n 'api',\n ),\n { ...esmVars(tree), ...cdkLambdaRuntimeVars() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n };\n\n // Generate relevant core CDK construct and utilities\n generateCoreApiFile(options.constructType);\n generateCoreApiFile('utils');\n if (options.backend.type === 'trpc') {\n generateCoreApiFile('trpc');\n }\n\n // Declare the deps the generated core construct files import.\n const constructDeps: (typeof API_CONSTRUCTS_DEPENDENCIES)[number]['name'][] =\n [];\n if (options.constructType === 'rest') {\n // REST account construct configures the account via the AWS SDK.\n constructDeps.push('@aws-sdk/client-api-gateway', '@aws-sdk/client-iam');\n }\n if (options.backend.type === 'trpc') {\n // trpc-utils.ts types the router with @trpc/server.\n constructDeps.push('@trpc/server');\n }\n if (constructDeps.length > 0) {\n addDependenciesToPackageJson(\n tree,\n withVersions(\n forDependencies<typeof API_CONSTRUCTS_DEPENDENCIES>(declaration),\n constructDeps,\n ),\n {},\n joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'package.json'),\n );\n }\n\n // Generate app specific CDK construct\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'cdk',\n 'app',\n 'apis',\n options.constructType,\n ),\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'apis',\n ),\n { ...options, ...esmVars(tree), ...cdkLambdaRuntimeVars() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Export app specific CDK construct\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'apis',\n 'index.ts',\n ),\n `./${options.apiNameKebabCase}.js`,\n );\n await addStarExport(\n tree,\n joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'index.ts',\n ),\n './apis/index.js',\n );\n};\n\n/**\n * Add an API terraform module, and update the Runtime Config type to export its url\n */\nconst addApiGatewayTerraformModules = (\n tree: Tree,\n options: AddApiGatewayConstructOptions,\n) => {\n // Generate core terraform module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'core',\n 'api',\n options.constructType,\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'core', 'api'),\n { boto3Version: PY_VERSIONS.boto3, ...terraformProviderVersions() },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate app specific terraform module\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n 'files',\n 'terraform',\n 'app',\n 'apis',\n options.constructType,\n ),\n joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'app', 'apis'),\n {\n ...options,\n maxRestPathDepth: MAX_REST_PATH_DEPTH,\n ...terraformProviderVersions(),\n ...terraformLambdaRuntimeVars(),\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n};\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addStarExport","forDependencies","addDependenciesToPackageJson","esmVars","addDependencyToTargetIfNotPresent","generatedInfrastructure","generatedTerraform","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","SHARED_TERRAFORM_DIR","cdkLambdaRuntimeVars","PY_VERSIONS","terraformLambdaRuntimeVars","terraformProviderVersions","withVersions","API_CONSTRUCTS_DEPENDENCIES","name","when","API_CONSTRUCTS_PY_DEPENDENCIES","MAX_REST_PATH_DEPTH","addApiGatewayInfra","tree","options","declaration","iac","addApiGatewayCdkConstructs","addApiGatewayTerraformModules","Error","config","apiProjectName","generateCoreApiFile","dirname","overwriteStrategy","KeepExisting","constructType","backend","type","constructDeps","push","length","apiNameKebabCase","boto3Version","boto3","maxRestPathDepth"],"mappings":"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"}
@@ -111,7 +111,7 @@ export class <%= apiNameClassName %><
111
111
  <%_ } _%>
112
112
  defaultIntegrationOptions: {
113
113
  <%_ if (['trpc', 'smithy'].includes(backend.type)) { _%>
114
- runtime: Runtime.NODEJS_LATEST,
114
+ runtime: <%- nodeRuntime %>,
115
115
  handler: 'index.handler',
116
116
  code: Code.fromAsset(
117
117
  url.fileURLToPath(
@@ -122,7 +122,7 @@ export class <%= apiNameClassName %><
122
122
  ),
123
123
  ),
124
124
  <%_ } else if (backend.type === 'fastapi') { _%>
125
- runtime: Runtime.PYTHON_3_14,
125
+ runtime: <%- pythonRuntime %>,
126
126
  handler: 'run.sh',
127
127
  code: Code.fromAsset(
128
128
  url.fileURLToPath(
@@ -179,7 +179,7 @@ export class <%= apiNameClassName %><
179
179
  <%_ if (auth === 'custom') { _%>
180
180
  const authorizerFunction = new Function(scope, '<%= apiNameClassName %>AuthorizerFunction', {
181
181
  <%_ if (['trpc', 'smithy'].includes(backend.type)) { _%>
182
- runtime: Runtime.NODEJS_LATEST,
182
+ runtime: <%- nodeRuntime %>,
183
183
  handler: 'index.handler',
184
184
  code: Code.fromAsset(
185
185
  url.fileURLToPath(
@@ -190,7 +190,7 @@ export class <%= apiNameClassName %><
190
190
  ),
191
191
  ),
192
192
  <%_ } else if (backend.type === 'fastapi') { _%>
193
- runtime: Runtime.PYTHON_3_14,
193
+ runtime: <%- pythonRuntime %>,
194
194
  handler: '<%- backend.moduleName %>.authorizer.handler',
195
195
  code: Code.fromAsset(
196
196
  url.fileURLToPath(
@@ -121,7 +121,7 @@ export class <%= apiNameClassName %><
121
121
  <%_ } _%>
122
122
  defaultIntegrationOptions: {
123
123
  <%_ if (['trpc', 'smithy'].includes(backend.type)) { _%>
124
- runtime: Runtime.NODEJS_LATEST,
124
+ runtime: <%- nodeRuntime %>,
125
125
  handler: 'index.handler',
126
126
  code: Code.fromAsset(
127
127
  url.fileURLToPath(
@@ -132,7 +132,7 @@ export class <%= apiNameClassName %><
132
132
  ),
133
133
  ),
134
134
  <%_ } else if (backend.type === 'fastapi') { _%>
135
- runtime: Runtime.PYTHON_3_14,
135
+ runtime: <%- pythonRuntime %>,
136
136
  handler: 'run.sh',
137
137
  code: Code.fromAsset(
138
138
  url.fileURLToPath(
@@ -199,7 +199,7 @@ export class <%= apiNameClassName %><
199
199
  <%_ if (auth === 'custom') { _%>
200
200
  const authorizerFunction = new Function(scope, '<%= apiNameClassName %>AuthorizerFunction', {
201
201
  <%_ if (['trpc', 'smithy'].includes(backend.type)) { _%>
202
- runtime: Runtime.NODEJS_LATEST,
202
+ runtime: <%- nodeRuntime %>,
203
203
  handler: 'index.handler',
204
204
  code: Code.fromAsset(
205
205
  url.fileURLToPath(
@@ -210,7 +210,7 @@ export class <%= apiNameClassName %><
210
210
  ),
211
211
  ),
212
212
  <%_ } else if (backend.type === 'fastapi') { _%>
213
- runtime: Runtime.PYTHON_3_14,
213
+ runtime: <%- pythonRuntime %>,
214
214
  handler: '<%- backend.moduleName %>.authorizer.handler',
215
215
  code: Code.fromAsset(
216
216
  url.fileURLToPath(
@@ -46,7 +46,7 @@ export class ApiGatewayAccount extends Construct {
46
46
  cloudWatchRole.applyRemovalPolicy(RemovalPolicy.RETAIN);
47
47
 
48
48
  const onEvent = new Function(this, 'OnEvent', {
49
- runtime: Runtime.NODEJS_LATEST,
49
+ runtime: <%- nodeRuntime %>,
50
50
  handler: 'index.handler',
51
51
  timeout: Duration.minutes(2),
52
52
  code: Code.fromAsset(
@@ -265,10 +265,10 @@ resource "aws_lambda_function" "api_lambda" {
265
265
  <%_ } _%>
266
266
  <%_ if (['trpc', 'smithy'].includes(backend.type)) { _%>
267
267
  handler = "index.handler"
268
- runtime = "nodejs22.x"
268
+ runtime = "<%- nodeRuntime %>"
269
269
  <%_ } else if (backend.type === 'fastapi') { _%>
270
270
  handler = "run.sh"
271
- runtime = "python3.14"
271
+ runtime = "<%- pythonRuntime %>"
272
272
  layers = ["arn:aws:lambda:${data.aws_region.current.region}:753240598075:layer:LambdaAdapterLayerX86:24"]
273
273
  <%_ } _%>
274
274
  timeout = 30
@@ -494,10 +494,10 @@ resource "aws_lambda_function" "authorizer_lambda" {
494
494
  role = aws_iam_role.authorizer_execution_role.arn
495
495
  <%_ if (['trpc', 'smithy'].includes(backend.type)) { _%>
496
496
  handler = "index.handler"
497
- runtime = "nodejs22.x"
497
+ runtime = "<%- nodeRuntime %>"
498
498
  <%_ } else if (backend.type === 'fastapi') { _%>
499
499
  handler = "<%- backend.moduleName %>.authorizer.handler"
500
- runtime = "python3.14"
500
+ runtime = "<%- pythonRuntime %>"
501
501
  <%_ } _%>
502
502
  timeout = 10
503
503
  memory_size = 128
@@ -319,10 +319,10 @@ resource "aws_lambda_function" "api_lambda" {
319
319
  <%_ } _%>
320
320
  <%_ if (['trpc', 'smithy'].includes(backend.type)) { _%>
321
321
  handler = "index.handler"
322
- runtime = "nodejs22.x"
322
+ runtime = "<%- nodeRuntime %>"
323
323
  <%_ } else if (backend.type === 'fastapi') { _%>
324
324
  handler = "run.sh"
325
- runtime = "python3.14"
325
+ runtime = "<%- pythonRuntime %>"
326
326
  layers = ["arn:aws:lambda:${data.aws_region.current.region}:753240598075:layer:LambdaAdapterLayerX86:24"]
327
327
  <%_ } _%>
328
328
  timeout = 30
@@ -544,10 +544,10 @@ resource "aws_lambda_function" "authorizer_lambda" {
544
544
  role = aws_iam_role.authorizer_execution_role.arn
545
545
  <%_ if (['trpc', 'smithy'].includes(backend.type)) { _%>
546
546
  handler = "index.handler"
547
- runtime = "nodejs22.x"
547
+ runtime = "<%- nodeRuntime %>"
548
548
  <%_ } else if (backend.type === 'fastapi') { _%>
549
549
  handler = "<%- backend.moduleName %>.authorizer.handler"
550
- runtime = "python3.14"
550
+ runtime = "<%- pythonRuntime %>"
551
551
  <%_ } _%>
552
552
  timeout = 10
553
553
  memory_size = 128
@@ -59,6 +59,19 @@ export declare const captureGritQL: (tree: Tree, filePath: string, pattern: stri
59
59
  * for `$mod`) instead of the whole matched node.
60
60
  */
61
61
  export declare const captureGritQLVariable: (tree: Tree, filePath: string, pattern: string, variableName: string) => Promise<string | undefined>;
62
+ /**
63
+ * Like {@link captureAllGritQL}, but returns one metavariable's binding for every
64
+ * match rather than the whole matched node.
65
+ *
66
+ * This is what lets a caller work on the value a pattern isolated — matching
67
+ * `` `runtime: $value` `` and reading `$value` gives `Runtime.NODEJS_24_X` alone,
68
+ * so nothing downstream has to re-derive the assignment around it.
69
+ *
70
+ * A match whose metavariable is unbound contributes nothing, so the result holds
71
+ * only real bindings. Returns undefined if the pattern could not be applied,
72
+ * which an empty array cannot express.
73
+ */
74
+ export declare const captureAllGritQLVariable: (tree: Tree, filePath: string, pattern: string, variableName: string) => Promise<string[] | undefined>;
62
75
  /**
63
76
  * Return the text of every node matching the GritQL pattern, in document order.
64
77
  */