@aws/nx-plugin 1.0.5 → 1.0.7

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 (63) hide show
  1. package/LICENSE-THIRD-PARTY +71 -93
  2. package/migrations.json +15 -5
  3. package/package.json +6 -6
  4. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +1 -1
  5. package/src/infra/app/__snapshots__/generator.spec.ts.snap +3 -3
  6. package/src/migrations/latest/pin-strands-express-peer/metadata.json +3 -0
  7. package/src/migrations/latest/pin-strands-express-peer/migration.d.ts +29 -0
  8. package/src/migrations/latest/pin-strands-express-peer/migration.js +58 -0
  9. package/src/migrations/latest/pin-strands-express-peer/migration.js.map +1 -0
  10. package/src/migrations/latest/rdb-drop-lambda-rie/metadata.json +3 -0
  11. package/src/migrations/latest/rdb-drop-lambda-rie/migration.js +105 -0
  12. package/src/migrations/latest/rdb-drop-lambda-rie/migration.js.map +1 -0
  13. package/src/migrations/v1.0.5/0001-api-custom-domain-runtime-config/migration.d.ts +6 -0
  14. package/src/migrations/v1.0.5/0001-api-custom-domain-runtime-config/migration.js.map +1 -0
  15. package/src/preset/__snapshots__/generator.spec.ts.snap +2 -2
  16. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +6 -6
  17. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +8 -8
  18. package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +4 -4
  19. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  20. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +12 -12
  21. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  22. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +4 -4
  23. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +22 -10
  24. package/src/py/rdb/files/Dockerfile.create-db-user.template +5 -2
  25. package/src/py/rdb/files/Dockerfile.migration.template +5 -2
  26. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +5 -5
  27. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +8 -8
  28. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +12 -12
  29. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +4 -4
  30. package/src/ts/agent/a2a-connection/generator.d.ts +26 -30
  31. package/src/ts/agent/a2a-connection/generator.js +9 -5
  32. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  33. package/src/ts/agent/gateway-connection/generator.d.ts +5 -7
  34. package/src/ts/agent/gateway-connection/generator.js +12 -0
  35. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  36. package/src/ts/agent/generator.d.ts +3 -8
  37. package/src/ts/agent/generator.js +16 -2
  38. package/src/ts/agent/generator.js.map +1 -1
  39. package/src/ts/agent/mcp-connection/generator.d.ts +5 -7
  40. package/src/ts/agent/mcp-connection/generator.js +12 -0
  41. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  42. package/src/ts/astro-docs/generator.d.ts +4 -4
  43. package/src/ts/astro-docs/generator.js +10 -4
  44. package/src/ts/astro-docs/generator.js.map +1 -1
  45. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +1 -1
  46. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  47. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  48. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +2 -2
  49. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +10 -8
  50. package/src/ts/rdb/files/Dockerfile.template +4 -2
  51. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +21 -21
  52. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +2 -2
  53. package/src/utils/agent-connection/agent-connection.d.ts +28 -5
  54. package/src/utils/agent-connection/agent-connection.js +39 -14
  55. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  56. package/src/utils/docker.d.ts +1 -1
  57. package/src/utils/versions.d.ts +57 -57
  58. package/src/utils/versions.js +56 -56
  59. package/src/utils/versions.js.map +1 -1
  60. package/src/migrations/latest/api-custom-domain-runtime-config/migration.js.map +0 -1
  61. /package/src/migrations/latest/{api-custom-domain-runtime-config → rdb-drop-lambda-rie}/migration.d.ts +0 -0
  62. /package/src/migrations/{latest/api-custom-domain-runtime-config → v1.0.5/0001-api-custom-domain-runtime-config}/metadata.json +0 -0
  63. /package/src/migrations/{latest/api-custom-domain-runtime-config → v1.0.5/0001-api-custom-domain-runtime-config}/migration.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.0.5/0001-api-custom-domain-runtime-config/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type MigrationReturnObject,\n type Tree,\n} from '@nx/devkit';\nimport {\n addDestructuredImport,\n applyGritQL,\n GRIT_INSERT_PLACEHOLDER,\n insertViaGritQL,\n matchGritQL,\n} from '../../../utils/ast.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport {\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n SHARED_TERRAFORM_DIR,\n} from '../../../utils/shared-constructs-constants.js';\n\n/**\n * Publish an API's custom domain, when one is configured, as its URL in runtime\n * config, so clients call it rather than the generated execute-api endpoint.\n *\n * - The vended CDK `RestApi` publishes `https://<domainName>/[<basePath>/]` when\n * `domainName` is set.\n * - The vended CDK `HttpApi` forwards `defaultDomainMapping` to the stage it\n * creates (previously rejected by CDK, since the construct disables the\n * default stage) and publishes the mapping's domain URL.\n * - Each vended Terraform API app module (`app/apis/<name>/<name>.tf`) gains\n * `custom_domain_name` / `acm_certificate_arn` variables, the domain and\n * mapping resources, an `api_url` local published in runtime config, and\n * outputs for the URL and DNS record targets.\n *\n * These files are generated with `KeepExisting`, so an upgraded workspace keeps\n * the old shape until this runs. Diverged files are left untouched and\n * reported via `nextSteps`.\n */\n\nconst CONSTRUCTS_API_DIR = `${PACKAGES_DIR}/${SHARED_CONSTRUCTS_DIR}/src/core/api`;\nconst REST_API_CONSTRUCT = `${CONSTRUCTS_API_DIR}/rest-api.ts`;\nconst HTTP_API_CONSTRUCT = `${CONSTRUCTS_API_DIR}/http-api.ts`;\nconst TERRAFORM_APIS_DIR = `${PACKAGES_DIR}/${SHARED_TERRAFORM_DIR}/src/app/apis`;\n\nconst hcl = (pattern: string) => `language hcl\\n${pattern}`;\n\n/** Whether the pattern matches any `.tf` file in the Terraform module directory. */\nconst matchesInModule = async (\n tree: Tree,\n moduleDir: string,\n pattern: string,\n) => {\n for (const child of tree.children(moduleDir)) {\n const path = joinPathFragments(moduleDir, child);\n if (\n child.endsWith('.tf') &&\n tree.isFile(path) &&\n (await matchGritQL(tree, path, pattern))\n ) {\n return true;\n }\n }\n return false;\n};\n\n/** Whether every pattern matches the file. */\nconst matchesAll = async (tree: Tree, file: string, patterns: string[]) => {\n for (const pattern of patterns) {\n if (!(await matchGritQL(tree, file, pattern))) {\n return false;\n }\n }\n return true;\n};\n\nconst REST_RUNTIME_CONFIG_URL = `domainName\n ? \\`https://\\${domainName.domainName}/\\${domainName.basePath ? \\`\\${domainName.basePath}/\\` : ''}\\`\n : this.api.url!`;\n\nconst REST_DOMAIN_OUTPUTS = `// Target for the custom domain's DNS record\n if (domainName) {\n new CfnOutput(this, \\`\\${apiName}DomainNameAlias\\`, {\n value: this.api.domainName!.domainNameAliasDomainName,\n description:\n 'Domain name of the API Gateway endpoint (regional or edge) to point a CNAME record at for the custom domain, with any DNS provider',\n });\n new CfnOutput(this, \\`\\${apiName}DomainNameAliasHostedZoneId\\`, {\n value: this.api.domainName!.domainNameAliasHostedZoneId,\n description:\n 'Hosted zone ID of that domain name, needed only for a Route 53 alias record',\n });\n }`;\n\nconst HTTP_DOMAIN_OUTPUTS = `// Target for the custom domain's DNS record\n if (defaultDomainMapping) {\n new CfnOutput(this, \\`\\${apiName}DomainNameAlias\\`, {\n value: defaultDomainMapping.domainName.regionalDomainName,\n description:\n 'Regional domain name to point a CNAME record at for the custom domain, with any DNS provider',\n });\n new CfnOutput(this, \\`\\${apiName}DomainNameAliasHostedZoneId\\`, {\n value: defaultDomainMapping.domainName.regionalHostedZoneId,\n description:\n 'Hosted zone ID of the regional domain name, needed only for a Route 53 alias record',\n });\n }`;\n\nconst HTTP_DOMAIN_MAPPING_PROP = `/**\n * Custom domain mapped to the API's default stage\n */\n readonly defaultDomainMapping?: DomainMappingOptions & {\n readonly domainName: IDomainName;\n }`;\n\n/** Matches a DNS record output this migration adds. */\nconst DOMAIN_ALIAS_OUTPUT =\n '`new CfnOutput(this, $id, $_)` where { $id <: r\".*DomainNameAlias.*\" }';\n\n/** Rewrite inserting {@link GRIT_INSERT_PLACEHOLDER} after the runtime config registration. */\nconst AFTER_RUNTIME_CONFIG = `\\`$call;\\` as $statement where {\n $call <: \\`rc.set('connection', 'apis', $_)\\`,\n $statement => \\`$call;\\n\\n ${GRIT_INSERT_PLACEHOLDER}\\`\n}`;\n\nconst migrateRestApiConstruct = async (tree: Tree, nextSteps: string[]) => {\n const file = REST_API_CONSTRUCT;\n if (!tree.exists(file)) {\n return;\n }\n\n if (await matchGritQL(tree, file, '`[apiName]: domainName ? $_ : $_`')) {\n return; // Already migrated.\n }\n\n const shape = [\n '`{ $params }: RestApiProps<$_, $_>` where { $params <: contains `...props`, $params <: not contains `domainName` }',\n \"`new _RestApi(this, 'Api', { $props })` where { $props <: contains `...props`, $props <: not contains `domainName` }\",\n \"`rc.set('connection', 'apis', { $entries })` where { $entries <: contains `[apiName]: this.api.url!` }\",\n ];\n if (\n !(await matchesAll(tree, file, shape)) ||\n (await matchGritQL(tree, file, DOMAIN_ALIAS_OUTPUT))\n ) {\n nextSteps.push(\n `${file}: has diverged from the generated shape - left untouched. To publish a configured custom domain to clients, destructure \\`domainName\\` from the constructor props and pass it to the CDK RestApi, register \\`https://\\${domainName.domainName}/\\` (plus any \\`basePath\\`) under \\`[apiName]\\` in the \\`rc.set('connection', 'apis', ...)\\` call when it is set instead of \\`this.api.url\\`, and output \\`this.api.domainName.domainNameAliasDomainName\\` / \\`domainNameAliasHostedZoneId\\` for the DNS record.`,\n );\n return;\n }\n\n // Taken out of `props` and passed explicitly, so it is in scope below.\n await applyGritQL(\n tree,\n file,\n '`{ $params }: RestApiProps<$_, $_>` where { $params <: contains `...props` as $rest, $rest => `domainName,\\n ...props` }',\n );\n await applyGritQL(\n tree,\n file,\n \"`new _RestApi(this, 'Api', { $props })` where { $props <: contains `...props` as $spread, $spread => `...props,\\n domainName` }\",\n );\n await insertViaGritQL(\n tree,\n file,\n \"`rc.set('connection', 'apis', { $entries })` where { $entries <: contains `[apiName]: this.api.url!` as $url, $url => `[apiName]: __GRIT_INSERT_PLACEHOLDER__` }\",\n REST_RUNTIME_CONFIG_URL,\n );\n await insertViaGritQL(tree, file, AFTER_RUNTIME_CONFIG, REST_DOMAIN_OUTPUTS);\n // Listed first, as the generator vends it.\n const imported = await applyGritQL(\n tree,\n file,\n \"`import { $names } from 'aws-cdk-lib'` where { $names <: not contains `CfnOutput` } => `import { CfnOutput, $names } from 'aws-cdk-lib'`\",\n );\n if (!imported) {\n await addDestructuredImport(tree, file, ['CfnOutput'], 'aws-cdk-lib');\n }\n};\n\nconst HTTP_API_URL_FIELD = `/** The URL clients call: the custom domain's if one is mapped, otherwise the stage's */\n private readonly apiUrl: string`;\n\nconst HTTP_API_URL_ASSIGNMENT = `this.apiUrl = defaultDomainMapping\n ? this.defaultStage.domainUrl\n : this.defaultStage.url!;`;\n\n/** Matches the vended `url` getter, returning the stage URL. */\nconst HTTP_URL_GETTER =\n 'method_definition(name=$name, body=$body) where { $name <: `url`, $body <: contains `return this.defaultStage.url` }';\n\nconst migrateHttpApiConstruct = async (tree: Tree, nextSteps: string[]) => {\n const file = HTTP_API_CONSTRUCT;\n if (!tree.exists(file)) {\n return;\n }\n\n if (await matchGritQL(tree, file, '`[apiName]: this.apiUrl`')) {\n return; // Already migrated.\n }\n\n const shape = [\n 'interface_declaration(name=$name, body=$body) as $interface where { $name <: `HttpApiProps`, $interface <: contains extends_type_clause() as $extends, $extends <: contains `_HttpApiProps`, $extends <: not contains `Omit`, $body <: contains `readonly throttle?: ThrottleSettings`, $body <: not contains `defaultDomainMapping` }',\n \"`import { $names } from 'aws-cdk-lib/aws-apigatewayv2'` where { $names <: contains `HttpApi as _HttpApi`, $names <: contains `HttpStage`, $names <: not contains `DomainMappingOptions`, $names <: not contains `IDomainName` }\",\n '`public readonly defaultStage: HttpStage`',\n '`{ $params }: HttpApiProps<$_, $_>` where { $params <: contains `...props`, $params <: not contains `defaultDomainMapping` }',\n \"`this.defaultStage = new HttpStage(this, 'DefaultStage', { $props })` where { $props <: contains `httpApi: this.api`, $props <: not contains `domainMapping` }\",\n '`new CfnOutput(this, $_, { $props })` where { $props <: contains `value: this.defaultStage.url!` }',\n \"`rc.set('connection', 'apis', { $entries })` where { $entries <: contains `[apiName]: this.defaultStage.url!` }\",\n HTTP_URL_GETTER,\n ];\n if (\n !(await matchesAll(tree, file, shape)) ||\n (await matchGritQL(tree, file, DOMAIN_ALIAS_OUTPUT)) ||\n (await matchGritQL(tree, file, '`this.apiUrl`'))\n ) {\n nextSteps.push(\n `${file}: has diverged from the generated shape - left untouched. To support a custom domain, destructure \\`defaultDomainMapping\\` from the constructor props (so it is not passed to the CDK HttpApi, which rejects it when the default stage is disabled) and pass it as \\`domainMapping\\` to the \\`DefaultStage\\` HttpStage; use \\`this.defaultStage.domainUrl\\` instead of \\`this.defaultStage.url\\` when it is set, for the \\`<apiName>Url\\` output, runtime config and the \\`url\\` getter; and output \\`defaultDomainMapping.domainName.regionalDomainName\\` / \\`regionalHostedZoneId\\` for the DNS record.`,\n );\n return;\n }\n\n // Typed as a domain exposing its regional attributes, for the DNS outputs.\n await insertViaGritQL(\n tree,\n file,\n 'interface_declaration(name=$name, body=$body) where { $name <: `HttpApiProps`, $body <: contains `readonly throttle?: ThrottleSettings` as $throttle, $throttle => `readonly throttle?: ThrottleSettings;\\n __GRIT_INSERT_PLACEHOLDER__` }',\n HTTP_DOMAIN_MAPPING_PROP,\n );\n // Only the `_HttpApiProps` base is replaced, keeping any others.\n await applyGritQL(\n tree,\n file,\n \"interface_declaration(name=$name) as $interface where { $name <: `HttpApiProps`, $interface <: contains extends_type_clause() as $extends, $extends <: contains `_HttpApiProps` as $base, $base => `Omit<_HttpApiProps, 'defaultDomainMapping'>` }\",\n );\n // Inserted in sorted position, as the generator vends them.\n await applyGritQL(\n tree,\n file,\n \"`import { $names } from 'aws-cdk-lib/aws-apigatewayv2'` where { $names <: contains `HttpApi as _HttpApi` as $httpApi, $httpApi => `DomainMappingOptions,\\n HttpApi as _HttpApi` }\",\n );\n await applyGritQL(\n tree,\n file,\n \"`import { $names } from 'aws-cdk-lib/aws-apigatewayv2'` where { $names <: contains `HttpStage` as $stage, $stage => `HttpStage,\\n IDomainName` }\",\n );\n await insertViaGritQL(\n tree,\n file,\n '`public readonly defaultStage: HttpStage` as $field => `public readonly defaultStage: HttpStage;\\n\\n __GRIT_INSERT_PLACEHOLDER__`',\n HTTP_API_URL_FIELD,\n );\n // Taken out of `props` so it isn't passed to the CDK HttpApi.\n await applyGritQL(\n tree,\n file,\n '`{ $params }: HttpApiProps<$_, $_>` where { $params <: contains `...props` as $rest, $rest => `defaultDomainMapping,\\n ...props` }',\n );\n await applyGritQL(\n tree,\n file,\n \"`new HttpStage(this, 'DefaultStage', { $props })` where { $props <: contains `httpApi: this.api` as $httpApi, $httpApi => `httpApi: this.api,\\n domainMapping: defaultDomainMapping` }\",\n );\n // Computed once, for the stack output, runtime config and the `url` getter.\n await insertViaGritQL(\n tree,\n file,\n `expression_statement() as $statement where {\n $statement <: contains \\`this.defaultStage = new HttpStage($_, $_, $_)\\` as $assignment,\n $statement => \\`$assignment;\\n ${GRIT_INSERT_PLACEHOLDER}\\`\n}`,\n HTTP_API_URL_ASSIGNMENT,\n );\n await applyGritQL(\n tree,\n file,\n '`new CfnOutput(this, $_, { $props })` where { $props <: contains `value: this.defaultStage.url!` as $value, $value => `value: this.apiUrl` }',\n );\n await applyGritQL(\n tree,\n file,\n \"`rc.set('connection', 'apis', { $entries })` where { $entries <: contains `[apiName]: this.defaultStage.url!` as $url, $url => `[apiName]: this.apiUrl` }\",\n );\n await applyGritQL(\n tree,\n file,\n 'method_definition(name=$name, body=$body) where { $name <: `url`, $body <: contains `return this.defaultStage.url` as $return, $return => `return this.apiUrl` }',\n );\n await insertViaGritQL(tree, file, AFTER_RUNTIME_CONFIG, HTTP_DOMAIN_OUTPUTS);\n};\n\nconst TERRAFORM_VARIABLES = `# Custom domain configuration\nvariable \"custom_domain_name\" {\n description = \"Custom domain name for the API. Requires acm_certificate_arn.\"\n type = string\n default = null\n}\n\nvariable \"acm_certificate_arn\" {\n description = \"ARN of an ACM certificate (in the API's region) for the custom domain name.\"\n type = string\n default = null\n}`;\n\n/** The differences between the REST and HTTP Terraform app modules. */\ninterface TerraformApi {\n kind: 'REST' | 'HTTP';\n /** A block only this kind of app module declares. */\n identifyingBlock: string;\n /** Matches exactly the runtime config `value` the app module was generated with. */\n runtimeConfigUrl: string;\n /** Types of the custom domain and mapping resources this migration adds. */\n domainResourceTypes: [string, string];\n domainResources: string;\n /** The `api_url` local, published in runtime config. */\n apiUrlLocal: string;\n outputs: string;\n}\n\nconst REST_TERRAFORM: TerraformApi = {\n kind: 'REST',\n identifyingBlock: '`resource \"aws_api_gateway_stage\" \"api_stage\" { $_ }`',\n runtimeConfigUrl:\n '$v <: r\"\\\\\"\\\\$\\\\{aws_api_gateway_stage\\\\.api_stage\\\\.invoke_url\\\\}/\\\\\"\"',\n domainResourceTypes: [\n 'aws_api_gateway_domain_name',\n 'aws_api_gateway_base_path_mapping',\n ],\n domainResources: `# Custom domain for the API, served without the stage path prefix\nresource \"aws_api_gateway_domain_name\" \"custom_domain\" {\n count = var.custom_domain_name == null ? 0 : 1\n\n domain_name = var.custom_domain_name\n regional_certificate_arn = var.acm_certificate_arn\n security_policy = \"TLS_1_2\"\n\n endpoint_configuration {\n types = [\"REGIONAL\"]\n }\n\n tags = var.tags\n\n lifecycle {\n precondition {\n condition = var.acm_certificate_arn != null\n error_message = \"acm_certificate_arn is required when custom_domain_name is set.\"\n }\n }\n}\n\nresource \"aws_api_gateway_base_path_mapping\" \"custom_domain\" {\n count = var.custom_domain_name == null ? 0 : 1\n\n api_id = module.rest_api.api_id\n stage_name = aws_api_gateway_stage.api_stage.stage_name\n domain_name = aws_api_gateway_domain_name.custom_domain[0].domain_name\n}`,\n apiUrlLocal: `locals {\n api_url = var.custom_domain_name == null ? \"\\${aws_api_gateway_stage.api_stage.invoke_url}/\" : \"https://\\${var.custom_domain_name}/\"\n}`,\n outputs: `output \"api_url\" {\n description = \"URL clients should call: the custom domain if configured, otherwise the stage invoke URL\"\n value = local.api_url\n}\n\noutput \"custom_domain_target_domain_name\" {\n description = \"Target domain name to point a DNS alias or CNAME record at for the custom domain\"\n value = var.custom_domain_name == null ? null : aws_api_gateway_domain_name.custom_domain[0].regional_domain_name\n}\n\noutput \"custom_domain_hosted_zone_id\" {\n description = \"Hosted zone ID to use for a Route 53 alias record for the custom domain\"\n value = var.custom_domain_name == null ? null : aws_api_gateway_domain_name.custom_domain[0].regional_zone_id\n}`,\n};\n\nconst HTTP_TERRAFORM: TerraformApi = {\n kind: 'HTTP',\n identifyingBlock: '`module \"http_api\" { $_ }`',\n runtimeConfigUrl: '$v <: `module.http_api.stage_invoke_url`',\n domainResourceTypes: [\n 'aws_apigatewayv2_domain_name',\n 'aws_apigatewayv2_api_mapping',\n ],\n domainResources: `# Custom domain for the API\nresource \"aws_apigatewayv2_domain_name\" \"custom_domain\" {\n count = var.custom_domain_name == null ? 0 : 1\n\n domain_name = var.custom_domain_name\n\n domain_name_configuration {\n certificate_arn = var.acm_certificate_arn\n endpoint_type = \"REGIONAL\"\n security_policy = \"TLS_1_2\"\n }\n\n tags = var.tags\n\n lifecycle {\n precondition {\n condition = var.acm_certificate_arn != null\n error_message = \"acm_certificate_arn is required when custom_domain_name is set.\"\n }\n }\n}\n\nresource \"aws_apigatewayv2_api_mapping\" \"custom_domain\" {\n count = var.custom_domain_name == null ? 0 : 1\n\n api_id = module.http_api.api_id\n stage = module.http_api.stage_id\n domain_name = aws_apigatewayv2_domain_name.custom_domain[0].domain_name\n}`,\n apiUrlLocal: `locals {\n api_url = var.custom_domain_name == null ? module.http_api.stage_invoke_url : \"https://\\${var.custom_domain_name}/\"\n}`,\n outputs: `output \"api_url\" {\n description = \"URL clients should call: the custom domain if configured, otherwise the stage invoke URL\"\n value = local.api_url\n}\n\noutput \"custom_domain_target_domain_name\" {\n description = \"Target domain name to point a DNS alias or CNAME record at for the custom domain\"\n value = var.custom_domain_name == null ? null : aws_apigatewayv2_domain_name.custom_domain[0].domain_name_configuration[0].target_domain_name\n}\n\noutput \"custom_domain_hosted_zone_id\" {\n description = \"Hosted zone ID to use for a Route 53 alias record for the custom domain\"\n value = var.custom_domain_name == null ? null : aws_apigatewayv2_domain_name.custom_domain[0].domain_name_configuration[0].hosted_zone_id\n}`,\n};\n\nconst RUNTIME_CONFIG_MODULE = '`module \"add_url_to_runtime_config\" { $body }`';\n\n/** The `locals` block every vended API app module declares its IAM policy statements in. */\nconst POLICY_LOCALS =\n '`locals { $body }` where { $body <: contains `lambda_policy_statements = $_` }';\n\n/** Rewrite matching the block's text back unchanged, then the placeholder after it. */\nconst appendAfterBlock = (header: string) =>\n hcl(\n `\\`${header} { $body }\\` => \\`${header} {\\n $body\\n}\\n\\n${GRIT_INSERT_PLACEHOLDER}\\``,\n );\n\nconst migrateTerraformApi = async (\n tree: Tree,\n moduleDir: string,\n file: string,\n nextSteps: string[],\n) => {\n const api = (await matchGritQL(\n tree,\n file,\n hcl(REST_TERRAFORM.identifyingBlock),\n ))\n ? REST_TERRAFORM\n : (await matchGritQL(tree, file, hcl(HTTP_TERRAFORM.identifyingBlock)))\n ? HTTP_TERRAFORM\n : undefined;\n if (!api) {\n return; // Not a vended API app module.\n }\n\n // Everything this migration declares, so a re-run recognises its own output\n // and nothing it inserts collides with an existing declaration. Terraform\n // merges every `.tf` file in the module directory, so all are checked.\n const [domainType, mappingType] = api.domainResourceTypes;\n const declarations = [\n '`variable \"custom_domain_name\" { $_ }`',\n '`variable \"acm_certificate_arn\" { $_ }`',\n `\\`resource \"${domainType}\" \"custom_domain\" { $_ }\\``,\n `\\`resource \"${mappingType}\" \"custom_domain\" { $_ }\\``,\n '`locals { $body }` where { $body <: contains `api_url = $_` }',\n '`output \"api_url\" { $_ }`',\n '`output \"custom_domain_target_domain_name\" { $_ }`',\n '`output \"custom_domain_hosted_zone_id\" { $_ }`',\n ];\n let declared = 0;\n for (const declaration of declarations) {\n if (await matchesInModule(tree, moduleDir, hcl(declaration))) {\n declared++;\n }\n }\n const publishesApiUrl = await matchGritQL(\n tree,\n file,\n hcl(\n `${RUNTIME_CONFIG_MODULE} where { $body <: contains \\`value = { $_ = local.api_url }\\` }`,\n ),\n );\n if (declared === declarations.length && publishesApiUrl) {\n return; // Already migrated.\n }\n if (declared > 0 || publishesApiUrl) {\n nextSteps.push(\n `${file}: this module (${moduleDir}) already declares some of the custom domain configuration this migration adds (custom_domain_name / acm_certificate_arn variables, the custom_domain resources, local.api_url, or the api_url / custom_domain_* outputs) - left untouched. Make sure the add_url_to_runtime_config module publishes the custom domain URL when one is configured, instead of the stage invoke URL (see the ${api.kind} API app module the plugin now generates).`,\n );\n return;\n }\n\n const runtimeConfigValue = `${RUNTIME_CONFIG_MODULE} where { $body <: contains \\`value = { $_ = $v }\\`, ${api.runtimeConfigUrl} }`;\n const shape = [\n hcl('`variable \"tags\" { $_ }`'),\n hcl(runtimeConfigValue),\n hcl(POLICY_LOCALS),\n hcl('`output \"stage_invoke_url\" { $_ }`'),\n ];\n if (!(await matchesAll(tree, file, shape))) {\n nextSteps.push(\n `${file}: has diverged from the generated shape - left untouched. To support a custom domain for this ${api.kind} API, add custom_domain_name and acm_certificate_arn variables, the custom domain and mapping resources, and publish the custom domain URL in the add_url_to_runtime_config module when it is set (see the ${api.kind} API app module the plugin now generates).`,\n );\n return;\n }\n\n await insertViaGritQL(\n tree,\n file,\n appendAfterBlock('variable \"tags\"'),\n TERRAFORM_VARIABLES,\n );\n // Only the URL expression is rewritten, preserving `terraform fmt` alignment.\n await applyGritQL(\n tree,\n file,\n hcl(\n `${RUNTIME_CONFIG_MODULE} where { $body <: contains \\`value = { $_ = $v }\\`, ${api.runtimeConfigUrl}, $v => \\`local.api_url\\` }`,\n ),\n );\n // Alongside the module's other locals.\n await insertViaGritQL(\n tree,\n file,\n hcl(\n `${POLICY_LOCALS} => \\`locals {\\n $body\\n}\\n\\n${GRIT_INSERT_PLACEHOLDER}\\``,\n ),\n api.apiUrlLocal,\n );\n await insertViaGritQL(\n tree,\n file,\n appendAfterBlock('module \"add_url_to_runtime_config\"'),\n api.domainResources,\n );\n await insertViaGritQL(\n tree,\n file,\n appendAfterBlock('output \"stage_invoke_url\"'),\n api.outputs,\n );\n};\n\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n\n await migrateRestApiConstruct(tree, nextSteps);\n await migrateHttpApiConstruct(tree, nextSteps);\n\n if (tree.exists(TERRAFORM_APIS_DIR)) {\n for (const dirName of tree.children(TERRAFORM_APIS_DIR)) {\n const moduleDir = joinPathFragments(TERRAFORM_APIS_DIR, dirName);\n const file = joinPathFragments(moduleDir, `${dirName}.tf`);\n if (tree.exists(file)) {\n await migrateTerraformApi(tree, moduleDir, file, nextSteps);\n }\n }\n }\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps };\n}\n"],"names":["joinPathFragments","addDestructuredImport","applyGritQL","GRIT_INSERT_PLACEHOLDER","insertViaGritQL","matchGritQL","formatFilesInSubtree","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","SHARED_TERRAFORM_DIR","CONSTRUCTS_API_DIR","REST_API_CONSTRUCT","HTTP_API_CONSTRUCT","TERRAFORM_APIS_DIR","hcl","pattern","matchesInModule","tree","moduleDir","child","children","path","endsWith","isFile","matchesAll","file","patterns","REST_RUNTIME_CONFIG_URL","REST_DOMAIN_OUTPUTS","HTTP_DOMAIN_OUTPUTS","HTTP_DOMAIN_MAPPING_PROP","DOMAIN_ALIAS_OUTPUT","AFTER_RUNTIME_CONFIG","migrateRestApiConstruct","nextSteps","exists","shape","push","imported","HTTP_API_URL_FIELD","HTTP_API_URL_ASSIGNMENT","HTTP_URL_GETTER","migrateHttpApiConstruct","TERRAFORM_VARIABLES","REST_TERRAFORM","kind","identifyingBlock","runtimeConfigUrl","domainResourceTypes","domainResources","apiUrlLocal","outputs","HTTP_TERRAFORM","RUNTIME_CONFIG_MODULE","POLICY_LOCALS","appendAfterBlock","header","migrateTerraformApi","api","undefined","domainType","mappingType","declarations","declared","declaration","publishesApiUrl","length","runtimeConfigValue","migration","dirName"],"mappings":"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"}
