diff --git a/.gitignore b/.gitignore index fdbadd4621..c8312c40ff 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,5 @@ tsconfig.tsbuildinfo .claude .amazonq .kiro -.github/instructions \ No newline at end of file +.github/instructions +aidlc-docs \ No newline at end of file diff --git a/examples/app/package.json b/examples/app/package.json index 782a595452..f1c4fe627b 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -1,6 +1,6 @@ { "name": "powertools-sample-app", - "version": "2.31.0", + "version": "2.29.0", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -29,29 +29,30 @@ "#errors": "./functions/commons/errors.js" }, "devDependencies": { - "@types/aws-lambda": "^8.10.160", - "@types/node": "25.2.3", - "aws-cdk-lib": "^2.238.0", - "constructs": "^10.4.5", + "@types/aws-lambda": "^8.10.159", + "@types/node": "24.10.2", + "aws-cdk-lib": "^2.228.0", + "constructs": "^10.4.3", "source-map-support": "^0.5.21", + "tsx": "^4.21.0", "typescript": "^5.9.3", "vitest": "^4.0.10" }, "dependencies": { - "@aws-lambda-powertools/batch": "^2.31.0", - "@aws-lambda-powertools/idempotency": "^2.31.0", - "@aws-lambda-powertools/logger": "^2.31.0", - "@aws-lambda-powertools/metrics": "^2.31.0", - "@aws-lambda-powertools/parameters": "^2.31.0", - "@aws-lambda-powertools/tracer": "^2.31.0", - "@aws-sdk/client-ssm": "^3.990.0", - "@aws-sdk/lib-dynamodb": "^3.990.0", + "@aws-lambda-powertools/batch": "^2.29.0", + "@aws-lambda-powertools/idempotency": "^2.29.0", + "@aws-lambda-powertools/logger": "^2.29.0", + "@aws-lambda-powertools/metrics": "^2.29.0", + "@aws-lambda-powertools/parameters": "^2.29.0", + "@aws-lambda-powertools/tracer": "^2.29.0", + "@aws-sdk/client-ssm": "^3.939.0", + "@aws-sdk/lib-dynamodb": "^3.939.0", "@middy/core": "^4.7.0", - "@types/aws-lambda": "^8.10.160", - "@types/node": "25.2.3", - "aws-cdk": "^2.1106.0", - "constructs": "^10.4.5", - "esbuild": "^0.27.2", + "@types/aws-lambda": "^8.10.159", + "@types/node": "24.10.2", + "aws-cdk": "^2.1033.0", + "constructs": "^10.4.3", + "esbuild": "^0.27.1", "typescript": "^5.9.3" } } diff --git a/package-lock.json b/package-lock.json index f80ac2ef37..f5692b53fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,35 +48,44 @@ }, "examples/app": { "name": "powertools-sample-app", - "version": "2.31.0", + "version": "2.29.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/batch": "^2.31.0", - "@aws-lambda-powertools/idempotency": "^2.31.0", - "@aws-lambda-powertools/logger": "^2.31.0", - "@aws-lambda-powertools/metrics": "^2.31.0", - "@aws-lambda-powertools/parameters": "^2.31.0", - "@aws-lambda-powertools/tracer": "^2.31.0", - "@aws-sdk/client-ssm": "^3.990.0", - "@aws-sdk/lib-dynamodb": "^3.990.0", + "@aws-lambda-powertools/batch": "^2.29.0", + "@aws-lambda-powertools/idempotency": "^2.29.0", + "@aws-lambda-powertools/logger": "^2.29.0", + "@aws-lambda-powertools/metrics": "^2.29.0", + "@aws-lambda-powertools/parameters": "^2.29.0", + "@aws-lambda-powertools/tracer": "^2.29.0", + "@aws-sdk/client-ssm": "^3.939.0", + "@aws-sdk/lib-dynamodb": "^3.939.0", "@middy/core": "^4.7.0", - "@types/aws-lambda": "^8.10.160", - "@types/node": "25.2.3", - "aws-cdk": "^2.1106.0", - "constructs": "^10.4.5", - "esbuild": "^0.27.2", + "@types/aws-lambda": "^8.10.159", + "@types/node": "24.10.2", + "aws-cdk": "^2.1033.0", + "constructs": "^10.4.3", + "esbuild": "^0.27.1", "typescript": "^5.9.3" }, "devDependencies": { - "@types/aws-lambda": "^8.10.160", - "@types/node": "25.2.3", - "aws-cdk-lib": "^2.238.0", - "constructs": "^10.4.5", + "@types/aws-lambda": "^8.10.159", + "@types/node": "24.10.2", + "aws-cdk-lib": "^2.228.0", + "constructs": "^10.4.3", "source-map-support": "^0.5.21", + "tsx": "^4.21.0", "typescript": "^5.9.3", "vitest": "^4.0.10" } }, + "examples/app/node_modules/@types/node": { + "version": "24.10.2", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, "examples/snippets": { "name": "code-snippets", "version": "2.31.0", @@ -109,8 +118,6 @@ }, "examples/snippets/node_modules/@valkey/valkey-glide": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide/-/valkey-glide-2.2.7.tgz", - "integrity": "sha512-mIQTBfKMVDMu09Ja0zEIBu+r2890iqZSiJcdVj3Wt+8ptjXr5ZyVYOrAaoauiZquntKPtlvD2tjrFk3hSkuVTw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -131,8 +138,6 @@ }, "examples/snippets/node_modules/protobufjs": { "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", "dev": true, "hasInstallScript": true, "license": "BSD-3-Clause", @@ -198,19 +203,19 @@ "license": "Apache-2.0" }, "node_modules/@aws-cdk/aws-service-spec": { - "version": "0.1.148", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-service-spec/-/aws-service-spec-0.1.148.tgz", - "integrity": "sha512-UkEh6yl5VruBg4r0sIV4S5jvhA+jm3vlZFeBjGfWjCdSEsOWTzK7Lhbg6+cjf35uGvNCSVdMbHC6g7tiuhSKYQ==", + "version": "0.1.150", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-service-spec/-/aws-service-spec-0.1.150.tgz", + "integrity": "sha512-xzpX5sHr3wJjJqqLR1+T2LruM5NEgSbSjD6s9u4wbl5/hmXXOOePO8OMcrHX1YgTkuyIjtroNQ+EpR2NLFTcJw==", "license": "Apache-2.0", "dependencies": { - "@aws-cdk/service-spec-types": "^0.0.214", + "@aws-cdk/service-spec-types": "^0.0.216", "@cdklabs/tskb": "^0.0.4" } }, "node_modules/@aws-cdk/aws-service-spec/node_modules/@aws-cdk/service-spec-types": { - "version": "0.0.214", - "resolved": "https://registry.npmjs.org/@aws-cdk/service-spec-types/-/service-spec-types-0.0.214.tgz", - "integrity": "sha512-mVAnTNSd+iooBSwnCB6xzlu9pqqXlrpwzSPVigk3JImXQlzIkMf1Kx14Td3ybUNRJdmvf5bnJN3xBI6H3V54pg==", + "version": "0.0.216", + "resolved": "https://registry.npmjs.org/@aws-cdk/service-spec-types/-/service-spec-types-0.0.216.tgz", + "integrity": "sha512-JMOf6Roay/oI6MBpwRlmdiskm7ZFXmlPmjMgTxzbZls/+oc4LMfONQTfjRtYwhEKl2P2Yi6wYX3UuVaNNb/Yxw==", "license": "Apache-2.0", "dependencies": { "@cdklabs/tskb": "^0.0.4" @@ -242,49 +247,35 @@ "node": ">= 18.0.0" } }, - "node_modules/@aws-cdk/cdk-assets-lib/node_modules/@aws-cdk/cloud-assembly-api": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-api/-/cloud-assembly-api-2.0.1.tgz", - "integrity": "sha512-6CLsOvGoAmwryhhaE7YvbH4CYSvV9IjySj/4aBR0Vs5abjyi6j2oM+2uKvhePogKtuNO5Ps6OsT/3rwAoJKGdg==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "license": "Apache-2.0", + "node_modules/@aws-cdk/cdk-assets-lib/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "license": "ISC", "dependencies": { - "jsonschema": "~1.4.1", - "semver": "^7.7.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 18.0.0" + "node": "20 || >=22" }, - "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": ">=50.3.0" - } - }, - "node_modules/@aws-cdk/cdk-assets-lib/node_modules/@aws-cdk/cloud-assembly-api/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@aws-cdk/cdk-assets-lib/node_modules/@aws-cdk/cloud-assembly-api/node_modules/semver": { - "version": "7.7.3", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/@aws-cdk/cli-plugin-contract": { + "version": "2.182.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cli-plugin-contract/-/cli-plugin-contract-2.182.1.tgz", + "integrity": "sha512-T0VgSVe0uiOCLm79GD+kWba8T+dPRVixZW5eBSiT59h0dIOR7poqhm5lnjId/XPvetRd0tvqNLje6MXQ+3JWzw==", + "license": "Apache-2.0", + "peer": true, "engines": { - "node": ">=10" + "node": ">= 18.0.0" } }, - "node_modules/@aws-cdk/cdk-assets-lib/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "50.4.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-50.4.0.tgz", - "integrity": "sha512-9Cplwc5C+SNe3hMfqZET7gXeM68tiH2ytQytCi+zz31Bn7O3GAgAnC2dYe+HWnZAgVH788ZkkBwnYXkeqx7v4g==", + "node_modules/@aws-cdk/cloud-assembly-api": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-api/-/cloud-assembly-api-2.0.1.tgz", + "integrity": "sha512-6CLsOvGoAmwryhhaE7YvbH4CYSvV9IjySj/4aBR0Vs5abjyi6j2oM+2uKvhePogKtuNO5Ps6OsT/3rwAoJKGdg==", "bundleDependencies": [ "jsonschema", "semver" @@ -296,9 +287,12 @@ }, "engines": { "node": ">= 18.0.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": ">=50.3.0" } }, - "node_modules/@aws-cdk/cdk-assets-lib/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "node_modules/@aws-cdk/cloud-assembly-api/node_modules/jsonschema": { "version": "1.4.1", "inBundle": true, "license": "MIT", @@ -306,7 +300,7 @@ "node": "*" } }, - "node_modules/@aws-cdk/cdk-assets-lib/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "node_modules/@aws-cdk/cloud-assembly-api/node_modules/semver": { "version": "7.7.3", "inBundle": true, "license": "ISC", @@ -317,43 +311,19 @@ "node": ">=10" } }, - "node_modules/@aws-cdk/cdk-assets-lib/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@aws-cdk/cli-plugin-contract": { - "version": "2.182.1", - "resolved": "https://registry.npmjs.org/@aws-cdk/cli-plugin-contract/-/cli-plugin-contract-2.182.1.tgz", - "integrity": "sha512-T0VgSVe0uiOCLm79GD+kWba8T+dPRVixZW5eBSiT59h0dIOR7poqhm5lnjId/XPvetRd0tvqNLje6MXQ+3JWzw==", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">= 18.0.0" - } - }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "48.20.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.20.0.tgz", - "integrity": "sha512-+eeiav9LY4wbF/EFuCt/vfvi/Zoxo8bf94PW5clbMraChEliq83w4TbRVy0jB9jE0v1ooFTtIjSQkowSPkfISg==", + "version": "52.0.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-52.0.0.tgz", + "integrity": "sha512-tKRePCGlQxjG23/AQH4BCVpwH6uUt2jrgCzeyn1T2hf6P21SVqGx2LWuc8gc1y6qI9mfTQRCt7niQILbVtPjUQ==", "bundleDependencies": [ "jsonschema", "semver" ], "license": "Apache-2.0", + "peer": true, "dependencies": { "jsonschema": "~1.4.1", - "semver": "^7.7.2" + "semver": "^7.7.3" }, "engines": { "node": ">= 18.0.0" @@ -368,7 +338,7 @@ } }, "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.7.2", + "version": "7.7.3", "inBundle": true, "license": "ISC", "bin": { @@ -450,14 +420,16 @@ } }, "node_modules/@aws-cdk/cx-api": { - "version": "2.237.1", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-2.237.1.tgz", - "integrity": "sha512-8hvvywz3bkKzHDHHREBhxFpzbhoGDDHS0oUD/M4SclDQU9Ri5DlzzmRMm+PuRf6ceQ0KRV3mqHYsOhTFZi8sHw==", + "version": "2.238.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-2.238.0.tgz", + "integrity": "sha512-3PxKP5aXS8H0rb/Z2G/qIv/JaY/lLH1Fcf2oJH6ZRc6r//eMkmdsY/gg+VsZN0I0qVmrAjAa+Pc8xdpLwozPNA==", "bundleDependencies": [ - "semver" + "semver", + "@aws-cdk/cloud-assembly-api" ], "license": "Apache-2.0", "dependencies": { + "@aws-cdk/cloud-assembly-api": "^2.0.0", "semver": "^7.7.3" }, "engines": { @@ -467,6 +439,44 @@ "@aws-cdk/cloud-assembly-schema": ">=45.0.0" } }, + "node_modules/@aws-cdk/cx-api/node_modules/@aws-cdk/cloud-assembly-api": { + "version": "2.0.0", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "jsonschema": "~1.4.1", + "semver": "^7.7.3" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "@aws-cdk/cloud-assembly-schema": ">=50.1.0" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/@aws-cdk/cloud-assembly-api/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@aws-cdk/cx-api/node_modules/@aws-cdk/cloud-assembly-api/node_modules/semver": { + "version": "7.7.3", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@aws-cdk/cx-api/node_modules/semver": { "version": "7.7.3", "inBundle": true, @@ -587,42 +597,6 @@ "node": ">=10" } }, - "node_modules/@aws-cdk/toolkit-lib/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "52.0.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-52.0.0.tgz", - "integrity": "sha512-tKRePCGlQxjG23/AQH4BCVpwH6uUt2jrgCzeyn1T2hf6P21SVqGx2LWuc8gc1y6qI9mfTQRCt7niQILbVtPjUQ==", - "bundleDependencies": [ - "jsonschema", - "semver" - ], - "license": "Apache-2.0", - "dependencies": { - "jsonschema": "~1.4.1", - "semver": "^7.7.3" - }, - "engines": { - "node": ">= 18.0.0" - } - }, - "node_modules/@aws-cdk/toolkit-lib/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/toolkit-lib/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.7.3", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@aws-cdk/toolkit-lib/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -996,9 +970,9 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.990.0.tgz", - "integrity": "sha512-s2HRVp+Qbb/C2XvtzMMi2ZUjRrlJLR9pa39lHxIInTHJjcOeJM3kTe9k+p1f6dMfJv0VpS3BwcMs88m4+JY0OQ==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.991.0.tgz", + "integrity": "sha512-esiTlYKuGpDYjxWO190Thi+mwSmwPXnMve1uBIZ91uj3XJr2RSmD5LxHvbiorN2e8OcgCJ1JclthfWrMbuPF4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1012,7 +986,7 @@ "@aws-sdk/middleware-user-agent": "^3.972.10", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.991.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", "@aws-sdk/util-user-agent-node": "^3.972.8", "@smithy/config-resolver": "^4.4.6", @@ -1047,50 +1021,67 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/util-endpoints": { + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.991.0.tgz", + "integrity": "sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/client-appsync": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.990.0.tgz", - "integrity": "sha512-TatQ0DZsmaeuy1Mg3DWY7Xpr/PBUJJ/HslUbgEZx6DH8idb1fvXkVa5QdmHi5rGlWZN+RgSSBUuqBaKF2X/fAA==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appsync/-/client-appsync-3.987.0.tgz", + "integrity": "sha512-xC9xtc527cfbeEmQ8k3P2TPbyj/swIpAWWmI36HMVpqF2/YDgERv3NL2vY71+XDlRhRgcK61AP6yrq/3Oil6JQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", - "@smithy/util-stream": "^4.5.12", + "@smithy/util-stream": "^4.5.11", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -1099,45 +1090,45 @@ } }, "node_modules/@aws-sdk/client-bedrock-agentcore-control": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-agentcore-control/-/client-bedrock-agentcore-control-3.990.0.tgz", - "integrity": "sha512-h9QSwQT1tXCp2eZfS9UmsMK+kHg9pCDG6rVpRBOqW/cxx+PFKwtQYrs7KKgCaocf99T72jxXhbtOuiVqKPsUkQ==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-agentcore-control/-/client-bedrock-agentcore-control-3.987.0.tgz", + "integrity": "sha512-uECVEiBlUH3rnMQOXoWmjIphC+D+8Yj0BnDut6sDucVpPzWxajne2Mnr/c5MTs0FLVz6X3zofX5/4WPh90fIvQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1150,45 +1141,45 @@ } }, "node_modules/@aws-sdk/client-cloudcontrol": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.990.0.tgz", - "integrity": "sha512-5FUPYEzv0TfVrgTD0Ybh7prjLpIYYzzBPsNjbcISXdC3GzIIFzAyuv3LVvqVMUMh6zzXiig4tqsososzt3Po3Q==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudcontrol/-/client-cloudcontrol-3.987.0.tgz", + "integrity": "sha512-UjAnTQOvaplMDG1i8pbUEk+da60cSuvRY4zqKtlajYKNsXiYwiPUkqcxUt48nDN53jD8vYXBy3L/gPCTjuBSAA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1201,45 +1192,46 @@ } }, "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.990.0.tgz", - "integrity": "sha512-XsofhyUiSygmLDBSKZ+jhskUY2ZpKkqvj8j2Na2a+vSpe5dDVK0ErNNN2uU2U7ntoHD70Ne0stvaQXtKDpqhsQ==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.987.0.tgz", + "integrity": "sha512-RwPNOpIG5tUudmdvCWH7ex5i/FAcenBlAaC2S6FiCtDWwOqnDGMhqrNHMCUMRSVowycFPUdw5tPqtGWmtSuFUg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1252,9 +1244,9 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.990.0.tgz", - "integrity": "sha512-+JV1QBPAOS66Czebzh3J9RqjuUKwY22JvrU+OUdk+005pick5ytqdXCndLMCSf0igrFYtxMfKedUPUcSgVn/OQ==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.991.0.tgz", + "integrity": "sha512-rH6OQVWuFl+cACEg5xW/dyIF/yTzWWjQC7KEbyG13I+FYgASh1a3BDu2jYrPrE59QndxrydLZoRIPL4YE1X8xw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1268,7 +1260,7 @@ "@aws-sdk/middleware-user-agent": "^3.972.10", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.991.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", "@aws-sdk/util-user-agent-node": "^3.972.8", "@smithy/config-resolver": "^4.4.6", @@ -1305,9 +1297,9 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.990.0.tgz", - "integrity": "sha512-9iCLVYB6AlBVBIe+35mclDJ84EUH526xhbQ8yU/1O7HMgWSzgK3uwgZBj77wKzi6NHcn9XVe97T1Hta9Vqzf5Q==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.991.0.tgz", + "integrity": "sha512-6r4aQSRiEDD2DLX5dfilTDVgMrGYW3sxr7ZgOV1t+nmHueHpEX4zgNAQyEkH0fstYcEfVMDA2O/uEbscgXgtIw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -1320,7 +1312,7 @@ "@aws-sdk/middleware-user-agent": "^3.972.10", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.991.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", "@aws-sdk/util-user-agent-node": "^3.972.8", "@smithy/config-resolver": "^4.4.6", @@ -1357,46 +1349,79 @@ "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-codebuild": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.990.0.tgz", - "integrity": "sha512-fkz0wLpsuwMViWZPWjqNBvzpdas4HLiIAyr2Jbc8qt/OinbKL/iXp5jNDW9h4ePXQKI2bLOucK6pXaLfxF+CSA==", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-endpoints": { + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.991.0.tgz", + "integrity": "sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/util-endpoints": { + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.991.0.tgz", + "integrity": "sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-codebuild": { + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.987.0.tgz", + "integrity": "sha512-UlRglkPOMiJ6wFRA4vUs9fobMIBCEwzHUGhfHigF5yNIcXbfpAij+yN6tlccPJVsz+FX5/JSMTaHdmV0wZB0YA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1408,45 +1433,45 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.990.0.tgz", - "integrity": "sha512-7VF6Gm7erGLdCBk7oR4pMNgbWZWkUxiomjUmgKikiMmNVpRjUY+2PODUjIINuPZug0WbNIIvbHnfapaXho0x/A==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.987.0.tgz", + "integrity": "sha512-MbBhtW9gjoG/5XL+UwxueheoiCYVxEHGD9e7rK5+xTKjqT94bb04oUrzUFXLN3fA+y3aQRSuUj2KICTFISo/pg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1458,10 +1483,11 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.990.0.tgz", - "integrity": "sha512-vHvtdH9V7HcRkg5IlZEo5BGzacR5OTgp8cYDYZ2FWP8bo5ZHAhXYSirNwWQGLEnwrgFjuddWg9hDbbIxWb+6UQ==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.991.0.tgz", + "integrity": "sha512-jnV/AKg8Gl7V3VH3RwfXEFBp3i9w9tQ9NXJE/z1Uu1nyjSo6rPmuMigVOORniE3cELpLkJLozUy/8Yyw0PqYgA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -1475,7 +1501,7 @@ "@aws-sdk/middleware-user-agent": "^3.972.10", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.991.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", "@aws-sdk/util-user-agent-node": "^3.972.8", "@smithy/config-resolver": "^4.4.6", @@ -1510,47 +1536,63 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/util-endpoints": { + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.991.0.tgz", + "integrity": "sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/client-ec2": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.990.0.tgz", - "integrity": "sha512-Z3+CdsUsvc8KYNxuR1O34o10VEuTaZrmfiP6jgzwJR7bH1yZD8wMB+9bfaIM0bSLJzXK9+KBK86U2D4kq/ILUg==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ec2/-/client-ec2-3.987.0.tgz", + "integrity": "sha512-EhDB/wUKtpBqMxRlowi9ILA/QDTBKHAYNqRt9/gkvNPU7B96unmyXW91Dvkim8SQy5M0ObqACK4CUgx0AytZ3g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-sdk-ec2": "^3.972.7", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-sdk-ec2": "^3.972.6", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1563,45 +1605,45 @@ } }, "node_modules/@aws-sdk/client-ecr": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.990.0.tgz", - "integrity": "sha512-vZls9dXhp3d4lhLC9f6UNh3TZHpqzfp7rxMOZhmGzRcuWRUzdXUo6q3tE1qzl6CPX6uy3HWq+iLDIVtDWtxYPA==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.987.0.tgz", + "integrity": "sha512-ruaVsGSeuJHc2hFNytJHEpLD1fGDklkKaHqLQjWIvz3NmLeXYyugSIhZF3ZOX3k7Vynux5GgL7OAL8Qb5mz+lw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1614,45 +1656,45 @@ } }, "node_modules/@aws-sdk/client-ecs": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.990.0.tgz", - "integrity": "sha512-AlMwuASWd9ASqhI7WP05H6UqxBd36H9Y9ZdsalnsotvIqYArH5t6aEuWSRKwvK01u1GNkbFxZGpJcJ04DT8kPQ==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.987.0.tgz", + "integrity": "sha512-EywHnKstErYOhylDzmgHDDU6LID1S+e08HTkvfz3ny4V18/ZRdqfS0zAaBen+DMhdeBiSglGmJuY4NRVKiAtyw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1665,45 +1707,45 @@ } }, "node_modules/@aws-sdk/client-elastic-load-balancing-v2": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.990.0.tgz", - "integrity": "sha512-JX/jg7ae9nNdSp82SJSLgiWDn7h07sSz6I7Gb0NC5VkHUk4+X2ERYfFYUfR5dOfSCkPbiqWHhMp+sAnAg3/+Kw==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elastic-load-balancing-v2/-/client-elastic-load-balancing-v2-3.987.0.tgz", + "integrity": "sha512-ubPyOYLJGfw3ydx/LeNubqmEuc6j7p4W19HpmacGn0020ckzKp5YFytD93rGwOWBI5oKxC/IV1u50exC3t5BDg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1716,45 +1758,45 @@ } }, "node_modules/@aws-sdk/client-iam": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.990.0.tgz", - "integrity": "sha512-Agx4+Xzclky6kOjmIbOolwHP/VfRHOCHU5ezWBwpudyg71xsIQw/xUyaXj62gz8wb06lMjqNUZdUmd7YfsR8iA==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.987.0.tgz", + "integrity": "sha512-+/PiaaSxsA681CMCwKVkPOGWgLjZFpYU7cJJBUfdkRo0wNBv9TQdO2oyji/bD6RwlgUmeWig1Zu2LG4uOk+O7A==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1767,45 +1809,45 @@ } }, "node_modules/@aws-sdk/client-kms": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.990.0.tgz", - "integrity": "sha512-k8qui9WMJE7ySN2H1t7zILWDmjsbdqhqL6VYXbv6bopRhucb5gudGJzYvjUtbrlX5QfrLIR3DzxNj7VFAoO04Q==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.987.0.tgz", + "integrity": "sha512-5wxoXF3CLW6UNwBmtY0cRVeN/pFjMBKeL8BDAO7BgdCTFgLnZG4lerAvjmrK3carbEVPDJ6TEQqs9gXfG8Q3lg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1817,9 +1859,9 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.990.0.tgz", - "integrity": "sha512-C7+AEzUxHVDvznYBFR9+PtRx8XexcUF5shY01lpoR8LdoEYinRKZt7IdKtqyWopmD5DzYUik7WQ6qI8UNRXevw==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.991.0.tgz", + "integrity": "sha512-fiJbkZZExQwdtH2WEd+up02/En7ASd9PcKpS7aceysp+nyU2LZaf3dAUBaM+EsbtuhsUny2AHdDPtbfwqJnhCw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -1832,7 +1874,7 @@ "@aws-sdk/middleware-user-agent": "^3.972.10", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.991.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", "@aws-sdk/util-user-agent-node": "^3.972.8", "@smithy/config-resolver": "^4.4.6", @@ -1871,47 +1913,63 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/util-endpoints": { + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.991.0.tgz", + "integrity": "sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/client-route-53": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.990.0.tgz", - "integrity": "sha512-ANoqSeSvOpsNuLXmucqUWXX8FfSpIEePcTqIw3DegxqNjuqgxMiQthFGaUZQ2QToHd0I9SfRtuDKHXAZW6W2bw==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.987.0.tgz", + "integrity": "sha512-hwqEsnJSlOC9kkHItBNXLSW6e8eLjxI+weDS+MOQg31ohBbaEwSGJW2N4ElmF8dsp5rRWrU3NsaHMAhr6FHsPA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", "@aws-sdk/middleware-sdk-route53": "^3.972.4", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1924,34 +1982,35 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.990.0.tgz", - "integrity": "sha512-XnsM8RgB35Atn2+aYSocitCybDG82x9yYf/s2D23ytpyHCupmuZN3LzK2a0WxmKO6Zf7EtEIYy0mHGY4tLp9YA==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.987.0.tgz", + "integrity": "sha512-9nLbDIjqdiDkJk8hrAW8jP51bRXjD0+2J3lnCAy+N2G4BDoQuN09+iQF2chF/9BJ/hTk5Ldm2beaO8G2PM1cyw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-bucket-endpoint": "^3.972.3", "@aws-sdk/middleware-expect-continue": "^3.972.3", - "@aws-sdk/middleware-flexible-checksums": "^3.972.8", + "@aws-sdk/middleware-flexible-checksums": "^3.972.5", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-location-constraint": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-sdk-s3": "^3.972.10", + "@aws-sdk/middleware-sdk-s3": "^3.972.7", "@aws-sdk/middleware-ssec": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/signature-v4-multi-region": "3.990.0", + "@aws-sdk/signature-v4-multi-region": "3.987.0", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/eventstream-serde-browser": "^4.2.8", "@smithy/eventstream-serde-config-resolver": "^4.3.8", "@smithy/eventstream-serde-node": "^4.2.8", @@ -1962,25 +2021,25 @@ "@smithy/invalid-dependency": "^4.2.8", "@smithy/md5-js": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", - "@smithy/util-stream": "^4.5.12", + "@smithy/util-stream": "^4.5.11", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.8", "tslib": "^2.6.2" @@ -1990,9 +2049,9 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.990.0.tgz", - "integrity": "sha512-cf4ZLsjczU/Rh+QAxoXUbc/2OKAm8WWC3j1axE4qIO6FLziJCze94sTSCmhSMeLoSjixtIORERQeAXYnjrYVAg==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.991.0.tgz", + "integrity": "sha512-YJhgFxYchpWEf+kSlZ1WEFWh59jtOJalZCGk5j+1G315f0oCM4kd0oZ9X4GwsfvV4CYis/V/1wYvpZXbjFXH3g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -2005,7 +2064,7 @@ "@aws-sdk/middleware-user-agent": "^3.972.10", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.991.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", "@aws-sdk/util-user-agent-node": "^3.972.8", "@smithy/config-resolver": "^4.4.6", @@ -2039,46 +2098,62 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-endpoints": { + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.991.0.tgz", + "integrity": "sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/client-sfn": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.990.0.tgz", - "integrity": "sha512-1bavk44iyIALXpTi1P0MmPtVRNn0evxI0V+NPLchEqWmOWFnOCh+E1jPCV/+d1g00qLvFaoMelGd40Kp+ZHSyQ==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.987.0.tgz", + "integrity": "sha512-c8ZJwMbHy42CmiTIvxeOb81NoquNh4xhl1PnjgGKXaGkM9vLWVCfB5h5rL5yCWmXafX2Z0H/S1ZEK0VWvpKfCg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -2090,9 +2165,9 @@ } }, "node_modules/@aws-sdk/client-sqs": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.990.0.tgz", - "integrity": "sha512-ItlHYqVAM62ua0bnPTsKOXwXcBoCLNcZ1Ts36Q/ff8aIx1wF8KUBc62lvT4agSp+HNDWTvk0ATI74Ru9dvj17g==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.991.0.tgz", + "integrity": "sha512-7apQczqvynhNt4BRyMge+CuMLzQxSr8aj1DrKIk+YN0Qd4phiq8XGWDiclVEAyKfg7JUuYK6YIWoUYl3QdIkNg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2107,7 +2182,7 @@ "@aws-sdk/middleware-user-agent": "^3.972.10", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.991.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", "@aws-sdk/util-user-agent-node": "^3.972.8", "@smithy/config-resolver": "^4.4.6", @@ -2142,10 +2217,27 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/util-endpoints": { + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.991.0.tgz", + "integrity": "sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.990.0.tgz", - "integrity": "sha512-SQFrsCsYqgpY6HyeUGfNPepFi0CBTuJri8t9+x3Cvs5zl425XfbdfQtbQi+ecbNO8QICMD45hkBO/iP3wATSpA==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.991.0.tgz", + "integrity": "sha512-RiD8SgmGjYcguPt5HgJUluIp4HlPpT34McI/vLMHzu3CSfQSRVf80f20gnRw35WuT+K0LUxmdfzieYrvVJXkhA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -2158,7 +2250,7 @@ "@aws-sdk/middleware-user-agent": "^3.972.10", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.991.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", "@aws-sdk/util-user-agent-node": "^3.972.8", "@smithy/config-resolver": "^4.4.6", @@ -2193,6 +2285,22 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.991.0.tgz", + "integrity": "sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/client-sso": { "version": "3.990.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.990.0.tgz", @@ -2242,46 +2350,62 @@ "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-endpoints": { "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.990.0.tgz", - "integrity": "sha512-w1MfhIKV1GmQJI2gN64gvtwSPJR55n5TIkujIoZZy3V3OlksAOWCnfUBHoyfu8x4aZn70cINfa+ixPtUHtnEew==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.990.0.tgz", + "integrity": "sha512-kVwtDc9LNI3tQZHEMNbkLIOpeDK8sRSTuT8eMnzGY+O+JImPisfSTjdh+jw9OTznu+MYZjQsv0258sazVKunYg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.987.0.tgz", + "integrity": "sha512-zDqUCxS/6oUgQjIoDRfijHRgCkUTO3bnC+Hvi1Jh8s0Hj6cGpaUTCWYjwksV3bJGfS+HcloUtUseGO26Pcbeeg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.10", - "@aws-sdk/credential-provider-node": "^3.972.9", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", "@aws-sdk/middleware-host-header": "^3.972.3", "@aws-sdk/middleware-logger": "^3.972.3", "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.7", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.987.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.972.5", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/middleware-retry": "^4.4.31", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.30", - "@smithy/util-defaults-mode-node": "^4.2.33", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -2293,9 +2417,9 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.990.0.tgz", - "integrity": "sha512-oea3OJkQ7QzRavFhqtVMiZtXw+zH7kaCQecKtXKzw5u777Kw/Mo7bVgMjG3iGX9aTRqYgY/pikXSgdePPIxrcw==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.991.0.tgz", + "integrity": "sha512-s2/UNpuQYXaJXTEc565FsoBzIPRWXhjIXkfFCXKeEb4LgW2tDfZu2MucG35Uzb13UVpLD+HPw7aGQWdgtg2Now==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2309,7 +2433,7 @@ "@aws-sdk/middleware-user-agent": "^3.972.10", "@aws-sdk/region-config-resolver": "^3.972.3", "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.990.0", + "@aws-sdk/util-endpoints": "3.991.0", "@aws-sdk/util-user-agent-browser": "^3.972.3", "@aws-sdk/util-user-agent-node": "^3.972.8", "@smithy/config-resolver": "^4.4.6", @@ -2343,6 +2467,23 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/client-xray/node_modules/@aws-sdk/util-endpoints": { + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.991.0.tgz", + "integrity": "sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/core": { "version": "3.973.10", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.10.tgz", @@ -2621,26 +2762,26 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.990.0.tgz", - "integrity": "sha512-urX4CbPkqYVHErqglluwho98ulIZhB33vdg87IK6F0Uj5pdNF7YBoHMvwOXcFbiDIbYKOeqKQDynsMYRQtp7Vg==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.987.0.tgz", + "integrity": "sha512-kbZG7TdoZ60LVl54SMNIgnwktvlLcFuMaEWFvNcTdSiaZR35jURvQtfeKR6RpCt+5HYdt7MwL/KpiK9em5wcNQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.990.0", - "@aws-sdk/core": "^3.973.10", + "@aws-sdk/client-cognito-identity": "3.987.0", + "@aws-sdk/core": "^3.973.7", "@aws-sdk/credential-provider-cognito-identity": "^3.972.3", - "@aws-sdk/credential-provider-env": "^3.972.8", - "@aws-sdk/credential-provider-http": "^3.972.10", - "@aws-sdk/credential-provider-ini": "^3.972.8", - "@aws-sdk/credential-provider-login": "^3.972.8", - "@aws-sdk/credential-provider-node": "^3.972.9", - "@aws-sdk/credential-provider-process": "^3.972.8", - "@aws-sdk/credential-provider-sso": "^3.972.8", - "@aws-sdk/credential-provider-web-identity": "^3.972.8", - "@aws-sdk/nested-clients": "3.990.0", + "@aws-sdk/credential-provider-env": "^3.972.5", + "@aws-sdk/credential-provider-http": "^3.972.7", + "@aws-sdk/credential-provider-ini": "^3.972.5", + "@aws-sdk/credential-provider-login": "^3.972.5", + "@aws-sdk/credential-provider-node": "^3.972.6", + "@aws-sdk/credential-provider-process": "^3.972.5", + "@aws-sdk/credential-provider-sso": "^3.972.5", + "@aws-sdk/credential-provider-web-identity": "^3.972.5", + "@aws-sdk/nested-clients": "3.987.0", "@aws-sdk/types": "^3.973.1", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/credential-provider-imds": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", "@smithy/property-provider": "^4.2.8", @@ -2651,6 +2792,55 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/nested-clients": { + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.987.0.tgz", + "integrity": "sha512-tfoAZyZfrxAL1Gd6xl6S1Nq7mysBgJPnJIIwT6o4J624UaFVtZ5/7XQa7aj87Yjrje1c1c8Ve2kheUG+GRwK4w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.987.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.5", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/dynamodb-codec": { "version": "3.972.11", "resolved": "https://registry.npmjs.org/@aws-sdk/dynamodb-codec/-/dynamodb-codec-3.972.11.tgz", @@ -2669,17 +2859,17 @@ } }, "node_modules/@aws-sdk/ec2-metadata-service": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.990.0.tgz", - "integrity": "sha512-8bqpimaqRJbuLkM/oz/ykxvMHg2UdLdWvP2pqFq5U0DaVUtAgkfMzhT1QrCIVk6NtUHhkPkDQidfqW8fRP3HwA==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/ec2-metadata-service/-/ec2-metadata-service-3.987.0.tgz", + "integrity": "sha512-3SWCGn2BY86enoCKhsB13qnhXvhYzOAwqfyFJMTeAL6dp6LciRfbUfxn1ARF1bTxe+R23SITqynR0kN/x/H7tg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.1", "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.10", + "@smithy/node-http-handler": "^4.4.9", "@smithy/protocol-http": "^5.3.8", "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.12", + "@smithy/util-stream": "^4.5.11", "tslib": "^2.6.2" }, "engines": { @@ -2700,13 +2890,13 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.990.0.tgz", - "integrity": "sha512-wynv2gi1tBHEt7W6qh841anRMC7ruR9gvN7Pu/MKvvx3rSpBjXRHDNfDa6saScDMUrvJX79B8wIBfKTPxOJ9JQ==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.991.0.tgz", + "integrity": "sha512-q0OoWY5iZYUfPsvAosheY5w+CbOBIG+QrdQ7IrFAA8F8v/e7/yqqUpDboMv6j8pDM1FB2rAGkOKydP6gdLWMmw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "^3.973.10", - "@aws-sdk/util-dynamodb": "3.990.0", + "@aws-sdk/util-dynamodb": "3.991.0", "@smithy/core": "^3.23.0", "@smithy/smithy-client": "^4.11.3", "@smithy/types": "^4.12.0", @@ -2716,18 +2906,18 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.990.0" + "@aws-sdk/client-dynamodb": "^3.991.0" } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.990.0.tgz", - "integrity": "sha512-SHog6kMWXwLBTeVwFAd+EHwr1874Ei5ob1DTL5mLmJDwbmkFog2VDKN+9BmI4di0yxY057Ps2vhhWLhKy89wuA==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.987.0.tgz", + "integrity": "sha512-wcMA47LXtxIPb7VE44GUYx/7ypjEh1EzQZdmrVcA0Q3/OWuF8k+Lm71rXIIU5A28hsmh17X7EflJUQmCG6yVmQ==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.14", - "@smithy/smithy-client": "^4.11.3", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/smithy-client": "^4.11.2", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", @@ -2737,7 +2927,7 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.990.0" + "@aws-sdk/client-s3": "^3.987.0" } }, "node_modules/@aws-sdk/lib-storage/node_modules/buffer": { @@ -2801,15 +2991,15 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.972.8.tgz", - "integrity": "sha512-Hn6gumcN/3/8Fzo9z7N1pA2PRfE8S+qAqdb4g3MqzXjIOIe+VxD7edO/DKAJ1YH11639EGQIHBz0wdOb5btjtw==", + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.972.5.tgz", + "integrity": "sha512-SF/1MYWx67OyCrLA4icIpWUfCkdlOi8Y1KecQ9xYxkL10GMjVdPTGPnYhAg0dw5U43Y9PVUWhAV2ezOaG+0BLg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "^3.973.10", + "@aws-sdk/core": "^3.973.7", "@aws-sdk/crc64-nvme": "3.972.0", "@aws-sdk/types": "^3.973.1", "@smithy/is-array-buffer": "^4.2.0", @@ -2817,7 +3007,7 @@ "@smithy/protocol-http": "^5.3.8", "@smithy/types": "^4.12.0", "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.12", + "@smithy/util-stream": "^4.5.11", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2885,17 +3075,17 @@ } }, "node_modules/@aws-sdk/middleware-sdk-ec2": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.972.7.tgz", - "integrity": "sha512-QCfIq4jnimaUOyLkQW25tRJx1q0NbKm2dtDcqmQ+TUge90ctR0WE0oJhajJw/6adJRdN8Q2T/vEybcjTWhNx6w==", + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.972.6.tgz", + "integrity": "sha512-T/UWae2a67t1Ma1tnluAwU/SFOfg6MOonseXbz7fS7xUluBu7Jnkx7+nBqqBNxa57V780c8J+2jJQ4ZTIGxu5g==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.1", "@aws-sdk/util-format-url": "^3.972.3", - "@smithy/middleware-endpoint": "^4.4.14", + "@smithy/middleware-endpoint": "^4.4.13", "@smithy/protocol-http": "^5.3.8", "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, @@ -2918,23 +3108,23 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.10.tgz", - "integrity": "sha512-wLkB4bshbBtsAiC2WwlHzOWXu1fx3ftL63fQl0DxEda48Q6B8bcHydZppE3KjEIpPyiNOllByfSnb07cYpIgmw==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.7.tgz", + "integrity": "sha512-VtZ7tMIw18VzjG+I6D6rh2eLkJfTtByiFoCIauGDtTTPBEUMQUiGaJ/zZrPlCY6BsvLLeFKz3+E5mntgiOWmIg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.10", + "@aws-sdk/core": "^3.973.7", "@aws-sdk/types": "^3.973.1", "@aws-sdk/util-arn-parser": "^3.972.2", - "@smithy/core": "^3.23.0", + "@smithy/core": "^3.22.1", "@smithy/node-config-provider": "^4.3.8", "@smithy/protocol-http": "^5.3.8", "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.11.3", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.12", + "@smithy/util-stream": "^4.5.11", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2992,6 +3182,22 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/util-endpoints": { + "version": "3.990.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.990.0.tgz", + "integrity": "sha512-kVwtDc9LNI3tQZHEMNbkLIOpeDK8sRSTuT8eMnzGY+O+JImPisfSTjdh+jw9OTznu+MYZjQsv0258sazVKunYg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/nested-clients": { "version": "3.990.0", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.990.0.tgz", @@ -3041,6 +3247,22 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { + "version": "3.990.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.990.0.tgz", + "integrity": "sha512-kVwtDc9LNI3tQZHEMNbkLIOpeDK8sRSTuT8eMnzGY+O+JImPisfSTjdh+jw9OTznu+MYZjQsv0258sazVKunYg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/region-config-resolver": { "version": "3.972.3", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", @@ -3058,12 +3280,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.990.0.tgz", - "integrity": "sha512-O55s1eFmKi+2Ko5T1hbdxL6tFVONGscSVe9VRxS4m91Tlbo9iG2Q2HvKWq1DuKQAuUWSUfMmjrRt07JNzizr2A==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.987.0.tgz", + "integrity": "sha512-5kVC6x6+2NO+/NIXWJwN68+8cvqREsoE+tFOMyZWj2fg3EWzCnTGVIFd7hSJZJT2WiP5LqcrdEoFyXtfDta1hg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "^3.972.10", + "@aws-sdk/middleware-sdk-s3": "^3.972.7", "@aws-sdk/types": "^3.973.1", "@smithy/protocol-http": "^5.3.8", "@smithy/signature-v4": "^5.3.8", @@ -3118,9 +3340,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.990.0.tgz", - "integrity": "sha512-F9NXZAMYDUN4eUjRxlb5nx3Ne5qXG8i1lxInJFC3eKqBK4G6QrVwejIoTrMBoOVHfCPXsSqfq0cQ3xCvJK0Irg==", + "version": "3.991.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.991.0.tgz", + "integrity": "sha512-SCRcRY+T8JVNqXxe4MGyeZ25RaWgqJXMxf54e9wByiMCvdWgE9SV/Vl8xbgnDnFbWl8+56KUs3K9UemD7VIBsA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3129,13 +3351,13 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.990.0" + "@aws-sdk/client-dynamodb": "^3.991.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.990.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.990.0.tgz", - "integrity": "sha512-kVwtDc9LNI3tQZHEMNbkLIOpeDK8sRSTuT8eMnzGY+O+JImPisfSTjdh+jw9OTznu+MYZjQsv0258sazVKunYg==", + "version": "3.987.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.987.0.tgz", + "integrity": "sha512-rZnZwDq7Pn+TnL0nyS6ryAhpqTZtLtHbJaqfxuHlDX3v/bq0M7Ch/V3qF9dZWaGgsJ2H9xn7/vFOxlnL4fBMcQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.1", @@ -3308,9 +3530,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.0.tgz", - "integrity": "sha512-iluT61cORUDIC5i/y42ljyQraCemmmcgbMLLCnYO+yh+2hjTmcMFcwY8G0zTzWCsPb3t3AyKc+0t/VuhPZULUg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.2.tgz", + "integrity": "sha512-vVE/FqLxNLbvYnFDYg3Xfrh1UdFhmPT5i+yPT9GE2nTUgI4rkqo5krw5wK19YHBd7aE7J6r91RRmb8RWwkjy6w==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -3324,20 +3546,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.0", - "@biomejs/cli-darwin-x64": "2.4.0", - "@biomejs/cli-linux-arm64": "2.4.0", - "@biomejs/cli-linux-arm64-musl": "2.4.0", - "@biomejs/cli-linux-x64": "2.4.0", - "@biomejs/cli-linux-x64-musl": "2.4.0", - "@biomejs/cli-win32-arm64": "2.4.0", - "@biomejs/cli-win32-x64": "2.4.0" + "@biomejs/cli-darwin-arm64": "2.4.2", + "@biomejs/cli-darwin-x64": "2.4.2", + "@biomejs/cli-linux-arm64": "2.4.2", + "@biomejs/cli-linux-arm64-musl": "2.4.2", + "@biomejs/cli-linux-x64": "2.4.2", + "@biomejs/cli-linux-x64-musl": "2.4.2", + "@biomejs/cli-win32-arm64": "2.4.2", + "@biomejs/cli-win32-x64": "2.4.2" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.0.tgz", - "integrity": "sha512-L+YpOtPSuU0etomfvFTPWRsa7+8ejaJL3yaROEoT/96HDJbR6OsvZQk0C8JUYou+XFdP+JcGxqZknkp4n934RA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.2.tgz", + "integrity": "sha512-3pEcKCP/1POKyaZZhXcxFl3+d9njmeAihZ17k8lL/1vk+6e0Cbf0yPzKItFiT+5Yh6TQA4uKvnlqe0oVZwRxCA==", "cpu": [ "arm64" ], @@ -3352,9 +3574,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.0.tgz", - "integrity": "sha512-Aq+S7ffpb5ynTyLgtnEjG+W6xuTd2F7FdC7J6ShpvRhZwJhjzwITGF9vrqoOnw0sv1XWkt2Q1Rpg+hleg/Xg7Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.2.tgz", + "integrity": "sha512-P7hK1jLVny+0R9UwyGcECxO6sjETxfPyBm/1dmFjnDOHgdDPjPqozByunrwh4xPKld8sxOr5eAsSqal5uKgeBg==", "cpu": [ "x64" ], @@ -3369,9 +3591,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.0.tgz", - "integrity": "sha512-u2p54IhvNAWB+h7+rxCZe3reNfQYFK+ppDw+q0yegrGclFYnDPZAntv/PqgUacpC3uxTeuWFgWW7RFe3lHuxOA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.2.tgz", + "integrity": "sha512-DI3Mi7GT2zYNgUTDEbSjl3e1KhoP76OjQdm8JpvZYZWtVDRyLd3w8llSr2TWk1z+U3P44kUBWY3X7H9MD1/DGQ==", "cpu": [ "arm64" ], @@ -3386,9 +3608,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.0.tgz", - "integrity": "sha512-1rhDUq8sf7xX3tg7vbnU3WVfanKCKi40OXc4VleBMzRStmQHdeBY46aFP6VdwEomcVjyNiu+Zcr3LZtAdrZrjQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.2.tgz", + "integrity": "sha512-/x04YK9+7erw6tYEcJv9WXoBHcULI/wMOvNdAyE9S3JStZZ9yJyV67sWAI+90UHuDo/BDhq0d96LDqGlSVv7WA==", "cpu": [ "arm64" ], @@ -3403,9 +3625,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.0.tgz", - "integrity": "sha512-WVFOhsnzhrbMGOSIcB9yFdRV2oG2KkRRhIZiunI9gJqSU3ax9ErdnTxRfJUxZUI9NbzVxC60OCXNcu+mXfF/Tw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.2.tgz", + "integrity": "sha512-GK2ErnrKpWFigYP68cXiCHK4RTL4IUWhK92AFS3U28X/nuAL5+hTuy6hyobc8JZRSt+upXt1nXChK+tuHHx4mA==", "cpu": [ "x64" ], @@ -3420,9 +3642,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.0.tgz", - "integrity": "sha512-Omo0xhl63z47X+CrE5viEWKJhejJyndl577VoXg763U/aoATrK3r5+8DPh02GokWPeODX1Hek00OtjjooGan9w==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.2.tgz", + "integrity": "sha512-wbBmTkeAoAYbOQ33f6sfKG7pcRSydQiF+dTYOBjJsnXO2mWEOQHllKlC2YVnedqZFERp2WZhFUoO7TNRwnwEHQ==", "cpu": [ "x64" ], @@ -3437,9 +3659,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.0.tgz", - "integrity": "sha512-aqRwW0LJLV1v1NzyLvLWQhdLmDSAV1vUh+OBdYJaa8f28XBn5BZavo+WTfqgEzALZxlNfBmu6NGO6Al3MbCULw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.2.tgz", + "integrity": "sha512-k2uqwLYrNNxnaoiW3RJxoMGnbKda8FuCmtYG3cOtVljs3CzWxaTR+AoXwKGHscC9thax9R4kOrtWqWN0+KdPTw==", "cpu": [ "arm64" ], @@ -3454,9 +3676,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.0.tgz", - "integrity": "sha512-g47s+V+OqsGxbSZN3lpav6WYOk0PIc3aCBAq+p6dwSynL3K5MA6Cg6nkzDOlu28GEHwbakW+BllzHCJCxnfK5Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.2.tgz", + "integrity": "sha512-9ma7C4g8Sq3cBlRJD2yrsHXB1mnnEBdpy7PhvFrylQWQb4PoyCmPucdX7frvsSBQuFtIiKCrolPl/8tCZrKvgQ==", "cpu": [ "x64" ], @@ -5099,6 +5321,7 @@ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -5343,7 +5566,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/aws-lambda": { "version": "8.10.160", @@ -5470,90 +5694,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@valkey/valkey-glide-darwin-arm64": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-arm64/-/valkey-glide-darwin-arm64-2.2.7.tgz", - "integrity": "sha512-jfkMtrgbgpLTE9AwIcd2mc7jhQn28Y6PMPHlMi3yiqQlITOkNE4WFTKCFtbVMfoLVr/RWl4mwZWVhbmAd7WKtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@valkey/valkey-glide-darwin-x64": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-darwin-x64/-/valkey-glide-darwin-x64-2.2.7.tgz", - "integrity": "sha512-D5LrfFz3AGMgwdV5Yp/pN9gsNvPj+ndAgj2mUcHIYcUPsr4+kpHGQ2sYJVqxZ0pPUskjRZU7wQz8QJvVO2gnXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@valkey/valkey-glide-linux-arm64-gnu": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-gnu/-/valkey-glide-linux-arm64-gnu-2.2.7.tgz", - "integrity": "sha512-mWKUkcRmx0n308mHDAZNzP/GrC6Tai/ze3B+FodU1O7AIwPGhjxNpXulhZNXNpc3C/g+YpyMnRkQG/oWKa7VRw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@valkey/valkey-glide-linux-arm64-musl": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-arm64-musl/-/valkey-glide-linux-arm64-musl-2.2.7.tgz", - "integrity": "sha512-zDscgnt55OdwjcO3U6RDwLkIRDJFqUc06rRq8Keq8m4JC3YaVzY9FixfTqv/J/zLxgwxZN/YfkdQaViKG1omZA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@valkey/valkey-glide-linux-x64-gnu": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-gnu/-/valkey-glide-linux-x64-gnu-2.2.7.tgz", - "integrity": "sha512-KiZQesida80/tEdhf1n3qrV2cjL0CWxaXaIC6Uu+pSXxANi72Ua+V5AUlz3Cze10PkUDUQWAkWrEOnQ1aFuhfw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@valkey/valkey-glide-linux-x64-musl": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@valkey/valkey-glide-linux-x64-musl/-/valkey-glide-linux-x64-musl-2.2.7.tgz", - "integrity": "sha512-fV0+Wpv+x3WvkbxWOq1+M+deNo17DcdwxmlzpHtXR1krwpmuv8+9U4gpd/XZMJQOa0gpSD21ZBF3ClalaOInmw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@vitest/coverage-v8": { "version": "4.0.18", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.18.tgz", @@ -6109,6 +6249,44 @@ "node": ">=10" } }, + "node_modules/aws-cdk-lib/node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "48.20.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.20.0.tgz", + "integrity": "sha512-+eeiav9LY4wbF/EFuCt/vfvi/Zoxo8bf94PW5clbMraChEliq83w4TbRVy0jB9jE0v1ooFTtIjSQkowSPkfISg==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "inBundle": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "jsonschema": "~1.4.1", + "semver": "^7.7.2" + }, + "engines": { + "node": ">= 18.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.7.2", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { "version": "1.0.2", "inBundle": true, @@ -6424,6 +6602,7 @@ "integrity": "sha512-h/tOYTkXEsAcV3//6C1/7U4ifSpKyJvb6auveAepqqNJl6TdZaPFEtKjBQNf8UxQdDP850knB2i/whq4zlsxJw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/sinon": "^17.0.3", "sinon": "^18.0.1", @@ -6544,9 +6723,9 @@ "license": "MIT" }, "node_modules/bowser": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", - "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", "license": "MIT" }, "node_modules/brace-expansion": { @@ -6841,7 +7020,8 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.4.5.tgz", "integrity": "sha512-fOoP70YLevMZr5avJHx2DU3LNYmC6wM8OwdrNewMZou1kZnPGOeVzBrRjZNgFDHUlulYUjkpFRSpTE3D+n+ZSg==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/core-util-is": { "version": "1.0.3", @@ -7261,6 +7441,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", @@ -7582,9 +7775,9 @@ } }, "node_modules/jackspeak": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.1.tgz", - "integrity": "sha512-GPBXyfcZSGujjddPeA+V34bW70ZJT7jzCEbloVasSH4yjiqWqXHX8iZQtZdVbOhc5esSeAIuiSmMutRZQB/olg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^9.0.0" @@ -7814,9 +8007,9 @@ "license": "Apache-2.0" }, "node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -7915,6 +8108,7 @@ "integrity": "sha512-DzzmbqfMW3EzHsunP66x556oZDzjcdjjlL2bHG4PubwnL58ZPAfz07px4GqteZkoCGnBYi779Y2mg7+vgNCwbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "globby": "16.1.0", "js-yaml": "4.1.1", @@ -9043,6 +9237,16 @@ "node": ">=0.10.0" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -9712,6 +9916,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -9748,6 +9953,26 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -9764,6 +9989,7 @@ "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@gerrit0/mini-shiki": "^3.17.0", "lunr": "^2.3.9", @@ -9798,6 +10024,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9887,6 +10114,7 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -9980,6 +10208,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -9993,6 +10222,7 @@ "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", @@ -10319,7 +10549,8 @@ "@aws-lambda-powertools/testing-utils": "file:../testing" }, "peerDependencies": { - "@aws-lambda-powertools/tracer": ">=2.31.0" + "@aws-lambda-powertools/tracer": ">=2.31.0", + "@standard-schema/spec": "^1.0.0" }, "peerDependenciesMeta": { "@aws-lambda-powertools/tracer": { diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index 9f79813790..0b999aa718 100644 --- a/packages/event-handler/package.json +++ b/packages/event-handler/package.json @@ -147,7 +147,8 @@ "@aws-lambda-powertools/commons": "2.31.0" }, "peerDependencies": { - "@aws-lambda-powertools/tracer": ">=2.31.0" + "@aws-lambda-powertools/tracer": ">=2.31.0", + "@standard-schema/spec": "^1.0.0" }, "peerDependenciesMeta": { "@aws-lambda-powertools/tracer": { diff --git a/packages/event-handler/src/http/Route.ts b/packages/event-handler/src/http/Route.ts index 57fca99a65..6e528571a8 100644 --- a/packages/event-handler/src/http/Route.ts +++ b/packages/event-handler/src/http/Route.ts @@ -1,21 +1,27 @@ import type { + HandlerResponse, HttpMethod, Middleware, Path, + ReqSchema, RouteHandler, + TypedRouteHandler, } from '../types/http.js'; -class Route { +class Route< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, +> { readonly id: string; readonly method: string; readonly path: Path; - readonly handler: RouteHandler; + readonly handler: RouteHandler | TypedRouteHandler; readonly middleware: Middleware[]; constructor( method: HttpMethod, path: Path, - handler: RouteHandler, + handler: RouteHandler | TypedRouteHandler, middleware: Middleware[] = [] ) { this.id = `${method}:${path}`; diff --git a/packages/event-handler/src/http/RouteHandlerRegistry.ts b/packages/event-handler/src/http/RouteHandlerRegistry.ts index ca5b9f3247..f0d2398359 100644 --- a/packages/event-handler/src/http/RouteHandlerRegistry.ts +++ b/packages/event-handler/src/http/RouteHandlerRegistry.ts @@ -2,9 +2,12 @@ import type { GenericLogger } from '@aws-lambda-powertools/commons/types'; import { isRegExp } from '@aws-lambda-powertools/commons/typeutils'; import type { DynamicRoute, + HandlerResponse, HttpMethod, HttpRouteHandlerOptions, Path, + ReqSchema, + RouteHandler, RouteRegistryOptions, ValidationResult, } from '../types/http.js'; @@ -94,7 +97,10 @@ class RouteHandlerRegistry { * * @param route - The route to register */ - public register(route: Route): void { + public register< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >(route: Route): void { this.#shouldSort = true; const { isValid, issues } = validatePathPattern(route.path); if (!isValid) { @@ -115,14 +121,14 @@ class RouteHandlerRegistry { this.#regexRoutes.set(route.id, { ...route, ...compiled, - }); + } as DynamicRoute); return; } if (compiled.isDynamic) { const dynamicRoute = { ...route, ...compiled, - }; + } as DynamicRoute; if (this.#dynamicRoutesSet.has(route.id)) { this.#logger.warn( `Handler for method: ${route.method} and path: ${route.path} already exists. The previous handler will be replaced.` @@ -144,7 +150,7 @@ class RouteHandlerRegistry { `Handler for method: ${route.method} and path: ${route.path} already exists. The previous handler will be replaced.` ); } - this.#staticRoutes.set(route.id, route); + this.#staticRoutes.set(route.id, route as unknown as Route); } } /** @@ -179,7 +185,7 @@ class RouteHandlerRegistry { const staticRoute = this.#staticRoutes.get(routeId); if (staticRoute != null) { return { - handler: staticRoute.handler, + handler: staticRoute.handler as RouteHandler, rawParams: {}, params: {}, middleware: staticRoute.middleware, @@ -241,7 +247,7 @@ class RouteHandlerRegistry { } return { - handler: route.handler, + handler: route.handler as RouteHandler, params: processedParams, rawParams: params, middleware: route.middleware, diff --git a/packages/event-handler/src/http/Router.ts b/packages/event-handler/src/http/Router.ts index 1258aab7c3..e2024f2856 100644 --- a/packages/event-handler/src/http/Router.ts +++ b/packages/event-handler/src/http/Router.ts @@ -23,17 +23,24 @@ import type { ErrorConstructor, ErrorHandler, ErrorResolveOptions, + HandlerOrOptions, HttpMethod, HttpResolveOptions, HttpRouteOptions, HttpRouterOptions, + InferReqSchema, + InferResBody, Middleware, + MiddlewareOrHandler, Path, + ReqSchema, RequestContext, ResolveStreamOptions, ResponseStream, RouteHandler, RouterResponse, + TypedRouteHandler, + ValidationConfig, } from '../types/http.js'; import type { HandlerResponse, ResolveOptions } from '../types/index.js'; import { HttpStatusCodes, HttpVerbs } from './constants.js'; @@ -51,6 +58,7 @@ import { MethodNotAllowedError, NotFoundError, } from './errors.js'; +import { validate } from './middleware/validation.js'; import { Route } from './Route.js'; import { RouteHandlerRegistry } from './RouteHandlerRegistry.js'; import { @@ -443,14 +451,30 @@ class Router { } } - public route(handler: RouteHandler, options: HttpRouteOptions): void { - const { method, path, middleware = [] } = options; + public route< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >( + handler: RouteHandler | TypedRouteHandler, + options: HttpRouteOptions + ): void { + const { method, path, middleware = [], validation } = options; const methods = Array.isArray(method) ? method : [method]; const resolvedPath = resolvePrefixedPath(path, this.prefix); + // Create validation middleware if validation config provided + const allMiddleware = validation + ? [ + ...middleware, + validate( + validation as ValidationConfig + ), + ] + : middleware; + for (const method of methods) { this.routeRegistry.register( - new Route(method, resolvedPath, handler, middleware) + new Route(method, resolvedPath, handler, allMiddleware) ); } } @@ -562,15 +586,25 @@ class Router { ); } - #handleHttpMethod( + #handleHttpMethod< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >( method: HttpMethod, path: Path, - middlewareOrHandler?: Middleware[] | RouteHandler, - handler?: RouteHandler + middlewareOrHandler?: MiddlewareOrHandler, + handlerOrOptions?: HandlerOrOptions, + options?: { validation: ValidationConfig } ): MethodDecorator | undefined { + // Case 1: method(path, [middleware], handler, { validation }) if (Array.isArray(middlewareOrHandler)) { - if (handler && typeof handler === 'function') { - this.route(handler, { method, path, middleware: middlewareOrHandler }); + if (handlerOrOptions && typeof handlerOrOptions === 'function') { + this.route(handlerOrOptions, { + method, + path, + middleware: middlewareOrHandler, + ...options, + }); return; } return (_target, _propertyKey, descriptor: PropertyDescriptor) => { @@ -578,16 +612,29 @@ class Router { method, path, middleware: middlewareOrHandler, + ...options, }); return descriptor; }; } + // Case 2: method(path, handler, { validation }) or method(path, handler) if (middlewareOrHandler && typeof middlewareOrHandler === 'function') { + // Check if handlerOrOptions is an options object (not a function) + if ( + handlerOrOptions && + typeof handlerOrOptions === 'object' && + !Array.isArray(handlerOrOptions) + ) { + this.route(middlewareOrHandler, { method, path, ...handlerOrOptions }); + return; + } + // No options provided this.route(middlewareOrHandler, { method, path }); return; } + // Case 3: Decorator usage return (_target, _propertyKey, descriptor: PropertyDescriptor) => { this.route(descriptor.value, { method, path }); return descriptor; @@ -598,16 +645,41 @@ class Router { public get(path: Path, middleware: Middleware[], handler: RouteHandler): void; public get(path: Path): MethodDecorator; public get(path: Path, middleware: Middleware[]): MethodDecorator; - public get( + public get( + path: Path, + handler: RouteHandler + ): void; + public get( + path: Path, + middleware: Middleware[], + handler: RouteHandler + ): void; + public get( + path: Path, + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public get( + path: Path, + middleware: Middleware[], + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public get< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >( path: Path, - middlewareOrHandler?: Middleware[] | RouteHandler, - handler?: RouteHandler + middlewareOrHandler?: MiddlewareOrHandler, + handlerOrOptions?: HandlerOrOptions, + options?: { validation: ValidationConfig } ): MethodDecorator | undefined { return this.#handleHttpMethod( HttpVerbs.GET, path, middlewareOrHandler, - handler + handlerOrOptions, + options ); } @@ -619,16 +691,41 @@ class Router { ): void; public post(path: Path): MethodDecorator; public post(path: Path, middleware: Middleware[]): MethodDecorator; - public post( + public post( + path: Path, + handler: RouteHandler + ): void; + public post( path: Path, - middlewareOrHandler?: Middleware[] | RouteHandler, - handler?: RouteHandler + middleware: Middleware[], + handler: RouteHandler + ): void; + public post( + path: Path, + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public post( + path: Path, + middleware: Middleware[], + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public post< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >( + path: Path, + middlewareOrHandler?: MiddlewareOrHandler, + handlerOrOptions?: HandlerOrOptions, + options?: { validation: ValidationConfig } ): MethodDecorator | undefined { return this.#handleHttpMethod( HttpVerbs.POST, path, middlewareOrHandler, - handler + handlerOrOptions, + options ); } @@ -636,16 +733,41 @@ class Router { public put(path: Path, middleware: Middleware[], handler: RouteHandler): void; public put(path: Path): MethodDecorator; public put(path: Path, middleware: Middleware[]): MethodDecorator; - public put( + public put( + path: Path, + handler: RouteHandler + ): void; + public put( + path: Path, + middleware: Middleware[], + handler: RouteHandler + ): void; + public put( path: Path, - middlewareOrHandler?: Middleware[] | RouteHandler, - handler?: RouteHandler + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public put( + path: Path, + middleware: Middleware[], + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public put< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >( + path: Path, + middlewareOrHandler?: MiddlewareOrHandler, + handlerOrOptions?: HandlerOrOptions, + options?: { validation: ValidationConfig } ): MethodDecorator | undefined { return this.#handleHttpMethod( HttpVerbs.PUT, path, middlewareOrHandler, - handler + handlerOrOptions, + options ); } @@ -657,16 +779,41 @@ class Router { ): void; public patch(path: Path): MethodDecorator; public patch(path: Path, middleware: Middleware[]): MethodDecorator; - public patch( + public patch( + path: Path, + handler: RouteHandler + ): void; + public patch( + path: Path, + middleware: Middleware[], + handler: RouteHandler + ): void; + public patch( + path: Path, + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public patch( + path: Path, + middleware: Middleware[], + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public patch< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >( path: Path, - middlewareOrHandler?: Middleware[] | RouteHandler, - handler?: RouteHandler + middlewareOrHandler?: MiddlewareOrHandler, + handlerOrOptions?: HandlerOrOptions, + options?: { validation: ValidationConfig } ): MethodDecorator | undefined { - return this.#handleHttpMethod( + return this.#handleHttpMethod( HttpVerbs.PATCH, path, middlewareOrHandler, - handler + handlerOrOptions, + options ); } @@ -678,16 +825,41 @@ class Router { ): void; public delete(path: Path): MethodDecorator; public delete(path: Path, middleware: Middleware[]): MethodDecorator; - public delete( + public delete( + path: Path, + handler: RouteHandler + ): void; + public delete( + path: Path, + middleware: Middleware[], + handler: RouteHandler + ): void; + public delete( + path: Path, + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public delete( path: Path, - middlewareOrHandler?: Middleware[] | RouteHandler, - handler?: RouteHandler + middleware: Middleware[], + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public delete< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >( + path: Path, + middlewareOrHandler?: MiddlewareOrHandler, + handlerOrOptions?: HandlerOrOptions, + options?: { validation: ValidationConfig } ): MethodDecorator | undefined { - return this.#handleHttpMethod( + return this.#handleHttpMethod( HttpVerbs.DELETE, path, middlewareOrHandler, - handler + handlerOrOptions, + options ); } @@ -699,16 +871,41 @@ class Router { ): void; public head(path: Path): MethodDecorator; public head(path: Path, middleware: Middleware[]): MethodDecorator; - public head( + public head( + path: Path, + handler: RouteHandler + ): void; + public head( path: Path, - middlewareOrHandler?: Middleware[] | RouteHandler, - handler?: RouteHandler + middleware: Middleware[], + handler: RouteHandler + ): void; + public head( + path: Path, + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public head( + path: Path, + middleware: Middleware[], + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public head< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >( + path: Path, + middlewareOrHandler?: MiddlewareOrHandler, + handlerOrOptions?: HandlerOrOptions, + options?: { validation: ValidationConfig } ): MethodDecorator | undefined { - return this.#handleHttpMethod( + return this.#handleHttpMethod( HttpVerbs.HEAD, path, middlewareOrHandler, - handler + handlerOrOptions, + options ); } @@ -720,16 +917,41 @@ class Router { ): void; public options(path: Path): MethodDecorator; public options(path: Path, middleware: Middleware[]): MethodDecorator; - public options( + public options( path: Path, - middlewareOrHandler?: Middleware[] | RouteHandler, - handler?: RouteHandler + handler: RouteHandler + ): void; + public options( + path: Path, + middleware: Middleware[], + handler: RouteHandler + ): void; + public options( + path: Path, + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public options( + path: Path, + middleware: Middleware[], + handler: TypedRouteHandler, InferResBody>, + options: { validation: V } + ): void; + public options< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, + >( + path: Path, + middlewareOrHandler?: MiddlewareOrHandler, + handlerOrOptions?: HandlerOrOptions, + options?: { validation: ValidationConfig } ): MethodDecorator | undefined { - return this.#handleHttpMethod( + return this.#handleHttpMethod( HttpVerbs.OPTIONS, path, middlewareOrHandler, - handler + handlerOrOptions, + options ); } diff --git a/packages/event-handler/src/http/errors.ts b/packages/event-handler/src/http/errors.ts index 58e022b4cc..f75b8e3840 100644 --- a/packages/event-handler/src/http/errors.ts +++ b/packages/event-handler/src/http/errors.ts @@ -1,4 +1,5 @@ import type { JSONValue } from '@aws-lambda-powertools/commons/types'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; import type { HttpStatusCode } from '../types/http.js'; import { HttpStatusCodes } from './constants.js'; @@ -179,6 +180,44 @@ class ServiceUnavailableError extends HttpError { } } +class RequestValidationError extends HttpError { + readonly statusCode = HttpStatusCodes.UNPROCESSABLE_ENTITY; + readonly errorType = 'RequestValidationError'; + + constructor( + message?: string, + issues?: StandardSchemaV1.FailureResult['issues'], + options?: ErrorOptions + ) { + super(message, options, { + issues: issues?.map((issue) => ({ + message: issue.message, + path: issue.path, + })), + }); + this.name = 'RequestValidationError'; + } +} + +class ResponseValidationError extends HttpError { + readonly statusCode = HttpStatusCodes.INTERNAL_SERVER_ERROR; + readonly errorType = 'ResponseValidationError'; + + constructor( + message?: string, + issues?: StandardSchemaV1.FailureResult['issues'], + options?: ErrorOptions + ) { + super(message, options, { + issues: issues?.map((issue) => ({ + message: issue.message, + path: issue.path, + })), + }); + this.name = 'ResponseValidationError'; + } +} + class InvalidEventError extends Error { constructor(message?: string) { super(message); @@ -204,6 +243,8 @@ export { ParameterValidationError, RequestEntityTooLargeError, RequestTimeoutError, + RequestValidationError, + ResponseValidationError, RouteMatchingError, HttpError, ServiceUnavailableError, diff --git a/packages/event-handler/src/http/index.ts b/packages/event-handler/src/http/index.ts index f2ee9d1664..7d1c7e496c 100644 --- a/packages/event-handler/src/http/index.ts +++ b/packages/event-handler/src/http/index.ts @@ -14,6 +14,8 @@ export { ParameterValidationError, RequestEntityTooLargeError, RequestTimeoutError, + RequestValidationError, + ResponseValidationError, RouteMatchingError, ServiceUnavailableError, UnauthorizedError, diff --git a/packages/event-handler/src/http/middleware/index.ts b/packages/event-handler/src/http/middleware/index.ts index 1c45084b3a..13d8394c71 100644 --- a/packages/event-handler/src/http/middleware/index.ts +++ b/packages/event-handler/src/http/middleware/index.ts @@ -1,3 +1,4 @@ export { compress } from './compress.js'; export { cors } from './cors.js'; export { tracer } from './tracer.js'; +export { validate } from './validation.js'; diff --git a/packages/event-handler/src/http/middleware/validation.ts b/packages/event-handler/src/http/middleware/validation.ts new file mode 100644 index 0000000000..abb7bfb97e --- /dev/null +++ b/packages/event-handler/src/http/middleware/validation.ts @@ -0,0 +1,208 @@ +import type { StandardSchemaV1 } from '@standard-schema/spec'; +import type { + HandlerResponse, + Middleware, + ReqSchema, + TypedRequestContext, + ValidatedRequest, + ValidatedResponse, + ValidationConfig, +} from '../../types/http.js'; +import { RequestValidationError, ResponseValidationError } from '../errors.js'; + +/** + * Creates a validation middleware from the provided validation configuration. + * + * @param config - Validation configuration for request and response + * @returns Middleware function that validates request/response + */ +export const validate = < + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, +>( + config: ValidationConfig +): Middleware => { + const reqSchemas = config?.req; + const resSchemas = config?.res; + + return async ({ reqCtx, next }) => { + const typedReqCtx = reqCtx as TypedRequestContext; + typedReqCtx.valid = { + req: {} as ValidatedRequest, + res: {} as ValidatedResponse, + }; + + if (reqSchemas) { + await validateRequestData(typedReqCtx, reqSchemas); + } + + await next(); + + if (resSchemas) { + await validateResponseData(typedReqCtx, resSchemas); + } + }; +}; + +async function validateRequestData( + typedReqCtx: TypedRequestContext, + reqSchemas: NonNullable['req']> +): Promise { + const schemaEntries: [string, StandardSchemaV1][] = []; + const dataEntries: [string, unknown][] = []; + + if (reqSchemas.body) { + const bodyData = await extractBody(typedReqCtx.req); + schemaEntries.push(['body', reqSchemas.body]); + dataEntries.push(['body', bodyData]); + } + + if (reqSchemas.headers) { + const headers = Object.fromEntries(typedReqCtx.req.headers.entries()); + schemaEntries.push(['headers', reqSchemas.headers]); + dataEntries.push(['headers', headers]); + } + + if (reqSchemas.path) { + schemaEntries.push(['path', reqSchemas.path]); + dataEntries.push(['path', typedReqCtx.params]); + } + + if (reqSchemas.query) { + const query = Object.fromEntries( + new URL(typedReqCtx.req.url).searchParams.entries() + ); + schemaEntries.push(['query', reqSchemas.query]); + dataEntries.push(['query', query]); + } + + const stitchedSchema = createObjectSchema(schemaEntries); + const stitchedData = Object.fromEntries(dataEntries); + + const result = await stitchedSchema['~standard'].validate(stitchedData); + + if ('issues' in result) { + throw new RequestValidationError( + 'Validation failed for request', + result.issues + ); + } + + const validated = result.value as Record; + if (reqSchemas.body) + typedReqCtx.valid.req.body = validated.body as TReq['body']; + if (reqSchemas.headers) + typedReqCtx.valid.req.headers = validated.headers as TReq['headers']; + if (reqSchemas.path) + typedReqCtx.valid.req.path = validated.path as TReq['path']; + if (reqSchemas.query) + typedReqCtx.valid.req.query = validated.query as TReq['query']; +} + +async function validateResponseData( + typedReqCtx: TypedRequestContext, + resSchemas: NonNullable['res']> +): Promise { + const response = typedReqCtx.res; + const schemaEntries: [string, StandardSchemaV1][] = []; + const dataEntries: [string, unknown][] = []; + + if (resSchemas.body && response.body) { + const bodyData = await extractBody(response); + schemaEntries.push(['body', resSchemas.body]); + dataEntries.push(['body', bodyData]); + } + + if (resSchemas.headers) { + const headers = Object.fromEntries(response.headers.entries()); + schemaEntries.push(['headers', resSchemas.headers]); + dataEntries.push(['headers', headers]); + } + + const stitchedSchema = createObjectSchema(schemaEntries); + const stitchedData = Object.fromEntries(dataEntries); + + const result = await stitchedSchema['~standard'].validate(stitchedData); + + if ('issues' in result) { + throw new ResponseValidationError( + 'Validation failed for response', + result.issues + ); + } + + const validated = result.value as Record; + if (resSchemas.body) { + typedReqCtx.valid.res.body = validated.body as TResBody; + } + if (resSchemas.headers) { + typedReqCtx.valid.res.headers = validated.headers as Record; + } +} + +function createObjectSchema( + entries: [string, StandardSchemaV1][] +): StandardSchemaV1 { + return { + '~standard': { + version: 1, + vendor: 'powertools', + validate: async (data): Promise> => { + const dataObj = data as Record; + const validated: Record = {}; + const allIssues: StandardSchemaV1.Issue[] = []; + + for (const [key, schema] of entries) { + const result = await schema['~standard'].validate(dataObj[key]); + + for (const issue of result.issues ?? []) { + allIssues.push({ + message: issue.message, + path: [key, ...(issue.path || [])], + }); + } + + if ('value' in result) { + validated[key] = result.value; + } + } + + if (allIssues.length > 0) { + return { issues: allIssues }; + } + + return { value: validated }; + }, + }, + }; +} + +async function extractBody(source: Request | Response): Promise { + const cloned = source.clone(); + const contentType = source.headers.get('content-type'); + + if (contentType?.includes('application/json')) { + try { + return await cloned.json(); + } catch { + if (source instanceof Request) { + throw new RequestValidationError( + 'Validation failed for request body', + [], + { + cause: new Error('Invalid JSON body'), + } + ); + } + throw new ResponseValidationError( + 'Validation failed for response body', + [], + { + cause: new Error('Invalid JSON body'), + } + ); + } + } + + return await cloned.text(); +} diff --git a/packages/event-handler/src/types/http.ts b/packages/event-handler/src/types/http.ts index f8d800b4d3..892f3705f8 100644 --- a/packages/event-handler/src/types/http.ts +++ b/packages/event-handler/src/types/http.ts @@ -3,6 +3,7 @@ import type { GenericLogger, JSONValue, } from '@aws-lambda-powertools/commons/types'; +import type { StandardSchemaV1 } from '@standard-schema/spec'; import type { ALBEvent, ALBResult, @@ -24,6 +25,34 @@ type ResponseTypeMap = { ALB: ALBResult; }; +/** + * Request validation type parameters + */ +type ReqSchema = { + body?: unknown; + headers?: Record; + path?: Record; + query?: Record; +}; + +/** + * Validated request data + */ +type ValidatedRequest = { + body: TReq['body']; + headers: TReq['headers']; + path: TReq['path']; + query: TReq['query']; +}; + +/** + * Validated response data + */ +type ValidatedResponse = { + body: TBody; + headers: Record; +}; + type RequestContext = { req: Request; event: APIGatewayProxyEvent | APIGatewayProxyEventV2 | ALBEvent; @@ -35,6 +64,16 @@ type RequestContext = { isHttpStreaming?: boolean; }; +type TypedRequestContext< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, +> = RequestContext & { + valid: { + req: ValidatedRequest; + res: ValidatedResponse; + }; +}; + type HttpResolveOptions = ResolveOptions & { isHttpStreaming?: boolean }; type ErrorResolveOptions = RequestContext & ResolveOptions; @@ -95,6 +134,13 @@ type RouteHandler = ( reqCtx: RequestContext ) => Promise | TReturn; +type TypedRouteHandler< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, +> = ( + reqCtx: TypedRequestContext +) => Promise | TResBody; + type HttpMethod = keyof typeof HttpVerbs; type HttpStatusCode = (typeof HttpStatusCodes)[keyof typeof HttpStatusCodes]; @@ -112,13 +158,14 @@ type HttpRouteOptions = { method: HttpMethod | HttpMethod[]; path: Path; middleware?: Middleware[]; + validation?: ValidationConfig; }; // biome-ignore lint/suspicious/noConfusingVoidType: To ensure next function is awaited type NextFunction = () => Promise; type Middleware = (args: { - reqCtx: RequestContext; + reqCtx: RequestContext | TypedRequestContext; next: NextFunction; // biome-ignore lint/suspicious/noConfusingVoidType: To ensure next function is awaited }) => Promise; @@ -271,6 +318,127 @@ type RouterResponse = | APIGatewayProxyStructuredResultV2 | ALBResult; +/** + * Configuration for request validation. + * At least one of body, headers, path, or query must be provided. + */ +type RequestValidationConfig = + | { + body: StandardSchemaV1; + headers?: StandardSchemaV1; + path?: StandardSchemaV1; + query?: StandardSchemaV1; + } + | { + body?: StandardSchemaV1; + headers: StandardSchemaV1; + path?: StandardSchemaV1; + query?: StandardSchemaV1; + } + | { + body?: StandardSchemaV1; + headers?: StandardSchemaV1; + path: StandardSchemaV1; + query?: StandardSchemaV1; + } + | { + body?: StandardSchemaV1; + headers?: StandardSchemaV1; + path?: StandardSchemaV1; + query: StandardSchemaV1; + }; + +/** + * Configuration for response validation. + * At least one of body or headers must be provided. + */ +type ResponseValidationConfig = + | { + body: StandardSchemaV1; + headers?: StandardSchemaV1>; + } + | { + body?: StandardSchemaV1; + headers: StandardSchemaV1>; + }; + +/** + * Validation configuration for request and response. + * At least one of req or res must be provided. + */ +type ValidationConfig< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, +> = + | { + req: RequestValidationConfig; + res?: ResponseValidationConfig; + } + | { + req?: RequestValidationConfig; + res: ResponseValidationConfig; + }; + +/** + * Infers the `ReqSchema` type from a `ValidationConfig` by extracting the output types + * from each request schema (body, headers, path, query). + */ +type InferReqSchema = V extends { + req: infer R; +} + ? { + body: R extends { body: StandardSchemaV1 } + ? O + : undefined; + headers: R extends { headers: StandardSchemaV1 } + ? O + : undefined; + path: R extends { path: StandardSchemaV1 } + ? O + : undefined; + query: R extends { query: StandardSchemaV1 } + ? O + : undefined; + } + : ReqSchema; + +/** + * Infers the response body type from a `ValidationConfig` by extracting the output type + * from the response body schema. + */ +type InferResBody = V extends { + res: { body: StandardSchemaV1 }; +} + ? O + : HandlerResponse; + +/** + * Validation error details + */ +type ValidationErrorDetail = { + component: 'body' | 'headers' | 'path' | 'query'; + message: string; +}; + +/** + * Union type for middleware array or route handler + */ +type MiddlewareOrHandler< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, +> = Middleware[] | RouteHandler | TypedRouteHandler; + +/** + * Union type for route handler or validation options + */ +type HandlerOrOptions< + TReq extends ReqSchema = ReqSchema, + TResBody extends HandlerResponse = HandlerResponse, +> = + | RouteHandler + | TypedRouteHandler + | { validation: ValidationConfig }; + export type { BinaryResult, ExtendedAPIGatewayProxyResult, @@ -289,6 +457,7 @@ export type { Middleware, Path, RequestContext, + TypedRequestContext, ResponseType, ResponseTypeMap, HttpRouterOptions, @@ -305,4 +474,16 @@ export type { NextFunction, V1Headers, WebResponseToProxyResultOptions, + RequestValidationConfig, + ResponseValidationConfig, + ValidationConfig, + ValidationErrorDetail, + ValidatedRequest, + ValidatedResponse, + TypedRouteHandler, + MiddlewareOrHandler, + HandlerOrOptions, + ReqSchema, + InferReqSchema, + InferResBody, }; diff --git a/packages/event-handler/src/types/index.ts b/packages/event-handler/src/types/index.ts index abbb6954f8..f2deeed6ea 100644 --- a/packages/event-handler/src/types/index.ts +++ b/packages/event-handler/src/types/index.ts @@ -46,4 +46,5 @@ export type { RequestContext, RouteHandler, TracerOptions, + TypedRequestContext, } from './http.js'; diff --git a/packages/event-handler/tests/unit/http/errors.test.ts b/packages/event-handler/tests/unit/http/errors.test.ts index f7a37a8032..63e32d9708 100644 --- a/packages/event-handler/tests/unit/http/errors.test.ts +++ b/packages/event-handler/tests/unit/http/errors.test.ts @@ -8,6 +8,8 @@ import { NotFoundError, RequestEntityTooLargeError, RequestTimeoutError, + RequestValidationError, + ResponseValidationError, ServiceUnavailableError, UnauthorizedError, } from '../../../src/http/index.js'; @@ -289,4 +291,178 @@ describe('HTTP Error Classes', () => { expect(error.cause).toBe(cause); }); + + describe('RequestValidationError', () => { + it('creates error with correct statusCode', () => { + const error = new RequestValidationError( + 'Validation failed for request body' + ); + + expect(error.statusCode).toBe(HttpStatusCodes.UNPROCESSABLE_ENTITY); + expect(error.statusCode).toBe(422); + }); + + it('creates error with correct errorType', () => { + const error = new RequestValidationError( + 'Validation failed for request body' + ); + + expect(error.errorType).toBe('RequestValidationError'); + expect(error.name).toBe('RequestValidationError'); + }); + + it('stores validation issues', () => { + const issues = [ + { message: 'Required field missing', path: ['name'] }, + { message: 'Invalid type', path: ['age'] }, + ]; + const error = new RequestValidationError( + 'Validation failed for request body', + issues + ); + + expect(error.details?.issues).toEqual([ + { message: 'Required field missing', path: ['name'] }, + { message: 'Invalid type', path: ['age'] }, + ]); + }); + + it('passes options to Error superclass', () => { + const cause = new Error('Root cause'); + const error = new RequestValidationError( + 'Validation failed for request body', + undefined, + { cause } + ); + + expect(error.cause).toBe(cause); + }); + + it('converts to JSON response', () => { + const error = new RequestValidationError( + 'Validation failed for request body' + ); + + const json = error.toJSON(); + expect(json).toEqual({ + statusCode: 422, + error: 'RequestValidationError', + message: 'Validation failed for request body', + details: { + issues: undefined, + }, + }); + }); + + it('includes issues in JSON when provided', () => { + const issues = [ + { message: 'Required field missing', path: ['name'] }, + { message: 'Invalid type', path: ['age'] }, + ]; + const error = new RequestValidationError( + 'Validation failed for request body', + issues + ); + + const json = error.toJSON(); + expect(json).toEqual({ + statusCode: 422, + error: 'RequestValidationError', + message: 'Validation failed for request body', + details: { + issues: [ + { message: 'Required field missing', path: ['name'] }, + { message: 'Invalid type', path: ['age'] }, + ], + }, + }); + }); + }); + + describe('ResponseValidationError', () => { + it('creates error with correct statusCode', () => { + const error = new ResponseValidationError( + 'Validation failed for response body' + ); + + expect(error.statusCode).toBe(HttpStatusCodes.INTERNAL_SERVER_ERROR); + expect(error.statusCode).toBe(500); + }); + + it('creates error with correct errorType', () => { + const error = new ResponseValidationError( + 'Validation failed for response body' + ); + + expect(error.errorType).toBe('ResponseValidationError'); + expect(error.name).toBe('ResponseValidationError'); + }); + + it('stores validation issues', () => { + const issues = [ + { message: 'Required field missing', path: ['id'] }, + { message: 'Invalid format', path: ['email'] }, + ]; + const error = new ResponseValidationError( + 'Validation failed for response body', + issues + ); + + expect(error.details?.issues).toEqual([ + { message: 'Required field missing', path: ['id'] }, + { message: 'Invalid format', path: ['email'] }, + ]); + }); + + it('passes options to Error superclass', () => { + const cause = new Error('Root cause'); + const error = new ResponseValidationError( + 'Validation failed for response body', + undefined, + { cause } + ); + + expect(error.cause).toBe(cause); + }); + + it('converts to JSON response', () => { + const error = new ResponseValidationError( + 'Validation failed for response body' + ); + + const json = error.toJSON(); + expect(json).toEqual({ + statusCode: 500, + error: 'ResponseValidationError', + message: 'Validation failed for response body', + details: { + issues: undefined, + }, + }); + }); + + it('includes issues in JSON when provided', () => { + const issues = [ + { message: 'Required field missing', path: ['id'] }, + { message: 'Invalid format', path: ['email'] }, + ]; + const error = new ResponseValidationError( + 'Validation failed for response body', + issues + ); + + const json = error.toJSON(); + expect(json).toEqual({ + statusCode: 500, + error: 'ResponseValidationError', + message: 'Validation failed for response body', + details: { + issues: [ + { message: 'Required field missing', path: ['id'] }, + { message: 'Invalid format', path: ['email'] }, + ], + }, + }); + }); + }); }); diff --git a/packages/event-handler/tests/unit/http/middleware/validation.test.ts b/packages/event-handler/tests/unit/http/middleware/validation.test.ts new file mode 100644 index 0000000000..06d57a045d --- /dev/null +++ b/packages/event-handler/tests/unit/http/middleware/validation.test.ts @@ -0,0 +1,600 @@ +import { setTimeout } from 'node:timers/promises'; +import context from '@aws-lambda-powertools/testing-utils/context'; +import { beforeEach, describe, expect, it } from 'vitest'; +import { z } from 'zod'; +import { Router } from '../../../../src/http/index.js'; +import { createTestEvent } from '../helpers.js'; + +describe('Router Validation Integration', () => { + let app: Router; + + beforeEach(() => { + app = new Router(); + }); + + it('validates request body successfully', async () => { + // Prepare + const requestBodySchema = z.object({ name: z.string() }); + + app.post( + '/users', + (reqCtx) => { + const { name } = reqCtx.valid.req.body; + return { statusCode: 201, body: `Created ${name}` }; + }, + { + validation: { req: { body: requestBodySchema } }, + } + ); + + const event = createTestEvent('/users', 'POST', { + 'content-type': 'application/json', + }); + event.body = JSON.stringify({ name: 'John' }); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(201); + expect(result.body).toBe('Created John'); + }); + + it('returns 422 on request body validation failure', async () => { + // Prepare + const requestBodySchema = z.object({ name: z.string() }); + + app.post('/users', () => ({ statusCode: 201, body: 'Created' }), { + validation: { req: { body: requestBodySchema } }, + }); + + const event = createTestEvent('/users', 'POST', { + 'content-type': 'application/json', + }); + event.body = JSON.stringify({ invalid: 'data' }); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(422); + const body = JSON.parse(result.body); + expect(body.error).toBe('RequestValidationError'); + }); + + it('validates request body successfully when it is non-JSON', async () => { + // Prepare + const requestBodySchema = z.string(); + + app.post( + '/users', + (reqCtx) => { + const name = reqCtx.valid.req.body; + return { statusCode: 201, body: `Created ${name}` }; + }, + { + validation: { req: { body: requestBodySchema } }, + } + ); + + const event = createTestEvent('/users', 'POST', { + 'content-type': 'text/plain', + }); + event.body = 'John'; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(201); + expect(result.body).toBe('Created John'); + }); + + it('returns 422 when the request is a malformed JSON', async () => { + // Prepare + const requestBodySchema = z.object({ + name: z.string(), + }); + + app.post( + '/users', + (reqCtx) => { + const name = reqCtx.valid.req.body; + return { statusCode: 201, body: `Created ${name}` }; + }, + { + validation: { req: { body: requestBodySchema } }, + } + ); + + const event = createTestEvent('/users', 'POST', { + 'Content-Type': 'application/json', + }); + event.body = "{'name': 'John'"; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(422); + expect(result.body).toContain('RequestValidationError'); + }); + + it('validates request headers successfully', async () => { + // Prepare + const headerSchema = z.object({ 'x-api-key': z.string() }); + + app.get( + '/protected', + (reqCtx) => { + const apiKey = reqCtx.valid.req.headers['x-api-key']; + return { statusCode: 200, body: `Authenticated with ${apiKey}` }; + }, + { + validation: { req: { headers: headerSchema } }, + } + ); + + const event = createTestEvent('/protected', 'GET', { + 'x-api-key': 'test-key', + }); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(200); + expect(result.body).toBe('Authenticated with test-key'); + }); + + it('returns 422 on request headers validation failure', async () => { + // Prepare + const headerSchema = z.object({ 'x-api-key': z.string() }); + + app.get('/protected', () => ({ statusCode: 200, body: 'OK' }), { + validation: { req: { headers: headerSchema } }, + }); + + const event = createTestEvent('/protected', 'GET', {}); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(422); + }); + + it('validates path parameters successfully', async () => { + // Prepare + const pathSchema = z.object({ id: z.string() }); + + app.get( + '/users/:id', + (reqCtx) => { + const { id } = reqCtx.valid.req.path; + return { id, validated: true }; + }, + { + validation: { req: { path: pathSchema } }, + } + ); + + const event = createTestEvent('/users/123', 'GET', {}); + event.pathParameters = { id: '123' }; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(200); + const body = JSON.parse(result.body); + expect(body.id).toBe('123'); + expect(body.validated).toBe(true); + }); + + it('returns 422 on path parameters validation failure', async () => { + // Prepare + const pathSchema = z.object({ id: z.uuid() }); + + app.get('/users/:id', () => ({ body: { id: '123' } }), { + validation: { req: { path: pathSchema } }, + }); + + const event = createTestEvent('/users/123', 'GET', {}); + event.pathParameters = { id: '123' }; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(422); + }); + + it('validates query parameters successfully', async () => { + // Prepare + const querySchema = z.object({ page: z.string(), limit: z.string() }); + + app.get( + '/users', + (reqCtx) => { + const { page, limit } = reqCtx.valid.req.query; + return { + users: [], + page: Number.parseInt(page, 10), + limit: Number.parseInt(limit, 10), + }; + }, + { + validation: { req: { query: querySchema } }, + } + ); + + const event = createTestEvent('/users', 'GET', {}); + event.queryStringParameters = { page: '1', limit: '10' }; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(200); + const body = JSON.parse(result.body); + expect(body.page).toBe(1); + expect(body.limit).toBe(10); + }); + + it('returns 422 on query parameters validation failure', async () => { + // Prepare + const querySchema = z.object({ page: z.string(), limit: z.string() }); + + app.get('/users', () => ({ body: { users: [] } }), { + validation: { req: { query: querySchema } }, + }); + + const event = createTestEvent('/users', 'GET', {}); + event.queryStringParameters = { page: '1' }; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(422); + }); + + it('validates response body successfully', async () => { + // Prepare + const responseSchema = z.object({ id: z.string(), name: z.string() }); + + app.get( + '/users/:id', + () => { + return { id: '123', name: 'John' }; + }, + { + validation: { res: { body: responseSchema } }, + } + ); + + const event = createTestEvent('/users/123', 'GET', {}); + event.pathParameters = { id: '123' }; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(200); + }); + + it('returns 500 on response body validation failure', async () => { + // Prepare + const responseSchema = z.object({ id: z.string(), name: z.string() }); + + // @ts-expect-error testing for validation failure + app.get('/users/:id', () => ({ id: '123' }), { + validation: { res: { body: responseSchema } }, + }); + + const event = createTestEvent('/users/123', 'GET', {}); + event.pathParameters = { id: '123' }; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(500); + }); + + it('validates response body successfully when it is non-JSON', async () => { + // Prepare + const responseBodySchema = z.string(); + + app.post( + '/users', + () => { + return 'Plain text response'; + }, + { + validation: { res: { body: responseBodySchema } }, + } + ); + + const event = createTestEvent('/users', 'POST'); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(200); + expect(result.body).toBe('"Plain text response"'); + }); + + it('returns 500 when the response is an invalid JSON', async () => { + // Prepare + const responseSchema = z.object({ name: z.string() }); + app.get( + '/invalid', + // @ts-expect-error testing for validation failure + () => { + return new Response('{"name": "John"', { + headers: { + 'content-type': 'application/json', + }, + }); + }, + { + validation: { res: { body: responseSchema } }, + } + ); + + const event = createTestEvent('/invalid', 'GET'); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(500); + }); + + it('validates response headers successfully', async () => { + // Prepare + const responseHeaderSchema = z.object({ 'x-custom-header': z.string() }); + + app.get( + '/test', + () => { + return new Response('OK', { + headers: { 'x-custom-header': 'test-value' }, + }); + }, + { + validation: { res: { headers: responseHeaderSchema } }, + } + ); + + const event = createTestEvent('/test', 'GET', {}); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(200); + }); + + it('returns 500 on response headers validation failure', async () => { + // Prepare + const responseHeaderSchema = z.object({ 'x-required': z.string() }); + + app.get( + '/test', + () => { + return new Response('OK', { + headers: { 'x-other': 'value' }, + }); + }, + { + validation: { res: { headers: responseHeaderSchema } }, + } + ); + + const event = createTestEvent('/test', 'GET', {}); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(500); + }); + + it('validates both request and response', async () => { + // Prepare + const requestSchema = z.object({ name: z.string(), email: z.string() }); + const responseSchema = z.object({ + id: z.string(), + name: z.string(), + email: z.string(), + }); + + app.post( + '/users', + (reqCtx) => { + const { name, email } = reqCtx.valid.req.body; + return { id: '123', name, email }; + }, + { + validation: { + req: { body: requestSchema }, + res: { body: responseSchema }, + }, + } + ); + + const event = createTestEvent('/users', 'POST', { + 'content-type': 'application/json', + }); + event.body = JSON.stringify({ name: 'John', email: 'john@example.com' }); + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(200); + const body = JSON.parse(result.body); + expect(body.name).toBe('John'); + expect(body.email).toBe('john@example.com'); + }); + + it('applies validation only to configured routes', async () => { + // Prepare + const bodySchema = z.object({ name: z.string() }); + + app.post('/validated', () => ({ statusCode: 201 }), { + validation: { req: { body: bodySchema } }, + }); + + app.post('/unvalidated', () => ({ statusCode: 201 })); + + const validatedEvent = createTestEvent('/validated', 'POST', { + 'content-type': 'application/json', + }); + validatedEvent.body = JSON.stringify({ data: 'test' }); + + const unvalidatedEvent = createTestEvent('/unvalidated', 'POST', { + 'content-type': 'application/json', + }); + unvalidatedEvent.body = JSON.stringify({ data: 'test' }); + + // Act + const validatedResult = await app.resolve(validatedEvent, context); + const unvalidatedResult = await app.resolve(unvalidatedEvent, context); + + // Assess + expect(validatedResult.statusCode).toBe(422); + expect(unvalidatedResult.statusCode).toBe(200); + }); + + it('validates with async schema refinement', async () => { + // Prepare + const requestBodySchema = z.object({ email: z.string().email() }).refine( + async (data) => { + // Simulate async validation (e.g., checking if email exists) + await setTimeout(10); + return !data.email.includes('blocked'); + }, + { message: 'Email is blocked' } + ); + + app.post( + '/register', + (reqCtx) => { + const { email } = reqCtx.valid.req.body; + return { statusCode: 201, body: `Registered ${email}` }; + }, + { + validation: { req: { body: requestBodySchema } }, + } + ); + + const validEvent = createTestEvent('/register', 'POST', { + 'content-type': 'application/json', + }); + validEvent.body = JSON.stringify({ email: 'user@example.com' }); + + const blockedEvent = createTestEvent('/register', 'POST', { + 'content-type': 'application/json', + }); + blockedEvent.body = JSON.stringify({ email: 'blocked@example.com' }); + + // Act + const validResult = await app.resolve(validEvent, context); + const blockedResult = await app.resolve(blockedEvent, context); + + // Assess + expect(validResult.statusCode).toBe(201); + expect(validResult.body).toBe('Registered user@example.com'); + expect(blockedResult.statusCode).toBe(422); + }); + + it('includes correct path in validation errors', async () => { + // Prepare + const bodySchema = z.object({ name: z.string() }); + const querySchema = z.object({ page: z.string() }); + const pathSchema = z.object({ id: z.string().uuid() }); + + app.post('/users/:id', () => ({ statusCode: 200 }), { + validation: { + req: { body: bodySchema, query: querySchema, path: pathSchema }, + }, + }); + + const event = createTestEvent('/users/invalid-id', 'POST', { + 'content-type': 'application/json', + }); + event.body = JSON.stringify({ invalid: 'field' }); + event.queryStringParameters = { wrong: 'param' }; + event.pathParameters = { id: 'invalid-id' }; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(422); + const body = JSON.parse(result.body); + expect(body.details?.issues).toBeDefined(); + + const paths = body.details.issues.map( + (issue: { path: unknown[] }) => issue.path + ); + expect(paths.some((p: unknown[]) => p[0] === 'body')).toBe(true); + expect(paths.some((p: unknown[]) => p[0] === 'query')).toBe(true); + expect(paths.some((p: unknown[]) => p[0] === 'path')).toBe(true); + }); + + it('returns 422 when request body is null with object schema', async () => { + // Prepare + const requestBodySchema = z.object({ name: z.string() }); + + app.post('/users', () => ({ statusCode: 201 }), { + validation: { req: { body: requestBodySchema } }, + }); + + const event = createTestEvent('/users', 'POST', { + 'content-type': 'application/json', + }); + event.body = 'null'; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(422); + const body = JSON.parse(result.body); + expect(body.error).toBe('RequestValidationError'); + }); + + it('handles validation error with missing path in issue', async () => { + // Prepare + const customSchema = { + '~standard': { + version: 1, + vendor: 'custom', + validate: async () => ({ + issues: [{ message: 'Error without path' }], + }), + }, + } as const; + + app.post('/test', () => ({ statusCode: 200 }), { + validation: { req: { body: customSchema } }, + }); + + const event = createTestEvent('/test', 'POST', { + 'content-type': 'application/json', + }); + event.body = '{}'; + + // Act + const result = await app.resolve(event, context); + + // Assess + expect(result.statusCode).toBe(422); + }); +});