@@ -253,7 +253,7 @@ export default {
253
253
 
254
254
  exports[`preset generator > should run successfully > biome.json 1`] = `
255
255
  "{
256
- "$schema": "https://biomejs.dev/schemas/2.5.14/schema.json",
256
+ "$schema": "https://biomejs.dev/schemas/2.5.15/schema.json",
257
257
  "root": true,
258
258
  "formatter": {
259
259
  "enabled": true,
@@ -422,7 +422,7 @@ catalog:
422
422
  '@nx/js': 23.2.1
423
423
  '@nx/workspace': 23.2.1
424
424
  typescript: ~6.0.3
425
- '@biomejs/biome': 2.5.14
425
+ '@biomejs/biome': 2.5.15
426
426
  '@aws/nx-plugin': ^0.0.0
427
427
  '@aws/nx-plugin-mcp': ^0.0.0
428
428
  "
@@ -764,18 +764,18 @@ version = "0.1.0"
764
764
  dependencies = [
765
765
  "proj-agent-connection",
766
766
  "aws-lambda-powertools==3.35.0",
767
- "aws-opentelemetry-distro==0.20.0",
768
- "bedrock-agentcore==1.23.1",
769
- "boto3==1.43.103",
770
- "fastapi==0.141.1",
767
+ "aws-opentelemetry-distro==0.21.0",
768
+ "bedrock-agentcore==1.24.0",
769
+ "boto3==1.43.108",
770
+ "fastapi==0.142.2",
771
771
  "mcp==1.28.1",
772
- "strands-agents==1.57.1",
772
+ "strands-agents==1.57.2",
773
773
  "strands-agents-tools==0.8.9",
774
774
  "uvicorn==0.54.0"
775
775
  ]
776
776
 
777
777
  [dependency-groups]
778
- dev = [ "fastapi[standard]==0.141.1" ]
778
+ dev = [ "fastapi[standard]==0.142.2" ]
779
779
 
780
780
  [tool.uv]
781
781
  dev-dependencies = [ ]
@@ -702,23 +702,23 @@ version = "0.1.0"
702
702
  dependencies = [
703
703
  "proj-agent-connection",
704
704
  "aws-lambda-powertools==3.35.0",
705
- "aws-opentelemetry-distro==0.20.0",
706
- "bedrock-agentcore==1.23.1",
707
- "boto3==1.43.103",
708
- "fastapi==0.141.1",
705
+ "aws-opentelemetry-distro==0.21.0",
706
+ "bedrock-agentcore==1.24.0",
707
+ "boto3==1.43.108",
708
+ "fastapi==0.142.2",
709
709
  "mcp==1.28.1",
710
- "langchain==1.4.2",
711
- "langchain-aws==1.7.9",
710
+ "langchain==1.4.3",
711
+ "langchain-aws==1.8.0",
712
712
  "langgraph==1.2.12",
713
713
  "langgraph-checkpoint-sqlite==3.1.1",
714
714
  "aiosqlite==0.22.1",
715
715
  "ag-ui-protocol==0.1.22",
716
- "ag-ui-langgraph==0.0.45",
716
+ "ag-ui-langgraph==0.0.46",
717
717
  "uvicorn==0.54.0"
718
718
  ]
719
719
 
720
720
  [dependency-groups]
721
- dev = [ "fastapi[standard]==0.141.1" ]
721
+ dev = [ "fastapi[standard]==0.142.2" ]
722
722
 
723
723
  [tool.uv]
724
724
  dev-dependencies = [ ]
@@ -5,7 +5,7 @@ exports[`py#agent generator > should create DynamoDB checkpoint table and S3 off
5
5
  required_providers {
6
6
  aws = {
7
7
  source = "hashicorp/aws"
8
- version = "6.66.0"
8
+ version = "6.67.0"
9
9
  }
10
10
  random = {
11
11
  source = "hashicorp/random"
@@ -381,7 +381,7 @@ exports[`py#agent generator > should match snapshot for Terraform generated file
381
381
  required_providers {
382
382
  aws = {
383
383
  source = "hashicorp/aws"
384
- version = "6.66.0"
384
+ version = "6.67.0"
385
385
  }
386
386
  random = {
387
387
  source = "hashicorp/random"
@@ -704,7 +704,7 @@ exports[`py#agent generator > should match snapshot for Terraform generated file
704
704
  required_providers {
705
705
  aws = {
706
706
  source = "hashicorp/aws"
707
- version = "6.66.0"
707
+ version = "6.67.0"
708
708
  }
709
709
  null = {
710
710
  source = "hashicorp/null"
@@ -1063,7 +1063,7 @@ resource "null_resource" "runtime_ready" {
1063
1063
 
1064
1064
  provisioner "local-exec" {
1065
1065
  command = <<-EOT
1066
- uv run --with boto3==1.43.103 python -c "
1066
+ uv run --with boto3==1.43.108 python -c "
1067
1067
  import boto3
1068
1068
  import json
1069
1069
  import os
@@ -35,7 +35,7 @@ exports[`py#dynamodb generator > should generate terraform modules when iac is t
35
35
  required_providers {
36
36
  aws = {
37
37
  source = "hashicorp/aws"
38
- version = "6.66.0"
38
+ version = "6.67.0"
39
39
  }
40
40
  }
41
41
  }
@@ -232,7 +232,7 @@ exports[`py#dynamodb generator > should generate terraform modules when iac is t
232
232
  required_providers {
233
233
  aws = {
234
234
  source = "hashicorp/aws"
235
- version = "6.66.0"
235
+ version = "6.67.0"
236
236
  }
237
237
  random = {
238
238
  source = "hashicorp/random"
@@ -11,7 +11,7 @@ terraform {
11
11
  required_providers {
12
12
  aws = {
13
13
  source = "hashicorp/aws"
14
- version = "6.66.0"
14
+ version = "6.67.0"
15
15
  }
16
16
  }
17
17
  }
@@ -262,7 +262,7 @@ output "api_log_group_arn" {
262
262
  }
263
263
  aws = {
264
264
  source = "hashicorp/aws"
265
- version = "6.66.0"
265
+ version = "6.67.0"
266
266
  }
267
267
  random = {
268
268
  source = "hashicorp/random"
@@ -908,7 +908,7 @@ terraform {
908
908
  required_providers {
909
909
  aws = {
910
910
  source = "hashicorp/aws"
911
- version = "6.66.0"
911
+ version = "6.67.0"
912
912
  }
913
913
  }
914
914
  }
@@ -1159,7 +1159,7 @@ output "api_log_group_arn" {
1159
1159
  }
1160
1160
  aws = {
1161
1161
  source = "hashicorp/aws"
1162
- version = "6.66.0"
1162
+ version = "6.67.0"
1163
1163
  }
1164
1164
  random = {
1165
1165
  source = "hashicorp/random"
@@ -1878,7 +1878,7 @@ terraform {
1878
1878
  required_providers {
1879
1879
  aws = {
1880
1880
  source = "hashicorp/aws"
1881
- version = "6.66.0"
1881
+ version = "6.67.0"
1882
1882
  }
1883
1883
  }
1884
1884
  }
@@ -2129,7 +2129,7 @@ output "api_log_group_arn" {
2129
2129
  }
2130
2130
  aws = {
2131
2131
  source = "hashicorp/aws"
2132
- version = "6.66.0"
2132
+ version = "6.67.0"
2133
2133
  }
2134
2134
  random = {
2135
2135
  source = "hashicorp/random"
@@ -2752,7 +2752,7 @@ terraform {
2752
2752
  required_providers {
2753
2753
  aws = {
2754
2754
  source = "hashicorp/aws"
2755
- version = "6.66.0"
2755
+ version = "6.67.0"
2756
2756
  }
2757
2757
  random = {
2758
2758
  source = "hashicorp/random"
@@ -3065,7 +3065,7 @@ output "waf_web_acl_arn" {
3065
3065
  }
3066
3066
  aws = {
3067
3067
  source = "hashicorp/aws"
3068
- version = "6.66.0"
3068
+ version = "6.67.0"
3069
3069
  }
3070
3070
  random = {
3071
3071
  source = "hashicorp/random"
@@ -4162,7 +4162,7 @@ terraform {
4162
4162
  required_providers {
4163
4163
  aws = {
4164
4164
  source = "hashicorp/aws"
4165
- version = "6.66.0"
4165
+ version = "6.67.0"
4166
4166
  }
4167
4167
  random = {
4168
4168
  source = "hashicorp/random"
@@ -4475,7 +4475,7 @@ output "waf_web_acl_arn" {
4475
4475
  }
4476
4476
  aws = {
4477
4477
  source = "hashicorp/aws"
4478
- version = "6.66.0"
4478
+ version = "6.67.0"
4479
4479
  }
4480
4480
  random = {
4481
4481
  source = "hashicorp/random"
@@ -5561,7 +5561,7 @@ terraform {
5561
5561
  required_providers {
5562
5562
  aws = {
5563
5563
  source = "hashicorp/aws"
5564
- version = "6.66.0"
5564
+ version = "6.67.0"
5565
5565
  }
5566
5566
  random = {
5567
5567
  source = "hashicorp/random"
@@ -5874,7 +5874,7 @@ output "waf_web_acl_arn" {
5874
5874
  }
5875
5875
  aws = {
5876
5876
  source = "hashicorp/aws"
5877
- version = "6.66.0"
5877
+ version = "6.67.0"
5878
5878
  }
5879
5879
  random = {
5880
5880
  source = "hashicorp/random"
@@ -71,7 +71,7 @@ exports[`lambda-handler project generator > terraform iac > should generate terr
71
71
  required_providers {
72
72
  aws = {
73
73
  source = "hashicorp/aws"
74
- version = "6.66.0"
74
+ version = "6.67.0"
75
75
  }
76
76
  archive = {
77
77
  source = "hashicorp/archive"
@@ -256,7 +256,7 @@ exports[`lambda-handler project generator > terraform iac > should match snapsho
256
256
  required_providers {
257
257
  aws = {
258
258
  source = "hashicorp/aws"
259
- version = "6.66.0"
259
+ version = "6.67.0"
260
260
  }
261
261
  archive = {
262
262
  source = "hashicorp/archive"
@@ -155,7 +155,7 @@ exports[`py#mcp-server generator > should match snapshot for Terraform generated
155
155
  required_providers {
156
156
  aws = {
157
157
  source = "hashicorp/aws"
158
- version = "6.66.0"
158
+ version = "6.67.0"
159
159
  }
160
160
  null = {
161
161
  source = "hashicorp/null"
@@ -514,7 +514,7 @@ resource "null_resource" "runtime_ready" {
514
514
 
515
515
  provisioner "local-exec" {
516
516
  command = <<-EOT
517
- uv run --with boto3==1.43.103 python -c "
517
+ uv run --with boto3==1.43.108 python -c "
518
518
  import boto3
519
519
  import json
520
520
  import os
@@ -804,8 +804,8 @@ dependencies = [
804
804
  "aws-lambda-powertools==3.35.0",
805
805
  "mcp==1.28.1",
806
806
  "uvicorn==0.54.0",
807
- "boto3==1.43.103",
808
- "aws-opentelemetry-distro==0.20.0"
807
+ "boto3==1.43.108",
808
+ "aws-opentelemetry-distro==0.21.0"
809
809
  ]
810
810
 
811
811
  [dependency-groups]
@@ -173,10 +173,13 @@ exports[`py#rdb generator > should generate MySQL dependencies and templates 4`]
173
173
  # Patch OS packages beyond the base image's pinned release, and drop pip, whose
174
174
  # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
175
175
  # The handler's dependencies are already installed in the image, so nothing
176
- # installs packages at runtime.
176
+ # installs packages at runtime. Also drop the Lambda Runtime Interface
177
+ # Emulator: it is only used for local \`docker run\` emulation outside Lambda,
178
+ # never by the deployed function, and carries known HIGH vulnerabilities.
177
179
  RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
178
180
  && rm -rf /var/lang/lib/python*/site-packages/pip \\
179
- /var/lang/lib/python*/site-packages/pip-*.dist-info
181
+ /var/lang/lib/python*/site-packages/pip-*.dist-info \\
182
+ /usr/local/bin/aws-lambda-rie
180
183
 
181
184
  WORKDIR \${LAMBDA_TASK_ROOT}
182
185
 
@@ -195,10 +198,13 @@ exports[`py#rdb generator > should generate MySQL dependencies and templates 5`]
195
198
  # Patch OS packages beyond the base image's pinned release, and drop pip, whose
196
199
  # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
197
200
  # The handler's dependencies are already installed in the image, so nothing
198
- # installs packages at runtime.
201
+ # installs packages at runtime. Also drop the Lambda Runtime Interface
202
+ # Emulator: it is only used for local \`docker run\` emulation outside Lambda,
203
+ # never by the deployed function, and carries known HIGH vulnerabilities.
199
204
  RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
200
205
  && rm -rf /var/lang/lib/python*/site-packages/pip \\
201
- /var/lang/lib/python*/site-packages/pip-*.dist-info
206
+ /var/lang/lib/python*/site-packages/pip-*.dist-info \\
207
+ /usr/local/bin/aws-lambda-rie
202
208
 
203
209
  WORKDIR \${LAMBDA_TASK_ROOT}
204
210
 
@@ -222,7 +228,7 @@ exports[`py#rdb generator > should generate Terraform modules 1`] = `
222
228
  }
223
229
  aws = {
224
230
  source = "hashicorp/aws"
225
- version = "6.66.0"
231
+ version = "6.67.0"
226
232
  }
227
233
  external = {
228
234
  source = "hashicorp/external"
@@ -1393,10 +1399,13 @@ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with A
1393
1399
  # Patch OS packages beyond the base image's pinned release, and drop pip, whose
1394
1400
  # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
1395
1401
  # The handler's dependencies are already installed in the image, so nothing
1396
- # installs packages at runtime.
1402
+ # installs packages at runtime. Also drop the Lambda Runtime Interface
1403
+ # Emulator: it is only used for local \`docker run\` emulation outside Lambda,
1404
+ # never by the deployed function, and carries known HIGH vulnerabilities.
1397
1405
  RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
1398
1406
  && rm -rf /var/lang/lib/python*/site-packages/pip \\
1399
- /var/lang/lib/python*/site-packages/pip-*.dist-info
1407
+ /var/lang/lib/python*/site-packages/pip-*.dist-info \\
1408
+ /usr/local/bin/aws-lambda-rie
1400
1409
 
1401
1410
  WORKDIR \${LAMBDA_TASK_ROOT}
1402
1411
 
@@ -1415,10 +1424,13 @@ exports[`py#rdb generator > should generate a PostgreSQL SQLModel project with A
1415
1424
  # Patch OS packages beyond the base image's pinned release, and drop pip, whose
1416
1425
  # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
1417
1426
  # The handler's dependencies are already installed in the image, so nothing
1418
- # installs packages at runtime.
1427
+ # installs packages at runtime. Also drop the Lambda Runtime Interface
1428
+ # Emulator: it is only used for local \`docker run\` emulation outside Lambda,
1429
+ # never by the deployed function, and carries known HIGH vulnerabilities.
1419
1430
  RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
1420
1431
  && rm -rf /var/lang/lib/python*/site-packages/pip \\
1421
- /var/lang/lib/python*/site-packages/pip-*.dist-info
1432
+ /var/lang/lib/python*/site-packages/pip-*.dist-info \\
1433
+ /usr/local/bin/aws-lambda-rie
1422
1434
 
1423
1435
  WORKDIR \${LAMBDA_TASK_ROOT}
1424
1436
 
@@ -1495,7 +1507,7 @@ dependencies = [
1495
1507
  "alembic==1.20.0",
1496
1508
  "greenlet==3.5.6",
1497
1509
  "asyncpg==0.31.0",
1498
- "boto3==1.43.103",
1510
+ "boto3==1.43.108",
1499
1511
  "aws-lambda-powertools==3.35.0"
1500
1512
  ]
1501
1513
 
@@ -3,10 +3,13 @@ FROM public.ecr.aws/lambda/python:3.14
3
3
  # Patch OS packages beyond the base image's pinned release, and drop pip, whose
4
4
  # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
5
5
  # The handler's dependencies are already installed in the image, so nothing
6
- # installs packages at runtime.
6
+ # installs packages at runtime. Also drop the Lambda Runtime Interface
7
+ # Emulator: it is only used for local `docker run` emulation outside Lambda,
8
+ # never by the deployed function, and carries known HIGH vulnerabilities.
7
9
  RUN microdnf upgrade -y --releasever latest && microdnf clean all \
8
10
  && rm -rf /var/lang/lib/python*/site-packages/pip \
9
- /var/lang/lib/python*/site-packages/pip-*.dist-info
11
+ /var/lang/lib/python*/site-packages/pip-*.dist-info \
12
+ /usr/local/bin/aws-lambda-rie
10
13
 
11
14
  WORKDIR ${LAMBDA_TASK_ROOT}
12
15
 
@@ -3,10 +3,13 @@ FROM public.ecr.aws/lambda/python:3.14
3
3
  # Patch OS packages beyond the base image's pinned release, and drop pip, whose
4
4
  # vendored copies of msgpack and setuptools carry known HIGH vulnerabilities.
5
5
  # The handler's dependencies are already installed in the image, so nothing
6
- # installs packages at runtime.
6
+ # installs packages at runtime. Also drop the Lambda Runtime Interface
7
+ # Emulator: it is only used for local `docker run` emulation outside Lambda,
8
+ # never by the deployed function, and carries known HIGH vulnerabilities.
7
9
  RUN microdnf upgrade -y --releasever latest && microdnf clean all \
8
10
  && rm -rf /var/lang/lib/python*/site-packages/pip \
9
- /var/lang/lib/python*/site-packages/pip-*.dist-info
11
+ /var/lang/lib/python*/site-packages/pip-*.dist-info \
12
+ /usr/local/bin/aws-lambda-rie
10
13
 
11
14
  WORKDIR ${LAMBDA_TASK_ROOT}
12
15
 
@@ -45,7 +45,7 @@ exports[`smithyProjectGenerator > shape libraries > should generate a shape libr
45
45
  "shx rm -rf dist/{projectRoot}/build",
46
46
  "shx rm -rf dist/{projectRoot}/smithy",
47
47
  "shx mkdir -p dist/{projectRoot}/build",
48
- "npx -y mise@2026.9.14 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
48
+ "npx -y mise@2026.10.1 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
49
49
  "shx cp dist/{projectRoot}/smithy/source/model/model.json dist/{projectRoot}/build/model.json"
50
50
  ],
51
51
  "parallel": false,
@@ -122,7 +122,7 @@ exports[`smithyProjectGenerator > should generate smithy project with all custom
122
122
  "shx rm -rf dist/{projectRoot}/build",
123
123
  "shx rm -rf dist/{projectRoot}/smithy",
124
124
  "shx mkdir -p dist/{projectRoot}/build",
125
- "npx -y mise@2026.9.14 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
125
+ "npx -y mise@2026.10.1 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
126
126
  "shx mkdir -p dist/{projectRoot}/build/openapi",
127
127
  "shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
128
128
  ],
@@ -180,7 +180,7 @@ exports[`smithyProjectGenerator > should generate smithy project with custom dir
180
180
  "shx rm -rf dist/{projectRoot}/build",
181
181
  "shx rm -rf dist/{projectRoot}/smithy",
182
182
  "shx mkdir -p dist/{projectRoot}/build",
183
- "npx -y mise@2026.9.14 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
183
+ "npx -y mise@2026.10.1 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
184
184
  "shx mkdir -p dist/{projectRoot}/build/openapi",
185
185
  "shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
186
186
  ],
@@ -330,7 +330,7 @@ exports[`smithyProjectGenerator > should generate smithy project with default op
330
330
  "shx rm -rf dist/{projectRoot}/build",
331
331
  "shx rm -rf dist/{projectRoot}/smithy",
332
332
  "shx mkdir -p dist/{projectRoot}/build",
333
- "npx -y mise@2026.9.14 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
333
+ "npx -y mise@2026.10.1 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
334
334
  "shx mkdir -p dist/{projectRoot}/build/openapi",
335
335
  "shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
336
336
  ],
@@ -474,7 +474,7 @@ exports[`smithyProjectGenerator > should generate smithy project with subdirecto
474
474
  "shx rm -rf dist/{projectRoot}/build",
475
475
  "shx rm -rf dist/{projectRoot}/smithy",
476
476
  "shx mkdir -p dist/{projectRoot}/build",
477
- "npx -y mise@2026.9.14 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
477
+ "npx -y mise@2026.10.1 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
478
478
  "shx mkdir -p dist/{projectRoot}/build/openapi",
479
479
  "shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
480
480
  ],
@@ -416,7 +416,7 @@ terraform {
416
416
  required_providers {
417
417
  aws = {
418
418
  source = "hashicorp/aws"
419
- version = "6.66.0"
419
+ version = "6.67.0"
420
420
  }
421
421
  random = {
422
422
  source = "hashicorp/random"
@@ -732,7 +732,7 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with Terraform pro
732
732
  }
733
733
  aws = {
734
734
  source = "hashicorp/aws"
735
- version = "6.66.0"
735
+ version = "6.67.0"
736
736
  }
737
737
  random = {
738
738
  source = "hashicorp/random"
@@ -2175,7 +2175,7 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with default optio
2175
2175
  "shx rm -rf dist/{projectRoot}/build",
2176
2176
  "shx rm -rf dist/{projectRoot}/smithy",
2177
2177
  "shx mkdir -p dist/{projectRoot}/build",
2178
- "npx -y mise@2026.9.14 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
2178
+ "npx -y mise@2026.10.1 exec smithy@1.74.0 -- smithy build -c {projectRoot}/smithy-build.json --output dist/{projectRoot}/smithy",
2179
2179
  "shx mkdir -p dist/{projectRoot}/build/openapi",
2180
2180
  "shx cp \\"dist/{projectRoot}/smithy/source/openapi/*.openapi.json\\" dist/{projectRoot}/build/openapi/openapi.json"
2181
2181
  ],
@@ -2315,7 +2315,7 @@ terraform {
2315
2315
  required_providers {
2316
2316
  aws = {
2317
2317
  source = "hashicorp/aws"
2318
- version = "6.66.0"
2318
+ version = "6.67.0"
2319
2319
  }
2320
2320
  random = {
2321
2321
  source = "hashicorp/random"
@@ -2628,7 +2628,7 @@ output "waf_web_acl_arn" {
2628
2628
  }
2629
2629
  aws = {
2630
2630
  source = "hashicorp/aws"
2631
- version = "6.66.0"
2631
+ version = "6.67.0"
2632
2632
  }
2633
2633
  random = {
2634
2634
  source = "hashicorp/random"
@@ -3690,7 +3690,7 @@ terraform {
3690
3690
  required_providers {
3691
3691
  aws = {
3692
3692
  source = "hashicorp/aws"
3693
- version = "6.66.0"
3693
+ version = "6.67.0"
3694
3694
  }
3695
3695
  random = {
3696
3696
  source = "hashicorp/random"
@@ -4003,7 +4003,7 @@ output "waf_web_acl_arn" {
4003
4003
  }
4004
4004
  aws = {
4005
4005
  source = "hashicorp/aws"
4006
- version = "6.66.0"
4006
+ version = "6.67.0"
4007
4007
  }
4008
4008
  random = {
4009
4009
  source = "hashicorp/random"
@@ -5054,7 +5054,7 @@ exports[`tsSmithyApiGenerator > terraform iac > should generate terraform with c
5054
5054
  }
5055
5055
  aws = {
5056
5056
  source = "hashicorp/aws"
5057
- version = "6.66.0"
5057
+ version = "6.67.0"
5058
5058
  }
5059
5059
  random = {
5060
5060
  source = "hashicorp/random"